PROP_BACKGROUND_GDK,
g_param_spec_boxed("background_gdk",
"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",
"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,
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;
+ color.green = cellicon->background.green / 65535;
+ color.blue = cellicon->background.blue / 65535;
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;
+ color.green = cellicon->foreground.green / 65535;
+ color.blue = cellicon->foreground.blue / 65535;
g_value_set_boxed(value, &color);
}
}
}
-static void
-set_bg_color(GQvCellRendererIcon *cellicon,
- GdkColor *color)
+static void set_bg_color(GQvCellRendererIcon *cellicon, GdkRGBA *color)
{
if (color)
{
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
{
}
}
-static void set_fg_color(GQvCellRendererIcon *cellicon,
- GdkColor *color)
+static void set_fg_color(GQvCellRendererIcon *cellicon, GdkRGBA *color)
{
if (color)
{
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
{
}
break;
case PROP_BACKGROUND_GDK:
- set_bg_color(cellicon, static_cast<GdkColor *>(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, static_cast<GdkColor *>(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);
#include "layout-image.h"
#include "menu.h"
#include "metadata.h"
+#include "misc.h"
#include "pixbuf-util.h"
#include "print.h"
#include "utilops.h"
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
{
auto cd = static_cast<ColumnData *>(data);
- CollectTable *ct;
- GtkStyle *style;
- GList *list;
CollectInfo *info;
- GdkColor color_fg;
- GdkColor color_bg;
- gchar *star_rating = nullptr;
+ CollectTable *ct;
gchar *display_text = nullptr;
+ gchar *star_rating = nullptr;
+ GdkRGBA color_bg;
+ GdkRGBA color_bg_style;
+ GdkRGBA color_fg;
+ GdkRGBA color_fg_style;
+ GList *list;
+ GtkStyle *style;
ct = cd->ct;
style = gtk_widget_get_style(ct->listview);
if (info && (info->flag_mask & SELECTION_SELECTED) )
{
- memcpy(&color_fg, &style->text[GTK_STATE_SELECTED], sizeof(color_fg));
- memcpy(&color_bg, &style->base[GTK_STATE_SELECTED], sizeof(color_bg));
+ convert_gdkcolor_to_gdkrgba(&style->text[GTK_STATE_SELECTED], &color_fg_style);
+ convert_gdkcolor_to_gdkrgba(&style->base[GTK_STATE_SELECTED], &color_bg_style);
+
+ memcpy(&color_fg, &color_fg_style, sizeof(color_fg));
+ memcpy(&color_bg, &color_bg_style, sizeof(color_bg));
}
else
{
- memcpy(&color_fg, &style->text[GTK_STATE_NORMAL], sizeof(color_fg));
- memcpy(&color_bg, &style->base[GTK_STATE_NORMAL], sizeof(color_bg));
+ convert_gdkcolor_to_gdkrgba(&style->text[GTK_STATE_NORMAL], &color_fg_style);
+ convert_gdkcolor_to_gdkrgba(&style->base[GTK_STATE_NORMAL], &color_bg_style);
+
+ memcpy(&color_fg, &color_fg_style, sizeof(color_fg));
+ memcpy(&color_bg, &color_bg_style, sizeof(color_bg));
+
+ memcpy(&color_fg, &color_fg_style, sizeof(color_fg));
+ memcpy(&color_bg, &color_bg_style, sizeof(color_bg));
}
if (info && (info->flag_mask & SELECTION_PRELIGHT))
}
}
-static GdkColor *dupe_listview_color_shifted(GtkWidget *widget)
+static GdkRGBA *dupe_listview_color_shifted(GtkWidget *widget)
{
- static GdkColor color;
+ static GdkRGBA color;
+ static GdkRGBA color_style;
static GtkWidget *done = nullptr;
if (done != widget)
GtkStyle *style;
style = gtk_widget_get_style(widget);
- memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
+ convert_gdkcolor_to_gdkrgba(&style->base[GTK_STATE_NORMAL], &color_style);
+
+ memcpy(&color, &color_style, sizeof(color));
shift_color(&color, -1, 0);
done = widget;
}
g_object_set(G_OBJECT(imd->pr), "window_fit", allow_sync, NULL);
}
-void image_background_set_color(ImageWindow *imd, GdkColor *color)
+void image_background_set_color(ImageWindow *imd, GdkRGBA *color)
{
pixbuf_renderer_set_color(reinterpret_cast<PixbufRenderer *>(imd->pr), color);
}
void image_background_set_color_from_options(ImageWindow *imd, gboolean fullscreen)
{
- GdkColor *color = nullptr;
- GdkColor theme_color;
+ GdkRGBA *color = nullptr;
+ GdkRGBA theme_color;
GdkRGBA bg_color;
GtkStyleContext *style_context;
LayoutWindow *lw = nullptr;
style_context = gtk_widget_get_style_context(lw->window);
gtk_style_context_get_background_color(style_context, GTK_STATE_FLAG_NORMAL, &bg_color);
- theme_color.red = bg_color.red * 65535;
- theme_color.green = bg_color.green * 65535;
- theme_color.blue = bg_color.blue * 65535;
+ theme_color.red = bg_color.red * 1;
+ theme_color.green = bg_color.green * 1;
+ theme_color.blue = bg_color.blue * 1;
color = &theme_color;
}
void image_top_window_set_sync(ImageWindow *imd, gboolean allow_sync);
/* background of image */
-void image_background_set_color(ImageWindow *imd, GdkColor *color);
+void image_background_set_color(ImageWindow *imd, GdkRGBA *color);
void image_background_set_color_from_options(ImageWindow *imd, gboolean fullscreen);
/* color profiles */
static void set_theme_bg_color()
{
GdkRGBA bg_color;
- GdkColor theme_color;
+ GdkRGBA theme_color;
GtkStyleContext *style_context;
GList *work;
LayoutWindow *lw;
style_context = gtk_widget_get_style_context(lw->window);
gtk_style_context_get_background_color(style_context, GTK_STATE_FLAG_NORMAL, &bg_color);
- theme_color.red = bg_color.red * 65535;
- theme_color.green = bg_color.green * 65535;
- theme_color.blue = bg_color.blue * 65535;
+ theme_color.red = bg_color.red ;
+ theme_color.green = bg_color.green ;
+ theme_color.blue = bg_color.blue ;
while (work)
{
return sysconf(_SC_NPROCESSORS_ONLN);
}
+#ifdef HAVE_GTK4
+void convert_gdkcolor_to_gdkrgba(gpointer data, GdkRGBA *gdk_rgba)
+{
+/* @FIXME GTK4 stub */
+}
+#else
+void convert_gdkcolor_to_gdkrgba(gpointer data, GdkRGBA *gdk_rgba)
+{
+ auto gdk_color = static_cast<GdkColor *>(data);
+
+ gdk_rgba->red = CLAMP((double)gdk_color->red / 65535.0, 0.0, 1.0);
+ gdk_rgba->green = CLAMP((double)gdk_color->green / 65535.0, 0.0, 1.0);
+ gdk_rgba->blue = CLAMP((double)gdk_color->blue / 65535.0, 0.0, 1.0);
+ gdk_rgba->alpha = 1.0;
+}
+#endif
+
/* Copied from the libarchive .repo. examples */
#ifndef HAVE_ARCHIVE
gchar *convert_rating_to_stars(gint rating);
gchar *get_symbolic_link(const gchar *path_utf8);
gint get_cpu_cores();
+
+#ifdef HAVE_GTK4
+void convert_gdkcolor_to_gdkrgba(gpointer gdk_color, GdkRGBA *gdk_rgba);
+#else
+void convert_gdkcolor_to_gdkrgba(gpointer gdk_color, GdkRGBA *gdk_rgba);
+#endif
+
gchar *open_archive(FileData *fd);
#endif /* MISC_H */
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
memset(&options->image.border_color, 0, sizeof(options->image.border_color));
memset(&options->image.alpha_color_1, 0, sizeof(options->image.alpha_color_1));
memset(&options->image.alpha_color_2, 0, sizeof(options->image.alpha_color_2));
+ options->image.border_color.red = static_cast<gdouble>(0x009999) / 65535;
+ options->image.border_color.green = static_cast<gdouble>(0x009999) / 65535;
+ options->image.border_color.blue = static_cast<gdouble>(0x009999) / 65535;
/* alpha channel checkerboard background (same as gimp) */
- options->image.alpha_color_1.red = 0x009999;
- options->image.alpha_color_1.green = 0x009999;
- options->image.alpha_color_1.blue = 0x009999;
- options->image.alpha_color_2.red = 0x006666;
- options->image.alpha_color_2.green = 0x006666;
- options->image.alpha_color_2.blue = 0x006666;
+ options->image.alpha_color_1.red = static_cast<gdouble>(0x009999) / 65535;
+ options->image.alpha_color_1.green = static_cast<gdouble>(0x009999) / 65535;
+ options->image.alpha_color_1.blue = static_cast<gdouble>(0x009999) / 65535;
+ options->image.alpha_color_2.red = static_cast<gdouble>(0x006666) / 65535;
+ options->image.alpha_color_2.green = static_cast<gdouble>(0x006666) / 65535;
+ options->image.alpha_color_2.blue = static_cast<gdouble>(0x006666) / 65535;
options->image.enable_read_ahead = TRUE;
options->image.exif_rotate_enable = TRUE;
options->image.fit_window_to_image = FALSE;
gboolean use_custom_border_color_in_fullscreen;
gboolean use_custom_border_color;
- GdkColor border_color;
- GdkColor alpha_color_1;
- GdkColor alpha_color_2;
+ GdkRGBA border_color;
+ GdkRGBA alpha_color_1;
+ GdkRGBA alpha_color_2;
gint tile_size;
} image;
*-------------------------------------------------------------------
*/
-void pixbuf_renderer_set_color(PixbufRenderer *pr, GdkColor *color)
+void pixbuf_renderer_set_color(PixbufRenderer *pr, GdkRGBA *color)
{
g_return_if_fail(IS_PIXBUF_RENDERER(pr));
gint autofit_limit_size;
gint enlargement_limit_size;
- GdkColor color;
+ GdkRGBA color;
/*< private >*/
gboolean in_drag;
* @headerfile pixbuf_renderer_set_color
* background color
*/
-void pixbuf_renderer_set_color(PixbufRenderer *pr, GdkColor *color);
+void pixbuf_renderer_set_color(PixbufRenderer *pr, GdkRGBA *color);
/* overlay */
if (options->image.use_custom_border_color != c_options->image.use_custom_border_color
|| options->image.use_custom_border_color_in_fullscreen != c_options->image.use_custom_border_color_in_fullscreen
- || !gdk_color_equal(&options->image.border_color, &c_options->image.border_color))
+ || !gdk_rgba_equal(&options->image.border_color, &c_options->image.border_color))
{
options->image.use_custom_border_color_in_fullscreen = c_options->image.use_custom_border_color_in_fullscreen;
options->image.use_custom_border_color = c_options->image.use_custom_border_color;
c_options->image_overlay.background_blue = color.blue * 255;
c_options->image_overlay.background_alpha = color.alpha * 255;
}
-
gtk_widget_destroy(GTK_WIDGET(dialog));
}
return TRUE;
}
-
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-but-set-parameter"
static void font_activated_cb(GtkFontChooser *widget, gchar *fontname, gpointer option)
{
option = g_strdup(fontname);
gtk_widget_destroy(GTK_WIDGET(widget));
}
+#pragma GCC diagnostic pop
static void font_response_cb(GtkDialog *dialog, int response_id, gpointer option)
{
return TRUE;
}
-/* Since gdk_color_to_string() is only available since gtk 2.12
- * here is an equivalent stub function. */
-static gchar *color_to_string(GdkColor *color)
-{
- return g_strdup_printf("#%04X%04X%04X", color->red, color->green, color->blue);
-}
-
-void write_color_option(GString *str, gint indent, const gchar *label, GdkColor *color)
+void write_color_option(GString *str, gint indent, const gchar *label, GdkRGBA *color)
{
if (color)
{
- gchar *colorstring = color_to_string(color);
+ gchar *colorstring = gdk_rgba_to_string(color);
write_char_option(str, indent, label, colorstring);
g_free(colorstring);
write_char_option(str, indent, label, "");
}
-gboolean read_color_option(const gchar *option, const gchar *label, const gchar *value, GdkColor *color)
+/**
+ * @brief Read color option
+ * @param option
+ * @param label
+ * @param value
+ * @param color Returned RGBA value
+ * @returns
+ *
+ * The change from GdkColor to GdkRGBA requires a color format change.
+ * If the value string starts with #, it is a value stored as GdkColor,
+ * which is "#666666666666".
+ * The GdkRGBA style is "rgba(192,97,203,0)"
+ */
+gboolean read_color_option(const gchar *option, const gchar *label, const gchar *value, GdkRGBA *color)
{
+ guint64 color_from_hex_string;
+
if (g_ascii_strcasecmp(option, label) != 0) return FALSE;
if (!color) return FALSE;
if (!*value) return FALSE;
- gdk_color_parse(value, color);
+
+ /* Convert from GTK3 compatible GdkColor to GTK4 compatible GdkRGBA */
+ if (g_str_has_prefix(value, "#"))
+ {
+ color_from_hex_string = g_ascii_strtoll(value + 1, nullptr, 16);
+ color->red = (gdouble)((color_from_hex_string & 0xffff00000000) >> 32) / 65535;
+ color->green = (gdouble)((color_from_hex_string & 0x0000ffff0000) >> 16) / 65535;
+ color->blue = (gdouble)(color_from_hex_string & 0x00000000ffff) / 65535;
+ }
+ else
+ {
+ gdk_rgba_parse(color, value);
+ }
+
return TRUE;
}
void write_char_option(GString *str, gint indent, const gchar *label, const gchar *text);
gboolean read_dummy_option(const gchar *option, const gchar *label, const gchar *message);
gboolean read_char_option(const gchar *option, const gchar *label, const gchar *value, gchar **text);
-void write_color_option(GString *str, gint indent, const gchar *label, GdkColor *color);
-gboolean read_color_option(const gchar *option, const gchar *label, const gchar *value, GdkColor *color);
+void write_color_option(GString *str, gint indent, const gchar *label, GdkRGBA *color);
+gboolean read_color_option(const gchar *option, const gchar *label, const gchar *value, GdkRGBA *color);
void write_int_option(GString *str, gint indent, const gchar *label, gint n);
gboolean read_int_option(const gchar *option, const gchar *label, const gchar *value, gint *n);
gboolean read_ushort_option(const gchar *option, const gchar *label, const gchar *value, guint16 *n);
pr->viewport_width, pr->viewport_height,
&rx, &ry, &rw, &rh))
{
- cairo_set_source_rgb(cr, static_cast<double>(pr->color.red)/65535, static_cast<double>(pr->color.green)/65535, static_cast<double>(pr->color.blue)/65535);
+ cairo_set_source_rgb(cr, static_cast<double>(pr->color.red), static_cast<double>(pr->color.green), static_cast<double>(pr->color.blue));
cairo_rectangle(cr, rx + rt->stereo_off_x, ry + rt->stereo_off_y, rw, rh);
cairo_fill(cr);
rt_overlay_draw(rt, rx, ry, rw, rh, nullptr);
pr->x_offset, pr->viewport_height,
&rx, &ry, &rw, &rh))
{
- cairo_set_source_rgb(cr, static_cast<double>(pr->color.red)/65535, static_cast<double>(pr->color.green)/65535, static_cast<double>(pr->color.blue)/65535);
+ cairo_set_source_rgb(cr, static_cast<double>(pr->color.red), static_cast<double>(pr->color.green), static_cast<double>(pr->color.blue));
cairo_rectangle(cr, rx + rt->stereo_off_x, ry + rt->stereo_off_y, rw, rh);
cairo_fill(cr);
rt_overlay_draw(rt, rx, ry, rw, rh, nullptr);
pr->viewport_width - pr->vis_width - pr->x_offset, pr->viewport_height,
&rx, &ry, &rw, &rh))
{
- cairo_set_source_rgb(cr, static_cast<double>(pr->color.red)/65535, static_cast<double>(pr->color.green)/65535, static_cast<double>(pr->color.blue)/65535);
+ cairo_set_source_rgb(cr, static_cast<double>(pr->color.red), static_cast<double>(pr->color.green), static_cast<double>(pr->color.blue));
cairo_rectangle(cr, rx + rt->stereo_off_x, ry + rt->stereo_off_y, rw, rh);
cairo_fill(cr);
rt_overlay_draw(rt, rx, ry, rw, rh, nullptr);
pr->vis_width, pr->y_offset,
&rx, &ry, &rw, &rh))
{
- cairo_set_source_rgb(cr, static_cast<double>(pr->color.red)/65535, static_cast<double>(pr->color.green)/65535, static_cast<double>(pr->color.blue)/65535);
+ cairo_set_source_rgb(cr, static_cast<double>(pr->color.red), static_cast<double>(pr->color.green), static_cast<double>(pr->color.blue));
cairo_rectangle(cr, rx + rt->stereo_off_x, ry + rt->stereo_off_y, rw, rh);
cairo_fill(cr);
rt_overlay_draw(rt, rx, ry, rw, rh, nullptr);
pr->vis_width, pr->viewport_height - pr->vis_height - pr->y_offset,
&rx, &ry, &rw, &rh))
{
- cairo_set_source_rgb(cr, static_cast<double>(pr->color.red)/65535, static_cast<double>(pr->color.green)/65535, static_cast<double>(pr->color.blue)/65535);
+ cairo_set_source_rgb(cr, static_cast<double>(pr->color.red), static_cast<double>(pr->color.green), static_cast<double>(pr->color.blue));
cairo_rectangle(cr, rx + rt->stereo_off_x, ry + rt->stereo_off_y, rw, rh);
cairo_fill(cr);
rt_overlay_draw(rt, rx, ry, rw, rh, nullptr);
gint c;
guchar *psrc;
guchar *pdst;
+ guint32 red_1;
+ guint32 green_1;
+ guint32 blue_1;
+ guint32 red_2;
+ guint32 green_2;
+ guint32 blue_2;
+ guint32 alpha_1;
+ guint32 alpha_2;
if (!has_alpha)
{
}
else
{
+ red_1=static_cast<guint32>(options->image.alpha_color_1.red * 255) << 16 & 0x00FF0000;
+ green_1=static_cast<guint32>(options->image.alpha_color_1.green * 255) << 8 & 0x0000FF00;
+ blue_1=static_cast<guint32>(options->image.alpha_color_1.blue * 255) & 0x000000FF;
+ red_2=static_cast<guint32>(options->image.alpha_color_2.red * 255) << 16 & 0x00FF0000;
+ green_2=static_cast<guint32>(options->image.alpha_color_2.green * 255) << 8 & 0x0000FF00;
+ blue_2=static_cast<guint32>(options->image.alpha_color_2.blue * 255) & 0x000000FF;
+ alpha_1 = red_1 + green_1 + blue_1;
+ alpha_2 = red_2 + green_2 + blue_2;
+
if (ignore_alpha)
{
tmppixbuf = gdk_pixbuf_add_alpha(src, FALSE, 0, 0, 0);
(scale_x == 1.0 && scale_y == 1.0) ? GDK_INTERP_NEAREST : interp_type,
255, check_x, check_y,
PR_ALPHA_CHECK_SIZE,
- ((options->image.alpha_color_1.red << 8 & 0x00FF0000) +
- (options->image.alpha_color_1.green & 0x00FF00) +
- (options->image.alpha_color_1.blue >> 8 & 0x00FF)),
- ((options->image.alpha_color_2.red << 8 & 0x00FF0000) +
- (options->image.alpha_color_2.green & 0x00FF00) +
- (options->image.alpha_color_2.blue >> 8 & 0x00FF)));
+ alpha_1,
+ alpha_2);
g_object_unref(tmppixbuf);
}
else
(scale_x == 1.0 && scale_y == 1.0) ? GDK_INTERP_NEAREST : interp_type,
255, check_x, check_y,
PR_ALPHA_CHECK_SIZE,
- ((options->image.alpha_color_1.red << 8 & 0x00FF0000) +
- (options->image.alpha_color_1.green & 0x00FF00) +
- (options->image.alpha_color_1.blue >> 8 & 0x00FF)),
- ((options->image.alpha_color_2.red << 8 & 0x00FF0000) +
- (options->image.alpha_color_2.green & 0x00FF00) +
- (options->image.alpha_color_2.blue >> 8 & 0x00FF)));
+ alpha_1,
+ alpha_2);
}
}
}
rt->surface = gdk_window_create_similar_surface(gtk_widget_get_window(widget), CAIRO_CONTENT_COLOR, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget));
cr = cairo_create(rt->surface);
- cairo_set_source_rgb(cr, static_cast<gdouble>(rt->pr->color.red) / 65535, static_cast<gdouble>(rt->pr->color.green) / 65535, static_cast<gdouble>(rt->pr->color.blue) / 65535);
+ cairo_set_source_rgb(cr, static_cast<gdouble>(rt->pr->color.red), static_cast<gdouble>(rt->pr->color.green), static_cast<gdouble>(rt->pr->color.blue));
cairo_paint(cr);
cairo_destroy(cr);
}
cr = cairo_create(rt->surface);
- cairo_set_source_rgb(cr, static_cast<gdouble>(options->image.border_color.red) / 65535, static_cast<gdouble>(options->image.border_color.green) / 65535, static_cast<gdouble>(options->image.border_color.blue) / 65535);
+ cairo_set_source_rgb(cr, static_cast<gdouble>(options->image.border_color.red), static_cast<gdouble>(options->image.border_color.green), static_cast<gdouble>(options->image.border_color.blue));
cairo_paint(cr);
cairo_set_source_surface(cr, old_surface, 0, 0);
cairo_paint(cr);
if (rt->stereo_mode & (PR_STEREO_HORIZ | PR_STEREO_VERT))
{
cairo_push_group(cr);
- cairo_set_source_rgb(cr, static_cast<double>(rt->pr->color.red) / 65535, static_cast<double>(rt->pr->color.green) / 65535, static_cast<double>(rt->pr->color.blue) / 65535);
+ cairo_set_source_rgb(cr, static_cast<double>(rt->pr->color.red), static_cast<double>(rt->pr->color.green), static_cast<double>(rt->pr->color.blue));
if (rt->stereo_mode & PR_STEREO_HORIZ)
{
void pref_color_button_set_cb(GtkWidget *widget, gpointer data)
{
- auto color = static_cast<GdkColor *>(data);
+ auto color = static_cast<GdkRGBA *>(data);
- gtk_color_button_get_color(GTK_COLOR_BUTTON(widget), color);
+ gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), color);
}
-GtkWidget *pref_color_button_new(GtkWidget *parent_box,
- const gchar *title, const GdkColor *color,
- GCallback func, gpointer data)
+GtkWidget *pref_color_button_new(GtkWidget *parent_box, const gchar *title, GdkRGBA *color, GCallback func, gpointer data)
{
GtkWidget *button;
if (color)
{
- button = gtk_color_button_new_with_color(color);
+ button = gtk_color_button_new_with_rgba(color);
}
else
{
void pref_color_button_set_cb(GtkWidget *widget, gpointer data);
GtkWidget *pref_color_button_new(GtkWidget *parent_box,
- const gchar *title, const GdkColor *color,
+ const gchar *title, GdkRGBA *color,
GCallback func, gpointer data);
gchar *text_widget_text_pull(GtkWidget *text_widget);
*-------------------------------------------------------------------
*/
-void shift_color(GdkColor *src, gshort val, gint direction)
+void shift_color(GdkRGBA *src, gshort val, gint direction)
{
- gshort cs;
+ gdouble cs;
if (val == -1)
{
{
val = CLAMP(val, 1, 100);
}
- cs = 0xffff / 100 * val;
+
+ cs = 1.0 / 100 * val;
/* up or down ? */
- if (direction < 0 ||
- (direction == 0 &&(static_cast<gint>(src->red) + static_cast<gint>(src->green) + static_cast<gint>(src->blue)) / 3 > 0xffff / 2))
+ if (direction < 0 || (direction == 0 &&(static_cast<gdouble>(src->red) + static_cast<gdouble>(src->green) + static_cast<gdouble>(src->blue)) / 3 > 1.0 / 2))
{
src->red = MAX(0 , src->red - cs);
src->green = MAX(0 , src->green - cs);
}
else
{
- src->red = MIN(0xffff, src->red + cs);
- src->green = MIN(0xffff, src->green + cs);
- src->blue = MIN(0xffff, src->blue + cs);
+ src->red = MIN(1.0, src->red + cs);
+ src->green = MIN(1.0, src->green + cs);
+ src->blue = MIN(1.0, src->blue + cs);
}
}
-/* darkens or lightens a style's color for given state
- * esp. useful for alternating dark/light in (c)lists
- */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-function"
-void style_shift_color_unused(GtkStyle *style, GtkStateType type, gshort shift_value, gint direction)
-{
- if (!style) return;
-
- shift_color(&style->base[type], shift_value, direction);
- shift_color(&style->bg[type], shift_value, direction);
-}
-#pragma GCC diagnostic pop
-
/*
*-------------------------------------------------------------------
* auto scroll by mouse position
/**
* @headerfile shift_color
- * shifts a GdkColor values lighter or darker \n
+ * shifts a GdkRGBA values lighter or darker \n
* val is percent from 1 to 100, or -1 for default (usually 10%) \n
* direction is -1 darker, 0 auto, 1 lighter
*/
-void shift_color(GdkColor *src, gshort val, gint direction);
+void shift_color(GdkRGBA *src, gshort val, gint direction);
/**
* @def STYLE_SHIFT_STANDARD
vd_select_row(vd, fd);
}
-static GdkColor *vd_color_shifted(GtkWidget *widget)
+static GdkRGBA *vd_color_shifted(GtkWidget *widget)
{
- static GdkColor color;
+ static GdkRGBA color;
+ static GdkRGBA color_style;
static GtkWidget *done = nullptr;
+#ifdef HAVE_GTK4
+/* @FIXME GTK4 no background color */
+#else
if (done != widget)
{
- GtkStyle *style;
+ GtkStyleContext *style_context;
+
+ style_context = gtk_widget_get_style_context(widget);
+ gtk_style_context_get_background_color(style_context, GTK_STATE_FLAG_NORMAL, &color_style);
+
+ memcpy(&color, &color_style, sizeof(color_style));
- style = gtk_widget_get_style(widget);
- memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
shift_color(&color, -1, 0);
done = widget;
}
+#endif
return &color;
}
static void vficon_cell_data_cb(GtkTreeViewColumn *, GtkCellRenderer *cell,
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
{
- GList *list;
- FileData *fd;
auto cd = static_cast<ColumnData *>(data);
- ViewFile *vf = cd->vf;
+ FileData *fd;
gchar *star_rating;
+ GList *list;
+ ViewFile *vf = cd->vf;
if (!GQV_IS_CELL_RENDERER_ICON(cell)) return;
if (fd)
{
- GdkColor color_fg;
- GdkColor color_bg;
- GtkStyle *style;
- gchar *name_sidecars = nullptr;
const gchar *link;
+ gchar *name_sidecars = nullptr;
+ GdkRGBA color_bg;
+ GdkRGBA color_fg;
+ GdkRGBA color_bg_style;
+ GdkRGBA color_fg_style;
GtkStateType state = GTK_STATE_NORMAL;
+ GtkStyle *style;
g_assert(fd->magick == FD_MAGICK);
state = GTK_STATE_SELECTED;
}
- memcpy(&color_fg, &style->text[state], sizeof(color_fg));
- memcpy(&color_bg, &style->base[state], sizeof(color_bg));
+ convert_gdkcolor_to_gdkrgba(&style->text[state], &color_fg_style);
+ convert_gdkcolor_to_gdkrgba(&style->base[state], &color_bg_style);
+
+ memcpy(&color_fg, &color_fg_style, sizeof(color_fg));
+ memcpy(&color_bg, &color_bg_style, sizeof(color_bg));
if (fd->selected & SELECTION_PRELIGHT)
{
shift_color(&color_bg, -1, 0);
}
- g_object_set(cell, "pixbuf", fd->thumb_pixbuf,
+ g_object_set(cell, "pixbuf", fd->thumb_pixbuf,
"text", name_sidecars,
"marks", file_data_get_marks(fd),
"show_marks", vf->marks_enabled,
- "cell-background-gdk", &color_bg,
+ "cell-background-rgba", &color_bg,
"cell-background-set", TRUE,
"foreground-gdk", &color_fg,
"foreground-set", TRUE,
}
}
-static GdkColor *vflist_listview_color_shifted(GtkWidget *widget)
+static GdkRGBA *vflist_listview_color_shifted(GtkWidget *widget)
{
- static GdkColor color;
+ static GdkRGBA color;
+ static GdkRGBA color_style;
static GtkWidget *done = nullptr;
if (done != widget)
GtkStyle *style;
style = gtk_widget_get_style(widget);
- memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
+ convert_gdkcolor_to_gdkrgba(&style->base[GTK_STATE_NORMAL], &color_style);
+
+ memcpy(&color, &color_style, sizeof(color));
shift_color(&color, -1, 0);
done = widget;
}