]> Dogcows Code - chaz/openbox/blobdiff - openbox/menuframe.c
scary commit..but here goes.
[chaz/openbox] / openbox / menuframe.c
index 43d4058522566ffdb5161aae0483829bead425ad..743f4204ca7ea7fa00cac7d1586b59697b09dfad 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 
    menuframe.c for the Openbox window manager
-   Copyright (c) 2004        Mikael Magnusson
+   Copyright (c) 2006        Mikael Magnusson
    Copyright (c) 2003        Ben Jansens
 
    This program is free software; you can redistribute it and/or modify
@@ -23,6 +23,7 @@
 #include "screen.h"
 #include "grab.h"
 #include "openbox.h"
+#include "mainloop.h"
 #include "config.h"
 #include "render/theme.h"
 
@@ -43,6 +44,7 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry,
 static void menu_entry_frame_free(ObMenuEntryFrame *self);
 static void menu_frame_render(ObMenuFrame *self);
 static void menu_frame_update(ObMenuFrame *self);
+static gboolean menu_entry_frame_submenu_timeout(gpointer data);
 
 static Window createWindow(Window parent, gulong mask,
                            XSetWindowAttributes *attrib)
@@ -66,7 +68,7 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, ObClient *client)
 
     attr.event_mask = FRAME_EVENTMASK;
     self->window = createWindow(RootWindow(ob_display, ob_screen),
-                                   CWEventMask, &attr);
+                                CWEventMask, &attr);
     attr.event_mask = TITLE_EVENTMASK;
     self->title = createWindow(self->window, CWEventMask, &attr);
     self->items = createWindow(self->window, 0, NULL);
@@ -187,7 +189,6 @@ void menu_frame_move(ObMenuFrame *self, gint x, gint y)
 void menu_frame_move_on_screen(ObMenuFrame *self)
 {
     Rect *a = NULL;
-    guint i;
     gint dx = 0, dy = 0;
     gint pos, half;
 
@@ -249,6 +250,8 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
     case OB_MENU_ENTRY_TYPE_SEPARATOR:
         th = SEPARATOR_HEIGHT + 2*PADDING;
         break;
+    default:
+        g_assert_not_reached();
     }
     RECT_SET_SIZE(self->area, self->frame->inner_w, th);
     XResizeWindow(ob_display, self->window,
@@ -409,25 +412,25 @@ static void menu_frame_render(ObMenuFrame *self)
     gboolean has_icon = FALSE;
     ObMenu *sub;
 
-    XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->bwidth);
+    XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->mbwidth);
     XSetWindowBorder(ob_display, self->window,
-                     RrColorPixel(ob_rr_theme->b_color));
+                     RrColorPixel(ob_rr_theme->menu_b_color));
 
     if (!self->parent && self->show_title) {
         XMoveWindow(ob_display, self->title, 
-                    -ob_rr_theme->bwidth, h - ob_rr_theme->bwidth);
+                    -ob_rr_theme->mbwidth, h - ob_rr_theme->mbwidth);
 
         self->a_title->texture[0].data.text.string = self->menu->title;
         RrMinsize(self->a_title, &tw, &th);
-        tw = MIN(tw, MAX_MENU_WIDTH) + ob_rr_theme->padding * 2;
+        tw = MIN(tw, MAX_MENU_WIDTH) + ob_rr_theme->paddingx * 2;
         w = MAX(w, tw);
 
         th = ob_rr_theme->menu_title_height;
-        h += (self->title_h = th + ob_rr_theme->bwidth);
+        h += (self->title_h = th + ob_rr_theme->mbwidth);
 
-        XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->bwidth);
+        XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->mbwidth);
         XSetWindowBorder(ob_display, self->title,
-                         RrColorPixel(ob_rr_theme->b_color));
+                         RrColorPixel(ob_rr_theme->menu_b_color));
     }
 
     XMoveWindow(ob_display, self->items, 0, h);
@@ -535,9 +538,9 @@ static void menu_frame_render(ObMenuFrame *self)
 
     if (!self->parent && self->show_title) {
         XResizeWindow(ob_display, self->title,
-                      w, self->title_h - ob_rr_theme->bwidth);
+                      w, self->title_h - ob_rr_theme->mbwidth);
         RrPaint(self->a_title, self->title,
-                w, self->title_h - ob_rr_theme->bwidth);
+                w, self->title_h - ob_rr_theme->mbwidth);
         XMapWindow(ob_display, self->title);
     } else
         XUnmapWindow(ob_display, self->title);
@@ -547,8 +550,8 @@ static void menu_frame_render(ObMenuFrame *self)
     for (it = self->entries; it; it = g_list_next(it))
         menu_entry_frame_render(it->data);
 
-    w += ob_rr_theme->bwidth * 2;
-    h += ob_rr_theme->bwidth * 2;
+    w += ob_rr_theme->mbwidth * 2;
+    h += ob_rr_theme->mbwidth * 2;
 
     RECT_SET_SIZE(self->area, w, h);
 
@@ -605,6 +608,7 @@ gboolean menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
     }
 
     if (parent) {
+        self->monitor = parent->monitor;
         if (parent->child)
             menu_frame_hide(parent->child);
         parent->child = self;
@@ -625,6 +629,16 @@ gboolean menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
     menu_frame_update(self);
 
     menu_frame_visible = g_list_prepend(menu_frame_visible, self);
+    
+    if (config_menu_middle) {
+        if (self->parent)
+            menu_frame_move(self, self->area.x, self->area.y
+                                                - self->area.height/2
+                                                + self->item_h/2);
+        else if (self->show_title)
+            menu_frame_move(self, self->area.x - self->area.width/2,
+                            self->area.y - self->title_h*3/4);
+    }
 
     menu_frame_move_on_screen(self);
 
@@ -662,8 +676,14 @@ void menu_frame_hide(ObMenuFrame *self)
 
 void menu_frame_hide_all()
 {
-    GList *it = g_list_last(menu_frame_visible);
-    if (it) 
+    GList *it;
+
+    if (config_submenu_show_delay) {
+        /* remove any submenu open requests */
+        ob_main_loop_timeout_remove(ob_main_loop,
+                                    menu_entry_frame_submenu_timeout);
+    }
+    if ((it = g_list_last(menu_frame_visible)))
         menu_frame_hide(it->data);
 }
 
@@ -701,8 +721,8 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y)
     GList *it;
 
     if ((frame = menu_frame_under(x, y))) {
-        x -= ob_rr_theme->bwidth + frame->area.x;
-        y -= frame->title_h + ob_rr_theme->bwidth + frame->area.y;
+        x -= ob_rr_theme->mbwidth + frame->area.x;
+        y -= frame->title_h + ob_rr_theme->mbwidth + frame->area.y;
 
         for (it = frame->entries; it; it = g_list_next(it)) {
             ObMenuEntryFrame *e = it->data;
@@ -716,6 +736,12 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y)
     return ret;
 }
 
+static gboolean menu_entry_frame_submenu_timeout(gpointer data)
+{
+    menu_entry_frame_show_submenu((ObMenuEntryFrame*)data);
+    return FALSE;
+}
+
 void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry)
 {
     ObMenuEntryFrame *old = self->selected;
@@ -725,6 +751,12 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry)
         entry = old;
 
     if (old == entry) return;
+   
+    if (config_submenu_show_delay) { 
+        /* remove any submenu open requests */
+        ob_main_loop_timeout_remove(ob_main_loop,
+                                    menu_entry_frame_submenu_timeout);
+    }
 
     self->selected = entry;
 
@@ -736,8 +768,18 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry)
     if (self->selected) {
         menu_entry_frame_render(self->selected);
 
-        if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
-            menu_entry_frame_show_submenu(self->selected);
+        if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) {
+            if (config_submenu_show_delay) {
+                /* initiate a new submenu open request */
+                ob_main_loop_timeout_add(ob_main_loop,
+                                         config_submenu_show_delay * 1000,
+                                         menu_entry_frame_submenu_timeout,
+                                         self->selected,
+                                         NULL);
+            } else {
+                menu_entry_frame_show_submenu(self->selected);
+            }
+        }
     }
 }
 
@@ -750,10 +792,14 @@ void menu_entry_frame_show_submenu(ObMenuEntryFrame *self)
     f = menu_frame_new(self->entry->data.submenu.submenu,
                        self->frame->client);
     menu_frame_move(f,
-                    self->frame->area.x + self->frame->area.width
-                    - ob_rr_theme->menu_overlap - ob_rr_theme->bwidth,
-                    self->frame->area.y + self->frame->title_h +
-                    self->area.y + ob_rr_theme->menu_overlap);
+                    self->frame->area.x
+                  + self->frame->area.width
+                  - ob_rr_theme->menu_overlap
+                  - ob_rr_theme->mbwidth,
+                    self->frame->area.y
+                  + self->frame->title_h
+                  + self->area.y
+                  + (config_menu_middle ? 1 : ob_rr_theme->menu_overlap));
     menu_frame_show(f, self->frame);
 }
 
This page took 0.030017 seconds and 4 git commands to generate.