levelkeyboard: Use a layer for managing keyboard views
This commit is contained in:
@ -55,7 +55,7 @@ enum {
|
|||||||
typedef struct _EekGtkKeyboardPrivate
|
typedef struct _EekGtkKeyboardPrivate
|
||||||
{
|
{
|
||||||
EekRenderer *renderer;
|
EekRenderer *renderer;
|
||||||
EekKeyboard *keyboard;
|
LevelKeyboard *keyboard;
|
||||||
GtkCssProvider *css_provider;
|
GtkCssProvider *css_provider;
|
||||||
GtkStyleContext *scontext;
|
GtkStyleContext *scontext;
|
||||||
|
|
||||||
@ -117,14 +117,14 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
|
|||||||
uint level = priv->keyboard->level;
|
uint level = priv->keyboard->level;
|
||||||
|
|
||||||
/* redraw pressed key */
|
/* redraw pressed key */
|
||||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
list = eek_keyboard_get_pressed_keys (level_keyboard_current(priv->keyboard));
|
||||||
for (head = list; head; head = g_list_next (head)) {
|
for (head = list; head; head = g_list_next (head)) {
|
||||||
render_pressed_key (self, head->data, level);
|
render_pressed_key (self, head->data, level);
|
||||||
}
|
}
|
||||||
g_list_free (list);
|
g_list_free (list);
|
||||||
|
|
||||||
/* redraw locked key */
|
/* redraw locked key */
|
||||||
list = eek_keyboard_get_locked_keys (priv->keyboard);
|
list = eek_keyboard_get_locked_keys (level_keyboard_current(priv->keyboard));
|
||||||
for (head = list; head; head = g_list_next (head)) {
|
for (head = list; head; head = g_list_next (head)) {
|
||||||
render_locked_key (self, ((EekModifierKey *)head->data)->key, level);
|
render_locked_key (self, ((EekModifierKey *)head->data)->key, level);
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ static void drag(EekGtkKeyboard *self,
|
|||||||
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
|
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
|
||||||
GList *list, *head;
|
GList *list, *head;
|
||||||
|
|
||||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
list = eek_keyboard_get_pressed_keys (level_keyboard_current(priv->keyboard));
|
||||||
|
|
||||||
if (key) {
|
if (key) {
|
||||||
gboolean found = FALSE;
|
gboolean found = FALSE;
|
||||||
@ -200,7 +200,7 @@ static void drag(EekGtkKeyboard *self,
|
|||||||
static void release(EekGtkKeyboard *self, guint32 time) {
|
static void release(EekGtkKeyboard *self, guint32 time) {
|
||||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||||
|
|
||||||
GList *list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
GList *list = eek_keyboard_get_pressed_keys (level_keyboard_current(priv->keyboard));
|
||||||
for (GList *head = list; head; head = g_list_next (head)) {
|
for (GList *head = list; head; head = g_list_next (head)) {
|
||||||
EekKey *key = EEK_KEY(head->data);
|
EekKey *key = EEK_KEY(head->data);
|
||||||
eek_keyboard_release_key(priv->keyboard, key, time);
|
eek_keyboard_release_key(priv->keyboard, key, time);
|
||||||
@ -287,7 +287,7 @@ eek_gtk_keyboard_real_unmap (GtkWidget *self)
|
|||||||
elements, so that the default handler of
|
elements, so that the default handler of
|
||||||
EekKeyboard::key-released signal can remove elements from its
|
EekKeyboard::key-released signal can remove elements from its
|
||||||
internal copy */
|
internal copy */
|
||||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
list = eek_keyboard_get_pressed_keys (level_keyboard_current(priv->keyboard));
|
||||||
for (head = list; head; head = g_list_next (head)) {
|
for (head = list; head; head = g_list_next (head)) {
|
||||||
g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey released");
|
g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey released");
|
||||||
g_signal_emit_by_name (head->data, "released");
|
g_signal_emit_by_name (head->data, "released");
|
||||||
@ -326,18 +326,14 @@ eek_gtk_keyboard_real_query_tooltip (GtkWidget *widget,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
|
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
|
||||||
EekKeyboard *keyboard)
|
LevelKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||||
|
|
||||||
if (priv->keyboard == keyboard)
|
if (priv->keyboard == keyboard)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (priv->keyboard) {
|
priv->keyboard = keyboard;
|
||||||
g_object_unref (priv->keyboard);
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->keyboard = g_object_ref (keyboard);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -346,7 +342,7 @@ eek_gtk_keyboard_set_property (GObject *object,
|
|||||||
const GValue *value,
|
const GValue *value,
|
||||||
GParamSpec *pspec)
|
GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
EekKeyboard *keyboard;
|
LevelKeyboard *keyboard;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_KEYBOARD:
|
case PROP_KEYBOARD:
|
||||||
@ -373,14 +369,13 @@ eek_gtk_keyboard_dispose (GObject *object)
|
|||||||
if (priv->keyboard) {
|
if (priv->keyboard) {
|
||||||
GList *list, *head;
|
GList *list, *head;
|
||||||
|
|
||||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
list = eek_keyboard_get_pressed_keys (level_keyboard_current(priv->keyboard));
|
||||||
for (head = list; head; head = g_list_next (head)) {
|
for (head = list; head; head = g_list_next (head)) {
|
||||||
g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey pressed");
|
g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey pressed");
|
||||||
g_signal_emit_by_name (head->data, "released", priv->keyboard);
|
g_signal_emit_by_name (head->data, "released", level_keyboard_current(priv->keyboard));
|
||||||
}
|
}
|
||||||
g_list_free (list);
|
g_list_free (list);
|
||||||
|
|
||||||
g_object_unref (priv->keyboard);
|
|
||||||
priv->keyboard = NULL;
|
priv->keyboard = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,32 +443,12 @@ eek_gtk_keyboard_init (EekGtkKeyboard *self)
|
|||||||
* Returns: a #GtkWidget
|
* Returns: a #GtkWidget
|
||||||
*/
|
*/
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
eek_gtk_keyboard_new (EekKeyboard *keyboard)
|
eek_gtk_keyboard_new (LevelKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
return g_object_new (EEK_TYPE_GTK_KEYBOARD, "keyboard", keyboard, NULL);
|
EekGtkKeyboard *ret = EEK_GTK_KEYBOARD(g_object_new (EEK_TYPE_GTK_KEYBOARD, NULL));
|
||||||
}
|
EekGtkKeyboardPrivate *priv = (EekGtkKeyboardPrivate*)eek_gtk_keyboard_get_instance_private (ret);
|
||||||
|
priv->keyboard = keyboard;
|
||||||
static void
|
return GTK_WIDGET(ret);
|
||||||
magnify_bounds (GtkWidget *self,
|
|
||||||
EekBounds *bounds,
|
|
||||||
EekBounds *large_bounds,
|
|
||||||
gdouble scale)
|
|
||||||
{
|
|
||||||
GtkAllocation allocation;
|
|
||||||
gdouble x, y;
|
|
||||||
|
|
||||||
g_assert (scale >= 1.0);
|
|
||||||
|
|
||||||
gtk_widget_get_allocation (self, &allocation);
|
|
||||||
|
|
||||||
large_bounds->width = bounds->width * scale;
|
|
||||||
large_bounds->height = bounds->height * scale;
|
|
||||||
|
|
||||||
x = bounds->x - (large_bounds->width - bounds->width) / 2;
|
|
||||||
y = bounds->y - large_bounds->height;
|
|
||||||
|
|
||||||
large_bounds->x = CLAMP(x, 0, allocation.width - large_bounds->width);
|
|
||||||
large_bounds->y = CLAMP(y, 0, allocation.height - large_bounds->height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@ -45,7 +45,7 @@ struct _EekGtkKeyboardClass
|
|||||||
};
|
};
|
||||||
|
|
||||||
GType eek_gtk_keyboard_get_type (void) G_GNUC_CONST;
|
GType eek_gtk_keyboard_get_type (void) G_GNUC_CONST;
|
||||||
GtkWidget *eek_gtk_keyboard_new (EekKeyboard *keyboard);
|
GtkWidget *eek_gtk_keyboard_new (LevelKeyboard *keyboard);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* EEK_GTK_KEYBOARD_H */
|
#endif /* EEK_GTK_KEYBOARD_H */
|
||||||
|
|||||||
@ -36,6 +36,7 @@
|
|||||||
#include "eek-enumtypes.h"
|
#include "eek-enumtypes.h"
|
||||||
#include "eekboard/key-emitter.h"
|
#include "eekboard/key-emitter.h"
|
||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
|
#include "src/keyboard.h"
|
||||||
#include "src/symbol.h"
|
#include "src/symbol.h"
|
||||||
|
|
||||||
#include "eek-keyboard.h"
|
#include "eek-keyboard.h"
|
||||||
@ -72,10 +73,6 @@ struct _EekKeyboardPrivate
|
|||||||
unsigned int old_level;
|
unsigned int old_level;
|
||||||
GList *pressed_keys;
|
GList *pressed_keys;
|
||||||
GList *locked_keys;
|
GList *locked_keys;
|
||||||
GArray *outline_array;
|
|
||||||
|
|
||||||
/* Map key names to key objects: */
|
|
||||||
GHashTable *names;
|
|
||||||
|
|
||||||
/* modifiers dynamically assigned at run time */
|
/* modifiers dynamically assigned at run time */
|
||||||
EekModifierType num_lock_mask;
|
EekModifierType num_lock_mask;
|
||||||
@ -116,27 +113,6 @@ on_key_unlocked (EekSection *section,
|
|||||||
g_signal_emit (keyboard, signals[KEY_UNLOCKED], 0, key);
|
g_signal_emit (keyboard, signals[KEY_UNLOCKED], 0, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
section_child_added_cb (EekContainer *container,
|
|
||||||
EekElement *element,
|
|
||||||
EekKeyboard *keyboard)
|
|
||||||
{
|
|
||||||
const gchar *name = eek_element_get_name(element);
|
|
||||||
g_hash_table_insert (keyboard->priv->names,
|
|
||||||
(gpointer)name,
|
|
||||||
element);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
section_child_removed_cb (EekContainer *container,
|
|
||||||
EekElement *element,
|
|
||||||
EekKeyboard *keyboard)
|
|
||||||
{
|
|
||||||
const gchar *name = eek_element_get_name(element);
|
|
||||||
g_hash_table_remove (keyboard->priv->names,
|
|
||||||
name);
|
|
||||||
}
|
|
||||||
|
|
||||||
EekSection *
|
EekSection *
|
||||||
eek_keyboard_real_create_section (EekKeyboard *self)
|
eek_keyboard_real_create_section (EekKeyboard *self)
|
||||||
{
|
{
|
||||||
@ -145,12 +121,6 @@ eek_keyboard_real_create_section (EekKeyboard *self)
|
|||||||
section = g_object_new (EEK_TYPE_SECTION, NULL);
|
section = g_object_new (EEK_TYPE_SECTION, NULL);
|
||||||
g_return_val_if_fail (section, NULL);
|
g_return_val_if_fail (section, NULL);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT(section), "child-added",
|
|
||||||
G_CALLBACK(section_child_added_cb), self);
|
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT(section), "child-removed",
|
|
||||||
G_CALLBACK(section_child_removed_cb), self);
|
|
||||||
|
|
||||||
EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self),
|
EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self),
|
||||||
EEK_ELEMENT(section));
|
EEK_ELEMENT(section));
|
||||||
return section;
|
return section;
|
||||||
@ -191,14 +161,14 @@ eek_keyboard_get_property (GObject *object,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_level_from_modifiers (EekKeyboard *self, EekKey *key)
|
set_level_from_modifiers (LevelKeyboard *keyboard, EekKeyboard *self, EekKey *key)
|
||||||
{
|
{
|
||||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||||
|
|
||||||
/* The levels are: 0 Letters, 1 Upper case letters, 2 Numbers, 3 Symbols */
|
/* The levels are: 0 Letters, 1 Upper case letters, 2 Numbers, 3 Symbols */
|
||||||
|
|
||||||
/* Use the numbers/letters bit from the old level */
|
/* Use the numbers/letters bit from the old level */
|
||||||
gint level = priv->old_level & 2;
|
guint level = priv->old_level & 2;
|
||||||
|
|
||||||
/* Handle non-emitting keys */
|
/* Handle non-emitting keys */
|
||||||
if (key) {
|
if (key) {
|
||||||
@ -243,9 +213,9 @@ set_level_from_modifiers (EekKeyboard *self, EekKey *key)
|
|||||||
priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_LATCH;
|
priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_LATCH;
|
||||||
|
|
||||||
priv->old_level = level;
|
priv->old_level = level;
|
||||||
self->level = level;
|
keyboard->level = level;
|
||||||
|
|
||||||
eek_layout_update_layout(self);
|
eek_layout_update_layout(keyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -287,8 +257,8 @@ set_modifiers_with_key (EekKeyboard *self,
|
|||||||
priv->modifiers = modifiers;
|
priv->modifiers = modifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp) {
|
void eek_keyboard_press_key(LevelKeyboard *keyboard, EekKey *key, guint32 timestamp) {
|
||||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(level_keyboard_current(keyboard));
|
||||||
|
|
||||||
eek_key_set_pressed(key, TRUE);
|
eek_key_set_pressed(key, TRUE);
|
||||||
priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
|
priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
|
||||||
@ -301,22 +271,22 @@ void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestam
|
|||||||
|
|
||||||
EekModifierType modifier = squeek_symbol_get_modifier_mask (symbol);
|
EekModifierType modifier = squeek_symbol_get_modifier_mask (symbol);
|
||||||
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE) {
|
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE) {
|
||||||
set_modifiers_with_key (keyboard, key, priv->modifiers | modifier);
|
set_modifiers_with_key (level_keyboard_current(keyboard), key, priv->modifiers | modifier);
|
||||||
set_level_from_modifiers (keyboard, key);
|
set_level_from_modifiers (keyboard, level_keyboard_current(keyboard), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
|
// "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
|
||||||
|
|
||||||
guint keycode = eek_key_get_keycode (key);
|
guint keycode = eek_key_get_keycode (key);
|
||||||
EekModifierType modifiers = eek_keyboard_get_modifiers (keyboard);
|
EekModifierType modifiers = eek_keyboard_get_modifiers (level_keyboard_current(keyboard));
|
||||||
|
|
||||||
emit_key_activated(keyboard->manager, keyboard, keycode, symbol, modifiers, TRUE, timestamp);
|
emit_key_activated(keyboard->manager, keyboard, keycode, symbol, modifiers, TRUE, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void eek_keyboard_release_key( EekKeyboard *keyboard,
|
void eek_keyboard_release_key(LevelKeyboard *keyboard,
|
||||||
EekKey *key,
|
EekKey *key,
|
||||||
guint32 timestamp) {
|
guint32 timestamp) {
|
||||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(level_keyboard_current(keyboard));
|
||||||
|
|
||||||
for (GList *head = priv->pressed_keys; head; head = g_list_next (head)) {
|
for (GList *head = priv->pressed_keys; head; head = g_list_next (head)) {
|
||||||
if (head->data == key) {
|
if (head->data == key) {
|
||||||
@ -334,25 +304,25 @@ void eek_keyboard_release_key( EekKeyboard *keyboard,
|
|||||||
EekModifierType modifier = squeek_symbol_get_modifier_mask (symbol);
|
EekModifierType modifier = squeek_symbol_get_modifier_mask (symbol);
|
||||||
switch (priv->modifier_behavior) {
|
switch (priv->modifier_behavior) {
|
||||||
case EEK_MODIFIER_BEHAVIOR_NONE:
|
case EEK_MODIFIER_BEHAVIOR_NONE:
|
||||||
set_modifiers_with_key (keyboard, key, priv->modifiers & ~modifier);
|
set_modifiers_with_key (level_keyboard_current(keyboard), key, priv->modifiers & ~modifier);
|
||||||
break;
|
break;
|
||||||
case EEK_MODIFIER_BEHAVIOR_LOCK:
|
case EEK_MODIFIER_BEHAVIOR_LOCK:
|
||||||
priv->modifiers ^= modifier;
|
priv->modifiers ^= modifier;
|
||||||
break;
|
break;
|
||||||
case EEK_MODIFIER_BEHAVIOR_LATCH:
|
case EEK_MODIFIER_BEHAVIOR_LATCH:
|
||||||
if (modifier)
|
if (modifier)
|
||||||
set_modifiers_with_key (keyboard, key, priv->modifiers ^ modifier);
|
set_modifiers_with_key (level_keyboard_current(keyboard), key, priv->modifiers ^ modifier);
|
||||||
else
|
else
|
||||||
set_modifiers_with_key (keyboard, key,
|
set_modifiers_with_key (level_keyboard_current(keyboard), key,
|
||||||
(priv->modifiers ^ modifier) & modifier);
|
(priv->modifiers ^ modifier) & modifier);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
set_level_from_modifiers (keyboard, key);
|
set_level_from_modifiers (keyboard, level_keyboard_current(keyboard), key);
|
||||||
|
|
||||||
// "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
|
// "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
|
||||||
|
|
||||||
guint keycode = eek_key_get_keycode (key);
|
guint keycode = eek_key_get_keycode (key);
|
||||||
guint modifiers = eek_keyboard_get_modifiers (keyboard);
|
guint modifiers = eek_keyboard_get_modifiers (level_keyboard_current(keyboard));
|
||||||
|
|
||||||
emit_key_activated(keyboard->manager, keyboard, keycode, symbol, modifiers, FALSE, timestamp);
|
emit_key_activated(keyboard->manager, keyboard, keycode, symbol, modifiers, FALSE, timestamp);
|
||||||
}
|
}
|
||||||
@ -367,24 +337,32 @@ static void
|
|||||||
eek_keyboard_finalize (GObject *object)
|
eek_keyboard_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
|
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
|
||||||
guint i;
|
|
||||||
|
|
||||||
g_list_free (priv->pressed_keys);
|
g_list_free (priv->pressed_keys);
|
||||||
g_list_free_full (priv->locked_keys,
|
g_list_free_full (priv->locked_keys,
|
||||||
(GDestroyNotify) eek_modifier_key_free);
|
(GDestroyNotify) eek_modifier_key_free);
|
||||||
|
|
||||||
g_hash_table_destroy (priv->names);
|
G_OBJECT_CLASS (eek_keyboard_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < priv->outline_array->len; i++) {
|
void level_keyboard_deinit(LevelKeyboard *self) {
|
||||||
EekOutline *outline = &g_array_index (priv->outline_array,
|
g_hash_table_destroy (self->names);
|
||||||
|
for (guint i = 0; i < self->outline_array->len; i++) {
|
||||||
|
EekOutline *outline = &g_array_index (self->outline_array,
|
||||||
EekOutline,
|
EekOutline,
|
||||||
i);
|
i);
|
||||||
g_slice_free1 (sizeof (EekPoint) * outline->num_points,
|
g_slice_free1 (sizeof (EekPoint) * outline->num_points,
|
||||||
outline->points);
|
outline->points);
|
||||||
}
|
}
|
||||||
g_array_free (priv->outline_array, TRUE);
|
g_array_free (self->outline_array, TRUE);
|
||||||
|
for (guint i = 0; i < 4; i++) {
|
||||||
|
// free self->view[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
G_OBJECT_CLASS (eek_keyboard_parent_class)->finalize (object);
|
void level_keyboard_free(LevelKeyboard *self) {
|
||||||
|
level_keyboard_deinit(self);
|
||||||
|
g_free(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -482,12 +460,22 @@ eek_keyboard_init (EekKeyboard *self)
|
|||||||
{
|
{
|
||||||
self->priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
self->priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||||
self->priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_NONE;
|
self->priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_NONE;
|
||||||
self->priv->outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline));
|
|
||||||
self->priv->names = g_hash_table_new (g_str_hash, g_str_equal);
|
|
||||||
self->level = 0;
|
|
||||||
self->scale = 1.0;
|
self->scale = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void level_keyboard_init(LevelKeyboard *self) {
|
||||||
|
self->outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline));
|
||||||
|
}
|
||||||
|
|
||||||
|
LevelKeyboard *level_keyboard_new(EekboardContextService *manager, EekKeyboard *view, GHashTable *name_key_hash) {
|
||||||
|
LevelKeyboard *keyboard = g_new0(LevelKeyboard, 1);
|
||||||
|
level_keyboard_init(keyboard);
|
||||||
|
keyboard->view = view;
|
||||||
|
keyboard->manager = manager;
|
||||||
|
keyboard->names = name_key_hash;
|
||||||
|
return keyboard;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eek_keyboard_find_key_by_name:
|
* eek_keyboard_find_key_by_name:
|
||||||
* @keyboard: an #EekKeyboard
|
* @keyboard: an #EekKeyboard
|
||||||
@ -497,12 +485,10 @@ eek_keyboard_init (EekKeyboard *self)
|
|||||||
* Return value: (transfer none): #EekKey whose name is @name
|
* Return value: (transfer none): #EekKey whose name is @name
|
||||||
*/
|
*/
|
||||||
EekKey *
|
EekKey *
|
||||||
eek_keyboard_find_key_by_name (EekKeyboard *keyboard,
|
eek_keyboard_find_key_by_name (LevelKeyboard *keyboard,
|
||||||
const gchar *name)
|
const gchar *name)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
return g_hash_table_lookup (keyboard->names, name);
|
||||||
return g_hash_table_lookup (keyboard->priv->names,
|
|
||||||
name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -554,15 +540,6 @@ eek_keyboard_get_modifier_behavior (EekKeyboard *keyboard)
|
|||||||
return keyboard->priv->modifier_behavior;
|
return keyboard->priv->modifier_behavior;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
eek_keyboard_set_modifiers (EekKeyboard *keyboard,
|
|
||||||
EekModifierType modifiers)
|
|
||||||
{
|
|
||||||
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
|
|
||||||
keyboard->priv->modifiers = modifiers;
|
|
||||||
set_level_from_modifiers (keyboard, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eek_keyboard_get_modifiers:
|
* eek_keyboard_get_modifiers:
|
||||||
* @keyboard: an #EekKeyboard
|
* @keyboard: an #EekKeyboard
|
||||||
@ -577,30 +554,6 @@ eek_keyboard_get_modifiers (EekKeyboard *keyboard)
|
|||||||
return keyboard->priv->modifiers;
|
return keyboard->priv->modifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* eek_keyboard_add_outline:
|
|
||||||
* @keyboard: an #EekKeyboard
|
|
||||||
* @outline: an #EekOutline
|
|
||||||
*
|
|
||||||
* Register an outline of @keyboard.
|
|
||||||
* Returns: an unsigned integer ID of the registered outline, for
|
|
||||||
* later reference
|
|
||||||
*/
|
|
||||||
guint
|
|
||||||
eek_keyboard_add_outline (EekKeyboard *keyboard,
|
|
||||||
EekOutline *outline)
|
|
||||||
{
|
|
||||||
EekOutline *_outline;
|
|
||||||
|
|
||||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
|
||||||
|
|
||||||
_outline = eek_outline_copy (outline);
|
|
||||||
g_array_append_val (keyboard->priv->outline_array, *_outline);
|
|
||||||
/* don't use eek_outline_free here, so as to keep _outline->points */
|
|
||||||
g_slice_free (EekOutline, _outline);
|
|
||||||
return keyboard->priv->outline_array->len - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eek_keyboard_get_outline:
|
* eek_keyboard_get_outline:
|
||||||
* @keyboard: an #EekKeyboard
|
* @keyboard: an #EekKeyboard
|
||||||
@ -610,29 +563,13 @@ eek_keyboard_add_outline (EekKeyboard *keyboard,
|
|||||||
* Returns: an #EekOutline, which should not be released
|
* Returns: an #EekOutline, which should not be released
|
||||||
*/
|
*/
|
||||||
EekOutline *
|
EekOutline *
|
||||||
eek_keyboard_get_outline (EekKeyboard *keyboard,
|
level_keyboard_get_outline (LevelKeyboard *keyboard,
|
||||||
guint oref)
|
guint oref)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
if (oref > keyboard->outline_array->len)
|
||||||
|
|
||||||
if (oref > keyboard->priv->outline_array->len)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return &g_array_index (keyboard->priv->outline_array, EekOutline, oref);
|
return &g_array_index (keyboard->outline_array, EekOutline, oref);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* eek_keyboard_get_n_outlines:
|
|
||||||
* @keyboard: an #EekKeyboard
|
|
||||||
*
|
|
||||||
* Get the number of outlines defined in @keyboard.
|
|
||||||
* Returns: integer
|
|
||||||
*/
|
|
||||||
gsize
|
|
||||||
eek_keyboard_get_n_outlines (EekKeyboard *keyboard)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
|
||||||
return keyboard->priv->outline_array->len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -731,7 +668,7 @@ eek_keyboard_get_locked_keys (EekKeyboard *keyboard)
|
|||||||
* Returns: a string containing the XKB keymap.
|
* Returns: a string containing the XKB keymap.
|
||||||
*/
|
*/
|
||||||
gchar *
|
gchar *
|
||||||
eek_keyboard_get_keymap(EekKeyboard *keyboard)
|
eek_keyboard_get_keymap(LevelKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
/* Start the keycodes and symbols sections with their respective headers. */
|
/* Start the keycodes and symbols sections with their respective headers. */
|
||||||
gchar *keycodes = g_strdup(keymap_keycodes_header);
|
gchar *keycodes = g_strdup(keymap_keycodes_header);
|
||||||
@ -740,13 +677,13 @@ eek_keyboard_get_keymap(EekKeyboard *keyboard)
|
|||||||
/* Iterate over the keys in the name-to-key hash table. */
|
/* Iterate over the keys in the name-to-key hash table. */
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
gpointer key_name, key_ptr;
|
gpointer key_name, key_ptr;
|
||||||
g_hash_table_iter_init(&iter, keyboard->priv->names);
|
g_hash_table_iter_init(&iter, keyboard->names);
|
||||||
|
|
||||||
while (g_hash_table_iter_next(&iter, &key_name, &key_ptr)) {
|
while (g_hash_table_iter_next(&iter, &key_name, &key_ptr)) {
|
||||||
|
|
||||||
gchar *current, *line;
|
gchar *current, *line;
|
||||||
EekKey *key = EEK_KEY(key_ptr);
|
EekKey *key = EEK_KEY(key_ptr);
|
||||||
int keycode = eek_key_get_keycode(key);
|
guint keycode = eek_key_get_keycode(key);
|
||||||
|
|
||||||
/* Don't include invalid keycodes in the keymap. */
|
/* Don't include invalid keycodes in the keymap. */
|
||||||
if (keycode == EEK_INVALID_KEYCODE)
|
if (keycode == EEK_INVALID_KEYCODE)
|
||||||
@ -780,3 +717,9 @@ eek_keyboard_get_keymap(EekKeyboard *keyboard)
|
|||||||
g_free(symbols);
|
g_free(symbols);
|
||||||
return keymap;
|
return keymap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard)
|
||||||
|
{
|
||||||
|
return keyboard->view;
|
||||||
|
//return keyboard->views[keyboard->level];
|
||||||
|
}
|
||||||
|
|||||||
@ -59,13 +59,7 @@ struct _EekKeyboard
|
|||||||
EekContainer parent;
|
EekContainer parent;
|
||||||
|
|
||||||
EekKeyboardPrivate *priv;
|
EekKeyboardPrivate *priv;
|
||||||
struct xkb_keymap *keymap;
|
|
||||||
int keymap_fd; // keymap formatted as XKB string
|
|
||||||
size_t keymap_len; // length of the data inside keymap_fd
|
|
||||||
double scale;
|
double scale;
|
||||||
guint level;
|
|
||||||
|
|
||||||
EekboardContextService *manager; // unowned reference
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -123,9 +117,24 @@ struct _EekModifierKey {
|
|||||||
};
|
};
|
||||||
typedef struct _EekModifierKey EekModifierKey;
|
typedef struct _EekModifierKey EekModifierKey;
|
||||||
|
|
||||||
|
/// Keyboard state holder
|
||||||
|
struct _LevelKeyboard {
|
||||||
|
guint id;
|
||||||
|
EekKeyboard *view;
|
||||||
|
guint level;
|
||||||
|
struct xkb_keymap *keymap;
|
||||||
|
int keymap_fd; // keymap formatted as XKB string
|
||||||
|
size_t keymap_len; // length of the data inside keymap_fd
|
||||||
|
GArray *outline_array;
|
||||||
|
|
||||||
EekKeyboard *eek_keyboard_new (EekboardContextService *manager,
|
/* Map key names to key objects: */
|
||||||
EekLayout *layout,
|
GHashTable *names;
|
||||||
|
|
||||||
|
EekboardContextService *manager; // unowned reference
|
||||||
|
};
|
||||||
|
typedef struct _LevelKeyboard LevelKeyboard;
|
||||||
|
|
||||||
|
LevelKeyboard *eek_keyboard_new(EekLayout *layout,
|
||||||
gdouble initial_width,
|
gdouble initial_width,
|
||||||
gdouble initial_height);
|
gdouble initial_height);
|
||||||
GType eek_keyboard_get_type
|
GType eek_keyboard_get_type
|
||||||
@ -154,19 +163,12 @@ EekSection *eek_keyboard_create_section
|
|||||||
(EekKeyboard *keyboard);
|
(EekKeyboard *keyboard);
|
||||||
|
|
||||||
EekKey *eek_keyboard_find_key_by_name
|
EekKey *eek_keyboard_find_key_by_name
|
||||||
(EekKeyboard *keyboard,
|
(LevelKeyboard *keyboard,
|
||||||
const gchar *name);
|
const gchar *name);
|
||||||
|
|
||||||
guint eek_keyboard_add_outline
|
EekOutline *level_keyboard_get_outline
|
||||||
(EekKeyboard *keyboard,
|
(LevelKeyboard *keyboard,
|
||||||
EekOutline *outline);
|
|
||||||
|
|
||||||
EekOutline *eek_keyboard_get_outline
|
|
||||||
(EekKeyboard *keyboard,
|
|
||||||
guint oref);
|
guint oref);
|
||||||
gsize eek_keyboard_get_n_outlines
|
|
||||||
(EekKeyboard *keyboard);
|
|
||||||
|
|
||||||
void eek_keyboard_set_num_lock_mask
|
void eek_keyboard_set_num_lock_mask
|
||||||
(EekKeyboard *keyboard,
|
(EekKeyboard *keyboard,
|
||||||
EekModifierType num_lock_mask);
|
EekModifierType num_lock_mask);
|
||||||
@ -189,12 +191,16 @@ EekModifierKey *eek_modifier_key_copy
|
|||||||
void eek_modifier_key_free
|
void eek_modifier_key_free
|
||||||
(EekModifierKey *modkey);
|
(EekModifierKey *modkey);
|
||||||
|
|
||||||
void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp);
|
void eek_keyboard_press_key(LevelKeyboard *keyboard, EekKey *key, guint32 timestamp);
|
||||||
void eek_keyboard_release_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp);
|
void eek_keyboard_release_key(LevelKeyboard *keyboard, EekKey *key, guint32 timestamp);
|
||||||
|
|
||||||
gchar * eek_keyboard_get_keymap
|
gchar * eek_keyboard_get_keymap
|
||||||
(EekKeyboard *keyboard);
|
(LevelKeyboard *keyboard);
|
||||||
|
|
||||||
|
EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard);
|
||||||
|
LevelKeyboard *level_keyboard_new(EekboardContextService *manager, EekKeyboard *view, GHashTable *name_key_hash);
|
||||||
|
void level_keyboard_deinit(LevelKeyboard *self);
|
||||||
|
void level_keyboard_free(LevelKeyboard *self);
|
||||||
/* Create an #EekSection instance and append it to @keyboard. This
|
/* Create an #EekSection instance and append it to @keyboard. This
|
||||||
* function is rarely called by application but called by #EekLayout
|
* function is rarely called by application but called by #EekLayout
|
||||||
* implementation.
|
* implementation.
|
||||||
|
|||||||
@ -31,6 +31,7 @@
|
|||||||
#include "eek-layout.h"
|
#include "eek-layout.h"
|
||||||
#include "eek-keyboard.h"
|
#include "eek-keyboard.h"
|
||||||
#include "eekboard/eekboard-context-service.h"
|
#include "eekboard/eekboard-context-service.h"
|
||||||
|
#include "eek-xml-layout.h"
|
||||||
|
|
||||||
G_DEFINE_ABSTRACT_TYPE (EekLayout, eek_layout, G_TYPE_OBJECT)
|
G_DEFINE_ABSTRACT_TYPE (EekLayout, eek_layout, G_TYPE_OBJECT)
|
||||||
|
|
||||||
@ -45,35 +46,12 @@ eek_layout_init (EekLayout *self)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* eek_keyboard_new:
|
|
||||||
* @layout: an #EekLayout
|
|
||||||
* @initial_width: initial width of the keyboard
|
|
||||||
* @initial_height: initial height of the keyboard
|
|
||||||
*
|
|
||||||
* Create a new #EekKeyboard based on @layout.
|
|
||||||
*/
|
|
||||||
EekKeyboard *
|
|
||||||
eek_keyboard_new (EekboardContextService *manager,
|
|
||||||
EekLayout *layout,
|
|
||||||
gdouble initial_width,
|
|
||||||
gdouble initial_height)
|
|
||||||
{
|
|
||||||
g_assert (EEK_IS_LAYOUT(layout));
|
|
||||||
g_assert (EEK_LAYOUT_GET_CLASS(layout)->create_keyboard);
|
|
||||||
|
|
||||||
return EEK_LAYOUT_GET_CLASS(layout)->create_keyboard (manager,
|
|
||||||
layout,
|
|
||||||
initial_width,
|
|
||||||
initial_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
const double section_spacing = 7.0;
|
const double section_spacing = 7.0;
|
||||||
|
|
||||||
struct place_data {
|
struct place_data {
|
||||||
double desired_width;
|
double desired_width;
|
||||||
double current_offset;
|
double current_offset;
|
||||||
EekKeyboard *keyboard;
|
LevelKeyboard *keyboard;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -87,7 +65,7 @@ section_placer(EekElement *element, gpointer user_data)
|
|||||||
eek_element_set_bounds(element, §ion_bounds);
|
eek_element_set_bounds(element, §ion_bounds);
|
||||||
|
|
||||||
// Sections are rows now. Gather up all the keys and adjust their bounds.
|
// Sections are rows now. Gather up all the keys and adjust their bounds.
|
||||||
eek_section_place_keys(EEK_SECTION(element), EEK_KEYBOARD(data->keyboard));
|
eek_section_place_keys(EEK_SECTION(element), data->keyboard);
|
||||||
|
|
||||||
eek_element_get_bounds(element, §ion_bounds);
|
eek_element_get_bounds(element, §ion_bounds);
|
||||||
section_bounds.y = data->current_offset;
|
section_bounds.y = data->current_offset;
|
||||||
@ -105,7 +83,7 @@ section_counter(EekElement *element, gpointer user_data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
eek_layout_place_sections(EekKeyboard *keyboard)
|
eek_layout_place_sections(LevelKeyboard *keyboard, EekKeyboard *level)
|
||||||
{
|
{
|
||||||
/* Order rows */
|
/* Order rows */
|
||||||
// This needs to be done after outlines, because outlines define key sizes
|
// This needs to be done after outlines, because outlines define key sizes
|
||||||
@ -114,23 +92,23 @@ eek_layout_place_sections(EekKeyboard *keyboard)
|
|||||||
// The keyboard width is given by the user via screen size. The height will be given dynamically.
|
// The keyboard width is given by the user via screen size. The height will be given dynamically.
|
||||||
// TODO: calculate max line width beforehand for button centering. Leave keyboard centering to the renderer later
|
// TODO: calculate max line width beforehand for button centering. Leave keyboard centering to the renderer later
|
||||||
EekBounds keyboard_bounds = {0};
|
EekBounds keyboard_bounds = {0};
|
||||||
eek_element_get_bounds(EEK_ELEMENT(keyboard), &keyboard_bounds);
|
eek_element_get_bounds(EEK_ELEMENT(level), &keyboard_bounds);
|
||||||
|
|
||||||
struct place_data placer_data = {
|
struct place_data placer_data = {
|
||||||
.desired_width = keyboard_bounds.width,
|
.desired_width = keyboard_bounds.width,
|
||||||
.current_offset = 0,
|
.current_offset = 0,
|
||||||
.keyboard = keyboard,
|
.keyboard = keyboard,
|
||||||
};
|
};
|
||||||
eek_container_foreach_child(EEK_CONTAINER(keyboard), section_placer, &placer_data);
|
eek_container_foreach_child(EEK_CONTAINER(level), section_placer, &placer_data);
|
||||||
|
|
||||||
double total_height = 0;
|
double total_height = 0;
|
||||||
eek_container_foreach_child(EEK_CONTAINER(keyboard), section_counter, &total_height);
|
eek_container_foreach_child(EEK_CONTAINER(level), section_counter, &total_height);
|
||||||
keyboard_bounds.height = total_height;
|
keyboard_bounds.height = total_height;
|
||||||
eek_element_set_bounds(EEK_ELEMENT(keyboard), &keyboard_bounds);
|
eek_element_set_bounds(EEK_ELEMENT(level), &keyboard_bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
eek_layout_update_layout(EekKeyboard *keyboard)
|
eek_layout_update_layout(LevelKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
eek_layout_place_sections(keyboard);
|
eek_layout_place_sections(keyboard, level_keyboard_current(keyboard));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,7 +43,7 @@ struct _EekLayoutClass
|
|||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
|
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
EekKeyboard* (* create_keyboard) (EekboardContextService *manager,
|
LevelKeyboard* (* create_keyboard) (EekboardContextService *manager,
|
||||||
EekLayout *self,
|
EekLayout *self,
|
||||||
gdouble initial_width,
|
gdouble initial_width,
|
||||||
gdouble initial_height);
|
gdouble initial_height);
|
||||||
@ -55,9 +55,14 @@ struct _EekLayoutClass
|
|||||||
|
|
||||||
GType eek_layout_get_type (void) G_GNUC_CONST;
|
GType eek_layout_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
void eek_layout_place_sections(EekKeyboard *keyboard);
|
void eek_layout_place_sections(LevelKeyboard *keyboard, EekKeyboard *level);
|
||||||
|
|
||||||
void eek_layout_update_layout(EekKeyboard *keyboard);
|
void eek_layout_update_layout(LevelKeyboard *keyboard);
|
||||||
|
|
||||||
|
|
||||||
|
LevelKeyboard *
|
||||||
|
level_keyboard_from_layout (EekLayout *layout,
|
||||||
|
gdouble initial_width,
|
||||||
|
gdouble initial_height);
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* EEK_LAYOUT_H */
|
#endif /* EEK_LAYOUT_H */
|
||||||
|
|||||||
@ -32,7 +32,6 @@
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_KEYBOARD,
|
|
||||||
PROP_PCONTEXT,
|
PROP_PCONTEXT,
|
||||||
PROP_STYLE_CONTEXT,
|
PROP_STYLE_CONTEXT,
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
@ -40,7 +39,7 @@ enum {
|
|||||||
|
|
||||||
typedef struct _EekRendererPrivate
|
typedef struct _EekRendererPrivate
|
||||||
{
|
{
|
||||||
EekKeyboard *keyboard;
|
LevelKeyboard *keyboard;
|
||||||
PangoContext *pcontext;
|
PangoContext *pcontext;
|
||||||
GtkCssProvider *css_provider;
|
GtkCssProvider *css_provider;
|
||||||
GtkStyleContext *scontext;
|
GtkStyleContext *scontext;
|
||||||
@ -149,7 +148,7 @@ render_keyboard_surface (EekRenderer *renderer)
|
|||||||
|
|
||||||
eek_renderer_get_foreground_color (renderer, priv->scontext, &foreground);
|
eek_renderer_get_foreground_color (renderer, priv->scontext, &foreground);
|
||||||
|
|
||||||
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
|
eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds);
|
||||||
|
|
||||||
data.cr = cairo_create (priv->keyboard_surface);
|
data.cr = cairo_create (priv->keyboard_surface);
|
||||||
data.renderer = renderer;
|
data.renderer = renderer;
|
||||||
@ -176,7 +175,7 @@ render_keyboard_surface (EekRenderer *renderer)
|
|||||||
|
|
||||||
data.level = priv->keyboard->level;
|
data.level = priv->keyboard->level;
|
||||||
/* draw sections */
|
/* draw sections */
|
||||||
eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
|
eek_container_foreach_child (EEK_CONTAINER(level_keyboard_current(priv->keyboard)),
|
||||||
create_keyboard_surface_section_callback,
|
create_keyboard_surface_section_callback,
|
||||||
&data);
|
&data);
|
||||||
cairo_restore (data.cr);
|
cairo_restore (data.cr);
|
||||||
@ -196,7 +195,7 @@ render_key_outline (EekRenderer *renderer,
|
|||||||
guint oref;
|
guint oref;
|
||||||
|
|
||||||
oref = eek_key_get_oref (key);
|
oref = eek_key_get_oref (key);
|
||||||
outline = eek_keyboard_get_outline (priv->keyboard, oref);
|
outline = level_keyboard_get_outline (priv->keyboard, oref);
|
||||||
if (outline == NULL)
|
if (outline == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -231,7 +230,7 @@ render_key (EekRenderer *self,
|
|||||||
EekColor foreground;
|
EekColor foreground;
|
||||||
|
|
||||||
oref = eek_key_get_oref (key);
|
oref = eek_key_get_oref (key);
|
||||||
outline = eek_keyboard_get_outline (priv->keyboard, oref);
|
outline = level_keyboard_get_outline (priv->keyboard, oref);
|
||||||
if (outline == NULL)
|
if (outline == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -524,10 +523,6 @@ eek_renderer_set_property (GObject *object,
|
|||||||
EEK_RENDERER(object));
|
EEK_RENDERER(object));
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_KEYBOARD:
|
|
||||||
priv->keyboard = g_value_get_object (value);
|
|
||||||
g_object_ref (priv->keyboard);
|
|
||||||
break;
|
|
||||||
case PROP_PCONTEXT:
|
case PROP_PCONTEXT:
|
||||||
priv->pcontext = g_value_get_object (value);
|
priv->pcontext = g_value_get_object (value);
|
||||||
g_object_ref (priv->pcontext);
|
g_object_ref (priv->pcontext);
|
||||||
@ -548,13 +543,7 @@ eek_renderer_get_property (GObject *object,
|
|||||||
GValue *value,
|
GValue *value,
|
||||||
GParamSpec *pspec)
|
GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (
|
|
||||||
EEK_RENDERER(object));
|
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_KEYBOARD:
|
|
||||||
g_value_set_object (value, priv->keyboard);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -568,7 +557,6 @@ eek_renderer_dispose (GObject *object)
|
|||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
|
EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
|
||||||
|
|
||||||
if (priv->keyboard) {
|
if (priv->keyboard) {
|
||||||
g_object_unref (priv->keyboard);
|
|
||||||
priv->keyboard = NULL;
|
priv->keyboard = NULL;
|
||||||
}
|
}
|
||||||
if (priv->pcontext) {
|
if (priv->pcontext) {
|
||||||
@ -612,15 +600,6 @@ eek_renderer_class_init (EekRendererClass *klass)
|
|||||||
gobject_class->dispose = eek_renderer_dispose;
|
gobject_class->dispose = eek_renderer_dispose;
|
||||||
gobject_class->finalize = eek_renderer_finalize;
|
gobject_class->finalize = eek_renderer_finalize;
|
||||||
|
|
||||||
pspec = g_param_spec_object ("keyboard",
|
|
||||||
"Keyboard",
|
|
||||||
"Keyboard",
|
|
||||||
EEK_TYPE_KEYBOARD,
|
|
||||||
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_KEYBOARD,
|
|
||||||
pspec);
|
|
||||||
|
|
||||||
pspec = g_param_spec_object ("pango-context",
|
pspec = g_param_spec_object ("pango-context",
|
||||||
"Pango Context",
|
"Pango Context",
|
||||||
"Pango Context",
|
"Pango Context",
|
||||||
@ -712,15 +691,17 @@ invalidate (EekRenderer *renderer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
EekRenderer *
|
EekRenderer *
|
||||||
eek_renderer_new (EekKeyboard *keyboard,
|
eek_renderer_new (LevelKeyboard *keyboard,
|
||||||
PangoContext *pcontext,
|
PangoContext *pcontext,
|
||||||
GtkStyleContext *scontext)
|
GtkStyleContext *scontext)
|
||||||
{
|
{
|
||||||
return g_object_new (EEK_TYPE_RENDERER,
|
EekRenderer *renderer = g_object_new (EEK_TYPE_RENDERER,
|
||||||
"keyboard", keyboard,
|
|
||||||
"pango-context", pcontext,
|
"pango-context", pcontext,
|
||||||
"style-context", scontext,
|
"style-context", scontext,
|
||||||
NULL);
|
NULL);
|
||||||
|
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
||||||
|
priv->keyboard = keyboard;
|
||||||
|
return renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -741,7 +722,7 @@ eek_renderer_set_allocation_size (EekRenderer *renderer,
|
|||||||
|
|
||||||
/* Calculate a scale factor to use when rendering the keyboard into the
|
/* Calculate a scale factor to use when rendering the keyboard into the
|
||||||
available space. */
|
available space. */
|
||||||
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
|
eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds);
|
||||||
|
|
||||||
gdouble w = (bounds.x * 2) + bounds.width;
|
gdouble w = (bounds.x * 2) + bounds.width;
|
||||||
gdouble h = (bounds.y * 2) + bounds.height;
|
gdouble h = (bounds.y * 2) + bounds.height;
|
||||||
@ -766,7 +747,7 @@ eek_renderer_get_size (EekRenderer *renderer,
|
|||||||
|
|
||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
|
eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds);
|
||||||
if (width)
|
if (width)
|
||||||
*width = bounds.width;
|
*width = bounds.width;
|
||||||
if (height)
|
if (height)
|
||||||
@ -794,7 +775,7 @@ eek_renderer_get_key_bounds (EekRenderer *renderer,
|
|||||||
|
|
||||||
eek_element_get_bounds (EEK_ELEMENT(key), bounds);
|
eek_element_get_bounds (EEK_ELEMENT(key), bounds);
|
||||||
eek_element_get_bounds (section, §ion_bounds);
|
eek_element_get_bounds (section, §ion_bounds);
|
||||||
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard),
|
eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)),
|
||||||
&keyboard_bounds);
|
&keyboard_bounds);
|
||||||
|
|
||||||
if (!rotate) {
|
if (!rotate) {
|
||||||
@ -1085,7 +1066,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
|
|||||||
g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
|
g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
|
||||||
|
|
||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
||||||
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
|
eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds);
|
||||||
|
|
||||||
/* Transform from widget coordinates to keyboard coordinates */
|
/* Transform from widget coordinates to keyboard coordinates */
|
||||||
x = (x - priv->origin_x)/priv->scale - bounds.x;
|
x = (x - priv->origin_x)/priv->scale - bounds.x;
|
||||||
@ -1104,7 +1085,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
|
|||||||
data.key = NULL;
|
data.key = NULL;
|
||||||
data.renderer = renderer;
|
data.renderer = renderer;
|
||||||
|
|
||||||
eek_container_find (EEK_CONTAINER(priv->keyboard),
|
eek_container_find (EEK_CONTAINER(level_keyboard_current(priv->keyboard)),
|
||||||
find_key_by_position_section_callback,
|
find_key_by_position_section_callback,
|
||||||
&data);
|
&data);
|
||||||
return data.key;
|
return data.key;
|
||||||
|
|||||||
@ -63,7 +63,7 @@ struct _EekRendererClass
|
|||||||
};
|
};
|
||||||
|
|
||||||
GType eek_renderer_get_type (void) G_GNUC_CONST;
|
GType eek_renderer_get_type (void) G_GNUC_CONST;
|
||||||
EekRenderer *eek_renderer_new (EekKeyboard *keyboard,
|
EekRenderer *eek_renderer_new (LevelKeyboard *keyboard,
|
||||||
PangoContext *pcontext,
|
PangoContext *pcontext,
|
||||||
GtkStyleContext *scontext);
|
GtkStyleContext *scontext);
|
||||||
void eek_renderer_set_allocation_size
|
void eek_renderer_set_allocation_size
|
||||||
|
|||||||
@ -404,9 +404,9 @@ keysizer(EekElement *element, gpointer user_data)
|
|||||||
{
|
{
|
||||||
EekKey *key = EEK_KEY(element);
|
EekKey *key = EEK_KEY(element);
|
||||||
|
|
||||||
EekKeyboard *keyboard = EEK_KEYBOARD(user_data);
|
LevelKeyboard *keyboard = user_data;
|
||||||
uint oref = eek_key_get_oref (key);
|
uint oref = eek_key_get_oref (key);
|
||||||
EekOutline *outline = eek_keyboard_get_outline (keyboard, oref);
|
EekOutline *outline = level_keyboard_get_outline (keyboard, oref);
|
||||||
if (outline && outline->num_points > 0) {
|
if (outline && outline->num_points > 0) {
|
||||||
double minx = outline->points[0].x;
|
double minx = outline->points[0].x;
|
||||||
double maxx = minx;
|
double maxx = minx;
|
||||||
@ -464,7 +464,7 @@ keyplacer(EekElement *element, gpointer user_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
eek_section_place_keys(EekSection *section, EekKeyboard *keyboard)
|
eek_section_place_keys(EekSection *section, LevelKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
eek_container_foreach_child(EEK_CONTAINER(section), keysizer, keyboard);
|
eek_container_foreach_child(EEK_CONTAINER(section), keysizer, keyboard);
|
||||||
|
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
#include "eek-container.h"
|
#include "eek-container.h"
|
||||||
#include "eek-types.h"
|
#include "eek-types.h"
|
||||||
|
#include "eek-keyboard.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
@ -97,7 +98,7 @@ EekKey *eek_section_create_key (EekSection *section,
|
|||||||
const gchar *name,
|
const gchar *name,
|
||||||
guint keycode);
|
guint keycode);
|
||||||
|
|
||||||
void eek_section_place_keys (EekSection *section, EekKeyboard *keyboard);
|
void eek_section_place_keys (EekSection *section, LevelKeyboard *keyboard);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* EEK_SECTION_H */
|
#endif /* EEK_SECTION_H */
|
||||||
|
|||||||
@ -150,6 +150,7 @@ typedef struct _EekOutline EekOutline;
|
|||||||
typedef struct _EekColor EekColor;
|
typedef struct _EekColor EekColor;
|
||||||
|
|
||||||
typedef struct _EekboardContextService EekboardContextService;
|
typedef struct _EekboardContextService EekboardContextService;
|
||||||
|
typedef struct _LevelKeyboard LevelKeyboard;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EekPoint:
|
* EekPoint:
|
||||||
|
|||||||
@ -68,16 +68,16 @@ static GList *parse_prerequisites
|
|||||||
(const gchar *path,
|
(const gchar *path,
|
||||||
GError **error);
|
GError **error);
|
||||||
static gboolean parse_geometry (const gchar *path,
|
static gboolean parse_geometry (const gchar *path,
|
||||||
EekKeyboard *keyboard,
|
EekKeyboard *keyboard, GArray *outline_array, GHashTable *name_key_hash,
|
||||||
GError **error);
|
GError **error);
|
||||||
static gboolean parse_symbols_with_prerequisites
|
static gboolean parse_symbols_with_prerequisites
|
||||||
(const gchar *keyboards_dir,
|
(const gchar *keyboards_dir,
|
||||||
const gchar *name,
|
const gchar *name,
|
||||||
EekKeyboard *keyboard,
|
LevelKeyboard *keyboard,
|
||||||
GList **loaded,
|
GList **loaded,
|
||||||
GError **error);
|
GError **error);
|
||||||
static gboolean parse_symbols (const gchar *path,
|
static gboolean parse_symbols (const gchar *path,
|
||||||
EekKeyboard *keyboard,
|
LevelKeyboard *keyboard,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
static gboolean validate (const gchar **valid_path_list,
|
static gboolean validate (const gchar **valid_path_list,
|
||||||
@ -255,7 +255,7 @@ struct _GeometryParseData {
|
|||||||
typedef struct _GeometryParseData GeometryParseData;
|
typedef struct _GeometryParseData GeometryParseData;
|
||||||
|
|
||||||
static GeometryParseData *
|
static GeometryParseData *
|
||||||
geometry_parse_data_new (EekKeyboard *keyboard)
|
geometry_parse_data_new (EekKeyboard *keyboard, GHashTable *name_key_hash)
|
||||||
{
|
{
|
||||||
GeometryParseData *data = g_slice_new0 (GeometryParseData);
|
GeometryParseData *data = g_slice_new0 (GeometryParseData);
|
||||||
|
|
||||||
@ -271,12 +271,7 @@ geometry_parse_data_new (EekKeyboard *keyboard)
|
|||||||
g_free,
|
g_free,
|
||||||
(GDestroyNotify)eek_outline_free);
|
(GDestroyNotify)eek_outline_free);
|
||||||
|
|
||||||
data->name_key_hash =
|
data->name_key_hash = name_key_hash;
|
||||||
g_hash_table_new_full (g_str_hash,
|
|
||||||
g_str_equal,
|
|
||||||
g_free,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
data->text = g_string_sized_new (BUFSIZE);
|
data->text = g_string_sized_new (BUFSIZE);
|
||||||
data->keycode = 8;
|
data->keycode = 8;
|
||||||
return data;
|
return data;
|
||||||
@ -600,7 +595,8 @@ struct _SymbolsParseData {
|
|||||||
GSList *element_stack;
|
GSList *element_stack;
|
||||||
GString *text;
|
GString *text;
|
||||||
|
|
||||||
EekKeyboard *keyboard;
|
LevelKeyboard *keyboard;
|
||||||
|
EekKeyboard *view;
|
||||||
EekKey *key;
|
EekKey *key;
|
||||||
gchar *label;
|
gchar *label;
|
||||||
gchar *icon;
|
gchar *icon;
|
||||||
@ -611,11 +607,11 @@ struct _SymbolsParseData {
|
|||||||
typedef struct _SymbolsParseData SymbolsParseData;
|
typedef struct _SymbolsParseData SymbolsParseData;
|
||||||
|
|
||||||
static SymbolsParseData *
|
static SymbolsParseData *
|
||||||
symbols_parse_data_new (EekKeyboard *keyboard)
|
symbols_parse_data_new (LevelKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
SymbolsParseData *data = g_slice_new0 (SymbolsParseData);
|
SymbolsParseData *data = g_slice_new0 (SymbolsParseData);
|
||||||
|
|
||||||
data->keyboard = g_object_ref (keyboard);
|
data->keyboard = keyboard;
|
||||||
data->text = g_string_sized_new (BUFSIZE);
|
data->text = g_string_sized_new (BUFSIZE);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -623,7 +619,6 @@ symbols_parse_data_new (EekKeyboard *keyboard)
|
|||||||
static void
|
static void
|
||||||
symbols_parse_data_free (SymbolsParseData *data)
|
symbols_parse_data_free (SymbolsParseData *data)
|
||||||
{
|
{
|
||||||
g_object_unref (data->keyboard);
|
|
||||||
g_string_free (data->text, TRUE);
|
g_string_free (data->text, TRUE);
|
||||||
g_slice_free (SymbolsParseData, data);
|
g_slice_free (SymbolsParseData, data);
|
||||||
}
|
}
|
||||||
@ -881,11 +876,9 @@ static const GMarkupParser prerequisites_parser = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static EekKeyboard *
|
LevelKeyboard *
|
||||||
eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
|
eek_xml_layout_real_create_keyboard (EekLayout *self,
|
||||||
EekLayout *self,
|
EekboardContextService *manager)
|
||||||
gdouble initial_width,
|
|
||||||
gdouble initial_height)
|
|
||||||
{
|
{
|
||||||
EekXmlLayout *layout = EEK_XML_LAYOUT (self);
|
EekXmlLayout *layout = EEK_XML_LAYOUT (self);
|
||||||
EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
|
EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
|
||||||
@ -893,19 +886,26 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
|
|||||||
|
|
||||||
/* Create an empty keyboard to which geometry and symbols
|
/* Create an empty keyboard to which geometry and symbols
|
||||||
information are applied. */
|
information are applied. */
|
||||||
EekKeyboard *keyboard = g_object_new (EEK_TYPE_KEYBOARD, NULL);
|
EekKeyboard *view = g_object_new (EEK_TYPE_KEYBOARD, NULL);
|
||||||
keyboard->manager = manager;
|
|
||||||
|
|
||||||
/* Read geometry information. */
|
/* Read geometry information. */
|
||||||
gchar *filename = g_strdup_printf ("%s.xml", priv->desc->geometry);
|
gchar *filename = g_strdup_printf ("%s.xml", priv->desc->geometry);
|
||||||
gchar *path = g_build_filename (priv->keyboards_dir, "geometry", filename, NULL);
|
gchar *path = g_build_filename (priv->keyboards_dir, "geometry", filename, NULL);
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
|
|
||||||
|
GArray *outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline));
|
||||||
|
|
||||||
|
GHashTable *name_key_hash =
|
||||||
|
g_hash_table_new_full (g_str_hash,
|
||||||
|
g_str_equal,
|
||||||
|
g_free,
|
||||||
|
NULL);
|
||||||
|
; // char* -> EekKey*
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
retval = parse_geometry (path, keyboard, &error);
|
retval = parse_geometry (path, view, outline_array, name_key_hash, &error);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
if (!retval) {
|
if (!retval) {
|
||||||
g_object_unref (keyboard);
|
g_object_unref (view);
|
||||||
g_warning ("can't parse geometry file %s: %s",
|
g_warning ("can't parse geometry file %s: %s",
|
||||||
priv->desc->geometry,
|
priv->desc->geometry,
|
||||||
error->message);
|
error->message);
|
||||||
@ -913,6 +913,12 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LevelKeyboard *keyboard = level_keyboard_new(manager, view, name_key_hash);
|
||||||
|
|
||||||
|
keyboard->outline_array = outline_array;
|
||||||
|
// FIXME: are symbols shared betwen views?
|
||||||
|
|
||||||
/* Read symbols information. */
|
/* Read symbols information. */
|
||||||
GList *loaded = NULL;
|
GList *loaded = NULL;
|
||||||
retval = parse_symbols_with_prerequisites (priv->keyboards_dir,
|
retval = parse_symbols_with_prerequisites (priv->keyboards_dir,
|
||||||
@ -922,7 +928,7 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
|
|||||||
&error);
|
&error);
|
||||||
g_list_free_full (loaded, g_free);
|
g_list_free_full (loaded, g_free);
|
||||||
if (!retval) {
|
if (!retval) {
|
||||||
g_object_unref (keyboard);
|
g_object_unref (view);
|
||||||
g_warning ("can't parse symbols file %s: %s",
|
g_warning ("can't parse symbols file %s: %s",
|
||||||
priv->desc->symbols,
|
priv->desc->symbols,
|
||||||
error->message);
|
error->message);
|
||||||
@ -930,11 +936,11 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
eek_layout_place_sections(keyboard);
|
eek_layout_place_sections(keyboard, view);
|
||||||
|
|
||||||
/* Use pre-defined modifier mask here. */
|
/* Use pre-defined modifier mask here. */
|
||||||
eek_keyboard_set_num_lock_mask (keyboard, EEK_MOD2_MASK);
|
eek_keyboard_set_num_lock_mask (view, EEK_MOD2_MASK);
|
||||||
eek_keyboard_set_alt_gr_mask (keyboard, EEK_BUTTON1_MASK);
|
eek_keyboard_set_alt_gr_mask (view, EEK_BUTTON1_MASK);
|
||||||
|
|
||||||
return keyboard;
|
return keyboard;
|
||||||
}
|
}
|
||||||
@ -997,12 +1003,9 @@ eek_xml_layout_finalize (GObject *object)
|
|||||||
static void
|
static void
|
||||||
eek_xml_layout_class_init (EekXmlLayoutClass *klass)
|
eek_xml_layout_class_init (EekXmlLayoutClass *klass)
|
||||||
{
|
{
|
||||||
EekLayoutClass *layout_class = EEK_LAYOUT_CLASS (klass);
|
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
GParamSpec *pspec;
|
GParamSpec *pspec;
|
||||||
|
|
||||||
layout_class->create_keyboard = eek_xml_layout_real_create_keyboard;
|
|
||||||
|
|
||||||
gobject_class->set_property = eek_xml_layout_set_property;
|
gobject_class->set_property = eek_xml_layout_set_property;
|
||||||
gobject_class->get_property = eek_xml_layout_get_property;
|
gobject_class->get_property = eek_xml_layout_get_property;
|
||||||
gobject_class->finalize = eek_xml_layout_finalize;
|
gobject_class->finalize = eek_xml_layout_finalize;
|
||||||
@ -1122,8 +1125,30 @@ eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc)
|
|||||||
g_slice_free (EekXmlKeyboardDesc, desc);
|
g_slice_free (EekXmlKeyboardDesc, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* eek_keyboard_add_outline:
|
||||||
|
* @keyboard: an #EekKeyboard
|
||||||
|
* @outline: an #EekOutline
|
||||||
|
*
|
||||||
|
* Register an outline of @keyboard.
|
||||||
|
* Returns: an unsigned integer ID of the registered outline, for
|
||||||
|
* later reference
|
||||||
|
*/
|
||||||
|
static guint
|
||||||
|
add_outline (GArray *outline_array,
|
||||||
|
EekOutline *outline)
|
||||||
|
{
|
||||||
|
EekOutline *_outline;
|
||||||
|
|
||||||
|
_outline = eek_outline_copy (outline);
|
||||||
|
g_array_append_val (outline_array, *_outline);
|
||||||
|
/* don't use eek_outline_free here, so as to keep _outline->points */
|
||||||
|
g_slice_free (EekOutline, _outline);
|
||||||
|
return outline_array->len - 1;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
|
parse_geometry (const gchar *path, EekKeyboard *keyboard, GArray *outline_array, GHashTable *name_key_hash, GError **error)
|
||||||
{
|
{
|
||||||
GeometryParseData *data;
|
GeometryParseData *data;
|
||||||
GMarkupParseContext *pcontext;
|
GMarkupParseContext *pcontext;
|
||||||
@ -1143,7 +1168,7 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
|
|||||||
if (input == NULL)
|
if (input == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
data = geometry_parse_data_new (keyboard);
|
data = geometry_parse_data_new (keyboard, name_key_hash);
|
||||||
pcontext = g_markup_parse_context_new (&geometry_parser,
|
pcontext = g_markup_parse_context_new (&geometry_parser,
|
||||||
0,
|
0,
|
||||||
data,
|
data,
|
||||||
@ -1164,7 +1189,7 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
|
|||||||
EekOutline *outline = v;
|
EekOutline *outline = v;
|
||||||
gulong oref;
|
gulong oref;
|
||||||
|
|
||||||
oref = eek_keyboard_add_outline (data->keyboard, outline);
|
oref = add_outline (outline_array, outline);
|
||||||
g_hash_table_insert (oref_hash, k, GUINT_TO_POINTER(oref));
|
g_hash_table_insert (oref_hash, k, GUINT_TO_POINTER(oref));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1183,7 +1208,7 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
|
|||||||
static gboolean
|
static gboolean
|
||||||
parse_symbols_with_prerequisites (const gchar *keyboards_dir,
|
parse_symbols_with_prerequisites (const gchar *keyboards_dir,
|
||||||
const gchar *name,
|
const gchar *name,
|
||||||
EekKeyboard *keyboard,
|
LevelKeyboard *keyboard,
|
||||||
GList **loaded,
|
GList **loaded,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
@ -1233,7 +1258,7 @@ parse_symbols_with_prerequisites (const gchar *keyboards_dir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
parse_symbols (const gchar *path, EekKeyboard *keyboard, GError **error)
|
parse_symbols (const gchar *path, LevelKeyboard *keyboard, GError **error)
|
||||||
{
|
{
|
||||||
SymbolsParseData *data;
|
SymbolsParseData *data;
|
||||||
GMarkupParseContext *pcontext;
|
GMarkupParseContext *pcontext;
|
||||||
|
|||||||
@ -62,5 +62,8 @@ GList *eek_xml_list_keyboards (void);
|
|||||||
EekXmlKeyboardDesc *eek_xml_keyboard_desc_copy (EekXmlKeyboardDesc *desc);
|
EekXmlKeyboardDesc *eek_xml_keyboard_desc_copy (EekXmlKeyboardDesc *desc);
|
||||||
void eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc);
|
void eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc);
|
||||||
|
|
||||||
|
LevelKeyboard *
|
||||||
|
eek_xml_layout_real_create_keyboard (EekLayout *self,
|
||||||
|
EekboardContextService *manager);
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* EEK_XML_LAYOUT_H */
|
#endif /* EEK_XML_LAYOUT_H */
|
||||||
|
|||||||
@ -71,7 +71,7 @@ struct _EekboardContextServicePrivate {
|
|||||||
gboolean visible;
|
gboolean visible;
|
||||||
gboolean fullscreen;
|
gboolean fullscreen;
|
||||||
|
|
||||||
EekKeyboard *keyboard; // currently used keyboard
|
LevelKeyboard *keyboard; // currently used keyboard
|
||||||
GHashTable *keyboard_hash; // a table of available keyboards, per layout
|
GHashTable *keyboard_hash; // a table of available keyboards, per layout
|
||||||
|
|
||||||
// TODO: make use of repeating buttons
|
// TODO: make use of repeating buttons
|
||||||
@ -86,11 +86,10 @@ struct _EekboardContextServicePrivate {
|
|||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT);
|
G_DEFINE_TYPE_WITH_PRIVATE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT);
|
||||||
|
|
||||||
static EekKeyboard *
|
static LevelKeyboard *
|
||||||
eekboard_context_service_real_create_keyboard (EekboardContextService *self,
|
eekboard_context_service_real_create_keyboard (EekboardContextService *self,
|
||||||
const gchar *keyboard_type)
|
const gchar *keyboard_type)
|
||||||
{
|
{
|
||||||
EekKeyboard *keyboard;
|
|
||||||
EekLayout *layout;
|
EekLayout *layout;
|
||||||
GError *error;
|
GError *error;
|
||||||
|
|
||||||
@ -135,7 +134,7 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
keyboard = eek_keyboard_new (self, layout, CSW, CSH);
|
LevelKeyboard *keyboard = eek_xml_layout_real_create_keyboard(layout, self);
|
||||||
if (!keyboard) {
|
if (!keyboard) {
|
||||||
g_error("Failed to create a keyboard");
|
g_error("Failed to create a keyboard");
|
||||||
}
|
}
|
||||||
@ -319,21 +318,18 @@ settings_update_layout(EekboardContextService *context)
|
|||||||
|
|
||||||
// generic part follows
|
// generic part follows
|
||||||
static guint keyboard_id = 0;
|
static guint keyboard_id = 0;
|
||||||
EekKeyboard *keyboard = g_hash_table_lookup(context->priv->keyboard_hash,
|
LevelKeyboard *keyboard = g_hash_table_lookup(context->priv->keyboard_hash,
|
||||||
GUINT_TO_POINTER(keyboard_id));
|
GUINT_TO_POINTER(keyboard_id));
|
||||||
// create a keyboard
|
// create a keyboard
|
||||||
if (!keyboard) {
|
if (!keyboard) {
|
||||||
EekboardContextServiceClass *klass = EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context);
|
keyboard = eekboard_context_service_real_create_keyboard(context, keyboard_layout);
|
||||||
keyboard = klass->create_keyboard (context, keyboard_layout);
|
eek_keyboard_set_modifier_behavior (level_keyboard_current(keyboard),
|
||||||
eek_keyboard_set_modifier_behavior (keyboard,
|
|
||||||
EEK_MODIFIER_BEHAVIOR_LATCH);
|
EEK_MODIFIER_BEHAVIOR_LATCH);
|
||||||
|
|
||||||
g_hash_table_insert (context->priv->keyboard_hash,
|
g_hash_table_insert (context->priv->keyboard_hash,
|
||||||
GUINT_TO_POINTER(keyboard_id),
|
GUINT_TO_POINTER(keyboard_id),
|
||||||
keyboard);
|
keyboard);
|
||||||
g_object_set_data (G_OBJECT(keyboard),
|
keyboard->id = keyboard_id;
|
||||||
"keyboard-id",
|
|
||||||
GUINT_TO_POINTER(keyboard_id));
|
|
||||||
keyboard_id++;
|
keyboard_id++;
|
||||||
}
|
}
|
||||||
// set as current
|
// set as current
|
||||||
@ -374,7 +370,6 @@ eekboard_context_service_class_init (EekboardContextServiceClass *klass)
|
|||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
GParamSpec *pspec;
|
GParamSpec *pspec;
|
||||||
|
|
||||||
klass->create_keyboard = eekboard_context_service_real_create_keyboard;
|
|
||||||
klass->show_keyboard = eekboard_context_service_real_show_keyboard;
|
klass->show_keyboard = eekboard_context_service_real_show_keyboard;
|
||||||
klass->hide_keyboard = eekboard_context_service_real_hide_keyboard;
|
klass->hide_keyboard = eekboard_context_service_real_hide_keyboard;
|
||||||
|
|
||||||
@ -578,7 +573,7 @@ eekboard_context_service_destroy (EekboardContextService *context)
|
|||||||
* Get keyboard currently active in @context.
|
* Get keyboard currently active in @context.
|
||||||
* Returns: (transfer none): an #EekKeyboard
|
* Returns: (transfer none): an #EekKeyboard
|
||||||
*/
|
*/
|
||||||
EekKeyboard *
|
LevelKeyboard *
|
||||||
eekboard_context_service_get_keyboard (EekboardContextService *context)
|
eekboard_context_service_get_keyboard (EekboardContextService *context)
|
||||||
{
|
{
|
||||||
return context->priv->keyboard;
|
return context->priv->keyboard;
|
||||||
@ -598,7 +593,7 @@ eekboard_context_service_get_fullscreen (EekboardContextService *context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void eekboard_context_service_set_keymap(EekboardContextService *context,
|
void eekboard_context_service_set_keymap(EekboardContextService *context,
|
||||||
const EekKeyboard *keyboard)
|
const LevelKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
zwp_virtual_keyboard_v1_keymap(context->virtual_keyboard,
|
zwp_virtual_keyboard_v1_keymap(context->virtual_keyboard,
|
||||||
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
|
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
|
||||||
|
|||||||
@ -97,13 +97,12 @@ void eekboard_context_service_show_keyboard
|
|||||||
void eekboard_context_service_hide_keyboard
|
void eekboard_context_service_hide_keyboard
|
||||||
(EekboardContextService *context);
|
(EekboardContextService *context);
|
||||||
void eekboard_context_service_destroy (EekboardContextService *context);
|
void eekboard_context_service_destroy (EekboardContextService *context);
|
||||||
EekKeyboard *eekboard_context_service_get_keyboard
|
LevelKeyboard *eekboard_context_service_get_keyboard(EekboardContextService *context);
|
||||||
(EekboardContextService *context);
|
|
||||||
gboolean eekboard_context_service_get_fullscreen
|
gboolean eekboard_context_service_get_fullscreen
|
||||||
(EekboardContextService *context);
|
(EekboardContextService *context);
|
||||||
|
|
||||||
void eekboard_context_service_set_keymap(EekboardContextService *context,
|
void eekboard_context_service_set_keymap(EekboardContextService *context,
|
||||||
const EekKeyboard *keyboard);
|
const LevelKeyboard *keyboard);
|
||||||
|
|
||||||
void eekboard_context_service_set_hint_purpose(EekboardContextService *context,
|
void eekboard_context_service_set_hint_purpose(EekboardContextService *context,
|
||||||
uint32_t hint,
|
uint32_t hint,
|
||||||
|
|||||||
@ -85,7 +85,7 @@ update_modifier_info (SeatEmitter *client)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
send_fake_key (SeatEmitter *emitter,
|
send_fake_key (SeatEmitter *emitter,
|
||||||
EekKeyboard *keyboard,
|
LevelKeyboard *keyboard,
|
||||||
guint keycode,
|
guint keycode,
|
||||||
guint keyboard_modifiers,
|
guint keyboard_modifiers,
|
||||||
gboolean pressed,
|
gboolean pressed,
|
||||||
@ -105,7 +105,7 @@ send_fake_key (SeatEmitter *emitter,
|
|||||||
|
|
||||||
void
|
void
|
||||||
emit_key_activated (EekboardContextService *manager,
|
emit_key_activated (EekboardContextService *manager,
|
||||||
EekKeyboard *keyboard,
|
LevelKeyboard *keyboard,
|
||||||
guint keycode,
|
guint keycode,
|
||||||
EekSymbol *symbol,
|
EekSymbol *symbol,
|
||||||
EekModifierType modifiers,
|
EekModifierType modifiers,
|
||||||
|
|||||||
@ -39,7 +39,7 @@ enum mod_indices {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
emit_key_activated (EekboardContextService *manager, EekKeyboard *keyboard,
|
emit_key_activated (EekboardContextService *manager, LevelKeyboard *keyboard,
|
||||||
guint keycode,
|
guint keycode,
|
||||||
EekSymbol *symbol,
|
EekSymbol *symbol,
|
||||||
guint modifiers,
|
guint modifiers,
|
||||||
|
|||||||
@ -19,4 +19,5 @@ uint32_t squeek_key_get_keycode(struct squeek_key *key);
|
|||||||
void squeek_key_set_keycode(struct squeek_key *key, uint32_t keycode);
|
void squeek_key_set_keycode(struct squeek_key *key, uint32_t keycode);
|
||||||
|
|
||||||
struct squeek_symbol *squeek_key_get_symbol(struct squeek_key* key, uint32_t level);
|
struct squeek_symbol *squeek_key_get_symbol(struct squeek_key* key, uint32_t level);
|
||||||
|
const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_key *key);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -83,9 +83,7 @@ on_notify_keyboard (GObject *object,
|
|||||||
GParamSpec *spec,
|
GParamSpec *spec,
|
||||||
ServerContextService *context)
|
ServerContextService *context)
|
||||||
{
|
{
|
||||||
const EekKeyboard *keyboard;
|
const LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
||||||
|
|
||||||
keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
|
||||||
|
|
||||||
if (!keyboard)
|
if (!keyboard)
|
||||||
g_error("Programmer error: keyboard layout was unset!");
|
g_error("Programmer error: keyboard layout was unset!");
|
||||||
@ -141,13 +139,13 @@ set_geometry (ServerContextService *context)
|
|||||||
GdkWindow *root = gdk_screen_get_root_window (screen);
|
GdkWindow *root = gdk_screen_get_root_window (screen);
|
||||||
GdkDisplay *display = gdk_display_get_default ();
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
GdkMonitor *monitor = gdk_display_get_monitor_at_window (display, root);
|
GdkMonitor *monitor = gdk_display_get_monitor_at_window (display, root);
|
||||||
EekKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
||||||
|
|
||||||
GdkRectangle rect;
|
GdkRectangle rect;
|
||||||
EekBounds bounds;
|
EekBounds bounds;
|
||||||
|
|
||||||
gdk_monitor_get_geometry (monitor, &rect);
|
gdk_monitor_get_geometry (monitor, &rect);
|
||||||
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
|
eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(keyboard)), &bounds);
|
||||||
|
|
||||||
if (eekboard_context_service_get_fullscreen (EEKBOARD_CONTEXT_SERVICE(context))) {
|
if (eekboard_context_service_get_fullscreen (EEKBOARD_CONTEXT_SERVICE(context))) {
|
||||||
gint width = rect.width;
|
gint width = rect.width;
|
||||||
@ -228,14 +226,12 @@ destroy_window (ServerContextService *context)
|
|||||||
static void
|
static void
|
||||||
make_widget (ServerContextService *context)
|
make_widget (ServerContextService *context)
|
||||||
{
|
{
|
||||||
EekKeyboard *keyboard;
|
|
||||||
|
|
||||||
if (context->widget) {
|
if (context->widget) {
|
||||||
gtk_widget_destroy(context->widget);
|
gtk_widget_destroy(context->widget);
|
||||||
context->widget = NULL;
|
context->widget = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
||||||
|
|
||||||
context->widget = eek_gtk_keyboard_new (keyboard);
|
context->widget = eek_gtk_keyboard_new (keyboard);
|
||||||
|
|
||||||
|
|||||||
@ -21,6 +21,4 @@ const char *squeek_symbol_get_icon_name(struct squeek_symbol* symbol);
|
|||||||
uint32_t squeek_symbol_get_modifier_mask(struct squeek_symbol* symbol);
|
uint32_t squeek_symbol_get_modifier_mask(struct squeek_symbol* symbol);
|
||||||
|
|
||||||
void squeek_symbol_print(struct squeek_symbol* symbol);
|
void squeek_symbol_print(struct squeek_symbol* symbol);
|
||||||
|
|
||||||
const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_symbols *symbols);
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -30,7 +30,7 @@ static void
|
|||||||
test_output_parse (void)
|
test_output_parse (void)
|
||||||
{
|
{
|
||||||
EekLayout *layout;
|
EekLayout *layout;
|
||||||
EekKeyboard *keyboard;
|
LevelKeyboard *keyboard;
|
||||||
GError *error;
|
GError *error;
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
@ -39,9 +39,9 @@ test_output_parse (void)
|
|||||||
|
|
||||||
/* We don't need the context service to parse an XML file, so we can pass
|
/* We don't need the context service to parse an XML file, so we can pass
|
||||||
NULL when creating a keyboard. */
|
NULL when creating a keyboard. */
|
||||||
keyboard = eek_keyboard_new (NULL, layout, 640, 480);
|
keyboard = eek_xml_layout_real_create_keyboard(layout, NULL);
|
||||||
g_object_unref (layout);
|
g_object_unref (layout);
|
||||||
g_object_unref (keyboard);
|
level_keyboard_free(keyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|||||||
@ -32,14 +32,14 @@ static void
|
|||||||
test_check_xkb (void)
|
test_check_xkb (void)
|
||||||
{
|
{
|
||||||
EekLayout *layout;
|
EekLayout *layout;
|
||||||
EekKeyboard *keyboard;
|
LevelKeyboard *keyboard;
|
||||||
GError *error;
|
GError *error;
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
layout = eek_xml_layout_new ("us", &error);
|
layout = eek_xml_layout_new ("us", &error);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
keyboard = eek_keyboard_new (NULL, layout, 640, 480);
|
keyboard = eek_xml_layout_real_create_keyboard(layout, NULL);
|
||||||
gchar *keymap_str = eek_keyboard_get_keymap(keyboard);
|
gchar *keymap_str = eek_keyboard_get_keymap(keyboard);
|
||||||
|
|
||||||
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||||
@ -58,7 +58,7 @@ test_check_xkb (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref (layout);
|
g_object_unref (layout);
|
||||||
g_object_unref (keyboard);
|
level_keyboard_free(keyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|||||||
Reference in New Issue
Block a user