Pyr r86: when a monitor reservation changes (a drawer opens or closes), grid also re-fits a floating window that exactly fills that monitor's area (placed or sized to fill it rather than maximized), keeping it floating; smaller floating windows stay where they are. Grid only; WAYFIRE_ABI unchanged. diff --git a/plugins/grid/grid.cpp b/plugins/grid/grid.cpp index 4653bc0..7f6fef2 100644 --- a/plugins/grid/grid.cpp +++ b/plugins/grid/grid.cpp @@ -645,6 +645,8 @@ class wayfire_grid : public wf::plugin_interface_t, public wf::per_output_tracke } int slot = data ? data->slot : 0; + wf::pointf_t delta{std::floor(1.0 * wm.x / screen.width) * screen.width, + std::floor(1.0 * wm.y / screen.height) * screen.height}; /* Maximized outside the grid plugin (for example when it opened maximized). */ if (!slot && (view->pending_tiled_edges() == wf::TILED_EDGES_ALL) && (wm.width == ev->old_workarea.width) && (wm.height == ev->old_workarea.height)) @@ -652,9 +654,20 @@ class wayfire_grid : public wf::plugin_interface_t, public wf::per_output_tracke slot = wf::grid::SLOT_CENTER; } + /* A floating window that exactly fills the monitor's area (placed or sized to fill it, not + * maximized) keeps filling it, and stays floating. */ + if (!slot && !view->pending_tiled_edges() && (wm - delta == ev->old_workarea)) + { + auto target = wf::monitor_workarea(output, ev->monitor) + delta; + if (target != wm) + { + ensure_grid_view(view)->adjust_target_geometry(target, -1); + } + + continue; + } + if (!slot) continue; - wf::pointf_t delta{std::floor(1.0 * wm.x / screen.width) * screen.width, - std::floor(1.0 * wm.y / screen.height) * screen.height}; if (slot_dimensions(view, slot) + delta != wm) { handle_slot(view, slot, delta);