X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-x11.c;h=a0c3e8fe98c85a2b646ff98ad5c3006fac3f081f;hb=958cbdf3fd18f2545dcaaa33384b9ad8c16f87f2;hp=a947e196747bf95ad765954e87126b3e04226611;hpb=7c451aa4d38c4658fa3eb1130b420380d081b40d;p=wmpus diff --git a/sys-x11.c b/sys-x11.c index a947e19..a0c3e8f 100644 --- a/sys-x11.c +++ b/sys-x11.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Andy Spencer + * Copyright (c) 2011-2012, Andy Spencer * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -313,15 +313,8 @@ static void process_event(int type, XEvent *xe, win_t *root) if (wm_handle_event(win, xb2ev(xe->xbutton.button), mod, ptr)) XGrabPointer(dpy, xe->xbutton.root, True, PointerMotionMask|ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); - else { - printf("resending event\n"); - XSendEvent(win->sys->dpy, xe->xbutton.window, True, NoEventMask, xe); - XSendEvent(win->sys->dpy, xe->xbutton.window, False, NoEventMask, xe); - XSendEvent(win->sys->dpy, xe->xbutton.root, True, NoEventMask, xe); - XSendEvent(win->sys->dpy, xe->xbutton.root, False, NoEventMask, xe); - XSendEvent(win->sys->dpy, xe->xbutton.subwindow, True, NoEventMask, xe); - XSendEvent(win->sys->dpy, xe->xbutton.subwindow, False, NoEventMask, xe); - } + else + XAllowEvents(win->sys->dpy, ReplayPointer, CurrentTime); } else if (type == ButtonRelease) { XUngrabPointer(dpy, CurrentTime); @@ -332,7 +325,7 @@ static void process_event(int type, XEvent *xe, win_t *root) wm_handle_ptr(win, ptr); } else if (type == EnterNotify || type == LeaveNotify) { - printf("enter: %d\n", type); + printf("%s: %d\n", type==EnterNotify?"enter":"leave", type); event_t ev = EnterNotify ? EV_ENTER : EV_LEAVE; if ((win = win_find(dpy,xe->xcrossing.window,0))) wm_handle_event(win, ev, MOD(), PTR()); @@ -369,17 +362,19 @@ static void process_event(int type, XEvent *xe, win_t *root) printf("configure_req: %d - %x, (0x%lx) %dx%d @ %d,%d\n", type, (int)cre->window, cre->value_mask, cre->height, cre->width, cre->x, cre->y); - XConfigureWindow(dpy, cre->window, cre->value_mask, &(XWindowChanges){ - .x = cre->x, - .y = cre->y, - .width = cre->width, - .height = cre->height, - }); - - /* This seems necessary for, but causes flicker - * there could be a better way to do this */ - if ((win = win_find(dpy,xe->xmaprequest.window,0))) - sys_move(win, win->x, win->y, win->w, win->h); + if ((win = win_find(dpy,xe->xmaprequest.window,1))) { + 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, + }); + XSync(win->sys->dpy, False); + } } else if (type == MapRequest) { printf("map_req: %d\n", type); @@ -389,7 +384,7 @@ static void process_event(int type, XEvent *xe, win_t *root) else wm_update(); } - XMapWindow(dpy,xe->xmaprequest.window); + XMapWindow(dpy, xe->xmaprequest.window); } else { printf("unknown event: %d\n", type); @@ -476,9 +471,11 @@ void sys_show(win_t *win, state_t state) return; case ST_FULL: printf("sys_show: full\n"); + XMapWindow(win->sys->dpy, win->sys->xid); return; case ST_SHADE: printf("sys_show: shade\n"); + XMapWindow(win->sys->dpy, win->sys->xid); return; case ST_ICON: printf("sys_show: icon\n"); @@ -503,7 +500,7 @@ void sys_watch(win_t *win, event_t ev, mod_t mod) if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7) XGrabButton(win->sys->dpy, ev2xb(ev), mod2x(mod), win->sys->xid, False, mod.up ? ButtonReleaseMask : ButtonPressMask, - GrabModeAsync, GrabModeAsync, None, None); + GrabModeSync, GrabModeAsync, None, None); else if (ev == EV_ENTER) XSelectInput(win->sys->dpy, win->sys->xid, EnterWindowMask|mask); else if (ev == EV_LEAVE)