1
1
/* See LICENSE file for license details. */
2
2
#include <stdarg.h>
3
- #include <string.h>
4
3
#include <unistd.h>
5
4
#include <xcb/xcb.h>
6
5
#include <xcb/xcb_keysyms.h>
@@ -33,7 +32,7 @@ static void spawn(char **com) {
33
32
}
34
33
}
35
34
36
- static void eventHandlerButtonPress (xcb_generic_event_t * ev ) {
35
+ static void handleButtonPress (xcb_generic_event_t * ev ) {
37
36
xcb_button_press_event_t * e = (xcb_button_press_event_t * ) ev ;
38
37
win = e -> child ;
39
38
values [0 ] = XCB_STACK_MODE_ABOVE ;
@@ -53,7 +52,7 @@ static void eventHandlerButtonPress(xcb_generic_event_t * ev) {
53
52
XCB_GRAB_MODE_ASYNC , XCB_GRAB_MODE_ASYNC , root , XCB_NONE , XCB_CURRENT_TIME );
54
53
}
55
54
56
- static void eventHandlerMotionNotify (xcb_generic_event_t * ev ) {
55
+ static void handleMotionNotify (xcb_generic_event_t * ev ) {
57
56
xcb_query_pointer_cookie_t coord = xcb_query_pointer (dpy , root );
58
57
xcb_query_pointer_reply_t * poin = xcb_query_pointer_reply (dpy , coord , 0 );
59
58
uint32_t val [2 ] = {1 , 3 };
@@ -80,28 +79,27 @@ static void eventHandlerMotionNotify(xcb_generic_event_t * ev) {
80
79
static xcb_keycode_t * xcb_get_keycodes (xcb_keysym_t keysym ) {
81
80
xcb_key_symbols_t * keysyms = xcb_key_symbols_alloc (dpy );
82
81
xcb_keycode_t * keycode ;
83
- if (!(keysyms )) {
84
- keycode = NULL ;
85
- } else {
86
- keycode = xcb_key_symbols_get_keycode (keysyms , keysym );
87
- }
82
+ keycode = (!(keysyms ) ? NULL : xcb_key_symbols_get_keycode (keysyms , keysym ));
88
83
xcb_key_symbols_free (keysyms );
89
84
return keycode ;
90
85
}
91
86
92
87
static xcb_keysym_t xcb_get_keysym (xcb_keycode_t keycode ) {
93
88
xcb_key_symbols_t * keysyms = xcb_key_symbols_alloc (dpy );
94
89
xcb_keysym_t keysym ;
95
- if (!(keysyms )) {
96
- keysym = 0 ;
97
- } else {
98
- keysym = xcb_key_symbols_get_keysym (keysyms , keycode , 0 );
99
- }
90
+ keysym = (!(keysyms ) ? 0 : xcb_key_symbols_get_keysym (keysyms , keycode , 0 ));
100
91
xcb_key_symbols_free (keysyms );
101
92
return keysym ;
102
93
}
103
94
104
- static void eventHandlerKeyPress (xcb_generic_event_t * ev ) {
95
+ static void setFocus (xcb_drawable_t window ) {
96
+ if ((window != 0 ) && (window != root )) {
97
+ xcb_set_input_focus (dpy , XCB_INPUT_FOCUS_POINTER_ROOT , window ,
98
+ XCB_CURRENT_TIME );
99
+ }
100
+ }
101
+
102
+ static void handleKeyPress (xcb_generic_event_t * ev ) {
105
103
xcb_key_press_event_t * e = ( xcb_key_press_event_t * ) ev ;
106
104
xcb_keysym_t keysym = xcb_get_keysym (e -> detail );
107
105
win = e -> child ;
@@ -113,24 +111,41 @@ static void eventHandlerKeyPress(xcb_generic_event_t * ev) {
113
111
}
114
112
}
115
113
116
- static void eventHandlerEnterNotify (xcb_generic_event_t * ev ) {
114
+ static void handleEnterNotify (xcb_generic_event_t * ev ) {
117
115
xcb_enter_notify_event_t * e = ( xcb_enter_notify_event_t * ) ev ;
118
- xcb_drawable_t win_e = e -> event ;
119
- if ((win_e != 0 ) && (win_e != root )) {
120
- xcb_set_input_focus (dpy , XCB_INPUT_FOCUS_POINTER_ROOT , win_e ,
121
- XCB_CURRENT_TIME );
122
- }
116
+ setFocus (e -> event );
123
117
}
124
118
125
- static void eventHandlerButtonRelease (xcb_generic_event_t * ev ) {
119
+ static void handleButtonRelease (xcb_generic_event_t * ev ) {
126
120
xcb_ungrab_pointer (dpy , XCB_CURRENT_TIME );
127
121
}
128
122
129
- static void eventHandlerDestroyNotify (xcb_generic_event_t * ev ) {
123
+ static void handleKeyRelease (xcb_generic_event_t * ev ) {
124
+ /* nothing to see here, carry on */
125
+ }
126
+
127
+ static void handleDestroyNotify (xcb_generic_event_t * ev ) {
130
128
xcb_destroy_notify_event_t * e = (xcb_destroy_notify_event_t * ) ev ;
131
129
xcb_kill_client (dpy , e -> window );
132
130
}
133
131
132
+ static void handleMapRequest (xcb_generic_event_t * ev ) {
133
+ xcb_map_request_event_t * e = (xcb_map_request_event_t * ) ev ;
134
+ xcb_map_window (dpy , e -> window );
135
+ if ((scre -> root != e -> window ) && (0 != e -> window )) {
136
+ uint32_t vals [2 ];
137
+ vals [0 ] = WINDOW_WIDTH ;
138
+ vals [1 ] = WINDOW_HEIGHT ;
139
+ xcb_configure_window (dpy , e -> window , XCB_CONFIG_WINDOW_WIDTH |
140
+ XCB_CONFIG_WINDOW_HEIGHT , vals );
141
+ xcb_flush (dpy );
142
+ }
143
+ values [0 ] = XCB_EVENT_MASK_ENTER_WINDOW ;
144
+ xcb_change_window_attributes_checked (dpy , e -> window ,
145
+ XCB_CW_EVENT_MASK , values );
146
+ setFocus (e -> window );
147
+ }
148
+
134
149
static int eventHandler (void ) {
135
150
int ret = xcb_connection_has_error (dpy );
136
151
if (ret == 0 ) {
@@ -145,6 +160,15 @@ static int eventHandler(void) {
145
160
return ret ;
146
161
}
147
162
163
+ static void subscribeToEvents (void ) {
164
+ values [0 ] = XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT
165
+ | XCB_EVENT_MASK_STRUCTURE_NOTIFY
166
+ | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY
167
+ | XCB_EVENT_MASK_PROPERTY_CHANGE ;
168
+ xcb_change_window_attributes_checked (dpy , root ,
169
+ XCB_CW_EVENT_MASK , values );
170
+ }
171
+
148
172
static void grabKeys (void ) {
149
173
xcb_ungrab_key (dpy , XCB_GRAB_ANY , root , XCB_MOD_MASK_ANY );
150
174
int key_table_size = sizeof (keys ) / sizeof (* keys );
@@ -178,10 +202,21 @@ static int die(char * errstr) {
178
202
return 1 ;
179
203
}
180
204
205
+ static int strcmp_c (char * str1 , char * str2 ) {
206
+ char * c1 = str1 ;
207
+ char * c2 = str2 ;
208
+ while ((* c1 ) && ((* c1 ) == (* c2 ))) {
209
+ ++ c1 ;
210
+ ++ c2 ;
211
+ }
212
+ int n = (* c1 ) - (* c2 );
213
+ return n ;
214
+ }
215
+
181
216
int main (int argc , char * argv []) {
182
217
int ret = 0 ;
183
- if ((argc == 2 ) && (strcmp ("-v" , argv [1 ]) == 0 )) {
184
- ret = die ("xwm-0.0.2 , © 2020 Michael Czigler, see LICENSE for details\n" );
218
+ if ((argc == 2 ) && (strcmp_c ("-v" , argv [1 ]) == 0 )) {
219
+ ret = die ("xwm-0.0.3 , © 2020 Michael Czigler, see LICENSE for details\n" );
185
220
}
186
221
if ((ret == 0 ) && (argc != 1 )) {
187
222
ret = die ("usage: xwm [-v]\n" );
@@ -196,6 +231,7 @@ int main(int argc, char * argv[]) {
196
231
if (ret == 0 ) {
197
232
scre = xcb_setup_roots_iterator (xcb_get_setup (dpy )).data ;
198
233
root = scre -> root ;
234
+ subscribeToEvents ();
199
235
grabKeys ();
200
236
grabButtons ();
201
237
}
0 commit comments