示例#1
0
static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
                         ObClient *c, guint state, gpointer data)
{
    if (self->id == ADD_DESKTOP) {
        screen_add_desktop(FALSE);
        menu_frame_hide_all();
    }
    else if (self->id == REMOVE_DESKTOP) {
        screen_remove_desktop(FALSE);
        menu_frame_hide_all();
    }
    else {
        ObClient *t = self->data.normal.data;
        if (t) { /* it's set to NULL if its destroyed */
            gboolean here = state & ShiftMask;

            if (state & ShiftMask) {
                client_close(t);
                self->data.normal.enabled = FALSE;
            }
            else {
                client_activate(t, TRUE, here, TRUE, TRUE, TRUE);

                /* if the window is omnipresent then we need to go to its
                   desktop */
                if (!here && t->desktop == DESKTOP_ALL)
                    screen_set_desktop(self->id, FALSE);
            }
        }
        else
            screen_set_desktop(self->id, TRUE);
    }
}
示例#2
0
static void self_execute(ObMenuEntry *self, ObMenuFrame *f,
                         ObClient *c, guint state, gpointer data)
{
    if (self->id == ADD_DESKTOP) {
        screen_add_desktop(FALSE);
        menu_frame_hide_all();
    }
    else if (self->id == REMOVE_DESKTOP) {
        screen_remove_desktop(FALSE);
        menu_frame_hide_all();
    }
}
示例#3
0
文件: menu.c 项目: deters/openbox
static void menu_destroy_hash_value(ObMenu *self)
{
    /* make sure its not visible */
    {
        GList *it;
        ObMenuFrame *f;

        for (it = menu_frame_visible; it; it = g_list_next(it)) {
            f = it->data;
            if (f->menu == self)
                menu_frame_hide_all();
        }
    }

    if (self->destroy_func)
        self->destroy_func(self, self->data);

    menu_clear_entries(self);
    g_free(self->name);
    g_free(self->title);
    g_free(self->execute);
    g_slice_free(ObMenu, self->more_menu);

    g_slice_free(ObMenu, self);
}
示例#4
0
文件: menu.c 项目: deters/openbox
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);
        }
    }
}
示例#5
0
文件: menu.c 项目: deters/openbox
void menu_shutdown(gboolean reconfig)
{
    obt_xml_instance_unref(menu_parse_inst);
    menu_parse_inst = NULL;

    client_list_menu_shutdown(reconfig);
    client_list_combined_menu_shutdown(reconfig);

    menu_frame_hide_all();
    g_hash_table_destroy(menu_hash);
    menu_hash = NULL;
}