[Xfce4-commits] <xfwm4:master> Navigate with arrows in task switcher (bug #4752)
Olivier Fourdan
noreply at xfce.org
Mon Feb 13 10:04:01 CET 2012
Updating branch refs/heads/master
to a692e96c5486e2c1b01b6d186249b137331b376f (commit)
from 7727187a768f73d8d3647d28dfa7057b7a3e4288 (commit)
commit a692e96c5486e2c1b01b6d186249b137331b376f
Author: Kees van Veen <kees.vanveen at 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 *);
More information about the Xfce4-commits
mailing list