summaryrefslogtreecommitdiff
path: root/openbox/menuframe.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-08-28 19:10:36 +0000
committerDana Jansens <danakj@orodu.net>2003-08-28 19:10:36 +0000
commit700e551390a86ffdb92ddc061914ec7687658d18 (patch)
treef896dc0c68f12503e17fd13dad3615242fb7f87d /openbox/menuframe.c
parent5baa7c802a500ee30fe9719f226d88923ee6e59d (diff)
fix a bunch of memleaks from valgrind and stuff
Diffstat (limited to 'openbox/menuframe.c')
-rw-r--r--openbox/menuframe.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index 56dbc647..6615660d 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -170,6 +170,8 @@ void menu_frame_move_on_screen(ObMenuFrame *self)
for (f = self; f; f = f->parent)
menu_frame_move(f, f->area.x + dx, f->area.y + dy);
+ for (f = self->child; f; f = f->child)
+ menu_frame_move(f, f->area.x + dx, f->area.y + dy);
XWarpPointer(ob_display, None, None, 0, 0, 0, 0, dx, dy);
}
}
@@ -424,6 +426,11 @@ static void menu_frame_update(ObMenuFrame *self)
void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
{
+ GList *it;
+
+ if (g_list_find(menu_frame_visible, self))
+ return;
+
if (parent) {
if (parent->child)
menu_frame_hide(parent->child);
@@ -437,14 +444,20 @@ void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
grab_keyboard(TRUE);
}
- if (!g_list_find(menu_frame_visible, self)) {
- menu_frame_visible = g_list_prepend(menu_frame_visible, self);
-
+ /* determine if the underlying menu is already visible */
+ for (it = menu_frame_visible; it; it = g_list_next(it)) {
+ ObMenuFrame *f = it->data;
+ if (f->menu == self->menu)
+ break;
+ }
+ if (!it) {
if (self->menu->update_func)
self->menu->update_func(self, self->menu->data);
- menu_frame_update(self);
}
+ menu_frame_visible = g_list_prepend(menu_frame_visible, self);
+ menu_frame_update(self);
+
menu_frame_move_on_screen(self);
XMapWindow(ob_display, self->window);
@@ -452,7 +465,12 @@ void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
void menu_frame_hide(ObMenuFrame *self)
{
- menu_frame_visible = g_list_remove(menu_frame_visible, self);
+ GList *it = g_list_find(menu_frame_visible, self);
+
+ if (!it)
+ return;
+
+ menu_frame_visible = g_list_delete_link(menu_frame_visible, it);
if (self->child)
menu_frame_hide(self->child);