Center the keyboard horizontally
Also simplify individual key rendering to make the rendering model more coherent.
This commit is contained in:
@ -159,7 +159,8 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void depress(EekGtkKeyboard *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);
|
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||||
EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
|
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);
|
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
||||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||||
EekBounds bounds, large_bounds;
|
|
||||||
|
|
||||||
GdkWindow *window = gtk_widget_get_window (widget);
|
GdkWindow *window = gtk_widget_get_window (widget);
|
||||||
cairo_region_t *region = gdk_window_get_clip_region (window);
|
cairo_region_t *region = gdk_window_get_clip_region (window);
|
||||||
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
|
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
|
||||||
cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
|
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);
|
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);
|
eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE);
|
||||||
cairo_restore (cr);
|
|
||||||
*/
|
*/
|
||||||
gdk_window_end_draw_frame (window, context);
|
gdk_window_end_draw_frame (window, context);
|
||||||
|
|
||||||
@ -515,21 +504,13 @@ render_locked_key (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
||||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||||
EekBounds bounds;
|
|
||||||
|
|
||||||
GdkWindow *window = gtk_widget_get_window (widget);
|
GdkWindow *window = gtk_widget_get_window (widget);
|
||||||
cairo_region_t *region = gdk_window_get_clip_region (window);
|
cairo_region_t *region = gdk_window_get_clip_region (window);
|
||||||
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
|
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
|
||||||
cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
|
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);
|
eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
|
||||||
cairo_restore (cr);
|
|
||||||
|
|
||||||
gdk_window_end_draw_frame (window, context);
|
gdk_window_end_draw_frame (window, context);
|
||||||
|
|
||||||
@ -542,7 +523,6 @@ render_released_key (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
||||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||||
EekBounds bounds, large_bounds;
|
|
||||||
|
|
||||||
GdkWindow *window = gtk_widget_get_window (widget);
|
GdkWindow *window = gtk_widget_get_window (widget);
|
||||||
cairo_region_t *region = gdk_window_get_clip_region (window);
|
cairo_region_t *region = gdk_window_get_clip_region (window);
|
||||||
|
|||||||
@ -452,6 +452,11 @@ render_key (EekRenderer *self,
|
|||||||
g_object_unref (layout);
|
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
|
void
|
||||||
eek_renderer_apply_transformation_for_key (EekRenderer *self,
|
eek_renderer_apply_transformation_for_key (EekRenderer *self,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
@ -581,6 +586,10 @@ eek_renderer_real_render_key_outline (EekRenderer *self,
|
|||||||
cairo_restore (cr);
|
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
|
static void
|
||||||
eek_renderer_real_render_key (EekRenderer *self,
|
eek_renderer_real_render_key (EekRenderer *self,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
@ -589,9 +598,14 @@ eek_renderer_real_render_key (EekRenderer *self,
|
|||||||
gboolean rotate)
|
gboolean rotate)
|
||||||
{
|
{
|
||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
|
EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
|
||||||
|
EekBounds bounds;
|
||||||
|
|
||||||
|
eek_renderer_get_key_bounds (self, key, &bounds, rotate);
|
||||||
|
|
||||||
cairo_save (cr);
|
cairo_save (cr);
|
||||||
cairo_translate (cr, priv->origin_x, priv->origin_y);
|
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);
|
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));
|
render_key (self, cr, key, eek_key_is_pressed (key) || eek_key_is_locked (key));
|
||||||
cairo_restore (cr);
|
cairo_restore (cr);
|
||||||
@ -851,12 +865,11 @@ eek_renderer_set_allocation_size (EekRenderer *renderer,
|
|||||||
|
|
||||||
scale = MIN(width / w, height / h);
|
scale = MIN(width / w, height / h);
|
||||||
|
|
||||||
if (scale != priv->scale) {
|
priv->scale = scale;
|
||||||
priv->scale = scale;
|
/* Set the rendering offset in widget coordinates to center the keyboard */
|
||||||
priv->origin_x = 0;
|
priv->origin_x = (width - (scale * w)) / 2;
|
||||||
priv->origin_y = 0;
|
priv->origin_y = (height - (scale * h)) / 2;
|
||||||
invalidate (renderer);
|
invalidate (renderer);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1223,6 +1236,10 @@ find_key_by_position_section_callback (EekElement *element,
|
|||||||
return data->key ? 0 : -1;
|
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 *
|
EekKey *
|
||||||
eek_renderer_find_key_by_position (EekRenderer *renderer,
|
eek_renderer_find_key_by_position (EekRenderer *renderer,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
@ -1234,13 +1251,12 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
|
|||||||
g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
|
g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
|
||||||
|
|
||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
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);
|
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 ||
|
if (x < bounds.x ||
|
||||||
y < bounds.y ||
|
y < bounds.y ||
|
||||||
x > bounds.width ||
|
x > bounds.width ||
|
||||||
|
|||||||
Reference in New Issue
Block a user