]> Pileus Git - wmpus/blobdiff - sys-x11.c
Remove root window tracking
[wmpus] / sys-x11.c
index d50595115eb403da7352d2a0c3391ce0069693b2..5b043ed572665be4aaca995b01edafa56086f8d5 100644 (file)
--- a/sys-x11.c
+++ b/sys-x11.c
@@ -26,6 +26,7 @@
 
 #include "util.h"
 #include "conf.h"
+#include "types.h"
 #include "sys.h"
 #include "wm.h"
 
@@ -61,6 +62,7 @@ typedef enum {
 
 /* Global data */
 static win_t *root;
+static win_t *last;
 static int   running;
 static void *cache;
 static Atom atoms[NATOMS];
@@ -299,6 +301,8 @@ static win_t *win_find(Display *dpy, Window xid, int create)
 
 static void win_free(win_t *win)
 {
+       if (win == last)
+               last = NULL;
        free(win->sys);
        free(win);
 }
@@ -455,17 +459,18 @@ static void process_event(int type, XEvent *xe, win_t *root)
                printf("configure_req: %lx - (0x%lx) %dx%d @ %d,%d\n",
                                cre->window, cre->value_mask,
                                cre->height, cre->width, cre->x, cre->y);
-               if ((win = win_find(dpy,xe->xconfigurerequest.window,1))) {
+               if ((win = win_find(dpy,cre->window,1))) {
+                       int border_width = (win->type == TYPE_TOOLBAR ? 0 : border);
                        XSendEvent(dpy, cre->window, False, StructureNotifyMask, &(XEvent){
-                               .xconfigure.type              = ConfigureNotify,
-                               .xconfigure.display           = win->sys->dpy,
-                               .xconfigure.event             = win->sys->xid,
-                               .xconfigure.window            = win->sys->xid,
-                               .xconfigure.x                 = win->x,
-                               .xconfigure.y                 = win->y,
-                               .xconfigure.width             = win->w,
-                               .xconfigure.height            = win->h,
-                               .xconfigure.border_width      = border,
+                               .xconfigure.type         = ConfigureNotify,
+                               .xconfigure.display      = win->sys->dpy,
+                               .xconfigure.event        = win->sys->xid,
+                               .xconfigure.window       = win->sys->xid,
+                               .xconfigure.x            = win->x,
+                               .xconfigure.y            = win->y,
+                               .xconfigure.width        = win->w,
+                               .xconfigure.height       = win->h,
+                               .xconfigure.border_width = border_width,
                        });
                        XSync(win->sys->dpy, False);
                }
@@ -569,7 +574,6 @@ void sys_focus(win_t *win)
        //win_msg(win, WM_FOCUS);
 
        /* Set border on focused window */
-       static win_t *last = NULL;
        if (last)
                XSetWindowBorder(last->sys->dpy, last->sys->xid, colors[CLR_UNFOCUS]);
        XSync(win->sys->dpy, False);
@@ -606,10 +610,10 @@ void sys_show(win_t *win, state_t state)
                                PropModeReplace, (unsigned char*)0, 0);
 
        /* Update border */
-       if (state == ST_SHOW || state == ST_MAX || state == ST_SHADE)
-               XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, border);
-       else if (state == ST_FULL)
+       if (win->type == TYPE_TOOLBAR || state == ST_FULL)
                XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, 0);
+       else if (state == ST_SHOW || state == ST_MAX || state == ST_SHADE)
+               XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, border);
 
        /* Map/Unmap window */
        if (state == ST_SHOW || state == ST_FULL || state == ST_MAX || state == ST_SHADE)
@@ -629,6 +633,8 @@ void sys_show(win_t *win, state_t state)
                        .width  = screen->w + screen->sys->strut.left + screen->sys->strut.right,
                        .height = screen->h + screen->sys->strut.top  + screen->sys->strut.bottom
                };
+               win->x = wc.x;     win->y = wc.y;
+               win->w = wc.width; win->h = wc.height;
                XConfigureWindow(win->sys->dpy, win->sys->xid, CWX|CWY|CWWidth|CWHeight, &wc);
                XMoveResizeWindow(win->sys->dpy, win->sys->xid, wc.x, wc.y, wc.width, wc.height);
        } else if (state == ST_SHADE) {
@@ -660,6 +666,8 @@ void sys_show(win_t *win, state_t state)
 void sys_watch(win_t *win, event_t ev, mod_t mod)
 {
        //printf("sys_watch: %p - %x %hhx\n", win, ev, mod);
+       if (win == NULL)
+               win = root;
        XWindowAttributes attr;
        XGetWindowAttributes(win->sys->dpy, win->sys->xid, &attr);
        long mask = attr.your_event_mask;
@@ -680,19 +688,21 @@ void sys_watch(win_t *win, event_t ev, mod_t mod)
 
 void sys_unwatch(win_t *win, event_t ev, mod_t mod)
 {
+       if (win == NULL)
+               win = root;
        if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7)
                XUngrabButton(win->sys->dpy, ev2xb(ev), mod2x(mod), win->sys->xid);
 }
 
-list_t *sys_info(win_t *win)
+list_t *sys_info(void)
 {
        /* Use global copy of screens so we can add struts */
        if (screens == NULL) {
                /* Add Xinerama screens */
                int n = 0;
                XineramaScreenInfo *info = NULL;
-               if (XineramaIsActive(win->sys->dpy))
-                       info = XineramaQueryScreens(win->sys->dpy, &n);
+               if (XineramaIsActive(root->sys->dpy))
+                       info = XineramaQueryScreens(root->sys->dpy, &n);
                for (int i = 0; i < n; i++) {
                        win_t *screen = new0(win_t);
                        screen->x = info[i].x_org;
@@ -706,13 +716,13 @@ list_t *sys_info(win_t *win)
        if (screens == NULL) {
                /* No xinerama support */
                win_t *screen = new0(win_t);
-               *screen = *win;
+               *screen = *root;
                screens = list_insert(NULL, screen);
        }
        return screens;
 }
 
-win_t *sys_init(void)
+void sys_init(void)
 {
        Display *dpy;
        Window   xid;
@@ -747,10 +757,10 @@ win_t *sys_init(void)
        XSelectInput(dpy, xid, SubstructureRedirectMask|SubstructureNotifyMask);
        xerrorxlib = XSetErrorHandler(xerror);
 
-       return root = win_find(dpy, xid, 1);
+       root = win_find(dpy, xid, 1);
 }
 
-void sys_run(win_t *root)
+void sys_run(void)
 {
        /* Add each initial window */
        if (!no_capture) {
@@ -780,7 +790,7 @@ void sys_exit(void)
        running = 0;
 }
 
-void sys_free(win_t *root)
+void sys_free(void)
 {
        XCloseDisplay(root->sys->dpy);
        while (screens) {