- 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.
This commit is contained in:
2026-01-17 21:39:45 -07:00
parent 5986e6a78b
commit 4ac836fc66
9 changed files with 71 additions and 32 deletions

View File

@@ -803,6 +803,7 @@ key_dialog_show ()
GtkWidget *vbox, *box; GtkWidget *vbox, *box;
GtkWidget *view, *xtext; GtkWidget *view, *xtext;
GtkListStore *store; GtkListStore *store;
XTextColor xtext_palette[XTEXT_COLS];
char buf[128]; char buf[128];
if (key_dialog) if (key_dialog)
@@ -816,7 +817,8 @@ key_dialog_show ()
NULL, 600, 360, &vbox, 0); NULL, 600, 360, &vbox, 0);
view = key_dialog_treeview_new (vbox); 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_box_pack_start (GTK_BOX (vbox), xtext, FALSE, TRUE, 2);
gtk_xtext_set_font (GTK_XTEXT (xtext), prefs.hex_text_font); gtk_xtext_set_font (GTK_XTEXT (xtext), prefs.hex_text_font);

View File

@@ -2405,8 +2405,10 @@ mg_update_xtext (GtkWidget *wid)
{ {
GtkXText *xtext = GTK_XTEXT (wid); GtkXText *xtext = GTK_XTEXT (wid);
const gchar *font_name; 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_max_lines (xtext, prefs.hex_text_max_lines);
gtk_xtext_set_background (xtext, channelwin_pix); gtk_xtext_set_background (xtext, channelwin_pix);
gtk_xtext_set_wordwrap (xtext, prefs.hex_text_wordwrap); gtk_xtext_set_wordwrap (xtext, prefs.hex_text_wordwrap);
@@ -2431,6 +2433,7 @@ mg_create_textarea (session *sess, GtkWidget *box)
{ {
GtkWidget *inbox, *vbox, *frame; GtkWidget *inbox, *vbox, *frame;
GtkXText *xtext; GtkXText *xtext;
XTextColor xtext_palette[XTEXT_COLS];
session_gui *gui = sess->gui; session_gui *gui = sess->gui;
static const GtkTargetEntry dnd_targets[] = 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_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (inbox), frame); 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); xtext = GTK_XTEXT (gui->xtext);
gtk_xtext_set_max_indent (xtext, prefs.hex_text_max_indent); gtk_xtext_set_max_indent (xtext, prefs.hex_text_max_indent);
gtk_xtext_set_thin_separator (xtext, prefs.hex_text_thin_sep); gtk_xtext_set_thin_separator (xtext, prefs.hex_text_thin_sep);

View File

@@ -38,6 +38,18 @@
#include "../common/cfgfiles.h" #include "../common/cfgfiles.h"
#include "../common/typedef.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[] = { GdkColor colors[] = {
/* colors for xtext */ /* colors for xtext */
@@ -143,6 +155,18 @@ static const GdkColor dark_colors[MAX_COL + 1] = {
{0, 0xf4f4, 0x4747, 0x4747}, /* 41 COL_SPELL (spellcheck underline) */ {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 void
palette_user_set_color (int idx, const GdkColor *col) palette_user_set_color (int idx, const GdkColor *col)
{ {
@@ -399,4 +423,3 @@ palette_apply_dark_mode (gboolean enable)
return changed; return changed;
} }

View File

@@ -20,6 +20,10 @@
#ifndef HEXCHAT_PALETTE_H #ifndef HEXCHAT_PALETTE_H
#define HEXCHAT_PALETTE_H #define HEXCHAT_PALETTE_H
#include <stddef.h>
#include "xtext-color.h"
extern GdkColor colors[]; extern GdkColor colors[];
#define COL_MARK_FG 32 #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); gboolean palette_apply_dark_mode (gboolean enable);
void palette_get_xtext_colors (XTextColor *palette, size_t palette_len);
#endif #endif

View File

@@ -101,6 +101,7 @@ void
open_rawlog (struct server *serv) open_rawlog (struct server *serv)
{ {
GtkWidget *bbox, *scrolledwindow, *vbox; GtkWidget *bbox, *scrolledwindow, *vbox;
XTextColor xtext_palette[XTEXT_COLS];
char tbuf[256]; char tbuf[256];
if (serv->gui->rawlog_window) 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_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (vbox), scrolledwindow); 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_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_set_font (GTK_XTEXT (serv->gui->rawlog_textlist), prefs.hex_text_font);
GTK_XTEXT (serv->gui->rawlog_textlist)->ignore_hidden = 1; GTK_XTEXT (serv->gui->rawlog_textlist)->ignore_hidden = 1;

View File

@@ -438,6 +438,7 @@ void
pevent_dialog_show () pevent_dialog_show ()
{ {
GtkWidget *vbox, *hbox, *wid, *pane; GtkWidget *vbox, *hbox, *wid, *pane;
XTextColor xtext_palette[XTEXT_COLS];
if (pevent_dialog) 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_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); 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_sensitive (pevent_dialog_twid, FALSE);
gtk_widget_set_size_request (pevent_dialog_twid, -1, 75); gtk_widget_set_size_request (pevent_dialog_twid, -1, 75);
gtk_container_add (GTK_CONTAINER (wid), pevent_dialog_twid); gtk_container_add (GTK_CONTAINER (wid), pevent_dialog_twid);

20
src/fe-gtk/xtext-color.h Normal file
View File

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

View File

@@ -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 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 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 static inline void
xtext_set_source_color (cairo_t *cr, const XTextColor *color, gdouble alpha) 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 * GtkWidget *
gtk_xtext_new (GdkColor palette[], int separator) gtk_xtext_new (const XTextColor *palette, int separator)
{ {
GtkXText *xtext; GtkXText *xtext;
@@ -3472,13 +3459,13 @@ gtk_xtext_render_line (GtkXText * xtext, textentry * ent, int line,
} }
void void
gtk_xtext_set_palette (GtkXText * xtext, GdkColor palette[]) gtk_xtext_set_palette (GtkXText * xtext, const XTextColor *palette)
{ {
int i; int i;
for (i = (XTEXT_COLS-1); i >= 0; 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))) if (gtk_widget_get_realized (GTK_WIDGET(xtext)))

View File

@@ -22,6 +22,7 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <cairo.h> #include <cairo.h>
#include "xtext-color.h"
#define GTK_TYPE_XTEXT (gtk_xtext_get_type ()) #define GTK_TYPE_XTEXT (gtk_xtext_get_type ())
#define GTK_XTEXT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_XTEXT, GtkXText)) #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 _GtkXTextClass GtkXTextClass;
typedef struct textentry textentry; typedef struct textentry textentry;
typedef struct
{
double red;
double green;
double blue;
double alpha;
} XTextColor;
/* /*
* offsets_t is used for retaining search information. * offsets_t is used for retaining search information.
* It is stored in the 'data' member of a GList, * 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); 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 (xtext_buffer *buf, unsigned char *text, int len, time_t stamp);
void gtk_xtext_append_indent (xtext_buffer *buf, void gtk_xtext_append_indent (xtext_buffer *buf,
unsigned char *left_text, int left_len, unsigned char *left_text, int left_len,
@@ -270,7 +263,7 @@ void gtk_xtext_append_indent (xtext_buffer *buf,
time_t stamp); time_t stamp);
int gtk_xtext_set_font (GtkXText *xtext, char *name); int gtk_xtext_set_font (GtkXText *xtext, char *name);
void gtk_xtext_set_background (GtkXText * xtext, cairo_surface_t *surface); 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_clear (xtext_buffer *buf, int lines);
void gtk_xtext_save (GtkXText * xtext, int fh); void gtk_xtext_save (GtkXText * xtext, int fh);
void gtk_xtext_refresh (GtkXText * xtext); void gtk_xtext_refresh (GtkXText * xtext);