X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-x11.c;h=5b043ed572665be4aaca995b01edafa56086f8d5;hb=b012ee7a79c6ebc0f6818a108629571a61e2e5a7;hp=d50595115eb403da7352d2a0c3391ce0069693b2;hpb=2fc8a765e86a31b321ec6ae0aa7f43bfdda322e3;p=wmpus diff --git a/sys-x11.c b/sys-x11.c index d505951..5b043ed 100644 --- 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) {