free menuframes when they fail to show themselves

This commit is contained in:
Dana Jansens 2003-10-11 06:47:11 +00:00
parent 4b0e4af80a
commit b49b7c415c
3 changed files with 21 additions and 8 deletions

View file

@ -287,6 +287,14 @@ void menu_show(gchar *name, gint x, gint y, ObClient *client)
if (!(self = menu_from_name(name))) return;
/* if the requested menu is already the top visible menu, then don't
bother */
if (menu_frame_visible) {
frame = menu_frame_visible->data;
if (frame->menu == self)
return;
}
menu_frame_hide_all();
frame = menu_frame_new(self, client);
@ -297,9 +305,12 @@ void menu_show(gchar *name, gint x, gint y, ObClient *client)
else
menu_frame_move(frame,
x - ob_rr_theme->bwidth, y - ob_rr_theme->bwidth);
menu_frame_show(frame, NULL);
if (frame->entries)
menu_frame_select_next(frame);
if (!menu_frame_show(frame, NULL)) {
menu_frame_free(frame);
} else {
if (frame->entries)
menu_frame_select_next(frame);
}
}
static ObMenuEntry* menu_entry_new(ObMenu *menu, ObMenuEntryType type, gint id)

View file

@ -584,20 +584,20 @@ static void menu_frame_update(ObMenuFrame *self)
menu_frame_render(self);
}
void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
gboolean menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
{
GList *it;
if (g_list_find(menu_frame_visible, self))
return;
return TRUE;
if (menu_frame_visible == NULL) {
/* no menus shown yet */
if (!grab_pointer(TRUE, OB_CURSOR_NONE))
return;
return FALSE;
if (!grab_keyboard(TRUE)) {
grab_pointer(FALSE, OB_CURSOR_NONE);
return;
return FALSE;
}
}
@ -626,6 +626,8 @@ void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
menu_frame_move_on_screen(self);
XMapWindow(ob_display, self->window);
return TRUE;
}
void menu_frame_hide(ObMenuFrame *self)

View file

@ -103,7 +103,7 @@ void menu_frame_free(ObMenuFrame *self);
void menu_frame_move(ObMenuFrame *self, gint x, gint y);
void menu_frame_move_on_screen(ObMenuFrame *self);
void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent);
gboolean menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent);
void menu_frame_hide(ObMenuFrame *self);
void menu_frame_hide_all();