ssd: attach LAB_NODE_SSD_ROOT to ssd->tree

This doesn't change any behaviors.

Attaching LAB_NODE_NONE node-descriptor to ssd->tree looks strange, this
patch uses new LAB_NODE_SSD_ROOT instead. The node-descriptor attached to
ssd->tree is needed for get_cursor_context() to detect cursor hovering on
borders/extents.

I also updated get_cursor_context() to make my intent clearer.
This commit is contained in:
tokyo4j 2025-09-07 21:48:51 +09:00 committed by Hiroaki Yamamoto
parent b9b23f5931
commit 574b20fbff
4 changed files with 43 additions and 16 deletions

View file

@ -59,6 +59,12 @@ enum lab_node_type {
LAB_NODE_LAYER_POPUP,
LAB_NODE_SESSION_LOCK_SURFACE,
LAB_NODE_IME_POPUP,
/*
* translated to LAB_CORNER_* or LAB_BORDER* by
* ssd_get_resizing_type()
*/
LAB_NODE_SSD_ROOT,
};
enum lab_node_type node_type_parse(const char *context);

View file

@ -17,7 +17,7 @@ struct ssd_state_title_width {
* type of each node (enum lab_node_type, stored in the node_descriptor
* attached to the wlr_scene_node).
*
* ssd->tree (LAB_NODE_NONE)
* ssd->tree (LAB_NODE_SSD_ROOT)
* +--titlebar (LAB_NODE_TITLEBAR)
* | +--inactive
* | | +--background bar

View file

@ -331,31 +331,46 @@ get_cursor_context(struct server *server)
ret.node = node;
ret.type = LAB_NODE_MENUITEM;
return ret;
default:
/*
* All other node descriptors (buttons, title,
* etc.) should have an associated view.
*/
if (!desc->view) {
wlr_log(WLR_ERROR, "cursor not on any view "
"(node type %d)", desc->type);
return ret;
}
case LAB_NODE_BUTTON_FIRST...LAB_NODE_BUTTON_LAST:
case LAB_NODE_SSD_ROOT:
case LAB_NODE_TITLE:
case LAB_NODE_TITLEBAR:
ret.node = node;
ret.view = desc->view;
/*
* A node_descriptor attached to a ssd part
* must have an associated view.
*/
assert(ret.view);
/* Detect mouse contexts like Top, Left and TRCorner */
/*
* When cursor is on the ssd border or extents,
* desc->type is usually LAB_NODE_SSD_ROOT.
* But desc->type can also be LAB_NODE_TITLEBAR
* when cursor is on the curved border at the
* titlebar.
*
* ssd_get_resizing_type() overwrites both of
* them with LAB_NODE_{BORDER,CORNER}_* node
* types, which are mapped to mouse contexts
* like Left and TLCorner.
*/
ret.type = ssd_get_resizing_type(ret.view->ssd, cursor);
if (ret.type == LAB_NODE_NONE) {
/*
* Otherwise, detect mouse contexts like
* Title, Titlebar and Iconify
* If cursor is not on border/extents,
* just use desc->type which should be
* mapped to mouse contexts like Title,
* Titlebar and Iconify.
*/
ret.type = desc->type;
}
return ret;
default:
/* Other node types are not attached a scene node */
wlr_log(WLR_ERROR, "unexpected node type: %d", desc->type);
break;
}
}

View file

@ -146,8 +146,14 @@ ssd_create(struct view *view, bool active)
ssd->view = view;
ssd->tree = wlr_scene_tree_create(view->scene_tree);
/*
* Attach node_descriptor to the root node so that get_cursor_context()
* detect cursor hovering on borders and extents.
*/
node_descriptor_create(&ssd->tree->node,
LAB_NODE_NONE, view, /*data*/ NULL);
LAB_NODE_SSD_ROOT, view, /*data*/ NULL);
wlr_scene_node_lower_to_bottom(&ssd->tree->node);
ssd->titlebar.height = view->server->theme->titlebar_height;
ssd_shadow_create(ssd);