Port modifier handling code from application into library.
This commit is contained in:
@ -502,6 +502,20 @@ eek_key_get_keysyms (EekKey *key,
|
|||||||
EEK_KEY_GET_CLASS(key)->get_keysyms (key, keysyms, num_groups, num_levels);
|
EEK_KEY_GET_CLASS(key)->get_keysyms (key, keysyms, num_groups, num_levels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static EekKeyboard *
|
||||||
|
get_keyboard (EekKey *key)
|
||||||
|
{
|
||||||
|
EekElement *parent;
|
||||||
|
|
||||||
|
parent = eek_element_get_parent (EEK_ELEMENT(key));
|
||||||
|
g_return_val_if_fail (EEK_IS_SECTION(parent), NULL);
|
||||||
|
|
||||||
|
parent = eek_element_get_parent (parent);
|
||||||
|
g_return_val_if_fail (EEK_IS_KEYBOARD(parent), NULL);
|
||||||
|
|
||||||
|
return EEK_KEYBOARD(parent);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eek_key_get_keysym:
|
* eek_key_get_keysym:
|
||||||
* @key: an #EekKey
|
* @key: an #EekKey
|
||||||
@ -513,17 +527,14 @@ guint
|
|||||||
eek_key_get_keysym (EekKey *key)
|
eek_key_get_keysym (EekKey *key)
|
||||||
{
|
{
|
||||||
gint group, level;
|
gint group, level;
|
||||||
EekElement *parent;
|
EekKeyboard *keyboard;
|
||||||
|
|
||||||
g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYSYM);
|
g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYSYM);
|
||||||
|
|
||||||
parent = eek_element_get_parent (EEK_ELEMENT(key));
|
keyboard = get_keyboard (key);
|
||||||
g_return_val_if_fail (EEK_IS_SECTION(parent), EEK_INVALID_KEYSYM);
|
g_return_val_if_fail (keyboard, EEK_INVALID_KEYSYM);
|
||||||
|
|
||||||
parent = eek_element_get_parent (parent);
|
eek_keyboard_get_keysym_index (keyboard, &group, &level);
|
||||||
g_return_val_if_fail (EEK_IS_KEYBOARD(parent), EEK_INVALID_KEYSYM);
|
|
||||||
|
|
||||||
eek_keyboard_get_keysym_index (EEK_KEYBOARD(parent), &group, &level);
|
|
||||||
|
|
||||||
return eek_key_get_keysym_at_index (key, group, level);
|
return eek_key_get_keysym_at_index (key, group, level);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,6 +34,7 @@
|
|||||||
#include "eek-keyboard.h"
|
#include "eek-keyboard.h"
|
||||||
#include "eek-section.h"
|
#include "eek-section.h"
|
||||||
#include "eek-key.h"
|
#include "eek-key.h"
|
||||||
|
#include "eek-keysym.h"
|
||||||
#include "eek-marshallers.h"
|
#include "eek-marshallers.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -41,6 +42,7 @@ enum {
|
|||||||
PROP_GROUP,
|
PROP_GROUP,
|
||||||
PROP_LEVEL,
|
PROP_LEVEL,
|
||||||
PROP_LAYOUT,
|
PROP_LAYOUT,
|
||||||
|
PROP_MODIFIER_BEHAVIOR,
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -64,6 +66,8 @@ struct _EekKeyboardPrivate
|
|||||||
gint group;
|
gint group;
|
||||||
gint level;
|
gint level;
|
||||||
EekLayout *layout;
|
EekLayout *layout;
|
||||||
|
EekModifierBehavior modifier_behavior;
|
||||||
|
EekModifierType modifiers;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -180,6 +184,10 @@ eek_keyboard_set_property (GObject *object,
|
|||||||
priv->layout = g_value_get_object (value);
|
priv->layout = g_value_get_object (value);
|
||||||
g_object_ref (priv->layout);
|
g_object_ref (priv->layout);
|
||||||
break;
|
break;
|
||||||
|
case PROP_MODIFIER_BEHAVIOR:
|
||||||
|
eek_keyboard_set_modifier_behavior (EEK_KEYBOARD(object),
|
||||||
|
g_value_get_int (value));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
g_object_set_property (object,
|
g_object_set_property (object,
|
||||||
g_param_spec_get_name (pspec),
|
g_param_spec_get_name (pspec),
|
||||||
@ -208,6 +216,10 @@ eek_keyboard_get_property (GObject *object,
|
|||||||
case PROP_LAYOUT:
|
case PROP_LAYOUT:
|
||||||
g_value_set_object (value, priv->layout);
|
g_value_set_object (value, priv->layout);
|
||||||
break;
|
break;
|
||||||
|
case PROP_MODIFIER_BEHAVIOR:
|
||||||
|
g_value_set_int (value,
|
||||||
|
eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object)));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
g_object_get_property (object,
|
g_object_get_property (object,
|
||||||
g_param_spec_get_name (pspec),
|
g_param_spec_get_name (pspec),
|
||||||
@ -224,6 +236,60 @@ eek_keyboard_real_keysym_index_changed (EekKeyboard *self,
|
|||||||
/* g_debug ("keysym-index-changed"); */
|
/* g_debug ("keysym-index-changed"); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_level_from_modifiers (EekKeyboard *self)
|
||||||
|
{
|
||||||
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||||
|
guint level = 0;
|
||||||
|
|
||||||
|
if (priv->modifiers & EEK_MOD5_MASK)
|
||||||
|
level |= 2;
|
||||||
|
if (priv->modifiers & EEK_SHIFT_MASK)
|
||||||
|
level |= 1;
|
||||||
|
eek_keyboard_set_level (self, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eek_keyboard_real_key_pressed (EekKeyboard *self,
|
||||||
|
EekKey *key)
|
||||||
|
{
|
||||||
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||||
|
guint keysym;
|
||||||
|
EekModifierType modifier;
|
||||||
|
|
||||||
|
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_LATCH)
|
||||||
|
priv->modifiers = 0;
|
||||||
|
|
||||||
|
keysym = eek_key_get_keysym_at_index (key, priv->group, priv->level);
|
||||||
|
modifier = eek_keysym_to_modifier (keysym);
|
||||||
|
|
||||||
|
if (modifier != 0) {
|
||||||
|
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE ||
|
||||||
|
priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_LATCH)
|
||||||
|
priv->modifiers |= modifier;
|
||||||
|
else if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_LOCK)
|
||||||
|
priv->modifiers ^= modifier;
|
||||||
|
}
|
||||||
|
set_level_from_modifiers (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eek_keyboard_real_key_released (EekKeyboard *self,
|
||||||
|
EekKey *key)
|
||||||
|
{
|
||||||
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||||
|
guint keysym;
|
||||||
|
EekModifierType modifier;
|
||||||
|
|
||||||
|
keysym = eek_key_get_keysym_at_index (key, priv->group, priv->level);
|
||||||
|
modifier = eek_keysym_to_modifier (keysym);
|
||||||
|
if (modifier != 0) {
|
||||||
|
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE)
|
||||||
|
priv->modifiers &= ~modifier;
|
||||||
|
}
|
||||||
|
set_level_from_modifiers (self);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
eek_keyboard_class_init (EekKeyboardClass *klass)
|
eek_keyboard_class_init (EekKeyboardClass *klass)
|
||||||
{
|
{
|
||||||
@ -238,6 +304,9 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
|
|||||||
klass->create_section = eek_keyboard_real_create_section;
|
klass->create_section = eek_keyboard_real_create_section;
|
||||||
klass->find_key_by_keycode = eek_keyboard_real_find_key_by_keycode;
|
klass->find_key_by_keycode = eek_keyboard_real_find_key_by_keycode;
|
||||||
|
|
||||||
|
/* signals */
|
||||||
|
klass->key_pressed = eek_keyboard_real_key_pressed;
|
||||||
|
klass->key_released = eek_keyboard_real_key_released;
|
||||||
klass->keysym_index_changed = eek_keyboard_real_keysym_index_changed;
|
klass->keysym_index_changed = eek_keyboard_real_keysym_index_changed;
|
||||||
|
|
||||||
gobject_class->get_property = eek_keyboard_get_property;
|
gobject_class->get_property = eek_keyboard_get_property;
|
||||||
@ -285,6 +354,20 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
|
|||||||
PROP_LAYOUT,
|
PROP_LAYOUT,
|
||||||
pspec);
|
pspec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EekKeyboard:modifier-behavior:
|
||||||
|
*
|
||||||
|
* The modifier handling mode of #EekKeyboard.
|
||||||
|
*/
|
||||||
|
pspec = g_param_spec_int ("modifier-behavior",
|
||||||
|
"Modifier behavior",
|
||||||
|
"Modifier handling mode of the keyboard",
|
||||||
|
0, G_MAXINT, EEK_MODIFIER_BEHAVIOR_NONE,
|
||||||
|
G_PARAM_READWRITE);
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_MODIFIER_BEHAVIOR,
|
||||||
|
pspec);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EekKeyboard::key-pressed:
|
* EekKeyboard::key-pressed:
|
||||||
* @keyboard: an #EekKeyboard
|
* @keyboard: an #EekKeyboard
|
||||||
@ -296,8 +379,8 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
|
|||||||
signals[KEY_PRESSED] =
|
signals[KEY_PRESSED] =
|
||||||
g_signal_new ("key-pressed",
|
g_signal_new ("key-pressed",
|
||||||
G_TYPE_FROM_CLASS(gobject_class),
|
G_TYPE_FROM_CLASS(gobject_class),
|
||||||
G_SIGNAL_RUN_FIRST,
|
G_SIGNAL_RUN_LAST,
|
||||||
0,
|
G_STRUCT_OFFSET(EekKeyboardClass, key_pressed),
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
g_cclosure_marshal_VOID__OBJECT,
|
g_cclosure_marshal_VOID__OBJECT,
|
||||||
@ -316,8 +399,8 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
|
|||||||
signals[KEY_RELEASED] =
|
signals[KEY_RELEASED] =
|
||||||
g_signal_new ("key-released",
|
g_signal_new ("key-released",
|
||||||
G_TYPE_FROM_CLASS(gobject_class),
|
G_TYPE_FROM_CLASS(gobject_class),
|
||||||
G_SIGNAL_RUN_FIRST,
|
G_SIGNAL_RUN_LAST,
|
||||||
0,
|
G_STRUCT_OFFSET(EekKeyboardClass, key_released),
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
g_cclosure_marshal_VOID__OBJECT,
|
g_cclosure_marshal_VOID__OBJECT,
|
||||||
@ -356,6 +439,8 @@ eek_keyboard_init (EekKeyboard *self)
|
|||||||
priv = self->priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
priv = self->priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||||
priv->group = priv->level = 0;
|
priv->group = priv->level = 0;
|
||||||
priv->layout = NULL;
|
priv->layout = NULL;
|
||||||
|
priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_NONE;
|
||||||
|
priv->modifiers = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -508,3 +593,37 @@ eek_keyboard_get_size (EekKeyboard *keyboard,
|
|||||||
*width = bounds.width;
|
*width = bounds.width;
|
||||||
*height = bounds.height;
|
*height = bounds.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
eek_keyboard_set_modifier_behavior (EekKeyboard *keyboard,
|
||||||
|
EekModifierBehavior modifier_behavior)
|
||||||
|
{
|
||||||
|
EekKeyboardPrivate *priv;
|
||||||
|
|
||||||
|
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
|
||||||
|
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||||
|
|
||||||
|
priv->modifier_behavior = modifier_behavior;
|
||||||
|
}
|
||||||
|
|
||||||
|
EekModifierBehavior
|
||||||
|
eek_keyboard_get_modifier_behavior (EekKeyboard *keyboard)
|
||||||
|
{
|
||||||
|
EekKeyboardPrivate *priv;
|
||||||
|
|
||||||
|
g_assert (EEK_IS_KEYBOARD(keyboard));
|
||||||
|
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||||
|
|
||||||
|
return priv->modifier_behavior;
|
||||||
|
}
|
||||||
|
|
||||||
|
EekModifierType
|
||||||
|
eek_keyboard_get_modifiers (EekKeyboard *keyboard)
|
||||||
|
{
|
||||||
|
EekKeyboardPrivate *priv;
|
||||||
|
|
||||||
|
g_assert (EEK_IS_KEYBOARD(keyboard));
|
||||||
|
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||||
|
|
||||||
|
return priv->modifiers;
|
||||||
|
}
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
#include "eek-container.h"
|
#include "eek-container.h"
|
||||||
#include "eek-types.h"
|
#include "eek-types.h"
|
||||||
#include "eek-layout.h"
|
#include "eek-layout.h"
|
||||||
|
#include "eek-keysym.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
@ -75,6 +76,10 @@ struct _EekKeyboardClass
|
|||||||
guint keycode);
|
guint keycode);
|
||||||
|
|
||||||
/* signals */
|
/* signals */
|
||||||
|
void (* key_pressed) (EekKeyboard *self,
|
||||||
|
EekKey *key);
|
||||||
|
void (* key_released) (EekKeyboard *self,
|
||||||
|
EekKey *key);
|
||||||
void (* keysym_index_changed) (EekKeyboard *self,
|
void (* keysym_index_changed) (EekKeyboard *self,
|
||||||
gint group,
|
gint group,
|
||||||
gint level);
|
gint level);
|
||||||
@ -84,33 +89,52 @@ struct _EekKeyboardClass
|
|||||||
gpointer pdummy[23];
|
gpointer pdummy[23];
|
||||||
};
|
};
|
||||||
|
|
||||||
GType eek_keyboard_get_type (void) G_GNUC_CONST;
|
GType eek_keyboard_get_type
|
||||||
|
(void) G_GNUC_CONST;
|
||||||
|
|
||||||
EekKeyboard *eek_keyboard_new (EekLayout *layout,
|
EekKeyboard *eek_keyboard_new (EekLayout *layout,
|
||||||
gdouble initial_width,
|
gdouble initial_width,
|
||||||
gdouble initial_height);
|
gdouble initial_height);
|
||||||
EekLayout *eek_keyboard_get_layout (EekKeyboard *keyboard);
|
EekLayout *eek_keyboard_get_layout
|
||||||
void eek_keyboard_get_size (EekKeyboard *keyboard,
|
(EekKeyboard *keyboard);
|
||||||
gdouble *width,
|
void eek_keyboard_get_size
|
||||||
gdouble *height);
|
(EekKeyboard *keyboard,
|
||||||
void eek_keyboard_set_keysym_index (EekKeyboard *keyboard,
|
gdouble *width,
|
||||||
gint group,
|
gdouble *height);
|
||||||
gint level);
|
void eek_keyboard_set_keysym_index
|
||||||
void eek_keyboard_get_keysym_index (EekKeyboard *keyboard,
|
(EekKeyboard *keyboard,
|
||||||
gint *group,
|
gint group,
|
||||||
gint *level);
|
gint level);
|
||||||
|
void eek_keyboard_get_keysym_index
|
||||||
|
(EekKeyboard *keyboard,
|
||||||
|
gint *group,
|
||||||
|
gint *level);
|
||||||
|
|
||||||
void eek_keyboard_set_group (EekKeyboard *keyboard,
|
void eek_keyboard_set_group
|
||||||
gint group);
|
(EekKeyboard *keyboard,
|
||||||
void eek_keyboard_set_level (EekKeyboard *keyboard,
|
gint group);
|
||||||
gint level);
|
void eek_keyboard_set_level
|
||||||
gint eek_keyboard_get_group (EekKeyboard *keyboard);
|
(EekKeyboard *keyboard,
|
||||||
gint eek_keyboard_get_level (EekKeyboard *keyboard);
|
gint level);
|
||||||
|
gint eek_keyboard_get_group
|
||||||
|
(EekKeyboard *keyboard);
|
||||||
|
gint eek_keyboard_get_level
|
||||||
|
(EekKeyboard *keyboard);
|
||||||
|
|
||||||
EekSection *eek_keyboard_create_section (EekKeyboard *keyboard);
|
void eek_keyboard_set_modifier_behavior
|
||||||
|
(EekKeyboard *keyboard,
|
||||||
|
EekModifierBehavior modifier_behavior);
|
||||||
|
EekModifierBehavior eek_keyboard_get_modifier_behavior
|
||||||
|
(EekKeyboard *keyboard);
|
||||||
|
EekModifierType eek_keyboard_get_modifiers
|
||||||
|
(EekKeyboard *keyboard);
|
||||||
|
|
||||||
EekKey *eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
|
EekSection *eek_keyboard_create_section
|
||||||
guint keycode);
|
(EekKeyboard *keyboard);
|
||||||
|
|
||||||
|
EekKey *eek_keyboard_find_key_by_keycode
|
||||||
|
(EekKeyboard *keyboard,
|
||||||
|
guint keycode);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* EEK_KEYBOARD_H */
|
#endif /* EEK_KEYBOARD_H */
|
||||||
|
|||||||
@ -169,3 +169,33 @@ eek_keysym_get_category (guint keysym)
|
|||||||
return category;
|
return category;
|
||||||
return EEK_KEYSYM_CATEGORY_UNKNOWN;
|
return EEK_KEYSYM_CATEGORY_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EekModifierType
|
||||||
|
eek_keysym_to_modifier (guint keysym)
|
||||||
|
{
|
||||||
|
switch (keysym) {
|
||||||
|
case EEK_KEY_Shift_L:
|
||||||
|
case EEK_KEY_Shift_R:
|
||||||
|
case EEK_KEY_Caps_Lock:
|
||||||
|
case EEK_KEY_Shift_Lock:
|
||||||
|
return EEK_SHIFT_MASK;
|
||||||
|
case EEK_KEY_ISO_Level3_Shift:
|
||||||
|
return EEK_MOD5_MASK;
|
||||||
|
case EEK_KEY_Control_L:
|
||||||
|
case EEK_KEY_Control_R:
|
||||||
|
return EEK_CONTROL_MASK;
|
||||||
|
case EEK_KEY_Alt_L:
|
||||||
|
case EEK_KEY_Alt_R:
|
||||||
|
return EEK_MOD1_MASK;
|
||||||
|
case EEK_KEY_Meta_L:
|
||||||
|
case EEK_KEY_Meta_R:
|
||||||
|
return EEK_META_MASK;
|
||||||
|
case EEK_KEY_Super_L:
|
||||||
|
case EEK_KEY_Super_R:
|
||||||
|
return EEK_SUPER_MASK;
|
||||||
|
case EEK_KEY_Hyper_L:
|
||||||
|
case EEK_KEY_Hyper_R:
|
||||||
|
return EEK_HYPER_MASK;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@ -58,4 +58,52 @@ typedef enum {
|
|||||||
gchar *eek_keysym_to_string (guint keysym);
|
gchar *eek_keysym_to_string (guint keysym);
|
||||||
EekKeysymCategory eek_keysym_get_category (guint keysym);
|
EekKeysymCategory eek_keysym_get_category (guint keysym);
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
EEK_SHIFT_MASK = 1 << 0,
|
||||||
|
EEK_LOCK_MASK = 1 << 1,
|
||||||
|
EEK_CONTROL_MASK = 1 << 2,
|
||||||
|
EEK_MOD1_MASK = 1 << 3,
|
||||||
|
EEK_MOD2_MASK = 1 << 4,
|
||||||
|
EEK_MOD3_MASK = 1 << 5,
|
||||||
|
EEK_MOD4_MASK = 1 << 6,
|
||||||
|
EEK_MOD5_MASK = 1 << 7,
|
||||||
|
EEK_BUTTON1_MASK = 1 << 8,
|
||||||
|
EEK_BUTTON2_MASK = 1 << 9,
|
||||||
|
EEK_BUTTON3_MASK = 1 << 10,
|
||||||
|
EEK_BUTTON4_MASK = 1 << 11,
|
||||||
|
EEK_BUTTON5_MASK = 1 << 12,
|
||||||
|
|
||||||
|
/* The next few modifiers are used by XKB, so we skip to the end.
|
||||||
|
* Bits 15 - 25 are currently unused. Bit 29 is used internally.
|
||||||
|
*/
|
||||||
|
|
||||||
|
EEK_SUPER_MASK = 1 << 26,
|
||||||
|
EEK_HYPER_MASK = 1 << 27,
|
||||||
|
EEK_META_MASK = 1 << 28,
|
||||||
|
|
||||||
|
EEK_RELEASE_MASK = 1 << 30,
|
||||||
|
|
||||||
|
EEK_MODIFIER_MASK = 0x5c001fff
|
||||||
|
} EekModifierType;
|
||||||
|
|
||||||
|
#define EEK_KEY_Shift_L 0xffe1
|
||||||
|
#define EEK_KEY_Shift_R 0xffe2
|
||||||
|
#define EEK_KEY_ISO_Level3_Shift 0xfe03
|
||||||
|
#define EEK_KEY_Caps_Lock 0xffe5
|
||||||
|
#define EEK_KEY_Shift_Lock 0xffe6
|
||||||
|
#define EEK_KEY_Control_L 0xffe3
|
||||||
|
#define EEK_KEY_Control_R 0xffe4
|
||||||
|
#define EEK_KEY_Alt_L 0xffe9
|
||||||
|
#define EEK_KEY_Alt_R 0xffea
|
||||||
|
#define EEK_KEY_Meta_L 0xffe7
|
||||||
|
#define EEK_KEY_Meta_R 0xffe8
|
||||||
|
#define EEK_KEY_Super_L 0xffeb
|
||||||
|
#define EEK_KEY_Super_R 0xffec
|
||||||
|
#define EEK_KEY_Hyper_L 0xffed
|
||||||
|
#define EEK_KEY_Hyper_R 0xffee
|
||||||
|
|
||||||
|
EekModifierType eek_keysym_to_modifier (guint keysym);
|
||||||
|
#define eek_keysym_is_modifier(keysym) (eek_keysym_to_modifier ((keysym)) != 0)
|
||||||
|
|
||||||
#endif /* EEK_KEYSYM_H */
|
#endif /* EEK_KEYSYM_H */
|
||||||
|
|||||||
@ -46,6 +46,22 @@ typedef enum {
|
|||||||
EEK_ORIENTATION_INVALID = -1
|
EEK_ORIENTATION_INVALID = -1
|
||||||
} EekOrientation;
|
} EekOrientation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EekModifierBehavior:
|
||||||
|
* @EEK_MODIFIER_BEHAVIOR_NONE: do nothing when a modifier key is pressed
|
||||||
|
* @EEK_MODIFIER_BEHAVIOR_LOCK: toggle the modifier status each time a
|
||||||
|
* modifier key are pressed
|
||||||
|
* @EEK_MODIFIER_BEHAVIOR_LATCH: enable the modifier when a modifier
|
||||||
|
* key is pressed and keep it enabled until any key is pressed.
|
||||||
|
*
|
||||||
|
* Modifier handling mode.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
EEK_MODIFIER_BEHAVIOR_NONE,
|
||||||
|
EEK_MODIFIER_BEHAVIOR_LOCK,
|
||||||
|
EEK_MODIFIER_BEHAVIOR_LATCH
|
||||||
|
} EekModifierBehavior;
|
||||||
|
|
||||||
typedef struct _EekElement EekElement;
|
typedef struct _EekElement EekElement;
|
||||||
typedef struct _EekContainer EekContainer;
|
typedef struct _EekContainer EekContainer;
|
||||||
typedef struct _EekKey EekKey;
|
typedef struct _EekKey EekKey;
|
||||||
|
|||||||
@ -104,7 +104,6 @@ struct _Eekboard {
|
|||||||
|
|
||||||
EekKeyboard *keyboard;
|
EekKeyboard *keyboard;
|
||||||
EekLayout *layout; /* FIXME: eek_keyboard_get_layout() */
|
EekLayout *layout; /* FIXME: eek_keyboard_get_layout() */
|
||||||
guint modifiers;
|
|
||||||
};
|
};
|
||||||
typedef struct _Eekboard Eekboard;
|
typedef struct _Eekboard Eekboard;
|
||||||
|
|
||||||
@ -432,44 +431,17 @@ on_key_pressed (EekKeyboard *keyboard,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
Eekboard *eekboard = user_data;
|
Eekboard *eekboard = user_data;
|
||||||
gint group, level;
|
|
||||||
guint keysym;
|
guint keysym;
|
||||||
|
|
||||||
keysym = eek_key_get_keysym (key);
|
keysym = eek_key_get_keysym (key);
|
||||||
EEKBOARD_NOTE("%s %X", eek_keysym_to_string (keysym), eekboard->modifiers);
|
EEKBOARD_NOTE("%s %X",
|
||||||
|
eek_keysym_to_string (keysym),
|
||||||
|
eek_keyboard_get_modifiers (keyboard));
|
||||||
|
|
||||||
switch (keysym) {
|
if (!eek_keysym_is_modifier (keysym))
|
||||||
case XK_Shift_L:
|
fakekey_press_keysym (eekboard->fakekey,
|
||||||
case XK_Shift_R:
|
keysym,
|
||||||
eekboard->modifiers ^= ShiftMask;
|
eek_keyboard_get_modifiers (keyboard));
|
||||||
eek_keyboard_get_keysym_index (keyboard, &group, &level);
|
|
||||||
eek_keyboard_set_keysym_index (keyboard, group,
|
|
||||||
(eekboard->modifiers & Mod5Mask) ? 2 :
|
|
||||||
(eekboard->modifiers & ShiftMask) ? 1 :
|
|
||||||
0);
|
|
||||||
break;
|
|
||||||
case XK_ISO_Level3_Shift:
|
|
||||||
eekboard->modifiers ^= Mod5Mask;
|
|
||||||
eek_keyboard_get_keysym_index (keyboard, &group, &level);
|
|
||||||
eek_keyboard_set_keysym_index (keyboard, group,
|
|
||||||
(eekboard->modifiers & Mod5Mask) ? 2 :
|
|
||||||
(eekboard->modifiers & ShiftMask) ? 1 :
|
|
||||||
0);
|
|
||||||
break;
|
|
||||||
case XK_Control_L:
|
|
||||||
case XK_Control_R:
|
|
||||||
eekboard->modifiers ^= ControlMask;
|
|
||||||
break;
|
|
||||||
case XK_Alt_L:
|
|
||||||
case XK_Alt_R:
|
|
||||||
eekboard->modifiers ^= Mod1Mask;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fakekey_press_keysym (eekboard->fakekey, keysym, eekboard->modifiers);
|
|
||||||
eekboard->modifiers = 0;
|
|
||||||
eek_keyboard_get_keysym_index (keyboard, &group, &level);
|
|
||||||
eek_keyboard_set_keysym_index (keyboard, group, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1066,6 +1038,8 @@ create_widget (Eekboard *eekboard,
|
|||||||
eekboard->keyboard = eek_keyboard_new (eekboard->layout,
|
eekboard->keyboard = eek_keyboard_new (eekboard->layout,
|
||||||
initial_width,
|
initial_width,
|
||||||
initial_height);
|
initial_height);
|
||||||
|
eek_keyboard_set_modifier_behavior (eekboard->keyboard,
|
||||||
|
EEK_MODIFIER_BEHAVIOR_LATCH);
|
||||||
eekboard->on_key_pressed_id =
|
eekboard->on_key_pressed_id =
|
||||||
g_signal_connect (eekboard->keyboard, "key-pressed",
|
g_signal_connect (eekboard->keyboard, "key-pressed",
|
||||||
G_CALLBACK(on_key_pressed), eekboard);
|
G_CALLBACK(on_key_pressed), eekboard);
|
||||||
|
|||||||
Reference in New Issue
Block a user