diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 1bf39539..9c98437a 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -64,14 +64,16 @@ typedef struct _EekGtkKeyboardPrivate G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA) -static void on_key_pressed (EekKey *key, - EekGtkKeyboard *self, guint level); -static void on_key_released (EekKey *key, +static void on_key_pressed (EekKey *key, EekKeyboard *view, EekGtkKeyboard *self); -static void render_pressed_key (GtkWidget *widget, - EekKey *key, guint level); +static void on_key_released (EekKey *key, + EekKeyboard *view, + EekGtkKeyboard *self); +static void render_pressed_key (GtkWidget *widget, EekKeyboard *view, + EekKey *key); static void render_locked_key (GtkWidget *widget, - EekKey *key, guint level); + EekKeyboard *view, + EekKey *key); static void render_released_key (GtkWidget *widget, EekKey *key); @@ -112,18 +114,18 @@ eek_gtk_keyboard_real_draw (GtkWidget *self, eek_renderer_render_keyboard (priv->renderer, cr); - uint level = priv->keyboard->level; + EekKeyboard *view = priv->keyboard->views[priv->keyboard->level]; /* redraw pressed key */ const GList *list = priv->keyboard->pressed_keys; for (const GList *head = list; head; head = g_list_next (head)) { - render_pressed_key (self, head->data, level); + render_pressed_key (self, view, head->data); } /* redraw locked key */ list = priv->keyboard->locked_keys; for (const GList *head = list; head; head = g_list_next (head)) { - render_locked_key (self, ((EekModifierKey *)head->data)->key, level); + render_locked_key (self, view, ((EekModifierKey *)head->data)->key); } return FALSE; @@ -149,19 +151,20 @@ static void depress(EekGtkKeyboard *self, gdouble x, gdouble y, guint32 time) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y); + EekKeyboard *view = level_keyboard_current(priv->keyboard); + EekKey *key = eek_renderer_find_key_by_position (priv->renderer, view, x, y); if (key) { eek_keyboard_press_key(priv->keyboard, key, time); - guint level = priv->keyboard->level; - on_key_pressed(key, self, level); + on_key_pressed(key, view, self); } } static void drag(EekGtkKeyboard *self, gdouble x, gdouble y, guint32 time) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y); + EekKeyboard *view = level_keyboard_current(priv->keyboard); + EekKey *key = eek_renderer_find_key_by_position (priv->renderer, view, x, y); GList *list, *head; list = g_list_copy(priv->keyboard->pressed_keys); @@ -174,20 +177,19 @@ static void drag(EekGtkKeyboard *self, found = TRUE; } else { eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time); - on_key_released(key, self); + on_key_released(key, view, self); } } g_list_free (list); if (!found) { eek_keyboard_press_key(priv->keyboard, key, time); - guint level = priv->keyboard->level; - on_key_pressed(key, self, level); + on_key_pressed(key, view, self); } } else { for (head = list; head; head = g_list_next (head)) { eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time); - on_key_released(EEK_KEY(head->data), self); + on_key_released(EEK_KEY(head->data), view, self); } g_list_free (list); } @@ -196,11 +198,13 @@ static void drag(EekGtkKeyboard *self, static void release(EekGtkKeyboard *self, guint32 time) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); + EekKeyboard *view = level_keyboard_current(priv->keyboard); + GList *list = g_list_copy(priv->keyboard->pressed_keys); for (GList *head = list; head; head = g_list_next (head)) { EekKey *key = EEK_KEY(head->data); eek_keyboard_release_key(priv->keyboard, key, time); - on_key_released(key, self); + on_key_released(key, view, self); } g_list_free (list); } @@ -303,12 +307,12 @@ eek_gtk_keyboard_real_query_tooltip (GtkWidget *widget, { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); + EekKeyboard *view = level_keyboard_current(priv->keyboard); - EekKey *key; - - key = eek_renderer_find_key_by_position (priv->renderer, - (gdouble)x, - (gdouble)y); + EekKey *key = eek_renderer_find_key_by_position (priv->renderer, + view, + (gdouble)x, + (gdouble)y); if (key) { //struct squeek_symbol *symbol = eek_key_get_symbol_at_index(key, 0, priv->keyboard->level); const gchar *text = NULL; // FIXME @@ -449,8 +453,8 @@ eek_gtk_keyboard_new (LevelKeyboard *keyboard) static void render_pressed_key (GtkWidget *widget, - EekKey *key, - guint level) + EekKeyboard *view, + EekKey *key) { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -460,7 +464,7 @@ render_pressed_key (GtkWidget *widget, GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region); cairo_t *cr = gdk_drawing_context_get_cairo_context (context); - eek_renderer_render_key (priv->renderer, cr, key, level, 1.0, TRUE); + eek_renderer_render_key (priv->renderer, cr, view, key, 1.0, TRUE); /* eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE); */ @@ -471,8 +475,8 @@ render_pressed_key (GtkWidget *widget, static void render_locked_key (GtkWidget *widget, - EekKey *key, - guint level) + EekKeyboard *view, + EekKey *key) { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -482,7 +486,7 @@ render_locked_key (GtkWidget *widget, GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region); cairo_t *cr = gdk_drawing_context_get_cairo_context (context); - eek_renderer_render_key (priv->renderer, cr, key, level, 1.0, TRUE); + eek_renderer_render_key (priv->renderer, cr, view, key, 1.0, TRUE); gdk_window_end_draw_frame (window, context); @@ -493,6 +497,7 @@ static void render_released_key (GtkWidget *widget, EekKey *key) { + (void)key; EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -510,8 +515,8 @@ render_released_key (GtkWidget *widget, static void on_key_pressed (EekKey *key, - EekGtkKeyboard *self, - guint level) + EekKeyboard *view, + EekGtkKeyboard *self) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -519,7 +524,7 @@ on_key_pressed (EekKey *key, if (!priv->renderer) return; - render_pressed_key (GTK_WIDGET(self), key, level); + render_pressed_key (GTK_WIDGET(self), view, key); gtk_widget_queue_draw (GTK_WIDGET(self)); #if HAVE_LIBCANBERRA @@ -533,8 +538,10 @@ on_key_pressed (EekKey *key, static void on_key_released (EekKey *key, + EekKeyboard *view, EekGtkKeyboard *self) { + (void)view; EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); /* renderer may have not been set yet if the widget is a popup */ diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index b44237ef..1b98ad70 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -433,3 +433,36 @@ EekKeyboard *level_keyboard_current(LevelKeyboard *keyboard) { return keyboard->views[keyboard->level]; } + +struct GetSectionData { + const EekKey *key; + EekSection *section; +}; + +gint check_right_key(EekElement *element, gpointer user_data) { + EekKey *key = EEK_KEY(element); + struct GetSectionData *data = user_data; + if (key == data->key) { + return TRUE; + } else { + return FALSE; + } +} + +void find_key_in_section(EekElement *element, gpointer user_data) { + EekSection *section = EEK_SECTION(element); + struct GetSectionData *data = user_data; + if (eek_container_find(EEK_CONTAINER(section), check_right_key, &data)) { + data->section = section; + } +} + +EekSection *eek_keyboard_get_section(EekKeyboard *keyboard, + const EekKey *key) { + struct GetSectionData data = { + .key = key, + .section = NULL, + }; + eek_container_foreach_child(EEK_CONTAINER(keyboard), find_key_in_section, &data); + return data.section; +} diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index 3508a93c..6a08812d 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -155,11 +155,14 @@ void eek_keyboard_set_size EekSection *eek_keyboard_create_section (EekKeyboard *keyboard); - +EekSection *eek_keyboard_get_section + (EekKeyboard *keyboard, + const EekKey *key); EekKey *eek_keyboard_find_key_by_name (LevelKeyboard *keyboard, const gchar *name); + EekOutline *level_keyboard_get_outline (LevelKeyboard *keyboard, guint oref); diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index 5db9b1b2..1923fc63 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -78,18 +78,18 @@ extern void _eek_rounded_polygon (cairo_t *cr, static void eek_renderer_real_render_key_label (EekRenderer *self, PangoLayout *layout, - EekKey *key, guint level); + EekKey *key); static void invalidate (EekRenderer *renderer); static void render_key (EekRenderer *self, - cairo_t *cr, - EekKey *key, guint level, + cairo_t *cr, EekKeyboard *view, + EekKey *key, gboolean active); struct _CreateKeyboardSurfaceCallbackData { cairo_t *cr; EekRenderer *renderer; - uint level; + EekKeyboard *view; }; typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; @@ -110,7 +110,7 @@ create_keyboard_surface_key_callback (EekElement *element, bounds.width + 100, bounds.height + 100); cairo_clip (data->cr); - render_key (data->renderer, data->cr, EEK_KEY(element), data->level, FALSE); + render_key (data->renderer, data->cr, data->view, EEK_KEY(element), FALSE); cairo_restore (data->cr); } @@ -139,19 +139,21 @@ create_keyboard_surface_section_callback (EekElement *element, } void -render_keyboard_surface (EekRenderer *renderer) +render_keyboard_surface (EekRenderer *renderer, EekKeyboard *view) { EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); EekBounds bounds; - CreateKeyboardSurfaceCallbackData data; EekColor foreground; eek_renderer_get_foreground_color (renderer, priv->scontext, &foreground); eek_element_get_bounds (EEK_ELEMENT(level_keyboard_current(priv->keyboard)), &bounds); - data.cr = cairo_create (priv->keyboard_surface); - data.renderer = renderer; + CreateKeyboardSurfaceCallbackData data = { + .cr = cairo_create (priv->keyboard_surface), + .renderer = renderer, + .view = view, + }; /* Paint the background covering the entire widget area */ gtk_render_background (priv->scontext, @@ -173,7 +175,6 @@ render_keyboard_surface (EekRenderer *renderer) foreground.blue, foreground.alpha); - data.level = priv->keyboard->level; /* draw sections */ eek_container_foreach_child (EEK_CONTAINER(level_keyboard_current(priv->keyboard)), create_keyboard_surface_section_callback, @@ -214,8 +215,8 @@ render_key_outline (EekRenderer *renderer, static void render_key (EekRenderer *self, cairo_t *cr, + EekKeyboard *view, EekKey *key, - guint level, gboolean active) { EekRendererPrivate *priv = eek_renderer_get_instance_private (self); @@ -259,7 +260,7 @@ render_key (EekRenderer *self, cairo_paint (cr); cairo_save (cr); - eek_renderer_apply_transformation_for_key (self, cr, key, 1.0, FALSE); + eek_renderer_apply_transformation_for_key (self, cr, view, key, 1.0, FALSE); render_key_outline (self, cr, key, active); cairo_restore (cr); @@ -311,7 +312,7 @@ render_key (EekRenderer *self, /* render label */ layout = pango_cairo_create_layout (cr); - eek_renderer_real_render_key_label (self, layout, key, level); + eek_renderer_real_render_key_label (self, layout, key); pango_layout_get_extents (layout, NULL, &extents); cairo_save (cr); @@ -349,11 +350,12 @@ render_key (EekRenderer *self, void eek_renderer_apply_transformation_for_key (EekRenderer *self, cairo_t *cr, + EekKeyboard *view, EekKey *key, gdouble scale, gboolean rotate) { - EekElement *section; + EekSection *section; EekBounds bounds, rotated_bounds; gint angle; gdouble s; @@ -361,8 +363,8 @@ eek_renderer_apply_transformation_for_key (EekRenderer *self, eek_renderer_get_key_bounds (self, key, &bounds, FALSE); eek_renderer_get_key_bounds (self, key, &rotated_bounds, TRUE); - section = eek_element_get_parent (EEK_ELEMENT(key)); - angle = eek_section_get_angle (EEK_SECTION(section)); + section = eek_keyboard_get_section(view, key); + angle = eek_section_get_angle (section); cairo_scale (cr, scale, scale); if (rotate) { @@ -378,8 +380,7 @@ eek_renderer_apply_transformation_for_key (EekRenderer *self, static void eek_renderer_real_render_key_label (EekRenderer *self, PangoLayout *layout, - EekKey *key, - guint level) + EekKey *key) { EekRendererPrivate *priv = eek_renderer_get_instance_private (self); struct squeek_symbol *symbol; @@ -435,12 +436,13 @@ eek_renderer_real_render_key_label (EekRenderer *self, static void eek_renderer_real_render_key_outline (EekRenderer *self, cairo_t *cr, + EekKeyboard *view, EekKey *key, gdouble scale, gboolean rotate) { cairo_save (cr); - eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate); + eek_renderer_apply_transformation_for_key (self, cr, view, key, scale, rotate); render_key_outline (self, cr, key, eek_key_is_pressed (key) || eek_key_is_locked (key)); cairo_restore (cr); } @@ -459,8 +461,8 @@ eek_renderer_real_render_key_outline (EekRenderer *self, static void eek_renderer_real_render_key (EekRenderer *self, cairo_t *cr, + EekKeyboard *view, EekKey *key, - guint level, gdouble scale, gboolean rotate) { @@ -476,8 +478,8 @@ eek_renderer_real_render_key (EekRenderer *self, cairo_scale (cr, priv->scale, priv->scale); cairo_translate (cr, bounds.x, bounds.y); - eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate); - render_key (self, cr, key, level, eek_key_is_pressed (key) || eek_key_is_locked (key)); + eek_renderer_apply_transformation_for_key (self, cr, view, key, scale, rotate); + render_key (self, cr, view, key, eek_key_is_pressed (key) || eek_key_is_locked (key)); cairo_restore (cr); } @@ -503,7 +505,7 @@ eek_renderer_real_render_keyboard (EekRenderer *self, cairo_get_target (cr), 0, 0, priv->allocation_width, priv->allocation_height); - render_keyboard_surface (self); + render_keyboard_surface (self, priv->keyboard->views[priv->keyboard->level]); cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0); source = cairo_get_source (cr); @@ -846,6 +848,7 @@ eek_renderer_create_pango_layout (EekRenderer *renderer) void eek_renderer_render_key_outline (EekRenderer *renderer, cairo_t *cr, + EekKeyboard *view, EekKey *key, gdouble scale, gboolean rotate) @@ -856,6 +859,7 @@ eek_renderer_render_key_outline (EekRenderer *renderer, EEK_RENDERER_GET_CLASS(renderer)->render_key_outline (renderer, cr, + view, key, scale, rotate); @@ -898,8 +902,8 @@ eek_renderer_get_icon_surface (EekRenderer *renderer, void eek_renderer_render_key (EekRenderer *renderer, cairo_t *cr, + EekKeyboard *view, EekKey *key, - guint level, gdouble scale, gboolean rotate) { @@ -908,7 +912,7 @@ eek_renderer_render_key (EekRenderer *renderer, g_return_if_fail (scale >= 0.0); EEK_RENDERER_GET_CLASS(renderer)-> - render_key (renderer, cr, key, level, scale, rotate); + render_key (renderer, cr, view, key, scale, rotate); } void @@ -1057,6 +1061,7 @@ find_key_by_position_section_callback (EekElement *element, **/ EekKey * eek_renderer_find_key_by_position (EekRenderer *renderer, + EekKeyboard *view, gdouble x, gdouble y) { @@ -1066,7 +1071,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(level_keyboard_current(priv->keyboard)), &bounds); + eek_element_get_bounds (EEK_ELEMENT(view), &bounds); /* Transform from widget coordinates to keyboard coordinates */ x = (x - priv->origin_x)/priv->scale - bounds.x; @@ -1085,7 +1090,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer, data.key = NULL; data.renderer = renderer; - eek_container_find (EEK_CONTAINER(level_keyboard_current(priv->keyboard)), + eek_container_find (EEK_CONTAINER(view), find_key_by_position_section_callback, &data); return data.key; diff --git a/eek/eek-renderer.h b/eek/eek-renderer.h index fda2ffad..8929b0be 100644 --- a/eek/eek-renderer.h +++ b/eek/eek-renderer.h @@ -38,14 +38,15 @@ struct _EekRendererClass void (* render_key_outline) (EekRenderer *self, cairo_t *cr, + EekKeyboard *view, EekKey *key, gdouble scale, gboolean rotate); void (* render_key) (EekRenderer *self, cairo_t *cr, + EekKeyboard *view, EekKey *key, - guint level, gdouble scale, gboolean rotate); @@ -90,14 +91,15 @@ void eek_renderer_render_key_label (EekRenderer *renderer, void eek_renderer_render_key_outline (EekRenderer *renderer, - cairo_t *cr, + cairo_t *cr, EekKeyboard *view, EekKey *key, gdouble scale, gboolean rotate); void eek_renderer_render_key (EekRenderer *renderer, cairo_t *cr, - EekKey *key, guint level, + EekKeyboard *view, + EekKey *key, gdouble scale, gboolean rotate); @@ -122,12 +124,12 @@ void eek_renderer_get_foreground_color void eek_renderer_set_border_width (EekRenderer *renderer, gdouble border_width); EekKey *eek_renderer_find_key_by_position - (EekRenderer *renderer, + (EekRenderer *renderer, EekKeyboard *view, gdouble x, gdouble y); void eek_renderer_apply_transformation_for_key (EekRenderer *renderer, - cairo_t *cr, + cairo_t *cr, EekKeyboard *view, EekKey *key, gdouble scale, gboolean rotate);