aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-07-23 17:02:22 +0800
committerPo Lu2022-07-23 17:03:04 +0800
commit49d16a7eb4932a83259f3c0db848e5181df5539d (patch)
tree8b3dab0128443cb4eb46c8b183c82c13747fa860 /src
parenta24f710395f9777cb9f8b000300e5e9c892d7794 (diff)
downloademacs-49d16a7eb4932a83259f3c0db848e5181df5539d.tar.gz
emacs-49d16a7eb4932a83259f3c0db848e5181df5539d.zip
Undo C parts of "Don't use the Gtk region face"
This reverts commit a24f710395f9777cb9f8b000300e5e9c892d7794, apart from the change to faces.el and NEWS.
Diffstat (limited to 'src')
-rw-r--r--src/gtkutil.c82
-rw-r--r--src/gtkutil.h3
-rw-r--r--src/pgtkterm.c4
-rw-r--r--src/xfns.c6
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)
727 return utf8_str; 727 return utf8_str;
728} 728}
729 729
730/* Check for special colors used in face spec for region face.
731 The colors are fetched from the Gtk+ theme.
732 Return true if color was found, false if not. */
733
734bool
735xg_check_special_colors (struct frame *f,
736 const char *color_name,
737 Emacs_Color *color)
738{
739 bool success_p;
740 bool get_bg;
741 bool get_fg;
742#ifdef HAVE_GTK3
743 GtkStyleContext *gsty;
744 GdkRGBA col;
745 char buf[sizeof "rgb://rrrr/gggg/bbbb"];
746 int state;
747 GdkRGBA *c;
748 unsigned short r, g, b;
749#else
750 GtkStyle *gsty;
751 GdkColor *grgb;
752#endif
753
754 get_bg = !strcmp ("gtk_selection_bg_color", color_name);
755 get_fg = !get_bg && !strcmp ("gtk_selection_fg_color", color_name);
756 success_p = false;
757
758#ifdef HAVE_PGTK
759 while (FRAME_PARENT_FRAME (f))
760 f = FRAME_PARENT_FRAME (f);
761#endif
762
763 if (!FRAME_GTK_WIDGET (f) || !(get_bg || get_fg))
764 return success_p;
765
766 block_input ();
767#ifdef HAVE_GTK3
768 gsty = gtk_widget_get_style_context (FRAME_GTK_OUTER_WIDGET (f));
769 state = GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_FOCUSED;
770
771 if (get_fg)
772 gtk_style_context_get_color (gsty, state, &col);
773 else
774 {
775 /* FIXME: Retrieving the background color is deprecated in
776 GTK+ 3.16. New versions of GTK+ don't use the concept of a
777 single background color any more, so we shouldn't query for
778 it. */
779 gtk_style_context_get (gsty, state,
780 GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &c,
781 NULL);
782 col = *c;
783 gdk_rgba_free (c);
784 }
785
786 r = col.red * 65535;
787 g = col.green * 65535;
788 b = col.blue * 65535;
789#ifndef HAVE_PGTK
790 sprintf (buf, "rgb:%04x/%04x/%04x", r, g, b);
791 success_p = x_parse_color (f, buf, color) != 0;
792#else
793 sprintf (buf, "#%04x%04x%04x", r, g, b);
794 success_p = pgtk_parse_color (f, buf, color) != 0;
795#endif
796#else
797 gsty = gtk_widget_get_style (FRAME_GTK_WIDGET (f));
798 grgb = (get_bg ? &gsty->bg[GTK_STATE_SELECTED]
799 : &gsty->fg[GTK_STATE_SELECTED]);
800
801 color->red = grgb->red;
802 color->green = grgb->green;
803 color->blue = grgb->blue;
804 color->pixel = grgb->pixel;
805 success_p = 1;
806#endif
807 unblock_input ();
808 return success_p;
809}
810
811
730 812
731/*********************************************************************** 813/***********************************************************************
732 Tooltips 814 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);
179extern bool xg_create_frame_widgets (struct frame *f); 179extern bool xg_create_frame_widgets (struct frame *f);
180extern void xg_free_frame_widgets (struct frame *f); 180extern void xg_free_frame_widgets (struct frame *f);
181extern void xg_set_background_color (struct frame *f, unsigned long bg); 181extern void xg_set_background_color (struct frame *f, unsigned long bg);
182extern bool xg_check_special_colors (struct frame *f,
183 const char *color_name,
184 Emacs_Color *color);
182#ifdef HAVE_PGTK 185#ifdef HAVE_PGTK
183extern void xg_create_frame_outer_widgets (struct frame *f); 186extern void xg_create_frame_outer_widgets (struct frame *f);
184#endif 187#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,
6913 int r; 6913 int r;
6914 6914
6915 block_input (); 6915 block_input ();
6916 r = pgtk_parse_color (f, name, color_def); 6916 r = xg_check_special_colors (f, name, color_def);
6917 if (!r)
6918 r = pgtk_parse_color (f, name, color_def);
6917 unblock_input (); 6919 unblock_input ();
6918 return r; 6920 return r;
6919} 6921}
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,
670 Colormap cmap = FRAME_X_COLORMAP (f); 670 Colormap cmap = FRAME_X_COLORMAP (f);
671 671
672 block_input (); 672 block_input ();
673 success_p = x_parse_color (f, color_name, color) != 0; 673#ifdef USE_GTK
674 success_p = xg_check_special_colors (f, color_name, color);
675#endif
676 if (!success_p)
677 success_p = x_parse_color (f, color_name, color) != 0;
674 if (success_p && alloc_p) 678 if (success_p && alloc_p)
675 success_p = x_alloc_nearest_color (f, cmap, color); 679 success_p = x_alloc_nearest_color (f, cmap, color);
676 unblock_input (); 680 unblock_input ();