void menu_show(gchar *name, gint x, gint y, gboolean mouse, ObClient *client) { ObMenu *self; ObMenuFrame *frame; 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 */ if (menu_frame_visible) { frame = menu_frame_visible->data; if (frame->menu == self) return; } 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, mouse)) menu_frame_free(frame); else { if (!mouse) { /* 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; } } /* reset the hide timer */ if (!mouse) menu_can_hide = TRUE; else { menu_can_hide = FALSE; obt_main_loop_timeout_add(ob_main_loop, config_menu_hide_delay * 1000, menu_hide_delay_func, NULL, g_direct_equal, NULL); } } }
void grab_key_passive_count(int change) { if (grab_on_keyboard()) return; passive_count += change; if (passive_count < 0) passive_count = 0; }