]> Dogcows Code - chaz/openbox/blobdiff - openbox/menuframe.c
change the menu plugin interface, no need for the create/destroy functions any more.
[chaz/openbox] / openbox / menuframe.c
index 29b9b638f51ead4d001c3b1401c4f7fef740be43..daecd6c4d2d3234b4d8f81b0c078cb0732bbb08d 100644 (file)
@@ -37,6 +37,7 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, ObClient *client)
     self->type = Window_Menu;
     self->menu = menu;
     self->selected = NULL;
+    self->show_title = TRUE;
     self->client = client;
 
     attr.event_mask = FRAME_EVENTMASK;
@@ -51,12 +52,16 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, ObClient *client)
     self->a_title = RrAppearanceCopy(ob_rr_theme->a_menu_title);
     self->a_items = RrAppearanceCopy(ob_rr_theme->a_menu);
 
+    stacking_add(MENU_AS_WINDOW(self));
+
     return self;
 }
 
 void menu_frame_free(ObMenuFrame *self)
 {
     if (self) {
+        stacking_remove(MENU_AS_WINDOW(self));
+
         XDestroyWindow(ob_display, self->items);
         XDestroyWindow(ob_display, self->title);
         XDestroyWindow(ob_display, self->window);
@@ -263,7 +268,7 @@ static void menu_frame_render(ObMenuFrame *self)
     XSetWindowBorder(ob_display, self->window,
                      RrColorPixel(ob_rr_theme->b_color));
 
-    if (!self->parent && self->menu->title) {
+    if (!self->parent && self->show_title) {
         XMoveWindow(ob_display, self->title, 
                     -ob_rr_theme->bwidth, h - ob_rr_theme->bwidth);
 
@@ -344,7 +349,7 @@ static void menu_frame_render(ObMenuFrame *self)
 
     self->inner_w = w;
 
-    if (!self->parent && self->title) {
+    if (!self->parent && self->show_title) {
         XResizeWindow(ob_display, self->title,
                       w, self->title_h - ob_rr_theme->bwidth);
         RrPaint(self->a_title, self->title,
@@ -411,6 +416,8 @@ void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
     if (!g_list_find(menu_frame_visible, self)) {
         menu_frame_visible = g_list_prepend(menu_frame_visible, self);
 
+        if (self->menu->update_func)
+            self->menu->update_func(self, self->menu->data);
         menu_frame_update(self);
     }
 
@@ -443,10 +450,22 @@ void menu_frame_hide(ObMenuFrame *self)
 
 void menu_frame_hide_all()
 {
-    while (menu_frame_visible)
-        menu_frame_hide(menu_frame_visible->data);
+    GList *it = g_list_last(menu_frame_visible);
+    if (it) 
+        menu_frame_hide(it->data);
+}
+
+void menu_frame_hide_all_client(ObClient *client)
+{
+    GList *it = g_list_last(menu_frame_visible);
+    if (it) {
+        ObMenuFrame *f = it->data;
+        if (f->client == client)
+            menu_frame_hide(f);
+    }
 }
 
+
 ObMenuFrame* menu_frame_under(gint x, gint y)
 {
     ObMenuFrame *ret = NULL;
@@ -488,6 +507,7 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y)
 void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry)
 {
     ObMenuEntryFrame *old = self->selected;
+    ObMenuFrame *oldchild = self->child;
 
     if (old == entry) return;
 
@@ -496,11 +516,11 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry)
     else
         self->selected = NULL;
 
-    if (old) {
+    if (old)
         menu_entry_frame_render(old);
-        if (old->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
-            menu_frame_hide(self->child);
-    }
+    if (oldchild)
+        menu_frame_hide(oldchild);
+
     if (self->selected) {
         menu_entry_frame_render(self->selected);
 
@@ -519,7 +539,7 @@ void menu_entry_frame_show_submenu(ObMenuEntryFrame *self)
                     self->frame->area.x + self->frame->area.width
                     - ob_rr_theme->menu_overlap,
                     self->frame->area.y + self->frame->title_h +
-                    self->area.y);
+                    self->area.y + ob_rr_theme->menu_overlap);
     menu_frame_show(f, self->frame);
 }
 
@@ -528,6 +548,9 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self)
     if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) {
         GSList *it;
 
+        /* release grabs before executing the shit */
+        menu_frame_hide_all();
+
         for (it = self->entry->data.normal.actions; it;
              it = g_slist_next(it))
         {
@@ -535,6 +558,5 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self)
             act->data.any.c = self->frame->client;
             act->func(&act->data);
         }
-        menu_frame_hide_all();
     }
 }
This page took 0.022696 seconds and 4 git commands to generate.