tchanged how manage client works - dwm - [fork] customized build of dwm, the dy… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 005362043d8b0bbf856f301c231d4f10c519b8c4 | |
parent 16c67f32d62849792c8e6d4fdec22a1896f9c279 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Tue, 11 Jul 2006 13:02:22 +0200 | |
changed how manage client works | |
Diffstat: | |
M client.c | 45 +++++++++++++++++++++++------… | |
M event.c | 14 ++++---------- | |
M wm.c | 9 ++++----- | |
M wm.h | 5 +++-- | |
4 files changed, 44 insertions(+), 29 deletions(-) | |
--- | |
diff --git a/client.c b/client.c | |
t@@ -3,6 +3,7 @@ | |
* See LICENSE file for license details. | |
*/ | |
+#include <stdlib.h> | |
#include <string.h> | |
#include <X11/Xatom.h> | |
t@@ -36,10 +37,10 @@ update_client_name(Client *c) | |
XFree(name.value); | |
} | |
-Client * | |
-create_client(Window w, XWindowAttributes *wa) | |
+void | |
+manage(Window w, XWindowAttributes *wa) | |
{ | |
- Client *c; | |
+ Client *c, **l; | |
XSetWindowAttributes twa; | |
long msize; | |
t@@ -68,24 +69,44 @@ create_client(Window w, XWindowAttributes *wa) | |
DefaultDepth(dpy, screen), CopyFromParent, | |
DefaultVisual(dpy, screen), | |
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); | |
+ | |
+ for(l=&clients; *l; l=&(*l)->next); | |
+ c->next = *l; /* *l == nil */ | |
+ *l = c; | |
+ XMapRaised(dpy, c->win); | |
+ XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |
XFlush(dpy); | |
+} | |
-#if 0 | |
- for(t=&client, i=0; *t; t=&(*t)->next, i++); | |
- c->next = *t; /* *t == nil */ | |
- *t = c; | |
-#endif | |
- return c; | |
+static int | |
+dummy_error_handler(Display *dpy, XErrorEvent *error) | |
+{ | |
+ return 0; | |
} | |
void | |
-manage(Client *c) | |
+unmanage(Client *c) | |
{ | |
- XMapRaised(dpy, c->win); | |
- XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |
+ Client **l; | |
+ | |
+ XGrabServer(dpy); | |
+ XSetErrorHandler(dummy_error_handler); | |
+ | |
+ XUnmapWindow(dpy, c->win); | |
+ XDestroyWindow(dpy, c->title); | |
+ | |
+ for(l=&clients; *l && *l != c; l=&(*l)->next); | |
+ eassert(*l == c); | |
+ *l = c->next; | |
+ free(c); | |
+ | |
XFlush(dpy); | |
+ XSetErrorHandler(error_handler); | |
+ XUngrabServer(dpy); | |
+ /*flush_masked_events(EnterWindowMask); ? */ | |
} | |
+ | |
Client * | |
getclient(Window w) | |
{ | |
diff --git a/event.c b/event.c | |
t@@ -159,12 +159,8 @@ maprequest(XEvent *e) | |
return; | |
} | |
- /*if(!client_of_win(ev->window))*/ | |
- /*manage(create_client(ev->window, &wa));*/ | |
- XMapRaised(dpy, ev->window); | |
- XMoveResizeWindow(dpy, ev->window, rect.x, rect.y, rect.width, rect.he… | |
- XSetInputFocus(dpy, ev->window, RevertToPointerRoot, CurrentTime); | |
- XFlush(dpy); | |
+ if(!getclient(ev->window)) | |
+ manage(ev->window, &wa); | |
} | |
static void | |
t@@ -185,11 +181,9 @@ propertynotify(XEvent *e) | |
static void | |
unmapnotify(XEvent *e) | |
{ | |
-#if 0 | |
Client *c; | |
XUnmapEvent *ev = &e->xunmap; | |
- if((c = client_of_win(ev->window))) | |
- destroy_client(c); | |
-#endif | |
+ if((c = getclient(ev->window))) | |
+ unmanage(c); | |
} | |
diff --git a/wm.c b/wm.c | |
t@@ -20,19 +20,18 @@ Atom net_atom[NetLast]; | |
Cursor cursor[CurLast]; | |
XRectangle rect, barrect; | |
Bool running = True; | |
-Client *clients = NULL; | |
char *bartext, tag[256]; | |
int screen, sel_screen; | |
-/* draw structs */ | |
Brush brush = {0}; | |
+Client *clients = NULL; | |
enum { WM_PROTOCOL_DELWIN = 1 }; | |
static Bool other_wm_running; | |
-static int (*x_error_handler) (Display *, XErrorEvent *); | |
static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garb… | |
+static int (*x_error_handler) (Display *, XErrorEvent *); | |
static void | |
usage() | |
t@@ -56,7 +55,7 @@ scan_wins() | |
if(wa.override_redirect || XGetTransientForHint(dpy, w… | |
continue; | |
if(wa.map_state == IsViewable) | |
- manage(create_client(wins[i], &wa)); | |
+ manage(wins[i], &wa); | |
} | |
} | |
if(wins) | |
t@@ -69,7 +68,7 @@ scan_wins() | |
* Other types of errors call Xlib's default error handler, which | |
* calls exit(). | |
*/ | |
-static int | |
+int | |
error_handler(Display *dpy, XErrorEvent *error) | |
{ | |
if(error->error_code == BadWindow | |
diff --git a/wm.h b/wm.h | |
t@@ -65,8 +65,8 @@ extern void run(char *arg); | |
extern void quit(char *arg); | |
/* client.c */ | |
-extern Client *create_client(Window w, XWindowAttributes *wa); | |
-extern void manage(Client *c); | |
+extern void manage(Window w, XWindowAttributes *wa); | |
+void unmanage(Client *c); | |
extern Client * getclient(Window w); | |
/* key.c */ | |
t@@ -74,3 +74,4 @@ extern void update_keys(); | |
extern void keypress(XEvent *e); | |
/* wm.c */ | |
+extern int error_handler(Display *dpy, XErrorEvent *error); |