summaryrefslogtreecommitdiffstats
path: root/gtk/src/ghbcellrenderertext.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/src/ghbcellrenderertext.c')
-rw-r--r--gtk/src/ghbcellrenderertext.c168
1 files changed, 96 insertions, 72 deletions
diff --git a/gtk/src/ghbcellrenderertext.c b/gtk/src/ghbcellrenderertext.c
index eba5e28c2..91709a65d 100644
--- a/gtk/src/ghbcellrenderertext.c
+++ b/gtk/src/ghbcellrenderertext.c
@@ -61,12 +61,21 @@ static void ghb_cell_renderer_text_get_size (GtkCellRenderer *cell,
gint *y_offset,
gint *width,
gint *height);
+#if GTK_CHECK_VERSION(3, 90, 0)
+static void ghb_cell_renderer_text_snapshot (GtkCellRenderer *cell,
+ GtkSnapshot *snapshot,
+ GtkWidget *widget,
+ MyGdkRectangle *background_area,
+ MyGdkRectangle *cell_area,
+ GtkCellRendererState flags);
+#else
static void ghb_cell_renderer_text_render (GtkCellRenderer *cell,
cairo_t *cr,
GtkWidget *widget,
MyGdkRectangle *background_area,
MyGdkRectangle *cell_area,
GtkCellRendererState flags);
+#endif
static GtkCellEditable *ghb_cell_renderer_text_start_editing (GtkCellRenderer *cell,
GdkEvent *event,
GtkWidget *widget,
@@ -95,8 +104,8 @@ enum {
/* Style args */
PROP_BACKGROUND,
PROP_FOREGROUND,
- PROP_BACKGROUND_GDK,
- PROP_FOREGROUND_GDK,
+ PROP_BACKGROUND_RGBA,
+ PROP_FOREGROUND_RGBA,
PROP_FONT,
PROP_FONT_DESC,
PROP_FAMILY,
@@ -201,7 +210,11 @@ ghb_cell_renderer_text_class_init (GhbCellRendererTextClass *class)
object_class->set_property = ghb_cell_renderer_text_set_property;
cell_class->get_size = ghb_cell_renderer_text_get_size;
+#if GTK_CHECK_VERSION(3, 90, 0)
+ cell_class->snapshot = ghb_cell_renderer_text_snapshot;
+#else
cell_class->render = ghb_cell_renderer_text_render;
+#endif
cell_class->start_editing = ghb_cell_renderer_text_start_editing;
g_object_class_install_property (object_class,
@@ -246,8 +259,8 @@ ghb_cell_renderer_text_class_init (GhbCellRendererTextClass *class)
GTK_PARAM_WRITABLE));
g_object_class_install_property (object_class,
- PROP_BACKGROUND_GDK,
- g_param_spec_boxed ("background-gdk",
+ PROP_BACKGROUND_RGBA,
+ g_param_spec_boxed ("background-rgba",
P_("Background color"),
P_("Background color as a GdkColor"),
GDK_TYPE_RGBA,
@@ -262,8 +275,8 @@ ghb_cell_renderer_text_class_init (GhbCellRendererTextClass *class)
GTK_PARAM_WRITABLE));
g_object_class_install_property (object_class,
- PROP_FOREGROUND_GDK,
- g_param_spec_boxed ("foreground-gdk",
+ PROP_FOREGROUND_RGBA,
+ g_param_spec_boxed ("foreground-rgba",
P_("Foreground color"),
P_("Foreground color as a GdkColor"),
GDK_TYPE_RGBA,
@@ -680,27 +693,15 @@ ghb_cell_renderer_text_get_property (GObject *object,
g_value_set_boolean (value, priv->single_paragraph);
break;
- case PROP_BACKGROUND_GDK:
+ case PROP_BACKGROUND_RGBA:
{
- GdkColor color;
-
- color.red = celltext->background.red;
- color.green = celltext->background.green;
- color.blue = celltext->background.blue;
-
- g_value_set_boxed (value, &color);
+ g_value_set_boxed(value, &celltext->background);
}
break;
- case PROP_FOREGROUND_GDK:
+ case PROP_FOREGROUND_RGBA:
{
- GdkColor color;
-
- color.red = celltext->foreground.red;
- color.green = celltext->foreground.green;
- color.blue = celltext->foreground.blue;
-
- g_value_set_boxed (value, &color);
+ g_value_set_boxed(value, &celltext->foreground);
}
break;
@@ -859,9 +860,7 @@ set_bg_color (GhbCellRendererText *celltext,
g_object_notify (G_OBJECT (celltext), "background-set");
}
- celltext->background.red = rgba->red;
- celltext->background.green = rgba->green;
- celltext->background.blue = rgba->blue;
+ celltext->background = *rgba;
}
else
{
@@ -886,9 +885,7 @@ set_fg_color (GhbCellRendererText *celltext,
g_object_notify (G_OBJECT (celltext), "foreground-set");
}
- celltext->foreground.red = rgba->red;
- celltext->foreground.green = rgba->green;
- celltext->foreground.blue = rgba->blue;
+ celltext->foreground = *rgba;
}
else
{
@@ -1108,7 +1105,7 @@ ghb_cell_renderer_text_set_property (GObject *object,
else
g_warning ("Don't know color `%s'", g_value_get_string(value));
- g_object_notify (object, "background-gdk");
+ g_object_notify (object, "background-rgba");
}
break;
@@ -1123,16 +1120,16 @@ ghb_cell_renderer_text_set_property (GObject *object,
else
g_warning ("Don't know color `%s'", g_value_get_string (value));
- g_object_notify (object, "foreground-gdk");
+ g_object_notify (object, "foreground-rgba");
}
break;
- case PROP_BACKGROUND_GDK:
+ case PROP_BACKGROUND_RGBA:
/* This notifies the GObject itself. */
set_bg_color (celltext, g_value_get_boxed (value));
break;
- case PROP_FOREGROUND_GDK:
+ case PROP_FOREGROUND_RGBA:
/* This notifies the GObject itself. */
set_fg_color (celltext, g_value_get_boxed (value));
break;
@@ -1417,12 +1414,10 @@ get_layout (GhbCellRendererText *celltext,
if (celltext->foreground_set
&& (flags & GTK_CELL_RENDERER_SELECTED) == 0)
{
- PangoColor color;
-
- color = celltext->foreground;
-
- add_attr (attr_list,
- pango_attr_foreground_new (color.red, color.green, color.blue));
+ add_attr(attr_list,
+ pango_attr_foreground_new(celltext->foreground.red,
+ celltext->foreground.green,
+ celltext->foreground.blue));
}
if (celltext->strikethrough_set)
@@ -1623,6 +1618,68 @@ ghb_cell_renderer_text_get_size (GtkCellRenderer *cell,
x_offset, y_offset, width, height);
}
+#if GTK_CHECK_VERSION(3, 90, 0)
+static void ghb_cell_renderer_text_snapshot(
+ GtkCellRenderer *cell,
+ GtkSnapshot *snapshot,
+ GtkWidget *widget,
+ MyGdkRectangle *background_area,
+ MyGdkRectangle *cell_area,
+ GtkCellRendererState flags)
+{
+ GhbCellRendererText * celltext = (GhbCellRendererText *) cell;
+ GhbCellRendererTextPrivate * priv;
+ GtkStyleContext * context;
+ PangoLayout * layout;
+ gint x_offset = 0;
+ gint y_offset = 0;
+ gint xpad, ypad;
+ PangoRectangle rect;
+
+ priv = GHB_CELL_RENDERER_TEXT_GET_PRIVATE (cell);
+
+ layout = get_layout (celltext, widget, TRUE, flags);
+ get_size(cell, widget, cell_area, layout, &x_offset, &y_offset, NULL, NULL);
+ context = gtk_widget_get_style_context(widget);
+
+ if (celltext->background_set && (flags & GTK_CELL_RENDERER_SELECTED) == 0)
+ {
+ gtk_snapshot_append_color(snapshot,
+ &celltext->background,
+ &GRAPHENE_RECT_INIT(
+ background_area->x, background_area->y,
+ background_area->width,
+ background_area->height),
+ "CellTextBackground");
+ }
+
+
+ gtk_cell_renderer_get_padding(cell, &xpad, &ypad);
+
+ if (priv->ellipsize_set && priv->ellipsize != PANGO_ELLIPSIZE_NONE)
+ pango_layout_set_width(layout,
+ (cell_area->width - x_offset - 2 * xpad) * PANGO_SCALE);
+ else if (priv->wrap_width == -1)
+ pango_layout_set_width(layout, -1);
+
+ pango_layout_get_pixel_extents (layout, NULL, &rect);
+ x_offset = x_offset - rect.x;
+
+ gtk_snapshot_push_clip(snapshot,
+ &GRAPHENE_RECT_INIT(
+ cell_area->x, cell_area->y,
+ cell_area->width, cell_area->height),
+ "CellTextClip");
+
+ gtk_snapshot_render_layout(snapshot, context,
+ cell_area->x + x_offset + xpad,
+ cell_area->y + y_offset + ypad, layout);
+
+ gtk_snapshot_pop(snapshot);
+
+ g_object_unref(layout);
+}
+#else
static void ghb_cell_renderer_text_render(
GtkCellRenderer *cell,
cairo_t *cr,
@@ -1700,6 +1757,7 @@ static void ghb_cell_renderer_text_render(
g_object_unref (layout);
}
+#endif
static gboolean
ghb_cell_renderer_text_keypress(
@@ -1863,40 +1921,6 @@ ghb_cell_renderer_text_start_editing (GtkCellRenderer *cell,
gtk_editable_select_region (GTK_EDITABLE (priv->entry), 0, -1);
-#if 0
- GtkRequisition min_size, size;
-
- gtk_widget_get_preferred_size(priv->entry, &min_size, &size);
- if (min_size.height > size.height)
- size.height = min_size.height;
- if (min_size.width > size.width)
- size.width = min_size.width;
- if (size.height < cell_area->height)
- {
- GtkBorder *style_border;
- GtkBorder border;
-
- gtk_widget_style_get (priv->entry,
- "inner-border", &style_border,
- NULL);
-
- if (style_border)
- {
- border = *style_border;
- g_boxed_free (GTK_TYPE_BORDER, style_border);
- }
- else
- {
- /* Since boxed style properties can't have default values ... */
- border.left = 2;
- border.right = 2;
- }
-
- border.top = (cell_area->height - size.height) / 2;
- border.bottom = (cell_area->height - size.height) / 2;
- gtk_entry_set_inner_border (GTK_ENTRY (priv->entry), &border);
- }
-#endif
priv->in_entry_menu = FALSE;
if (priv->entry_menu_popdown_timeout)
{