mirror of
https://github.com/labwc/labwc.git
synced 2025-11-03 09:01:51 -05:00
xwayland: constrain view to top/left edge
This commit is contained in:
parent
35ff6e5bb0
commit
b46fa5e006
4 changed files with 31 additions and 15 deletions
|
|
@ -234,7 +234,8 @@ void keyboard_new(struct server *server, struct wlr_input_device *device);
|
||||||
void output_frame(struct wl_listener *listener, void *data);
|
void output_frame(struct wl_listener *listener, void *data);
|
||||||
void output_new(struct wl_listener *listener, void *data);
|
void output_new(struct wl_listener *listener, void *data);
|
||||||
|
|
||||||
struct border deco_max_extents(struct view *view);
|
struct border deco_thickness(struct view *view);
|
||||||
|
struct wlr_box deco_max_extents(struct view *view);
|
||||||
struct wlr_box deco_box(struct view *view, enum deco_part deco_part);
|
struct wlr_box deco_box(struct view *view, enum deco_part deco_part);
|
||||||
enum deco_part deco_at(struct view *view, double lx, double ly);
|
enum deco_part deco_at(struct view *view, double lx, double ly);
|
||||||
|
|
||||||
|
|
|
||||||
18
src/deco.c
18
src/deco.c
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#define BORDER_WIDTH (2)
|
#define BORDER_WIDTH (2)
|
||||||
|
|
||||||
struct border deco_max_extents(struct view *view)
|
struct border deco_thickness(struct view *view)
|
||||||
{
|
{
|
||||||
struct border border = {
|
struct border border = {
|
||||||
.top = rc.title_height + BORDER_WIDTH,
|
.top = rc.title_height + BORDER_WIDTH,
|
||||||
|
|
@ -23,16 +23,24 @@ struct border deco_max_extents(struct view *view)
|
||||||
return border;
|
return border;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct wlr_box deco_max_extents(struct view *view)
|
||||||
|
{
|
||||||
|
struct border border = deco_thickness(view);
|
||||||
|
struct wlr_box box = {
|
||||||
|
.x = view->x - border.left,
|
||||||
|
.y = view->y - border.top,
|
||||||
|
.width = view->w + border.left + border.right,
|
||||||
|
.height = view->h + border.top + border.bottom,
|
||||||
|
};
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
struct wlr_box deco_box(struct view *view, enum deco_part deco_part)
|
struct wlr_box deco_box(struct view *view, enum deco_part deco_part)
|
||||||
{
|
{
|
||||||
int margin;
|
int margin;
|
||||||
|
|
||||||
struct wlr_box box = { .x = 0, .y = 0, .width = 0, .height = 0 };
|
struct wlr_box box = { .x = 0, .y = 0, .width = 0, .height = 0 };
|
||||||
BUG_ON(!view);
|
BUG_ON(!view);
|
||||||
if ((view->w < 1) || (view->h < 1)) {
|
|
||||||
warn("view (%p) has no width/height", view);
|
|
||||||
return box;
|
|
||||||
}
|
|
||||||
switch (deco_part) {
|
switch (deco_part) {
|
||||||
case LAB_DECO_BUTTON_CLOSE:
|
case LAB_DECO_BUTTON_CLOSE:
|
||||||
wlr_texture_get_size(theme.xbm_close_active_unpressed,
|
wlr_texture_get_size(theme.xbm_close_active_unpressed,
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ static void xdg_toplevel_view_map(struct view *view)
|
||||||
if (!view->been_mapped) {
|
if (!view->been_mapped) {
|
||||||
view->server_side_deco = has_ssd(view);
|
view->server_side_deco = has_ssd(view);
|
||||||
if (view->server_side_deco) {
|
if (view->server_side_deco) {
|
||||||
view->margin = deco_max_extents(view);
|
view->margin = deco_thickness(view);
|
||||||
} else {
|
} else {
|
||||||
view->margin = xdg_shell_border(view);
|
view->margin = xdg_shell_border(view);
|
||||||
view->xdg_grab_offset = -view->margin.left;
|
view->xdg_grab_offset = -view->margin.left;
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,19 @@ static bool want_deco(struct view *view)
|
||||||
WLR_XWAYLAND_SURFACE_DECORATIONS_ALL;
|
WLR_XWAYLAND_SURFACE_DECORATIONS_ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void top_left_edge_boundary_check(struct view *view)
|
||||||
|
{
|
||||||
|
struct wlr_box deco = deco_max_extents(view);
|
||||||
|
if (deco.x < 0)
|
||||||
|
view->x -= deco.x;
|
||||||
|
if (deco.y < 0)
|
||||||
|
view->y -= deco.y;
|
||||||
|
struct wlr_box box = {
|
||||||
|
.x = view->x, .y = view->y, .width = view->w, .height = view->h
|
||||||
|
};
|
||||||
|
view->impl->configure(view, box);
|
||||||
|
}
|
||||||
|
|
||||||
static void map(struct view *view)
|
static void map(struct view *view)
|
||||||
{
|
{
|
||||||
view->mapped = true;
|
view->mapped = true;
|
||||||
|
|
@ -71,15 +84,9 @@ static void map(struct view *view)
|
||||||
view->surface = view->xwayland_surface->surface;
|
view->surface = view->xwayland_surface->surface;
|
||||||
view->server_side_deco = want_deco(view);
|
view->server_side_deco = want_deco(view);
|
||||||
|
|
||||||
view->margin = deco_max_extents(view);
|
view->margin = deco_thickness(view);
|
||||||
|
|
||||||
/* ensure we're inside screen */
|
top_left_edge_boundary_check(view);
|
||||||
view->x += view->margin.left;
|
|
||||||
view->y += view->margin.top;
|
|
||||||
struct wlr_box box = {
|
|
||||||
.x = view->x, .y = view->y, .width = view->w, .height = view->h
|
|
||||||
};
|
|
||||||
view->impl->configure(view, box);
|
|
||||||
|
|
||||||
/* Add commit here, as xwayland map/unmap can change the wlr_surface */
|
/* Add commit here, as xwayland map/unmap can change the wlr_surface */
|
||||||
wl_signal_add(&view->xwayland_surface->surface->events.commit,
|
wl_signal_add(&view->xwayland_surface->surface->events.commit,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue