diff --git a/include/config.h b/include/config.h index 3c1957b6c..1a6ba19da 100644 --- a/include/config.h +++ b/include/config.h @@ -226,6 +226,12 @@ struct sway_config { struct border_colors placeholder; uint32_t background; } border_colors; + + // floating view minimum + int32_t floating_maximum_width; + int32_t floating_maximum_height; + int32_t floating_minimum_width; + int32_t floating_minimum_height; }; /** diff --git a/include/container.h b/include/container.h index d1905720f..50ca2bf5c 100644 --- a/include/container.h +++ b/include/container.h @@ -168,6 +168,8 @@ swayc_t *new_view(swayc_t *sibling, wlc_handle handle); */ swayc_t *new_floating_view(wlc_handle handle); +void floating_view_sane_size(swayc_t *view); + /** * Frees an output's container. */ diff --git a/sway/config.c b/sway/config.c index 14b657ef2..95285eba6 100644 --- a/sway/config.c +++ b/sway/config.c @@ -172,6 +172,12 @@ static void config_defaults(struct sway_config *config) { config->font = strdup("monospace 10"); config->font_height = get_font_text_height(config->font); + // floating view + config->floating_maximum_width = -1; + config->floating_maximum_height = -1; + config->floating_minimum_width = 75; + config->floating_minimum_height = 50; + // Flags config->focus_follows_mouse = true; config->mouse_warping = true; diff --git a/sway/container.c b/sway/container.c index 4883a6488..e00d2d7e2 100644 --- a/sway/container.c +++ b/sway/container.c @@ -328,6 +328,31 @@ swayc_t *new_floating_view(wlc_handle handle) { return view; } +void floating_view_sane_size(swayc_t *view) { + if (config->floating_minimum_height != -1 && + view->desired_height < config->floating_minimum_height) { + view->desired_height = config->floating_minimum_height; + } + if (config->floating_minimum_width != -1 && + view->desired_width < config->floating_minimum_width) { + view->desired_width = config->floating_minimum_width; + } + + if (config->floating_maximum_height != -1 && + view->desired_height > config->floating_maximum_height) { + view->desired_height = config->floating_maximum_height; + } + if (config->floating_maximum_width != -1 && + view->desired_width > config->floating_maximum_width) { + view->desired_width = config->floating_maximum_width; + } + sway_log(L_DEBUG, "Sane values for view to %d x %d @ %.f, %.f", + view->desired_width, view->desired_height, view->x, view->y); + + return; +} + + // Destroy container swayc_t *destroy_output(swayc_t *output) { diff --git a/sway/handlers.c b/sway/handlers.c index 931e1340e..f8dd9f4d2 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -350,6 +350,7 @@ static void handle_view_geometry_request(wlc_handle handle, const struct wlc_geo view->desired_height = geometry->size.h; if (view->is_floating) { + floating_view_sane_size(view); view->width = view->desired_width; view->height = view->desired_height; view->x = geometry->origin.x;