]> Dogcows Code - chaz/openbox/blobdiff - openbox/menuframe.c
give labeled separators borders
[chaz/openbox] / openbox / menuframe.c
index c417c05a11df59512f0420b6a58abc0a29e08a4f..d065881d303e70a74a8d3984de03fa5c9335215f 100644 (file)
@@ -326,6 +326,7 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
         text_a->texture[0].data.text.string = sub ? sub->title : "";
         break;
     case OB_MENU_ENTRY_TYPE_SEPARATOR:
+        text_a = self->a_text_normal;
         break;
     }
 
@@ -462,6 +463,7 @@ static void menu_frame_render(ObMenuFrame *self)
     GList *it;
     gboolean has_icon = FALSE;
     ObMenu *sub;
+    ObMenuEntryFrame *e;
 
     XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->mbwidth);
     XSetWindowBorder(ob_display, self->window,
@@ -512,10 +514,28 @@ static void menu_frame_render(ObMenuFrame *self)
 
     for (it = self->entries; it; it = g_list_next(it)) {
         RrAppearance *text_a;
-        ObMenuEntryFrame *e = it->data;
+        e = it->data;
+
+        /* if the first entry is a labeled separator, then make its border
+           overlap with the menu's outside border */
+        if (it == self->entries &&
+            e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR &&
+            e->entry->data.separator.label)
+        {
+            h -= ob_rr_theme->mbwidth;
+        }
+
+        if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR &&
+            e->entry->data.separator.label)
+        {
+            e->border = ob_rr_theme->mbwidth;
+        }
 
-        RECT_SET_POINT(e->area, 0, h);
-        XMoveWindow(ob_display, e->window, 0, e->area.y);
+        RECT_SET_POINT(e->area, 0, h+e->border);
+        XMoveWindow(ob_display, e->window, e->area.x-e->border, e->area.y-e->border);
+        XSetWindowBorderWidth(ob_display, e->window, e->border);
+        XSetWindowBorder(ob_display, e->window,
+                         RrColorPixel(ob_rr_theme->menu_b_color));
 
         text_a = ((e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
                    !e->entry->data.normal.enabled) ?
@@ -551,6 +571,7 @@ static void menu_frame_render(ObMenuFrame *self)
                     e->entry->data.separator.label;
                 RrMinsize(self->a_title, &tw, &th);
                 tw = MIN(tw, MAX_MENU_WIDTH);
+                th += ob_rr_theme->mbwidth * 2;
             } else {
                 tw = 0;
                 th = SEPARATOR_HEIGHT;
@@ -563,6 +584,16 @@ static void menu_frame_render(ObMenuFrame *self)
         h += th;
     }
 
+    /* if the last entry is a labeled separator, then make its border
+       overlap with the menu's outside border */
+    it = g_list_last(self->entries);
+    e = it ? it->data : NULL;
+    if (e && e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR &&
+        e->entry->data.separator.label)
+    {
+        h -= ob_rr_theme->mbwidth;
+    }
+
     self->text_x = PADDING;
     self->text_w = w;
 
@@ -738,7 +769,8 @@ gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent,
 
     XMapWindow(ob_display, self->window);
 
-    if (screen_pointer_pos(&dx, &dy) && (e = menu_entry_frame_under(dx, dy)))
+    if (screen_pointer_pos(&dx, &dy) && (e = menu_entry_frame_under(dx, dy)) &&
+        e->frame == self)
         ++e->ignore_enters;
 
     return TRUE;
This page took 0.021465 seconds and 4 git commands to generate.