From 314f086dd9f0722af54fa5d5d6b0f8c0a9ae2f02 Mon Sep 17 00:00:00 2001 From: Ivan Kanakarakis Date: Fri, 9 Dec 2011 16:54:00 +0200 Subject: work on atoms --- dminiwm.c | 99 +++++++++++++++++++++++++++++---------------------------------- 1 file changed, 46 insertions(+), 53 deletions(-) (limited to 'dminiwm.c') diff --git a/dminiwm.c b/dminiwm.c index ad005b0..7a74adb 100644 --- a/dminiwm.c +++ b/dminiwm.c @@ -28,7 +28,27 @@ #include #include -#define TABLENGTH(X) (sizeof(X)/sizeof(*X)) +#define LENGTH(x) (sizeof(x)/sizeof(*x)) + +enum { + WM_PROTOCOLS, + WM_DELETE_WINDOW, + _NET_WM_WINDOW_TYPE, + _NET_WM_WINDOW_TYPE_UTILITY, + _NET_WM_WINDOW_TYPE_DOCK, + _NET_WM_WINDOW_TYPE_SPLASH, + _NET_WM_WINDOW_TYPE_DIALOG, + _NET_WM_WINDOW_TYPE_NOTIFICATION, + ATOM_COUNT +}; + +/* layout modes */ +enum { + TILE, + MONOCYCLE, + BSTACK, + GRID, +}; /* structs */ typedef union { @@ -63,40 +83,6 @@ typedef struct { int followwin; } Convenience; -typedef enum { - ATOM_NET_WM_WINDOW_TYPE, - ATOM_NET_WM_WINDOW_TYPE_UTILITY, - ATOM_NET_WM_WINDOW_TYPE_DOCK, - ATOM_NET_WM_WINDOW_TYPE_SPLASH, - ATOM_NET_WM_WINDOW_TYPE_DIALOG, - ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION, - ATOM_COUNT -} AtomType; - -typedef struct { - Atom *atom; - const char *name; -} AtomNode; - -Atom atoms[ATOM_COUNT]; - -static const AtomNode atomList[] = { - { &atoms[ATOM_NET_WM_WINDOW_TYPE], "_NET_WM_WINDOW_TYPE" }, - { &atoms[ATOM_NET_WM_WINDOW_TYPE_UTILITY], "_NET_WM_WINDOW_TYPE_UTILITY" }, - { &atoms[ATOM_NET_WM_WINDOW_TYPE_DOCK], "_NET_WM_WINDOW_TYPE_DOCK" }, - { &atoms[ATOM_NET_WM_WINDOW_TYPE_SPLASH], "_NET_WM_WINDOW_TYPE_SPLASH" }, - { &atoms[ATOM_NET_WM_WINDOW_TYPE_DIALOG], "_NET_WM_WINDOW_TYPE_DIALOG" }, - { &atoms[ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION], "_NET_WM_WINDOW_TYPE_NOTIFICATION"}, -}; - -/* layout modes */ -enum mode { - TILE, - MONOCYCLE, - BSTACK, - GRID, -}; - /* Functions */ static void add_window(Window w); static void buttonpressed(XEvent *e); @@ -159,6 +145,7 @@ static unsigned int win_unfocus; static unsigned int numlockmask = 0; /* dynamic key lock mask */ static client *head = NULL; static client *current = NULL; +static Atom atoms[ATOM_COUNT]; /* events array */ static void (*events[LASTEvent])(XEvent *e) = { @@ -538,8 +525,8 @@ void grabkeys(void) { XUngrabKey(dis, AnyKey, AnyModifier, root); // For each shortcuts - for(i=0;iwindow, atoms[ATOM_NET_WM_WINDOW_TYPE], 0, 32, False, XA_ATOM, &realType, &realFormat, &count, &extra, &temp) == Success) { + if(XGetWindowProperty(dis, ev->window, atoms[_NET_WM_WINDOW_TYPE], 0, 32, False, + XA_ATOM, &realType, &realFormat, &count, &extra, &temp) == Success) { if(count > 0) { type = (unsigned long*)temp; for(j=0; jwindow); XMapWindow(dis, ev->window); - XSetInputFocus(dis,ev->window,RevertToParent,CurrentTime); - XRaiseWindow(dis,ev->window); + XSetInputFocus(dis, ev->window, RevertToParent, CurrentTime); + XRaiseWindow(dis, ev->window); + if(temp) + XFree(temp); return; } } } - if(temp) - XFree(temp); } XClassHint ch = {0}; @@ -721,9 +709,9 @@ void deletewindow(Window w) { XEvent ev; ev.type = ClientMessage; ev.xclient.window = w; - ev.xclient.message_type = XInternAtom(dis, "WM_PROTOCOLS", False); + ev.xclient.message_type = atoms[WM_PROTOCOLS]; ev.xclient.format = 32; - ev.xclient.data.l[0] = XInternAtom(dis, "WM_DELETE_WINDOW", False); + ev.xclient.data.l[0] = atoms[WM_DELETE_WINDOW]; ev.xclient.data.l[1] = CurrentTime; XSendEvent(dis, w, False, NoEventMask, &ev); } @@ -785,10 +773,15 @@ void setup(void) { } XFreeModifiermap(modmap); - // Set up atoms for dialog/notification windows - for(int x = 0; x < ATOM_COUNT; x++) - *atomList[x].atom = XInternAtom(dis, atomList[x].name, False); - // To catch maprequest and destroynotify (if other wm running) + /* set up atoms for dialog/notification windows */ + atoms[WM_PROTOCOLS] = XInternAtom(dis, "WM_PROTOCOLS", False); + atoms[WM_DELETE_WINDOW] = XInternAtom(dis, "WM_DELETE_WINDOW", False); + atoms[_NET_WM_WINDOW_TYPE] = XInternAtom(dis, "_NET_WM_WINDOW_TYPE", False); + atoms[_NET_WM_WINDOW_TYPE_UTILITY] = XInternAtom(dis, "_NET_WM_WINDOW_TYPE_UTILITY", False); + atoms[_NET_WM_WINDOW_TYPE_DOCK] = XInternAtom(dis, "_NET_WM_WINDOW_TYPE_DOCK", False); + atoms[_NET_WM_WINDOW_TYPE_SPLASH] = XInternAtom(dis, "_NET_WM_WINDOW_TYPE_SPLASH", False); + atoms[_NET_WM_WINDOW_TYPE_DIALOG] = XInternAtom(dis, "_NET_WM_WINDOW_TYPE_DIALOG", False); + atoms[_NET_WM_WINDOW_TYPE_NOTIFICATION] = XInternAtom(dis, "_NET_WM_WINDOW_TYPE_NOTIFICATION", False); XSelectInput(dis, root, SubstructureNotifyMask|SubstructureRedirectMask); grabkeys(); -- cgit v1.3.1