1 /* cycling.c- window cycling
3 * Window Maker window manager
5 * Copyright (c) 2000-2003 Alfredo K. Kojima
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
26 #include <X11/Xutil.h>
27 #include <X11/keysym.h>
29 // TODO: remove non-MOX_CYCLING junk
30 // fix the stacking/window raising during alt-tabbing
31 // allow selection of icons with mouse
33 #include "WindowMaker.h"
44 #include "switchpanel.h"
47 extern WPreferences wPreferences
;
49 extern WShortKey wKeyBindings
[WKBD_LAST
];
52 static void raiseWindow(WSwitchPanel
*swpanel
, WWindow
*wwin
)
54 if (wwin
->flags
.mapped
) {
57 win
[0]= wSwitchPanelGetWindow(swpanel
);
58 win
[1]= wwin
->frame
->core
->window
;
60 XRestackWindows(dpy
, win
, 2);
67 StartWindozeCycle(WWindow
*wwin
, XEvent
*event
, Bool next
)
69 WScreen
*scr
= wScreenForRootWindow(event
->xkey
.root
);
74 XModifierKeymap
*keymap
= NULL
;
76 Bool somethingElse
= False
;
78 WSwitchPanel
*swpanel
= NULL
;
79 KeyCode leftKey
, rightKey
, homeKey
, endKey
;
81 if (!wwin
|| wwin
->frame
->workspace
!= scr
->current_workspace
)
84 leftKey
= XKeysymToKeycode(dpy
, XK_Left
);
85 rightKey
= XKeysymToKeycode(dpy
, XK_Right
);
86 homeKey
= XKeysymToKeycode(dpy
, XK_Home
);
87 endKey
= XKeysymToKeycode(dpy
, XK_End
);
90 hasModifier
= (wKeyBindings
[WKBD_FOCUSNEXT
].modifier
!= 0);
92 hasModifier
= (wKeyBindings
[WKBD_FOCUSPREV
].modifier
!= 0);
95 keymap
= XGetModifierMapping(dpy
);
98 printf("Grabbing keyboard\n");
100 XGrabKeyboard(dpy
, scr
->root_win
, False
, GrabModeAsync
, GrabModeAsync
,
104 scr
->flags
.doing_alt_tab
= 1;
106 swpanel
= wInitSwitchPanel(scr
, wwin
, scr
->current_workspace
);
110 newFocused
= wSwitchPanelSelectNext(swpanel
, !next
);
112 wWindowFocus(newFocused
, oldFocused
);
113 oldFocused
= newFocused
;
115 if (wPreferences
.circ_raise
)
116 raiseWindow(swpanel
, newFocused
);
122 while (hasModifier
&& !done
) {
123 WMMaskEvent(dpy
, KeyPressMask
|KeyReleaseMask
|ExposureMask
|PointerMotionMask
, &ev
);
125 if (ev
.type
!= KeyRelease
&& ev
.type
!= KeyPress
) {
129 /* ignore CapsLock */
130 modifiers
= ev
.xkey
.state
& ValidModMask
;
132 if (ev
.type
== KeyPress
) {
134 printf("Got key press\n");
136 if ((wKeyBindings
[WKBD_FOCUSNEXT
].keycode
== ev
.xkey
.keycode
137 && wKeyBindings
[WKBD_FOCUSNEXT
].modifier
== modifiers
)
138 || ev
.xkey
.keycode
== rightKey
) {
141 newFocused
= wSwitchPanelSelectNext(swpanel
, False
);
143 wWindowFocus(newFocused
, oldFocused
);
144 oldFocused
= newFocused
;
146 if (wPreferences
.circ_raise
) {
148 raiseWindow(swpanel
, newFocused
);
152 } else if ((wKeyBindings
[WKBD_FOCUSPREV
].keycode
== ev
.xkey
.keycode
153 && wKeyBindings
[WKBD_FOCUSPREV
].modifier
== modifiers
)
154 || ev
.xkey
.keycode
== leftKey
) {
157 newFocused
= wSwitchPanelSelectNext(swpanel
, True
);
159 wWindowFocus(newFocused
, oldFocused
);
160 oldFocused
= newFocused
;
162 if (wPreferences
.circ_raise
) {
164 raiseWindow(swpanel
, newFocused
);
168 } else if (ev
.xkey
.keycode
== homeKey
|| ev
.xkey
.keycode
== endKey
) {
170 newFocused
= wSwitchPanelSelectFirst(swpanel
, ev
.xkey
.keycode
!= homeKey
);
172 wWindowFocus(newFocused
, oldFocused
);
173 oldFocused
= newFocused
;
175 if (wPreferences
.circ_raise
) {
177 raiseWindow(swpanel
, newFocused
);
181 } else if (ev
.type
== MotionNotify
) {
184 tmp
= wSwitchPanelHandleEvent(swpanel
, &ev
);
187 wWindowFocus(newFocused
, oldFocused
);
188 oldFocused
= newFocused
;
193 printf("Got something else\n");
195 somethingElse
= True
;
198 } else if (ev
.type
== KeyRelease
) {
202 printf("Got key release\n");
204 for (i
= 0; i
< 8 * keymap
->max_keypermod
; i
++) {
205 if (keymap
->modifiermap
[i
] == ev
.xkey
.keycode
&&
206 wKeyBindings
[WKBD_FOCUSNEXT
].modifier
207 & 1<<(i
/keymap
->max_keypermod
)) {
215 XFreeModifiermap(keymap
);
219 printf("Ungrabbing keyboard\n");
221 XUngrabKeyboard(dpy
, CurrentTime
);
226 if (!newFocused
->flags
.mapped
)
227 wMakeWindowVisible(newFocused
);
228 wSetFocusTo(scr
, newFocused
);
229 wRaiseFrame(newFocused
->frame
->core
);
233 wSwitchPanelDestroy(swpanel
);
235 scr
->flags
.doing_alt_tab
= 0;