From 128122e7663a5a1f38bd8f921ecaef55ff2a4b13 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Sat, 17 Mar 2018 17:47:16 +0200 Subject: [PATCH] floating_enable: change reassign logic MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This allows the floating container's top left corner to be mapped outside any output as long as they are contained partially by one. This, for example, will allow: mpv --geometry +1+1 video.mp4 For windows mapped to (0, 0) see comment in floating.c:270-273: /* Some clients (like GIMP’s color picker window) get mapped * to (0, 0), so we push them to a reasonable position * (centered over their leader) */ The floating_reassign_ws call is removed since we try to place the new floating container in the current output: /* Sanity check: Are the coordinates on the appropriate output? If not, we * need to change them */ Fixes #1341 --- src/floating.c | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/src/floating.c b/src/floating.c index 29b9cab3..1c310abe 100644 --- a/src/floating.c +++ b/src/floating.c @@ -284,10 +284,7 @@ void floating_enable(Con *con, bool automatic) { /* Sanity check: Are the coordinates on the appropriate output? If not, we * need to change them */ - Output *current_output = get_output_containing(nc->rect.x + - (nc->rect.width / 2), - nc->rect.y + (nc->rect.height / 2)); - + Output *current_output = get_output_from_rect(nc->rect); Con *correct_output = con_get_output(ws); if (!current_output || current_output->con != correct_output) { DLOG("This floating window is on the wrong output, fixing coordinates (currently (%d, %d))\n", @@ -295,11 +292,13 @@ void floating_enable(Con *con, bool automatic) { /* If moving from one output to another, keep the relative position * consistent (e.g. a centered dialog will remain centered). */ - if (current_output) + if (current_output) { floating_fix_coordinates(nc, ¤t_output->con->rect, &correct_output->rect); - else { - nc->rect.x = correct_output->rect.x; - nc->rect.y = correct_output->rect.y; + /* Make sure that the result is in the correct output. */ + current_output = get_output_from_rect(nc->rect); + } + if (!current_output || current_output->con != correct_output) { + floating_center(nc, ws->rect); } } @@ -320,21 +319,6 @@ void floating_enable(Con *con, bool automatic) { if (set_focus) con_activate(con); - /* Check if we need to re-assign it to a different workspace because of its - * coordinates and exit if that was done successfully. */ - if (floating_maybe_reassign_ws(nc)) { - goto done; - } - - /* Sanitize coordinates: Check if they are on any output */ - if (get_output_containing(nc->rect.x, nc->rect.y) != NULL) { - goto done; - } - - ELOG("No output found at destination coordinates, centering floating window on current ws\n"); - floating_center(nc, ws->rect); - -done: floating_set_hint_atom(nc, true); ipc_send_window_event("floating", con); } -- 2.39.5