emacs-diffs
[Top][All Lists]
Advanced

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

master 7ad1df5e16 1/2: Implement customization of scroll bar colors on G


From: Po Lu
Subject: master 7ad1df5e16 1/2: Implement customization of scroll bar colors on GTK 3
Date: Fri, 11 Mar 2022 07:27:52 -0500 (EST)

branch: master
commit 7ad1df5e1684532efeec435be4ac7fc76affc814
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Implement customization of scroll bar colors on GTK 3
    
    * src/gtkutil.c (xg_create_frame_widgets): Create CSS providers
    for scroll bars.
    (xg_finish_scroll_bar_creation): Attach created CSS providers.
    * src/xfns.c (x_set_scroll_bar_foreground):
    (x_set_scroll_bar_background): Put appropriate content into CSS
    providers.
    * src/xterm.c (x_free_frame_resources): Free CSS providers.
    * src/xterm.h (struct x_output): New fields for scroll bar
    stylesheet providers.
---
 src/gtkutil.c | 30 +++++++++++++++++++-----------
 src/xfns.c    | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 src/xterm.c   |  8 ++++++++
 src/xterm.h   |  7 +++++++
 4 files changed, 80 insertions(+), 11 deletions(-)

diff --git a/src/gtkutil.c b/src/gtkutil.c
index 1b4ecaf949..f488b0ff75 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -1612,10 +1612,7 @@ xg_create_frame_widgets (struct frame *f)
      with regular X drawing primitives, so from a GTK/GDK point of
      view, the widget is totally blank.  When an expose comes, this
      will make the widget blank, and then Emacs redraws it.  This flickers
-     a lot, so we turn off double buffering.
-     FIXME: gtk_widget_set_double_buffered is deprecated and might stop
-     working in the future.  We need to migrate away from combining
-     X and GTK+ drawing to a pure GTK+ build.  */
+     a lot, so we turn off double buffering.  */
 
 #ifndef HAVE_PGTK
   gtk_widget_set_double_buffered (wfixed, FALSE);
@@ -1634,6 +1631,14 @@ xg_create_frame_widgets (struct frame *f)
                     G_CALLBACK (delete_cb), f);
 #endif
 
+#if defined HAVE_GTK3 && !defined HAVE_PGTK
+  /* On PGTK this is done in Fx_create_frame.  */
+  FRAME_OUTPUT_DATA (f)->scrollbar_background_css_provider
+    = gtk_css_provider_new ();
+  FRAME_OUTPUT_DATA (f)->scrollbar_foreground_css_provider
+    = gtk_css_provider_new ();
+#endif
+
   /* Convert our geometry parameters into a geometry string
      and specify it.
      GTK will itself handle calculating the real position this way.  */
@@ -4448,6 +4453,10 @@ xg_finish_scroll_bar_creation (struct frame *f,
                                const char *scroll_bar_name)
 {
   GtkWidget *webox = gtk_event_box_new ();
+#ifdef HAVE_GTK3
+  GtkCssProvider *foreground_provider;
+  GtkCssProvider *background_provider;
+#endif
 
   gtk_widget_set_name (wscroll, scroll_bar_name);
 #ifndef HAVE_GTK3
@@ -4496,15 +4505,14 @@ xg_finish_scroll_bar_creation (struct frame *f,
   /* Set the cursor to an arrow.  */
   xg_set_cursor (webox, FRAME_DISPLAY_INFO (f)->xg_cursor);
 
-#ifdef HAVE_PGTK
+#ifdef HAVE_GTK3
   GtkStyleContext *ctxt = gtk_widget_get_style_context (wscroll);
-  gtk_style_context_add_provider (ctxt,
-                                 GTK_STYLE_PROVIDER (FRAME_OUTPUT_DATA (f)->
-                                                     
scrollbar_foreground_css_provider),
+  foreground_provider = FRAME_OUTPUT_DATA 
(f)->scrollbar_foreground_css_provider;
+  background_provider = FRAME_OUTPUT_DATA 
(f)->scrollbar_background_css_provider;
+
+  gtk_style_context_add_provider (ctxt, GTK_STYLE_PROVIDER 
(foreground_provider),
                                  GTK_STYLE_PROVIDER_PRIORITY_USER);
-  gtk_style_context_add_provider (ctxt,
-                                 GTK_STYLE_PROVIDER (FRAME_OUTPUT_DATA (f)->
-                                                     
scrollbar_background_css_provider),
+  gtk_style_context_add_provider (ctxt, GTK_STYLE_PROVIDER 
(background_provider),
                                  GTK_STYLE_PROVIDER_PRIORITY_USER);
 #endif
 
diff --git a/src/xfns.c b/src/xfns.c
index a3236efbcc..65f3b5097c 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -1943,6 +1943,10 @@ static void
 x_set_scroll_bar_foreground (struct frame *f, Lisp_Object value, Lisp_Object 
oldval)
 {
   unsigned long pixel;
+#ifdef HAVE_GTK3
+  XColor color;
+  char css[64];
+#endif
 
   if (STRINGP (value))
     pixel = x_decode_color (f, value, BLACK_PIX_DEFAULT (f));
@@ -1964,6 +1968,25 @@ x_set_scroll_bar_foreground (struct frame *f, 
Lisp_Object value, Lisp_Object old
       update_face_from_frame_parameter (f, Qscroll_bar_foreground, value);
       redraw_frame (f);
     }
+
+#ifdef HAVE_GTK3
+  if (pixel != -1)
+    {
+      color.pixel = pixel;
+
+      XQueryColor (FRAME_X_DISPLAY (f),
+                  FRAME_X_COLORMAP (f),
+                  &color);
+
+      sprintf (css, "scrollbar slider { background-color: #%02x%02x%02x; }",
+              color.red >> 8, color.green >> 8, color.blue >> 8);
+      gtk_css_provider_load_from_data (FRAME_X_OUTPUT 
(f)->scrollbar_foreground_css_provider,
+                                      css, -1, NULL);
+    }
+  else
+    gtk_css_provider_load_from_data (FRAME_X_OUTPUT 
(f)->scrollbar_foreground_css_provider,
+                                    "", -1, NULL);
+#endif
 }
 
 
@@ -1976,6 +1999,10 @@ static void
 x_set_scroll_bar_background (struct frame *f, Lisp_Object value, Lisp_Object 
oldval)
 {
   unsigned long pixel;
+#ifdef HAVE_GTK3
+  XColor color;
+  char css[64];
+#endif
 
   if (STRINGP (value))
     pixel = x_decode_color (f, value, WHITE_PIX_DEFAULT (f));
@@ -2011,6 +2038,25 @@ x_set_scroll_bar_background (struct frame *f, 
Lisp_Object value, Lisp_Object old
       update_face_from_frame_parameter (f, Qscroll_bar_background, value);
       redraw_frame (f);
     }
+
+#ifdef HAVE_GTK3
+  if (pixel != -1)
+    {
+      color.pixel = pixel;
+
+      XQueryColor (FRAME_X_DISPLAY (f),
+                  FRAME_X_COLORMAP (f),
+                  &color);
+
+      sprintf (css, "scrollbar trough { background-color: #%02x%02x%02x; }",
+              color.red >> 8, color.green >> 8, color.blue >> 8);
+      gtk_css_provider_load_from_data (FRAME_X_OUTPUT 
(f)->scrollbar_background_css_provider,
+                                      css, -1, NULL);
+    }
+  else
+    gtk_css_provider_load_from_data (FRAME_X_OUTPUT 
(f)->scrollbar_background_css_provider,
+                                    "", -1, NULL);
+#endif
 }
 
 
diff --git a/src/xterm.c b/src/xterm.c
index 2adf70b829..cf79135497 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -16579,6 +16579,14 @@ x_free_frame_resources (struct frame *f)
       XFlush (FRAME_X_DISPLAY (f));
     }
 
+#ifdef HAVE_GTK3
+  if (FRAME_OUTPUT_DATA (f)->scrollbar_background_css_provider)
+    g_object_unref (FRAME_OUTPUT_DATA (f)->scrollbar_background_css_provider);
+
+  if (FRAME_OUTPUT_DATA (f)->scrollbar_foreground_css_provider)
+    g_object_unref (FRAME_OUTPUT_DATA (f)->scrollbar_foreground_css_provider);
+#endif
+
   xfree (f->output_data.x->saved_menu_event);
   xfree (f->output_data.x);
   f->output_data.x = NULL;
diff --git a/src/xterm.h b/src/xterm.h
index 4875eabafe..5b199cab6b 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -758,6 +758,13 @@ struct x_output
   GtkWindow *ttip_window;
 
   GtkIMContext *im_context;
+
+#ifdef HAVE_GTK3
+  /* The CSS providers used for scroll bar foreground and background
+     colors.  */
+  GtkCssProvider *scrollbar_foreground_css_provider;
+  GtkCssProvider *scrollbar_background_css_provider;
+#endif
 #endif /* USE_GTK */
 
   /* If >=0, a bitmap index.  The indicated bitmap is used for the



reply via email to

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