ssd: make sizes of invisible SSD extents configurable

This commit is contained in:
Andrew J. Hesford 2025-01-17 11:07:07 -05:00
parent fa6e524412
commit 6b9cc5dd64
6 changed files with 20 additions and 8 deletions

View file

@ -583,6 +583,13 @@ extending outward from the snapped edge.
horizontally and vertically rather than one or the other. Default is horizontally and vertically rather than one or the other. Default is
half the titlebar height. half the titlebar height.
*<resize><minimumArea>*
Treat borders of server-side decorations as if they were at least the
indicated thickness, regardless of their visual size. Borders visually
narrower than the minimum effective thickness will be augmented with
invisible zones just beyond the window that serve as click targets for
mouse actions. Default is 8.
## KEYBOARD ## KEYBOARD
*<keyboard><numlock>* [on|off] *<keyboard><numlock>* [on|off]

View file

@ -132,6 +132,8 @@
<!-- Let client redraw its contents while resizing --> <!-- Let client redraw its contents while resizing -->
<drawContents>yes</drawContents> <drawContents>yes</drawContents>
<cornerRange>8</cornerRange> <cornerRange>8</cornerRange>
<!-- Borders are effectively 8 pixels wide regardless of visual appearance -->
<minimumArea>8</minimumArea>
</resize> </resize>
<focus> <focus>

View file

@ -152,6 +152,7 @@ struct rcxml {
enum resize_indicator_mode resize_indicator; enum resize_indicator_mode resize_indicator;
bool resize_draw_contents; bool resize_draw_contents;
int resize_corner_range; int resize_corner_range;
int resize_minimum_area;
struct { struct {
int popuptime; int popuptime;

View file

@ -7,8 +7,6 @@
struct wlr_cursor; struct wlr_cursor;
#define SSD_EXTENDED_AREA 8
/* /*
* Shadows should start at a point inset from the actual window border, see * Shadows should start at a point inset from the actual window border, see
* discussion on https://github.com/labwc/labwc/pull/1648. This constant * discussion on https://github.com/labwc/labwc/pull/1648. This constant

View file

@ -1225,6 +1225,8 @@ entry(xmlNode *node, char *nodename, char *content, struct parser_state *state)
set_bool(content, &rc.resize_draw_contents); set_bool(content, &rc.resize_draw_contents);
} else if (!strcasecmp(nodename, "cornerRange.resize")) { } else if (!strcasecmp(nodename, "cornerRange.resize")) {
rc.resize_corner_range = atoi(content); rc.resize_corner_range = atoi(content);
} else if (!strcasecmp(nodename, "minimumArea.resize")) {
rc.resize_minimum_area = MAX(0, atoi(content));
} else if (!strcasecmp(nodename, "mouseEmulation.tablet")) { } else if (!strcasecmp(nodename, "mouseEmulation.tablet")) {
set_bool(content, &rc.tablet.force_mouse_emulation); set_bool(content, &rc.tablet.force_mouse_emulation);
} else if (!strcasecmp(nodename, "mapToOutput.tablet")) { } else if (!strcasecmp(nodename, "mapToOutput.tablet")) {
@ -1501,6 +1503,7 @@ rcxml_init(void)
rc.resize_indicator = LAB_RESIZE_INDICATOR_NEVER; rc.resize_indicator = LAB_RESIZE_INDICATOR_NEVER;
rc.resize_draw_contents = true; rc.resize_draw_contents = true;
rc.resize_corner_range = -1; rc.resize_corner_range = -1;
rc.resize_minimum_area = 8;
rc.workspace_config.popuptime = INT_MIN; rc.workspace_config.popuptime = INT_MIN;
rc.workspace_config.min_nr_workspaces = 1; rc.workspace_config.min_nr_workspaces = 1;

View file

@ -4,6 +4,7 @@
#include <pixman.h> #include <pixman.h>
#include "common/mem.h" #include "common/mem.h"
#include "common/scene-helpers.h" #include "common/scene-helpers.h"
#include "config/rcxml.h"
#include "labwc.h" #include "labwc.h"
#include "ssd-internal.h" #include "ssd-internal.h"
#include "theme.h" #include "theme.h"
@ -25,7 +26,8 @@ ssd_extents_create(struct ssd *ssd)
struct view *view = ssd->view; struct view *view = ssd->view;
struct theme *theme = view->server->theme; struct theme *theme = view->server->theme;
struct wl_list *part_list = &ssd->extents.parts; struct wl_list *part_list = &ssd->extents.parts;
int extended_area = SSD_EXTENDED_AREA;
int border_width = MAX(0, MAX(rc.resize_minimum_area, theme->border_width));
ssd->extents.tree = wlr_scene_tree_create(ssd->tree); ssd->extents.tree = wlr_scene_tree_create(ssd->tree);
struct wlr_scene_tree *parent = ssd->extents.tree; struct wlr_scene_tree *parent = ssd->extents.tree;
@ -34,8 +36,7 @@ ssd_extents_create(struct ssd *ssd)
} }
wl_list_init(&ssd->extents.parts); wl_list_init(&ssd->extents.parts);
wlr_scene_node_set_position(&parent->node, wlr_scene_node_set_position(&parent->node,
-(theme->border_width + extended_area), -border_width, -(ssd->titlebar.height + border_width));
-(ssd->titlebar.height + theme->border_width + extended_area));
add_extent(part_list, LAB_SSD_PART_TOP, parent); add_extent(part_list, LAB_SSD_PART_TOP, parent);
add_extent(part_list, LAB_SSD_PART_LEFT, parent); add_extent(part_list, LAB_SSD_PART_LEFT, parent);
@ -68,7 +69,8 @@ ssd_extents_update(struct ssd *ssd)
int height = view_effective_height(view, /* use_pending */ false); int height = view_effective_height(view, /* use_pending */ false);
int full_height = height + theme->border_width * 2 + ssd->titlebar.height; int full_height = height + theme->border_width * 2 + ssd->titlebar.height;
int full_width = width + 2 * theme->border_width; int full_width = width + 2 * theme->border_width;
int extended_area = SSD_EXTENDED_AREA; int border_width = MAX(rc.resize_minimum_area, theme->border_width);
int extended_area = MAX(0, rc.resize_minimum_area - theme->border_width);
struct wlr_box part_box; struct wlr_box part_box;
struct wlr_box result_box; struct wlr_box result_box;
@ -78,8 +80,7 @@ ssd_extents_update(struct ssd *ssd)
/* Make sure we update the y offset based on titlebar shown / hidden */ /* Make sure we update the y offset based on titlebar shown / hidden */
wlr_scene_node_set_position(&ssd->extents.tree->node, wlr_scene_node_set_position(&ssd->extents.tree->node,
-(theme->border_width + extended_area), -border_width, -(ssd->titlebar.height + border_width));
-(ssd->titlebar.height + theme->border_width + extended_area));
/* /*
* Convert all output usable areas that the * Convert all output usable areas that the