X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-x11.c;h=e417e83d3a612522484bd1251b83bd2b3027331c;hb=e574e807d54f20379e955a01c0e1a05a0f002b2b;hp=3ea7ded09edfad989c40657e102b51d84499ae5b;hpb=e666d231a1035c96788fc148bcc7eda4b8c1b6ec;p=wmpus diff --git a/sys-x11.c b/sys-x11.c index 3ea7ded..e417e83 100644 --- a/sys-x11.c +++ b/sys-x11.c @@ -63,6 +63,7 @@ static Atom atoms[NATOMS]; static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned long colors[NCOLORS]; static list_t *screens; +static list_t *struts; /* Conversion functions */ static event_map_t ev2sym[] = { @@ -186,6 +187,7 @@ static int strut_add(win_t *root, win_t *win) win->sys->strut.right = ((int*)xdata)[1]; win->sys->strut.top = ((int*)xdata)[2]; win->sys->strut.bottom = ((int*)xdata)[3]; + struts = list_insert(struts, win); for (list_t *cur = screens; cur; cur = cur->next) strut_copy(cur->data, win, 1); return strut_copy(root, win, 1); @@ -193,6 +195,9 @@ static int strut_add(win_t *root, win_t *win) static int strut_del(win_t *root, win_t *win) { + list_t *lwin = list_find(struts, win); + if (lwin) + struts = list_remove(struts, lwin, 0); for (list_t *cur = screens; cur; cur = cur->next) strut_copy(cur->data, win, -1); return strut_copy(root, win, -1); @@ -308,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); @@ -327,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()); @@ -430,6 +428,9 @@ void sys_raise(win_t *win) { //printf("sys_raise: %p\n", win); XRaiseWindow(win->sys->dpy, win->sys->xid); + for (list_t *cur = struts; cur; cur = cur->next) + XRaiseWindow(((win_t*)cur->data)->sys->dpy, + ((win_t*)cur->data)->sys->xid); } void sys_focus(win_t *win) @@ -468,9 +469,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"); @@ -495,7 +498,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)