emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 49d16a7eb4: Undo C parts of "Don't use the Gtk region face"


From: Po Lu
Subject: master 49d16a7eb4: Undo C parts of "Don't use the Gtk region face"
Date: Sat, 23 Jul 2022 05:03:39 -0400 (EDT)

branch: master
commit 49d16a7eb4932a83259f3c0db848e5181df5539d
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    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 87f166bf54..a6bba096a4 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 32b1fedbaa..190d662831 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 54e70255f4..b283cef7cd 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 7d394bd4f5..ce867c1619 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 ();



reply via email to

[Prev in Thread] Current Thread [Next in Thread]