diff options
author | Michael Cardell Widerkrantz <mc@hack.org> | 2010-07-17 23:27:48 +0200 |
---|---|---|
committer | Michael Cardell Widerkrantz <mc@hack.org> | 2010-07-17 23:27:48 +0200 |
commit | 6c7b8997d94e948b91c874a4352a031ba3eaf408 (patch) | |
tree | 756fcb2193a4cc87a6beb6883d6a74c61915ce60 | |
parent | 381e642a39187f615ba54955ef02d1e2fcf1f95d (diff) | |
download | mcwm-6c7b8997d94e948b91c874a4352a031ba3eaf408.zip |
Save cursor position inside of window when moving or resizing. Go back
to that cursor position when done if it's still inside the window. If
not, warp pointer to the middle of window.
-rw-r--r-- | mcwm.c | 66 |
1 files changed, 56 insertions, 10 deletions
@@ -1900,6 +1900,8 @@ void events(void) xcb_generic_event_t *ev; xcb_drawable_t win; int mode = 0; /* Internal mode. */ + int16_t mode_x; + int16_t mode_y; for (exitcode = 0; 0 == exitcode;) { @@ -1988,11 +1990,34 @@ void events(void) } else { + xcb_query_pointer_reply_t *pointer; + /* We're moving or resizing. */ - /* First raise window. */ + /* + * Get and save pointer position inside the window + * so we can go back to it when we're done moving + * or resizing. + */ + pointer = xcb_query_pointer_reply( + conn, xcb_query_pointer(conn, win), 0); + + if (NULL == pointer) + { + mode_x = -1; + mode_y = -1; + } + else + { + mode_x = pointer->win_x; + mode_y = pointer->win_y; + + free(pointer); + } + + /* Raise window. */ raisewindow(win); - + /* Get window geometry. */ geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), @@ -2002,6 +2027,7 @@ void events(void) break; } + /* Mouse button 1 was pressed. */ if (1 == e->detail) { mode = MCWM_MOVE; @@ -2015,6 +2041,8 @@ void events(void) } else { + /* Mouse button 3 was pressed. */ + mode = MCWM_RESIZE; /* Warp pointer to lower right. */ @@ -2071,14 +2099,12 @@ void events(void) */ if (mode == MCWM_MOVE) { - // mousemove(win, pointer->root_x, pointer->root_y); mousemove(win, e->root_x, e->root_y); } else if (mode == MCWM_RESIZE) { /* Resize. */ - //mouseresize(win, pointer->root_x, pointer->root_y); mouseresize(win, e->root_x, e->root_y); } else @@ -2094,8 +2120,8 @@ void events(void) if (0 != mode) { xcb_get_geometry_reply_t *geom; - int x = 0; - int y = 0; + int x; + int y; /* We're finished moving or resizing. * @@ -2108,10 +2134,30 @@ void events(void) NULL); if (NULL != geom) { - /* Move to middle of window. */ - x = geom->width / 2; - y = geom->height / 2; - free(geom); + /* + * Move to saved position or if that is outside + * current window, middle of window. + */ + + if (-1 == mode_x || mode_x > geom->width) + { + x = geom->width / 2; + } + else + { + x = mode_x; + } + + if (-1 == mode_y || mode_y > geom->height) + { + y = geom->height / 2; + } + else + { + y = mode_y; + } + + free(geom); } xcb_warp_pointer(conn, XCB_NONE, focuswin->id, 0, 0, 0, 0, |