Bugfix: Check if a floating window’s coordinates are within a different workspace when managing (Thanks Merovius)
Fixes: #297
This commit is contained in:
parent
60532a90e7
commit
f613df48d2
|
@ -59,6 +59,13 @@ void toggle_floating_mode(Con *con, bool automatic);
|
||||||
*/
|
*/
|
||||||
void floating_raise_con(Con *con);
|
void floating_raise_con(Con *con);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if con’s coordinates are within its workspace and re-assigns it to
|
||||||
|
* the actual workspace if not.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool floating_maybe_reassign_ws(Con *con);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/**
|
/**
|
||||||
* Removes the floating client from its workspace and attaches it to the new
|
* Removes the floating client from its workspace and attaches it to the new
|
||||||
|
|
|
@ -156,6 +156,8 @@ void floating_enable(Con *con, bool automatic) {
|
||||||
// TODO: don’t influence focus handling when Con was not focused before.
|
// TODO: don’t influence focus handling when Con was not focused before.
|
||||||
if (set_focus)
|
if (set_focus)
|
||||||
con_focus(con);
|
con_focus(con);
|
||||||
|
|
||||||
|
floating_maybe_reassign_ws(nc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void floating_disable(Con *con, bool automatic) {
|
void floating_disable(Con *con, bool automatic) {
|
||||||
|
@ -225,6 +227,36 @@ void floating_raise_con(Con *con) {
|
||||||
TAILQ_INSERT_TAIL(&(con->parent->floating_head), con, floating_windows);
|
TAILQ_INSERT_TAIL(&(con->parent->floating_head), con, floating_windows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Checks if con’s coordinates are within its workspace and re-assigns it to
|
||||||
|
* the actual workspace if not.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool floating_maybe_reassign_ws(Con *con) {
|
||||||
|
Output *output = get_output_containing(
|
||||||
|
con->rect.x + (con->rect.width / 2),
|
||||||
|
con->rect.y + (con->rect.height / 2));
|
||||||
|
|
||||||
|
if (!output) {
|
||||||
|
ELOG("No output found at destination coordinates?\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (con_get_output(con) == output->con) {
|
||||||
|
DLOG("still the same ws\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLOG("Need to re-assign!\n");
|
||||||
|
|
||||||
|
Con *content = output_get_content(output->con);
|
||||||
|
Con *ws = TAILQ_FIRST(&(content->nodes_head));
|
||||||
|
DLOG("Moving con %p / %s to workspace %p / %s\n", con, con->name, ws, ws->name);
|
||||||
|
con_move_to_workspace(con, ws);
|
||||||
|
con_focus(con_descend_focused(con));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
DRAGGING_CB(drag_window_callback) {
|
DRAGGING_CB(drag_window_callback) {
|
||||||
struct xcb_button_press_event_t *event = extra;
|
struct xcb_button_press_event_t *event = extra;
|
||||||
|
|
||||||
|
@ -237,27 +269,8 @@ DRAGGING_CB(drag_window_callback) {
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
|
|
||||||
/* Check if we cross workspace boundaries while moving */
|
/* Check if we cross workspace boundaries while moving */
|
||||||
Output *output = get_output_containing(
|
if (!floating_maybe_reassign_ws(con))
|
||||||
con->rect.x + (con->rect.width / 2),
|
|
||||||
con->rect.y + (con->rect.height / 2));
|
|
||||||
|
|
||||||
if (!output) {
|
|
||||||
ELOG("No output found at destination coordinates?\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (con_get_output(con) == output->con) {
|
|
||||||
DLOG("still the same ws\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DLOG("Need to re-assign!\n");
|
|
||||||
|
|
||||||
Con *content = output_get_content(output->con);
|
|
||||||
Con *ws = TAILQ_FIRST(&(content->nodes_head));
|
|
||||||
DLOG("Moving con %p / %s to workspace %p / %s\n", con, con->name, ws, ws->name);
|
|
||||||
con_move_to_workspace(con, ws);
|
|
||||||
con_focus(con_descend_focused(con));
|
|
||||||
tree_render();
|
tree_render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue