1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
-*- text -*-
* IconicState
Currently we set IconicState only on windows we hide and not when we
unmap them to switch to another desktop. ICCCM and EWMH says we
should set IconicState in both situations.
We should also set _NET_WM_STATE_HIDDEN when hiding windows.
hidden.c should list windows with _NET_WM_STATE_HIDDEN and,
optionally, all with IconicState.
* When unhiding a window we want it to re-appear in the same position.
How?
Setting XCB_ICCCM_SIZE_HINT_US_POSITION before hiding would probably
work without adding more code, but does ICCCM allow that?
PPosition?
* Feature: Handle several screens (DISPLAY=0.x) in classical X.
This means we will have several root windows.
setup = xcb_get_setup(conn);
screens = xcb_setup_roots_length(setup);
returns the number of screens available.
We can walk over them with xcb_setup_roots_iterator(setup).
* Feature: Xinerama support. Needed when XRANDR above 1.1 not
supported, for instance with Nvidia cards in Twinview configuration.
* Bug: Ignore other modifiers, such as NumLock and CapsLock.
We can use something like this to find the modifier mask for
NumLock:
xcb_keycode_t *num_lock;
num_lock = xcb_key_symbols_get_keycode(symbols, XK_Num_Lock);
and get an array of keycodes finished by XCB_NO_SYMBOL.
then compare the keycodes in the array with the keycodes all the
modifier masks give. See getmodkeys().
* Extended Window Manager Hints (EWMH)
- Use the new xcb-ewmh for the EWMH hints.
I suggest listing least these in _NET_SUPPORTED (* marks
implemented):
_NET_NUMBER_OF_DESKTOPS, _NET_WM_DESKTOP*, _NET_CURRENT_DESKTOP,
_NET_WM_STATE, _NET_WM_STATE_STICKY,
_NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN,
_NET_WM_STATE_FULLSCREEN, _NET_ACTIVE_WINDOW
_NET_NUMBER_OF_DESKTOPS can be set to the constant WORKSPACES.
_NET_CURRENT_DESKTOP is just curws. Set the hint when starting and
when changing workspaces.
We *may* want to support a message to the root window that *sets*
_NET_CURRENT_DESKTOP and then switch to it.
We might want to support _NET_WM_WINDOW_TYPE_DESKTOP as well.
* Bug: We grab MODKEY all the time! We can grab it only when we start
tabbing instead and release it when tabbing is complete.
* Key to move to previous and next workspace. David Jacobs has a patch
for mod4+shift + I/O.
https://gist.github.com/1478365
* Key to move windows to other workspaces, perhaps mod4+Shift + 0..9
and mod4+shift + I/O.
* Full-screen windows that are resized from client requests should be
kept full-screen.
* When moving windows between monitors, try to place the window on
roughly the same place on a new monitor, if possible.
* When a window tries to map itself outside the monitors always map it
on the monitor closest to the coordinates it asked for instead of
always mapping on the first monitor in the list.
* Feature: We need to continue dragging for move and resize until
*both* MODKEY and mouse button has been released. Will be much nicer
with trackball.
* Move to first window (or middle of monitor) on another monitor with
MODKEY + . and , instead of moving windows to new monitor. Shifted
these keys will move window to new monitor?
* Handle new modes on physical outputs. What do we have to do?
* A separate workspace list for every monitor.
* Allow hexadecimal colour values on command line.
* Grab specific keys
Current code grabs modifier keys and any other keypress. We need to
specifically grab the keycodes we need. xbindkeys and possibly other
programs don't work.
Partially done. Now grabs all our keys unshifted as well as shifted.
* Feedback window
We may need to tell the user the new geometry somehow. Is this what
I want?
The feedback window can also show what workspace we just changed to.
Can we cooperate with a stand-alone program? Write our status to a
root hint or named pipe than can be picked up by another program?
* Virtual screens/workspaces
Partially done. Still needed:
- A window might be on one, *several* or all virtual screens.
We already have a way of fixing a window on all screens
(MODKEY-f), but we need a way of saying "stick on this workspace".
Perhaps something like MODKEY-a <n>, where <n> is 1--9 for virtual
screens. Better ways? Note that this seems to be mildly
incompatible with the EWMH _NET_WM_DESKTOP hint we're currently
using: We will only be able to save one of the desktops used.
* Menu
We might need a menu for hidden windows. Since I'm probably
implementing menu windows anyway, perhaps I should add a menu with
basic window functions, like 9wm and twm. This way, one might use
the window manager without keyboard, if necessary. Not much work if
I have to do the menu anyway... But also chords?
On the other hand, see hidden.c and forthcoming external menu
program.
* Chords
Maybe have mouse button chords to do move and resize? Configurable
if on or off?
Idea from Christian Neukirchen.
* Snap to border and screen edge, which favours the edge.
* Gaps on borders for docks, status windows et cetera.
Keep space reserved for Conky, dzen2 et cetera.
Also respect EWMH hints _NET_WM_TYPE_DOCK and _NET_WM_TYPE_DESKTOP.
* Flag to disable that mcwm won't allow windows to move off the
screen?
* Use xcb-event's event handlers?
* Configurable keys.
* Configuration file.
* Handle Urgency hint
Some windows might need attention and marks this with an urgency
hint (for instance, urxvt can generate such a hint when receiving
the BEL character). Do we want to handle it? How do we tell the
user? Can this be done with some stand-alone program instead?
* Code cleaning
- Obivous cleanup: The event switch is way too big.
- The states are known everywhere. A tight state machine would be
nicer.
- Dispatch table with function pointers for key bindings instead of
keysym->enum->case?
- Use bitfields instead of extra lists for workspaces?
* Resize behaviour
Better resize behaviour. We want not to accidentally change the
vertical size when changing horizontal size and vice versa.
|