From 94777b97156db1a2bcdfcc8fd486fcc79b0bd7f7 Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Mon, 22 Apr 2013 14:03:14 +0100 Subject: [PATCH] Support for same-class cycling in open switchpanel. If the switchpanel was opened with either FocusNextKey or FocusPrevKey shortcut, and the user presses GroupNextKey or GroupPrevKey, skip over windows of a different class when cycling through windows in the switchpanel. In the case where the switchpanel was opened with FocusNextKey or FocusPrevKey initially, the check can be skipped because all the available choices are necessarily of the same class already. --- src/cycling.c | 6 +++--- src/switchpanel.c | 24 ++++++++++++++++-------- src/switchpanel.h | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/cycling.c b/src/cycling.c index f9895545..574e0f47 100644 --- a/src/cycling.c +++ b/src/cycling.c @@ -130,7 +130,7 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl if (swpanel) { if (wwin->flags.mapped) - newFocused = wSwitchPanelSelectNext(swpanel, !next, True); + newFocused = wSwitchPanelSelectNext(swpanel, !next, True, False); else newFocused = wSwitchPanelSelectFirst(swpanel, False); @@ -164,7 +164,7 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl && wKeyBindings[WKBD_GROUPNEXT].modifier == modifiers) || ev.xkey.keycode == rightKey) { - newFocused = wSwitchPanelSelectNext(swpanel, False, ev.xkey.keycode != rightKey); + newFocused = wSwitchPanelSelectNext(swpanel, False, ev.xkey.keycode != rightKey, (!class_only && wKeyBindings[WKBD_GROUPNEXT].keycode == ev.xkey.keycode && wKeyBindings[WKBD_GROUPNEXT].modifier == modifiers)); oldFocused = change_focus_and_raise(newFocused, oldFocused, swpanel, scr, False); } else if ((wKeyBindings[WKBD_FOCUSPREV].keycode == ev.xkey.keycode @@ -173,7 +173,7 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl && wKeyBindings[WKBD_GROUPPREV].modifier == modifiers) || ev.xkey.keycode == leftKey) { - newFocused = wSwitchPanelSelectNext(swpanel, True, ev.xkey.keycode != leftKey); + newFocused = wSwitchPanelSelectNext(swpanel, True, ev.xkey.keycode != leftKey, (!class_only && wKeyBindings[WKBD_GROUPPREV].keycode == ev.xkey.keycode && wKeyBindings[WKBD_GROUPPREV].modifier == modifiers)); oldFocused = change_focus_and_raise(newFocused, oldFocused, swpanel, scr, False); } else if (ev.xkey.keycode == homeKey || ev.xkey.keycode == endKey) { diff --git a/src/switchpanel.c b/src/switchpanel.c index cd24f7b1..cedc487d 100644 --- a/src/switchpanel.c +++ b/src/switchpanel.c @@ -562,9 +562,9 @@ void wSwitchPanelDestroy(WSwitchPanel *panel) wfree(panel); } -WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int back, int ignore_minimized) +WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int back, int ignore_minimized, Bool class_only) { - WWindow *wwin; + WWindow *wwin, *curwin; int count = WMGetArrayItemCount(panel->windows); int orig = panel->current; @@ -580,14 +580,22 @@ WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int back, int ignore_minimi if (ignore_minimized && canReceiveFocus(WMGetFromArray(panel->windows, (count + panel->current) % count)) < 0) ignore_minimized = False; + curwin = WMGetFromArray(panel->windows, orig); do { - if (back) - panel->current--; - else - panel->current++; + do { + if (back) + panel->current--; + else + panel->current++; + + panel->current= (count + panel->current) % count; + wwin = WMGetFromArray(panel->windows, panel->current); - panel->current= (count + panel->current) % count; - wwin = WMGetFromArray(panel->windows, panel->current); + if (!class_only) + break; + if (panel->current == orig) + break; + } while (!sameWindowClass(wwin, curwin)); } while (ignore_minimized && panel->current != orig && canReceiveFocus(wwin) < 0); if (panel->current < panel->firstVisible) diff --git a/src/switchpanel.h b/src/switchpanel.h index 041d222b..2c4e6426 100644 --- a/src/switchpanel.h +++ b/src/switchpanel.h @@ -27,7 +27,7 @@ WSwitchPanel *wInitSwitchPanel(WScreen *scr, WWindow *curwin, Bool class_only); void wSwitchPanelDestroy(WSwitchPanel *panel); -WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int back, int ignore_minimized); +WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int back, int ignore_minimized, Bool class_only); WWindow *wSwitchPanelSelectFirst(WSwitchPanel *panel, int back); WWindow *wSwitchPanelHandleEvent(WSwitchPanel *panel, XEvent *event); -- 2.11.4.GIT