From dbb91684262d0eed3bb71813bf51268fe4967132 Mon Sep 17 00:00:00 2001 From: deepend Date: Tue, 20 Jan 2026 12:26:01 -0700 Subject: [PATCH] Parse GTK3 palette RGB16 values into explicit GdkRGBA structs before assignment in the palette helper. Copy RGBA values from the GTK color chooser into palette entries for the setup dialog path. Added RGBA-aware list-store color helpers and usage for userlist, notify, and DCC views to keep color handling consistent across GTK versions. --- src/fe-gtk/dccgui.c | 39 +++++++++++++++++++-------------------- src/fe-gtk/notifygui.c | 17 +++++++++++++++-- src/fe-gtk/palette.c | 4 +++- src/fe-gtk/setup.c | 5 ++++- src/fe-gtk/userlistgui.c | 19 ++++++++++++++++--- 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/fe-gtk/dccgui.c b/src/fe-gtk/dccgui.c index b37a777d..baa25764 100644 --- a/src/fe-gtk/dccgui.c +++ b/src/fe-gtk/dccgui.c @@ -151,6 +151,22 @@ fe_dcc_send_filereq (struct session *sess, char *nick, int maxcps, int passive) g_free (tbuf); } +static void +dcc_store_color (GtkListStore *store, GtkTreeIter *iter, int column, int color_index) +{ + const PaletteColor *color = NULL; + + if (color_index != 1) + color = &colors[color_index]; + +#if GTK_CHECK_VERSION(3,0,0) + const GdkRGBA *rgba = color; + gtk_list_store_set (store, iter, column, rgba, -1); +#else + gtk_list_store_set (store, iter, column, color, -1); +#endif +} + static void dcc_prepare_row_chat (struct DCC *dcc, GtkListStore *store, GtkTreeIter *iter, gboolean update_only) @@ -171,11 +187,8 @@ dcc_prepare_row_chat (struct DCC *dcc, GtkListStore *store, GtkTreeIter *iter, CCOL_SENT, size, CCOL_START, date, CCOL_DCC, dcc, - CCOL_COLOR, - dccstat[dcc->dccstat].color == 1 ? - NULL : - colors + dccstat[dcc->dccstat].color, -1); + dcc_store_color (store, iter, CCOL_COLOR, dccstat[dcc->dccstat].color); } static void @@ -211,10 +224,6 @@ dcc_prepare_row_send (struct DCC *dcc, GtkListStore *store, GtkTreeIter *iter, COL_PERC, perc, COL_SPEED, kbs, COL_ETA, eta, - COL_COLOR, - dccstat[dcc->dccstat].color == 1 ? - NULL : - colors + dccstat[dcc->dccstat].color, -1); else gtk_list_store_set (store, iter, @@ -228,11 +237,8 @@ dcc_prepare_row_send (struct DCC *dcc, GtkListStore *store, GtkTreeIter *iter, COL_ETA, eta, COL_NICK, dcc->nick, COL_DCC, dcc, - COL_COLOR, - dccstat[dcc->dccstat].color == 1 ? - NULL : - colors + dccstat[dcc->dccstat].color, -1); + dcc_store_color (store, iter, COL_COLOR, dccstat[dcc->dccstat].color); } static void @@ -271,10 +277,6 @@ dcc_prepare_row_recv (struct DCC *dcc, GtkListStore *store, GtkTreeIter *iter, COL_PERC, perc, COL_SPEED, kbs, COL_ETA, eta, - COL_COLOR, - dccstat[dcc->dccstat].color == 1 ? - NULL : - colors + dccstat[dcc->dccstat].color, -1); else gtk_list_store_set (store, iter, @@ -288,11 +290,8 @@ dcc_prepare_row_recv (struct DCC *dcc, GtkListStore *store, GtkTreeIter *iter, COL_ETA, eta, COL_NICK, dcc->nick, COL_DCC, dcc, - COL_COLOR, - dccstat[dcc->dccstat].color == 1 ? - NULL : - colors + dccstat[dcc->dccstat].color, -1); + dcc_store_color (store, iter, COL_COLOR, dccstat[dcc->dccstat].color); } static gboolean diff --git a/src/fe-gtk/notifygui.c b/src/fe-gtk/notifygui.c index 92b88c84..ab9794bc 100644 --- a/src/fe-gtk/notifygui.c +++ b/src/fe-gtk/notifygui.c @@ -83,6 +83,17 @@ notify_treecell_property_mapper (GtkTreeViewColumn *col, GtkCellRenderer *cell, g_free (text); } +static void +notify_store_color (GtkListStore *store, GtkTreeIter *iter, const PaletteColor *color) +{ +#if GTK_CHECK_VERSION(3,0,0) + const GdkRGBA *rgba = color; + gtk_list_store_set (store, iter, COLOUR_COLUMN, rgba, -1); +#else + gtk_list_store_set (store, iter, COLOUR_COLUMN, color, -1); +#endif +} + static void notify_row_cb (GtkTreeSelection *sel, GtkTreeView *view) { @@ -200,7 +211,8 @@ notify_gui_update (void) if (!valid) /* create new tree row if required */ gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, name, 1, status, - 2, server, 3, seen, 4, &colors[4], 5, NULL, -1); + 2, server, 3, seen, 5, NULL, -1); + notify_store_color (store, &iter, &colors[4]); if (valid) valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter); @@ -225,7 +237,8 @@ notify_gui_update (void) if (!valid) /* create new tree row if required */ gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, name, 1, status, - 2, server, 3, seen, 4, &colors[3], 5, servnot, -1); + 2, server, 3, seen, 5, servnot, -1); + notify_store_color (store, &iter, &colors[3]); if (valid) valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter); diff --git a/src/fe-gtk/palette.c b/src/fe-gtk/palette.c index 2eecb7c6..f6b59fbf 100644 --- a/src/fe-gtk/palette.c +++ b/src/fe-gtk/palette.c @@ -49,9 +49,11 @@ palette_color_set_rgb16 (PaletteColor *color, guint16 red, guint16 green, guint1 { #if GTK_CHECK_VERSION(3,0,0) char buf[8]; + GdkRGBA parsed; g_snprintf (buf, sizeof (buf), "#%02x%02x%02x", red >> 8, green >> 8, blue >> 8); - gdk_rgba_parse (color, buf); + gdk_rgba_parse (&parsed, buf); + *color = parsed; #else color->red = red; color->green = green; diff --git a/src/fe-gtk/setup.c b/src/fe-gtk/setup.c index 0a2f37f6..08648a06 100644 --- a/src/fe-gtk/setup.c +++ b/src/fe-gtk/setup.c @@ -1540,7 +1540,10 @@ setup_color_response_cb (GtkDialog *dialog, gint response_id, gpointer user_data if (response_id == GTK_RESPONSE_OK) { - gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog), data->color); + GdkRGBA rgba; + + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog), &rgba); + *data->color = rgba; color_change = TRUE; setup_color_button_apply (data->button, data->color); diff --git a/src/fe-gtk/userlistgui.c b/src/fe-gtk/userlistgui.c index 3515cd35..04b408d3 100644 --- a/src/fe-gtk/userlistgui.c +++ b/src/fe-gtk/userlistgui.c @@ -46,7 +46,7 @@ enum COL_NICK=1, /* char * */ COL_HOST=2, /* char * */ COL_USER=3, /* struct User * */ - COL_GDKCOLOR=4 /* PaletteColor * */ + COL_GDKCOLOR=4 /* PaletteColor */ }; @@ -327,8 +327,8 @@ fe_userlist_rehash (session *sess, struct User *user) gtk_list_store_set (GTK_LIST_STORE (sess->res->user_model), iter, COL_HOST, user->hostname, - COL_GDKCOLOR, nick_color ? &colors[nick_color] : NULL, -1); + userlist_store_color (GTK_LIST_STORE (sess->res->user_model), iter, nick_color); } void @@ -362,8 +362,8 @@ fe_userlist_insert (session *sess, struct User *newuser, gboolean sel) COL_NICK, nick, COL_HOST, newuser->hostname, COL_USER, newuser, - COL_GDKCOLOR, nick_color ? &colors[nick_color] : NULL, -1); + userlist_store_color (GTK_LIST_STORE (model), &iter, nick_color); if (!prefs.hex_gui_ulist_icons) { @@ -467,6 +467,19 @@ userlist_ops_cmp (GtkTreeModel *model, GtkTreeIter *iter_a, GtkTreeIter *iter_b, return nick_cmp_az_ops (((session*)userdata)->server, user_a, user_b); } +static void +userlist_store_color (GtkListStore *store, GtkTreeIter *iter, int color_index) +{ + const PaletteColor *color = color_index ? &colors[color_index] : NULL; + +#if GTK_CHECK_VERSION(3,0,0) + const GdkRGBA *rgba = color; + gtk_list_store_set (store, iter, COL_GDKCOLOR, rgba, -1); +#else + gtk_list_store_set (store, iter, COL_GDKCOLOR, color, -1); +#endif +} + GtkListStore * userlist_create_model (session *sess) {