Experimental support for Shift handling.
This commit is contained in:
		@ -53,6 +53,8 @@ G_DEFINE_TYPE_WITH_CODE (EekClutterKeyboard, eek_clutter_keyboard,
 | 
				
			|||||||
struct _EekClutterKeyboardPrivate
 | 
					struct _EekClutterKeyboardPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSimpleKeyboard *simple;
 | 
					    EekSimpleKeyboard *simple;
 | 
				
			||||||
 | 
					    gint group;
 | 
				
			||||||
 | 
					    gint level;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -61,7 +63,6 @@ eek_clutter_keyboard_real_set_bounds (EekKeyboard *self,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fflush (stdout);
 | 
					 | 
				
			||||||
    g_return_if_fail (priv);
 | 
					    g_return_if_fail (priv);
 | 
				
			||||||
    eek_keyboard_set_bounds (EEK_KEYBOARD(priv->simple), bounds);
 | 
					    eek_keyboard_set_bounds (EEK_KEYBOARD(priv->simple), bounds);
 | 
				
			||||||
    clutter_actor_set_position (CLUTTER_ACTOR(self), bounds->x, bounds->y);
 | 
					    clutter_actor_set_position (CLUTTER_ACTOR(self), bounds->x, bounds->y);
 | 
				
			||||||
@ -78,6 +79,46 @@ eek_clutter_keyboard_real_get_bounds (EekKeyboard *self,
 | 
				
			|||||||
    return eek_keyboard_get_bounds (EEK_KEYBOARD(priv->simple), bounds);
 | 
					    return eek_keyboard_get_bounds (EEK_KEYBOARD(priv->simple), bounds);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					eek_clutter_keyboard_real_set_keysym_index (EekKeyboard *self,
 | 
				
			||||||
 | 
					                                            gint         group,
 | 
				
			||||||
 | 
					                                            gint         level)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
 | 
					    gint num_sections, num_keys, i, j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail (priv);
 | 
				
			||||||
 | 
					    priv->group = group;
 | 
				
			||||||
 | 
					    priv->level = level;
 | 
				
			||||||
 | 
					    num_sections = clutter_group_get_n_children (CLUTTER_GROUP(self));
 | 
				
			||||||
 | 
					    for (i = 0; i < num_sections; i++) {
 | 
				
			||||||
 | 
					        ClutterActor *section;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        section = clutter_group_get_nth_child (CLUTTER_GROUP(self), i);
 | 
				
			||||||
 | 
					        g_return_if_fail (EEK_IS_CLUTTER_SECTION(section));
 | 
				
			||||||
 | 
					        num_keys = clutter_group_get_n_children (CLUTTER_GROUP(section));
 | 
				
			||||||
 | 
					        for (j = 0; j < num_keys; j++) {
 | 
				
			||||||
 | 
					            ClutterActor *key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            key = clutter_group_get_nth_child (CLUTTER_GROUP(section), j);
 | 
				
			||||||
 | 
					            g_return_if_fail (EEK_IS_CLUTTER_KEY(key));
 | 
				
			||||||
 | 
					            eek_key_set_keysym_index (EEK_KEY(key), group, level);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					eek_clutter_keyboard_real_get_keysym_index (EekKeyboard *self,
 | 
				
			||||||
 | 
					                                            gint        *group,
 | 
				
			||||||
 | 
					                                            gint        *level)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail (priv);
 | 
				
			||||||
 | 
					    *group = priv->group;
 | 
				
			||||||
 | 
					    *level = priv->level;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static EekSection *
 | 
					static EekSection *
 | 
				
			||||||
eek_clutter_keyboard_real_create_section (EekKeyboard *self,
 | 
					eek_clutter_keyboard_real_create_section (EekKeyboard *self,
 | 
				
			||||||
                                          const gchar *name,
 | 
					                                          const gchar *name,
 | 
				
			||||||
@ -134,6 +175,8 @@ eek_keyboard_iface_init (EekKeyboardIface *iface)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    iface->set_bounds = eek_clutter_keyboard_real_set_bounds;
 | 
					    iface->set_bounds = eek_clutter_keyboard_real_set_bounds;
 | 
				
			||||||
    iface->get_bounds = eek_clutter_keyboard_real_get_bounds;
 | 
					    iface->get_bounds = eek_clutter_keyboard_real_get_bounds;
 | 
				
			||||||
 | 
					    iface->set_keysym_index = eek_clutter_keyboard_real_set_keysym_index;
 | 
				
			||||||
 | 
					    iface->get_keysym_index = eek_clutter_keyboard_real_get_keysym_index;
 | 
				
			||||||
    iface->create_section = eek_clutter_keyboard_real_create_section;
 | 
					    iface->create_section = eek_clutter_keyboard_real_create_section;
 | 
				
			||||||
    iface->foreach_section = eek_clutter_keyboard_real_foreach_section;
 | 
					    iface->foreach_section = eek_clutter_keyboard_real_foreach_section;
 | 
				
			||||||
    iface->set_layout = eek_clutter_keyboard_real_set_layout;
 | 
					    iface->set_layout = eek_clutter_keyboard_real_set_layout;
 | 
				
			||||||
@ -227,6 +270,38 @@ eek_clutter_keyboard_class_init (EekClutterKeyboardClass *klass)
 | 
				
			|||||||
                                      "bounds");
 | 
					                                      "bounds");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					on_event (ClutterActor *actor,
 | 
				
			||||||
 | 
						  ClutterEvent *event,
 | 
				
			||||||
 | 
						  gpointer      user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
 | 
					    EekKey *key;
 | 
				
			||||||
 | 
					    ClutterActor *source;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_val_if_fail (EEK_IS_KEYBOARD(user_data), FALSE);
 | 
				
			||||||
 | 
					    keyboard = EEK_KEYBOARD(user_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    source = clutter_event_get_source (event);
 | 
				
			||||||
 | 
					    if (!EEK_IS_KEY(source))
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					    key = EEK_KEY(source);
 | 
				
			||||||
 | 
					    if (event->type == CLUTTER_BUTTON_PRESS) {
 | 
				
			||||||
 | 
					        guint keysym;
 | 
				
			||||||
 | 
					        gint group, level;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        keysym = eek_key_get_keysym (EEK_KEY(source));
 | 
				
			||||||
 | 
					        if (keysym == 0xFFE1 || keysym == 0xFFE2) {
 | 
				
			||||||
 | 
					            eek_keyboard_get_keysym_index (keyboard, &group, &level);
 | 
				
			||||||
 | 
					            if (level == 0)
 | 
				
			||||||
 | 
					                eek_keyboard_set_keysym_index (keyboard, group, 1);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                eek_keyboard_set_keysym_index (keyboard, group, 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_clutter_keyboard_init (EekClutterKeyboard *self)
 | 
					eek_clutter_keyboard_init (EekClutterKeyboard *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -234,6 +309,10 @@ eek_clutter_keyboard_init (EekClutterKeyboard *self)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    priv = self->priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
 | 
					    priv = self->priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
    priv->simple = g_object_new (EEK_TYPE_SIMPLE_KEYBOARD, NULL);
 | 
					    priv->simple = g_object_new (EEK_TYPE_SIMPLE_KEYBOARD, NULL);
 | 
				
			||||||
 | 
					    priv->group = priv->level = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clutter_actor_set_reactive (CLUTTER_ACTOR(self), TRUE);
 | 
				
			||||||
 | 
					    g_signal_connect (self, "event", G_CALLBACK(on_event), self);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
@ -355,10 +355,10 @@ eek_key_set_keysym_index (EekKey *key,
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * eek_key_get_keysym_index:
 | 
					 * eek_key_get_keysym_index:
 | 
				
			||||||
 * @key: an #EekKey
 | 
					 * @key: an #EekKey
 | 
				
			||||||
 * @group: a pointer to row index of the symbol matrix #EekKey:keysyms
 | 
					 * @group: a pointer where row index of the symbol matrix #EekKey:keysyms
 | 
				
			||||||
 * to be stored
 | 
					 * will be stored
 | 
				
			||||||
 * @level: a pointer to column index of the symbol matrix
 | 
					 * @level: a pointer where column index of the symbol matrix
 | 
				
			||||||
 * #EekKey:keysyms to be stored
 | 
					 * #EekKey:keysyms will be stored
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Get the current cell position of the symbol matrix of @key.
 | 
					 * Get the current cell position of the symbol matrix of @key.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
				
			|||||||
@ -116,6 +116,48 @@ eek_keyboard_get_bounds (EekKeyboard *keyboard,
 | 
				
			|||||||
    return (*iface->get_bounds) (keyboard, bounds);
 | 
					    return (*iface->get_bounds) (keyboard, bounds);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * eek_keyboard_set_keysym_index:
 | 
				
			||||||
 | 
					 * @keyboard: an #EekKeyboard
 | 
				
			||||||
 | 
					 * @group: row index of the symbol matrix of keys on @keyboard
 | 
				
			||||||
 | 
					 * @level: column index of the symbol matrix of keys on @keyboard
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Select a cell of the symbol matrix of each key on @keyboard.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					eek_keyboard_set_keysym_index (EekKeyboard *self,
 | 
				
			||||||
 | 
					                               gint         group,
 | 
				
			||||||
 | 
					                               gint         level)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail (iface);
 | 
				
			||||||
 | 
					    g_return_if_fail (iface->set_keysym_index);
 | 
				
			||||||
 | 
					    (*iface->set_keysym_index) (self, group, level);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * eek_keyboard_set_keysym_index:
 | 
				
			||||||
 | 
					 * @keyboard: an #EekKeyboard
 | 
				
			||||||
 | 
					 * @group: a pointer where row index of the symbol matrix of keys on
 | 
				
			||||||
 | 
					 * @keyboard will be stored
 | 
				
			||||||
 | 
					 * @level: a pointer where column index of the symbol matrix of keys
 | 
				
			||||||
 | 
					 * on @keyboard will be stored
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Get the current cell position of the symbol matrix of each key on @keyboard.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					eek_keyboard_get_keysym_index (EekKeyboard *self,
 | 
				
			||||||
 | 
					                               gint        *group,
 | 
				
			||||||
 | 
					                               gint        *level)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail (iface);
 | 
				
			||||||
 | 
					    g_return_if_fail (iface->get_keysym_index);
 | 
				
			||||||
 | 
					    return (*iface->get_keysym_index) (self, group, level);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * eek_keyboard_create_section:
 | 
					 * eek_keyboard_create_section:
 | 
				
			||||||
 * @keyboard: an #EekKeyboard
 | 
					 * @keyboard: an #EekKeyboard
 | 
				
			||||||
 | 
				
			|||||||
@ -42,6 +42,12 @@ struct _EekKeyboardIface
 | 
				
			|||||||
                                      EekBounds   *bounds);
 | 
					                                      EekBounds   *bounds);
 | 
				
			||||||
    void        (* get_bounds)       (EekKeyboard *self,
 | 
					    void        (* get_bounds)       (EekKeyboard *self,
 | 
				
			||||||
                                      EekBounds   *bounds);
 | 
					                                      EekBounds   *bounds);
 | 
				
			||||||
 | 
					    void        (* set_keysym_index) (EekKeyboard *self,
 | 
				
			||||||
 | 
					                                      gint         group,
 | 
				
			||||||
 | 
					                                      gint         level);
 | 
				
			||||||
 | 
					    void        (* get_keysym_index) (EekKeyboard *self,
 | 
				
			||||||
 | 
					                                      gint        *group,
 | 
				
			||||||
 | 
					                                      gint        *level);
 | 
				
			||||||
    EekSection *(* create_section)   (EekKeyboard *self,
 | 
					    EekSection *(* create_section)   (EekKeyboard *self,
 | 
				
			||||||
                                      const gchar *name,
 | 
					                                      const gchar *name,
 | 
				
			||||||
                                      gint         angle,
 | 
					                                      gint         angle,
 | 
				
			||||||
@ -61,6 +67,12 @@ void        eek_keyboard_set_bounds      (EekKeyboard *keyboard,
 | 
				
			|||||||
                                           EekBounds   *bounds);
 | 
					                                           EekBounds   *bounds);
 | 
				
			||||||
void        eek_keyboard_get_bounds       (EekKeyboard *keyboard,
 | 
					void        eek_keyboard_get_bounds       (EekKeyboard *keyboard,
 | 
				
			||||||
                                           EekBounds   *bounds);
 | 
					                                           EekBounds   *bounds);
 | 
				
			||||||
 | 
					void        eek_keyboard_set_keysym_index (EekKeyboard *self,
 | 
				
			||||||
 | 
					                                           gint         group,
 | 
				
			||||||
 | 
					                                           gint         level);
 | 
				
			||||||
 | 
					void        eek_keyboard_get_keysym_index (EekKeyboard *self,
 | 
				
			||||||
 | 
					                                           gint        *group,
 | 
				
			||||||
 | 
					                                           gint        *level);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EekSection *eek_keyboard_create_section   (EekKeyboard *keyboard,
 | 
					EekSection *eek_keyboard_create_section   (EekKeyboard *keyboard,
 | 
				
			||||||
                                           const gchar *name,
 | 
					                                           const gchar *name,
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,11 @@
 | 
				
			|||||||
#include "eek-keysym.h"
 | 
					#include "eek-keysym.h"
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DEBUG 0
 | 
				
			||||||
 | 
					#if DEBUG
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					enum {
 | 
				
			||||||
    PROP_0,
 | 
					    PROP_0,
 | 
				
			||||||
    PROP_NAME,
 | 
					    PROP_NAME,
 | 
				
			||||||
@ -76,6 +81,17 @@ eek_simple_key_real_set_keysyms (EekKey *self,
 | 
				
			|||||||
    memcpy (priv->keysyms, keysyms, groups * levels * sizeof(guint));
 | 
					    memcpy (priv->keysyms, keysyms, groups * levels * sizeof(guint));
 | 
				
			||||||
    priv->num_groups = groups;
 | 
					    priv->num_groups = groups;
 | 
				
			||||||
    priv->num_levels = levels;
 | 
					    priv->num_levels = levels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if DEBUG
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        gint i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fprintf (stderr, "%s: ", priv->name);
 | 
				
			||||||
 | 
					        for (i = 0; i < groups * levels; i++)
 | 
				
			||||||
 | 
					            fprintf (stderr, "\"%s\" ", eek_keysym_to_string (keysyms[i]));
 | 
				
			||||||
 | 
					        fprintf (stderr, "\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gint
 | 
					static gint
 | 
				
			||||||
 | 
				
			|||||||
@ -191,7 +191,7 @@ create_key (EekXkbLayout *layout,
 | 
				
			|||||||
        keysyms = g_malloc0 ((num_keysyms) * sizeof(guint));
 | 
					        keysyms = g_malloc0 ((num_keysyms) * sizeof(guint));
 | 
				
			||||||
        for (i = 0; i < num_groups; i++)
 | 
					        for (i = 0; i < num_groups; i++)
 | 
				
			||||||
            for (j = 0; j < num_levels; j++) {
 | 
					            for (j = 0; j < num_levels; j++) {
 | 
				
			||||||
                keysym = XkbKeySymEntry (priv->xkb, keycode, i, j);
 | 
					                keysym = XkbKeySymEntry (priv->xkb, keycode, j, i);
 | 
				
			||||||
                keysyms[i * num_levels + j] = keysym;
 | 
					                keysyms[i * num_levels + j] = keysym;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user