Merge pull request #2977 from orestisf1993/issue-1627
Check container existance during drag events
This commit is contained in:
commit
9fe508b791
|
@ -165,6 +165,13 @@ Con *con_by_window_id(xcb_window_t window);
|
||||||
*/
|
*/
|
||||||
Con *con_by_con_id(long target);
|
Con *con_by_con_id(long target);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the given container (still) exists.
|
||||||
|
* This can be used, e.g., to make sure a container hasn't been closed in the meantime.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool con_exists(Con *con);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the container with the given frame ID or NULL if no such container
|
* Returns the container with the given frame ID or NULL if no such container
|
||||||
* exists.
|
* exists.
|
||||||
|
|
|
@ -604,6 +604,15 @@ Con *con_by_con_id(long target) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns true if the given container (still) exists.
|
||||||
|
* This can be used, e.g., to make sure a container hasn't been closed in the meantime.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool con_exists(Con *con) {
|
||||||
|
return con_by_con_id((long)con) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the container with the given frame ID or NULL if no such container
|
* Returns the container with the given frame ID or NULL if no such container
|
||||||
* exists.
|
* exists.
|
||||||
|
|
|
@ -535,6 +535,11 @@ void floating_drag_window(Con *con, const xcb_button_press_event_t *event) {
|
||||||
/* Drag the window */
|
/* Drag the window */
|
||||||
drag_result_t drag_result = drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, XCURSOR_CURSOR_MOVE, drag_window_callback, event);
|
drag_result_t drag_result = drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, XCURSOR_CURSOR_MOVE, drag_window_callback, event);
|
||||||
|
|
||||||
|
if (!con_exists(con)) {
|
||||||
|
DLOG("The container has been closed in the meantime.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* If the user cancelled, undo the changes. */
|
/* If the user cancelled, undo the changes. */
|
||||||
if (drag_result == DRAG_REVERT)
|
if (drag_result == DRAG_REVERT)
|
||||||
floating_reposition(con, initial_rect);
|
floating_reposition(con, initial_rect);
|
||||||
|
@ -646,6 +651,11 @@ void floating_resize_window(Con *con, const bool proportional,
|
||||||
|
|
||||||
drag_result_t drag_result = drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, cursor, resize_window_callback, ¶ms);
|
drag_result_t drag_result = drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, cursor, resize_window_callback, ¶ms);
|
||||||
|
|
||||||
|
if (!con_exists(con)) {
|
||||||
|
DLOG("The container has been closed in the meantime.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* If the user cancels, undo the resize */
|
/* If the user cancels, undo the resize */
|
||||||
if (drag_result == DRAG_REVERT)
|
if (drag_result == DRAG_REVERT)
|
||||||
floating_reposition(con, initial_rect);
|
floating_reposition(con, initial_rect);
|
||||||
|
@ -743,12 +753,17 @@ static void xcb_drag_check_cb(EV_P_ ev_check *w, int revents) {
|
||||||
if (last_motion_notify == NULL)
|
if (last_motion_notify == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dragloop->callback(
|
/* Ensure that we are either dragging the resize handle (con is NULL) or that the
|
||||||
dragloop->con,
|
* container still exists. The latter might not be true, e.g., if the window closed
|
||||||
&(dragloop->old_rect),
|
* for any reason while the user was dragging it. */
|
||||||
last_motion_notify->root_x,
|
if (!dragloop->con || con_exists(dragloop->con)) {
|
||||||
last_motion_notify->root_y,
|
dragloop->callback(
|
||||||
dragloop->extra);
|
dragloop->con,
|
||||||
|
&(dragloop->old_rect),
|
||||||
|
last_motion_notify->root_x,
|
||||||
|
last_motion_notify->root_y,
|
||||||
|
dragloop->extra);
|
||||||
|
}
|
||||||
free(last_motion_notify);
|
free(last_motion_notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue