]> git.mdlowis.com Git - proto/labwc.git/commitdiff
ssd: attach LAB_NODE_SSD_ROOT to ssd->tree
authortokyo4j <hrak1529@gmail.com>
Sun, 7 Sep 2025 12:48:51 +0000 (21:48 +0900)
committerHiroaki Yamamoto <hrak1529@gmail.com>
Mon, 8 Sep 2025 06:46:36 +0000 (15:46 +0900)
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.

include/common/node-type.h
include/ssd-internal.h
src/desktop.c
src/ssd/ssd.c

index 41f4d3810121616528b2e70b45469dc73e1ca681..280a6c59f80222766eea7525e7b6a924c1cbf087 100644 (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);
index db8d02a62555f015c5674a9664455cbde64500db..600b9076e530959a1a2b24c6dd13f03a214a6ee1 100644 (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
index 75c2648e9839c4127f963ba99273fa96ad4c5f61..766a3e3a134c9a3cf13a91b6811e38333589d18f 100644 (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;
                        }
                }
 
index 0e900a65852ea24307a16618948f60140391496b..9ec7fa3be47c4f784bd413776d3f7598cd8e4355 100644 (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);