diff --git a/src/fe-gtk/theme/theme-access.c b/src/fe-gtk/theme/theme-access.c index ff86db45..0c713f8a 100644 --- a/src/fe-gtk/theme/theme-access.c +++ b/src/fe-gtk/theme/theme-access.c @@ -27,10 +27,47 @@ enum { - THEME_XTEXT_FG_INDEX = 34, - THEME_XTEXT_BG_INDEX = 35 + THEME_XTEXT_MIRC_COLS = 99, + THEME_XTEXT_MARK_FG_INDEX = 99, + THEME_XTEXT_MARK_BG_INDEX = 100, + THEME_XTEXT_FG_INDEX = 101, + THEME_XTEXT_BG_INDEX = 102, + THEME_XTEXT_MARKER_INDEX = 103 }; +static const guint8 theme_default_99_mirc_colors[THEME_XTEXT_MIRC_COLS][3] = { + { 0xff, 0xff, 0xff }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x7f }, { 0x00, 0x93, 0x00 }, { 0xff, 0x00, 0x00 }, { 0x7f, 0x00, 0x00 }, { 0x9c, 0x00, 0x9c }, { 0xfc, 0x7f, 0x00 }, + { 0xff, 0xff, 0x00 }, { 0x00, 0xfc, 0x00 }, { 0x00, 0x93, 0x93 }, { 0x00, 0xff, 0xff }, { 0x00, 0x00, 0xfc }, { 0xff, 0x00, 0xff }, { 0x7f, 0x7f, 0x7f }, { 0xd2, 0xd2, 0xd2 }, + { 0x47, 0x00, 0x00 }, { 0x47, 0x21, 0x00 }, { 0x47, 0x47, 0x00 }, { 0x32, 0x47, 0x00 }, { 0x00, 0x47, 0x00 }, { 0x00, 0x47, 0x2c }, { 0x00, 0x47, 0x47 }, { 0x00, 0x2f, 0x47 }, + { 0x00, 0x00, 0x47 }, { 0x2e, 0x00, 0x47 }, { 0x47, 0x00, 0x47 }, { 0x47, 0x00, 0x2a }, { 0x74, 0x00, 0x00 }, { 0x74, 0x3a, 0x00 }, { 0x74, 0x74, 0x00 }, { 0x51, 0x74, 0x00 }, + { 0x00, 0x74, 0x00 }, { 0x00, 0x74, 0x49 }, { 0x00, 0x74, 0x74 }, { 0x00, 0x4d, 0x74 }, { 0x00, 0x00, 0x74 }, { 0x4b, 0x00, 0x74 }, { 0x74, 0x00, 0x74 }, { 0x74, 0x00, 0x45 }, + { 0xb5, 0x00, 0x00 }, { 0xb5, 0x63, 0x00 }, { 0xb5, 0xb5, 0x00 }, { 0x7d, 0xb5, 0x00 }, { 0x00, 0xb5, 0x00 }, { 0x00, 0xb5, 0x71 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0x75, 0xb5 }, + { 0x00, 0x00, 0xb5 }, { 0x75, 0x00, 0xb5 }, { 0xb5, 0x00, 0xb5 }, { 0xb5, 0x00, 0x6b }, { 0xff, 0x00, 0x00 }, { 0xff, 0x8c, 0x00 }, { 0xff, 0xff, 0x00 }, { 0xb2, 0xff, 0x00 }, + { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xa0 }, { 0x00, 0xff, 0xff }, { 0x00, 0xa9, 0xff }, { 0x00, 0x00, 0xff }, { 0xa5, 0x00, 0xff }, { 0xff, 0x00, 0xff }, { 0xff, 0x00, 0x98 }, + { 0xff, 0x59, 0x59 }, { 0xff, 0xb4, 0x59 }, { 0xff, 0xff, 0x71 }, { 0xcf, 0xff, 0x60 }, { 0x6f, 0xff, 0x6f }, { 0x65, 0xff, 0xc9 }, { 0x6d, 0xff, 0xff }, { 0x59, 0xcd, 0xff }, + { 0x59, 0x59, 0xff }, { 0xc4, 0x59, 0xff }, { 0xff, 0x66, 0xff }, { 0xff, 0x59, 0xbc }, { 0xff, 0x9c, 0x9c }, { 0xff, 0xd3, 0x9c }, { 0xff, 0xff, 0x9c }, { 0xe2, 0xff, 0x9c }, + { 0x9c, 0xff, 0x9c }, { 0x9c, 0xff, 0xdb }, { 0x9c, 0xff, 0xff }, { 0x9c, 0xe2, 0xff }, { 0x9c, 0x9c, 0xff }, { 0xdc, 0x9c, 0xff }, { 0xff, 0x9c, 0xff }, { 0xff, 0x94, 0xd3 }, + { 0x00, 0x00, 0x00 }, { 0x13, 0x13, 0x13 }, { 0x28, 0x28, 0x28 }, { 0x36, 0x36, 0x36 }, { 0x4d, 0x4d, 0x4d }, { 0x65, 0x65, 0x65 }, { 0x81, 0x81, 0x81 }, { 0x9f, 0x9f, 0x9f }, + { 0xbc, 0xbc, 0xbc }, { 0xe2, 0xe2, 0xe2 }, { 0xff, 0xff, 0xff } +}; + +static void +theme_access_apply_default_99_palette (XTextColor *palette, size_t palette_len, gboolean apply_base) +{ + size_t i; + size_t start = apply_base ? 0 : 32; + + if (palette_len == 0) + return; + for (i = start; i < THEME_XTEXT_MIRC_COLS && i < palette_len; i++) + { + palette[i].red = theme_default_99_mirc_colors[i][0] / 255.0; + palette[i].green = theme_default_99_mirc_colors[i][1] / 255.0; + palette[i].blue = theme_default_99_mirc_colors[i][2] / 255.0; + palette[i].alpha = 1.0; + } +} + static gboolean theme_token_to_rgb16 (ThemeSemanticToken token, guint16 *red, guint16 *green, guint16 *blue) { @@ -83,9 +120,18 @@ gboolean theme_get_mirc_color (unsigned int mirc_index, GdkRGBA *out_rgba) { ThemeSemanticToken token = (ThemeSemanticToken) (THEME_TOKEN_MIRC_0 + (int) mirc_index); + gboolean has_user_colors = theme_runtime_mode_has_user_colors (theme_runtime_is_dark_active ()); - if (mirc_index >= 32) + if (mirc_index >= THEME_XTEXT_MIRC_COLS) return FALSE; + if (!has_user_colors || mirc_index >= 32) + { + out_rgba->red = theme_default_99_mirc_colors[mirc_index][0] / 255.0; + out_rgba->green = theme_default_99_mirc_colors[mirc_index][1] / 255.0; + out_rgba->blue = theme_default_99_mirc_colors[mirc_index][2] / 255.0; + out_rgba->alpha = 1.0; + return TRUE; + } return theme_runtime_get_color (token, out_rgba); } @@ -99,9 +145,17 @@ gboolean theme_get_mirc_color_rgb16 (unsigned int mirc_index, guint16 *red, guint16 *green, guint16 *blue) { ThemeSemanticToken token = (ThemeSemanticToken) (THEME_TOKEN_MIRC_0 + (int) mirc_index); + gboolean has_user_colors = theme_runtime_mode_has_user_colors (theme_runtime_is_dark_active ()); - if (mirc_index >= 32) + if (mirc_index >= THEME_XTEXT_MIRC_COLS) return FALSE; + if (!has_user_colors || mirc_index >= 32) + { + *red = (guint16) (theme_default_99_mirc_colors[mirc_index][0] * 257); + *green = (guint16) (theme_default_99_mirc_colors[mirc_index][1] * 257); + *blue = (guint16) (theme_default_99_mirc_colors[mirc_index][2] * 257); + return TRUE; + } return theme_token_to_rgb16 (token, red, green, blue); } @@ -145,12 +199,39 @@ void theme_get_xtext_colors_for_widget (GtkWidget *widget, XTextColor *palette, size_t palette_len) { ThemeWidgetStyleValues style_values; + gboolean has_user_colors; + GdkRGBA marker_color; if (!palette) return; theme_get_widget_style_values_for_widget (widget, &style_values); theme_runtime_get_xtext_colors (palette, palette_len); + has_user_colors = theme_runtime_mode_has_user_colors (theme_runtime_is_dark_active ()); + theme_access_apply_default_99_palette (palette, palette_len, !has_user_colors); + if (palette_len > THEME_XTEXT_MARK_FG_INDEX) + { + palette[THEME_XTEXT_MARK_FG_INDEX].red = style_values.selection_foreground.red; + palette[THEME_XTEXT_MARK_FG_INDEX].green = style_values.selection_foreground.green; + palette[THEME_XTEXT_MARK_FG_INDEX].blue = style_values.selection_foreground.blue; + palette[THEME_XTEXT_MARK_FG_INDEX].alpha = style_values.selection_foreground.alpha; + } + if (palette_len > THEME_XTEXT_MARK_BG_INDEX) + { + palette[THEME_XTEXT_MARK_BG_INDEX].red = style_values.selection_background.red; + palette[THEME_XTEXT_MARK_BG_INDEX].green = style_values.selection_background.green; + palette[THEME_XTEXT_MARK_BG_INDEX].blue = style_values.selection_background.blue; + palette[THEME_XTEXT_MARK_BG_INDEX].alpha = style_values.selection_background.alpha; + } + if (palette_len > THEME_XTEXT_MARKER_INDEX) + { + if (!theme_runtime_get_color (THEME_TOKEN_MARKER, &marker_color)) + marker_color = style_values.selection_background; + palette[THEME_XTEXT_MARKER_INDEX].red = marker_color.red; + palette[THEME_XTEXT_MARKER_INDEX].green = marker_color.green; + palette[THEME_XTEXT_MARKER_INDEX].blue = marker_color.blue; + palette[THEME_XTEXT_MARKER_INDEX].alpha = marker_color.alpha; + } if (palette_len > THEME_XTEXT_FG_INDEX) { palette[THEME_XTEXT_FG_INDEX].red = style_values.foreground.red; diff --git a/src/fe-gtk/theme/theme-runtime.c b/src/fe-gtk/theme/theme-runtime.c index e9c504e7..e8870762 100644 --- a/src/fe-gtk/theme/theme-runtime.c +++ b/src/fe-gtk/theme/theme-runtime.c @@ -326,7 +326,8 @@ theme_runtime_get_color (ThemeSemanticToken token, GdkRGBA *out_rgba) gboolean theme_runtime_mode_has_user_colors (gboolean dark_mode) { - (void) dark_mode; + if (dark_mode) + return dark_user_colors_valid; return user_colors_valid; } @@ -467,7 +468,6 @@ theme_runtime_load (void) active_palette = light_palette; dark_mode_active = FALSE; - user_colors_valid = TRUE; } static gboolean diff --git a/src/fe-gtk/xtext.h b/src/fe-gtk/xtext.h index 3f2df515..b31caf17 100644 --- a/src/fe-gtk/xtext.h +++ b/src/fe-gtk/xtext.h @@ -49,14 +49,14 @@ GType gtk_xtext_get_type (void); #define ATTR_UNDERLINE '\037' /* these match palette.h */ -#define XTEXT_MIRC_COLS 32 -#define XTEXT_COLS 37 /* 32 plus 5 for extra stuff below */ -#define XTEXT_MARK_FG 32 /* for marking text */ -#define XTEXT_MARK_BG 33 -#define XTEXT_FG 34 -#define XTEXT_BG 35 -#define XTEXT_MARKER 36 /* for marker line */ -#define XTEXT_MAX_COLOR 41 +#define XTEXT_MIRC_COLS 99 +#define XTEXT_COLS 104 /* 99 plus 5 for extra stuff below */ +#define XTEXT_MARK_FG 99 /* for marking text */ +#define XTEXT_MARK_BG 100 +#define XTEXT_FG 101 +#define XTEXT_BG 102 +#define XTEXT_MARKER 103 /* for marker line */ +#define XTEXT_MAX_COLOR 98 typedef struct textentry textentry; /*