X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenu.c;h=c41110184429ef9a02735a8c85b15dac81c6f28f;hb=780d1b0961e2eed5fea4645b4398fafb4adad73a;hp=344e1a5a1ea49b2ac97cfadcbac13d2fed1ff133;hpb=6a79805b7c4116ee6ced87e78fb488f3274098ef;p=chaz%2Fopenbox diff --git a/openbox/menu.c b/openbox/menu.c index 344e1a5a..c4111018 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -22,8 +22,10 @@ #include "openbox.h" #include "mainloop.h" #include "stacking.h" +#include "grab.h" #include "client.h" #include "config.h" +#include "actions.h" #include "screen.h" #include "menuframe.h" #include "keyboard.h" @@ -263,8 +265,7 @@ static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, for (node = node->children; node; node = node->next) if (!xmlStrcasecmp(node->name, (const xmlChar*) "action")) { - ObAction *a = action_parse - (i, doc, node, OB_USER_ACTION_MENU_SELECTION); + ObActionsAct *a = actions_parse(i, doc, node); if (a) acts = g_slist_append(acts, a); } @@ -411,8 +412,8 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client) ObMenu *self; ObMenuFrame *frame; - if (!(self = menu_from_name(name)) - || keyboard_interactively_grabbed()) return; + if (!(self = menu_from_name(name)) || + grab_on_keyboard() || grab_on_pointer()) return; /* if the requested menu is already the top visible menu, then don't bother */ @@ -424,33 +425,39 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client) menu_frame_hide_all(); + /* clear the pipe menus when showing a new menu */ + menu_clear_pipe_caches(); + frame = menu_frame_new(self, 0, client); if (!menu_frame_show_topmenu(frame, x, y, button)) menu_frame_free(frame); - else if (!button) { - /* select the first entry if it's not a submenu and we opened - * the menu with the keyboard, and skip all headers */ - GList *it = frame->entries; - while (it) { - ObMenuEntryFrame *e = it->data; - if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) { - menu_frame_select(frame, e, FALSE); - break; - } else if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR) - it = g_list_next(it); - else - break; + else { + if (!button) { + /* select the first entry if it's not a submenu and we opened + * the menu with the keyboard, and skip all headers */ + GList *it = frame->entries; + while (it) { + ObMenuEntryFrame *e = it->data; + if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) { + menu_frame_select(frame, e, FALSE); + break; + } else if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR) + it = g_list_next(it); + else + break; + } } - } - if (!button) - menu_can_hide = TRUE; - else { - menu_can_hide = FALSE; - ob_main_loop_timeout_add(ob_main_loop, - config_menu_hide_delay * 1000, - menu_hide_delay_func, - NULL, g_direct_equal, NULL); + /* reset the hide timer */ + if (!button) + menu_can_hide = TRUE; + else { + menu_can_hide = FALSE; + ob_main_loop_timeout_add(ob_main_loop, + config_menu_hide_delay * 1000, + menu_hide_delay_func, + NULL, g_direct_equal, NULL); + } } } @@ -495,7 +502,7 @@ void menu_entry_unref(ObMenuEntry *self) case OB_MENU_ENTRY_TYPE_NORMAL: g_free(self->data.normal.label); while (self->data.normal.actions) { - action_unref(self->data.normal.actions->data); + actions_act_unref(self->data.normal.actions->data); self->data.normal.actions = g_slist_delete_link(self->data.normal.actions, self->data.normal.actions);