Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.