From 077ca8fad2be6ef08c79a18b9dbdd1561966b2cc Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Fri, 2 Aug 2019 20:17:17 +0000 Subject: [PATCH] level: Make keyboard the only source of level data --- eek/eek-gtk-keyboard.c | 33 ++++++++++++++++++++------------- eek/eek-key.h | 2 +- eek/eek-keyboard.c | 11 ++++++----- eek/eek-renderer.c | 33 +++++++++++++++++---------------- eek/eek-renderer.h | 3 ++- 5 files changed, 46 insertions(+), 36 deletions(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 4ab85a97..e4e4442e 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -64,13 +64,13 @@ 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); + EekGtkKeyboard *self, guint level); static void on_key_released (EekKey *key, EekGtkKeyboard *self); static void render_pressed_key (GtkWidget *widget, - EekKey *key); + EekKey *key, guint level); static void render_locked_key (GtkWidget *widget, - EekKey *key); + EekKey *key, guint level); static void render_released_key (GtkWidget *widget, EekKey *key); @@ -113,17 +113,19 @@ eek_gtk_keyboard_real_draw (GtkWidget *self, eek_renderer_render_keyboard (priv->renderer, cr); + uint level = eek_element_get_level(EEK_ELEMENT(priv->keyboard)); + /* redraw pressed key */ list = eek_keyboard_get_pressed_keys (priv->keyboard); for (head = list; head; head = g_list_next (head)) { - render_pressed_key (self, head->data); + render_pressed_key (self, head->data, level); } g_list_free (list); /* redraw locked key */ list = eek_keyboard_get_locked_keys (priv->keyboard); for (head = list; head; head = g_list_next (head)) { - render_locked_key (self, ((EekModifierKey *)head->data)->key); + render_locked_key (self, ((EekModifierKey *)head->data)->key, level); } g_list_free (list); @@ -154,7 +156,8 @@ static void depress(EekGtkKeyboard *self, if (key) { eek_keyboard_press_key(priv->keyboard, key, time); - on_key_pressed(key, self); + guint level = eek_element_get_level(EEK_ELEMENT(priv->keyboard)); + on_key_pressed(key, self, level); } } @@ -181,7 +184,8 @@ static void drag(EekGtkKeyboard *self, if (!found) { eek_keyboard_press_key(priv->keyboard, key, time); - on_key_pressed(key, self); + guint level = eek_element_get_level(EEK_ELEMENT(priv->keyboard)); + on_key_pressed(key, self, level); } } else { for (head = list; head; head = g_list_next (head)) { @@ -473,7 +477,8 @@ magnify_bounds (GtkWidget *self, static void render_pressed_key (GtkWidget *widget, - EekKey *key) + EekKey *key, + guint level) { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -483,7 +488,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, 1.0, TRUE); + eek_renderer_render_key (priv->renderer, cr, key, level, 1.0, TRUE); /* eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE); */ @@ -494,7 +499,8 @@ render_pressed_key (GtkWidget *widget, static void render_locked_key (GtkWidget *widget, - EekKey *key) + EekKey *key, + guint level) { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -504,7 +510,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, 1.0, TRUE); + eek_renderer_render_key (priv->renderer, cr, key, level, 1.0, TRUE); gdk_window_end_draw_frame (window, context); @@ -532,7 +538,8 @@ render_released_key (GtkWidget *widget, static void on_key_pressed (EekKey *key, - EekGtkKeyboard *self) + EekGtkKeyboard *self, + guint level) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); @@ -540,7 +547,7 @@ on_key_pressed (EekKey *key, if (!priv->renderer) return; - render_pressed_key (GTK_WIDGET(self), key); + render_pressed_key (GTK_WIDGET(self), key, level); gtk_widget_queue_draw (GTK_WIDGET(self)); #if HAVE_LIBCANBERRA diff --git a/eek/eek-key.h b/eek/eek-key.h index 91398e8e..4066da99 100644 --- a/eek/eek-key.h +++ b/eek/eek-key.h @@ -67,7 +67,7 @@ EekSymbol *eek_key_get_symbol_with_fallback gint fallback_level); struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key, gint group, - gint level, + gint level, guint fallback_group, guint fallback_level); diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index 7e3c763b..77b0c9ed 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -301,7 +301,9 @@ void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestam eek_key_set_pressed(key, TRUE); priv->pressed_keys = g_list_prepend (priv->pressed_keys, key); - EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0); + struct squeek_symbol *symbol = eek_key_get_symbol_at_index( + key, 0, eek_element_get_level (EEK_ELEMENT(keyboard)), 0, 0 + ); if (!symbol) return; @@ -332,10 +334,9 @@ void eek_keyboard_release_key( EekKeyboard *keyboard, } } - EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0); - if (!symbol) - return; - + struct squeek_symbol *symbol = eek_key_get_symbol_at_index( + key, 0, eek_element_get_level (EEK_ELEMENT(keyboard)), 0, 0 + ); if (!symbol) return; diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index 671db408..1fadc0b7 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -79,12 +79,12 @@ extern void _eek_rounded_polygon (cairo_t *cr, static void eek_renderer_real_render_key_label (EekRenderer *self, PangoLayout *layout, - EekKey *key); + EekKey *key, guint level); static void invalidate (EekRenderer *renderer); static void render_key (EekRenderer *self, cairo_t *cr, - EekKey *key, + EekKey *key, guint level, gboolean active); static void on_symbol_index_changed (EekKeyboard *keyboard, gint group, @@ -94,6 +94,7 @@ static void on_symbol_index_changed (EekKeyboard *keyboard, struct _CreateKeyboardSurfaceCallbackData { cairo_t *cr; EekRenderer *renderer; + uint level; }; typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; @@ -114,7 +115,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), FALSE); + render_key (data->renderer, data->cr, EEK_KEY(element), data->level, FALSE); cairo_restore (data->cr); } @@ -177,6 +178,7 @@ render_keyboard_surface (EekRenderer *renderer) foreground.blue, foreground.alpha); + data.level = eek_element_get_level(EEK_ELEMENT(priv->keyboard)); /* draw sections */ eek_container_foreach_child (EEK_CONTAINER(priv->keyboard), create_keyboard_surface_section_callback, @@ -218,6 +220,7 @@ static void render_key (EekRenderer *self, cairo_t *cr, EekKey *key, + guint level, gboolean active) { EekRendererPrivate *priv = eek_renderer_get_instance_private (self); @@ -225,7 +228,7 @@ render_key (EekRenderer *self, cairo_surface_t *outline_surface; EekBounds bounds; guint oref; - EekSymbol *symbol; + struct squeek_symbol *symbol; GHashTable *outline_surface_cache; PangoLayout *layout; PangoRectangle extents = { 0, }; @@ -277,12 +280,7 @@ render_key (EekRenderer *self, eek_renderer_get_foreground_color (self, priv->key_context, &foreground); /* render icon (if any) */ - - EekSection *section = EEK_SECTION(eek_element_get_parent(EEK_ELEMENT(key))); - gint group = eek_element_get_group(EEK_ELEMENT(section)); - gint level = eek_element_get_level(EEK_ELEMENT(section)); - - symbol = eek_key_get_symbol_at_index (key, group, level, 0, 0); + symbol = eek_key_get_symbol_at_index (key, 0, level, 0, 0); if (!symbol) return; @@ -318,7 +316,7 @@ render_key (EekRenderer *self, /* render label */ layout = pango_cairo_create_layout (cr); - eek_renderer_real_render_key_label (self, layout, key); + eek_renderer_real_render_key_label (self, layout, key, level); pango_layout_get_extents (layout, NULL, &extents); cairo_save (cr); @@ -385,17 +383,18 @@ eek_renderer_apply_transformation_for_key (EekRenderer *self, static void eek_renderer_real_render_key_label (EekRenderer *self, PangoLayout *layout, - EekKey *key) + EekKey *key, + guint level) { EekRendererPrivate *priv = eek_renderer_get_instance_private (self); - EekSymbol *symbol; + struct squeek_symbol *symbol; const gchar *label; EekBounds bounds; PangoFontDescription *font; PangoLayoutLine *line; gdouble scale; - symbol = eek_key_get_symbol_with_fallback (key, 0, 0); + symbol = eek_key_get_symbol_at_index(key, 0, level, 0, 0); if (!symbol) return; @@ -466,6 +465,7 @@ static void eek_renderer_real_render_key (EekRenderer *self, cairo_t *cr, EekKey *key, + guint level, gdouble scale, gboolean rotate) { @@ -482,7 +482,7 @@ eek_renderer_real_render_key (EekRenderer *self, 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)); + render_key (self, cr, key, level, eek_key_is_pressed (key) || eek_key_is_locked (key)); cairo_restore (cr); } @@ -942,6 +942,7 @@ void eek_renderer_render_key (EekRenderer *renderer, cairo_t *cr, EekKey *key, + guint level, gdouble scale, gboolean rotate) { @@ -950,7 +951,7 @@ eek_renderer_render_key (EekRenderer *renderer, g_return_if_fail (scale >= 0.0); EEK_RENDERER_GET_CLASS(renderer)-> - render_key (renderer, cr, key, scale, rotate); + render_key (renderer, cr, key, level, scale, rotate); } void diff --git a/eek/eek-renderer.h b/eek/eek-renderer.h index 4e322b81..902464c9 100644 --- a/eek/eek-renderer.h +++ b/eek/eek-renderer.h @@ -44,6 +44,7 @@ struct _EekRendererClass void (* render_key) (EekRenderer *self, cairo_t *cr, EekKey *key, + guint level, gdouble scale, gboolean rotate); @@ -95,7 +96,7 @@ void eek_renderer_render_key_outline void eek_renderer_render_key (EekRenderer *renderer, cairo_t *cr, - EekKey *key, + EekKey *key, guint level, gdouble scale, gboolean rotate);