Esempio n. 1
0
void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state)
{
    if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
        self->entry->data.normal.enabled)
    {
        /* grab all this shizzle, cuz when the menu gets hidden, 'self'
           gets freed */
        ObMenuEntry *entry = self->entry;
        ObMenuExecuteFunc func = self->frame->menu->execute_func;
        gpointer data = self->frame->menu->data;
        GSList *acts = self->entry->data.normal.actions;
        ObClient *client = self->frame->client;
        ObMenuFrame *frame = self->frame;
        guint mods = obt_keyboard_only_modmasks(state);

        /* release grabs before executing the shit */
        if (!(mods & ControlMask)) {
            event_cancel_all_key_grabs();
            frame = NULL;
        }

        if (func)
            func(entry, frame, client, state, data);
        else
            actions_run_acts(acts, OB_USER_ACTION_MENU_SELECTION,
                             state, -1, -1, 0, OB_FRAME_CONTEXT_NONE, client);
    }
}
Esempio n. 2
0
gboolean prompt_key_event(ObPrompt *self, XEvent *e)
{
    gboolean shift;
    guint shift_mask, mods;
    KeySym sym;

    if (e->type != KeyPress) return FALSE;

    shift_mask = obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT);
    mods = obt_keyboard_only_modmasks(e->xkey.state);
    shift = !!(mods & shift_mask);

    /* only accept shift */
    if (mods != 0 && mods != shift_mask)
        return FALSE;

    sym = obt_keyboard_keypress_to_keysym(e);

    if (sym == XK_Escape)
        prompt_cancel(self);
    else if (sym == XK_Return || sym == XK_KP_Enter || sym == XK_space)
        prompt_run_callback(self, self->focus->result);
    else if (sym == XK_Tab || sym == XK_Left || sym == XK_Right) {
        gint i;
        gboolean left;
        ObPromptElement *oldfocus;

        left = (sym == XK_Left) || ((sym == XK_Tab) && shift);
        oldfocus = self->focus;

        for (i = 0; i < self->n_buttons; ++i)
            if (self->focus == &self->button[i]) break;
        i += (left ? -1 : 1);
        if (i < 0) i = self->n_buttons - 1;
        else if (i >= self->n_buttons) i = 0;
        self->focus = &self->button[i];

        if (oldfocus != self->focus) render_button(self, oldfocus);
        render_button(self, self->focus);
    }
    return TRUE;
}