level: Make keyboard the only source of level data

This commit is contained in:
Dorota Czaplejewicz
2019-08-02 20:17:17 +00:00
parent 377521c108
commit 077ca8fad2
5 changed files with 46 additions and 36 deletions

View File

@ -64,13 +64,13 @@ typedef struct _EekGtkKeyboardPrivate
G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA) G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA)
static void on_key_pressed (EekKey *key, static void on_key_pressed (EekKey *key,
EekGtkKeyboard *self); EekGtkKeyboard *self, guint level);
static void on_key_released (EekKey *key, static void on_key_released (EekKey *key,
EekGtkKeyboard *self); EekGtkKeyboard *self);
static void render_pressed_key (GtkWidget *widget, static void render_pressed_key (GtkWidget *widget,
EekKey *key); EekKey *key, guint level);
static void render_locked_key (GtkWidget *widget, static void render_locked_key (GtkWidget *widget,
EekKey *key); EekKey *key, guint level);
static void render_released_key (GtkWidget *widget, static void render_released_key (GtkWidget *widget,
EekKey *key); EekKey *key);
@ -113,17 +113,19 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
eek_renderer_render_keyboard (priv->renderer, cr); eek_renderer_render_keyboard (priv->renderer, cr);
uint level = eek_element_get_level(EEK_ELEMENT(priv->keyboard));
/* redraw pressed key */ /* redraw pressed key */
list = eek_keyboard_get_pressed_keys (priv->keyboard); list = eek_keyboard_get_pressed_keys (priv->keyboard);
for (head = list; head; head = g_list_next (head)) { 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); g_list_free (list);
/* redraw locked key */ /* redraw locked key */
list = eek_keyboard_get_locked_keys (priv->keyboard); list = eek_keyboard_get_locked_keys (priv->keyboard);
for (head = list; head; head = g_list_next (head)) { 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); g_list_free (list);
@ -154,7 +156,8 @@ static void depress(EekGtkKeyboard *self,
if (key) { if (key) {
eek_keyboard_press_key(priv->keyboard, key, time); 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) { if (!found) {
eek_keyboard_press_key(priv->keyboard, key, time); 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 { } else {
for (head = list; head; head = g_list_next (head)) { for (head = list; head; head = g_list_next (head)) {
@ -473,7 +477,8 @@ magnify_bounds (GtkWidget *self,
static void static void
render_pressed_key (GtkWidget *widget, render_pressed_key (GtkWidget *widget,
EekKey *key) EekKey *key,
guint level)
{ {
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);
@ -483,7 +488,7 @@ render_pressed_key (GtkWidget *widget,
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);
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); eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE);
*/ */
@ -494,7 +499,8 @@ render_pressed_key (GtkWidget *widget,
static void static void
render_locked_key (GtkWidget *widget, render_locked_key (GtkWidget *widget,
EekKey *key) EekKey *key,
guint level)
{ {
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);
@ -504,7 +510,7 @@ render_locked_key (GtkWidget *widget,
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);
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); gdk_window_end_draw_frame (window, context);
@ -532,7 +538,8 @@ render_released_key (GtkWidget *widget,
static void static void
on_key_pressed (EekKey *key, on_key_pressed (EekKey *key,
EekGtkKeyboard *self) EekGtkKeyboard *self,
guint level)
{ {
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
@ -540,7 +547,7 @@ on_key_pressed (EekKey *key,
if (!priv->renderer) if (!priv->renderer)
return; return;
render_pressed_key (GTK_WIDGET(self), key); render_pressed_key (GTK_WIDGET(self), key, level);
gtk_widget_queue_draw (GTK_WIDGET(self)); gtk_widget_queue_draw (GTK_WIDGET(self));
#if HAVE_LIBCANBERRA #if HAVE_LIBCANBERRA

View File

@ -67,7 +67,7 @@ EekSymbol *eek_key_get_symbol_with_fallback
gint fallback_level); gint fallback_level);
struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key, struct squeek_symbol *eek_key_get_symbol_at_index (EekKey *key,
gint group, gint group,
gint level, gint level,
guint fallback_group, guint fallback_group,
guint fallback_level); guint fallback_level);

View File

@ -301,7 +301,9 @@ void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestam
eek_key_set_pressed(key, TRUE); eek_key_set_pressed(key, TRUE);
priv->pressed_keys = g_list_prepend (priv->pressed_keys, key); 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) if (!symbol)
return; return;
@ -332,10 +334,9 @@ void eek_keyboard_release_key( EekKeyboard *keyboard,
} }
} }
EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0); struct squeek_symbol *symbol = eek_key_get_symbol_at_index(
if (!symbol) key, 0, eek_element_get_level (EEK_ELEMENT(keyboard)), 0, 0
return; );
if (!symbol) if (!symbol)
return; return;

View File

@ -79,12 +79,12 @@ extern void _eek_rounded_polygon (cairo_t *cr,
static void eek_renderer_real_render_key_label (EekRenderer *self, static void eek_renderer_real_render_key_label (EekRenderer *self,
PangoLayout *layout, PangoLayout *layout,
EekKey *key); EekKey *key, guint level);
static void invalidate (EekRenderer *renderer); static void invalidate (EekRenderer *renderer);
static void render_key (EekRenderer *self, static void render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKey *key, EekKey *key, guint level,
gboolean active); gboolean active);
static void on_symbol_index_changed (EekKeyboard *keyboard, static void on_symbol_index_changed (EekKeyboard *keyboard,
gint group, gint group,
@ -94,6 +94,7 @@ static void on_symbol_index_changed (EekKeyboard *keyboard,
struct _CreateKeyboardSurfaceCallbackData { struct _CreateKeyboardSurfaceCallbackData {
cairo_t *cr; cairo_t *cr;
EekRenderer *renderer; EekRenderer *renderer;
uint level;
}; };
typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData; typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData;
@ -114,7 +115,7 @@ create_keyboard_surface_key_callback (EekElement *element,
bounds.width + 100, bounds.width + 100,
bounds.height + 100); bounds.height + 100);
cairo_clip (data->cr); 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); cairo_restore (data->cr);
} }
@ -177,6 +178,7 @@ render_keyboard_surface (EekRenderer *renderer)
foreground.blue, foreground.blue,
foreground.alpha); foreground.alpha);
data.level = eek_element_get_level(EEK_ELEMENT(priv->keyboard));
/* draw sections */ /* draw sections */
eek_container_foreach_child (EEK_CONTAINER(priv->keyboard), eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
create_keyboard_surface_section_callback, create_keyboard_surface_section_callback,
@ -218,6 +220,7 @@ static void
render_key (EekRenderer *self, render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKey *key, EekKey *key,
guint level,
gboolean active) gboolean active)
{ {
EekRendererPrivate *priv = eek_renderer_get_instance_private (self); EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
@ -225,7 +228,7 @@ render_key (EekRenderer *self,
cairo_surface_t *outline_surface; cairo_surface_t *outline_surface;
EekBounds bounds; EekBounds bounds;
guint oref; guint oref;
EekSymbol *symbol; struct squeek_symbol *symbol;
GHashTable *outline_surface_cache; GHashTable *outline_surface_cache;
PangoLayout *layout; PangoLayout *layout;
PangoRectangle extents = { 0, }; PangoRectangle extents = { 0, };
@ -277,12 +280,7 @@ render_key (EekRenderer *self,
eek_renderer_get_foreground_color (self, priv->key_context, &foreground); eek_renderer_get_foreground_color (self, priv->key_context, &foreground);
/* render icon (if any) */ /* render icon (if any) */
symbol = eek_key_get_symbol_at_index (key, 0, level, 0, 0);
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);
if (!symbol) if (!symbol)
return; return;
@ -318,7 +316,7 @@ render_key (EekRenderer *self,
/* render label */ /* render label */
layout = pango_cairo_create_layout (cr); 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); pango_layout_get_extents (layout, NULL, &extents);
cairo_save (cr); cairo_save (cr);
@ -385,17 +383,18 @@ eek_renderer_apply_transformation_for_key (EekRenderer *self,
static void static void
eek_renderer_real_render_key_label (EekRenderer *self, eek_renderer_real_render_key_label (EekRenderer *self,
PangoLayout *layout, PangoLayout *layout,
EekKey *key) EekKey *key,
guint level)
{ {
EekRendererPrivate *priv = eek_renderer_get_instance_private (self); EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
EekSymbol *symbol; struct squeek_symbol *symbol;
const gchar *label; const gchar *label;
EekBounds bounds; EekBounds bounds;
PangoFontDescription *font; PangoFontDescription *font;
PangoLayoutLine *line; PangoLayoutLine *line;
gdouble scale; 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) if (!symbol)
return; return;
@ -466,6 +465,7 @@ static void
eek_renderer_real_render_key (EekRenderer *self, eek_renderer_real_render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKey *key, EekKey *key,
guint level,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
{ {
@ -482,7 +482,7 @@ eek_renderer_real_render_key (EekRenderer *self,
cairo_translate (cr, bounds.x, bounds.y); 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, level, eek_key_is_pressed (key) || eek_key_is_locked (key));
cairo_restore (cr); cairo_restore (cr);
} }
@ -942,6 +942,7 @@ void
eek_renderer_render_key (EekRenderer *renderer, eek_renderer_render_key (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr,
EekKey *key, EekKey *key,
guint level,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
{ {
@ -950,7 +951,7 @@ eek_renderer_render_key (EekRenderer *renderer,
g_return_if_fail (scale >= 0.0); g_return_if_fail (scale >= 0.0);
EEK_RENDERER_GET_CLASS(renderer)-> EEK_RENDERER_GET_CLASS(renderer)->
render_key (renderer, cr, key, scale, rotate); render_key (renderer, cr, key, level, scale, rotate);
} }
void void

View File

@ -44,6 +44,7 @@ struct _EekRendererClass
void (* render_key) (EekRenderer *self, void (* render_key) (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKey *key, EekKey *key,
guint level,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);
@ -95,7 +96,7 @@ void eek_renderer_render_key_outline
void eek_renderer_render_key (EekRenderer *renderer, void eek_renderer_render_key (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr,
EekKey *key, EekKey *key, guint level,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);