mirror of
https://github.com/swaywm/sway.git
synced 2024-12-29 16:36:26 +01:00
Merge pull request #2728 from RedSoxFan/move-sticky-on-evac
Move sticky containers in output_evacuate
This commit is contained in:
commit
e518c5dbaf
2 changed files with 30 additions and 5 deletions
|
@ -823,9 +823,16 @@ void container_floating_move_to_center(struct sway_container *con) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
struct sway_workspace *ws = con->workspace;
|
struct sway_workspace *ws = con->workspace;
|
||||||
|
bool full = con->is_fullscreen;
|
||||||
|
if (full) {
|
||||||
|
container_set_fullscreen(con, false);
|
||||||
|
}
|
||||||
double new_lx = ws->x + (ws->width - con->width) / 2;
|
double new_lx = ws->x + (ws->width - con->width) / 2;
|
||||||
double new_ly = ws->y + (ws->height - con->height) / 2;
|
double new_ly = ws->y + (ws->height - con->height) / 2;
|
||||||
container_floating_translate(con, new_lx - con->x, new_ly - con->y);
|
container_floating_translate(con, new_lx - con->x, new_ly - con->y);
|
||||||
|
if (full) {
|
||||||
|
container_set_fullscreen(con, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool find_urgent_iterator(struct sway_container *con, void *data) {
|
static bool find_urgent_iterator(struct sway_container *con, void *data) {
|
||||||
|
|
|
@ -113,6 +113,20 @@ void output_enable(struct sway_output *output, struct output_config *oc) {
|
||||||
arrange_root();
|
arrange_root();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void evacuate_sticky(struct sway_workspace *old_ws,
|
||||||
|
struct sway_output *new_output) {
|
||||||
|
struct sway_workspace *new_ws = output_get_active_workspace(new_output);
|
||||||
|
while (old_ws->floating->length) {
|
||||||
|
struct sway_container *sticky = old_ws->floating->items[0];
|
||||||
|
container_detach(sticky);
|
||||||
|
workspace_add_floating(new_ws, sticky);
|
||||||
|
container_handle_fullscreen_reparent(sticky);
|
||||||
|
container_floating_move_to_center(sticky);
|
||||||
|
ipc_event_window(sticky, "move");
|
||||||
|
}
|
||||||
|
workspace_detect_urgent(new_ws);
|
||||||
|
}
|
||||||
|
|
||||||
static void output_evacuate(struct sway_output *output) {
|
static void output_evacuate(struct sway_output *output) {
|
||||||
if (!output->workspaces->length) {
|
if (!output->workspaces->length) {
|
||||||
return;
|
return;
|
||||||
|
@ -130,17 +144,21 @@ static void output_evacuate(struct sway_output *output) {
|
||||||
|
|
||||||
workspace_detach(workspace);
|
workspace_detach(workspace);
|
||||||
|
|
||||||
if (workspace_is_empty(workspace)) {
|
|
||||||
workspace_begin_destroy(workspace);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sway_output *new_output =
|
struct sway_output *new_output =
|
||||||
workspace_output_get_highest_available(workspace, output);
|
workspace_output_get_highest_available(workspace, output);
|
||||||
if (!new_output) {
|
if (!new_output) {
|
||||||
new_output = fallback_output;
|
new_output = fallback_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (workspace_is_empty(workspace)) {
|
||||||
|
// If floating is not empty, there are sticky containers to move
|
||||||
|
if (workspace->floating->length) {
|
||||||
|
evacuate_sticky(workspace, new_output);
|
||||||
|
}
|
||||||
|
workspace_begin_destroy(workspace);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (new_output) {
|
if (new_output) {
|
||||||
workspace_output_add_priority(workspace, new_output);
|
workspace_output_add_priority(workspace, new_output);
|
||||||
output_add_workspace(new_output, workspace);
|
output_add_workspace(new_output, workspace);
|
||||||
|
|
Loading…
Reference in a new issue