wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit e02f058c6db2d3139553a560b35187a95bce5598
parent 9b6d0e3011ca48cf0ae92c8d6036ae2ff9588ab7
Author: garbeam <garbeam@mmv.wmii.de>
Date:   Tue, 13 Dec 2005 22:03:37 +0200

fixed several resize bugs


Diffstat:
cmd/wm/frame.c | 7+++----
cmd/wm/mouse.c | 23++++++++++-------------
cmd/wm/wm.c | 31++++++++++++++++++-------------
cmd/wm/wm.h | 2+-
4 files changed, 32 insertions(+), 31 deletions(-)

diff --git a/cmd/wm/frame.c b/cmd/wm/frame.c @@ -80,9 +80,7 @@ Frame *alloc_frame(XRectangle * r) wa.override_redirect = 1; wa.background_pixmap = ParentRelative; - wa.event_mask = ExposureMask | ButtonPressMask | ButtonReleaseMask - | PointerMotionMask | SubstructureRedirectMask - | SubstructureNotifyMask; + wa.event_mask = ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; bw = border_width(f); th = tab_height(f); @@ -283,15 +281,16 @@ void handle_frame_buttonpress(XButtonEvent *e, Frame *f) /*fprintf(stderr, "%d (x) / %d (w) / %d (size) = %d (#c)\n", e->x, f->rect.width, size, cindex);*/ /*sel_client(cext_list_get_item(&f->clients, cindex));*/ cext_stack_top_item(&f->clients, cext_list_get_item(&f->clients, cindex)); - f->area->layout->select(f, True); if (e->button == Button1) { align = cursor_to_align(f->cursor); if (align == CENTER) mouse_move(f); else mouse_resize(f, align); + f->area->layout->select(f, False); return; } + f->area->layout->select(f, False); bindex = F_EVENT_B2PRESS - 2 + e->button; /* frame mouse handling */ if (f->file[bindex]->content) diff --git a/cmd/wm/mouse.c b/cmd/wm/mouse.c @@ -309,13 +309,12 @@ void mouse_move(Frame * f) pt.y = ey; XSync(dpy, False); XGrabServer(dpy); - XGrabPointer(dpy, root, False, ButtonMotionMask | ButtonReleaseMask, - GrabModeAsync, GrabModeAsync, None, move_cursor, - CurrentTime); + while (XGrabPointer(dpy, f->win, False, ButtonMotionMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, None, move_cursor, CurrentTime) != GrabSuccess) + usleep(20000); + for (;;) { - while (!XCheckMaskEvent(dpy, - ButtonReleaseMask | ButtonMotionMask, - &ev)) { + while (!XCheckMaskEvent(dpy, ButtonReleaseMask | ButtonMotionMask, &ev)) { usleep(20000); continue; } @@ -549,13 +548,12 @@ void mouse_resize(Frame * f, Align align) XQueryPointer(dpy, f->win, &dummy, &dummy, &i, &i, &ox, &oy, &dmask); XSync(dpy, False); XGrabServer(dpy); - XGrabPointer(dpy, f->win, False, ButtonMotionMask | ButtonReleaseMask, - GrabModeAsync, GrabModeAsync, None, resize_cursor, - CurrentTime); + while (XGrabPointer(dpy, f->win, False, ButtonMotionMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, None, resize_cursor, CurrentTime) != GrabSuccess) + usleep(20000); + for (;;) { - while (!XCheckMaskEvent(dpy, - ButtonReleaseMask | ButtonMotionMask, - &ev)) { + while (!XCheckMaskEvent(dpy, ButtonReleaseMask | ButtonMotionMask, &ev)) { usleep(20000); continue; } @@ -593,7 +591,6 @@ void mouse_resize(Frame * f, Align align) void center_pointer(Frame * f) { - Window dummy; int wex, wey, ex, ey, i; unsigned int dmask; diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -247,8 +247,13 @@ static void pager(void *obj, char *arg) XClearWindow(dpy, transient); XMapRaised(dpy, transient); draw_pager(); + while (XGrabKeyboard(dpy, transient, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) - usleep(1000); + usleep(20000); + + while (XGrabPointer(dpy, transient, False, ButtonPressMask, GrabModeAsync, + GrabModeAsync, None, normal_cursor, CurrentTime) != GrabSuccess) + usleep(20000); for (;;) { while (!XCheckWindowEvent(dpy, transient, ButtonPressMask | KeyPressMask, &ev)) { @@ -263,6 +268,7 @@ static void pager(void *obj, char *arg) if (i < cext_sizeof_container(&pages)) sel_page(cext_list_get_item(&pages, i)); XUngrabKeyboard(dpy, CurrentTime); + XUngrabPointer(dpy, CurrentTime /* ev.xbutton.time */ ); return; break; case ButtonPress: @@ -272,6 +278,8 @@ static void pager(void *obj, char *arg) if (p) sel_page(p); } + XUngrabKeyboard(dpy, CurrentTime); + XUngrabPointer(dpy, CurrentTime /* ev.xbutton.time */ ); return; break; } @@ -337,7 +345,7 @@ static void detached_clients(void *obj, char *arg) XMapRaised(dpy, transient); draw_detached_clients(); while (XGrabKeyboard(dpy, transient, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) - usleep(1000); + usleep(20000); for (;;) { while (!XCheckMaskEvent(dpy, ButtonPressMask | KeyPressMask, &ev)) { @@ -371,8 +379,8 @@ static void detached_clients(void *obj, char *arg) cext_detach_item(&detached, c); attach_client(c); } - XUngrabKeyboard(dpy, CurrentTime); } + XUngrabKeyboard(dpy, CurrentTime); return; break; } @@ -457,16 +465,14 @@ void scan_wins() for (i = 0; i < num; i++) { if (!XGetWindowAttributes(dpy, wins[i], &wa)) continue; - if (wa.override_redirect) { - XSelectInput(dpy, wins[i], (StructureNotifyMask | PropertyChangeMask)); - continue; - } - if (XGetTransientForHint(dpy, wins[i], &d1)) + if (wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) continue; if (wa.map_state == IsViewable) { c = alloc_client(wins[i]); init_client(c, &wa); attach_client(c); + if (c->ignore_unmap) + c->ignore_unmap--; } } } @@ -614,7 +620,7 @@ static void init_default() def[WM_AREA_GEOMETRY]->before_read = handle_before_read; def[WM_SEL_BG_COLOR] = wmii_create_ixpfile(ixps, "/default/sstyle/bgcolor", BLITZ_SEL_BG_COLOR); def[WM_SEL_FG_COLOR] = wmii_create_ixpfile(ixps, "/default/sstyle/fgcolor", BLITZ_SEL_FG_COLOR); - def[WM_SEL_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/default/sstyle/fgcolor", BLITZ_SEL_BORDER_COLOR); + def[WM_SEL_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/default/sstyle/bordercolor", BLITZ_SEL_BORDER_COLOR); def[WM_NORM_BG_COLOR] = wmii_create_ixpfile(ixps, "/default/nstyle/bgcolor", BLITZ_NORM_BG_COLOR); def[WM_NORM_FG_COLOR] = wmii_create_ixpfile(ixps, "/default/nstyle/fgcolor", BLITZ_NORM_FG_COLOR); def[WM_NORM_BORDER_COLOR] = wmii_create_ixpfile(ixps, "/default/nstyle/bordercolor", BLITZ_NORM_BORDER_COLOR); @@ -660,17 +666,15 @@ static void init_screen() wa.override_redirect = 1; wa.background_pixmap = ParentRelative; - wa.event_mask = ExposureMask | ButtonPressMask | PointerMotionMask - | SubstructureRedirectMask | SubstructureNotifyMask; + wa.event_mask = ExposureMask | ButtonPressMask; transient = XCreateWindow(dpy, root, 0, 0, rect.width, rect.height, 0, DefaultDepth(dpy, screen_num), CopyFromParent, DefaultVisual(dpy, screen_num), - CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); + CWOverrideRedirect | CWBackPixmap | CWEventMask , &wa); XSync(dpy, False); transient_gc = XCreateGC(dpy, transient, 0, 0); XDefineCursor(dpy, transient, normal_cursor); XDefineCursor(dpy, root, normal_cursor); - XSelectInput(dpy, root, ROOT_MASK); } /* @@ -764,6 +768,7 @@ int main(int argc, char *argv[]) /* this causes an error if some other WM is running */ XSelectInput(dpy, root, ROOT_MASK); XSync(dpy, False); + if (other_wm_running) { fprintf(stderr, "wmiiwm: another window manager is already running\n"); diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -95,7 +95,7 @@ enum { #define LAYOUT "column" #define GAP 5 -#define ROOT_MASK (SubstructureRedirectMask | ButtonPressMask | ButtonReleaseMask) +#define ROOT_MASK (SubstructureRedirectMask | SubstructureNotifyMask | ButtonPressMask | ButtonReleaseMask) #define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask | EnterWindowMask) typedef struct Page Page;