diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index d3926364..eb898815 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -55,7 +55,7 @@ enum { typedef struct _EekGtkKeyboardPrivate { EekRenderer *renderer; - EekKeyboard *keyboard; + LevelKeyboard *keyboard; GtkCssProvider *css_provider; GtkStyleContext *scontext; @@ -117,14 +117,14 @@ eek_gtk_keyboard_real_draw (GtkWidget *self, uint level = priv->keyboard->level; /* 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)) { render_pressed_key (self, head->data, level); } g_list_free (list); /* 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)) { 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); GList *list, *head; - list = eek_keyboard_get_pressed_keys (priv->keyboard); + list = eek_keyboard_get_pressed_keys (level_keyboard_current(priv->keyboard)); if (key) { gboolean found = FALSE; @@ -200,7 +200,7 @@ static void drag(EekGtkKeyboard *self, static void release(EekGtkKeyboard *self, guint32 time) { 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)) { EekKey *key = EEK_KEY(head->data); 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 EekKeyboard::key-released signal can remove elements from its 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)) { g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey released"); g_signal_emit_by_name (head->data, "released"); @@ -326,18 +326,14 @@ eek_gtk_keyboard_real_query_tooltip (GtkWidget *widget, static void eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self, - EekKeyboard *keyboard) + LevelKeyboard *keyboard) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); if (priv->keyboard == keyboard) return; - if (priv->keyboard) { - g_object_unref (priv->keyboard); - } - - priv->keyboard = g_object_ref (keyboard); + priv->keyboard = keyboard; } static void @@ -346,7 +342,7 @@ eek_gtk_keyboard_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - EekKeyboard *keyboard; + LevelKeyboard *keyboard; switch (prop_id) { case PROP_KEYBOARD: @@ -373,14 +369,13 @@ eek_gtk_keyboard_dispose (GObject *object) if (priv->keyboard) { 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)) { 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_object_unref (priv->keyboard); priv->keyboard = NULL; } @@ -448,32 +443,12 @@ eek_gtk_keyboard_init (EekGtkKeyboard *self) * Returns: a #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); -} - -static void -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); + 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; + return GTK_WIDGET(ret); } static void diff --git a/eek/eek-gtk-keyboard.h b/eek/eek-gtk-keyboard.h index 6355d5ec..051dc652 100644 --- a/eek/eek-gtk-keyboard.h +++ b/eek/eek-gtk-keyboard.h @@ -45,7 +45,7 @@ struct _EekGtkKeyboardClass }; 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 #endif /* EEK_GTK_KEYBOARD_H */ diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 83d40fe7..2504bc5f 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -36,6 +36,7 @@ #include "eek-enumtypes.h" #include "eekboard/key-emitter.h" #include "keymap.h" +#include "src/keyboard.h" #include "src/symbol.h" #include "eek-keyboard.h" @@ -72,10 +73,6 @@ struct _EekKeyboardPrivate unsigned int old_level; GList *pressed_keys; GList *locked_keys; - GArray *outline_array; - - /* Map key names to key objects: */ - GHashTable *names; /* modifiers dynamically assigned at run time */ EekModifierType num_lock_mask; @@ -116,27 +113,6 @@ on_key_unlocked (EekSection *section, 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 * 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); 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_ELEMENT(section)); return section; @@ -191,14 +161,14 @@ eek_keyboard_get_property (GObject *object, } 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); /* The levels are: 0 Letters, 1 Upper case letters, 2 Numbers, 3 Symbols */ /* 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 */ if (key) { @@ -243,9 +213,9 @@ set_level_from_modifiers (EekKeyboard *self, EekKey *key) priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_LATCH; priv->old_level = level; - self->level = level; + keyboard->level = level; - eek_layout_update_layout(self); + eek_layout_update_layout(keyboard); } static void @@ -287,8 +257,8 @@ set_modifiers_with_key (EekKeyboard *self, priv->modifiers = modifiers; } -void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp) { - EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(keyboard); +void eek_keyboard_press_key(LevelKeyboard *keyboard, EekKey *key, guint32 timestamp) { + EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(level_keyboard_current(keyboard)); eek_key_set_pressed(key, TRUE); 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); if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE) { - set_modifiers_with_key (keyboard, key, priv->modifiers | modifier); - set_level_from_modifiers (keyboard, key); + set_modifiers_with_key (level_keyboard_current(keyboard), key, priv->modifiers | modifier); + set_level_from_modifiers (keyboard, level_keyboard_current(keyboard), key); } // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event 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); } -void eek_keyboard_release_key( EekKeyboard *keyboard, +void eek_keyboard_release_key(LevelKeyboard *keyboard, EekKey *key, 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)) { if (head->data == key) { @@ -334,25 +304,25 @@ void eek_keyboard_release_key( EekKeyboard *keyboard, EekModifierType modifier = squeek_symbol_get_modifier_mask (symbol); switch (priv->modifier_behavior) { 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; case EEK_MODIFIER_BEHAVIOR_LOCK: priv->modifiers ^= modifier; break; case EEK_MODIFIER_BEHAVIOR_LATCH: if (modifier) - set_modifiers_with_key (keyboard, key, priv->modifiers ^ modifier); + set_modifiers_with_key (level_keyboard_current(keyboard), key, priv->modifiers ^ modifier); else - set_modifiers_with_key (keyboard, key, + set_modifiers_with_key (level_keyboard_current(keyboard), key, (priv->modifiers ^ modifier) & modifier); 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 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); } @@ -367,24 +337,32 @@ static void eek_keyboard_finalize (GObject *object) { EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object); - guint i; g_list_free (priv->pressed_keys); g_list_free_full (priv->locked_keys, (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++) { - EekOutline *outline = &g_array_index (priv->outline_array, +void level_keyboard_deinit(LevelKeyboard *self) { + 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, i); g_slice_free1 (sizeof (EekPoint) * outline->num_points, outline->points); } - g_array_free (priv->outline_array, TRUE); - - G_OBJECT_CLASS (eek_keyboard_parent_class)->finalize (object); + g_array_free (self->outline_array, TRUE); + for (guint i = 0; i < 4; i++) { + // free self->view[i]; + } +} + +void level_keyboard_free(LevelKeyboard *self) { + level_keyboard_deinit(self); + g_free(self); } static void @@ -482,12 +460,22 @@ eek_keyboard_init (EekKeyboard *self) { self->priv = EEK_KEYBOARD_GET_PRIVATE(self); 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; } +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: * @keyboard: an #EekKeyboard @@ -497,12 +485,10 @@ eek_keyboard_init (EekKeyboard *self) * Return value: (transfer none): #EekKey whose name is @name */ EekKey * -eek_keyboard_find_key_by_name (EekKeyboard *keyboard, +eek_keyboard_find_key_by_name (LevelKeyboard *keyboard, const gchar *name) { - g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL); - return g_hash_table_lookup (keyboard->priv->names, - name); + return g_hash_table_lookup (keyboard->names, name); } /** @@ -554,15 +540,6 @@ eek_keyboard_get_modifier_behavior (EekKeyboard *keyboard) 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: * @keyboard: an #EekKeyboard @@ -577,30 +554,6 @@ eek_keyboard_get_modifiers (EekKeyboard *keyboard) 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: * @keyboard: an #EekKeyboard @@ -610,29 +563,13 @@ eek_keyboard_add_outline (EekKeyboard *keyboard, * Returns: an #EekOutline, which should not be released */ EekOutline * -eek_keyboard_get_outline (EekKeyboard *keyboard, +level_keyboard_get_outline (LevelKeyboard *keyboard, guint oref) { - g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL); - - if (oref > keyboard->priv->outline_array->len) + if (oref > keyboard->outline_array->len) return NULL; - return &g_array_index (keyboard->priv->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; + return &g_array_index (keyboard->outline_array, EekOutline, oref); } /** @@ -731,7 +668,7 @@ eek_keyboard_get_locked_keys (EekKeyboard *keyboard) * Returns: a string containing the XKB keymap. */ gchar * -eek_keyboard_get_keymap(EekKeyboard *keyboard) +eek_keyboard_get_keymap(LevelKeyboard *keyboard) { /* Start the keycodes and symbols sections with their respective headers. */ 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. */ GHashTableIter iter; 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)) { gchar *current, *line; 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. */ if (keycode == EEK_INVALID_KEYCODE) @@ -780,3 +717,9 @@ eek_keyboard_get_keymap(EekKeyboard *keyboard) g_free(symbols); return keymap; } + +EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard) +{ + return keyboard->view; + //return keyboard->views[keyboard->level]; +} diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index 31b41dcf..170c1324 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -59,13 +59,7 @@ struct _EekKeyboard EekContainer parent; 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; - guint level; - - EekboardContextService *manager; // unowned reference }; /** @@ -123,9 +117,24 @@ struct _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, - EekLayout *layout, + /* Map key names to key objects: */ + GHashTable *names; + + EekboardContextService *manager; // unowned reference +}; +typedef struct _LevelKeyboard LevelKeyboard; + +LevelKeyboard *eek_keyboard_new(EekLayout *layout, gdouble initial_width, gdouble initial_height); GType eek_keyboard_get_type @@ -154,19 +163,12 @@ EekSection *eek_keyboard_create_section (EekKeyboard *keyboard); EekKey *eek_keyboard_find_key_by_name - (EekKeyboard *keyboard, + (LevelKeyboard *keyboard, const gchar *name); -guint eek_keyboard_add_outline - (EekKeyboard *keyboard, - EekOutline *outline); - -EekOutline *eek_keyboard_get_outline - (EekKeyboard *keyboard, +EekOutline *level_keyboard_get_outline + (LevelKeyboard *keyboard, guint oref); -gsize eek_keyboard_get_n_outlines - (EekKeyboard *keyboard); - void eek_keyboard_set_num_lock_mask (EekKeyboard *keyboard, EekModifierType num_lock_mask); @@ -189,12 +191,16 @@ EekModifierKey *eek_modifier_key_copy void eek_modifier_key_free (EekModifierKey *modkey); -void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp); -void eek_keyboard_release_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp); +void eek_keyboard_press_key(LevelKeyboard *keyboard, EekKey *key, guint32 timestamp); +void eek_keyboard_release_key(LevelKeyboard *keyboard, EekKey *key, guint32 timestamp); 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 * function is rarely called by application but called by #EekLayout * implementation. diff --git a/eek/eek-layout.c b/eek/eek-layout.c index 8337450c..d023871f 100644 --- a/eek/eek-layout.c +++ b/eek/eek-layout.c @@ -31,6 +31,7 @@ #include "eek-layout.h" #include "eek-keyboard.h" #include "eekboard/eekboard-context-service.h" +#include "eek-xml-layout.h" 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; struct place_data { double desired_width; double current_offset; - EekKeyboard *keyboard; + LevelKeyboard *keyboard; }; static void @@ -87,7 +65,7 @@ section_placer(EekElement *element, gpointer user_data) eek_element_set_bounds(element, §ion_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); section_bounds.y = data->current_offset; @@ -105,7 +83,7 @@ section_counter(EekElement *element, gpointer user_data) { } void -eek_layout_place_sections(EekKeyboard *keyboard) +eek_layout_place_sections(LevelKeyboard *keyboard, EekKeyboard *level) { /* Order rows */ // 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. // TODO: calculate max line width beforehand for button centering. Leave keyboard centering to the renderer later 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 = { .desired_width = keyboard_bounds.width, .current_offset = 0, .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; - 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; - eek_element_set_bounds(EEK_ELEMENT(keyboard), &keyboard_bounds); + eek_element_set_bounds(EEK_ELEMENT(level), &keyboard_bounds); } 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)); } diff --git a/eek/eek-layout.h b/eek/eek-layout.h index 746adbe3..7ee3195d 100644 --- a/eek/eek-layout.h +++ b/eek/eek-layout.h @@ -43,7 +43,7 @@ struct _EekLayoutClass GObjectClass parent_class; /*< public >*/ - EekKeyboard* (* create_keyboard) (EekboardContextService *manager, + LevelKeyboard* (* create_keyboard) (EekboardContextService *manager, EekLayout *self, gdouble initial_width, gdouble initial_height); @@ -55,9 +55,14 @@ struct _EekLayoutClass 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 #endif /* EEK_LAYOUT_H */ diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index a8d64995..85837618 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -32,7 +32,6 @@ enum { PROP_0, - PROP_KEYBOARD, PROP_PCONTEXT, PROP_STYLE_CONTEXT, PROP_LAST @@ -40,7 +39,7 @@ enum { typedef struct _EekRendererPrivate { - EekKeyboard *keyboard; + LevelKeyboard *keyboard; PangoContext *pcontext; GtkCssProvider *css_provider; GtkStyleContext *scontext; @@ -149,7 +148,7 @@ render_keyboard_surface (EekRenderer *renderer) 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.renderer = renderer; @@ -176,7 +175,7 @@ render_keyboard_surface (EekRenderer *renderer) data.level = priv->keyboard->level; /* 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, &data); cairo_restore (data.cr); @@ -196,7 +195,7 @@ render_key_outline (EekRenderer *renderer, guint oref; 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) return; @@ -231,7 +230,7 @@ render_key (EekRenderer *self, EekColor foreground; 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) return; @@ -524,10 +523,6 @@ eek_renderer_set_property (GObject *object, EEK_RENDERER(object)); switch (prop_id) { - case PROP_KEYBOARD: - priv->keyboard = g_value_get_object (value); - g_object_ref (priv->keyboard); - break; case PROP_PCONTEXT: priv->pcontext = g_value_get_object (value); g_object_ref (priv->pcontext); @@ -548,13 +543,7 @@ eek_renderer_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - EekRendererPrivate *priv = eek_renderer_get_instance_private ( - EEK_RENDERER(object)); - switch (prop_id) { - case PROP_KEYBOARD: - g_value_set_object (value, priv->keyboard); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -568,7 +557,6 @@ eek_renderer_dispose (GObject *object) EekRendererPrivate *priv = eek_renderer_get_instance_private (self); if (priv->keyboard) { - g_object_unref (priv->keyboard); priv->keyboard = NULL; } if (priv->pcontext) { @@ -612,15 +600,6 @@ eek_renderer_class_init (EekRendererClass *klass) gobject_class->dispose = eek_renderer_dispose; 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", "Pango Context", "Pango Context", @@ -712,15 +691,17 @@ invalidate (EekRenderer *renderer) } EekRenderer * -eek_renderer_new (EekKeyboard *keyboard, +eek_renderer_new (LevelKeyboard *keyboard, PangoContext *pcontext, GtkStyleContext *scontext) { - return g_object_new (EEK_TYPE_RENDERER, - "keyboard", keyboard, + EekRenderer *renderer = g_object_new (EEK_TYPE_RENDERER, "pango-context", pcontext, "style-context", scontext, NULL); + EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); + priv->keyboard = keyboard; + return renderer; } void @@ -741,7 +722,7 @@ eek_renderer_set_allocation_size (EekRenderer *renderer, /* Calculate a scale factor to use when rendering the keyboard into the 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 h = (bounds.y * 2) + bounds.height; @@ -766,7 +747,7 @@ eek_renderer_get_size (EekRenderer *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) *width = bounds.width; 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 (section, §ion_bounds); - eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), + eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &keyboard_bounds); if (!rotate) { @@ -1085,7 +1066,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer, g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL); 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 */ 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.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, &data); return data.key; diff --git a/eek/eek-renderer.h b/eek/eek-renderer.h index 536d41c0..fda2ffad 100644 --- a/eek/eek-renderer.h +++ b/eek/eek-renderer.h @@ -63,7 +63,7 @@ struct _EekRendererClass }; GType eek_renderer_get_type (void) G_GNUC_CONST; -EekRenderer *eek_renderer_new (EekKeyboard *keyboard, +EekRenderer *eek_renderer_new (LevelKeyboard *keyboard, PangoContext *pcontext, GtkStyleContext *scontext); void eek_renderer_set_allocation_size diff --git a/eek/eek-section.c b/eek/eek-section.c index 1cc6942e..843d4fd7 100644 --- a/eek/eek-section.c +++ b/eek/eek-section.c @@ -404,9 +404,9 @@ keysizer(EekElement *element, gpointer user_data) { EekKey *key = EEK_KEY(element); - EekKeyboard *keyboard = EEK_KEYBOARD(user_data); + LevelKeyboard *keyboard = user_data; 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) { double minx = outline->points[0].x; double maxx = minx; @@ -464,7 +464,7 @@ keyplacer(EekElement *element, gpointer user_data) } 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); diff --git a/eek/eek-section.h b/eek/eek-section.h index 6077830f..e0ac424b 100644 --- a/eek/eek-section.h +++ b/eek/eek-section.h @@ -28,6 +28,7 @@ #include #include "eek-container.h" #include "eek-types.h" +#include "eek-keyboard.h" G_BEGIN_DECLS @@ -97,7 +98,7 @@ EekKey *eek_section_create_key (EekSection *section, const gchar *name, guint keycode); -void eek_section_place_keys (EekSection *section, EekKeyboard *keyboard); +void eek_section_place_keys (EekSection *section, LevelKeyboard *keyboard); G_END_DECLS #endif /* EEK_SECTION_H */ diff --git a/eek/eek-types.h b/eek/eek-types.h index 7f3b9eea..51df26a0 100644 --- a/eek/eek-types.h +++ b/eek/eek-types.h @@ -150,6 +150,7 @@ typedef struct _EekOutline EekOutline; typedef struct _EekColor EekColor; typedef struct _EekboardContextService EekboardContextService; +typedef struct _LevelKeyboard LevelKeyboard; /** * EekPoint: diff --git a/eek/eek-xml-layout.c b/eek/eek-xml-layout.c index 408eb455..767816d1 100644 --- a/eek/eek-xml-layout.c +++ b/eek/eek-xml-layout.c @@ -68,16 +68,16 @@ static GList *parse_prerequisites (const gchar *path, GError **error); static gboolean parse_geometry (const gchar *path, - EekKeyboard *keyboard, + EekKeyboard *keyboard, GArray *outline_array, GHashTable *name_key_hash, GError **error); static gboolean parse_symbols_with_prerequisites (const gchar *keyboards_dir, const gchar *name, - EekKeyboard *keyboard, + LevelKeyboard *keyboard, GList **loaded, GError **error); static gboolean parse_symbols (const gchar *path, - EekKeyboard *keyboard, + LevelKeyboard *keyboard, GError **error); static gboolean validate (const gchar **valid_path_list, @@ -255,7 +255,7 @@ struct _GeometryParseData { typedef struct _GeometryParseData 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); @@ -271,12 +271,7 @@ geometry_parse_data_new (EekKeyboard *keyboard) g_free, (GDestroyNotify)eek_outline_free); - data->name_key_hash = - g_hash_table_new_full (g_str_hash, - g_str_equal, - g_free, - NULL); - + data->name_key_hash = name_key_hash; data->text = g_string_sized_new (BUFSIZE); data->keycode = 8; return data; @@ -600,7 +595,8 @@ struct _SymbolsParseData { GSList *element_stack; GString *text; - EekKeyboard *keyboard; + LevelKeyboard *keyboard; + EekKeyboard *view; EekKey *key; gchar *label; gchar *icon; @@ -611,11 +607,11 @@ struct _SymbolsParseData { typedef struct _SymbolsParseData SymbolsParseData; static SymbolsParseData * -symbols_parse_data_new (EekKeyboard *keyboard) +symbols_parse_data_new (LevelKeyboard *keyboard) { SymbolsParseData *data = g_slice_new0 (SymbolsParseData); - data->keyboard = g_object_ref (keyboard); + data->keyboard = keyboard; data->text = g_string_sized_new (BUFSIZE); return data; } @@ -623,7 +619,6 @@ symbols_parse_data_new (EekKeyboard *keyboard) static void symbols_parse_data_free (SymbolsParseData *data) { - g_object_unref (data->keyboard); g_string_free (data->text, TRUE); g_slice_free (SymbolsParseData, data); } @@ -881,11 +876,9 @@ static const GMarkupParser prerequisites_parser = { 0 }; -static EekKeyboard * -eek_xml_layout_real_create_keyboard (EekboardContextService *manager, - EekLayout *self, - gdouble initial_width, - gdouble initial_height) +LevelKeyboard * +eek_xml_layout_real_create_keyboard (EekLayout *self, + EekboardContextService *manager) { EekXmlLayout *layout = EEK_XML_LAYOUT (self); 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 information are applied. */ - EekKeyboard *keyboard = g_object_new (EEK_TYPE_KEYBOARD, NULL); - keyboard->manager = manager; + EekKeyboard *view = g_object_new (EEK_TYPE_KEYBOARD, NULL); /* Read geometry information. */ gchar *filename = g_strdup_printf ("%s.xml", priv->desc->geometry); gchar *path = g_build_filename (priv->keyboards_dir, "geometry", filename, NULL); 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; - retval = parse_geometry (path, keyboard, &error); + retval = parse_geometry (path, view, outline_array, name_key_hash, &error); g_free (path); if (!retval) { - g_object_unref (keyboard); + g_object_unref (view); g_warning ("can't parse geometry file %s: %s", priv->desc->geometry, error->message); @@ -913,6 +913,12 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager, 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. */ GList *loaded = NULL; retval = parse_symbols_with_prerequisites (priv->keyboards_dir, @@ -922,7 +928,7 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager, &error); g_list_free_full (loaded, g_free); if (!retval) { - g_object_unref (keyboard); + g_object_unref (view); g_warning ("can't parse symbols file %s: %s", priv->desc->symbols, error->message); @@ -930,11 +936,11 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager, return NULL; } - eek_layout_place_sections(keyboard); + eek_layout_place_sections(keyboard, view); /* Use pre-defined modifier mask here. */ - eek_keyboard_set_num_lock_mask (keyboard, EEK_MOD2_MASK); - eek_keyboard_set_alt_gr_mask (keyboard, EEK_BUTTON1_MASK); + eek_keyboard_set_num_lock_mask (view, EEK_MOD2_MASK); + eek_keyboard_set_alt_gr_mask (view, EEK_BUTTON1_MASK); return keyboard; } @@ -997,12 +1003,9 @@ eek_xml_layout_finalize (GObject *object) static void eek_xml_layout_class_init (EekXmlLayoutClass *klass) { - EekLayoutClass *layout_class = EEK_LAYOUT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GParamSpec *pspec; - layout_class->create_keyboard = eek_xml_layout_real_create_keyboard; - gobject_class->set_property = eek_xml_layout_set_property; gobject_class->get_property = eek_xml_layout_get_property; gobject_class->finalize = eek_xml_layout_finalize; @@ -1122,8 +1125,30 @@ eek_xml_keyboard_desc_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 -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; GMarkupParseContext *pcontext; @@ -1143,7 +1168,7 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error) if (input == NULL) 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, 0, data, @@ -1164,7 +1189,7 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error) EekOutline *outline = v; 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)); } @@ -1183,7 +1208,7 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error) static gboolean parse_symbols_with_prerequisites (const gchar *keyboards_dir, const gchar *name, - EekKeyboard *keyboard, + LevelKeyboard *keyboard, GList **loaded, GError **error) { @@ -1233,7 +1258,7 @@ parse_symbols_with_prerequisites (const gchar *keyboards_dir, } static gboolean -parse_symbols (const gchar *path, EekKeyboard *keyboard, GError **error) +parse_symbols (const gchar *path, LevelKeyboard *keyboard, GError **error) { SymbolsParseData *data; GMarkupParseContext *pcontext; diff --git a/eek/eek-xml-layout.h b/eek/eek-xml-layout.h index 1210ff17..8b89776f 100644 --- a/eek/eek-xml-layout.h +++ b/eek/eek-xml-layout.h @@ -62,5 +62,8 @@ GList *eek_xml_list_keyboards (void); EekXmlKeyboardDesc *eek_xml_keyboard_desc_copy (EekXmlKeyboardDesc *desc); void eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc); +LevelKeyboard * +eek_xml_layout_real_create_keyboard (EekLayout *self, + EekboardContextService *manager); G_END_DECLS #endif /* EEK_XML_LAYOUT_H */ diff --git a/eekboard/eekboard-context-service.c b/eekboard/eekboard-context-service.c index 4b461444..822d4483 100644 --- a/eekboard/eekboard-context-service.c +++ b/eekboard/eekboard-context-service.c @@ -71,7 +71,7 @@ struct _EekboardContextServicePrivate { gboolean visible; gboolean fullscreen; - EekKeyboard *keyboard; // currently used keyboard + LevelKeyboard *keyboard; // currently used keyboard GHashTable *keyboard_hash; // a table of available keyboards, per layout // TODO: make use of repeating buttons @@ -86,11 +86,10 @@ struct _EekboardContextServicePrivate { G_DEFINE_TYPE_WITH_PRIVATE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT); -static EekKeyboard * +static LevelKeyboard * eekboard_context_service_real_create_keyboard (EekboardContextService *self, const gchar *keyboard_type) { - EekKeyboard *keyboard; EekLayout *layout; 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) { g_error("Failed to create a keyboard"); } @@ -319,21 +318,18 @@ settings_update_layout(EekboardContextService *context) // generic part follows 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)); // create a keyboard if (!keyboard) { - EekboardContextServiceClass *klass = EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context); - keyboard = klass->create_keyboard (context, keyboard_layout); - eek_keyboard_set_modifier_behavior (keyboard, + keyboard = eekboard_context_service_real_create_keyboard(context, keyboard_layout); + eek_keyboard_set_modifier_behavior (level_keyboard_current(keyboard), EEK_MODIFIER_BEHAVIOR_LATCH); g_hash_table_insert (context->priv->keyboard_hash, GUINT_TO_POINTER(keyboard_id), keyboard); - g_object_set_data (G_OBJECT(keyboard), - "keyboard-id", - GUINT_TO_POINTER(keyboard_id)); + keyboard->id = keyboard_id; keyboard_id++; } // set as current @@ -374,7 +370,6 @@ eekboard_context_service_class_init (EekboardContextServiceClass *klass) GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GParamSpec *pspec; - klass->create_keyboard = eekboard_context_service_real_create_keyboard; klass->show_keyboard = eekboard_context_service_real_show_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. * Returns: (transfer none): an #EekKeyboard */ -EekKeyboard * +LevelKeyboard * eekboard_context_service_get_keyboard (EekboardContextService *context) { return context->priv->keyboard; @@ -598,7 +593,7 @@ eekboard_context_service_get_fullscreen (EekboardContextService *context) } void eekboard_context_service_set_keymap(EekboardContextService *context, - const EekKeyboard *keyboard) + const LevelKeyboard *keyboard) { zwp_virtual_keyboard_v1_keymap(context->virtual_keyboard, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, diff --git a/eekboard/eekboard-context-service.h b/eekboard/eekboard-context-service.h index b5ee738c..014f0dbc 100644 --- a/eekboard/eekboard-context-service.h +++ b/eekboard/eekboard-context-service.h @@ -97,13 +97,12 @@ void eekboard_context_service_show_keyboard void eekboard_context_service_hide_keyboard (EekboardContextService *context); void eekboard_context_service_destroy (EekboardContextService *context); -EekKeyboard *eekboard_context_service_get_keyboard - (EekboardContextService *context); +LevelKeyboard *eekboard_context_service_get_keyboard(EekboardContextService *context); gboolean eekboard_context_service_get_fullscreen (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, uint32_t hint, diff --git a/eekboard/key-emitter.c b/eekboard/key-emitter.c index 1151886c..4548008f 100644 --- a/eekboard/key-emitter.c +++ b/eekboard/key-emitter.c @@ -85,7 +85,7 @@ update_modifier_info (SeatEmitter *client) static void send_fake_key (SeatEmitter *emitter, - EekKeyboard *keyboard, + LevelKeyboard *keyboard, guint keycode, guint keyboard_modifiers, gboolean pressed, @@ -105,7 +105,7 @@ send_fake_key (SeatEmitter *emitter, void emit_key_activated (EekboardContextService *manager, - EekKeyboard *keyboard, + LevelKeyboard *keyboard, guint keycode, EekSymbol *symbol, EekModifierType modifiers, diff --git a/eekboard/key-emitter.h b/eekboard/key-emitter.h index 91da3529..a8e0e30d 100644 --- a/eekboard/key-emitter.h +++ b/eekboard/key-emitter.h @@ -39,7 +39,7 @@ enum mod_indices { }; void -emit_key_activated (EekboardContextService *manager, EekKeyboard *keyboard, +emit_key_activated (EekboardContextService *manager, LevelKeyboard *keyboard, guint keycode, EekSymbol *symbol, guint modifiers, diff --git a/src/keyboard.h b/src/keyboard.h index 134502ba..ff336f5e 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -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); 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 diff --git a/src/server-context-service.c b/src/server-context-service.c index 8b81dd54..67b7ced6 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -83,9 +83,7 @@ on_notify_keyboard (GObject *object, GParamSpec *spec, ServerContextService *context) { - const EekKeyboard *keyboard; - - keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context)); + const LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context)); if (!keyboard) g_error("Programmer error: keyboard layout was unset!"); @@ -141,13 +139,13 @@ set_geometry (ServerContextService *context) GdkWindow *root = gdk_screen_get_root_window (screen); GdkDisplay *display = gdk_display_get_default (); 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; EekBounds bounds; 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))) { gint width = rect.width; @@ -228,14 +226,12 @@ destroy_window (ServerContextService *context) static void make_widget (ServerContextService *context) { - EekKeyboard *keyboard; - if (context->widget) { gtk_widget_destroy(context->widget); 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); diff --git a/src/symbol.h b/src/symbol.h index d186ede4..440dabe5 100644 --- a/src/symbol.h +++ b/src/symbol.h @@ -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); void squeek_symbol_print(struct squeek_symbol* symbol); - -const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_symbols *symbols); #endif diff --git a/tests/eek-xml-test.c b/tests/eek-xml-test.c index d6427193..f21872c4 100644 --- a/tests/eek-xml-test.c +++ b/tests/eek-xml-test.c @@ -30,7 +30,7 @@ static void test_output_parse (void) { EekLayout *layout; - EekKeyboard *keyboard; + LevelKeyboard *keyboard; GError *error; 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 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 (keyboard); + level_keyboard_free(keyboard); } int diff --git a/tests/test-keymap-generation.c b/tests/test-keymap-generation.c index b78d98e0..e6a5af56 100644 --- a/tests/test-keymap-generation.c +++ b/tests/test-keymap-generation.c @@ -32,14 +32,14 @@ static void test_check_xkb (void) { EekLayout *layout; - EekKeyboard *keyboard; + LevelKeyboard *keyboard; GError *error; error = NULL; layout = eek_xml_layout_new ("us", &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); 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 (keyboard); + level_keyboard_free(keyboard); } int