Set pseudo class "active" to EekKey if the key is pressed.
This commit is contained in:
@ -55,6 +55,7 @@ struct _EekRendererPrivate
|
|||||||
|
|
||||||
PangoFontDescription *font;
|
PangoFontDescription *font;
|
||||||
GHashTable *outline_surface_cache;
|
GHashTable *outline_surface_cache;
|
||||||
|
GHashTable *active_outline_surface_cache;
|
||||||
cairo_surface_t *keyboard_surface;
|
cairo_surface_t *keyboard_surface;
|
||||||
gulong symbol_index_changed_handler;
|
gulong symbol_index_changed_handler;
|
||||||
|
|
||||||
@ -211,6 +212,7 @@ render_key_outline (EekRenderer *renderer,
|
|||||||
gulong oref;
|
gulong oref;
|
||||||
EekColor *foreground, *background;
|
EekColor *foreground, *background;
|
||||||
EekGradient *gradient;
|
EekGradient *gradient;
|
||||||
|
EekThemeNode *theme_node;
|
||||||
|
|
||||||
/* need to rescale so that the border fit inside the clipping
|
/* need to rescale so that the border fit inside the clipping
|
||||||
region */
|
region */
|
||||||
@ -233,6 +235,14 @@ render_key_outline (EekRenderer *renderer,
|
|||||||
priv->border_width / 2 * priv->scale,
|
priv->border_width / 2 * priv->scale,
|
||||||
priv->border_width / 2 * priv->scale);
|
priv->border_width / 2 * priv->scale);
|
||||||
|
|
||||||
|
theme_node = g_object_get_qdata (G_OBJECT(key),
|
||||||
|
g_quark_from_static_string ("theme-node"));
|
||||||
|
if (theme_node) {
|
||||||
|
eek_theme_node_set_pseudo_class (theme_node,
|
||||||
|
eek_key_is_pressed (key) ?
|
||||||
|
"active" : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
foreground = eek_renderer_get_foreground_color (renderer, EEK_ELEMENT(key));
|
foreground = eek_renderer_get_foreground_color (renderer, EEK_ELEMENT(key));
|
||||||
background = eek_renderer_get_background_color (renderer, EEK_ELEMENT(key));
|
background = eek_renderer_get_background_color (renderer, EEK_ELEMENT(key));
|
||||||
|
|
||||||
@ -415,15 +425,20 @@ render_key (EekRenderer *self,
|
|||||||
EekBounds bounds;
|
EekBounds bounds;
|
||||||
gulong oref;
|
gulong oref;
|
||||||
EekSymbol *symbol;
|
EekSymbol *symbol;
|
||||||
|
GHashTable *outline_surface_cache;
|
||||||
|
|
||||||
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
|
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
|
||||||
oref = eek_key_get_oref (key);
|
oref = eek_key_get_oref (key);
|
||||||
if (oref == 0)
|
if (oref == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (eek_key_is_pressed (key))
|
||||||
|
outline_surface_cache = priv->active_outline_surface_cache;
|
||||||
|
else
|
||||||
|
outline_surface_cache = priv->outline_surface_cache;
|
||||||
|
|
||||||
outline = eek_keyboard_get_outline (priv->keyboard, oref);
|
outline = eek_keyboard_get_outline (priv->keyboard, oref);
|
||||||
outline_surface = g_hash_table_lookup (priv->outline_surface_cache,
|
outline_surface = g_hash_table_lookup (outline_surface_cache, outline);
|
||||||
outline);
|
|
||||||
if (!outline_surface) {
|
if (!outline_surface) {
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
|
|
||||||
@ -446,7 +461,7 @@ render_key (EekRenderer *self,
|
|||||||
eek_renderer_render_key_outline (self, cr, key, 1.0, 0);
|
eek_renderer_render_key_outline (self, cr, key, 1.0, 0);
|
||||||
cairo_destroy (cr);
|
cairo_destroy (cr);
|
||||||
|
|
||||||
g_hash_table_insert (priv->outline_surface_cache,
|
g_hash_table_insert (outline_surface_cache,
|
||||||
outline,
|
outline,
|
||||||
outline_surface);
|
outline_surface);
|
||||||
}
|
}
|
||||||
@ -462,6 +477,7 @@ render_key (EekRenderer *self,
|
|||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoRectangle extents = { 0, };
|
PangoRectangle extents = { 0, };
|
||||||
EekColor *foreground;
|
EekColor *foreground;
|
||||||
|
EekThemeNode *theme_node;
|
||||||
|
|
||||||
layout = pango_cairo_create_layout (cr);
|
layout = pango_cairo_create_layout (cr);
|
||||||
eek_renderer_render_key_label (self, layout, key);
|
eek_renderer_render_key_label (self, layout, key);
|
||||||
@ -473,6 +489,14 @@ render_key (EekRenderer *self,
|
|||||||
(bounds.width * priv->scale - extents.width / PANGO_SCALE) / 2,
|
(bounds.width * priv->scale - extents.width / PANGO_SCALE) / 2,
|
||||||
(bounds.height * priv->scale - extents.height / PANGO_SCALE) / 2);
|
(bounds.height * priv->scale - extents.height / PANGO_SCALE) / 2);
|
||||||
|
|
||||||
|
theme_node = g_object_get_qdata (G_OBJECT(key),
|
||||||
|
g_quark_from_static_string ("theme-node"));
|
||||||
|
if (theme_node) {
|
||||||
|
eek_theme_node_set_pseudo_class (theme_node,
|
||||||
|
eek_key_is_pressed (key) ?
|
||||||
|
"active" : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
foreground = eek_renderer_get_foreground_color (self, EEK_ELEMENT(key));
|
foreground = eek_renderer_get_foreground_color (self, EEK_ELEMENT(key));
|
||||||
cairo_set_source_rgba (cr,
|
cairo_set_source_rgba (cr,
|
||||||
foreground->red,
|
foreground->red,
|
||||||
@ -709,6 +733,7 @@ eek_renderer_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
|
EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
|
||||||
g_hash_table_destroy (priv->outline_surface_cache);
|
g_hash_table_destroy (priv->outline_surface_cache);
|
||||||
|
g_hash_table_destroy (priv->active_outline_surface_cache);
|
||||||
eek_color_free (priv->default_foreground);
|
eek_color_free (priv->default_foreground);
|
||||||
eek_color_free (priv->default_background);
|
eek_color_free (priv->default_background);
|
||||||
pango_font_description_free (priv->font);
|
pango_font_description_free (priv->font);
|
||||||
@ -773,6 +798,11 @@ eek_renderer_init (EekRenderer *self)
|
|||||||
g_direct_equal,
|
g_direct_equal,
|
||||||
NULL,
|
NULL,
|
||||||
(GDestroyNotify)cairo_surface_destroy);
|
(GDestroyNotify)cairo_surface_destroy);
|
||||||
|
priv->active_outline_surface_cache =
|
||||||
|
g_hash_table_new_full (g_direct_hash,
|
||||||
|
g_direct_equal,
|
||||||
|
NULL,
|
||||||
|
(GDestroyNotify)cairo_surface_destroy);
|
||||||
priv->keyboard_surface = NULL;
|
priv->keyboard_surface = NULL;
|
||||||
priv->symbol_index_changed_handler = 0;
|
priv->symbol_index_changed_handler = 0;
|
||||||
}
|
}
|
||||||
@ -785,6 +815,9 @@ invalidate (EekRenderer *renderer)
|
|||||||
if (priv->outline_surface_cache)
|
if (priv->outline_surface_cache)
|
||||||
g_hash_table_remove_all (priv->outline_surface_cache);
|
g_hash_table_remove_all (priv->outline_surface_cache);
|
||||||
|
|
||||||
|
if (priv->active_outline_surface_cache)
|
||||||
|
g_hash_table_remove_all (priv->active_outline_surface_cache);
|
||||||
|
|
||||||
if (priv->keyboard_surface) {
|
if (priv->keyboard_surface) {
|
||||||
cairo_surface_destroy (priv->keyboard_surface);
|
cairo_surface_destroy (priv->keyboard_surface);
|
||||||
priv->keyboard_surface = NULL;
|
priv->keyboard_surface = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user