From 4ac836fc661f9ddeeb334b103bea0db26ac33f5a Mon Sep 17 00:00:00 2001 From: deepend Date: Sat, 17 Jan 2026 21:39:45 -0700 Subject: [PATCH] - Added a shared XTextColor definition and a palette conversion helper for Cairo-ready colors, decoupling renderer palettes from GdkColor usage in the API surface. - Updated xtext palette APIs to accept internal color arrays directly for rendering setup. - Wired xtext palette creation through UI entry points to use the new palette helper when constructing or refreshing text views. --- src/fe-gtk/fkeys.c | 4 +++- src/fe-gtk/maingui.c | 8 ++++++-- src/fe-gtk/palette.c | 25 ++++++++++++++++++++++++- src/fe-gtk/palette.h | 6 ++++++ src/fe-gtk/rawlog.c | 4 +++- src/fe-gtk/textgui.c | 4 +++- src/fe-gtk/xtext-color.h | 20 ++++++++++++++++++++ src/fe-gtk/xtext.c | 19 +++---------------- src/fe-gtk/xtext.h | 13 +++---------- 9 files changed, 71 insertions(+), 32 deletions(-) create mode 100644 src/fe-gtk/xtext-color.h diff --git a/src/fe-gtk/fkeys.c b/src/fe-gtk/fkeys.c index ac281764..bef7e9b5 100644 --- a/src/fe-gtk/fkeys.c +++ b/src/fe-gtk/fkeys.c @@ -803,6 +803,7 @@ key_dialog_show () GtkWidget *vbox, *box; GtkWidget *view, *xtext; GtkListStore *store; + XTextColor xtext_palette[XTEXT_COLS]; char buf[128]; if (key_dialog) @@ -816,7 +817,8 @@ key_dialog_show () NULL, 600, 360, &vbox, 0); view = key_dialog_treeview_new (vbox); - xtext = gtk_xtext_new (colors, 0); + palette_get_xtext_colors (xtext_palette, XTEXT_COLS); + xtext = gtk_xtext_new (xtext_palette, 0); gtk_box_pack_start (GTK_BOX (vbox), xtext, FALSE, TRUE, 2); gtk_xtext_set_font (GTK_XTEXT (xtext), prefs.hex_text_font); diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c index a471af7b..f6f6214b 100644 --- a/src/fe-gtk/maingui.c +++ b/src/fe-gtk/maingui.c @@ -2405,8 +2405,10 @@ mg_update_xtext (GtkWidget *wid) { GtkXText *xtext = GTK_XTEXT (wid); const gchar *font_name; + XTextColor xtext_palette[XTEXT_COLS]; - gtk_xtext_set_palette (xtext, colors); + palette_get_xtext_colors (xtext_palette, XTEXT_COLS); + gtk_xtext_set_palette (xtext, xtext_palette); gtk_xtext_set_max_lines (xtext, prefs.hex_text_max_lines); gtk_xtext_set_background (xtext, channelwin_pix); gtk_xtext_set_wordwrap (xtext, prefs.hex_text_wordwrap); @@ -2431,6 +2433,7 @@ mg_create_textarea (session *sess, GtkWidget *box) { GtkWidget *inbox, *vbox, *frame; GtkXText *xtext; + XTextColor xtext_palette[XTEXT_COLS]; session_gui *gui = sess->gui; static const GtkTargetEntry dnd_targets[] = { @@ -2451,7 +2454,8 @@ mg_create_textarea (session *sess, GtkWidget *box) gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (inbox), frame); - gui->xtext = gtk_xtext_new (colors, TRUE); + palette_get_xtext_colors (xtext_palette, XTEXT_COLS); + gui->xtext = gtk_xtext_new (xtext_palette, TRUE); xtext = GTK_XTEXT (gui->xtext); gtk_xtext_set_max_indent (xtext, prefs.hex_text_max_indent); gtk_xtext_set_thin_separator (xtext, prefs.hex_text_thin_sep); diff --git a/src/fe-gtk/palette.c b/src/fe-gtk/palette.c index a973bcc8..e35f607f 100644 --- a/src/fe-gtk/palette.c +++ b/src/fe-gtk/palette.c @@ -38,6 +38,18 @@ #include "../common/cfgfiles.h" #include "../common/typedef.h" +static XTextColor +palette_color_from_gdk (const GdkColor *color) +{ + XTextColor result; + + result.red = color->red / 65535.0; + result.green = color->green / 65535.0; + result.blue = color->blue / 65535.0; + result.alpha = 1.0; + + return result; +} GdkColor colors[] = { /* colors for xtext */ @@ -143,6 +155,18 @@ static const GdkColor dark_colors[MAX_COL + 1] = { {0, 0xf4f4, 0x4747, 0x4747}, /* 41 COL_SPELL (spellcheck underline) */ }; +void +palette_get_xtext_colors (XTextColor *palette, size_t palette_len) +{ + size_t i; + size_t count = palette_len < G_N_ELEMENTS (colors) ? palette_len : G_N_ELEMENTS (colors); + + for (i = 0; i < count; i++) + { + palette[i] = palette_color_from_gdk (&colors[i]); + } +} + void palette_user_set_color (int idx, const GdkColor *col) { @@ -399,4 +423,3 @@ palette_apply_dark_mode (gboolean enable) return changed; } - diff --git a/src/fe-gtk/palette.h b/src/fe-gtk/palette.h index 7598ed63..3c09e957 100644 --- a/src/fe-gtk/palette.h +++ b/src/fe-gtk/palette.h @@ -20,6 +20,10 @@ #ifndef HEXCHAT_PALETTE_H #define HEXCHAT_PALETTE_H +#include + +#include "xtext-color.h" + extern GdkColor colors[]; #define COL_MARK_FG 32 @@ -59,4 +63,6 @@ void palette_dark_set_color (int idx, const GdkColor *col); */ gboolean palette_apply_dark_mode (gboolean enable); +void palette_get_xtext_colors (XTextColor *palette, size_t palette_len); + #endif diff --git a/src/fe-gtk/rawlog.c b/src/fe-gtk/rawlog.c index 194e5108..284b5c6d 100644 --- a/src/fe-gtk/rawlog.c +++ b/src/fe-gtk/rawlog.c @@ -101,6 +101,7 @@ void open_rawlog (struct server *serv) { GtkWidget *bbox, *scrolledwindow, *vbox; + XTextColor xtext_palette[XTEXT_COLS]; char tbuf[256]; if (serv->gui->rawlog_window) @@ -120,7 +121,8 @@ open_rawlog (struct server *serv) gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (vbox), scrolledwindow); - serv->gui->rawlog_textlist = gtk_xtext_new (colors, 0); + palette_get_xtext_colors (xtext_palette, XTEXT_COLS); + serv->gui->rawlog_textlist = gtk_xtext_new (xtext_palette, 0); gtk_container_add (GTK_CONTAINER (scrolledwindow), serv->gui->rawlog_textlist); gtk_xtext_set_font (GTK_XTEXT (serv->gui->rawlog_textlist), prefs.hex_text_font); GTK_XTEXT (serv->gui->rawlog_textlist)->ignore_hidden = 1; diff --git a/src/fe-gtk/textgui.c b/src/fe-gtk/textgui.c index 9b8c78d6..1e9e956f 100644 --- a/src/fe-gtk/textgui.c +++ b/src/fe-gtk/textgui.c @@ -438,6 +438,7 @@ void pevent_dialog_show () { GtkWidget *vbox, *hbox, *wid, *pane; + XTextColor xtext_palette[XTEXT_COLS]; if (pevent_dialog) { @@ -462,7 +463,8 @@ pevent_dialog_show () gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wid), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_box_pack_start (GTK_BOX (vbox), wid, FALSE, TRUE, 0); - pevent_dialog_twid = gtk_xtext_new (colors, 0); + palette_get_xtext_colors (xtext_palette, XTEXT_COLS); + pevent_dialog_twid = gtk_xtext_new (xtext_palette, 0); gtk_widget_set_sensitive (pevent_dialog_twid, FALSE); gtk_widget_set_size_request (pevent_dialog_twid, -1, 75); gtk_container_add (GTK_CONTAINER (wid), pevent_dialog_twid); diff --git a/src/fe-gtk/xtext-color.h b/src/fe-gtk/xtext-color.h new file mode 100644 index 00000000..4696c134 --- /dev/null +++ b/src/fe-gtk/xtext-color.h @@ -0,0 +1,20 @@ +/* ZoiteChat + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef HEXCHAT_XTEXT_COLOR_H +#define HEXCHAT_XTEXT_COLOR_H + +typedef struct +{ + double red; + double green; + double blue; + double alpha; +} XTextColor; + +#endif diff --git a/src/fe-gtk/xtext.c b/src/fe-gtk/xtext.c index 62a7ad7d..a23406e6 100644 --- a/src/fe-gtk/xtext.c +++ b/src/fe-gtk/xtext.c @@ -150,19 +150,6 @@ static void gtk_xtext_search_fini (xtext_buffer *); static gboolean gtk_xtext_search_init (xtext_buffer *buf, const gchar *text, gtk_xtext_search_flags flags, GError **perr); static char * gtk_xtext_get_word (GtkXText * xtext, int x, int y, textentry ** ret_ent, int *ret_off, int *ret_len, GSList **slp); -static inline XTextColor -xtext_color_from_gdk (const GdkColor *color) -{ - XTextColor result; - - result.red = color->red / 65535.0; - result.green = color->green / 65535.0; - result.blue = color->blue / 65535.0; - result.alpha = 1.0; - - return result; -} - static inline void xtext_set_source_color (cairo_t *cr, const XTextColor *color, gdouble alpha) { @@ -619,7 +606,7 @@ gtk_xtext_adjustment_changed (GtkAdjustment * adj, GtkXText * xtext) } GtkWidget * -gtk_xtext_new (GdkColor palette[], int separator) +gtk_xtext_new (const XTextColor *palette, int separator) { GtkXText *xtext; @@ -3472,13 +3459,13 @@ gtk_xtext_render_line (GtkXText * xtext, textentry * ent, int line, } void -gtk_xtext_set_palette (GtkXText * xtext, GdkColor palette[]) +gtk_xtext_set_palette (GtkXText * xtext, const XTextColor *palette) { int i; for (i = (XTEXT_COLS-1); i >= 0; i--) { - xtext->palette[i] = xtext_color_from_gdk (&palette[i]); + xtext->palette[i] = palette[i]; } if (gtk_widget_get_realized (GTK_WIDGET(xtext))) diff --git a/src/fe-gtk/xtext.h b/src/fe-gtk/xtext.h index 3663413c..1d30bbe9 100644 --- a/src/fe-gtk/xtext.h +++ b/src/fe-gtk/xtext.h @@ -22,6 +22,7 @@ #include #include +#include "xtext-color.h" #define GTK_TYPE_XTEXT (gtk_xtext_get_type ()) #define GTK_XTEXT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_XTEXT, GtkXText)) @@ -56,14 +57,6 @@ typedef struct _GtkXText GtkXText; typedef struct _GtkXTextClass GtkXTextClass; typedef struct textentry textentry; -typedef struct -{ - double red; - double green; - double blue; - double alpha; -} XTextColor; - /* * offsets_t is used for retaining search information. * It is stored in the 'data' member of a GList, @@ -262,7 +255,7 @@ struct _GtkXTextClass void (*set_scroll_adjustments) (GtkXText *xtext, GtkAdjustment *hadj, GtkAdjustment *vadj); }; -GtkWidget *gtk_xtext_new (GdkColor palette[], int separator); +GtkWidget *gtk_xtext_new (const XTextColor *palette, int separator); void gtk_xtext_append (xtext_buffer *buf, unsigned char *text, int len, time_t stamp); void gtk_xtext_append_indent (xtext_buffer *buf, unsigned char *left_text, int left_len, @@ -270,7 +263,7 @@ void gtk_xtext_append_indent (xtext_buffer *buf, time_t stamp); int gtk_xtext_set_font (GtkXText *xtext, char *name); void gtk_xtext_set_background (GtkXText * xtext, cairo_surface_t *surface); -void gtk_xtext_set_palette (GtkXText * xtext, GdkColor palette[]); +void gtk_xtext_set_palette (GtkXText * xtext, const XTextColor *palette); void gtk_xtext_clear (xtext_buffer *buf, int lines); void gtk_xtext_save (GtkXText * xtext, int fh); void gtk_xtext_refresh (GtkXText * xtext);