Ejemplo n.º 1
0
static void
grab_key (SugarKeyGrabber *grabber, Key *key, gboolean grab)
{
        int indexes[N_BITS];/*indexes of bits we need to flip*/
        int i, bit, bits_set_cnt;
        int uppervalue;
        guint mask_to_traverse = IGNORED_MODS & ~key->state & GDK_MODIFIER_MASK;

        bit = 0;
        for (i = 0; i < N_BITS; i++) {
                if (mask_to_traverse & (1<<i))
                        indexes[bit++]=i;
        }

        bits_set_cnt = bit;

        uppervalue = 1<<bits_set_cnt;
        for (i = 0; i < uppervalue; i++) {
                int j, result = 0;

                for (j = 0; j < bits_set_cnt; j++) {
                        if (i & (1<<j))
                                result |= (1<<indexes[j]);
                }

                grab_key_real (key, grabber->root, grab, result);
        }
}
Ejemplo n.º 2
0
void
grab_key_unsafe (Key                 *key,
                 gboolean             grab,
                 GSList              *screens)
{
        int   indexes[N_BITS]; /* indexes of bits we need to flip */
        int   i;
        int   bit;
        int   bits_set_cnt;
        int   uppervalue;
        guint mask;

        setup_modifiers ();

        mask = msd_ignored_mods & ~key->state & GDK_MODIFIER_MASK;

        bit = 0;
        /* store the indexes of all set bits in mask in the array */
        for (i = 0; mask; ++i, mask >>= 1) {
                if (mask & 0x1) {
                        indexes[bit++] = i;
                }
        }

        bits_set_cnt = bit;

        uppervalue = 1 << bits_set_cnt;
        /* grab all possible modifier combinations for our mask */
        for (i = 0; i < uppervalue; ++i) {
                GSList *l;
                int     j;
                int     result = 0;

                /* map bits in the counter to those in the mask */
                for (j = 0; j < bits_set_cnt; ++j) {
                        if (i & (1 << j)) {
                                result |= (1 << indexes[j]);
                        }
                }

                for (l = screens; l; l = l->next) {
                        GdkScreen *screen = l->data;
                        guint *code;

                        for (code = key->keycodes; *code; ++code) {
                                grab_key_real (*code,
                                               gdk_screen_get_root_window (screen),
                                               grab,
                                               result | key->state);
                        }
                }
        }
}
Ejemplo n.º 3
0
void
grab_key_unsafe (Key                 *key,
                 gboolean             grab,
                 GSList              *screens)
{
        int     indexes[N_BITS]; /* indexes of bits we need to flip */
        int     i;
        int     bit;
        int     bits_set_cnt;
        int     uppervalue;
        guint   mask, modifiers;
        GArray *all_mods;
        GSList *l;

        setup_modifiers ();

        mask = gsd_ignored_mods & ~key->state & GDK_MODIFIER_MASK;

        /* XGrabKey requires real modifiers, not virtual ones */
        modifiers = key->state;
        gdk_keymap_map_virtual_modifiers (gdk_keymap_get_default (), &modifiers);

        /* If key doesn't have a usable modifier, we don't want
         * to grab it, since the user might lose a useful key.
         *
         * The exception is the XFree86 keys and the Function keys
         * (which are useful to grab without a modifier).
         */
        if ((modifiers & gsd_used_mods) == 0 &&
            !IN_RANGE(key->keysym, XF86KEYS_RANGE_MIN, XF86KEYS_RANGE_MAX) &&
            !IN_RANGE(key->keysym, FKEYS_RANGE_MIN, FKEYS_RANGE_MAX) &&
             key->keysym != GDK_KEY_Pause &&
             key->keysym != GDK_KEY_Print) {
                GString *keycodes;

                keycodes = g_string_new ("");
                if (key->keycodes != NULL) {
                        guint *c;

                        for (c = key->keycodes; *c; ++c) {
                                g_string_printf (keycodes, " %u", *c);
                        }
                }
                g_warning ("Key 0x%x (keycodes: %s)  with state 0x%x (resolved to 0x%x) "
                           " has no usable modifiers (usable modifiers are 0x%x)",
                           key->keysym, keycodes->str, key->state, modifiers, gsd_used_mods);
                g_string_free (keycodes, TRUE);

                return;
        }

        bit = 0;
        /* store the indexes of all set bits in mask in the array */
        for (i = 0; mask; ++i, mask >>= 1) {
                if (mask & 0x1) {
                        indexes[bit++] = i;
                }
        }

        bits_set_cnt = bit;

	all_mods = g_array_new (FALSE, TRUE, sizeof(XIGrabModifiers));
        uppervalue = 1 << bits_set_cnt;
        /* store all possible modifier combinations for our mask into all_mods */
        for (i = 0; i < uppervalue; ++i) {
                int     j;
                int     result = 0;
                XIGrabModifiers *mod;

                /* map bits in the counter to those in the mask */
                for (j = 0; j < bits_set_cnt; ++j) {
                        if (i & (1 << j)) {
                                result |= (1 << indexes[j]);
                        }
                }

                /* Grow the array by one, to fit our new XIGrabModifiers item */
                g_array_set_size (all_mods, all_mods->len + 1);
                mod = &g_array_index (all_mods, XIGrabModifiers, all_mods->len - 1);
                mod->modifiers = result | modifiers;
        }

	/* Capture the actual keycodes with the modifier array */
        for (l = screens; l; l = l->next) {
                GdkScreen *screen = l->data;
                guint *code;

                for (code = key->keycodes; *code; ++code) {
                        grab_key_real (*code,
                                       gdk_screen_get_root_window (screen),
                                       grab,
                                       (XIGrabModifiers *) all_mods->data,
                                       all_mods->len);
                }
        }
        g_array_free (all_mods, TRUE);
}