Add sensible discretion to UnmapNotify drag abort
Patch status: merged
Patch by Tony Crisci
Long description:
Only abort a drag action on UnmapNotify when the unmapping window is managed on the current workspace. fixes #1108
To apply this patch, use:
curl http://cr.i3wm.org/patch/301/raw.patch | git am
b/src/floating.c
| 17 |
@@ -629,6 +629,8 @@ drag_result_t drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_ |
| 18 |
xcb_flush(conn); |
| 19 |
|
| 20 |
xcb_generic_event_t *inside_event, *last_motion_notify = NULL; |
| 21 |
+ Con *inside_con = NULL; |
| 22 |
+ |
| 23 |
drag_result_t drag_result = DRAGGING; |
| 24 |
/* I’ve always wanted to have my own eventhandler… */ |
| 25 |
while (drag_result == DRAGGING && (inside_event = xcb_wait_for_event(conn))) {
|
| 26 |
@@ -654,8 +656,16 @@ drag_result_t drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_ |
| 27 |
break; |
| 28 |
|
| 29 |
case XCB_UNMAP_NOTIFY: |
| 30 |
- DLOG("Unmap-notify, aborting\n");
|
| 31 |
- drag_result = DRAG_ABORT; |
| 32 |
+ inside_con = con_by_window_id(((xcb_unmap_notify_event_t*)inside_event)->window); |
| 33 |
+ |
| 34 |
+ if (inside_con != NULL) {
|
| 35 |
+ DLOG("UnmapNotify for window 0x%08x (container %p)\n", ((xcb_unmap_notify_event_t*)inside_event)->window, inside_con);
|
| 36 |
+ |
| 37 |
+ if (con_get_workspace(inside_con) == con_get_workspace(focused)) {
|
| 38 |
+ DLOG("UnmapNotify for a managed window on the current workspace, aborting\n");
|
| 39 |
+ drag_result = DRAG_ABORT; |
| 40 |
+ } |
| 41 |
+ } |
| 42 |
|
| 43 |
handle_event(type, inside_event); |
| 44 |
break; |