Convert group_keys to std::array
[geeqie.git] / src / cellrenderericon.cc
index a87d74e..d839b72 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include <stdlib.h>
-#include <gtk/gtk.h> /* To define GTK_CHECK_VERSION */
-#include "main.h"
 #include "cellrenderericon.h"
-#include "intl.h"
 
+#include <cstddef>
 
-#define FIXED_ICON_SIZE_MAX 512
+#include <cairo.h>
+#include <gdk/gdk.h>
 
+namespace
+{
+
+constexpr gint FIXED_ICON_SIZE_MAX = 512;
+
+} // namespace
 
 static void gqv_cell_renderer_icon_get_property(GObject                *object,
                                                guint           param_id,
@@ -36,13 +40,13 @@ static void gqv_cell_renderer_icon_set_property(GObject             *object,
                                                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_init(GQvCellRendererIcon *cellicon);
 static void gqv_cell_renderer_icon_class_init_wrapper(void *, void *);
 static void gqv_cell_renderer_icon_class_init(GQvCellRendererIconClass *icon_class);
 static void gqv_cell_renderer_icon_finalize(GObject *object);
 static void gqv_cell_renderer_icon_get_size(GtkCellRenderer    *cell,
                                            GtkWidget          *widget,
-                                           const GdkRectangle *rectangle,
+                                           const GdkRectangle *cell_area,
                                            gint               *x_offset,
                                            gint               *y_offset,
                                            gint               *width,
@@ -91,7 +95,7 @@ static guint toggle_cell_signals[LAST_SIGNAL] = { 0 };
 static gpointer parent_class;
 
 GType
-gqv_cell_renderer_icon_get_type(void)
+gqv_cell_renderer_icon_get_type()
 {
        static GType cell_icon_type = 0;
 
@@ -100,29 +104,29 @@ gqv_cell_renderer_icon_get_type(void)
                static const GTypeInfo cell_icon_info =
                        {
                        sizeof(GQvCellRendererIconClass), /* class_size */
-                       NULL,           /* base_init */
-                       NULL,           /* base_finalize */
-                       (GClassInitFunc) gqv_cell_renderer_icon_class_init_wrapper, /* class_init */
-                       NULL,           /* class_finalize */
-                       NULL,           /* class_data */
+                       nullptr,                /* base_init */
+                       nullptr,                /* base_finalize */
+                       static_cast<GClassInitFunc>(gqv_cell_renderer_icon_class_init_wrapper), /* class_init */
+                       nullptr,                /* class_finalize */
+                       nullptr,                /* class_data */
                        sizeof(GQvCellRendererIcon), /* instance_size */
                        0,              /* n_preallocs */
-                       (GInstanceInitFunc) gqv_cell_renderer_icon_init_wrapper, /* instance_init */
-                       NULL,           /* value_table */
+                       reinterpret_cast<GInstanceInitFunc>(gqv_cell_renderer_icon_init_wrapper), /* instance_init */
+                       nullptr,                /* value_table */
                        };
 
                cell_icon_type = g_type_register_static(GTK_TYPE_CELL_RENDERER,
                                                        "GQvCellRendererIcon",
-                                                       &cell_icon_info, 0);
+                                                       &cell_icon_info, static_cast<GTypeFlags>(0));
                }
 
        return cell_icon_type;
 }
 
 static void
-gqv_cell_renderer_icon_init_wrapper(void *data, void *UNUSED(user_data))
+gqv_cell_renderer_icon_init_wrapper(void *data, void *)
 {
-       gqv_cell_renderer_icon_init(data);
+       gqv_cell_renderer_icon_init(static_cast<GQvCellRendererIcon *>(data));
 }
 
 static void
@@ -133,9 +137,9 @@ gqv_cell_renderer_icon_init(GQvCellRendererIcon *cellicon)
 }
 
 static void
-gqv_cell_renderer_icon_class_init_wrapper(void *data, void *UNUSED(user_data))
+gqv_cell_renderer_icon_class_init_wrapper(void *data, void *)
 {
-       gqv_cell_renderer_icon_class_init(data);
+       gqv_cell_renderer_icon_class_init(static_cast<GQvCellRendererIconClass *>(data));
 }
 
 static void
@@ -168,23 +172,23 @@ gqv_cell_renderer_icon_class_init(GQvCellRendererIconClass *icon_class)
                                        g_param_spec_string("text",
                                                        "Text",
                                                        "Text to render",
-                                                       NULL,
+                                                       nullptr,
                                                        G_PARAM_READWRITE));
 
        g_object_class_install_property(object_class,
                                        PROP_BACKGROUND_GDK,
-                                       g_param_spec_boxed("background_gdk",
+                                       g_param_spec_boxed("background_rgba",
                                                        "Background color",
-                                                       "Background color as a GdkColor",
-                                                       GDK_TYPE_COLOR,
+                                                       "Background color as a GdkRGBA",
+                                                       GDK_TYPE_RGBA,
                                                        G_PARAM_READWRITE));
 
        g_object_class_install_property(object_class,
                                        PROP_FOREGROUND_GDK,
-                                       g_param_spec_boxed("foreground_gdk",
+                                       g_param_spec_boxed("foreground_rgba",
                                                        "Foreground color",
-                                                       "Foreground color as a GdkColor",
-                                                       GDK_TYPE_COLOR,
+                                                       "Foreground color as a GdkRGBA",
+                                                       GDK_TYPE_RGBA,
                                                        G_PARAM_READWRITE));
 
        g_object_class_install_property(object_class,
@@ -276,7 +280,7 @@ gqv_cell_renderer_icon_class_init(GQvCellRendererIconClass *icon_class)
                G_OBJECT_CLASS_TYPE (object_class),
                G_SIGNAL_RUN_LAST,
                G_STRUCT_OFFSET (GQvCellRendererIconClass, toggled),
-               NULL, NULL,
+               nullptr, nullptr,
                g_cclosure_marshal_VOID__STRING,
                G_TYPE_NONE, 1,
                G_TYPE_STRING);
@@ -306,29 +310,29 @@ gqv_cell_renderer_icon_get_property(GObject       *object,
        switch (param_id)
        {
        case PROP_PIXBUF:
-               g_value_set_object(value, cellicon->pixbuf ? G_OBJECT(cellicon->pixbuf) : NULL);
+               g_value_set_object(value, cellicon->pixbuf ? G_OBJECT(cellicon->pixbuf) : nullptr);
                break;
        case PROP_TEXT:
                g_value_set_string(value, cellicon->text);
                break;
        case PROP_BACKGROUND_GDK:
                {
-               GdkColor color;
+               GdkRGBA color;
 
-               color.red = cellicon->background.red;
-               color.green = cellicon->background.green;
-               color.blue = cellicon->background.blue;
+               color.red = cellicon->background.red / 65535.0;
+               color.green = cellicon->background.green / 65535.0;
+               color.blue = cellicon->background.blue / 65535.0;
 
                g_value_set_boxed(value, &color);
                }
                break;
        case PROP_FOREGROUND_GDK:
                {
-               GdkColor color;
+               GdkRGBA color;
 
-               color.red = cellicon->foreground.red;
-               color.green = cellicon->foreground.green;
-               color.blue = cellicon->foreground.blue;
+               color.red = cellicon->foreground.red / 65535.0;
+               color.green = cellicon->foreground.green / 65535.0;
+               color.blue = cellicon->foreground.blue / 65535.0;
 
                g_value_set_boxed(value, &color);
                }
@@ -369,9 +373,7 @@ gqv_cell_renderer_icon_get_property(GObject *object,
        }
 }
 
-static void
-set_bg_color(GQvCellRendererIcon *cellicon,
-            GdkColor             *color)
+static void set_bg_color(GQvCellRendererIcon *cellicon, GdkRGBA *color)
 {
        if (color)
                {
@@ -381,9 +383,9 @@ set_bg_color(GQvCellRendererIcon *cellicon,
                        g_object_notify(G_OBJECT(cellicon), "background_set");
                        }
 
-               cellicon->background.red = color->red;
-               cellicon->background.green = color->green;
-               cellicon->background.blue = color->blue;
+               cellicon->background.red = color->red * 65535;
+               cellicon->background.green = color->green * 65535;
+               cellicon->background.blue = color->blue * 65535;
                }
        else
                {
@@ -395,8 +397,7 @@ set_bg_color(GQvCellRendererIcon *cellicon,
                }
 }
 
-static void set_fg_color(GQvCellRendererIcon *cellicon,
-                        GdkColor             *color)
+static void set_fg_color(GQvCellRendererIcon *cellicon, GdkRGBA *color)
 {
        if (color)
                {
@@ -405,10 +406,9 @@ static void set_fg_color(GQvCellRendererIcon *cellicon,
                        cellicon->foreground_set = TRUE;
                        g_object_notify(G_OBJECT(cellicon), "foreground_set");
                        }
-
-               cellicon->foreground.red = color->red;
-               cellicon->foreground.green = color->green;
-               cellicon->foreground.blue = color->blue;
+               cellicon->foreground.red = color->red * 65535;
+               cellicon->foreground.green = color->green * 65535;
+               cellicon->foreground.blue = color->blue * 65535;
                }
        else
                {
@@ -434,7 +434,7 @@ gqv_cell_renderer_icon_set_property(GObject         *object,
                {
                GdkPixbuf *pixbuf;
 
-               pixbuf = (GdkPixbuf *) g_value_get_object(value);
+               pixbuf = static_cast<GdkPixbuf *>(g_value_get_object(value));
                if (pixbuf) g_object_ref(pixbuf);
                if (cellicon->pixbuf) g_object_unref(cellicon->pixbuf);
                cellicon->pixbuf = pixbuf;
@@ -452,10 +452,10 @@ gqv_cell_renderer_icon_set_property(GObject               *object,
                }
                break;
        case PROP_BACKGROUND_GDK:
-               set_bg_color(cellicon, g_value_get_boxed(value));
+               set_bg_color(cellicon, static_cast<GdkRGBA *>(g_value_get_boxed(value)));
                break;
        case PROP_FOREGROUND_GDK:
-               set_fg_color(cellicon, g_value_get_boxed(value));
+               set_fg_color(cellicon, static_cast<GdkRGBA *>(g_value_get_boxed(value)));
                break;
        case PROP_FOCUSED:
                cellicon->focused = g_value_get_boolean(value);
@@ -544,9 +544,9 @@ gqv_cell_renderer_icon_get_layout(GQvCellRendererIcon *cellicon, GtkWidget *widg
  * Return value: the new cell renderer
  **/
 GtkCellRenderer *
-gqv_cell_renderer_icon_new(void)
+gqv_cell_renderer_icon_new()
 {
-       return g_object_new(GQV_TYPE_CELL_RENDERER_ICON, NULL);
+       return static_cast<GtkCellRenderer *>(g_object_new(GQV_TYPE_CELL_RENDERER_ICON, nullptr));
 }
 
 static void gqv_cell_renderer_icon_get_size(GtkCellRenderer    *cell,
@@ -557,11 +557,13 @@ static void gqv_cell_renderer_icon_get_size(GtkCellRenderer    *cell,
                                            gint               *width,
                                            gint               *height)
 {
-       GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
+       auto cellicon = reinterpret_cast<GQvCellRendererIcon *>(cell);
        gint calc_width;
        gint calc_height;
-       gint xpad, ypad;
-       gfloat xalign, yalign;
+       gint xpad;
+       gint ypad;
+       gfloat xalign;
+       gfloat yalign;
 
        gtk_cell_renderer_get_padding(cell, &xpad, &ypad);
        gtk_cell_renderer_get_alignment(cell, &xalign, &yalign);
@@ -590,7 +592,7 @@ static void gqv_cell_renderer_icon_get_size(GtkCellRenderer    *cell,
                PangoRectangle rect;
 
                layout = gqv_cell_renderer_icon_get_layout(cellicon, widget, FALSE);
-               pango_layout_get_pixel_extents(layout, NULL, &rect);
+               pango_layout_get_pixel_extents(layout, nullptr, &rect);
                g_object_unref(layout);
 
                calc_width = MAX(calc_width, rect.width);
@@ -630,18 +632,19 @@ static void gqv_cell_renderer_icon_get_size(GtkCellRenderer    *cell,
 static void gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
                                           cairo_t *cr,
                                           GtkWidget *widget,
-                                          const GdkRectangle *UNUSED(background_area),
+                                          const GdkRectangle *,
                                           const GdkRectangle *cell_area,
                                           GtkCellRendererState flags)
 
 {
        GtkStyleContext *context = gtk_widget_get_style_context(widget);
-       GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
+       auto cellicon = reinterpret_cast<GQvCellRendererIcon *>(cell);
        GdkPixbuf *pixbuf;
        const gchar *text;
        GdkRectangle cell_rect;
        GtkStateFlags state;
-       gint xpad, ypad;
+       gint xpad;
+       gint ypad;
 
 
        pixbuf = cellicon->pixbuf;
@@ -671,7 +674,7 @@ static void gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
                }
        else
                {
-               if (gtk_widget_get_state(widget) == GTK_STATE_INSENSITIVE)
+               if (!gtk_widget_is_sensitive(widget))
                        state = GTK_STATE_FLAG_INSENSITIVE;
                else
                        state = GTK_STATE_FLAG_NORMAL;
@@ -717,7 +720,7 @@ static void gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
                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);
+               pango_layout_get_pixel_extents(layout, nullptr, &text_rect);
 
                pix_rect.width = text_rect.width;
                pix_rect.height = text_rect.height;
@@ -751,14 +754,14 @@ static void gqv_cell_renderer_icon_render(GtkCellRenderer *cell,
                        {
                        for (i = 0; i < cellicon->num_marks; i++)
                                {
-                               state &= ~(GTK_STATE_FLAG_CHECKED);
+                               state = static_cast<GtkStateFlags>(state & ~GTK_STATE_FLAG_CHECKED);
 
                                if ((cellicon->marks & (1 << i)))
-                                       state |= GTK_STATE_FLAG_CHECKED;
+                                       state = static_cast<GtkStateFlags>(state | GTK_STATE_FLAG_CHECKED);
                                cairo_save (cr);
 
                                cairo_rectangle(cr,
-                                               pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+                                               pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2.0,
                                                pix_rect.y,
                                                TOGGLE_WIDTH, TOGGLE_WIDTH);
                                cairo_clip (cr);
@@ -769,41 +772,27 @@ static void 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);
 
                                if (state & GTK_STATE_FLAG_CHECKED)
                                        {
                                        gtk_render_check(context, cr,
-                                               pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+                                               pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2.0,
                                                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.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2.0,
                                         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.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2.0,
                                                pix_rect.y, TOGGLE_WIDTH, TOGGLE_WIDTH);
                                        }
                                gtk_style_context_restore(context);
                                cairo_restore(cr);
-                               gtk_style_context_remove_provider(context, provider);
-                               g_object_unref(provider);
                                }
                        }
                }
@@ -813,11 +802,11 @@ static gboolean gqv_cell_renderer_icon_activate(GtkCellRenderer      *cell,
                                                GdkEvent             *event,
                                                GtkWidget            *widget,
                                                const gchar          *path,
-                                               const GdkRectangle   *UNUSED(background_area),
+                                               const GdkRectangle   *,
                                                const GdkRectangle   *cell_area,
-                                               GtkCellRendererState  UNUSED(flags))
+                                               GtkCellRendererState)
 {
-       GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
+       auto cellicon = reinterpret_cast<GQvCellRendererIcon *>(cell);
        GdkEventButton *bevent = &event->button;
 
        if (cellicon->show_marks &&
@@ -828,7 +817,8 @@ static gboolean gqv_cell_renderer_icon_activate(GtkCellRenderer      *cell,
                GdkRectangle rect;
                GdkRectangle cell_rect;
                gint i;
-               gint xpad, ypad;
+               gint xpad;
+               gint ypad;
 
                gtk_cell_renderer_get_padding(cell, &xpad, &ypad);