From 016c1086e63b4bd46b848a9ddb518ccf2d3e1686 Mon Sep 17 00:00:00 2001 From: David Boddie Date: Tue, 30 Jul 2019 20:25:48 +0000 Subject: [PATCH 1/3] Center the keyboard horizontally Also simplify individual key rendering to make the rendering model more coherent. --- eek/eek-gtk-keyboard.c | 24 ++---------------------- eek/eek-renderer.c | 38 +++++++++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 33 deletions(-) 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 || From f53babcd68c20f69e5f70c8253d0161d4611fd54 Mon Sep 17 00:00:00 2001 From: David Boddie Date: Wed, 31 Jul 2019 19:23:15 +0200 Subject: [PATCH 2/3] Add gtk-doc style comment --- eek/eek-renderer.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index e3d8dd35..88572d2d 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -1236,10 +1236,15 @@ 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. -*/ +/** + * eek_renderer_find_key_by_position: + * @renderer: The renderer normally used to render the key + * @x: The horizontal widget coordinate of the position to test for a key + * @y: The vertical widget coordinate of the position to test for a key + * + * Return value: 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, From f852cab0f9b44ef111142865eb9eb3f52377094f Mon Sep 17 00:00:00 2001 From: David Boddie Date: Thu, 1 Aug 2019 15:55:02 +0200 Subject: [PATCH 3/3] Fix warnings, add gtk-doc strings --- eek/eek-renderer.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index 88572d2d..54428ab6 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -452,10 +452,20 @@ 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. +/** + * eek_renderer_apply_transformation_for_key: + * @self: The renderer used to render the key + * @cr: The Cairo rendering context used for rendering + * @key: The key to be transformed + * @scale: The factor used to scale the key bounds before rendering + * @rotate: Whether to rotate the key by the angle defined for the key's + * in its section definition + * + * Applies a transformation, consisting of scaling and rotation, to the + * current rendering context using the bounds for the given key. The scale + * factor is separate to the normal scale factor for the keyboard as a whole + * and is applied cumulatively. It is typically used to render larger than + * normal keys for popups. */ void eek_renderer_apply_transformation_for_key (EekRenderer *self, @@ -587,8 +597,15 @@ eek_renderer_real_render_key_outline (EekRenderer *self, } /* - Renders a key separately from the normal keyboard rendering. As a result, - the transformation for the context needs to be set up. + * eek_renderer_real_render_key: + * @self: The renderer used to render the key + * @cr: The Cairo rendering context used for rendering + * @key: The key to be transformed + * @scale: The factor used to scale the key bounds before rendering + * @rotate: Whether to rotate the key by the angle defined for the key's + * in its section definition + * + * Renders a key separately from the normal keyboard rendering. */ static void eek_renderer_real_render_key (EekRenderer *self, @@ -603,9 +620,12 @@ eek_renderer_real_render_key (EekRenderer *self, eek_renderer_get_key_bounds (self, key, &bounds, rotate); cairo_save (cr); + /* Because this function is called separately from the keyboard rendering + function, the transformation for the context needs to be set up */ 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);