]> Dogcows Code - chaz/openbox/commitdiff
Render menus only when they are invalid.
authorScott Moynes <smoynes@nexus.carleton.ca>
Tue, 22 Apr 2003 01:04:29 +0000 (01:04 +0000)
committerScott Moynes <smoynes@nexus.carleton.ca>
Tue, 22 Apr 2003 01:04:29 +0000 (01:04 +0000)
openbox/Makefile.am
openbox/menu.c
openbox/menu.h
openbox/menu_render.c [new file with mode: 0644]

index d1af468340403c276599978dbede4069c4594b91..98d524249906cd654af9f4c41b478335be5fdd13 100644 (file)
@@ -21,9 +21,10 @@ bin_PROGRAMS=$(binary)
 openbox3_LDADD=@LIBINTL@ -lobrender -L../render
 openbox3_LDFLAGS=-export-dynamic
 openbox3_SOURCES=parse.tab.c parse.lex.c action.c client.c config.c \
-                 extensions.c focus.c frame.c grab.c menu.c openbox.c \
-                 framerender.c parse.c plugin.c prop.c screen.c stacking.c \
-                 dispatch.c event.c group.c timer.c xerror.c moveresize.c
+                 extensions.c focus.c frame.c grab.c menu.c menu_render.c \
+                 openbox.c framerender.c parse.c plugin.c prop.c screen.c \
+                 stacking.c dispatch.c event.c group.c timer.c xerror.c \
+                 moveresize.c
 
 noinst_HEADERS=action.h client.h config.h dispatch.h event.h extensions.h \
                focus.h frame.h framerender.h geom.h gettext.h grab.h group.h \
index 52903dcdda8776cb6c8fef32c18846c8a5d9b116..314c2f5e6413ab24f93a2e5ffff9345b7ef92c71 100644 (file)
@@ -188,10 +188,6 @@ void menu_add_entry(Menu *menu, MenuEntry *entry)
 void menu_show(char *name, int x, int y, Client *client)
 {
     Menu *self;
-    GList *it;
-    int items_h;
-    int nitems = 0; /* each item, only one is used */
-    int item_y;
 
     self = g_hash_table_lookup(menu_hash, name);
     if (!self) {
@@ -199,66 +195,14 @@ void menu_show(char *name, int x, int y, Client *client)
                   name);
         return;
     }
+    
+    if(self->invalid) {
+      menu_render(self);
+    }
 
-    self->client = client;
-
-    self->width = 1;
-    self->item_h = 0;
-
-    /* set texture data and size them mofos out */
-    self->a_title->texture[0].data.text.string = self->label;
-    appearance_minsize(self->a_title, &self->title_min_w, &self->title_h);
-    self->title_min_w += theme_bevel * 2;
-    self->title_h += theme_bevel * 2;
-    self->width = MAX(self->width, self->title_min_w);
-
-    for (it = self->entries; it; it = it->next) {
-        MenuEntry *e = it->data;
-        int h;
-
-        e->a_item->texture[0].data.text.string = e->label;
-        appearance_minsize(e->a_item, &e->min_w, &self->item_h);
-        self->width = MAX(self->width, e->min_w);
-
-        e->a_disabled->texture[0].data.text.string = e->label;
-        appearance_minsize(e->a_disabled, &e->min_w, &h);
-        self->item_h = MAX(self->item_h, h);
-        self->width = MAX(self->width, e->min_w);
-
-        e->a_hilite->texture[0].data.text.string = e->label;
-        appearance_minsize(e->a_hilite, &e->min_w, &h);
-        self->item_h = MAX(self->item_h, h);
-        self->width = MAX(self->width, e->min_w);
+    XMoveWindow(ob_display, self->frame, x, y);
 
-        e->min_w += theme_bevel * 2;
-        ++nitems;
-    }
-    self->bullet_w = self->item_h + theme_bevel;
-    self->width += 2 * self->bullet_w;
-    self->item_h += theme_bevel * 2;
-    items_h = self->item_h * nitems;
-
-    RECT_SET(self->a_title->area, 0, 0, self->width, self->title_h);
-    RECT_SET(self->a_title->texture[0].position, 0, 0, self->width,
-             self->title_h);
-    RECT_SET(self->a_items->area, 0, 0, self->width, items_h);
-
-    XMoveResizeWindow(ob_display, self->frame, x, y, self->width,
-                      self->title_h + items_h);
-    XMoveResizeWindow(ob_display, self->title, -theme_bwidth, -theme_bwidth,
-                      self->width, self->title_h);
-    XMoveResizeWindow(ob_display, self->items, 0, self->title_h + theme_bwidth,
-                      self->width, items_h);
-
-    paint(self->title, self->a_title);
-    paint(self->items, self->a_items);
-
-    item_y = 0;
-    for (it = self->entries; it; it = it->next) {
-        ((MenuEntry*)it->data)->y = item_y;
-        menu_entry_render(it->data);
-        item_y += self->item_h;
-    }
+    self->client = client;
 
     if (!self->shown) {
         stacking_raise_internal(self->frame);
index 32944b79a763d4fc54613e10bffbfaf3de1ba81d..1c1b31d98f094324eba00434d53cef90f15133b0 100644 (file)
@@ -101,4 +101,6 @@ void menu_entry_render(MenuEntry *self);
 
 void menu_entry_fire(MenuEntry *self);
 
+void menu_render(Menu *self);
+
 #endif
diff --git a/openbox/menu_render.c b/openbox/menu_render.c
new file mode 100644 (file)
index 0000000..1e57d12
--- /dev/null
@@ -0,0 +1,72 @@
+// Functions for default rendering of menus. Might become pluginnable
+
+#include "menu.h"
+#include "openbox.h"
+#include "render/theme.h"
+
+void menu_render(Menu *self) {
+    GList *it;
+    int items_h;
+    int nitems = 0; /* each item, only one is used */
+    int item_y;
+
+    self->width = 1;
+    self->item_h = 0;
+
+    /* set texture data and size them mofos out */
+    self->a_title->texture[0].data.text.string = self->label;
+    appearance_minsize(self->a_title, &self->title_min_w, &self->title_h);
+    self->title_min_w += theme_bevel * 2;
+    self->title_h += theme_bevel * 2;
+    self->width = MAX(self->width, self->title_min_w);
+
+    for (it = self->entries; it; it = it->next) {
+        MenuEntry *e = it->data;
+        int h;
+
+        e->a_item->texture[0].data.text.string = e->label;
+        appearance_minsize(e->a_item, &e->min_w, &self->item_h);
+        self->width = MAX(self->width, e->min_w);
+
+        e->a_disabled->texture[0].data.text.string = e->label;
+        appearance_minsize(e->a_disabled, &e->min_w, &h);
+        self->item_h = MAX(self->item_h, h);
+        self->width = MAX(self->width, e->min_w);
+
+        e->a_hilite->texture[0].data.text.string = e->label;
+        appearance_minsize(e->a_hilite, &e->min_w, &h);
+        self->item_h = MAX(self->item_h, h);
+        self->width = MAX(self->width, e->min_w);
+
+        e->min_w += theme_bevel * 2;
+        ++nitems;
+    }
+    self->bullet_w = self->item_h + theme_bevel;
+    self->width += 2 * self->bullet_w;
+    self->item_h += theme_bevel * 2;
+    items_h = self->item_h * nitems;
+
+    RECT_SET(self->a_title->area, 0, 0, self->width, self->title_h);
+    RECT_SET(self->a_title->texture[0].position, 0, 0, self->width,
+             self->title_h);
+    RECT_SET(self->a_items->area, 0, 0, self->width, items_h);
+
+    XResizeWindow(ob_display, self->frame, self->width, 
+                  self->title_h + items_h);
+    XMoveResizeWindow(ob_display, self->title, -theme_bwidth, -theme_bwidth,
+                      self->width, self->title_h);
+    XMoveResizeWindow(ob_display, self->items, 0, self->title_h + theme_bwidth,
+                      self->width, items_h);
+
+    paint(self->title, self->a_title);
+    paint(self->items, self->a_items);
+
+    item_y = 0;
+    for (it = self->entries; it; it = it->next) {
+        ((MenuEntry*)it->data)->y = item_y;
+        menu_entry_render(it->data);
+        item_y += self->item_h;
+    }
+
+    self->invalid = FALSE;
+}
This page took 0.026367 seconds and 4 git commands to generate.