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:
committed by
Carlos R. Mafra
parent
8cb6a78726
commit
94777b9715
@@ -130,7 +130,7 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl
|
|||||||
if (swpanel) {
|
if (swpanel) {
|
||||||
|
|
||||||
if (wwin->flags.mapped)
|
if (wwin->flags.mapped)
|
||||||
newFocused = wSwitchPanelSelectNext(swpanel, !next, True);
|
newFocused = wSwitchPanelSelectNext(swpanel, !next, True, False);
|
||||||
else
|
else
|
||||||
newFocused = wSwitchPanelSelectFirst(swpanel, False);
|
newFocused = wSwitchPanelSelectFirst(swpanel, False);
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl
|
|||||||
&& wKeyBindings[WKBD_GROUPNEXT].modifier == modifiers)
|
&& wKeyBindings[WKBD_GROUPNEXT].modifier == modifiers)
|
||||||
|| ev.xkey.keycode == rightKey) {
|
|| 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);
|
oldFocused = change_focus_and_raise(newFocused, oldFocused, swpanel, scr, False);
|
||||||
|
|
||||||
} else if ((wKeyBindings[WKBD_FOCUSPREV].keycode == ev.xkey.keycode
|
} 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)
|
&& wKeyBindings[WKBD_GROUPPREV].modifier == modifiers)
|
||||||
|| ev.xkey.keycode == leftKey) {
|
|| 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);
|
oldFocused = change_focus_and_raise(newFocused, oldFocused, swpanel, scr, False);
|
||||||
|
|
||||||
} else if (ev.xkey.keycode == homeKey || ev.xkey.keycode == endKey) {
|
} else if (ev.xkey.keycode == homeKey || ev.xkey.keycode == endKey) {
|
||||||
|
|||||||
@@ -562,9 +562,9 @@ void wSwitchPanelDestroy(WSwitchPanel *panel)
|
|||||||
wfree(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 count = WMGetArrayItemCount(panel->windows);
|
||||||
int orig = panel->current;
|
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)
|
if (ignore_minimized && canReceiveFocus(WMGetFromArray(panel->windows, (count + panel->current) % count)) < 0)
|
||||||
ignore_minimized = False;
|
ignore_minimized = False;
|
||||||
|
|
||||||
|
curwin = WMGetFromArray(panel->windows, orig);
|
||||||
do {
|
do {
|
||||||
if (back)
|
do {
|
||||||
panel->current--;
|
if (back)
|
||||||
else
|
panel->current--;
|
||||||
panel->current++;
|
else
|
||||||
|
panel->current++;
|
||||||
|
|
||||||
panel->current= (count + panel->current) % count;
|
panel->current= (count + panel->current) % count;
|
||||||
wwin = WMGetFromArray(panel->windows, panel->current);
|
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);
|
} while (ignore_minimized && panel->current != orig && canReceiveFocus(wwin) < 0);
|
||||||
|
|
||||||
if (panel->current < panel->firstVisible)
|
if (panel->current < panel->firstVisible)
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ WSwitchPanel *wInitSwitchPanel(WScreen *scr, WWindow *curwin, Bool class_only);
|
|||||||
|
|
||||||
void wSwitchPanelDestroy(WSwitchPanel *panel);
|
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 *wSwitchPanelSelectFirst(WSwitchPanel *panel, int back);
|
||||||
|
|
||||||
WWindow *wSwitchPanelHandleEvent(WSwitchPanel *panel, XEvent *event);
|
WWindow *wSwitchPanelHandleEvent(WSwitchPanel *panel, XEvent *event);
|
||||||
|
|||||||
Reference in New Issue
Block a user