Fix unfullscreening a floating view
This commit is contained in:
parent
754cb7944c
commit
13a4b0512e
|
@ -84,6 +84,7 @@ struct sway_container {
|
||||||
// Includes borders
|
// Includes borders
|
||||||
double x, y;
|
double x, y;
|
||||||
double width, height;
|
double width, height;
|
||||||
|
double saved_x, saved_y;
|
||||||
double saved_width, saved_height;
|
double saved_width, saved_height;
|
||||||
|
|
||||||
list_t *children;
|
list_t *children;
|
||||||
|
|
|
@ -906,23 +906,6 @@ size_t container_titlebar_height() {
|
||||||
return config->font_height + TITLEBAR_V_PADDING * 2;
|
return config->font_height + TITLEBAR_V_PADDING * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void configure_floating_view(struct sway_view *view) {
|
|
||||||
struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
|
|
||||||
int max_width = ws->width * 0.6666;
|
|
||||||
int max_height = ws->height * 0.6666;
|
|
||||||
int width =
|
|
||||||
view->natural_width > max_width ? max_width : view->natural_width;
|
|
||||||
int height =
|
|
||||||
view->natural_height > max_height ? max_height : view->natural_height;
|
|
||||||
struct sway_container *output = ws->parent;
|
|
||||||
int lx = output->x + (ws->width - width) / 2;
|
|
||||||
int ly = output->y + (ws->height - height) / 2;
|
|
||||||
|
|
||||||
view->border_left = view->border_right = view->border_bottom = true;
|
|
||||||
view_set_maximized(view, false);
|
|
||||||
view_configure(view, lx, ly, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void container_set_floating(struct sway_container *container, bool enable) {
|
void container_set_floating(struct sway_container *container, bool enable) {
|
||||||
if (container_is_floating(container) == enable) {
|
if (container_is_floating(container) == enable) {
|
||||||
return;
|
return;
|
||||||
|
@ -936,7 +919,7 @@ void container_set_floating(struct sway_container *container, bool enable) {
|
||||||
container_remove_child(container);
|
container_remove_child(container);
|
||||||
container_add_child(workspace->sway_workspace->floating, container);
|
container_add_child(workspace->sway_workspace->floating, container);
|
||||||
if (container->type == C_VIEW) {
|
if (container->type == C_VIEW) {
|
||||||
configure_floating_view(container->sway_view);
|
view_autoconfigure(container->sway_view);
|
||||||
}
|
}
|
||||||
seat_set_focus(seat, seat_get_focus_inactive(seat, container));
|
seat_set_focus(seat, seat_get_focus_inactive(seat, container));
|
||||||
container_reap_empty_recursive(workspace);
|
container_reap_empty_recursive(workspace);
|
||||||
|
|
|
@ -126,6 +126,23 @@ void view_configure(struct sway_view *view, double ox, double oy, int width,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void view_autoconfigure_floating(struct sway_view *view) {
|
||||||
|
struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
|
||||||
|
int max_width = ws->width * 0.6666;
|
||||||
|
int max_height = ws->height * 0.6666;
|
||||||
|
int width =
|
||||||
|
view->natural_width > max_width ? max_width : view->natural_width;
|
||||||
|
int height =
|
||||||
|
view->natural_height > max_height ? max_height : view->natural_height;
|
||||||
|
struct sway_container *output = ws->parent;
|
||||||
|
int lx = output->x + (ws->width - width) / 2;
|
||||||
|
int ly = output->y + (ws->height - height) / 2;
|
||||||
|
|
||||||
|
view->border_left = view->border_right = view->border_bottom = true;
|
||||||
|
view_set_maximized(view, false);
|
||||||
|
view_configure(view, lx, ly, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
void view_autoconfigure(struct sway_view *view) {
|
void view_autoconfigure(struct sway_view *view) {
|
||||||
if (!sway_assert(view->swayc,
|
if (!sway_assert(view->swayc,
|
||||||
"Called view_autoconfigure() on a view without a swayc")) {
|
"Called view_autoconfigure() on a view without a swayc")) {
|
||||||
|
@ -140,6 +157,11 @@ void view_autoconfigure(struct sway_view *view) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (container_is_floating(view->swayc)) {
|
||||||
|
view_autoconfigure_floating(view);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
|
struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE);
|
||||||
|
|
||||||
int other_views = 0;
|
int other_views = 0;
|
||||||
|
@ -261,6 +283,8 @@ void view_set_fullscreen_raw(struct sway_view *view, bool fullscreen) {
|
||||||
view_set_fullscreen(workspace->sway_workspace->fullscreen, false);
|
view_set_fullscreen(workspace->sway_workspace->fullscreen, false);
|
||||||
}
|
}
|
||||||
workspace->sway_workspace->fullscreen = view;
|
workspace->sway_workspace->fullscreen = view;
|
||||||
|
view->swayc->saved_x = view->swayc->x;
|
||||||
|
view->swayc->saved_y = view->swayc->y;
|
||||||
view->swayc->saved_width = view->swayc->width;
|
view->swayc->saved_width = view->swayc->width;
|
||||||
view->swayc->saved_height = view->swayc->height;
|
view->swayc->saved_height = view->swayc->height;
|
||||||
|
|
||||||
|
@ -283,6 +307,11 @@ void view_set_fullscreen_raw(struct sway_view *view, bool fullscreen) {
|
||||||
workspace->sway_workspace->fullscreen = NULL;
|
workspace->sway_workspace->fullscreen = NULL;
|
||||||
view->swayc->width = view->swayc->saved_width;
|
view->swayc->width = view->swayc->saved_width;
|
||||||
view->swayc->height = view->swayc->saved_height;
|
view->swayc->height = view->swayc->saved_height;
|
||||||
|
if (container_is_floating(view->swayc)) {
|
||||||
|
view->swayc->x = view->swayc->saved_x;
|
||||||
|
view->swayc->y = view->swayc->saved_y;
|
||||||
|
view_autoconfigure(view);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue