diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 9461122d..156e8c91 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -62,14 +62,14 @@ G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_A static void on_button_pressed (struct squeek_button *button, struct squeek_view *view, EekGtkKeyboard *self); -static void on_button_released (struct squeek_button *button, +static void on_button_released (const struct squeek_button *button, struct squeek_view *view, EekGtkKeyboard *self); static void render_pressed_button (GtkWidget *widget, struct button_place *place); static void render_locked_button (GtkWidget *widget, struct button_place *place); static void render_released_button (GtkWidget *widget, - struct squeek_button *button); + const struct squeek_button *button); static void eek_gtk_keyboard_real_realize (GtkWidget *self) @@ -111,10 +111,10 @@ eek_gtk_keyboard_real_draw (GtkWidget *self, struct squeek_view *view = squeek_layout_get_current_view(priv->keyboard->layout); /* redraw pressed key */ - const GList *list = priv->keyboard->pressed_buttons; + const GList *list = priv->keyboard->pressed_keys; for (const GList *head = list; head; head = g_list_next (head)) { struct button_place place = squeek_view_find_key( - view, squeek_button_get_key(head->data) + view, head->data ); if (place.button) render_pressed_button (self, &place); @@ -157,7 +157,11 @@ static void depress(EekGtkKeyboard *self, struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y); if (button) { - eek_keyboard_press_button(priv->keyboard, button, time); + eek_keyboard_press_key( + priv->keyboard, + squeek_button_get_key(button), + time + ); on_button_pressed(button, view, self); } } @@ -170,29 +174,42 @@ static void drag(EekGtkKeyboard *self, struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y); GList *list, *head; - list = g_list_copy(priv->keyboard->pressed_buttons); + list = g_list_copy(priv->keyboard->pressed_keys); if (button) { gboolean found = FALSE; for (head = list; head; head = g_list_next (head)) { - if (head->data == button) { + struct squeek_key *key = head->data; + if (squeek_button_has_key(button, key)) { found = TRUE; } else { - eek_keyboard_release_button(priv->keyboard, head->data, time); - on_button_released(button, view, self); + eek_keyboard_release_key(priv->keyboard, key, time); + // The released handler proceeds to ignore this info... + // let's do this for consistency nevertheless + struct button_place place = squeek_view_find_key(view, key); + on_button_released(place.button, view, self); } } g_list_free (list); if (!found) { - eek_keyboard_press_button(priv->keyboard, button, time); + eek_keyboard_press_key( + priv->keyboard, + squeek_button_get_key(button), + time + ); + on_button_pressed(button, view, self); } } else { for (head = list; head; head = g_list_next (head)) { - eek_keyboard_release_button(priv->keyboard, head->data, time); - on_button_released(head->data, view, self); + struct squeek_key *key = head->data; + eek_keyboard_release_key(priv->keyboard, key, time); + // The released handler proceeds to ignore this info... + // let's do this for consistency nevertheless + struct button_place place = squeek_view_find_key(view, key); + on_button_released(place.button, view, self); } g_list_free (list); } @@ -204,11 +221,14 @@ static void release(EekGtkKeyboard *self, guint32 time) struct squeek_view *view = level_keyboard_current(priv->keyboard); - GList *list = g_list_copy(priv->keyboard->pressed_buttons); + GList *list = g_list_copy(priv->keyboard->pressed_keys); for (GList *head = list; head; head = g_list_next (head)) { - struct squeek_button *button = head->data; - eek_keyboard_release_button(priv->keyboard, button, time); - on_button_released(button, view, self); + struct squeek_key *key = head->data; + eek_keyboard_release_key(priv->keyboard, key, time); + // The released handler proceeds to ignore this info... + // let's do this for consistency nevertheless + struct button_place place = squeek_view_find_key(view, key); + on_button_released(place.button, view, self); } g_list_free (list); } @@ -287,11 +307,11 @@ eek_gtk_keyboard_real_unmap (GtkWidget *self) if (priv->keyboard) { GList *head; - for (head = priv->keyboard->pressed_buttons; head; head = g_list_next (head)) { + for (head = priv->keyboard->pressed_keys; head; head = g_list_next (head)) { /* Unlike other places where we call this, we don't call on_button_released afterwards since we don't want to queue a redraw. */ - eek_keyboard_release_button(priv->keyboard, head->data, + eek_keyboard_release_key(priv->keyboard, head->data, gdk_event_get_time(NULL)); } } @@ -352,8 +372,8 @@ eek_gtk_keyboard_dispose (GObject *object) if (priv->keyboard) { GList *head; - for (head = priv->keyboard->pressed_buttons; head; head = g_list_next (head)) { - eek_keyboard_release_button(priv->keyboard, head->data, + for (head = priv->keyboard->pressed_keys; head; head = g_list_next (head)) { + eek_keyboard_release_key(priv->keyboard, head->data, gdk_event_get_time(NULL)); } @@ -461,9 +481,10 @@ render_locked_button (GtkWidget *widget, struct button_place *place) cairo_region_destroy (region); } +// TODO: does it really redraw the entire keyboard? static void render_released_button (GtkWidget *widget, - struct squeek_button *button) + const struct squeek_button *button) { (void)button; EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); @@ -512,7 +533,7 @@ on_button_pressed (struct squeek_button *button, } static void -on_button_released (struct squeek_button *button, +on_button_released (const struct squeek_button *button, struct squeek_view *view, EekGtkKeyboard *self) { diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index f42d145b..bf50c751 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -92,10 +92,9 @@ set_level_from_press (LevelKeyboard *keyboard, struct squeek_key *key) } } -void eek_keyboard_press_button(LevelKeyboard *keyboard, struct squeek_button *button, guint32 timestamp) { - struct squeek_key *key = squeek_button_get_key(button); +void eek_keyboard_press_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp) { squeek_key_set_pressed(key, TRUE); - keyboard->pressed_buttons = g_list_prepend (keyboard->pressed_buttons, button); + keyboard->pressed_keys = g_list_prepend (keyboard->pressed_keys, key); // Only take action about setting level *after* the key has taken effect, i.e. on release //set_level_from_press (keyboard, key); @@ -107,19 +106,17 @@ void eek_keyboard_press_button(LevelKeyboard *keyboard, struct squeek_button *bu emit_key_activated(keyboard->manager, keyboard, keycode, TRUE, timestamp); } -void eek_keyboard_release_button(LevelKeyboard *keyboard, - struct squeek_button *button, - guint32 timestamp) { - for (GList *head = keyboard->pressed_buttons; head; head = g_list_next (head)) { - if (head->data == button) { - keyboard->pressed_buttons = g_list_remove_link (keyboard->pressed_buttons, head); +void eek_keyboard_release_key(LevelKeyboard *keyboard, + struct squeek_key *key, + guint32 timestamp) { + for (GList *head = keyboard->pressed_keys; head; head = g_list_next (head)) { + if (squeek_key_equal(head->data, key)) { + keyboard->pressed_keys = g_list_remove_link (keyboard->pressed_keys, head); g_list_free1 (head); break; } } - struct squeek_key *key = squeek_button_get_key(button); - set_level_from_press (keyboard, key); // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index e7d80019..cea68499 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -47,8 +47,8 @@ struct _LevelKeyboard { int keymap_fd; // keymap formatted as XKB string size_t keymap_len; // length of the data inside keymap_fd - GList *pressed_buttons; // struct squeek_button* - GList *locked_keys; // struct squeek_button* + GList *pressed_keys; // struct squeek_key* + GList *locked_keys; // struct EekModifierKey* guint id; // as a key to layout choices @@ -67,8 +67,11 @@ EekModifierKey *eek_modifier_key_copy void eek_modifier_key_free (EekModifierKey *modkey); -void eek_keyboard_press_button(LevelKeyboard *keyboard, struct squeek_button *button, guint32 timestamp); -void eek_keyboard_release_button(LevelKeyboard *keyboard, struct squeek_button *button, guint32 timestamp); +void eek_keyboard_press_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp); +void eek_keyboard_release_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp); + +gchar * eek_keyboard_get_keymap + (LevelKeyboard *keyboard); struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard); LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_layout *layout); diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index 95634915..0c305f11 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -970,6 +970,7 @@ eek_renderer_find_button_by_position (EekRenderer *renderer, EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); + /* Transform from widget coordinates to keyboard coordinates */ EekPoint point = { .x = (x - priv->origin_x)/priv->scale, .y = (y - priv->origin_y)/priv->scale, diff --git a/src/keyboard.h b/src/keyboard.h index ef402e2f..8011f345 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -1,5 +1,5 @@ #ifndef __KEYBOARD_H -#define __KYBOARD_H +#define __KEYBOARD_H #include "stdbool.h" #include "inttypes.h" @@ -19,6 +19,7 @@ uint32_t squeek_key_is_locked(struct squeek_key *key); void squeek_key_set_locked(struct squeek_key *key, uint32_t pressed); uint32_t squeek_key_get_keycode(struct squeek_key *key); void squeek_key_set_keycode(struct squeek_key *key, uint32_t keycode); +uint32_t squeek_key_equal(struct squeek_key* key, struct squeek_key* key1); struct squeek_symbol *squeek_key_get_symbol(struct squeek_key* key); const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_key *key); diff --git a/src/keyboard.rs b/src/keyboard.rs index cb9cb8ae..8f9b2093 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -31,6 +31,13 @@ pub mod c { unsafe { key.unwrap() }; // reference dropped } + /// Compares pointers to the data + #[no_mangle] + pub extern "C" + fn squeek_key_equal(key: CKeyState, key2: CKeyState) -> u32 { + return Rc::ptr_eq(&key.clone_ref(), &key2.clone_ref()) as u32 + } + #[no_mangle] pub extern "C" fn squeek_key_is_pressed(key: CKeyState) -> u32 {