free menuframes when they fail to show themselves
This commit is contained in:
parent
4b0e4af80a
commit
b49b7c415c
3 changed files with 21 additions and 8 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue