From 1f33ed8034e99a304a05fe104eaa57cb57c7192a Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Sat, 14 Mar 2026 17:15:59 -0600 Subject: [PATCH] fix: style GTK selection nodes too, not just rows/cells --- src/fe-gtk/maingui.c | 20 ++++++++++++++++++ src/fe-gtk/theme/theme-css.c | 41 ++++++++++++++++++++++++++++++++---- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c index 8a4fe7c9..ad65ad2a 100644 --- a/src/fe-gtk/maingui.c +++ b/src/fe-gtk/maingui.c @@ -2415,6 +2415,20 @@ mg_apply_entry_style (GtkWidget *entry) theme_manager_apply_entry_palette (entry, input_style->font_desc); } +static gboolean +mg_entry_select_all (GtkWidget *entry, GdkEventKey *event, gpointer userdata) +{ + if ((event->state & GDK_CONTROL_MASK) && + !(event->state & (GDK_SHIFT_MASK | GDK_MOD1_MASK | GDK_META_MASK)) && + (event->keyval == GDK_KEY_a || event->keyval == GDK_KEY_A)) + { + gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1); + return TRUE; + } + + return FALSE; +} + static void mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box) { @@ -2434,6 +2448,8 @@ mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box) mg_apply_emoji_fallback_widget (gui->key_entry); g_signal_connect (G_OBJECT (gui->key_entry), "activate", G_CALLBACK (mg_key_entry_cb), NULL); + g_signal_connect (G_OBJECT (gui->key_entry), "key_press_event", + G_CALLBACK (mg_entry_select_all), NULL); if (prefs.hex_gui_input_style) mg_apply_entry_style (gui->key_entry); @@ -2447,6 +2463,8 @@ mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box) mg_apply_emoji_fallback_widget (gui->limit_entry); g_signal_connect (G_OBJECT (gui->limit_entry), "activate", G_CALLBACK (mg_limit_entry_cb), NULL); + g_signal_connect (G_OBJECT (gui->limit_entry), "key_press_event", + G_CALLBACK (mg_entry_select_all), NULL); if (prefs.hex_gui_input_style) mg_apply_entry_style (gui->limit_entry); @@ -2537,6 +2555,8 @@ mg_create_topicbar (session *sess, GtkWidget *box) mg_apply_emoji_fallback_widget (topic); g_signal_connect (G_OBJECT (topic), "activate", G_CALLBACK (mg_topic_cb), 0); + g_signal_connect (G_OBJECT (topic), "key_press_event", + G_CALLBACK (mg_entry_select_all), NULL); if (prefs.hex_gui_input_style) mg_apply_entry_style (topic); diff --git a/src/fe-gtk/theme/theme-css.c b/src/fe-gtk/theme/theme-css.c index d8480e05..6439da51 100644 --- a/src/fe-gtk/theme/theme-css.c +++ b/src/fe-gtk/theme/theme-css.c @@ -27,6 +27,12 @@ typedef struct guint16 bg_red; guint16 bg_green; guint16 bg_blue; + guint16 sel_fg_red; + guint16 sel_fg_green; + guint16 sel_fg_blue; + guint16 sel_bg_red; + guint16 sel_bg_green; + guint16 sel_bg_blue; } ThemeCssInputFingerprint; static GtkCssProvider *theme_css_input_provider; @@ -92,6 +98,12 @@ theme_css_input_fingerprint_matches (const ThemeCssInputFingerprint *next) if (theme_css_input_fp.bg_red != next->bg_red || theme_css_input_fp.bg_green != next->bg_green || theme_css_input_fp.bg_blue != next->bg_blue) return FALSE; + if (theme_css_input_fp.sel_fg_red != next->sel_fg_red || theme_css_input_fp.sel_fg_green != next->sel_fg_green + || theme_css_input_fp.sel_fg_blue != next->sel_fg_blue) + return FALSE; + if (theme_css_input_fp.sel_bg_red != next->sel_bg_red || theme_css_input_fp.sel_bg_green != next->sel_bg_green + || theme_css_input_fp.sel_bg_blue != next->sel_bg_blue) + return FALSE; if (g_strcmp0 (theme_css_input_fp.theme_name, next->theme_name) != 0) return FALSE; if (g_strcmp0 (theme_css_input_fp.font, next->font) != 0) @@ -119,7 +131,9 @@ theme_css_input_fingerprint_clear (void) static char * theme_css_build_input (const char *theme_name, guint16 fg_red, guint16 fg_green, guint16 fg_blue, - guint16 bg_red, guint16 bg_green, guint16 bg_blue) + guint16 bg_red, guint16 bg_green, guint16 bg_blue, + guint16 sel_fg_red, guint16 sel_fg_green, guint16 sel_fg_blue, + guint16 sel_bg_red, guint16 sel_bg_green, guint16 sel_bg_blue) { GString *css = g_string_new (""); @@ -137,6 +151,11 @@ theme_css_build_input (const char *theme_name, guint16 fg_red, guint16 fg_green, "%s {" "color: #%02x%02x%02x;" "caret-color: #%02x%02x%02x;" + "}" + "%s selection, %s text selection, %s:focus selection, %s:focus text selection, %s *:selected, %s *:selected:focus {" + "background-color: #%02x%02x%02x;" + "color: #%02x%02x%02x;" + "text-shadow: none;" "}", theme_css_selector_input, (bg_red >> 8), (bg_green >> 8), (bg_blue >> 8), @@ -144,7 +163,15 @@ theme_css_build_input (const char *theme_name, guint16 fg_red, guint16 fg_green, (fg_red >> 8), (fg_green >> 8), (fg_blue >> 8), theme_css_selector_input_text, (fg_red >> 8), (fg_green >> 8), (fg_blue >> 8), - (fg_red >> 8), (fg_green >> 8), (fg_blue >> 8)); + (fg_red >> 8), (fg_green >> 8), (fg_blue >> 8), + theme_css_selector_input, + theme_css_selector_input, + theme_css_selector_input, + theme_css_selector_input, + theme_css_selector_input, + theme_css_selector_input, + (sel_bg_red >> 8), (sel_bg_green >> 8), (sel_bg_blue >> 8), + (sel_fg_red >> 8), (sel_fg_green >> 8), (sel_fg_blue >> 8)); return g_string_free (css, FALSE); } @@ -177,6 +204,10 @@ theme_css_reload_input_style (gboolean enabled, const PangoFontDescription *font &next.fg_red, &next.fg_green, &next.fg_blue); theme_palette_color_get_rgb16 (&style_values.background, &next.bg_red, &next.bg_green, &next.bg_blue); + theme_palette_color_get_rgb16 (&style_values.selection_foreground, + &next.sel_fg_red, &next.sel_fg_green, &next.sel_fg_blue); + theme_palette_color_get_rgb16 (&style_values.selection_background, + &next.sel_bg_red, &next.sel_bg_green, &next.sel_bg_blue); next.colors_set = TRUE; } @@ -193,7 +224,9 @@ theme_css_reload_input_style (gboolean enabled, const PangoFontDescription *font css = theme_css_build_input (theme_name ? theme_name : "", next.fg_red, next.fg_green, next.fg_blue, - next.bg_red, next.bg_green, next.bg_blue); + next.bg_red, next.bg_green, next.bg_blue, + next.sel_fg_red, next.sel_fg_green, next.sel_fg_blue, + next.sel_bg_red, next.sel_bg_green, next.sel_bg_blue); gtk_css_provider_load_from_data (theme_css_input_provider, css, -1, NULL); g_free (css); theme_css_apply_app_provider (GTK_STYLE_PROVIDER (theme_css_input_provider)); @@ -276,7 +309,7 @@ theme_css_apply_palette_widget (GtkWidget *widget, const GdkRGBA *bg, const GdkR if (fg) g_string_append_printf (css, " color: %s;", fg_color); g_string_append (css, " }"); - g_string_append_printf (css, ".%s *:selected, .%s *:selected:focus, .%s *:selected:hover, .%s treeview.view:selected, .%s treeview.view:selected:focus, .%s treeview.view:selected:hover, .%s row:selected, .%s row:selected:focus, .%s row:selected:hover {", theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class); + g_string_append_printf (css, ".%s *:selected, .%s *:selected:focus, .%s *:selected:hover, .%s treeview.view:selected, .%s treeview.view:selected:focus, .%s treeview.view:selected:hover, .%s row:selected, .%s row:selected:focus, .%s row:selected:hover, .%s selection, .%s text selection, .%s entry selection, .%s entry text selection, .%s:focus selection, .%s:focus text selection {", theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class); if (sel_bg_color) g_string_append_printf (css, " background-color: %s;", sel_bg_color); else if (bg)