floating_enable: change reassign logic

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
This commit is contained in:
Orestis Floros 2018-03-17 17:47:16 +02:00
parent 8a3ef3a81b
commit 128122e766
1 changed files with 7 additions and 23 deletions

View File

@ -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, &current_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);
}