diff --git a/client.c b/client.c index 6d4e264b..29bd9ce7 100644 --- a/client.c +++ b/client.c @@ -47,97 +47,6 @@ get_client_bywin(Client *list, Window w) return c; } -/** Grab or ungrab buttons when a client is focused - * \param c client - * \param focused True if client is focused - * \param raised True if the client is above other clients - * \param modkey Mod key mask - * \param numlockmask Numlock mask - */ -void -grabbuttons(Client *c, Bool focused, Bool raised, KeySym modkey, unsigned int numlockmask) -{ - XUngrabButton(c->display, AnyButton, AnyModifier, c->win); - - if(focused) - { - if(!raised) - XGrabButton(c->display, Button1, NoSymbol, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeAsync, None, None); - - XGrabButton(c->display, Button1, modkey, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button1, modkey | LockMask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button1, modkey | numlockmask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button1, modkey | numlockmask | LockMask, - c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(c->display, Button2, modkey, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button2, modkey | LockMask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button2, modkey | numlockmask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button2, modkey | numlockmask | LockMask, - c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(c->display, Button3, modkey, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button3, modkey | LockMask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button3, modkey | numlockmask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button3, modkey | numlockmask | LockMask, - c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(c->display, Button4, modkey, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button4, modkey | LockMask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button4, modkey | numlockmask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button4, modkey | numlockmask | LockMask, - c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(c->display, Button5, modkey, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button5, modkey | LockMask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button5, modkey | numlockmask, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button5, modkey | numlockmask | LockMask, - c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - - XUngrabButton(c->display, AnyButton, AnyModifier, RootWindow(c->display, c->phys_screen)); - } - else - { - XGrabButton(c->display, AnyButton, AnyModifier, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(c->display, Button4, NoSymbol, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button4, LockMask, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button4, numlockmask, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button4, numlockmask | LockMask, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(c->display, Button5, NoSymbol, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button5, LockMask, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button5, numlockmask, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(c->display, Button5, numlockmask | LockMask, RootWindow(c->display, c->phys_screen), False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - } -} - /** Check if client supports protocol WM_DELETE_WINDOW * \param c the client * \return True if client has WM_DELETE_WINDOW @@ -275,7 +184,10 @@ focus(Client *c, Bool selscreen, awesome_config *awesomeconf) /* if a client was selected but it's not the current client, unfocus it */ if(*awesomeconf->client_sel && *awesomeconf->client_sel != c) { - grabbuttons(*awesomeconf->client_sel, False, True, awesomeconf->modkey, awesomeconf->numlockmask); + window_grabbuttons((*awesomeconf->client_sel)->display, + (*awesomeconf->client_sel)->phys_screen, + (*awesomeconf->client_sel)->win, + False, True, awesomeconf->modkey, awesomeconf->numlockmask); XSetWindowBorder(awesomeconf->display, (*awesomeconf->client_sel)->win, awesomeconf->colors_normal[ColBorder].pixel); window_settrans(awesomeconf->display, (*awesomeconf->client_sel)->win, awesomeconf->opacity_unfocused); } @@ -289,7 +201,8 @@ focus(Client *c, Bool selscreen, awesome_config *awesomeconf) if(*awesomeconf->client_sel == c) return; if(c) - grabbuttons(c, True, True, awesomeconf->modkey, awesomeconf->numlockmask); + window_grabbuttons(c->display, c->phys_screen, c->win, + True, True, awesomeconf->modkey, awesomeconf->numlockmask); if(!selscreen) return; *awesomeconf->client_sel = c; @@ -415,8 +328,8 @@ manage(Window w, XWindowAttributes *wa, awesome_config *awesomeconf) } /* grab buttons */ - - grabbuttons(c, False, True, awesomeconf->modkey, awesomeconf->numlockmask); + window_grabbuttons(c->display, c->phys_screen, c->win, + False, True, awesomeconf->modkey, awesomeconf->numlockmask); /* update window title */ updatetitle(c); diff --git a/client.h b/client.h index 54a204c8..21b2f288 100644 --- a/client.h +++ b/client.h @@ -24,11 +24,7 @@ #include "common.h" -/** Mask shorthands, used in event.c and client.c */ -#define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) - Client * get_client_bywin(Client *, Window); -void grabbuttons(Client *, Bool, Bool, KeySym, unsigned int); inline void client_attach(Client **, Client *); inline void client_detach(Client **, Client *); void client_reattach_after(Client *, Client *); diff --git a/event.c b/event.c index 34b50aa5..609aec94 100644 --- a/event.c +++ b/event.c @@ -196,7 +196,8 @@ handle_event_buttonpress(XEvent * e, awesome_config *awesomeconf) if (ev->button == Button1) { restack(&awesomeconf[c->screen]); - grabbuttons(c, True, True, awesomeconf->modkey, awesomeconf->numlockmask); + window_grabbuttons(c->display, c->phys_screen, c->win, + True, True, awesomeconf->modkey, awesomeconf->numlockmask); } } else if(ev->button == Button1) @@ -361,7 +362,10 @@ handle_event_enternotify(XEvent * e, awesome_config *awesomeconf) && ((*awesomeconf->client_sel)->isfloating || get_current_layout(awesomeconf[(*awesomeconf->client_sel)->screen].tags, awesomeconf[(*awesomeconf->client_sel)->screen].ntags)->arrange == layout_floating)) - grabbuttons(*awesomeconf->client_sel, True, False, awesomeconf->modkey, awesomeconf->numlockmask); + window_grabbuttons((*awesomeconf->client_sel)->display, + (*awesomeconf->client_sel)->phys_screen, + (*awesomeconf->client_sel)->win, + True, False, awesomeconf->modkey, awesomeconf->numlockmask); } } else diff --git a/window.c b/window.c index 10a787af..6ecd5bec 100644 --- a/window.c +++ b/window.c @@ -82,6 +82,99 @@ window_configure(Display *disp, Window win, int x, int y, int w, int h, int bord return XSendEvent(disp, win, False, StructureNotifyMask, (XEvent *) & ce); } + + +/** Grab or ungrab buttons on a window + * \param disp Display ref + * \param focused True if client is focused + * \param raised True if the client is above other clients + * \param modkey Mod key mask + * \param numlockmask Numlock mask + */ +void +window_grabbuttons(Display *disp, int screen, Window win, Bool focused, Bool raised, KeySym modkey, unsigned int numlockmask) +{ + XUngrabButton(disp, AnyButton, AnyModifier, win); + + if(focused) + { + if(!raised) + XGrabButton(disp, Button1, NoSymbol, win, False, + BUTTONMASK, GrabModeSync, GrabModeAsync, None, None); + + XGrabButton(disp, Button1, modkey, win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button1, modkey | LockMask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button1, modkey | numlockmask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button1, modkey | numlockmask | LockMask, + win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(disp, Button2, modkey, win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button2, modkey | LockMask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button2, modkey | numlockmask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button2, modkey | numlockmask | LockMask, + win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(disp, Button3, modkey, win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button3, modkey | LockMask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button3, modkey | numlockmask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button3, modkey | numlockmask | LockMask, + win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(disp, Button4, modkey, win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button4, modkey | LockMask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button4, modkey | numlockmask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button4, modkey | numlockmask | LockMask, + win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(disp, Button5, modkey, win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button5, modkey | LockMask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button5, modkey | numlockmask, win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button5, modkey | numlockmask | LockMask, + win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + + XUngrabButton(disp, AnyButton, AnyModifier, RootWindow(disp, screen)); + } + else + { + XGrabButton(disp, AnyButton, AnyModifier, win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(disp, Button4, NoSymbol, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button4, LockMask, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button4, numlockmask, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button4, numlockmask | LockMask, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(disp, Button5, NoSymbol, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button5, LockMask, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button5, numlockmask, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(disp, Button5, numlockmask | LockMask, RootWindow(disp, screen), False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + + } +} + void window_setshape(Display *disp, int screen, Window win) { diff --git a/window.h b/window.h index 896dbb08..006375ba 100644 --- a/window.h +++ b/window.h @@ -24,9 +24,13 @@ #include +/** Mask shorthands, used in event.c and window.c */ +#define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) + int window_setstate(Display *, Window, long); long window_getstate(Display *, Window); Status window_configure(Display *, Window, int, int, int, int, int); +void window_grabbuttons(Display *, int, Window, Bool, Bool, KeySym, unsigned int); void window_setshape(Display *, int, Window); void window_settrans(Display *, Window, double);