@@ -14,6 +14,7 @@ static xcb_drawable_t root;
14
14
static uint32_t values [3 ];
15
15
16
16
static void killclient (char * * com ) {
17
+ xcb_kill_client (dpy , win );
17
18
}
18
19
19
20
static void closewm (char * * com ) {
@@ -33,7 +34,7 @@ static void spawn(char **com) {
33
34
}
34
35
35
36
static void eventHandlerButtonPress (xcb_generic_event_t * ev ) {
36
- xcb_button_press_event_t * e = ( xcb_button_press_event_t * ) ev ;
37
+ xcb_button_press_event_t * e = (xcb_button_press_event_t * ) ev ;
37
38
win = e -> child ;
38
39
values [0 ] = XCB_STACK_MODE_ABOVE ;
39
40
xcb_configure_window (dpy , win , XCB_CONFIG_WINDOW_STACK_MODE , values );
@@ -42,10 +43,11 @@ static void eventHandlerButtonPress(xcb_generic_event_t * ev) {
42
43
if (1 == e -> detail ) {
43
44
values [2 ] = 1 ;
44
45
xcb_warp_pointer (dpy , XCB_NONE , win , 0 , 0 , 0 , 0 , 1 , 1 );
45
- } else {
46
+ } else if ( win != 0 ) {
46
47
values [2 ] = 3 ;
47
48
xcb_warp_pointer (dpy , XCB_NONE , win , 0 , 0 , 0 , 0 , geom -> width , geom -> height );
48
49
}
50
+ else {}
49
51
xcb_grab_pointer (dpy , 0 , root , XCB_EVENT_MASK_BUTTON_RELEASE
50
52
| XCB_EVENT_MASK_BUTTON_MOTION | XCB_EVENT_MASK_POINTER_MOTION_HINT ,
51
53
XCB_GRAB_MODE_ASYNC , XCB_GRAB_MODE_ASYNC , root , XCB_NONE , XCB_CURRENT_TIME );
@@ -55,7 +57,7 @@ static void eventHandlerMotionNotify(xcb_generic_event_t * ev) {
55
57
xcb_query_pointer_cookie_t coord = xcb_query_pointer (dpy , root );
56
58
xcb_query_pointer_reply_t * poin = xcb_query_pointer_reply (dpy , coord , 0 );
57
59
uint32_t val [2 ] = {1 , 3 };
58
- if (values [2 ] == val [0 ]) {
60
+ if (( values [2 ] == val [0 ]) && ( win != 0 ) ) {
59
61
xcb_get_geometry_cookie_t geom_now = xcb_get_geometry (dpy , win );
60
62
xcb_get_geometry_reply_t * geom = xcb_get_geometry_reply (dpy , geom_now , NULL );
61
63
values [0 ] = ((poin -> root_x + geom -> width ) > scre -> width_in_pixels ) ?
@@ -64,15 +66,15 @@ static void eventHandlerMotionNotify(xcb_generic_event_t * ev) {
64
66
(scre -> height_in_pixels - geom -> height ) : poin -> root_y ;
65
67
xcb_configure_window (dpy , win , XCB_CONFIG_WINDOW_X
66
68
| XCB_CONFIG_WINDOW_Y , values );
67
- } else if (values [2 ] == val [1 ]) {
69
+ }
70
+ if ((values [2 ] == val [1 ]) && (win != 0 )) {
68
71
xcb_get_geometry_cookie_t geom_now = xcb_get_geometry (dpy , win );
69
72
xcb_get_geometry_reply_t * geom = xcb_get_geometry_reply (dpy , geom_now , NULL );
70
73
values [0 ] = poin -> root_x - geom -> x ;
71
74
values [1 ] = poin -> root_y - geom -> y ;
72
75
xcb_configure_window (dpy , win , XCB_CONFIG_WINDOW_WIDTH
73
76
| XCB_CONFIG_WINDOW_HEIGHT , values );
74
77
}
75
- else {}
76
78
}
77
79
78
80
static xcb_keycode_t * xcb_get_keycodes (xcb_keysym_t keysym ) {
@@ -102,6 +104,7 @@ static xcb_keysym_t xcb_get_keysym(xcb_keycode_t keycode) {
102
104
static void eventHandlerKeyPress (xcb_generic_event_t * ev ) {
103
105
xcb_key_press_event_t * e = ( xcb_key_press_event_t * ) ev ;
104
106
xcb_keysym_t keysym = xcb_get_keysym (e -> detail );
107
+ win = e -> child ;
105
108
int key_table_size = sizeof (keys ) / sizeof (* keys );
106
109
for (int i = 0 ; i < key_table_size ; ++ i ) {
107
110
if ((keys [i ].keysym == keysym ) && (keys [i ].mod == e -> state )) {
@@ -110,6 +113,15 @@ static void eventHandlerKeyPress(xcb_generic_event_t * ev) {
110
113
}
111
114
}
112
115
116
+ static void eventHandlerEnterNotify (xcb_generic_event_t * ev ) {
117
+ 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
+ }
123
+ }
124
+
113
125
static void eventHandlerButtonRelease (xcb_generic_event_t * ev ) {
114
126
xcb_ungrab_pointer (dpy , XCB_CURRENT_TIME );
115
127
}
@@ -169,7 +181,7 @@ static int die(char * errstr) {
169
181
int main (int argc , char * argv []) {
170
182
int ret = 0 ;
171
183
if ((argc == 2 ) && (strcmp ("-v" , argv [1 ]) == 0 )) {
172
- ret = die ("xwm-0.0.1 , © 2020 Michael Czigler, see LICENSE for details\n" );
184
+ ret = die ("xwm-0.0.2 , © 2020 Michael Czigler, see LICENSE for details\n" );
173
185
}
174
186
if ((ret == 0 ) && (argc != 1 )) {
175
187
ret = die ("usage: xwm [-v]\n" );
0 commit comments