void output_frame(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);
enum deco_part deco_at(struct view *view, double lx, double ly);
#define BORDER_WIDTH (2)
-struct border deco_max_extents(struct view *view)
+struct border deco_thickness(struct view *view)
{
struct border border = {
.top = rc.title_height + BORDER_WIDTH,
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)
{
int margin;
struct wlr_box box = { .x = 0, .y = 0, .width = 0, .height = 0 };
BUG_ON(!view);
- if ((view->w < 1) || (view->h < 1)) {
- warn("view (%p) has no width/height", view);
- return box;
- }
switch (deco_part) {
case LAB_DECO_BUTTON_CLOSE:
wlr_texture_get_size(theme.xbm_close_active_unpressed,
if (!view->been_mapped) {
view->server_side_deco = has_ssd(view);
if (view->server_side_deco) {
- view->margin = deco_max_extents(view);
+ view->margin = deco_thickness(view);
} else {
view->margin = xdg_shell_border(view);
view->xdg_grab_offset = -view->margin.left;
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)
{
view->mapped = true;
view->surface = view->xwayland_surface->surface;
view->server_side_deco = want_deco(view);
- view->margin = deco_max_extents(view);
+ view->margin = deco_thickness(view);
- /* ensure we're inside screen */
- 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);
+ top_left_edge_boundary_check(view);
/* Add commit here, as xwayland map/unmap can change the wlr_surface */
wl_signal_add(&view->xwayland_surface->surface->events.commit,