1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 04:20:27 +01:00

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.
This commit is contained in:
Iain Patterson
2013-04-22 14:03:14 +01:00
committed by Carlos R. Mafra
parent 8cb6a78726
commit 94777b9715
3 changed files with 20 additions and 12 deletions

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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);