Browse Source

changed how manage client works

master
Anselm R. Garbe 19 years ago
parent
commit
005362043d
4 changed files with 44 additions and 29 deletions
  1. +33
    -12
      client.c
  2. +4
    -10
      event.c
  3. +4
    -5
      wm.c
  4. +3
    -2
      wm.h

+ 33
- 12
client.c View File

@ -3,6 +3,7 @@
* See LICENSE file for license details. * See LICENSE file for license details.
*/ */
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <X11/Xatom.h> #include <X11/Xatom.h>
@ -36,10 +37,10 @@ update_client_name(Client *c)
XFree(name.value); XFree(name.value);
} }
Client *
create_client(Window w, XWindowAttributes *wa)
void
manage(Window w, XWindowAttributes *wa)
{ {
Client *c;
Client *c, **l;
XSetWindowAttributes twa; XSetWindowAttributes twa;
long msize; long msize;
@ -68,24 +69,44 @@ create_client(Window w, XWindowAttributes *wa)
DefaultDepth(dpy, screen), CopyFromParent, DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen), DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); 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); 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 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); XFlush(dpy);
XSetErrorHandler(error_handler);
XUngrabServer(dpy);
/*flush_masked_events(EnterWindowMask); ? */
} }
Client * Client *
getclient(Window w) getclient(Window w)
{ {


+ 4
- 10
event.c View File

@ -159,12 +159,8 @@ maprequest(XEvent *e)
return; 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.height - barrect.height);
XSetInputFocus(dpy, ev->window, RevertToPointerRoot, CurrentTime);
XFlush(dpy);
if(!getclient(ev->window))
manage(ev->window, &wa);
} }
static void static void
@ -185,11 +181,9 @@ propertynotify(XEvent *e)
static void static void
unmapnotify(XEvent *e) unmapnotify(XEvent *e)
{ {
#if 0
Client *c; Client *c;
XUnmapEvent *ev = &e->xunmap; XUnmapEvent *ev = &e->xunmap;
if((c = client_of_win(ev->window)))
destroy_client(c);
#endif
if((c = getclient(ev->window)))
unmanage(c);
} }

+ 4
- 5
wm.c View File

@ -20,19 +20,18 @@ Atom net_atom[NetLast];
Cursor cursor[CurLast]; Cursor cursor[CurLast];
XRectangle rect, barrect; XRectangle rect, barrect;
Bool running = True; Bool running = True;
Client *clients = NULL;
char *bartext, tag[256]; char *bartext, tag[256];
int screen, sel_screen; int screen, sel_screen;
/* draw structs */
Brush brush = {0}; Brush brush = {0};
Client *clients = NULL;
enum { WM_PROTOCOL_DELWIN = 1 }; enum { WM_PROTOCOL_DELWIN = 1 };
static Bool other_wm_running; static Bool other_wm_running;
static int (*x_error_handler) (Display *, XErrorEvent *);
static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
static int (*x_error_handler) (Display *, XErrorEvent *);
static void static void
usage() usage()
@ -56,7 +55,7 @@ scan_wins()
if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
continue; continue;
if(wa.map_state == IsViewable) if(wa.map_state == IsViewable)
manage(create_client(wins[i], &wa));
manage(wins[i], &wa);
} }
} }
if(wins) if(wins)
@ -69,7 +68,7 @@ scan_wins()
* Other types of errors call Xlib's default error handler, which * Other types of errors call Xlib's default error handler, which
* calls exit(). * calls exit().
*/ */
static int
int
error_handler(Display *dpy, XErrorEvent *error) error_handler(Display *dpy, XErrorEvent *error)
{ {
if(error->error_code == BadWindow if(error->error_code == BadWindow


+ 3
- 2
wm.h View File

@ -65,8 +65,8 @@ extern void run(char *arg);
extern void quit(char *arg); extern void quit(char *arg);
/* client.c */ /* 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); extern Client * getclient(Window w);
/* key.c */ /* key.c */
@ -74,3 +74,4 @@ extern void update_keys();
extern void keypress(XEvent *e); extern void keypress(XEvent *e);
/* wm.c */ /* wm.c */
extern int error_handler(Display *dpy, XErrorEvent *error);

Loading…
Cancel
Save