LAB_NODE_MENUITEM,
LAB_NODE_OSD,
LAB_NODE_LAYER_SURFACE,
- LAB_NODE_LAYER_SUBSURFACE,
LAB_NODE_UNMANAGED,
LAB_NODE_ALL,
+++ /dev/null
-/* SPDX-License-Identifier: GPL-2.0-only */
-#ifndef LABWC_SURFACE_HELPERS_H
-#define LABWC_SURFACE_HELPERS_H
-
-struct wlr_surface;
-struct wlr_layer_surface_v1;
-
-/**
- * subsurface_parent_layer() - Get wlr_layer_surface from layer-subsurface
- * @wlr_surface: The wlr_surface of the wlr_subsurface for which to get the
- * layer-surface.
- */
-struct wlr_layer_surface_v1 *subsurface_parent_layer(
- struct wlr_surface *wlr_surface);
-
-#endif /* LABWC_SURFACE_HELPERS_H */
'parse-double.c',
'scene-helpers.c',
'set.c',
- 'surface-helpers.c',
'spawn.c',
'string-helpers.c',
'xml.c',
+++ /dev/null
-// SPDX-License-Identifier: GPL-2.0-only
-#include "common/surface-helpers.h"
-#include <wlr/types/wlr_layer_shell_v1.h>
-#include <wlr/types/wlr_subcompositor.h>
-#include <wlr/util/log.h>
-
-struct wlr_layer_surface_v1 *
-subsurface_parent_layer(struct wlr_surface *wlr_surface)
-{
- struct wlr_subsurface *subsurface =
- wlr_subsurface_try_from_wlr_surface(wlr_surface);
- if (!subsurface) {
- return NULL;
- }
- struct wlr_surface *parent = subsurface->parent;
- if (!parent) {
- wlr_log(WLR_DEBUG, "subsurface %p has no parent", subsurface);
- return NULL;
- }
- struct wlr_layer_surface_v1 *wlr_layer_surface =
- wlr_layer_surface_v1_try_from_wlr_surface(parent);
- if (wlr_layer_surface) {
- return wlr_layer_surface;
- }
- /* Recurse in case there are nested sub-surfaces */
- return subsurface_parent_layer(parent);
-}
#include <wlr/types/wlr_subcompositor.h>
#include <wlr/types/wlr_xdg_shell.h>
#include "common/scene-helpers.h"
-#include "common/surface-helpers.h"
#include "dnd.h"
#include "labwc.h"
#include "layers.h"
}
return ret;
case LAB_NODE_LAYER_SURFACE:
- ret.node = node;
ret.type = LAB_NODE_LAYER_SURFACE;
- ret.surface = get_surface_from_layer_node(node);
+ ret.surface = lab_wlr_surface_from_node(ret.node);
return ret;
case LAB_NODE_LAYER_POPUP:
ret.node = node;
}
}
- /* Edge-case nodes without node-descriptors */
- if (node->type == WLR_SCENE_NODE_BUFFER) {
- struct wlr_surface *surface = lab_wlr_surface_from_node(node);
-
- /*
- * Handle layer-shell subsurfaces
- *
- * These don't have node-descriptors, but need to be
- * able to receive pointer actions so we have to process
- * them here.
- *
- * Test by running `gtk-layer-demo -k exclusive`, then
- * open the 'set margin' dialog and try setting the
- * margin with the pointer.
- */
- if (surface && wlr_subsurface_try_from_wlr_surface(surface)
- && subsurface_parent_layer(surface)) {
- ret.surface = surface;
- ret.type = LAB_NODE_LAYER_SUBSURFACE;
- return ret;
- }
- }
-
/* node->parent is always a *wlr_scene_tree */
node = node->parent ? &node->parent->node : NULL;
}
#include "action.h"
#include "common/macros.h"
#include "common/mem.h"
-#include "common/surface-helpers.h"
#include "config/mousebind.h"
#include "config/rcxml.h"
#include "dnd.h"
return consumed_by_frame_context;
}
+static struct wlr_layer_surface_v1 *
+get_root_layer(struct wlr_surface *wlr_surface)
+{
+ assert(wlr_surface);
+ struct wlr_subsurface *subsurface =
+ wlr_subsurface_try_from_wlr_surface(wlr_surface);
+ if (subsurface) {
+ if (subsurface->parent) {
+ return get_root_layer(subsurface->parent);
+ } else {
+ /* never reached? */
+ wlr_log(WLR_ERROR, "subsurface without parent");
+ return NULL;
+ }
+ } else {
+ return wlr_layer_surface_v1_try_from_wlr_surface(wlr_surface);
+ }
+}
+
static uint32_t press_msec;
bool
* the Focus action (used for normal views) does not work.
*/
if (ctx.type == LAB_NODE_LAYER_SURFACE) {
- wlr_log(WLR_DEBUG, "press on layer-surface");
- struct wlr_layer_surface_v1 *layer =
- wlr_layer_surface_v1_try_from_wlr_surface(ctx.surface);
- if (layer && layer->current.keyboard_interactive) {
- layer_try_set_focus(seat, layer);
- }
- } else if (ctx.type == LAB_NODE_LAYER_SUBSURFACE) {
- wlr_log(WLR_DEBUG, "press on layer-subsurface");
- struct wlr_layer_surface_v1 *layer =
- subsurface_parent_layer(ctx.surface);
+ wlr_log(WLR_DEBUG, "press on layer-(sub)surface");
+ struct wlr_layer_surface_v1 *layer = get_root_layer(ctx.surface);
if (layer && layer->current.keyboard_interactive) {
layer_try_set_focus(seat, layer);
}
#endif
}
- if (ctx.type != LAB_NODE_CLIENT && ctx.type != LAB_NODE_LAYER_SUBSURFACE
+ if (ctx.type != LAB_NODE_CLIENT && ctx.type != LAB_NODE_LAYER_SURFACE
&& wlr_seat_pointer_has_grab(seat->seat)) {
/*
* If we have an active popup grab (an open popup) we want to