*/
#include <stdlib.h>
+#include <gtk/gtk.h> /* To define GTK_CHECK_VERSION */
#include "cellrenderericon.h"
#include "intl.h"
static void gqv_cell_renderer_icon_finalize(GObject *object);
static void gqv_cell_renderer_icon_get_size(GtkCellRenderer *cell,
GtkWidget *widget,
- GdkRectangle *rectangle,
+ const GdkRectangle *rectangle,
gint *x_offset,
gint *y_offset,
gint *width,
gint *height);
+#if GTK_CHECK_VERSION(3,0,0)
+static void gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
+ cairo_t *cr,
+ GtkWidget *widget,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
+#else
static void gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
GdkWindow *window,
GtkWidget *widget,
GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags);
+#endif
-static gint gqv_cell_renderer_icon_activate (GtkCellRenderer *cell,
- GdkEvent *event,
- GtkWidget *widget,
- const gchar *path,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
- GtkCellRendererState flags);
+
+static gboolean gqv_cell_renderer_icon_activate(GtkCellRenderer *cell,
+ GdkEvent *event,
+ GtkWidget *widget,
+ const gchar *path,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
enum {
TOGGLED,
static void
gqv_cell_renderer_icon_init(GQvCellRendererIcon *cellicon)
{
- GTK_CELL_RENDERER(cellicon)->mode = GTK_CELL_RENDERER_MODE_ACTIVATABLE;
- GTK_CELL_RENDERER(cellicon)->xpad = 2;
- GTK_CELL_RENDERER(cellicon)->ypad = 2;
+ g_object_set(G_OBJECT(cellicon), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
+ gtk_cell_renderer_set_padding(GTK_CELL_RENDERER(cellicon), 2, 2);
}
static void
g_object_class_install_property(object_class,
PROP_PIXBUF,
g_param_spec_object("pixbuf",
- _("Pixbuf Object"),
- _("The pixbuf to render"),
+ "Pixbuf Object",
+ "The pixbuf to render",
GDK_TYPE_PIXBUF,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_TEXT,
g_param_spec_string("text",
- _("Text"),
- _("Text to render"),
+ "Text",
+ "Text to render",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_BACKGROUND_GDK,
g_param_spec_boxed("background_gdk",
- _("Background color"),
- _("Background color as a GdkColor"),
+ "Background color",
+ "Background color as a GdkColor",
GDK_TYPE_COLOR,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_FOREGROUND_GDK,
g_param_spec_boxed("foreground_gdk",
- _("Foreground color"),
- _("Foreground color as a GdkColor"),
+ "Foreground color",
+ "Foreground color as a GdkColor",
GDK_TYPE_COLOR,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_FOCUSED,
g_param_spec_boolean("has_focus",
- _("Focus"),
- _("Draw focus indicator"),
+ "Focus",
+ "Draw focus indicator",
FALSE,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_FIXED_WIDTH,
g_param_spec_int("fixed_width",
- _("Fixed width"),
- _("Width of cell"),
+ "Fixed width",
+ "Width of cell",
-1, FIXED_ICON_SIZE_MAX,
-1,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_FIXED_HEIGHT,
g_param_spec_int("fixed_height",
- _("Fixed height"),
- _("Height of icon excluding text"),
+ "Fixed height",
+ "Height of icon excluding text",
-1, FIXED_ICON_SIZE_MAX,
-1,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_BACKGROUND_SET,
g_param_spec_boolean("background_set",
- _("Background set"),
- _("Whether this tag affects the background color"),
+ "Background set",
+ "Whether this tag affects the background color",
FALSE,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_FOREGROUND_SET,
g_param_spec_boolean("foreground_set",
- _("Foreground set"),
- _("Whether this tag affects the foreground color"),
+ "Foreground set",
+ "Whether this tag affects the foreground color",
FALSE,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_SHOW_TEXT,
g_param_spec_boolean("show_text",
- _("Show text"),
- _("Whether the text is displayed"),
+ "Show text",
+ "Whether the text is displayed",
TRUE,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_SHOW_MARKS,
g_param_spec_boolean("show_marks",
- _("Show marks"),
- _("Whether the marks are displayed"),
+ "Show marks",
+ "Whether the marks are displayed",
TRUE,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_NUM_MARKS,
g_param_spec_int("num_marks",
- _("Number of marks"),
- _("Number of marks"),
+ "Number of marks",
+ "Number of marks",
0, 32,
6,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_MARKS,
g_param_spec_uint("marks",
- _("Marks"),
- _("Marks bit array"),
+ "Marks",
+ "Marks bit array",
0, 0xffffffff,
0,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
PROP_TOGGLED,
g_param_spec_uint("toggled_mark",
- _("Toggled mark"),
- _("Toggled mark"),
+ "Toggled mark",
+ "Toggled mark",
0, 32,
0,
G_PARAM_READWRITE));
toggle_cell_signals[TOGGLED] =
- g_signal_new ("toggled",
+ g_signal_new("toggled",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GQvCellRendererIconClass, toggled),
static void
gqv_cell_renderer_icon_get_size(GtkCellRenderer *cell,
GtkWidget *widget,
- GdkRectangle *cell_area,
+ const GdkRectangle *cell_area,
gint *x_offset,
gint *y_offset,
gint *width,
GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
gint calc_width;
gint calc_height;
+ gint xpad, ypad;
+ gfloat xalign, yalign;
+
+ gtk_cell_renderer_get_padding(cell, &xpad, &ypad);
+ gtk_cell_renderer_get_alignment(cell, &xalign, &yalign);
if (cellicon->fixed_width > 0)
{
calc_width = MAX(calc_width, TOGGLE_SPACING * cellicon->num_marks);
}
- calc_width += (gint)cell->xpad * 2;
- calc_height += (gint)cell->ypad * 2;
+ calc_width += xpad * 2;
+ calc_height += ypad * 2;
if (x_offset) *x_offset = 0;
if (y_offset) *y_offset = 0;
{
if (x_offset)
{
- *x_offset = (cell->xalign * (cell_area->width - calc_width - 2 * cell->xpad));
- *x_offset = MAX(*x_offset, 0) + cell->xpad;
+ *x_offset = (xalign * (cell_area->width - calc_width - 2 * xpad));
+ *x_offset = MAX(*x_offset, 0) + xpad;
}
if (y_offset)
{
- *y_offset = (cell->yalign * (cell_area->height - calc_height - 2 * cell->ypad));
- *y_offset = MAX(*y_offset, 0) + cell->ypad;
+ *y_offset = (yalign * (cell_area->height - calc_height - 2 * ypad));
+ *y_offset = MAX(*y_offset, 0) + ypad;
}
}
if (height) *height = calc_height;
}
+#if GTK_CHECK_VERSION(3,0,0)
+static void gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
+ cairo_t *cr,
+ GtkWidget *widget,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags)
+
+{
+ GtkStyleContext *context = gtk_widget_get_style_context(widget);
+#else
static void
gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
GdkWindow *window,
GtkCellRendererState flags)
{
+ cairo_t *cr = gdk_cairo_create(window);
+#endif
GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
GdkPixbuf *pixbuf;
const gchar *text;
GdkRectangle cell_rect;
GtkStateType state;
+ gint xpad, ypad;
+
pixbuf = cellicon->pixbuf;
text = cellicon->text;
if (!pixbuf && !text) return;
+ gtk_cell_renderer_get_padding(cell, &xpad, &ypad);
+
gqv_cell_renderer_icon_get_size(cell, widget, cell_area,
&cell_rect.x, &cell_rect.y,
&cell_rect.width, &cell_rect.height);
- cell_rect.x += cell->xpad;
- cell_rect.y += cell->ypad;
- cell_rect.width -= cell->xpad * 2;
- cell_rect.height -= cell->ypad * 2;
+ cell_rect.x += xpad;
+ cell_rect.y += ypad;
+ cell_rect.width -= xpad * 2;
+ cell_rect.height -= ypad * 2;
if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED)
{
- if (GTK_WIDGET_HAS_FOCUS(widget))
+ if (gtk_widget_has_focus(widget))
state = GTK_STATE_SELECTED;
else
state = GTK_STATE_ACTIVE;
}
else
{
- if (GTK_WIDGET_STATE(widget) == GTK_STATE_INSENSITIVE)
+ if (gtk_widget_get_state(widget) == GTK_STATE_INSENSITIVE)
state = GTK_STATE_INSENSITIVE;
else
state = GTK_STATE_NORMAL;
}
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_style_context_set_state(context, state);
+#endif
+
if (pixbuf)
{
GdkRectangle pix_rect;
if (cellicon->fixed_height > 0)
{
- pix_rect.y = cell_area->y + cell->ypad + (cellicon->fixed_height - pix_rect.height) / 2;
+ pix_rect.y = cell_area->y + ypad + (cellicon->fixed_height - pix_rect.height) / 2;
}
else
{
pix_rect.y = cell_area->y + cell_rect.y;
}
- if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect) &&
- gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect))
+ if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect)
+#if !GTK_CHECK_VERSION(3,0,0)
+ && gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect)
+#endif
+ )
{
- gdk_draw_pixbuf(window,
- widget->style->black_gc,
- pixbuf,
- /* pixbuf 0, 0 is at pix_rect.x, pix_rect.y */
- draw_rect.x - pix_rect.x,
- draw_rect.y - pix_rect.y,
+ gdk_cairo_set_source_pixbuf(cr, pixbuf, pix_rect.x, pix_rect.y);
+ cairo_rectangle (cr,
draw_rect.x,
draw_rect.y,
draw_rect.width,
- draw_rect.height,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
+ draw_rect.height);
+
+ cairo_fill (cr);
}
}
PangoRectangle text_rect;
GdkRectangle pix_rect;
GdkRectangle draw_rect;
-
layout = gqv_cell_renderer_icon_get_layout(cellicon, widget, TRUE);
pango_layout_get_pixel_extents(layout, NULL, &text_rect);
pix_rect.width = text_rect.width;
pix_rect.height = text_rect.height;
- pix_rect.x = cell_area->x + cell->xpad + (cell_rect.width - text_rect.width + 1) / 2;
- pix_rect.y = cell_area->y + cell->ypad + (cell_rect.height - text_rect.height);
+ pix_rect.x = cell_area->x + xpad + (cell_rect.width - text_rect.width + 1) / 2;
+ pix_rect.y = cell_area->y + ypad + (cell_rect.height - text_rect.height);
if (cellicon->show_marks)
{
pix_rect.y -= TOGGLE_SPACING;
}
- if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect) &&
- gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect))
+ if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect)
+#if !GTK_CHECK_VERSION(3,0,0)
+ && gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect)
+#endif
+ )
{
- gtk_paint_layout(widget->style, window,
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_render_layout(context, cr, pix_rect.x - text_rect.x, pix_rect.y, layout);
+#else
+
+ gtk_paint_layout(gtk_widget_get_style(widget), window,
state, TRUE,
cell_area, widget,
"cellrenderertext",
pix_rect.x - text_rect.x, pix_rect.y,
layout);
+#endif
}
-
g_object_unref(layout);
}
pix_rect.width = TOGGLE_SPACING * cellicon->num_marks;
pix_rect.height = TOGGLE_SPACING;
- pix_rect.x = cell_area->x + cell->xpad + (cell_rect.width - pix_rect.width + 1) / 2 + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
- pix_rect.y = cell_area->y + cell->ypad + (cell_rect.height - pix_rect.height) + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
+ pix_rect.x = cell_area->x + xpad + (cell_rect.width - pix_rect.width + 1) / 2 + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
+ pix_rect.y = cell_area->y + ypad + (cell_rect.height - pix_rect.height) + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
- if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect) &&
- gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect))
+ if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect)
+#if !GTK_CHECK_VERSION(3,0,0)
+ && gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect)
+#endif
+ )
{
for (i = 0; i < cellicon->num_marks; i++)
{
- gtk_paint_check (widget->style, window,
+#if GTK_CHECK_VERSION(3,0,0)
+ state &= ~(GTK_STATE_FLAG_ACTIVE);
+
+ if ((cellicon->marks & (1 << i)))
+ state |= GTK_STATE_FLAG_ACTIVE;
+
+ cairo_save (cr);
+
+ cairo_rectangle(cr,
+ pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+ pix_rect.y,
+ TOGGLE_WIDTH, TOGGLE_WIDTH);
+ cairo_clip (cr);
+
+ gtk_style_context_save(context);
+ gtk_style_context_set_state(context, state);
+
+ gtk_style_context_add_class(context, GTK_STYLE_CLASS_CHECK);
+
+ gtk_render_check(context, cr,
+ pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+ pix_rect.y,
+ TOGGLE_WIDTH, TOGGLE_WIDTH);
+ gtk_style_context_restore(context);
+ cairo_restore(cr);
+
+#else
+ gtk_paint_check(gtk_widget_get_style(widget), window,
state, (cellicon->marks & (1 << i)) ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
cell_area, widget, "cellcheck",
pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
pix_rect.y,
TOGGLE_WIDTH, TOGGLE_WIDTH);
+#endif
}
}
}
- if (cellicon->focused && GTK_WIDGET_HAS_FOCUS(widget))
+ if (cellicon->focused && gtk_widget_has_focus(widget))
{
- gtk_paint_focus(widget->style, window,
+#if GTK_CHECK_VERSION(3,0,0)
+#else
+ gtk_paint_focus(gtk_widget_get_style(widget), window,
state,
cell_area, widget,
"cellrendererfocus",
cell_area->x, cell_area->y,
cell_area->width, cell_area->height);
+#endif
}
+#if !GTK_CHECK_VERSION(3,0,0)
+ cairo_destroy(cr);
+#endif
}
-static gint
-gqv_cell_renderer_icon_activate (GtkCellRenderer *cell,
- GdkEvent *event,
- GtkWidget *widget,
- const gchar *path,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
- GtkCellRendererState flags)
+static gboolean
+gqv_cell_renderer_icon_activate(GtkCellRenderer *cell,
+ GdkEvent *event,
+ GtkWidget *widget,
+ const gchar *path,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags)
{
GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
- GdkEventButton *bevent = &event->button;
+ GdkEventButton *bevent = &event->button;
if (cellicon->show_marks &&
event->type == GDK_BUTTON_PRESS &&
GdkRectangle rect;
GdkRectangle cell_rect;
gint i;
+ gint xpad, ypad;
+
+ gtk_cell_renderer_get_padding(cell, &xpad, &ypad);
gqv_cell_renderer_icon_get_size(cell, widget, cell_area,
&cell_rect.x, &cell_rect.y,
&cell_rect.width, &cell_rect.height);
- cell_rect.x += cell->xpad;
- cell_rect.y += cell->ypad;
- cell_rect.width -= cell->xpad * 2;
- cell_rect.height -= cell->ypad * 2;
+ cell_rect.x += xpad;
+ cell_rect.y += ypad;
+ cell_rect.width -= xpad * 2;
+ cell_rect.height -= ypad * 2;
rect.width = TOGGLE_WIDTH;
rect.height = TOGGLE_WIDTH;
- rect.y = cell_area->y + cell->ypad + (cell_rect.height - TOGGLE_SPACING) + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
+ rect.y = cell_area->y + ypad + (cell_rect.height - TOGGLE_SPACING) + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
for (i = 0; i < cellicon->num_marks; i++)
{
- rect.x = cell_area->x + cell->xpad + (cell_rect.width - TOGGLE_SPACING * cellicon->num_marks + 1) / 2 + i * TOGGLE_SPACING;
+ rect.x = cell_area->x + xpad + (cell_rect.width - TOGGLE_SPACING * cellicon->num_marks + 1) / 2 + i * TOGGLE_SPACING;
if (bevent->x >= rect.x && bevent->x < rect.x + rect.width &&
bevent->y >= rect.y && bevent->y < rect.y + rect.height)
{
cellicon->toggled_mark = i;
- g_signal_emit (cell, toggle_cell_signals[TOGGLED], 0, path);
+ g_signal_emit(cell, toggle_cell_signals[TOGGLED], 0, path);
break;
}
}
}
return FALSE;
}
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */