]> git.mdlowis.com Git - proto/labwc.git/commitdiff
ssd: add support for interacting with bottom corners
authorJohan Malm <jgm323@gmail.com>
Mon, 26 Jul 2021 19:37:36 +0000 (20:37 +0100)
committerJohan Malm <jgm323@gmail.com>
Mon, 26 Jul 2021 19:37:36 +0000 (20:37 +0100)
include/ssd.h
src/ssd.c

index 0274fd1fb64bc68e31bce27339cfc1d4426d5bbf..8effe4d5cdee4c954613aff311e9db87ab144176 100644 (file)
@@ -1,18 +1,25 @@
 #ifndef __LABWC_SSD_H
 #define __LABWC_SSD_H
 
+/*
+ * Sequence these according to the order they should be processes for
+ * press and hover events. Bear in mind that some of their respective
+ * interactive areas overlap, so for example buttons need to come before title.
+ */
 enum ssd_part_type {
        LAB_SSD_NONE = 0,
        LAB_SSD_BUTTON_CLOSE,
        LAB_SSD_BUTTON_MAXIMIZE,
        LAB_SSD_BUTTON_ICONIFY,
        LAB_SSD_PART_TITLE,
+       LAB_SSD_PART_CORNER_TOP_LEFT,
+       LAB_SSD_PART_CORNER_TOP_RIGHT,
+       LAB_SSD_PART_CORNER_BOTTOM_RIGHT,
+       LAB_SSD_PART_CORNER_BOTTOM_LEFT,
        LAB_SSD_PART_TOP,
        LAB_SSD_PART_RIGHT,
        LAB_SSD_PART_BOTTOM,
        LAB_SSD_PART_LEFT,
-       LAB_SSD_PART_CORNER_TOP_RIGHT,
-       LAB_SSD_PART_CORNER_TOP_LEFT,
        LAB_SSD_END_MARKER
 };
 
index d922b6bf76913fd4ba058720ec9d09b11e0063bd..c2e2c89cc04594413d7d8e3cf4bfbc38e1195337 100644 (file)
--- a/src/ssd.c
+++ b/src/ssd.c
@@ -69,6 +69,30 @@ ssd_interactive_box(struct view *view, enum ssd_part_type type)
                box.width = view->w;
                box.height = theme->title_height;
                break;
+       case LAB_SSD_PART_CORNER_TOP_LEFT:
+               box.x = view->x - theme->border_width - INVISIBLE_MARGIN;
+               box.y = view->y - corner_square - INVISIBLE_MARGIN;
+               box.width = corner_square + INVISIBLE_MARGIN;
+               box.height = corner_square + INVISIBLE_MARGIN;
+               break;
+       case LAB_SSD_PART_CORNER_TOP_RIGHT:
+               box.x = view->x + view->w - theme->title_height;
+               box.y = view->y - corner_square - INVISIBLE_MARGIN;
+               box.width = corner_square + INVISIBLE_MARGIN;
+               box.height = corner_square + INVISIBLE_MARGIN;
+               break;
+       case LAB_SSD_PART_CORNER_BOTTOM_RIGHT:
+               box.x = view->x + view->w - corner_square;
+               box.y = view->y + view->h - corner_square;
+               box.width = corner_square + INVISIBLE_MARGIN;
+               box.height = corner_square + INVISIBLE_MARGIN;
+               break;
+       case LAB_SSD_PART_CORNER_BOTTOM_LEFT:
+               box.x = view->x - theme->border_width - INVISIBLE_MARGIN;
+               box.y = view->y + view->h - corner_square;
+               box.width = corner_square + INVISIBLE_MARGIN;
+               box.height = corner_square + INVISIBLE_MARGIN;
+               break;
        case LAB_SSD_PART_TOP:
                box.x = view->x + theme->title_height;
                box.y = view->y - corner_square - INVISIBLE_MARGIN;
@@ -93,18 +117,6 @@ ssd_interactive_box(struct view *view, enum ssd_part_type type)
                box.width = theme->border_width + INVISIBLE_MARGIN;
                box.height = view->h;
                break;
-       case LAB_SSD_PART_CORNER_TOP_LEFT:
-               box.x = view->x - theme->border_width - INVISIBLE_MARGIN;
-               box.y = view->y - corner_square - INVISIBLE_MARGIN;
-               box.width = corner_square + INVISIBLE_MARGIN;
-               box.height = corner_square + INVISIBLE_MARGIN;
-               break;
-       case LAB_SSD_PART_CORNER_TOP_RIGHT:
-               box.x = view->x + view->w - theme->title_height;
-               box.y = view->y - corner_square - INVISIBLE_MARGIN;
-               box.width = corner_square + INVISIBLE_MARGIN;
-               box.height = corner_square + INVISIBLE_MARGIN;
-               break;
        default:
                break;
        }
@@ -131,37 +143,39 @@ ssd_box(struct view *view, enum ssd_part_type type)
                box.x += theme->title_height;
                box.width -= 2 * theme->title_height;
                break;
-       case LAB_SSD_PART_TOP:
+       case LAB_SSD_PART_CORNER_TOP_LEFT:
                box = ssd_interactive_box(view, type);
+               box.x += INVISIBLE_MARGIN;
                box.y += INVISIBLE_MARGIN;
+               box.width -= INVISIBLE_MARGIN;
                box.height -= INVISIBLE_MARGIN;
                break;
-       case LAB_SSD_PART_RIGHT:
+       case LAB_SSD_PART_CORNER_TOP_RIGHT:
                box = ssd_interactive_box(view, type);
+               box.y += INVISIBLE_MARGIN;
                box.width -= INVISIBLE_MARGIN;
+               box.height -= INVISIBLE_MARGIN;
                break;
-       case LAB_SSD_PART_BOTTOM:
+       case LAB_SSD_PART_TOP:
                box = ssd_interactive_box(view, type);
+               box.y += INVISIBLE_MARGIN;
                box.height -= INVISIBLE_MARGIN;
                break;
-       case LAB_SSD_PART_LEFT:
+       case LAB_SSD_PART_RIGHT:
                box = ssd_interactive_box(view, type);
-               box.x += INVISIBLE_MARGIN;
                box.width -= INVISIBLE_MARGIN;
                break;
-       case LAB_SSD_PART_CORNER_TOP_LEFT:
+       case LAB_SSD_PART_BOTTOM:
                box = ssd_interactive_box(view, type);
-               box.x += INVISIBLE_MARGIN;
-               box.y += INVISIBLE_MARGIN;
-               box.width -= INVISIBLE_MARGIN;
                box.height -= INVISIBLE_MARGIN;
                break;
-       case LAB_SSD_PART_CORNER_TOP_RIGHT:
+       case LAB_SSD_PART_LEFT:
                box = ssd_interactive_box(view, type);
-               box.y += INVISIBLE_MARGIN;
+               box.x += INVISIBLE_MARGIN;
                box.width -= INVISIBLE_MARGIN;
-               box.height -= INVISIBLE_MARGIN;
                break;
+       case LAB_SSD_PART_CORNER_BOTTOM_RIGHT:
+       case LAB_SSD_PART_CORNER_BOTTOM_LEFT:
        default:
                break;
        }
@@ -184,28 +198,27 @@ ssd_at(struct view *view, double lx, double ly)
 uint32_t
 ssd_resize_edges(enum ssd_part_type type)
 {
-       uint32_t edges = 0;
-
-       if (type == LAB_SSD_PART_TOP) {
-               edges |= WLR_EDGE_TOP;
-       }
-       if (type == LAB_SSD_PART_RIGHT) {
-               edges |= WLR_EDGE_RIGHT;
-       }
-       if (type == LAB_SSD_PART_BOTTOM) {
-               edges |= WLR_EDGE_BOTTOM;
-       }
-       if (type == LAB_SSD_PART_LEFT) {
-               edges |= WLR_EDGE_LEFT;
-       }
-       if (type == LAB_SSD_PART_CORNER_TOP_RIGHT) {
-               edges = WLR_EDGE_RIGHT | WLR_EDGE_TOP;
-       }
-       if (type == LAB_SSD_PART_CORNER_TOP_LEFT) {
-               edges |= WLR_EDGE_TOP;
-               edges |= WLR_EDGE_LEFT;
+       switch (type) {
+       case LAB_SSD_PART_TOP:
+               return WLR_EDGE_TOP;
+       case LAB_SSD_PART_RIGHT:
+               return WLR_EDGE_RIGHT;
+       case LAB_SSD_PART_BOTTOM:
+               return WLR_EDGE_BOTTOM;
+       case LAB_SSD_PART_LEFT:
+               return WLR_EDGE_LEFT;
+       case LAB_SSD_PART_CORNER_TOP_LEFT:
+               return WLR_EDGE_TOP | WLR_EDGE_LEFT;
+       case LAB_SSD_PART_CORNER_TOP_RIGHT:
+               return WLR_EDGE_RIGHT | WLR_EDGE_TOP;
+       case LAB_SSD_PART_CORNER_BOTTOM_RIGHT:
+               return WLR_EDGE_BOTTOM | WLR_EDGE_RIGHT;
+       case LAB_SSD_PART_CORNER_BOTTOM_LEFT:
+               return WLR_EDGE_BOTTOM | WLR_EDGE_LEFT;
+       default:
+               break;
        }
-       return edges;
+       return 0;
 }