From 457938fbd750388907876ce30a98b216ae758922 Mon Sep 17 00:00:00 2001 From: okan Date: Fri, 10 May 2013 15:44:43 +0000 Subject: fix KeySym type --- xevents.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'xevents.c') diff --git a/xevents.c b/xevents.c index 96d51d2..65dba3b 100644 --- a/xevents.c +++ b/xevents.c @@ -322,7 +322,8 @@ xev_handle_keyrelease(XEvent *ee) XKeyEvent *e = &ee->xkey; struct screen_ctx *sc; struct client_ctx *cc; - int i, keysym; + KeySym keysym; + int i; sc = screen_fromroot(e->root); cc = client_current(); -- cgit 1.4.1 From e05c0a2c600d22841d6950abf6fc013efe6a7cad Mon Sep 17 00:00:00 2001 From: okan Date: Fri, 10 May 2013 16:05:34 +0000 Subject: int type fixes --- conf.c | 6 +++--- xevents.c | 2 +- xutil.c | 14 ++++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) (limited to 'xevents.c') diff --git a/conf.c b/conf.c index 06d4e1c..ee18fcd 100644 --- a/conf.c +++ b/conf.c @@ -195,7 +195,7 @@ m_binds[] = { void conf_init(struct conf *c) { - int i; + u_int i; bzero(c, sizeof(*c)); @@ -459,7 +459,7 @@ conf_bindname(struct conf *c, char *name, char *binding) { struct keybinding *current_binding; char *substring, *tmp; - int i; + u_int i; current_binding = xcalloc(1, sizeof(*current_binding)); @@ -564,7 +564,7 @@ conf_mousebind(struct conf *c, char *name, char *binding) struct mousebinding *current_binding; char *substring, *tmp; const char *errstr; - int i; + u_int i; current_binding = xcalloc(1, sizeof(*current_binding)); diff --git a/xevents.c b/xevents.c index 65dba3b..b182299 100644 --- a/xevents.c +++ b/xevents.c @@ -323,7 +323,7 @@ xev_handle_keyrelease(XEvent *ee) struct screen_ctx *sc; struct client_ctx *cc; KeySym keysym; - int i; + u_int i; sc = screen_fromroot(e->root); cc = client_current(); diff --git a/xutil.c b/xutil.c index 496fe0b..6aee4d9 100644 --- a/xutil.c +++ b/xutil.c @@ -56,7 +56,8 @@ xu_ptr_ungrab(void) void xu_btn_grab(Window win, int mask, u_int btn) { - int i; + u_int i; + for (i = 0; i < nitems(ign_mods); i++) XGrabButton(X_Dpy, btn, (mask | ign_mods[i]), win, False, BUTTONMASK, GrabModeAsync, @@ -66,7 +67,8 @@ xu_btn_grab(Window win, int mask, u_int btn) void xu_btn_ungrab(Window win, int mask, u_int btn) { - int i; + u_int i; + for (i = 0; i < nitems(ign_mods); i++) XUngrabButton(X_Dpy, btn, (mask | ign_mods[i]), win); } @@ -91,7 +93,7 @@ void xu_key_grab(Window win, int mask, KeySym keysym) { KeyCode code; - int i; + u_int i; code = XKeysymToKeycode(X_Dpy, keysym); if ((XkbKeycodeToKeysym(X_Dpy, code, 0, 0) != keysym) && @@ -107,7 +109,7 @@ void xu_key_ungrab(Window win, int mask, KeySym keysym) { KeyCode code; - int i; + u_int i; code = XKeysymToKeycode(X_Dpy, keysym); if ((XkbKeycodeToKeysym(X_Dpy, code, 0, 0) != keysym) && @@ -258,7 +260,7 @@ struct atom_ctx ewmh[EWMH_NITEMS] = { void xu_getatoms(void) { - int i; + u_int i; for (i = 0; i < nitems(cwmh); i++) cwmh[i].atom = XInternAtom(X_Dpy, cwmh[i].name, False); @@ -271,7 +273,7 @@ void xu_ewmh_net_supported(struct screen_ctx *sc) { Atom atom[EWMH_NITEMS]; - int i; + u_int i; for (i = 0; i < nitems(ewmh); i++) atom[i] = ewmh[i].atom; -- cgit 1.4.1 From 9b9e95d74236b135d799c19c94d9b8070ffc6a58 Mon Sep 17 00:00:00 2001 From: okan Date: Fri, 10 May 2013 16:32:47 +0000 Subject: more type fixes for mask/button --- calmwm.h | 14 +++++++------- conf.c | 2 +- xevents.c | 2 +- xutil.c | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) (limited to 'xevents.c') diff --git a/calmwm.h b/calmwm.h index 3cb8442..5fd166d 100644 --- a/calmwm.h +++ b/calmwm.h @@ -235,7 +235,7 @@ struct keybinding { TAILQ_ENTRY(keybinding) entry; void (*callback)(struct client_ctx *, union arg *); union arg argument; - int modmask; + u_int modmask; KeySym keysym; int keycode; #define KBFLAG_NEEDCLIENT 0x0001 @@ -247,8 +247,8 @@ TAILQ_HEAD(keybinding_q, keybinding); struct mousebinding { TAILQ_ENTRY(mousebinding) entry; void (*callback)(struct client_ctx *, void *); - int modmask; - int button; + u_int modmask; + u_int button; #define MOUSEBIND_CTX_ROOT 0x0001 #define MOUSEBIND_CTX_WIN 0x0002 int context; @@ -465,11 +465,11 @@ unsigned long xu_getcolor(struct screen_ctx *, char *); int xu_getprop(Window, Atom, Atom, long, u_char **); int xu_get_wm_state(Window, int *); int xu_getstrprop(Window, Atom, char **); -void xu_key_grab(Window, int, KeySym); -void xu_key_ungrab(Window, int, KeySym); +void xu_key_grab(Window, u_int, KeySym); +void xu_key_ungrab(Window, u_int, KeySym); void xu_ptr_getpos(Window, int *, int *); -int xu_ptr_grab(Window, int, Cursor); -int xu_ptr_regrab(int, Cursor); +int xu_ptr_grab(Window, u_int, Cursor); +int xu_ptr_regrab(u_int, Cursor); void xu_ptr_setpos(Window, int, int); void xu_ptr_ungrab(void); void xu_sendmsg(Window, Atom, long); diff --git a/conf.c b/conf.c index ee18fcd..e580b9e 100644 --- a/conf.c +++ b/conf.c @@ -627,7 +627,7 @@ void conf_grab_mouse(struct client_ctx *cc) { struct mousebinding *mb; - int button; + u_int button; TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) { if (mb->context != MOUSEBIND_CTX_WIN) diff --git a/xevents.c b/xevents.c index b182299..073a919 100644 --- a/xevents.c +++ b/xevents.c @@ -277,7 +277,7 @@ xev_handle_keypress(XEvent *ee) struct client_ctx *cc = NULL, fakecc; struct keybinding *kb; KeySym keysym, skeysym; - int modshift; + u_int modshift; keysym = XkbKeycodeToKeysym(X_Dpy, e->keycode, 0, 0); skeysym = XkbKeycodeToKeysym(X_Dpy, e->keycode, 0, 1); diff --git a/xutil.c b/xutil.c index 6aee4d9..a2a6bec 100644 --- a/xutil.c +++ b/xutil.c @@ -33,7 +33,7 @@ static unsigned int ign_mods[] = { 0, LockMask, Mod2Mask, Mod2Mask | LockMask }; int -xu_ptr_grab(Window win, int mask, Cursor curs) +xu_ptr_grab(Window win, u_int mask, Cursor curs) { return (XGrabPointer(X_Dpy, win, False, mask, GrabModeAsync, GrabModeAsync, @@ -41,7 +41,7 @@ xu_ptr_grab(Window win, int mask, Cursor curs) } int -xu_ptr_regrab(int mask, Cursor curs) +xu_ptr_regrab(u_int mask, Cursor curs) { return (XChangeActivePointerGrab(X_Dpy, mask, curs, CurrentTime) == GrabSuccess ? 0 : -1); @@ -90,7 +90,7 @@ xu_ptr_setpos(Window win, int x, int y) } void -xu_key_grab(Window win, int mask, KeySym keysym) +xu_key_grab(Window win, u_int mask, KeySym keysym) { KeyCode code; u_int i; @@ -106,7 +106,7 @@ xu_key_grab(Window win, int mask, KeySym keysym) } void -xu_key_ungrab(Window win, int mask, KeySym keysym) +xu_key_ungrab(Window win, u_int mask, KeySym keysym) { KeyCode code; u_int i; -- cgit 1.4.1 From 2b926784ba44c5ef28e9cb239e3acbeb866c6d12 Mon Sep 17 00:00:00 2001 From: okan Date: Sat, 11 May 2013 22:01:07 +0000 Subject: new -> init --- calmwm.h | 2 +- client.c | 2 +- screen.c | 2 +- xevents.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'xevents.c') diff --git a/calmwm.h b/calmwm.h index 9a1fab9..cf63adc 100644 --- a/calmwm.h +++ b/calmwm.h @@ -331,7 +331,7 @@ void client_lower(struct client_ctx *); void client_map(struct client_ctx *); void client_maximize(struct client_ctx *); void client_move(struct client_ctx *); -struct client_ctx *client_new(Window, struct screen_ctx *, int); +struct client_ctx *client_init(Window, struct screen_ctx *, int); void client_ptrsave(struct client_ctx *); void client_ptrwarp(struct client_ctx *); void client_raise(struct client_ctx *); diff --git a/client.c b/client.c index 7b94777..5a0a070 100644 --- a/client.c +++ b/client.c @@ -55,7 +55,7 @@ client_find(Window win) } struct client_ctx * -client_new(Window win, struct screen_ctx *sc, int mapped) +client_init(Window win, struct screen_ctx *sc, int mapped) { struct client_ctx *cc; XClassHint xch; diff --git a/screen.c b/screen.c index b3425a1..8435859 100644 --- a/screen.c +++ b/screen.c @@ -74,7 +74,7 @@ screen_init(int which) if (winattr.override_redirect || winattr.map_state != IsViewable) continue; - (void)client_new(wins[i], sc, winattr.map_state != IsUnmapped); + (void)client_init(wins[i], sc, winattr.map_state != IsUnmapped); } XFree(wins); diff --git a/xevents.c b/xevents.c index 073a919..c8dcf25 100644 --- a/xevents.c +++ b/xevents.c @@ -86,7 +86,7 @@ xev_handle_maprequest(XEvent *ee) if ((cc = client_find(e->window)) == NULL) { XGetWindowAttributes(X_Dpy, e->window, &xattr); - cc = client_new(e->window, screen_fromroot(xattr.root), 1); + cc = client_init(e->window, screen_fromroot(xattr.root), 1); } if ((cc->flags & CLIENT_IGNORE) == 0) -- cgit 1.4.1 From 3253f5a4a1b849ea51594eccff2f6974e578b4af Mon Sep 17 00:00:00 2001 From: okan Date: Sun, 19 May 2013 17:01:29 +0000 Subject: simplify --- xevents.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'xevents.c') diff --git a/xevents.c b/xevents.c index c8dcf25..9849fb5 100644 --- a/xevents.c +++ b/xevents.c @@ -203,13 +203,12 @@ xev_handle_propertynotify(XEvent *ee) break; } } else { - TAILQ_FOREACH(sc, &Screenq, entry) - if (sc->rootwin == e->window) - goto test; - return; -test: - if (e->atom == ewmh[_NET_DESKTOP_NAMES].atom) - group_update_names(sc); + TAILQ_FOREACH(sc, &Screenq, entry) { + if (sc->rootwin == e->window) { + if (e->atom == ewmh[_NET_DESKTOP_NAMES].atom) + group_update_names(sc); + } + } } } -- cgit 1.4.1 From 556a50d8f7f6804630bfffc6b1f1817fd67a273b Mon Sep 17 00:00:00 2001 From: okan Date: Sun, 19 May 2013 17:03:55 +0000 Subject: treat WM_CHANGE_STATE like other atoms --- calmwm.h | 1 + xevents.c | 7 ++----- xutil.c | 1 + 3 files changed, 4 insertions(+), 5 deletions(-) (limited to 'xevents.c') diff --git a/calmwm.h b/calmwm.h index 033ed5a..032e8b8 100644 --- a/calmwm.h +++ b/calmwm.h @@ -527,6 +527,7 @@ enum { WM_PROTOCOLS, _MOTIF_WM_HINTS, UTF8_STRING, + WM_CHANGE_STATE, CWMH_NITEMS }; enum { diff --git a/xevents.c b/xevents.c index 9849fb5..174985d 100644 --- a/xevents.c +++ b/xevents.c @@ -340,16 +340,13 @@ static void xev_handle_clientmessage(XEvent *ee) { XClientMessageEvent *e = &ee->xclient; - Atom xa_wm_change_state; struct client_ctx *cc; - xa_wm_change_state = XInternAtom(X_Dpy, "WM_CHANGE_STATE", False); - if ((cc = client_find(e->window)) == NULL) return; - if (e->message_type == xa_wm_change_state && e->format == 32 && - e->data.l[0] == IconicState) + if (e->message_type == cwmh[WM_CHANGE_STATE].atom && + e->format == 32 && e->data.l[0] == IconicState) client_hide(cc); } diff --git a/xutil.c b/xutil.c index a2a6bec..764116a 100644 --- a/xutil.c +++ b/xutil.c @@ -239,6 +239,7 @@ struct atom_ctx cwmh[CWMH_NITEMS] = { {"WM_PROTOCOLS", None}, {"_MOTIF_WM_HINTS", None}, {"UTF8_STRING", None}, + {"WM_CHANGE_STATE", None}, }; struct atom_ctx ewmh[EWMH_NITEMS] = { {"_NET_SUPPORTED", None}, -- cgit 1.4.1 From c84145661e14cc62032f30c6a8c744ba84b95601 Mon Sep 17 00:00:00 2001 From: okan Date: Sun, 19 May 2013 17:05:52 +0000 Subject: add support for _NET_CLOSE_WINDOW --- calmwm.h | 1 + xevents.c | 3 +++ xutil.c | 1 + 3 files changed, 5 insertions(+) (limited to 'xevents.c') diff --git a/calmwm.h b/calmwm.h index 032e8b8..cf980e1 100644 --- a/calmwm.h +++ b/calmwm.h @@ -545,6 +545,7 @@ enum { _NET_WORKAREA, _NET_WM_NAME, _NET_WM_DESKTOP, + _NET_CLOSE_WINDOW, EWMH_NITEMS }; struct atom_ctx { diff --git a/xevents.c b/xevents.c index 174985d..91da64a 100644 --- a/xevents.c +++ b/xevents.c @@ -348,6 +348,9 @@ xev_handle_clientmessage(XEvent *ee) if (e->message_type == cwmh[WM_CHANGE_STATE].atom && e->format == 32 && e->data.l[0] == IconicState) client_hide(cc); + + if (e->message_type == ewmh[_NET_CLOSE_WINDOW].atom) + client_send_delete(cc); } static void diff --git a/xutil.c b/xutil.c index 764116a..d9f2106 100644 --- a/xutil.c +++ b/xutil.c @@ -256,6 +256,7 @@ struct atom_ctx ewmh[EWMH_NITEMS] = { {"_NET_WORKAREA", None}, {"_NET_WM_NAME", None}, {"_NET_WM_DESKTOP", None}, + {"_NET_CLOSE_WINDOW", None}, }; void -- cgit 1.4.1 From ad8020e17dc6277cc956d00eb869fc8703079f5f Mon Sep 17 00:00:00 2001 From: okan Date: Mon, 20 May 2013 21:19:15 +0000 Subject: handle _NET_ACTIVE_WINDOW ClientMessage; from Alexander Polakov. --- xevents.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'xevents.c') diff --git a/xevents.c b/xevents.c index 91da64a..32b2262 100644 --- a/xevents.c +++ b/xevents.c @@ -340,7 +340,7 @@ static void xev_handle_clientmessage(XEvent *ee) { XClientMessageEvent *e = &ee->xclient; - struct client_ctx *cc; + struct client_ctx *cc, *old_cc; if ((cc = client_find(e->window)) == NULL) return; @@ -351,6 +351,14 @@ xev_handle_clientmessage(XEvent *ee) if (e->message_type == ewmh[_NET_CLOSE_WINDOW].atom) client_send_delete(cc); + + if (e->message_type == ewmh[_NET_ACTIVE_WINDOW].atom && + e->format == 32) { + old_cc = client_current(); + if (old_cc) + client_ptrsave(old_cc); + client_ptrwarp(cc); + } } static void -- cgit 1.4.1 From c2042cd5238e74bcc3763a1e90917425eb41964e Mon Sep 17 00:00:00 2001 From: okan Date: Mon, 20 May 2013 21:32:00 +0000 Subject: stray whitespace --- menu.c | 2 +- xevents.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'xevents.c') diff --git a/menu.c b/menu.c index 5313efb..6816006 100644 --- a/menu.c +++ b/menu.c @@ -451,7 +451,7 @@ menu_draw_entry(struct menu_ctx *mc, struct menu_q *resultq, return; color = active ? CWM_COLOR_MENU_FG : CWM_COLOR_MENU_BG; - text = mi->print[0] != '\0' ? mi->print : mi->text; + text = mi->print[0] != '\0' ? mi->print : mi->text; XftDrawRect(sc->xftdraw, &sc->xftcolor[color], 0, (sc->xftfont->height + 1) * entry, mc->width, (sc->xftfont->height + 1) + sc->xftfont->descent); diff --git a/xevents.c b/xevents.c index 32b2262..b13548b 100644 --- a/xevents.c +++ b/xevents.c @@ -358,7 +358,7 @@ xev_handle_clientmessage(XEvent *ee) if (old_cc) client_ptrsave(old_cc); client_ptrwarp(cc); - } + } } static void -- cgit 1.4.1 From 421bf22ac7a165f0f4d5608ffa22c887ff857d53 Mon Sep 17 00:00:00 2001 From: okan Date: Tue, 21 May 2013 00:29:20 +0000 Subject: handle _NET_WM_STATE ClientMessage; from Alexander Polakov. --- calmwm.h | 7 +++++++ xevents.c | 4 ++++ xutil.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) (limited to 'xevents.c') diff --git a/calmwm.h b/calmwm.h index e525cbf..b925c2c 100644 --- a/calmwm.h +++ b/calmwm.h @@ -482,6 +482,8 @@ void xu_ewmh_net_desktop_names(struct screen_ctx *, char *, void xu_ewmh_net_wm_desktop(struct client_ctx *); Atom *xu_ewmh_get_net_wm_state(struct client_ctx *, int *); +void xu_ewmh_handle_net_wm_state_msg(struct client_ctx *, + int, Atom , Atom); void xu_ewmh_set_net_wm_state(struct client_ctx *); void xu_ewmh_restore_net_wm_state(struct client_ctx *); @@ -543,6 +545,11 @@ enum { _NET_WM_STATE_MAXIMIZED_HORZ, EWMH_NITEMS }; +enum { + _NET_WM_STATE_REMOVE, + _NET_WM_STATE_ADD, + _NET_WM_STATE_TOGGLE +}; struct atom_ctx { char *name; Atom atom; diff --git a/xevents.c b/xevents.c index b13548b..1c6ffaf 100644 --- a/xevents.c +++ b/xevents.c @@ -359,6 +359,10 @@ xev_handle_clientmessage(XEvent *ee) client_ptrsave(old_cc); client_ptrwarp(cc); } + if (e->message_type == ewmh[_NET_WM_STATE].atom && + e->format == 32) + xu_ewmh_handle_net_wm_state_msg(cc, + e->data.l[0], e->data.l[1], e->data.l[2]); } static void diff --git a/xutil.c b/xutil.c index 95bb0d4..2c678dd 100644 --- a/xutil.c +++ b/xutil.c @@ -439,6 +439,43 @@ xu_ewmh_get_net_wm_state(struct client_ctx *cc, int *n) return (state); } +void +xu_ewmh_handle_net_wm_state_msg(struct client_ctx *cc, int action, + Atom first, Atom second) +{ + int i; + static struct handlers { + int atom; + int property; + void (*toggle)(struct client_ctx *); + } handlers[] = { + { _NET_WM_STATE_MAXIMIZED_VERT, + CLIENT_VMAXIMIZED, + client_vmaximize }, + { _NET_WM_STATE_MAXIMIZED_HORZ, + CLIENT_HMAXIMIZED, + client_hmaximize }, + }; + + for (i = 0; i < nitems(handlers); i++) { + if (first != ewmh[handlers[i].atom].atom && + second != ewmh[handlers[i].atom].atom) + continue; + switch (action) { + case _NET_WM_STATE_ADD: + if ((cc->flags & handlers[i].property) == 0) + handlers[i].toggle(cc); + break; + case _NET_WM_STATE_REMOVE: + if (cc->flags & handlers[i].property) + handlers[i].toggle(cc); + break; + case _NET_WM_STATE_TOGGLE: + handlers[i].toggle(cc); + } + } +} + void xu_ewmh_restore_net_wm_state(struct client_ctx *cc) { -- cgit 1.4.1 From be1a7a3f5c7c0777ba86d40c49425e97fbae62a1 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 23 May 2013 16:52:39 +0000 Subject: alter conf_grab(_kbd) to first ungrab AnyKey/AnyModifier, then proceed to grab keys in keybindingq. we don't need to ungrab/grab on every addition to the queue, just once with a complete keybindingq; simplify grabbing keys per screen (during init) and during a MappingNotify. while here, change conf_grab_{kbd,mouse} to require only a Window. --- calmwm.h | 6 ++---- client.c | 2 +- conf.c | 54 +++++++++++++++--------------------------------------- xevents.c | 12 +++++------- xutil.c | 15 --------------- 5 files changed, 23 insertions(+), 66 deletions(-) (limited to 'xevents.c') diff --git a/calmwm.h b/calmwm.h index 16901b3..25eae87 100644 --- a/calmwm.h +++ b/calmwm.h @@ -435,13 +435,12 @@ void conf_bindname(struct conf *, char *, char *); void conf_clear(struct conf *); void conf_client(struct client_ctx *); void conf_cmd_add(struct conf *, char *, char *); -void conf_grab(struct conf *, struct keybinding *); -void conf_grab_mouse(struct client_ctx *); +void conf_grab_kbd(Window); +void conf_grab_mouse(Window); void conf_init(struct conf *); void conf_ignore(struct conf *, char *); int conf_mousebind(struct conf *, char *, char *); void conf_screen(struct screen_ctx *); -void conf_ungrab(struct conf *, struct keybinding *); void xev_loop(void); @@ -453,7 +452,6 @@ int xu_getprop(Window, Atom, Atom, long, u_char **); int xu_get_wm_state(Window, int *); int xu_getstrprop(Window, Atom, char **); void xu_key_grab(Window, u_int, KeySym); -void xu_key_ungrab(Window, u_int, KeySym); void xu_ptr_getpos(Window, int *, int *); int xu_ptr_grab(Window, u_int, Cursor); int xu_ptr_regrab(u_int, Cursor); diff --git a/client.c b/client.c index 605c2a4..650dbaa 100644 --- a/client.c +++ b/client.c @@ -213,7 +213,7 @@ client_setactive(struct client_ctx *cc, int fg) XInstallColormap(X_Dpy, cc->colormap); XSetInputFocus(X_Dpy, cc->win, RevertToPointerRoot, CurrentTime); - conf_grab_mouse(cc); + conf_grab_mouse(cc->win); /* * If we're in the middle of alt-tabbing, don't change * the order please. diff --git a/conf.c b/conf.c index 5d005c1..763e364 100644 --- a/conf.c +++ b/conf.c @@ -98,7 +98,6 @@ static char *color_binds[CWM_COLOR_MAX] = { void conf_screen(struct screen_ctx *sc) { - struct keybinding *kb; int i; XftColor xc; @@ -141,8 +140,7 @@ conf_screen(struct screen_ctx *sc) if (sc->xftdraw == NULL) errx(1, "XftDrawCreate"); - TAILQ_FOREACH(kb, &Conf.keybindingq, entry) - xu_key_grab(sc->rootwin, kb->modmask, kb->keysym); + conf_grab_kbd(sc->rootwin); } static struct { @@ -436,37 +434,6 @@ static struct { {.i = CWM_TILE_VERT } }, }; -/* - * The following two functions are used when grabbing and ungrabbing keys for - * bindings - */ - -/* - * Grab key combination on all screens and add to the global queue - */ -void -conf_grab(struct conf *c, struct keybinding *kb) -{ - extern struct screen_ctx_q Screenq; - struct screen_ctx *sc; - - TAILQ_FOREACH(sc, &Screenq, entry) - xu_key_grab(sc->rootwin, kb->modmask, kb->keysym); -} - -/* - * Ungrab key combination from all screens and remove from global queue - */ -void -conf_ungrab(struct conf *c, struct keybinding *kb) -{ - extern struct screen_ctx_q Screenq; - struct screen_ctx *sc; - - TAILQ_FOREACH(sc, &Screenq, entry) - xu_key_ungrab(sc->rootwin, kb->modmask, kb->keysym); -} - static struct { char chr; int mask; @@ -656,17 +623,26 @@ conf_mouseunbind(struct conf *c, struct mousebinding *unbind) } } -/* - * Grab the mouse buttons that we need for bindings for this client - */ void -conf_grab_mouse(struct client_ctx *cc) +conf_grab_mouse(Window win) { struct mousebinding *mb; TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) { if (mb->context != MOUSEBIND_CTX_WIN) continue; - xu_btn_grab(cc->win, mb->modmask, mb->button); + xu_btn_grab(win, mb->modmask, mb->button); } } + +void +conf_grab_kbd(Window win) +{ + struct keybinding *kb; + + XUngrabKey(X_Dpy, AnyKey, AnyModifier, win); + + TAILQ_FOREACH(kb, &Conf.keybindingq, entry) + xu_key_grab(win, kb->modmask, kb->keysym); +} + diff --git a/xevents.c b/xevents.c index 1c6ffaf..0a8dc9a 100644 --- a/xevents.c +++ b/xevents.c @@ -389,15 +389,13 @@ static void xev_handle_mappingnotify(XEvent *ee) { XMappingEvent *e = &ee->xmapping; - struct keybinding *kb; - - TAILQ_FOREACH(kb, &Conf.keybindingq, entry) - conf_ungrab(&Conf, kb); + struct screen_ctx *sc; XRefreshKeyboardMapping(e); - - TAILQ_FOREACH(kb, &Conf.keybindingq, entry) - conf_grab(&Conf, kb); + if (e->request == MappingKeyboard) { + TAILQ_FOREACH(sc, &Screenq, entry) + conf_grab_kbd(sc->rootwin); + } } static void diff --git a/xutil.c b/xutil.c index 2c678dd..37d7e24 100644 --- a/xutil.c +++ b/xutil.c @@ -105,21 +105,6 @@ xu_key_grab(Window win, u_int mask, KeySym keysym) True, GrabModeAsync, GrabModeAsync); } -void -xu_key_ungrab(Window win, u_int mask, KeySym keysym) -{ - KeyCode code; - u_int i; - - code = XKeysymToKeycode(X_Dpy, keysym); - if ((XkbKeycodeToKeysym(X_Dpy, code, 0, 0) != keysym) && - (XkbKeycodeToKeysym(X_Dpy, code, 0, 1) == keysym)) - mask |= ShiftMask; - - for (i = 0; i < nitems(ign_mods); i++) - XUngrabKey(X_Dpy, code, (mask | ign_mods[i]), win); -} - void xu_configure(struct client_ctx *cc) { -- cgit 1.4.1