fix a bunch of memleaks from valgrind and stuff
authorDana Jansens <danakj@orodu.net>
Thu, 28 Aug 2003 19:10:36 +0000 (19:10 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 28 Aug 2003 19:10:36 +0000 (19:10 +0000)
openbox/menu.c
openbox/menuframe.c
openbox/openbox.c
openbox/prop.c
openbox/screen.c
render/color.c
render/font.c
render/theme.c

index 4ffcca0..2847b50 100644 (file)
@@ -190,6 +190,7 @@ void menu_parse()
         parse_register(menu_parse_inst, "separator",
                        parse_menu_separator, &parse_state);
         parse_tree(menu_parse_inst, doc, node->xmlChildrenNode);
+        xmlFreeDoc(doc);
     }
 }
 
index 56dbc64..6615660 100644 (file)
@@ -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);
index 165d722..8e61fa8 100644 (file)
@@ -235,6 +235,7 @@ int main(int argc, char **argv)
         if (parse_load_rc(&doc, &node))
             parse_tree(i, doc, node->xmlChildrenNode);
         /* we're done with parsing now, kill it */
+        xmlFreeDoc(doc);
         parse_shutdown(i);
 
         menu_parse();
@@ -291,6 +292,10 @@ int main(int argc, char **argv)
     session_shutdown();
     g_free(ob_sm_id);
 
+#ifdef USE_LIBSN
+    sn_display_unref(ob_sn_display);
+#endif
+
     XCloseDisplay(ob_display);
 
     if (restart) {
index 186cc13..b3349e3 100644 (file)
@@ -392,6 +392,7 @@ void prop_set_strings_utf8(Window win, Atom prop, char **strs)
     }
     XChangeProperty(ob_display, win, prop, prop_atoms.utf8, 8,
                     PropModeReplace, (guchar*)str->str, str->len);
+    g_string_free(str, TRUE);
 }
 
 void prop_erase(Window win, Atom prop)
index ac0889b..f80f0c2 100644 (file)
@@ -67,6 +67,7 @@ static gboolean replace_wm()
 
     wm_sn = g_strdup_printf("WM_S%d", ob_screen);
     wm_sn_atom = XInternAtom(ob_display, wm_sn, FALSE);
+    g_free(wm_sn);
 
     current_wm_sn_owner = XGetSelectionOwner(ob_display, wm_sn_atom);
     if (current_wm_sn_owner) {
index d16bbf0..37ef553 100644 (file)
@@ -59,6 +59,8 @@ RrColor *RrColorNew(const RrInstance *inst, gint r, gint g, gint b)
 void RrColorFree(RrColor *c)
 {
     if (c) {
+        if (c->pixel) XFreeColors(RrDisplay(c->inst), RrColormap(c->inst),
+                                  &c->pixel, 1, 0);
         if (c->gc) XFreeGC(RrDisplay(c->inst), c->gc);
         g_free(c);
     }
index 94d9fa2..a099c09 100644 (file)
@@ -226,5 +226,7 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
     XftDrawStringUtf8(d, &c, t->font->xftfont, x,
                       t->font->xftfont->ascent + y,
                       (FcChar8*)text->str, l);
+
+    g_string_free(text, TRUE);
     return;
 }
index 26f67c4..2db767e 100644 (file)
@@ -506,14 +506,20 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
                          "window.button.toggled.focus",
                         theme->a_toggled_focused_max,
                          TRUE))
+    {
+        RrAppearanceFree(theme->a_toggled_focused_max);
         theme->a_toggled_focused_max =
             RrAppearanceCopy(theme->a_focused_pressed_max);
+    }
     if (!read_appearance(db, inst,
                          "window.button.toggled.unfocus",
                         theme->a_toggled_unfocused_max,
                          TRUE))
+    {
+        RrAppearanceFree(theme->a_toggled_unfocused_max);
         theme->a_toggled_unfocused_max =
             RrAppearanceCopy(theme->a_unfocused_pressed_max);
+    }
     if (!read_appearance(db, inst,
                          "window.button.focus",
                         theme->a_focused_unpressed_max,
@@ -528,14 +534,20 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
                          "window.button.hover.focus",
                         theme->a_hover_focused_max,
                          TRUE))
+    {
+        RrAppearanceFree(theme->a_hover_focused_max);
         theme->a_hover_focused_max =
             RrAppearanceCopy(theme->a_focused_unpressed_max);
+    }
     if (!read_appearance(db, inst,
                          "window.button.hover.unfocus",
                         theme->a_hover_unfocused_max,
                          TRUE))
+    {
+        RrAppearanceFree(theme->a_hover_unfocused_max);
         theme->a_hover_unfocused_max =
             RrAppearanceCopy(theme->a_unfocused_unpressed_max);
+    }
 
     theme->a_disabled_focused_close =
         RrAppearanceCopy(theme->a_disabled_focused_max);
@@ -877,6 +889,7 @@ void RrThemeFree(RrTheme *theme)
         RrColorFree(theme->menu_title_color);
         RrColorFree(theme->menu_disabled_color);
         RrColorFree(theme->menu_hilite_color);
+        RrColorFree(theme->menu_bullet_color);
 
         RrPixmapMaskFree(theme->max_mask);
         RrPixmapMaskFree(theme->max_toggled_mask);