Bug fix: --cache-maintenance and default theme color
[geeqie.git] / src / cellrenderericon.c
index 7de28db..ed1e33a 100644 (file)
@@ -25,9 +25,6 @@
 
 #define FIXED_ICON_SIZE_MAX 512
 
-#define TOGGLE_WIDTH 13
-#define TOGGLE_SPACING 18
-
 
 static void gqv_cell_renderer_icon_get_property(GObject                *object,
                                                guint           param_id,
@@ -37,7 +34,9 @@ static void gqv_cell_renderer_icon_set_property(GObject               *object,
                                                guint           param_id,
                                                const GValue    *value,
                                                GParamSpec      *pspec);
+static void gqv_cell_renderer_icon_init_wrapper(void *, void *);
 static void gqv_cell_renderer_icon_init(GQvCellRendererIcon *celltext);
+static void gqv_cell_renderer_icon_class_init_wrapper(void *, void *);
 static void gqv_cell_renderer_icon_class_init(GQvCellRendererIconClass *class);
 static void gqv_cell_renderer_icon_finalize(GObject *object);
 #if GTK_CHECK_VERSION(3,0,0)
@@ -133,12 +132,12 @@ gqv_cell_renderer_icon_get_type(void)
                        sizeof(GQvCellRendererIconClass), /* class_size */
                        NULL,           /* base_init */
                        NULL,           /* base_finalize */
-                       (GClassInitFunc) gqv_cell_renderer_icon_class_init, /* class_init */
+                       (GClassInitFunc) gqv_cell_renderer_icon_class_init_wrapper, /* class_init */
                        NULL,           /* class_finalize */
                        NULL,           /* class_data */
                        sizeof(GQvCellRendererIcon), /* instance_size */
                        0,              /* n_preallocs */
-                       (GInstanceInitFunc) gqv_cell_renderer_icon_init, /* instance_init */
+                       (GInstanceInitFunc) gqv_cell_renderer_icon_init_wrapper, /* instance_init */
                        NULL,           /* value_table */
                        };
 
@@ -150,6 +149,12 @@ gqv_cell_renderer_icon_get_type(void)
        return cell_icon_type;
 }
 
+static void
+gqv_cell_renderer_icon_init_wrapper(void *data, void *user_data)
+{
+       gqv_cell_renderer_icon_init(data);
+}
+
 static void
 gqv_cell_renderer_icon_init(GQvCellRendererIcon *cellicon)
 {
@@ -157,6 +162,12 @@ gqv_cell_renderer_icon_init(GQvCellRendererIcon *cellicon)
        gtk_cell_renderer_set_padding(GTK_CELL_RENDERER(cellicon), 2, 2);
 }
 
+static void
+gqv_cell_renderer_icon_class_init_wrapper(void *data, void *user_data)
+{
+       gqv_cell_renderer_icon_class_init(data);
+}
+
 static void
 gqv_cell_renderer_icon_class_init(GQvCellRendererIconClass *class)
 {
@@ -683,7 +694,11 @@ gqv_cell_renderer_icon_render(GtkCellRenderer              *cell,
        GdkPixbuf *pixbuf;
        const gchar *text;
        GdkRectangle cell_rect;
+#if GTK_CHECK_VERSION(3,0,0)
+       GtkStateFlags state;
+#else
        GtkStateType state;
+#endif
        gint xpad, ypad;
 
 
@@ -712,16 +727,28 @@ gqv_cell_renderer_icon_render(GtkCellRenderer             *cell,
        if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED)
                {
                if (gtk_widget_has_focus(widget))
+#if GTK_CHECK_VERSION(3,0,0)
+                       state = GTK_STATE_FLAG_SELECTED;
+               else
+                       state = GTK_STATE_FLAG_ACTIVE;
+#else
                        state = GTK_STATE_SELECTED;
                else
                        state = GTK_STATE_ACTIVE;
+#endif
                }
        else
                {
                if (gtk_widget_get_state(widget) == GTK_STATE_INSENSITIVE)
+#if GTK_CHECK_VERSION(3,0,0)
+                       state = GTK_STATE_FLAG_INSENSITIVE;
+               else
+                       state = GTK_STATE_FLAG_NORMAL;
+#else
                        state = GTK_STATE_INSENSITIVE;
                else
                        state = GTK_STATE_NORMAL;
+#endif
                }
 
 #if GTK_CHECK_VERSION(3,0,0)
@@ -824,11 +851,17 @@ gqv_cell_renderer_icon_render(GtkCellRenderer             *cell,
                        for (i = 0; i < cellicon->num_marks; i++)
                                {
 #if GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3,14,0)
+                               state &= ~(GTK_STATE_FLAG_CHECKED);
+
+                               if ((cellicon->marks & (1 << i)))
+                                       state |= GTK_STATE_FLAG_CHECKED;
+#else
                                state &= ~(GTK_STATE_FLAG_ACTIVE);
 
                                if ((cellicon->marks & (1 << i)))
                                        state |= GTK_STATE_FLAG_ACTIVE;
-
+#endif
                                cairo_save (cr);
 
                                cairo_rectangle(cr,
@@ -842,10 +875,35 @@ gqv_cell_renderer_icon_render(GtkCellRenderer             *cell,
 
                                gtk_style_context_add_class(context, GTK_STYLE_CLASS_CHECK);
 
+                               gtk_style_context_add_class(context, "marks");
+                               GtkStyleProvider *provider;
+                               provider = (GtkStyleProvider *)gtk_css_provider_new();
+                               gtk_css_provider_load_from_data(GTK_CSS_PROVIDER(provider),
+                                               ".marks {\n"
+                                               "border-color: #808080;\n"
+                                               "border-style: solid;\n"
+                                               "border-width: 1px;\n"
+                                               "border-radius: 0px;\n"
+                                               "}\n"
+                                               ,-1, NULL);
+                               gtk_style_context_add_provider(context, provider,
+                                                       GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
                                gtk_render_check(context, cr,
                                         pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
                                         pix_rect.y,
                                         TOGGLE_WIDTH, TOGGLE_WIDTH);
+                               gtk_render_frame(context, cr,
+                                        pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+                                        pix_rect.y,
+                                        TOGGLE_WIDTH, TOGGLE_WIDTH);
+
+                               if (cellicon->focused && gtk_widget_has_focus(widget))
+                                       {
+                                       gtk_render_focus(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);
 
@@ -859,21 +917,18 @@ gqv_cell_renderer_icon_render(GtkCellRenderer             *cell,
 #endif
                                }
                        }
-                }
+               }
 
+#if !GTK_CHECK_VERSION(3,0,0)
        if (cellicon->focused && gtk_widget_has_focus(widget))
                {
-#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
 }