Skip to content

Commit 265a5cb

Browse files
authored
released at 0.0.2
1 parent 040610d commit 265a5cb

File tree

5 files changed

+32
-13
lines changed

5 files changed

+32
-13
lines changed

CHANGELOG

+6
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
### Added
99
- Initial release.
1010

11+
## [0.0.2] - 2020-11-07
12+
## Added
13+
- Close window command (default: Win+q)
14+
15+
### Fixed
16+
- Resize crash in root window.

README

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ BUILD REQUIREMENTS
1111
==================
1212

1313
Other than libxcb, xwm also uses several default utilities which can be
14-
patched or configured to the users preference.
14+
patched, configured or expanded to meet the users preference.
1515

1616
application launcher dmenu - https://git.suckless.org/dmenu
1717
terminal emulator st - https://git.suckless.org/st
@@ -20,11 +20,12 @@ patched or configured to the users preference.
2020
COMMANDS
2121
========
2222

23-
Implemented commands are limited.
23+
Implemented commands:
2424
Win+Button1+[drag] interactive window move
2525
Win+Button3+[drag] interactive window resize
2626
Win+Space run launcher menu (default: dmenu_run)
2727
Win+Enter create new terminal window (default: st)
28+
Win+q kill focused window
2829
Win+Shift+q quit window manager
2930

3031
INSTALL
@@ -63,4 +64,3 @@ CONTACT
6364
=======
6465

6566
For questions or issues, please contact info[at]mcpcpc[dot]com.
66-

TODO

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
1-
* Fix minimum window size
2-
* Add close window command (e.g. Win+q)
1+
* Add minimum window size
32
* Use library call instead of execvp()

xwm.c

+18-6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ static xcb_drawable_t root;
1414
static uint32_t values[3];
1515

1616
static void killclient(char **com) {
17+
xcb_kill_client(dpy, win);
1718
}
1819

1920
static void closewm(char **com) {
@@ -33,7 +34,7 @@ static void spawn(char **com) {
3334
}
3435

3536
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;
3738
win = e->child;
3839
values[0] = XCB_STACK_MODE_ABOVE;
3940
xcb_configure_window(dpy, win, XCB_CONFIG_WINDOW_STACK_MODE, values);
@@ -42,10 +43,11 @@ static void eventHandlerButtonPress(xcb_generic_event_t * ev) {
4243
if (1 == e->detail) {
4344
values[2] = 1;
4445
xcb_warp_pointer(dpy, XCB_NONE, win, 0, 0, 0, 0, 1, 1);
45-
} else {
46+
} else if (win != 0) {
4647
values[2] = 3;
4748
xcb_warp_pointer(dpy, XCB_NONE, win, 0, 0, 0, 0, geom->width, geom->height);
4849
}
50+
else {}
4951
xcb_grab_pointer(dpy, 0, root, XCB_EVENT_MASK_BUTTON_RELEASE
5052
| XCB_EVENT_MASK_BUTTON_MOTION | XCB_EVENT_MASK_POINTER_MOTION_HINT,
5153
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) {
5557
xcb_query_pointer_cookie_t coord = xcb_query_pointer(dpy, root);
5658
xcb_query_pointer_reply_t * poin = xcb_query_pointer_reply(dpy, coord, 0);
5759
uint32_t val[2] = {1, 3};
58-
if (values[2] == val[0]) {
60+
if ((values[2] == val[0]) && (win != 0)) {
5961
xcb_get_geometry_cookie_t geom_now = xcb_get_geometry(dpy, win);
6062
xcb_get_geometry_reply_t * geom = xcb_get_geometry_reply(dpy, geom_now, NULL);
6163
values[0] = ((poin->root_x + geom->width) > scre->width_in_pixels) ?
@@ -64,15 +66,15 @@ static void eventHandlerMotionNotify(xcb_generic_event_t * ev) {
6466
(scre->height_in_pixels - geom->height) : poin->root_y;
6567
xcb_configure_window(dpy, win, XCB_CONFIG_WINDOW_X
6668
| XCB_CONFIG_WINDOW_Y, values);
67-
} else if (values[2] == val[1]) {
69+
}
70+
if ((values[2] == val[1]) && (win != 0)) {
6871
xcb_get_geometry_cookie_t geom_now = xcb_get_geometry(dpy, win);
6972
xcb_get_geometry_reply_t* geom = xcb_get_geometry_reply(dpy, geom_now, NULL);
7073
values[0] = poin->root_x - geom->x;
7174
values[1] = poin->root_y - geom->y;
7275
xcb_configure_window(dpy, win, XCB_CONFIG_WINDOW_WIDTH
7376
| XCB_CONFIG_WINDOW_HEIGHT, values);
7477
}
75-
else {}
7678
}
7779

7880
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) {
102104
static void eventHandlerKeyPress(xcb_generic_event_t * ev) {
103105
xcb_key_press_event_t * e = ( xcb_key_press_event_t *) ev;
104106
xcb_keysym_t keysym = xcb_get_keysym(e->detail);
107+
win = e->child;
105108
int key_table_size = sizeof(keys) / sizeof(*keys);
106109
for (int i = 0; i < key_table_size; ++i) {
107110
if ((keys[i].keysym == keysym) && (keys[i].mod == e->state)) {
@@ -110,6 +113,15 @@ static void eventHandlerKeyPress(xcb_generic_event_t * ev) {
110113
}
111114
}
112115

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+
113125
static void eventHandlerButtonRelease(xcb_generic_event_t * ev) {
114126
xcb_ungrab_pointer(dpy, XCB_CURRENT_TIME);
115127
}
@@ -169,7 +181,7 @@ static int die(char * errstr) {
169181
int main(int argc, char * argv[]) {
170182
int ret = 0;
171183
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");
173185
}
174186
if ((ret == 0) && (argc != 1)) {
175187
ret = die("usage: xwm [-v]\n");

xwm.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ static void closewm(char ** com);
2424

2525
/* event hander actions */
2626
static int eventHandler(void);
27-
static void eventHandlerButtonPress(xcb_generic_event_t * ev);
2827
static void eventHandlerMotionNotify(xcb_generic_event_t * ev);
29-
static void eventHandlerKeyPress(xcb_generic_event_t * ev);
28+
static void eventHandlerEnterNotify(xcb_generic_event_t * ev);
29+
static void eventHandlerButtonPress(xcb_generic_event_t * ev);
3030
static void eventHandlerButtonRelease(xcb_generic_event_t * ev);
31+
static void eventHandlerKeyPress(xcb_generic_event_t * ev);
3132
static void eventHandlerDestroyNotify(xcb_generic_event_t * ev);
3233
static handler_func_t handler_funs[] = {
3334
{ XCB_MOTION_NOTIFY, eventHandlerMotionNotify },
35+
{ XCB_ENTER_NOTIFY, eventHandlerEnterNotify },
3436
{ XCB_BUTTON_PRESS, eventHandlerButtonPress },
3537
{ XCB_BUTTON_RELEASE, eventHandlerButtonRelease },
3638
{ XCB_KEY_PRESS, eventHandlerKeyPress },

0 commit comments

Comments
 (0)