Replace the Eek theme support with GTK classes
This brings the appearance of the keyboard basically in line with what was there before. The background and key borders still need to be fixed and the text and icons should probably be drawn using the style context.
This commit is contained in:
		@ -33,6 +33,7 @@ enum {
 | 
				
			|||||||
    PROP_0,
 | 
					    PROP_0,
 | 
				
			||||||
    PROP_KEYBOARD,
 | 
					    PROP_KEYBOARD,
 | 
				
			||||||
    PROP_PCONTEXT,
 | 
					    PROP_PCONTEXT,
 | 
				
			||||||
 | 
					    PROP_STYLE_CONTEXT,
 | 
				
			||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -40,6 +41,9 @@ typedef struct _EekRendererPrivate
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    PangoContext *pcontext;
 | 
					    PangoContext *pcontext;
 | 
				
			||||||
 | 
					    GtkCssProvider *css_provider;
 | 
				
			||||||
 | 
					    GtkStyleContext *scontext;
 | 
				
			||||||
 | 
					    GtkStyleContext *key_context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekColor default_foreground_color;
 | 
					    EekColor default_foreground_color;
 | 
				
			||||||
    EekColor default_background_color;
 | 
					    EekColor default_background_color;
 | 
				
			||||||
@ -60,7 +64,6 @@ typedef struct _EekRendererPrivate
 | 
				
			|||||||
    cairo_surface_t *keyboard_surface;
 | 
					    cairo_surface_t *keyboard_surface;
 | 
				
			||||||
    gulong symbol_index_changed_handler;
 | 
					    gulong symbol_index_changed_handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekTheme *theme;
 | 
					 | 
				
			||||||
} EekRendererPrivate;
 | 
					} EekRendererPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE_WITH_PRIVATE (EekRenderer, eek_renderer, G_TYPE_OBJECT)
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekRenderer, eek_renderer, G_TYPE_OBJECT)
 | 
				
			||||||
@ -145,14 +148,9 @@ render_keyboard_surface (EekRenderer *renderer)
 | 
				
			|||||||
    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    CreateKeyboardSurfaceCallbackData data;
 | 
					    CreateKeyboardSurfaceCallbackData data;
 | 
				
			||||||
    EekColor foreground, background;
 | 
					    EekColor foreground;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_renderer_get_foreground_color (renderer,
 | 
					    eek_renderer_get_foreground_color (renderer, priv->scontext, &foreground);
 | 
				
			||||||
                                       EEK_ELEMENT(priv->keyboard),
 | 
					 | 
				
			||||||
                                       &foreground);
 | 
					 | 
				
			||||||
    eek_renderer_get_background_color (renderer,
 | 
					 | 
				
			||||||
                                       EEK_ELEMENT(priv->keyboard),
 | 
					 | 
				
			||||||
                                       &background);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
 | 
					    eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -164,12 +162,14 @@ render_keyboard_surface (EekRenderer *renderer)
 | 
				
			|||||||
    cairo_translate (data.cr, bounds.x, bounds.y);
 | 
					    cairo_translate (data.cr, bounds.x, bounds.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* blank background */
 | 
					    /* blank background */
 | 
				
			||||||
    cairo_set_source_rgba (data.cr,
 | 
					    cairo_save (data.cr);
 | 
				
			||||||
                           background.red,
 | 
					    cairo_scale (data.cr, priv->scale, priv->scale);
 | 
				
			||||||
                           background.green,
 | 
					    gtk_render_background (priv->scontext,
 | 
				
			||||||
                           background.blue,
 | 
					                           data.cr,
 | 
				
			||||||
                           background.alpha);
 | 
					                           -bounds.x, -bounds.y,
 | 
				
			||||||
    cairo_paint (data.cr);
 | 
					                           (bounds.x * 2) + bounds.width,
 | 
				
			||||||
 | 
					                           (bounds.y * 2) + bounds.height);
 | 
				
			||||||
 | 
					    cairo_restore (data.cr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cairo_set_source_rgba (data.cr,
 | 
					    cairo_set_source_rgba (data.cr,
 | 
				
			||||||
                           foreground.red,
 | 
					                           foreground.red,
 | 
				
			||||||
@ -196,7 +196,6 @@ render_key_outline (EekRenderer *renderer,
 | 
				
			|||||||
    EekOutline *outline;
 | 
					    EekOutline *outline;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    guint oref;
 | 
					    guint oref;
 | 
				
			||||||
    EekThemeNode *theme_node;
 | 
					 | 
				
			||||||
    EekColor foreground, background, gradient_start, gradient_end, border_color;
 | 
					    EekColor foreground, background, gradient_start, gradient_end, border_color;
 | 
				
			||||||
    EekGradientType gradient_type;
 | 
					    EekGradientType gradient_type;
 | 
				
			||||||
    gint border_width;
 | 
					    gint border_width;
 | 
				
			||||||
@ -207,119 +206,17 @@ render_key_outline (EekRenderer *renderer,
 | 
				
			|||||||
    if (outline == NULL)
 | 
					    if (outline == NULL)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_node = g_object_get_data (G_OBJECT(key),
 | 
					 | 
				
			||||||
                                    active ?
 | 
					 | 
				
			||||||
                                    "theme-node-pressed" :
 | 
					 | 
				
			||||||
                                    "theme-node");
 | 
					 | 
				
			||||||
    if (theme_node) {
 | 
					 | 
				
			||||||
        eek_theme_node_get_foreground_color (theme_node, &foreground);
 | 
					 | 
				
			||||||
        eek_theme_node_get_background_color (theme_node, &background);
 | 
					 | 
				
			||||||
        eek_theme_node_get_background_gradient (theme_node,
 | 
					 | 
				
			||||||
                                                &gradient_type,
 | 
					 | 
				
			||||||
                                                &gradient_start,
 | 
					 | 
				
			||||||
                                                &gradient_end);
 | 
					 | 
				
			||||||
        border_width = eek_theme_node_get_border_width (theme_node,
 | 
					 | 
				
			||||||
                                                        EEK_SIDE_TOP);
 | 
					 | 
				
			||||||
        border_radius = eek_theme_node_get_border_radius (theme_node,
 | 
					 | 
				
			||||||
                                                          EEK_CORNER_TOPLEFT);
 | 
					 | 
				
			||||||
        eek_theme_node_get_border_color (theme_node, EEK_SIDE_TOP,
 | 
					 | 
				
			||||||
                                         &border_color);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        foreground = priv->default_foreground_color;
 | 
					 | 
				
			||||||
        background = priv->default_background_color;
 | 
					 | 
				
			||||||
        gradient_type = EEK_GRADIENT_NONE;
 | 
					 | 
				
			||||||
        border_width = (gint)round(priv->border_width);
 | 
					 | 
				
			||||||
        border_radius = -1;
 | 
					 | 
				
			||||||
        border_color.red = ABS(background.red - foreground.red) * 0.7;
 | 
					 | 
				
			||||||
        border_color.green = ABS(background.green - foreground.green) * 0.7;
 | 
					 | 
				
			||||||
        border_color.blue = ABS(background.blue - foreground.blue) * 0.7;
 | 
					 | 
				
			||||||
        border_color.alpha = foreground.alpha;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    eek_element_get_bounds(EEK_ELEMENT(key), &bounds);
 | 
					    eek_element_get_bounds(EEK_ELEMENT(key), &bounds);
 | 
				
			||||||
    outline = eek_outline_copy (outline);
 | 
					    gtk_style_context_set_state(priv->key_context,
 | 
				
			||||||
 | 
					        active ? GTK_STATE_FLAG_ACTIVE : GTK_STATE_FLAG_NORMAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cairo_translate (cr, border_width, border_width);
 | 
					    gtk_render_background (priv->key_context,
 | 
				
			||||||
 | 
					                           cr,
 | 
				
			||||||
 | 
					                           0, 0,
 | 
				
			||||||
 | 
					                           bounds.width * priv->scale,
 | 
				
			||||||
 | 
					                           bounds.height * priv->scale);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gradient_type != EEK_GRADIENT_NONE) {
 | 
					    gtk_style_context_set_state(priv->key_context, GTK_STATE_FLAG_NORMAL);
 | 
				
			||||||
        cairo_pattern_t *pat;
 | 
					 | 
				
			||||||
        gdouble cx, cy;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        switch (gradient_type) {
 | 
					 | 
				
			||||||
        case EEK_GRADIENT_VERTICAL:
 | 
					 | 
				
			||||||
            pat = cairo_pattern_create_linear (0.0,
 | 
					 | 
				
			||||||
                                               0.0,
 | 
					 | 
				
			||||||
                                               0.0,
 | 
					 | 
				
			||||||
                                               bounds.height);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case EEK_GRADIENT_HORIZONTAL:
 | 
					 | 
				
			||||||
            pat = cairo_pattern_create_linear (0.0,
 | 
					 | 
				
			||||||
                                               0.0,
 | 
					 | 
				
			||||||
                                               bounds.width,
 | 
					 | 
				
			||||||
                                               0.0);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case EEK_GRADIENT_RADIAL:
 | 
					 | 
				
			||||||
            cx = bounds.width / 2;
 | 
					 | 
				
			||||||
            cy = bounds.height / 2;
 | 
					 | 
				
			||||||
            pat = cairo_pattern_create_radial (cx,
 | 
					 | 
				
			||||||
                                               cy,
 | 
					 | 
				
			||||||
                                               0,
 | 
					 | 
				
			||||||
                                               cx,
 | 
					 | 
				
			||||||
                                               cy,
 | 
					 | 
				
			||||||
                                               MIN(cx, cy));
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            g_assert_not_reached ();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        cairo_pattern_add_color_stop_rgba (pat,
 | 
					 | 
				
			||||||
                                           1,
 | 
					 | 
				
			||||||
                                           gradient_start.red * 0.5,
 | 
					 | 
				
			||||||
                                           gradient_start.green * 0.5,
 | 
					 | 
				
			||||||
                                           gradient_start.blue * 0.5,
 | 
					 | 
				
			||||||
                                           gradient_start.alpha);
 | 
					 | 
				
			||||||
        cairo_pattern_add_color_stop_rgba (pat,
 | 
					 | 
				
			||||||
                                           0,
 | 
					 | 
				
			||||||
                                           gradient_end.red,
 | 
					 | 
				
			||||||
                                           gradient_end.green,
 | 
					 | 
				
			||||||
                                           gradient_end.blue,
 | 
					 | 
				
			||||||
                                           gradient_end.alpha);
 | 
					 | 
				
			||||||
        cairo_set_source (cr, pat);
 | 
					 | 
				
			||||||
        cairo_pattern_destroy (pat);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        cairo_set_source_rgba (cr,
 | 
					 | 
				
			||||||
                               background.red,
 | 
					 | 
				
			||||||
                               background.green,
 | 
					 | 
				
			||||||
                               background.blue,
 | 
					 | 
				
			||||||
                               background.alpha);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _eek_rounded_polygon (cr,
 | 
					 | 
				
			||||||
                          border_radius >= 0 ? border_radius : outline->corner_radius,
 | 
					 | 
				
			||||||
                          outline->points,
 | 
					 | 
				
			||||||
                          outline->num_points);
 | 
					 | 
				
			||||||
    cairo_fill (cr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* paint the border */
 | 
					 | 
				
			||||||
    cairo_set_line_width (cr, border_width);
 | 
					 | 
				
			||||||
    cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cairo_set_source_rgba (cr,
 | 
					 | 
				
			||||||
                           border_color.red,
 | 
					 | 
				
			||||||
                           border_color.green,
 | 
					 | 
				
			||||||
                           border_color.blue,
 | 
					 | 
				
			||||||
                           border_color.alpha);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _eek_rounded_polygon (cr,
 | 
					 | 
				
			||||||
                          border_radius >= 0 ? border_radius : outline->corner_radius,
 | 
					 | 
				
			||||||
                          outline->points,
 | 
					 | 
				
			||||||
                          outline->num_points);
 | 
					 | 
				
			||||||
    cairo_stroke (cr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cairo_translate (cr, -border_width, -border_width);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    eek_outline_free (outline);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -386,7 +283,7 @@ render_key (EekRenderer *self,
 | 
				
			|||||||
    cairo_set_source_surface (cr, outline_surface, 0.0, 0.0);
 | 
					    cairo_set_source_surface (cr, outline_surface, 0.0, 0.0);
 | 
				
			||||||
    cairo_paint (cr);
 | 
					    cairo_paint (cr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_renderer_get_foreground_color (self, EEK_ELEMENT(key), &foreground);
 | 
					    eek_renderer_get_foreground_color (self, priv->key_context, &foreground);
 | 
				
			||||||
    /* render icon (if any) */
 | 
					    /* render icon (if any) */
 | 
				
			||||||
    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
					    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
				
			||||||
    if (!symbol)
 | 
					    if (!symbol)
 | 
				
			||||||
@ -512,13 +409,8 @@ eek_renderer_real_render_key_label (EekRenderer *self,
 | 
				
			|||||||
    if (!priv->font) {
 | 
					    if (!priv->font) {
 | 
				
			||||||
        const PangoFontDescription *base_font;
 | 
					        const PangoFontDescription *base_font;
 | 
				
			||||||
        gdouble ascii_size, size;
 | 
					        gdouble ascii_size, size;
 | 
				
			||||||
        EekThemeNode *theme_node;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        theme_node = g_object_get_data (G_OBJECT(key), "theme-node");
 | 
					        base_font = pango_context_get_font_description (priv->pcontext);
 | 
				
			||||||
        if (theme_node)
 | 
					 | 
				
			||||||
            base_font = eek_theme_node_get_font (theme_node);
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            base_font = pango_context_get_font_description (priv->pcontext);
 | 
					 | 
				
			||||||
        // FIXME: Base font size on the same size unit used for button sizing,
 | 
					        // FIXME: Base font size on the same size unit used for button sizing,
 | 
				
			||||||
        // and make the default about 1/3 of the current row height
 | 
					        // and make the default about 1/3 of the current row height
 | 
				
			||||||
        ascii_size = 30000.0;
 | 
					        ascii_size = 30000.0;
 | 
				
			||||||
@ -652,6 +544,10 @@ eek_renderer_set_property (GObject      *object,
 | 
				
			|||||||
        priv->pcontext = g_value_get_object (value);
 | 
					        priv->pcontext = g_value_get_object (value);
 | 
				
			||||||
        g_object_ref (priv->pcontext);
 | 
					        g_object_ref (priv->pcontext);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					    case PROP_STYLE_CONTEXT:
 | 
				
			||||||
 | 
					        priv->scontext = g_value_get_object (value);
 | 
				
			||||||
 | 
					        g_object_ref (priv->scontext);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
@ -749,6 +645,15 @@ eek_renderer_class_init (EekRendererClass *klass)
 | 
				
			|||||||
    g_object_class_install_property (gobject_class,
 | 
					    g_object_class_install_property (gobject_class,
 | 
				
			||||||
                                     PROP_PCONTEXT,
 | 
					                                     PROP_PCONTEXT,
 | 
				
			||||||
                                     pspec);
 | 
					                                     pspec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pspec = g_param_spec_object ("style-context",
 | 
				
			||||||
 | 
					                                 "GTK Style Context",
 | 
				
			||||||
 | 
					                                 "GTK Style Context",
 | 
				
			||||||
 | 
					                                 GTK_TYPE_STYLE_CONTEXT,
 | 
				
			||||||
 | 
					                                 G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
 | 
				
			||||||
 | 
					    g_object_class_install_property (gobject_class,
 | 
				
			||||||
 | 
					                                     PROP_STYLE_CONTEXT,
 | 
				
			||||||
 | 
					                                     pspec);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -786,6 +691,24 @@ eek_renderer_init (EekRenderer *self)
 | 
				
			|||||||
                                         g_str_equal,
 | 
					                                         g_str_equal,
 | 
				
			||||||
                                         g_free,
 | 
					                                         g_free,
 | 
				
			||||||
                                         (GDestroyNotify)cairo_surface_destroy);
 | 
					                                         (GDestroyNotify)cairo_surface_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Create a default CSS provider and load a style sheet */
 | 
				
			||||||
 | 
					    priv->css_provider = gtk_css_provider_new ();
 | 
				
			||||||
 | 
					    gtk_css_provider_load_from_resource (priv->css_provider,
 | 
				
			||||||
 | 
					        "/sm/puri/squeekboard/style.css");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Create a style context for keys */
 | 
				
			||||||
 | 
					    priv->key_context = gtk_style_context_new ();
 | 
				
			||||||
 | 
					    gtk_style_context_add_class (priv->key_context, "key");
 | 
				
			||||||
 | 
					    gtk_style_context_add_provider (priv->key_context,
 | 
				
			||||||
 | 
					        GTK_STYLE_PROVIDER(priv->css_provider),
 | 
				
			||||||
 | 
					        GTK_STYLE_PROVIDER_PRIORITY_USER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_autoptr (GtkWidgetPath) path = NULL;
 | 
				
			||||||
 | 
					    path = gtk_widget_path_new ();
 | 
				
			||||||
 | 
					    gtk_widget_path_append_type (path, GTK_TYPE_BUTTON);
 | 
				
			||||||
 | 
					    gtk_style_context_set_path (priv->key_context, path);
 | 
				
			||||||
 | 
					    gtk_style_context_set_state (priv->key_context, GTK_STATE_FLAG_NORMAL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -817,11 +740,13 @@ on_symbol_index_changed (EekKeyboard *keyboard,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EekRenderer *
 | 
					EekRenderer *
 | 
				
			||||||
eek_renderer_new (EekKeyboard  *keyboard,
 | 
					eek_renderer_new (EekKeyboard  *keyboard,
 | 
				
			||||||
                  PangoContext *pcontext)
 | 
					                  PangoContext *pcontext,
 | 
				
			||||||
 | 
					                  GtkStyleContext *scontext)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return g_object_new (EEK_TYPE_RENDERER,
 | 
					    return g_object_new (EEK_TYPE_RENDERER,
 | 
				
			||||||
                         "keyboard", keyboard,
 | 
					                         "keyboard", keyboard,
 | 
				
			||||||
                         "pango-context", pcontext,
 | 
					                         "pango-context", pcontext,
 | 
				
			||||||
 | 
					                         "style-context", scontext,
 | 
				
			||||||
                         NULL);
 | 
					                         NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1065,64 +990,21 @@ eek_renderer_set_default_background_color (EekRenderer    *renderer,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
eek_renderer_get_foreground_color (EekRenderer *renderer,
 | 
					eek_renderer_get_foreground_color (EekRenderer *renderer,
 | 
				
			||||||
                                   EekElement  *element,
 | 
					                                   GtkStyleContext *context,
 | 
				
			||||||
                                   EekColor    *color)
 | 
					                                   EekColor    *color)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekThemeNode *theme_node;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
    g_return_if_fail (color);
 | 
					    g_return_if_fail (color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					    GtkStateFlags flags = GTK_STATE_FLAG_NORMAL;
 | 
				
			||||||
 | 
					    GdkRGBA gcolor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
					    gtk_style_context_get_color (context, flags, &gcolor);
 | 
				
			||||||
    if (theme_node)
 | 
					    color->red = gcolor.red;
 | 
				
			||||||
        eek_theme_node_get_foreground_color (theme_node, color);
 | 
					    color->green = gcolor.green;
 | 
				
			||||||
    else
 | 
					    color->blue = gcolor.blue;
 | 
				
			||||||
        memcpy (color, &priv->default_foreground_color,
 | 
					    color->alpha = gcolor.alpha;
 | 
				
			||||||
                sizeof(EekColor));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
eek_renderer_get_background_color (EekRenderer *renderer,
 | 
					 | 
				
			||||||
                                   EekElement  *element,
 | 
					 | 
				
			||||||
                                   EekColor    *color)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    EekThemeNode *theme_node;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					 | 
				
			||||||
    g_return_if_fail (color);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
					 | 
				
			||||||
    if (theme_node)
 | 
					 | 
				
			||||||
        eek_theme_node_get_background_color (theme_node, color);
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        memcpy (color, &priv->default_background_color,
 | 
					 | 
				
			||||||
                sizeof(EekColor));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
eek_renderer_get_background_gradient (EekRenderer     *renderer,
 | 
					 | 
				
			||||||
                                      EekElement      *element,
 | 
					 | 
				
			||||||
                                      EekGradientType *type,
 | 
					 | 
				
			||||||
                                      EekColor        *start,
 | 
					 | 
				
			||||||
                                      EekColor        *end)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    EekThemeNode *theme_node;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
					 | 
				
			||||||
    g_return_if_fail (type);
 | 
					 | 
				
			||||||
    g_return_if_fail (start);
 | 
					 | 
				
			||||||
    g_return_if_fail (end);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
					 | 
				
			||||||
    if (theme_node)
 | 
					 | 
				
			||||||
        eek_theme_node_get_background_gradient (theme_node, type, start, end);
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        *type = EEK_GRADIENT_NONE;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _FindKeyByPositionCallbackData {
 | 
					struct _FindKeyByPositionCallbackData {
 | 
				
			||||||
@ -1253,117 +1135,3 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
 | 
				
			|||||||
                        &data);
 | 
					                        &data);
 | 
				
			||||||
    return data.key;
 | 
					    return data.key;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _CreateThemeNodeData {
 | 
					 | 
				
			||||||
    EekThemeContext *context;
 | 
					 | 
				
			||||||
    EekThemeNode *parent;
 | 
					 | 
				
			||||||
    EekRenderer *renderer;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
typedef struct _CreateThemeNodeData CreateThemeNodeData;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
create_theme_node_key_callback (EekElement *element,
 | 
					 | 
				
			||||||
                                gpointer    user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    CreateThemeNodeData *data = user_data;
 | 
					 | 
				
			||||||
    EekThemeNode *theme_node;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    theme_node = eek_theme_node_new (data->context,
 | 
					 | 
				
			||||||
                                     data->parent,
 | 
					 | 
				
			||||||
                                     priv->theme,
 | 
					 | 
				
			||||||
                                     EEK_TYPE_KEY,
 | 
					 | 
				
			||||||
                                     eek_element_get_name (element),
 | 
					 | 
				
			||||||
                                     "key",
 | 
					 | 
				
			||||||
                                     NULL,
 | 
					 | 
				
			||||||
                                     NULL);
 | 
					 | 
				
			||||||
    g_object_set_data_full (G_OBJECT(element),
 | 
					 | 
				
			||||||
                            "theme-node",
 | 
					 | 
				
			||||||
                            theme_node,
 | 
					 | 
				
			||||||
                            (GDestroyNotify)g_object_unref);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    theme_node = eek_theme_node_new (data->context,
 | 
					 | 
				
			||||||
                                     data->parent,
 | 
					 | 
				
			||||||
                                     priv->theme,
 | 
					 | 
				
			||||||
                                     EEK_TYPE_KEY,
 | 
					 | 
				
			||||||
                                     eek_element_get_name (element),
 | 
					 | 
				
			||||||
                                     "key",
 | 
					 | 
				
			||||||
                                     "active",
 | 
					 | 
				
			||||||
                                     NULL);
 | 
					 | 
				
			||||||
    g_object_set_data_full (G_OBJECT(element),
 | 
					 | 
				
			||||||
                            "theme-node-pressed",
 | 
					 | 
				
			||||||
                            theme_node,
 | 
					 | 
				
			||||||
                            (GDestroyNotify)g_object_unref);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
create_theme_node_section_callback (EekElement *element,
 | 
					 | 
				
			||||||
                                    gpointer    user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    CreateThemeNodeData *data = user_data;
 | 
					 | 
				
			||||||
    EekThemeNode *theme_node, *parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    theme_node = eek_theme_node_new (data->context,
 | 
					 | 
				
			||||||
                                     data->parent,
 | 
					 | 
				
			||||||
                                     priv->theme,
 | 
					 | 
				
			||||||
                                     EEK_TYPE_SECTION,
 | 
					 | 
				
			||||||
                                     eek_element_get_name (element),
 | 
					 | 
				
			||||||
                                     "section",
 | 
					 | 
				
			||||||
                                     NULL,
 | 
					 | 
				
			||||||
                                     NULL);
 | 
					 | 
				
			||||||
    g_object_set_data_full (G_OBJECT(element),
 | 
					 | 
				
			||||||
                            "theme-node",
 | 
					 | 
				
			||||||
                            theme_node,
 | 
					 | 
				
			||||||
                            (GDestroyNotify)g_object_unref);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parent = data->parent;
 | 
					 | 
				
			||||||
    data->parent = theme_node;
 | 
					 | 
				
			||||||
    eek_container_foreach_child (EEK_CONTAINER(element),
 | 
					 | 
				
			||||||
                                 create_theme_node_key_callback,
 | 
					 | 
				
			||||||
                                 data);
 | 
					 | 
				
			||||||
    data->parent = parent;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
eek_renderer_set_theme (EekRenderer *renderer,
 | 
					 | 
				
			||||||
                        EekTheme    *theme)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    EekThemeContext *theme_context;
 | 
					 | 
				
			||||||
    EekThemeNode *theme_node;
 | 
					 | 
				
			||||||
    CreateThemeNodeData data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_THEME(theme));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (priv->keyboard);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (priv->theme)
 | 
					 | 
				
			||||||
        g_object_unref (priv->theme);
 | 
					 | 
				
			||||||
    priv->theme = g_object_ref (theme);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    theme_context = eek_theme_context_new ();
 | 
					 | 
				
			||||||
    theme_node = eek_theme_node_new (theme_context,
 | 
					 | 
				
			||||||
                                     NULL,
 | 
					 | 
				
			||||||
                                     priv->theme,
 | 
					 | 
				
			||||||
                                     EEK_TYPE_KEYBOARD,
 | 
					 | 
				
			||||||
                                     "keyboard",
 | 
					 | 
				
			||||||
                                     "keyboard",
 | 
					 | 
				
			||||||
                                     NULL,
 | 
					 | 
				
			||||||
                                     NULL);
 | 
					 | 
				
			||||||
    g_object_set_data_full (G_OBJECT(priv->keyboard),
 | 
					 | 
				
			||||||
                            "theme-node",
 | 
					 | 
				
			||||||
                            theme_node,
 | 
					 | 
				
			||||||
                            (GDestroyNotify)g_object_unref);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    data.context = theme_context;
 | 
					 | 
				
			||||||
    data.parent = theme_node;
 | 
					 | 
				
			||||||
    data.renderer = renderer;
 | 
					 | 
				
			||||||
    eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
 | 
					 | 
				
			||||||
                                 create_theme_node_section_callback,
 | 
					 | 
				
			||||||
                                 &data);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -25,8 +25,6 @@
 | 
				
			|||||||
#include "eek-keyboard.h"
 | 
					#include "eek-keyboard.h"
 | 
				
			||||||
#include "eek-keysym.h"
 | 
					#include "eek-keysym.h"
 | 
				
			||||||
#include "eek-types.h"
 | 
					#include "eek-types.h"
 | 
				
			||||||
#include "eek-theme.h"
 | 
					 | 
				
			||||||
#include "eek-theme-context.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -64,7 +62,8 @@ struct _EekRendererClass
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GType            eek_renderer_get_type         (void) G_GNUC_CONST;
 | 
					GType            eek_renderer_get_type         (void) G_GNUC_CONST;
 | 
				
			||||||
EekRenderer     *eek_renderer_new              (EekKeyboard     *keyboard,
 | 
					EekRenderer     *eek_renderer_new              (EekKeyboard     *keyboard,
 | 
				
			||||||
                                                PangoContext    *pcontext);
 | 
					                                                PangoContext    *pcontext,
 | 
				
			||||||
 | 
					                                                GtkStyleContext *scontext);
 | 
				
			||||||
void             eek_renderer_set_allocation_size
 | 
					void             eek_renderer_set_allocation_size
 | 
				
			||||||
                                               (EekRenderer     *renderer,
 | 
					                                               (EekRenderer     *renderer,
 | 
				
			||||||
                                                gdouble          width,
 | 
					                                                gdouble          width,
 | 
				
			||||||
@ -116,18 +115,8 @@ void             eek_renderer_set_default_background_color
 | 
				
			|||||||
                                                const EekColor  *color);
 | 
					                                                const EekColor  *color);
 | 
				
			||||||
void             eek_renderer_get_foreground_color
 | 
					void             eek_renderer_get_foreground_color
 | 
				
			||||||
                                               (EekRenderer     *renderer,
 | 
					                                               (EekRenderer     *renderer,
 | 
				
			||||||
                                                EekElement      *element,
 | 
					                                                GtkStyleContext *context,
 | 
				
			||||||
                                                EekColor        *color);
 | 
					                                                EekColor        *color);
 | 
				
			||||||
void             eek_renderer_get_background_color
 | 
					 | 
				
			||||||
                                               (EekRenderer     *renderer,
 | 
					 | 
				
			||||||
                                                EekElement      *element,
 | 
					 | 
				
			||||||
                                                EekColor        *color);
 | 
					 | 
				
			||||||
void             eek_renderer_get_background_gradient
 | 
					 | 
				
			||||||
                                               (EekRenderer     *renderer,
 | 
					 | 
				
			||||||
                                                EekElement      *element,
 | 
					 | 
				
			||||||
                                                EekGradientType *type,
 | 
					 | 
				
			||||||
                                                EekColor        *start,
 | 
					 | 
				
			||||||
                                                EekColor        *end);
 | 
					 | 
				
			||||||
void             eek_renderer_set_border_width (EekRenderer     *renderer,
 | 
					void             eek_renderer_set_border_width (EekRenderer     *renderer,
 | 
				
			||||||
                                                gdouble          border_width);
 | 
					                                                gdouble          border_width);
 | 
				
			||||||
EekKey          *eek_renderer_find_key_by_position
 | 
					EekKey          *eek_renderer_find_key_by_position
 | 
				
			||||||
@ -141,8 +130,5 @@ void             eek_renderer_apply_transformation_for_key
 | 
				
			|||||||
                                                gdouble          scale,
 | 
					                                                gdouble          scale,
 | 
				
			||||||
                                                gboolean         rotate);
 | 
					                                                gboolean         rotate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void             eek_renderer_set_theme        (EekRenderer     *renderer,
 | 
					 | 
				
			||||||
                                                EekTheme        *theme);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
G_END_DECLS
 | 
					G_END_DECLS
 | 
				
			||||||
#endif  /* EEK_RENDERER_H */
 | 
					#endif  /* EEK_RENDERER_H */
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user