Updating branch refs/heads/master to a692e96c5486e2c1b01b6d186249b137331b376f (commit) from 7727187a768f73d8d3647d28dfa7057b7a3e4288 (commit)
commit a692e96c5486e2c1b01b6d186249b137331b376f Author: Kees van Veen <kees.vanv...@gmail.com> Date: Mon Feb 13 10:02:13 2012 +0100 Navigate with arrows in task switcher (bug #4752) src/cycle.c | 13 ++++++- src/tabwin.c | 119 +++++++++++++++++++++++++++++++++++++++------------------- src/tabwin.h | 1 + 3 files changed, 93 insertions(+), 40 deletions(-) diff --git a/src/cycle.c b/src/cycle.c index 9098d35..fb3b43b 100644 --- a/src/cycle.c +++ b/src/cycle.c @@ -228,7 +228,7 @@ clientCycleEventFilter (XEvent * xevent, gpointer data) ClientCycleData *passdata; Client *c, *removed; eventFilterStatus status; - KeyCode cancel; + KeyCode cancel, left, right, up, down; int key, modifiers; gboolean key_pressed, cycling, gone; @@ -244,6 +244,10 @@ clientCycleEventFilter (XEvent * xevent, gpointer data) screen_info = c->screen_info; display_info = screen_info->display_info; cancel = screen_info->params->keys[KEY_CANCEL].keycode; + left = screen_info->params->keys[KEY_LEFT].keycode; + right = screen_info->params->keys[KEY_RIGHT].keycode; + up = screen_info->params->keys[KEY_UP].keycode; + down = screen_info->params->keys[KEY_DOWN].keycode; modifiers = (screen_info->params->keys[KEY_CYCLE_WINDOWS].modifier | screen_info->params->keys[KEY_CYCLE_REVERSE_WINDOWS].modifier); status = EVENT_FILTER_STOP; @@ -286,6 +290,13 @@ clientCycleEventFilter (XEvent * xevent, gpointer data) c2 = tabwinSelectHead (passdata->tabwin); cycling = FALSE; } + else if (xevent->xkey.keycode == up || xevent->xkey.keycode == down || xevent->xkey.keycode == left || xevent->xkey.keycode == right) + { + int rowdelta = (xevent->xkey.keycode == up ? -1 : xevent->xkey.keycode == down ? 1 : 0); + int coldelta = (xevent->xkey.keycode == left ? -1 : xevent->xkey.keycode == right ? 1 : 0); + TRACE ("Cycle: arrow"); + c2 = tabwinSelectDelta(passdata->tabwin, rowdelta, coldelta); + } else if (key == KEY_CYCLE_REVERSE_WINDOWS) { TRACE ("Cycle: previous"); diff --git a/src/tabwin.c b/src/tabwin.c index 0a224c3..0abd49a 100644 --- a/src/tabwin.c +++ b/src/tabwin.c @@ -242,14 +242,27 @@ createWindowIcon (Client *c, gint icon_size) return icon; } +static int +getMinMonitorWidth (ScreenInfo *screen_info) +{ + int i, min_width, num_monitors = myScreenGetNumMonitors (screen_info); + for (min_width = i = 0; i < num_monitors; i++) + { + GdkRectangle monitor; + gdk_screen_get_monitor_geometry (screen_info->gscr, i, &monitor); + if (min_width == 0 || monitor.width < min_width) + min_width = monitor.width; + } + return min_width; +} + static GtkWidget * createWindowlist (ScreenInfo *screen_info, TabwinWidget *tbw) { Client *c; GList *client_list; - GdkRectangle monitor; GtkWidget *windowlist, *icon, *selected; - int packpos; + int i, packpos, monitor_width; Tabwin *t; gint icon_size = WIN_ICON_SIZE; @@ -259,12 +272,11 @@ createWindowlist (ScreenInfo *screen_info, TabwinWidget *tbw) c = NULL; selected = NULL; t = tbw->tabwin; + monitor_width = getMinMonitorWidth (screen_info); g_return_val_if_fail (screen_info->client_count > 0, NULL); - gdk_screen_get_monitor_geometry (screen_info->gscr, tbw->monitor_num, &monitor); - gtk_widget_style_get (GTK_WIDGET (tbw), "icon-size", &icon_size, NULL); - tbw->grid_cols = (monitor.width / (icon_size + 2 * WIN_ICON_BORDER)) * 0.75; + tbw->grid_cols = (monitor_width / (icon_size + 2 * WIN_ICON_BORDER)) * 0.75; tbw->grid_rows = screen_info->client_count / tbw->grid_cols + 1; tbw->widgets = NULL; windowlist = gtk_table_new (tbw->grid_rows, tbw->grid_cols, FALSE); @@ -436,6 +448,30 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num) return tbw; } +static Client * +tabwinChange2Selected (Tabwin *t, GList *selected) +{ + GList *tabwin_list, *widgets; + GtkWidget *icon; + TabwinWidget *tbw; + + t->selected = selected; + for (tabwin_list = t->tabwin_list; tabwin_list; tabwin_list = g_list_next (tabwin_list)) + { + tbw = (TabwinWidget *) tabwin_list->data; + for (widgets = tbw->widgets; widgets; widgets = g_list_next (widgets)) + { + icon = GTK_WIDGET (widgets->data); + if (((Client *) g_object_get_data (G_OBJECT(icon), "client-ptr-val")) == t->selected->data) + { + tabwinSetSelected (tbw, icon); + gtk_widget_queue_draw (tbw->window); + } + } + } + return tabwinGetSelected (t); +} + Tabwin * tabwinCreate (GList **client_list, GList *selected, gboolean display_workspace) { @@ -568,9 +604,6 @@ Client * tabwinSelectNext (Tabwin *t) { GList *next; - GList *tabwin_list, *widgets; - GtkWidget *icon; - TabwinWidget *tbw; g_return_val_if_fail (t != NULL, NULL); TRACE ("entering tabwinSelectNext"); @@ -581,31 +614,13 @@ tabwinSelectNext (Tabwin *t) next = *t->client_list; g_return_val_if_fail (next != NULL, NULL); } - t->selected = next; - for (tabwin_list = t->tabwin_list; tabwin_list; tabwin_list = g_list_next (tabwin_list)) - { - tbw = (TabwinWidget *) tabwin_list->data; - for (widgets = tbw->widgets; widgets; widgets = g_list_next (widgets)) - { - icon = GTK_WIDGET (widgets->data); - if (((Client *) g_object_get_data (G_OBJECT(icon), "client-ptr-val")) == next->data) - { - tabwinSetSelected (tbw, icon); - gtk_widget_queue_draw (GTK_WIDGET(tbw)); - } - } - } - - return tabwinGetSelected (t); + return tabwinChange2Selected (t, next); } Client * tabwinSelectPrev (Tabwin *t) { GList *prev; - GList *tabwin_list, *widgets; - GtkWidget *icon; - TabwinWidget *tbw; g_return_val_if_fail (t != NULL, NULL); TRACE ("entering tabwinSelectPrev"); @@ -616,22 +631,48 @@ tabwinSelectPrev (Tabwin *t) prev = g_list_last (*t->client_list); g_return_val_if_fail (prev != NULL, NULL); } - t->selected = prev; - for (tabwin_list = t->tabwin_list; tabwin_list; tabwin_list = g_list_next (tabwin_list)) + return tabwinChange2Selected (t, prev); +} + +Client * +tabwinSelectDelta (Tabwin *t, int rowdelta, int coldelta) +{ + GList *selected; + int curpos, curcol, currow, listlen, cols, rows; + TabwinWidget *tbw; + + TRACE ("entering tabwinSelectDelta"); + g_return_val_if_fail (t != NULL, NULL); + + tbw = (TabwinWidget *) t->tabwin_list->data; + curpos = g_list_position (*t->client_list, t->selected); + listlen = g_list_length (*t->client_list); + cols = (listlen < tbw->grid_cols ? listlen : tbw->grid_cols); + rows = (listlen-1)/cols + 1; + curcol = curpos % cols; + currow = curpos / cols; + + curcol += coldelta; + curcol = (curcol<0 ? cols - 1 : curcol>=cols ? 0 : curcol); + currow += rowdelta; + currow = (currow<0 ? rows - 1 : currow>=rows ? 0 : currow); + curpos = curcol + currow*cols; /* So here we are at the new (wrapped) position in the rectangle */ + if (curpos>=listlen) /* If that position does not exist */ { - tbw = (TabwinWidget *) tabwin_list->data; - for (widgets = tbw->widgets; widgets; widgets = g_list_next (widgets)) + if (coldelta) /* Let horizontal prevail */ { - icon = GTK_WIDGET (widgets->data); - if (((Client *) g_object_get_data (G_OBJECT(icon), "client-ptr-val")) == prev->data) - { - tabwinSetSelected (tbw, icon); - gtk_widget_queue_draw (GTK_WIDGET(tbw)); - } - } + curcol = (coldelta>0 ? 0 : (listlen-1)%cols); + } + else + { + currow = (rowdelta>0 ? 0 : currow-1); + } + curpos = curcol + currow*cols; } - return tabwinGetSelected (t); + selected = g_list_nth(*t->client_list, curpos); + g_return_val_if_fail (selected != NULL, NULL); + return tabwinChange2Selected (t, selected); } void diff --git a/src/tabwin.h b/src/tabwin.h index d3dbb14..3511cca 100644 --- a/src/tabwin.h +++ b/src/tabwin.h @@ -75,6 +75,7 @@ Client *tabwinGetSelected (Tabwin *); Client *tabwinSelectHead (Tabwin *); Client *tabwinSelectNext (Tabwin *); Client *tabwinSelectPrev (Tabwin *); +Client *tabwinSelectDelta (Tabwin *, int, int); Client *tabwinRemoveClient (Tabwin *, Client *); void tabwinDestroy (Tabwin *); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits