diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 9fcdf537..135f0e96 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -159,7 +159,8 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget *self, } static void depress(EekGtkKeyboard *self, - gdouble x, gdouble y, guint32 time) { + 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); @@ -482,27 +483,15 @@ render_pressed_key (GtkWidget *widget, { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekBounds bounds, large_bounds; GdkWindow *window = gtk_widget_get_window (widget); cairo_region_t *region = gdk_window_get_clip_region (window); GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region); cairo_t *cr = gdk_drawing_context_get_cairo_context (context); - gdouble scale = eek_renderer_get_scale (priv->renderer); - eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE); - magnify_bounds (widget, &bounds, &large_bounds, 1.5); - - cairo_save (cr); - cairo_scale (cr, scale, scale); - cairo_translate (cr, bounds.x, bounds.y); eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE); - cairo_restore (cr); /* - cairo_save (cr); - cairo_translate (cr, large_bounds.x, large_bounds.y); eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE); - cairo_restore (cr); */ gdk_window_end_draw_frame (window, context); @@ -515,21 +504,13 @@ render_locked_key (GtkWidget *widget, { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekBounds bounds; GdkWindow *window = gtk_widget_get_window (widget); cairo_region_t *region = gdk_window_get_clip_region (window); GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region); cairo_t *cr = gdk_drawing_context_get_cairo_context (context); - gdouble scale = eek_renderer_get_scale (priv->renderer); - eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE); - - cairo_save (cr); - cairo_scale (cr, scale, scale); - cairo_translate (cr, bounds.x, bounds.y); eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE); - cairo_restore (cr); gdk_window_end_draw_frame (window, context); @@ -542,7 +523,6 @@ render_released_key (GtkWidget *widget, { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); - EekBounds bounds, large_bounds; GdkWindow *window = gtk_widget_get_window (widget); cairo_region_t *region = gdk_window_get_clip_region (window); diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index 7cecd713..e3d8dd35 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -452,6 +452,11 @@ render_key (EekRenderer *self, g_object_unref (layout); } +/* + Applies a transformation to the bounds for a given key, consisting of + scaling and rotation. The scale factor is separate to the normal scale + factor for the keyboard as a whole and is applied cumulatively. +*/ void eek_renderer_apply_transformation_for_key (EekRenderer *self, cairo_t *cr, @@ -581,6 +586,10 @@ eek_renderer_real_render_key_outline (EekRenderer *self, cairo_restore (cr); } +/* + Renders a key separately from the normal keyboard rendering. As a result, + the transformation for the context needs to be set up. +*/ static void eek_renderer_real_render_key (EekRenderer *self, cairo_t *cr, @@ -589,9 +598,14 @@ eek_renderer_real_render_key (EekRenderer *self, gboolean rotate) { EekRendererPrivate *priv = eek_renderer_get_instance_private (self); + EekBounds bounds; + + eek_renderer_get_key_bounds (self, key, &bounds, rotate); cairo_save (cr); cairo_translate (cr, priv->origin_x, priv->origin_y); + 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, eek_key_is_pressed (key) || eek_key_is_locked (key)); cairo_restore (cr); @@ -851,12 +865,11 @@ eek_renderer_set_allocation_size (EekRenderer *renderer, scale = MIN(width / w, height / h); - if (scale != priv->scale) { - priv->scale = scale; - priv->origin_x = 0; - priv->origin_y = 0; - invalidate (renderer); - } + priv->scale = scale; + /* Set the rendering offset in widget coordinates to center the keyboard */ + priv->origin_x = (width - (scale * w)) / 2; + priv->origin_y = (height - (scale * h)) / 2; + invalidate (renderer); } void @@ -1223,6 +1236,10 @@ find_key_by_position_section_callback (EekElement *element, return data->key ? 0 : -1; } +/* + Returns the key located at the position x, y in widget coordinates, or + NULL if no key can be found at that location. +*/ EekKey * eek_renderer_find_key_by_position (EekRenderer *renderer, gdouble x, @@ -1234,13 +1251,12 @@ 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); - x /= priv->scale; - y /= priv->scale; - x -= priv->origin_x; - y -= priv->origin_y; - eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds); + /* Transform from widget coordinates to keyboard coordinates */ + x = (x - priv->origin_x)/priv->scale - bounds.x; + y = (y - priv->origin_y)/priv->scale - bounds.y; + if (x < bounds.x || y < bounds.y || x > bounds.width ||