mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
desktop: don't use LAB_NODE_LAYER_SUBSURFACE node type
Instead, set ctx.type = LAB_NODE_LAYER_SURFACE for both layer-surfaces and layer-subsurfaces. This patch preserves the existing behaviors: - Pressing a subsurface of an on-demand layer-surface gives pointer focus to the subsurface, but gives keyboard focus to the parent layer-surface (related:a5fcbfaf). - Pressing a subsurface of a layer-surface doesn't close a popup (related:a89bcc3c).
This commit is contained in:
parent
574b20fbff
commit
3d670b772d
6 changed files with 23 additions and 83 deletions
|
|
@ -49,7 +49,6 @@ enum lab_node_type {
|
||||||
LAB_NODE_MENUITEM,
|
LAB_NODE_MENUITEM,
|
||||||
LAB_NODE_OSD,
|
LAB_NODE_OSD,
|
||||||
LAB_NODE_LAYER_SURFACE,
|
LAB_NODE_LAYER_SURFACE,
|
||||||
LAB_NODE_LAYER_SUBSURFACE,
|
|
||||||
LAB_NODE_UNMANAGED,
|
LAB_NODE_UNMANAGED,
|
||||||
LAB_NODE_ALL,
|
LAB_NODE_ALL,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
/* 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 */
|
|
||||||
|
|
@ -17,7 +17,6 @@ labwc_sources += files(
|
||||||
'parse-double.c',
|
'parse-double.c',
|
||||||
'scene-helpers.c',
|
'scene-helpers.c',
|
||||||
'set.c',
|
'set.c',
|
||||||
'surface-helpers.c',
|
|
||||||
'spawn.c',
|
'spawn.c',
|
||||||
'string-helpers.c',
|
'string-helpers.c',
|
||||||
'xml.c',
|
'xml.c',
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
|
|
@ -9,7 +9,6 @@
|
||||||
#include <wlr/types/wlr_subcompositor.h>
|
#include <wlr/types/wlr_subcompositor.h>
|
||||||
#include <wlr/types/wlr_xdg_shell.h>
|
#include <wlr/types/wlr_xdg_shell.h>
|
||||||
#include "common/scene-helpers.h"
|
#include "common/scene-helpers.h"
|
||||||
#include "common/surface-helpers.h"
|
|
||||||
#include "dnd.h"
|
#include "dnd.h"
|
||||||
#include "labwc.h"
|
#include "labwc.h"
|
||||||
#include "layers.h"
|
#include "layers.h"
|
||||||
|
|
@ -312,9 +311,8 @@ get_cursor_context(struct server *server)
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
case LAB_NODE_LAYER_SURFACE:
|
case LAB_NODE_LAYER_SURFACE:
|
||||||
ret.node = node;
|
|
||||||
ret.type = LAB_NODE_LAYER_SURFACE;
|
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;
|
return ret;
|
||||||
case LAB_NODE_LAYER_POPUP:
|
case LAB_NODE_LAYER_POPUP:
|
||||||
ret.node = node;
|
ret.node = node;
|
||||||
|
|
@ -374,29 +372,6 @@ get_cursor_context(struct server *server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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->parent is always a *wlr_scene_tree */
|
||||||
node = node->parent ? &node->parent->node : NULL;
|
node = node->parent ? &node->parent->node : NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@
|
||||||
#include "action.h"
|
#include "action.h"
|
||||||
#include "common/macros.h"
|
#include "common/macros.h"
|
||||||
#include "common/mem.h"
|
#include "common/mem.h"
|
||||||
#include "common/surface-helpers.h"
|
|
||||||
#include "config/mousebind.h"
|
#include "config/mousebind.h"
|
||||||
#include "config/rcxml.h"
|
#include "config/rcxml.h"
|
||||||
#include "dnd.h"
|
#include "dnd.h"
|
||||||
|
|
@ -1075,6 +1074,25 @@ process_press_mousebinding(struct server *server, struct cursor_context *ctx,
|
||||||
return consumed_by_frame_context;
|
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;
|
static uint32_t press_msec;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -1107,16 +1125,8 @@ cursor_process_button_press(struct seat *seat, uint32_t button, uint32_t time_ms
|
||||||
* the Focus action (used for normal views) does not work.
|
* the Focus action (used for normal views) does not work.
|
||||||
*/
|
*/
|
||||||
if (ctx.type == LAB_NODE_LAYER_SURFACE) {
|
if (ctx.type == LAB_NODE_LAYER_SURFACE) {
|
||||||
wlr_log(WLR_DEBUG, "press on layer-surface");
|
wlr_log(WLR_DEBUG, "press on layer-(sub)surface");
|
||||||
struct wlr_layer_surface_v1 *layer =
|
struct wlr_layer_surface_v1 *layer = get_root_layer(ctx.surface);
|
||||||
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);
|
|
||||||
if (layer && layer->current.keyboard_interactive) {
|
if (layer && layer->current.keyboard_interactive) {
|
||||||
layer_try_set_focus(seat, layer);
|
layer_try_set_focus(seat, layer);
|
||||||
}
|
}
|
||||||
|
|
@ -1127,7 +1137,7 @@ cursor_process_button_press(struct seat *seat, uint32_t button, uint32_t time_ms
|
||||||
#endif
|
#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)) {
|
&& wlr_seat_pointer_has_grab(seat->seat)) {
|
||||||
/*
|
/*
|
||||||
* If we have an active popup grab (an open popup) we want to
|
* If we have an active popup grab (an open popup) we want to
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue