mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-02 10:11:05 -08:00
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.
This commit is contained in:
parent
92ebfe7da4
commit
7ad1df5e16
4 changed files with 80 additions and 11 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
46
src/xfns.c
46
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
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue