# HG changeset patch # User Luke Schierer # Date 1126201671 0 # Node ID 2952c6dfa7381d74e2c3bc2e956057cf30a0b90c # Parent eaa10266cd96ab2f2c9f9dee9ce58c38951515c0 [gaim-migrate @ 13707] Control-Shift-Tab behaves like Control-Tab does, but going in reverse order. committer: Tailor Script diff -r eaa10266cd96 -r 2952c6dfa738 COPYRIGHT --- a/COPYRIGHT Thu Sep 08 05:11:07 2005 +0000 +++ b/COPYRIGHT Thu Sep 08 17:47:51 2005 +0000 @@ -232,6 +232,7 @@ István Váradi Philip Van Hoof Kristof Vansant +James Vega David Vermeille Sid Vicious Bjoern Voigt diff -r eaa10266cd96 -r 2952c6dfa738 ChangeLog --- a/ChangeLog Thu Sep 08 05:11:07 2005 +0000 +++ b/ChangeLog Thu Sep 08 17:47:51 2005 +0000 @@ -54,6 +54,8 @@ * Jabber support for SRV lookups * When opening the log viewer, show the most recent log by default (Peter McCurdy) + * Control-Shift-Tab will reverse cycle through the conversation tabs + (James Vega) Bug fixes: * People using input methods can now use Enter again. diff -r eaa10266cd96 -r 2952c6dfa738 src/gtkconv.c --- a/src/gtkconv.c Thu Sep 08 05:11:07 2005 +0000 +++ b/src/gtkconv.c Thu Sep 08 17:47:51 2005 +0000 @@ -1717,19 +1717,25 @@ } static void -move_to_next_unread_tab(GaimGtkConversation *gtkconv) +move_to_next_unread_tab(GaimGtkConversation *gtkconv, gboolean forward) { GaimGtkConversation *next_gtkconv = NULL; GaimConvWindow *win; GList *l; - int index, i, found = 0; + int index, i, total, found = 0; win = gaim_conversation_get_window(gtkconv->active_conv); index = gtk_notebook_page_num(GTK_NOTEBOOK(GAIM_GTK_WINDOW(win)->notebook), gtkconv->tab_cont); - - /* First check the tabs after this position. */ - for (i = index; !found && (next_gtkconv = gaim_gtk_get_gtkconv_at_index(win, i)); i++) { - for (l = next_gtkconv->convs; l; l = l->next) { + total = gaim_conv_window_get_conversation_count(win); + + /* First check the tabs after (forward) or before (!forward) this position. */ + for (i = index; + !found && (next_gtkconv = gaim_gtk_get_gtkconv_at_index(win, i)); + forward ? i++ : i--) { + if (i == -1) { + break; + } + for (l = next_gtkconv->convs; l; l = forward ? l->next : l->prev) { GaimConversation *c = l->data; if (gaim_conversation_get_unseen(c) > 0) { @@ -1740,9 +1746,11 @@ } if (!found) { - /* Now check from the beginning up to this position. */ - for (i = 0; !found && i < index && (next_gtkconv = gaim_gtk_get_gtkconv_at_index(win, i)); i++) { - for (l = next_gtkconv->convs; l; l = l->next) { + /* Now check from the beginning up to (forward) or end back to (!forward) this position. */ + for (i = forward ? 0 : total - 1; + !found && (forward ? i < index : i >= 0) && (next_gtkconv = gaim_gtk_get_gtkconv_at_index(win, i)); + forward ? i++ : i--) { + for (l = next_gtkconv->convs; l; l = forward ? l->next : l->prev) { GaimConversation *c = l->data; if (gaim_conversation_get_unseen(c) > 0) { found = 1; @@ -1752,8 +1760,14 @@ } if (!found) { - /* Okay, just grab the next conversation tab. */ - if (!(next_gtkconv = gaim_gtk_get_gtkconv_at_index(win, index + 1))) + /* Okay, just grab the next (forward) or previous (!forward) conversation tab. */ + if (forward) { + index++; + } + else { + index = (index == 0) ? total - 1 : index - 1; + } + if (!(next_gtkconv = gaim_gtk_get_gtkconv_at_index(win, index))) next_gtkconv = gaim_gtk_get_gtkconv_at_index(win, 0); } } @@ -1888,7 +1902,12 @@ break; case GDK_Tab: - move_to_next_unread_tab(gtkconv); + case GDK_ISO_Left_Tab: + if (event->state & GDK_SHIFT_MASK) { + move_to_next_unread_tab(gtkconv, FALSE); + } else { + move_to_next_unread_tab(gtkconv, TRUE); + } return TRUE; break;