From 49d16a7eb4932a83259f3c0db848e5181df5539d Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 23 Jul 2022 17:02:22 +0800 Subject: [PATCH] Undo C parts of "Don't use the Gtk region face" This reverts commit a24f710395f9777cb9f8b000300e5e9c892d7794, apart from the change to faces.el and NEWS. --- src/gtkutil.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/gtkutil.h | 3 ++ src/pgtkterm.c | 4 ++- src/xfns.c | 6 +++- 4 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/gtkutil.c b/src/gtkutil.c index 87f166bf54d..a6bba096a43 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -727,6 +727,88 @@ get_utf8_string (const char *str) return utf8_str; } +/* Check for special colors used in face spec for region face. + The colors are fetched from the Gtk+ theme. + Return true if color was found, false if not. */ + +bool +xg_check_special_colors (struct frame *f, + const char *color_name, + Emacs_Color *color) +{ + bool success_p; + bool get_bg; + bool get_fg; +#ifdef HAVE_GTK3 + GtkStyleContext *gsty; + GdkRGBA col; + char buf[sizeof "rgb://rrrr/gggg/bbbb"]; + int state; + GdkRGBA *c; + unsigned short r, g, b; +#else + GtkStyle *gsty; + GdkColor *grgb; +#endif + + get_bg = !strcmp ("gtk_selection_bg_color", color_name); + get_fg = !get_bg && !strcmp ("gtk_selection_fg_color", color_name); + success_p = false; + +#ifdef HAVE_PGTK + while (FRAME_PARENT_FRAME (f)) + f = FRAME_PARENT_FRAME (f); +#endif + + if (!FRAME_GTK_WIDGET (f) || !(get_bg || get_fg)) + return success_p; + + block_input (); +#ifdef HAVE_GTK3 + gsty = gtk_widget_get_style_context (FRAME_GTK_OUTER_WIDGET (f)); + state = GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_FOCUSED; + + if (get_fg) + gtk_style_context_get_color (gsty, state, &col); + else + { + /* FIXME: Retrieving the background color is deprecated in + GTK+ 3.16. New versions of GTK+ don't use the concept of a + single background color any more, so we shouldn't query for + it. */ + gtk_style_context_get (gsty, state, + GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &c, + NULL); + col = *c; + gdk_rgba_free (c); + } + + r = col.red * 65535; + g = col.green * 65535; + b = col.blue * 65535; +#ifndef HAVE_PGTK + sprintf (buf, "rgb:%04x/%04x/%04x", r, g, b); + success_p = x_parse_color (f, buf, color) != 0; +#else + sprintf (buf, "#%04x%04x%04x", r, g, b); + success_p = pgtk_parse_color (f, buf, color) != 0; +#endif +#else + gsty = gtk_widget_get_style (FRAME_GTK_WIDGET (f)); + grgb = (get_bg ? &gsty->bg[GTK_STATE_SELECTED] + : &gsty->fg[GTK_STATE_SELECTED]); + + color->red = grgb->red; + color->green = grgb->green; + color->blue = grgb->blue; + color->pixel = grgb->pixel; + success_p = 1; +#endif + unblock_input (); + return success_p; +} + + /*********************************************************************** Tooltips diff --git a/src/gtkutil.h b/src/gtkutil.h index 32b1fedbaa6..190d6628314 100644 --- a/src/gtkutil.h +++ b/src/gtkutil.h @@ -179,6 +179,9 @@ extern GdkCursor * xg_create_default_cursor (GdkDisplay *gdpy); extern bool xg_create_frame_widgets (struct frame *f); extern void xg_free_frame_widgets (struct frame *f); extern void xg_set_background_color (struct frame *f, unsigned long bg); +extern bool xg_check_special_colors (struct frame *f, + const char *color_name, + Emacs_Color *color); #ifdef HAVE_PGTK extern void xg_create_frame_outer_widgets (struct frame *f); #endif diff --git a/src/pgtkterm.c b/src/pgtkterm.c index 54e70255f45..b283cef7cde 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c @@ -6913,7 +6913,9 @@ pgtk_defined_color (struct frame *f, const char *name, int r; block_input (); - r = pgtk_parse_color (f, name, color_def); + r = xg_check_special_colors (f, name, color_def); + if (!r) + r = pgtk_parse_color (f, name, color_def); unblock_input (); return r; } diff --git a/src/xfns.c b/src/xfns.c index 7d394bd4f50..ce867c1619c 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -670,7 +670,11 @@ x_defined_color (struct frame *f, const char *color_name, Colormap cmap = FRAME_X_COLORMAP (f); block_input (); - success_p = x_parse_color (f, color_name, color) != 0; +#ifdef USE_GTK + success_p = xg_check_special_colors (f, color_name, color); +#endif + if (!success_p) + success_p = x_parse_color (f, color_name, color) != 0; if (success_p && alloc_p) success_p = x_alloc_nearest_color (f, cmap, color); unblock_input (); -- 2.39.2