summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/menu.c1
-rw-r--r--openbox/menuframe.c28
-rw-r--r--openbox/openbox.c5
-rw-r--r--openbox/prop.c1
-rw-r--r--openbox/screen.c1
-rw-r--r--render/color.c2
-rw-r--r--render/font.c2
-rw-r--r--render/theme.c13
8 files changed, 48 insertions, 5 deletions
diff --git a/openbox/menu.c b/openbox/menu.c
index 4ffcca0d..2847b508 100644
--- a/openbox/menu.c
+++ b/openbox/menu.c
@@ -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);
}
}
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);
diff --git a/openbox/openbox.c b/openbox/openbox.c
index 165d7229..8e61fa86 100644
--- a/openbox/openbox.c
+++ b/openbox/openbox.c
@@ -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) {
diff --git a/openbox/prop.c b/openbox/prop.c
index 186cc133..b3349e32 100644
--- a/openbox/prop.c
+++ b/openbox/prop.c
@@ -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)
diff --git a/openbox/screen.c b/openbox/screen.c
index ac0889bf..f80f0c2d 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -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) {
diff --git a/render/color.c b/render/color.c
index d16bbf0c..37ef5532 100644
--- a/render/color.c
+++ b/render/color.c
@@ -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);
}
diff --git a/render/font.c b/render/font.c
index 94d9fa2d..a099c093 100644
--- a/render/font.c
+++ b/render/font.c
@@ -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;
}
diff --git a/render/theme.c b/render/theme.c
index 26f67c4d..2db767e6 100644
--- a/render/theme.c
+++ b/render/theme.c
@@ -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);