From 46b1d6ef1e3a45a4ce8b3f5d3c4f9631e793e785 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 2 Jan 2014 20:58:20 +0000 Subject: [PATCH 1/8] When a client doesn't specify size hints, nothing prevents a resize to 0x0 - don't allow this situation during mouse resize (check already in place for kbd resize). Reported by brynet@ --- client.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client.c b/client.c index 1fa88a0..6cf68e4 100644 --- a/client.c +++ b/client.c @@ -832,6 +832,9 @@ client_applysizehints(struct client_ctx *cc) cc->geom.w = MIN(cc->geom.w, cc->hint.maxw); if (cc->hint.maxh) cc->geom.h = MIN(cc->geom.h, cc->hint.maxh); + + cc->geom.w = MAX(cc->geom.w, 1); + cc->geom.h = MAX(cc->geom.h, 1); } static void From 8420398068f8ec29995432d5ce55eba92982620d Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 2 Jan 2014 21:15:39 +0000 Subject: [PATCH 2/8] rename for clarity --- client.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client.c b/client.c index 6cf68e4..929bd8e 100644 --- a/client.c +++ b/client.c @@ -40,7 +40,7 @@ static void client_wm_protocols(struct client_ctx *); static void client_mwm_hints(struct client_ctx *); static int client_inbound(struct client_ctx *, int, int); -struct client_ctx *_curcc = NULL; +struct client_ctx *curcc = NULL; struct client_ctx * client_find(Window win) @@ -192,7 +192,7 @@ client_setactive(struct client_ctx *cc) if (!sc->cycling) client_mtf(cc); - _curcc = cc; + curcc = cc; cc->active = 1; cc->flags &= ~CLIENT_URGENCY; client_draw_border(cc); @@ -210,13 +210,13 @@ client_none(struct screen_ctx *sc) xu_ewmh_net_active_window(sc, none); - _curcc = NULL; + curcc = NULL; } struct client_ctx * client_current(void) { - return (_curcc); + return (curcc); } void From c4f6134ebe2bf68943d8660b9933137e7215e0d6 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 2 Jan 2014 21:17:23 +0000 Subject: [PATCH 3/8] gc keycode in keybinding since we only deal with keysym now --- calmwm.h | 1 - 1 file changed, 1 deletion(-) diff --git a/calmwm.h b/calmwm.h index 6effee9..97ecf0c 100644 --- a/calmwm.h +++ b/calmwm.h @@ -247,7 +247,6 @@ struct keybinding { union arg argument; u_int modmask; KeySym keysym; - int keycode; #define KBFLAG_NEEDCLIENT 0x0001 int flags; int argtype; From 10d4dcb1278b8ff01d5338aa58d50fa38978a9d5 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 2 Jan 2014 21:30:20 +0000 Subject: [PATCH 4/8] bring mousefunc closer to kbfunc --- calmwm.h | 31 +++++++++++++++++++------------ conf.c | 31 +++++++++++++++++-------------- mousefunc.c | 22 +++++++++++----------- xevents.c | 2 +- 4 files changed, 48 insertions(+), 38 deletions(-) diff --git a/calmwm.h b/calmwm.h index 97ecf0c..2e49846 100644 --- a/calmwm.h +++ b/calmwm.h @@ -255,7 +255,8 @@ TAILQ_HEAD(keybinding_q, keybinding); struct mousebinding { TAILQ_ENTRY(mousebinding) entry; - void (*callback)(struct client_ctx *, void *); + void (*callback)(struct client_ctx *, union arg *); + union arg argument; u_int modmask; u_int button; #define MOUSEBIND_CTX_ROOT 0x0001 @@ -483,19 +484,25 @@ void kbfunc_term(struct client_ctx *, union arg *); void kbfunc_tile(struct client_ctx *, union arg *); void mousefunc_client_cyclegroup(struct client_ctx *, - void *); + union arg *); void mousefunc_client_grouptoggle(struct client_ctx *, - void *); -void mousefunc_client_hide(struct client_ctx *, void *); -void mousefunc_client_lower(struct client_ctx *, void *); -void mousefunc_client_move(struct client_ctx *, void *); -void mousefunc_client_raise(struct client_ctx *, void *); + union arg *); +void mousefunc_client_hide(struct client_ctx *, + union arg *); +void mousefunc_client_lower(struct client_ctx *, + union arg *); +void mousefunc_client_move(struct client_ctx *, + union arg *); +void mousefunc_client_raise(struct client_ctx *, + union arg *); void mousefunc_client_rcyclegroup(struct client_ctx *, - void *); -void mousefunc_client_resize(struct client_ctx *, void *); -void mousefunc_menu_cmd(struct client_ctx *, void *); -void mousefunc_menu_group(struct client_ctx *, void *); -void mousefunc_menu_unhide(struct client_ctx *, void *); + union arg *); +void mousefunc_client_resize(struct client_ctx *, + union arg *); +void mousefunc_menu_cmd(struct client_ctx *, union arg *); +void mousefunc_menu_group(struct client_ctx *, union arg *); +void mousefunc_menu_unhide(struct client_ctx *, + union arg *); struct menu *menu_filter(struct screen_ctx *, struct menu_q *, char *, char *, int, diff --git a/conf.c b/conf.c index 426170f..606d088 100644 --- a/conf.c +++ b/conf.c @@ -535,22 +535,24 @@ conf_unbind_kbd(struct conf *c, struct keybinding *unbind) } static struct { - char *tag; - void (*handler)(struct client_ctx *, void *); - int flags; + char *tag; + void (*handler)(struct client_ctx *, union arg *); + int flags; + union arg argument; } name_to_mousefunc[] = { - { "window_move", mousefunc_client_move, MOUSEBIND_CTX_WIN }, - { "window_resize", mousefunc_client_resize, MOUSEBIND_CTX_WIN }, + { "window_move", mousefunc_client_move, MOUSEBIND_CTX_WIN, {0} }, + { "window_resize", mousefunc_client_resize, MOUSEBIND_CTX_WIN, {0} }, { "window_grouptoggle", mousefunc_client_grouptoggle, - MOUSEBIND_CTX_WIN }, - { "window_lower", mousefunc_client_lower, MOUSEBIND_CTX_WIN }, - { "window_raise", mousefunc_client_raise, MOUSEBIND_CTX_WIN }, - { "window_hide", mousefunc_client_hide, MOUSEBIND_CTX_WIN }, - { "cyclegroup", mousefunc_client_cyclegroup, MOUSEBIND_CTX_ROOT }, - { "rcyclegroup", mousefunc_client_rcyclegroup, MOUSEBIND_CTX_ROOT }, - { "menu_group", mousefunc_menu_group, MOUSEBIND_CTX_ROOT }, - { "menu_unhide", mousefunc_menu_unhide, MOUSEBIND_CTX_ROOT }, - { "menu_cmd", mousefunc_menu_cmd, MOUSEBIND_CTX_ROOT }, + MOUSEBIND_CTX_WIN, {0} }, + { "window_lower", mousefunc_client_lower, MOUSEBIND_CTX_WIN, {0} }, + { "window_raise", mousefunc_client_raise, MOUSEBIND_CTX_WIN, {0} }, + { "window_hide", mousefunc_client_hide, MOUSEBIND_CTX_WIN, {0} }, + { "cyclegroup", mousefunc_client_cyclegroup, MOUSEBIND_CTX_ROOT, {0} }, + { "rcyclegroup", mousefunc_client_rcyclegroup, + MOUSEBIND_CTX_ROOT, {0} }, + { "menu_group", mousefunc_menu_group, MOUSEBIND_CTX_ROOT, {0} }, + { "menu_unhide", mousefunc_menu_unhide, MOUSEBIND_CTX_ROOT, {0} }, + { "menu_cmd", mousefunc_menu_cmd, MOUSEBIND_CTX_ROOT, {0} }, }; static unsigned int mouse_btns[] = { @@ -597,6 +599,7 @@ conf_bind_mouse(struct conf *c, char *name, char *binding) current_binding->callback = name_to_mousefunc[i].handler; current_binding->flags = name_to_mousefunc[i].flags; + current_binding->argument = name_to_mousefunc[i].argument; TAILQ_INSERT_TAIL(&c->mousebindingq, current_binding, entry); return (1); } diff --git a/mousefunc.c b/mousefunc.c index 2506678..3bc7f1d 100644 --- a/mousefunc.c +++ b/mousefunc.c @@ -66,7 +66,7 @@ mousefunc_sweep_draw(struct client_ctx *cc) } void -mousefunc_client_resize(struct client_ctx *cc, void *arg) +mousefunc_client_resize(struct client_ctx *cc, union arg *arg) { XEvent ev; Time ltime = 0; @@ -120,7 +120,7 @@ mousefunc_client_resize(struct client_ctx *cc, void *arg) } void -mousefunc_client_move(struct client_ctx *cc, void *arg) +mousefunc_client_move(struct client_ctx *cc, union arg *arg) { XEvent ev; Time ltime = 0; @@ -173,50 +173,50 @@ mousefunc_client_move(struct client_ctx *cc, void *arg) } void -mousefunc_client_grouptoggle(struct client_ctx *cc, void *arg) +mousefunc_client_grouptoggle(struct client_ctx *cc, union arg *arg) { group_sticky_toggle_enter(cc); } void -mousefunc_client_lower(struct client_ctx *cc, void *arg) +mousefunc_client_lower(struct client_ctx *cc, union arg *arg) { client_ptrsave(cc); client_lower(cc); } void -mousefunc_client_raise(struct client_ctx *cc, void *arg) +mousefunc_client_raise(struct client_ctx *cc, union arg *arg) { client_raise(cc); } void -mousefunc_client_hide(struct client_ctx *cc, void *arg) +mousefunc_client_hide(struct client_ctx *cc, union arg *arg) { client_hide(cc); } void -mousefunc_client_cyclegroup(struct client_ctx *cc, void *arg) +mousefunc_client_cyclegroup(struct client_ctx *cc, union arg *arg) { group_cycle(cc->sc, CWM_CYCLE); } void -mousefunc_client_rcyclegroup(struct client_ctx *cc, void *arg) +mousefunc_client_rcyclegroup(struct client_ctx *cc, union arg *arg) { group_cycle(cc->sc, CWM_RCYCLE); } void -mousefunc_menu_group(struct client_ctx *cc, void *arg) +mousefunc_menu_group(struct client_ctx *cc, union arg *arg) { group_menu(cc->sc); } void -mousefunc_menu_unhide(struct client_ctx *cc, void *arg) +mousefunc_menu_unhide(struct client_ctx *cc, union arg *arg) { struct screen_ctx *sc = cc->sc; struct client_ctx *old_cc; @@ -258,7 +258,7 @@ mousefunc_menu_unhide(struct client_ctx *cc, void *arg) } void -mousefunc_menu_cmd(struct client_ctx *cc, void *arg) +mousefunc_menu_cmd(struct client_ctx *cc, union arg *arg) { struct screen_ctx *sc = cc->sc; struct menu *mi; diff --git a/xevents.c b/xevents.c index e3d17fd..09232c3 100644 --- a/xevents.c +++ b/xevents.c @@ -246,7 +246,7 @@ xev_handle_buttonpress(XEvent *ee) cc->sc = screen_fromroot(e->window); } - (*mb->callback)(cc, e); + (*mb->callback)(cc, &mb->argument); } static void From 5a5e7441e1185d457372e0655e063cd99546d989 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 2 Jan 2014 22:26:27 +0000 Subject: [PATCH 5/8] Accept _NET_WM_DESKTOP clientmessage; from Thomas Adam --- xevents.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xevents.c b/xevents.c index 09232c3..4f74514 100644 --- a/xevents.c +++ b/xevents.c @@ -342,6 +342,10 @@ xev_handle_clientmessage(XEvent *ee) client_ptrsave(old_cc); client_ptrwarp(cc); } + + if (e->message_type == ewmh[_NET_WM_DESKTOP] && e->format == 32) + group_movetogroup(cc, e->data.l[0]); + if (e->message_type == ewmh[_NET_WM_STATE] && e->format == 32) xu_ewmh_handle_net_wm_state_msg(cc, e->data.l[0], e->data.l[1], e->data.l[2]); From 376e98c2c8db3e298d503ef5ccf2c78937adad9b Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 2 Jan 2014 22:43:55 +0000 Subject: [PATCH 6/8] Accept _NET_CURRENT_DESKTOP ClientMessage; from Thomas Adam, though instead of group toggle, group only. --- xevents.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xevents.c b/xevents.c index 4f74514..2898e6c 100644 --- a/xevents.c +++ b/xevents.c @@ -326,8 +326,11 @@ xev_handle_clientmessage(XEvent *ee) { XClientMessageEvent *e = &ee->xclient; struct client_ctx *cc, *old_cc; + struct screen_ctx *sc; - if ((cc = client_find(e->window)) == NULL) + sc = screen_fromroot(e->window); + + if ((cc = client_find(e->window)) == NULL && e->window != sc->rootwin) return; if (e->message_type == cwmh[WM_CHANGE_STATE] && e->format == 32 && @@ -349,6 +352,9 @@ xev_handle_clientmessage(XEvent *ee) if (e->message_type == ewmh[_NET_WM_STATE] && e->format == 32) xu_ewmh_handle_net_wm_state_msg(cc, e->data.l[0], e->data.l[1], e->data.l[2]); + + if (e->message_type == ewmh[_NET_CURRENT_DESKTOP] && e->format == 32) + group_only(sc, e->data.l[0]); } static void From 2843ba1e2812f8424e0649946d77bd92a3ad49d8 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 2 Jan 2014 22:49:10 +0000 Subject: [PATCH 7/8] calculate proper menu width/height on the first Expose event; 'jump' (while using gap) noticed by Christian Neukirchen --- menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/menu.c b/menu.c index b0875ee..c20f012 100644 --- a/menu.c +++ b/menu.c @@ -392,13 +392,13 @@ menu_draw(struct menu_ctx *mc, struct menu_q *menuq, struct menu_q *resultq) mc->x = xine.w - mc->width; if (mc->x < xine.x) { mc->x = xine.x; - mc->width = xine.w - xine.x; + mc->width = MIN(mc->width, (xine.w - xine.x)); } if (mc->y + mc->height >= xine.h) mc->y = xine.h - mc->height; if (mc->y < xine.y) { mc->y = xine.y; - mc->height = xine.h - xine.y; + mc->height = MIN(mc->height, (xine.h - xine.y)); } if (mc->x != xsave || mc->y != ysave) From 08342471c86ca88dbfe71fffa55697f92378ff76 Mon Sep 17 00:00:00 2001 From: okan Date: Fri, 3 Jan 2014 14:23:50 +0000 Subject: [PATCH 8/8] state is long --- client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client.c b/client.c index 929bd8e..f7e3148 100644 --- a/client.c +++ b/client.c @@ -59,7 +59,7 @@ client_init(Window win, struct screen_ctx *sc, int mapped) { struct client_ctx *cc; XWindowAttributes wattr; - int state; + long state; if (win == None) return (NULL);