Set pseudo class "active" to EekKey if the key is pressed.
This commit is contained in:
		@ -55,6 +55,7 @@ struct _EekRendererPrivate
 | 
			
		||||
 | 
			
		||||
    PangoFontDescription *font;
 | 
			
		||||
    GHashTable *outline_surface_cache;
 | 
			
		||||
    GHashTable *active_outline_surface_cache;
 | 
			
		||||
    cairo_surface_t *keyboard_surface;
 | 
			
		||||
    gulong symbol_index_changed_handler;
 | 
			
		||||
 | 
			
		||||
@ -211,6 +212,7 @@ render_key_outline (EekRenderer *renderer,
 | 
			
		||||
    gulong oref;
 | 
			
		||||
    EekColor *foreground, *background;
 | 
			
		||||
    EekGradient *gradient;
 | 
			
		||||
    EekThemeNode *theme_node;
 | 
			
		||||
 | 
			
		||||
    /* need to rescale so that the border fit inside the clipping
 | 
			
		||||
       region */
 | 
			
		||||
@ -233,6 +235,14 @@ render_key_outline (EekRenderer *renderer,
 | 
			
		||||
                     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));
 | 
			
		||||
    background = eek_renderer_get_background_color (renderer, EEK_ELEMENT(key));
 | 
			
		||||
 | 
			
		||||
@ -415,15 +425,20 @@ render_key (EekRenderer *self,
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    gulong oref;
 | 
			
		||||
    EekSymbol *symbol;
 | 
			
		||||
    GHashTable *outline_surface_cache;
 | 
			
		||||
 | 
			
		||||
    eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
 | 
			
		||||
    oref = eek_key_get_oref (key);
 | 
			
		||||
    if (oref == 0)
 | 
			
		||||
        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_surface = g_hash_table_lookup (priv->outline_surface_cache,
 | 
			
		||||
                                           outline);
 | 
			
		||||
    outline_surface = g_hash_table_lookup (outline_surface_cache, outline);
 | 
			
		||||
    if (!outline_surface) {
 | 
			
		||||
        cairo_t *cr;
 | 
			
		||||
 | 
			
		||||
@ -446,7 +461,7 @@ render_key (EekRenderer *self,
 | 
			
		||||
        eek_renderer_render_key_outline (self, cr, key, 1.0, 0);
 | 
			
		||||
        cairo_destroy (cr);
 | 
			
		||||
 | 
			
		||||
        g_hash_table_insert (priv->outline_surface_cache,
 | 
			
		||||
        g_hash_table_insert (outline_surface_cache,
 | 
			
		||||
                             outline,
 | 
			
		||||
                             outline_surface);
 | 
			
		||||
    }
 | 
			
		||||
@ -462,6 +477,7 @@ render_key (EekRenderer *self,
 | 
			
		||||
        PangoLayout *layout;
 | 
			
		||||
        PangoRectangle extents = { 0, };
 | 
			
		||||
        EekColor *foreground;
 | 
			
		||||
        EekThemeNode *theme_node;
 | 
			
		||||
 | 
			
		||||
        layout = pango_cairo_create_layout (cr);
 | 
			
		||||
        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.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));
 | 
			
		||||
        cairo_set_source_rgba (cr,
 | 
			
		||||
                               foreground->red,
 | 
			
		||||
@ -709,6 +733,7 @@ eek_renderer_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
 | 
			
		||||
    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_background);
 | 
			
		||||
    pango_font_description_free (priv->font);
 | 
			
		||||
@ -773,6 +798,11 @@ eek_renderer_init (EekRenderer *self)
 | 
			
		||||
                               g_direct_equal,
 | 
			
		||||
                               NULL,
 | 
			
		||||
                               (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->symbol_index_changed_handler = 0;
 | 
			
		||||
}
 | 
			
		||||
@ -785,6 +815,9 @@ invalidate (EekRenderer *renderer)
 | 
			
		||||
    if (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) {
 | 
			
		||||
        cairo_surface_destroy (priv->keyboard_surface);
 | 
			
		||||
        priv->keyboard_surface = NULL;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user