diff --git a/include/common/node-type.h b/include/common/node-type.h index 41f4d381..280a6c59 100644 --- a/include/common/node-type.h +++ b/include/common/node-type.h @@ -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); diff --git a/include/ssd-internal.h b/include/ssd-internal.h index db8d02a6..600b9076 100644 --- a/include/ssd-internal.h +++ b/include/ssd-internal.h @@ -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 diff --git a/src/desktop.c b/src/desktop.c index 75c2648e..766a3e3a 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -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; } } diff --git a/src/ssd/ssd.c b/src/ssd/ssd.c index 0e900a65..9ec7fa3b 100644 --- a/src/ssd/ssd.c +++ b/src/ssd/ssd.c @@ -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);