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.
This commit is contained in:
2026-01-20 12:26:01 -07:00
parent cd52ebd7e8
commit dbb9168426
5 changed files with 57 additions and 27 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)
{