diff options
| author | Yuuki Harano | 2019-07-21 23:11:50 +0900 |
|---|---|---|
| committer | Jeff Walsh | 2020-11-22 14:46:55 +1100 |
| commit | b3a20d7a21795f4e2847938ace6dd454f6b4e870 (patch) | |
| tree | ad882363e3caf03a081ace89560cb13ac0ea0fa3 /src | |
| parent | bfbcb112484c3521cd9238e1c84aa961c2c89c2f (diff) | |
| download | emacs-b3a20d7a21795f4e2847938ace6dd454f6b4e870.tar.gz emacs-b3a20d7a21795f4e2847938ace6dd454f6b4e870.zip | |
Implement Scroll-bar-forground and scroll-bar-background
* src/pgtkterm.h (struct pgtk_output):
* src/pgtkterm.c (x_free_frame_resources):
* src/pgtkfns.c (pgtk_set_scroll_bar_foreground)
(pgtk_set_scroll_bar_background, pgtk_frame_parm_handlers)
(Fx_create_frame):
* src/gtkutil.c (xg_finish_scroll_bar_creation):handle scrollbar css values
* etc/org.gnu.emacs.defaults.gschema.xml: add scroll bar fields
scroll-bar-foreground, scroll-bar-background 実装。
Diffstat (limited to 'src')
| -rw-r--r-- | src/gtkutil.c | 8 | ||||
| -rw-r--r-- | src/pgtkfns.c | 65 | ||||
| -rw-r--r-- | src/pgtkterm.c | 16 | ||||
| -rw-r--r-- | src/pgtkterm.h | 4 |
4 files changed, 77 insertions, 16 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c index 6c2691ecd99..b202aa02e2b 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -4054,6 +4054,14 @@ xg_finish_scroll_bar_creation (struct frame *f, | |||
| 4054 | /* Set the cursor to an arrow. */ | 4054 | /* Set the cursor to an arrow. */ |
| 4055 | xg_set_cursor (webox, FRAME_DISPLAY_INFO (f)->xg_cursor); | 4055 | xg_set_cursor (webox, FRAME_DISPLAY_INFO (f)->xg_cursor); |
| 4056 | 4056 | ||
| 4057 | #ifdef HAVE_PGTK | ||
| 4058 | GtkStyleContext *ctxt = gtk_widget_get_style_context(wscroll); | ||
| 4059 | gtk_style_context_add_provider(ctxt, GTK_STYLE_PROVIDER(FRAME_OUTPUT_DATA (f)->scrollbar_foreground_css_provider), | ||
| 4060 | GTK_STYLE_PROVIDER_PRIORITY_USER); | ||
| 4061 | gtk_style_context_add_provider(ctxt, GTK_STYLE_PROVIDER(FRAME_OUTPUT_DATA (f)->scrollbar_background_css_provider), | ||
| 4062 | GTK_STYLE_PROVIDER_PRIORITY_USER); | ||
| 4063 | #endif | ||
| 4064 | |||
| 4057 | bar->x_window = scroll_id; | 4065 | bar->x_window = scroll_id; |
| 4058 | } | 4066 | } |
| 4059 | 4067 | ||
diff --git a/src/pgtkfns.c b/src/pgtkfns.c index f7edc073a02..a8f81761b3d 100644 --- a/src/pgtkfns.c +++ b/src/pgtkfns.c | |||
| @@ -743,6 +743,48 @@ pgtk_set_tool_bar_position (struct frame *f, | |||
| 743 | wrong_choice (choice, new_value); | 743 | wrong_choice (choice, new_value); |
| 744 | } | 744 | } |
| 745 | 745 | ||
| 746 | static void | ||
| 747 | pgtk_set_scroll_bar_foreground (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) | ||
| 748 | { | ||
| 749 | GtkCssProvider *css_provider = FRAME_X_OUTPUT (f)->scrollbar_foreground_css_provider; | ||
| 750 | |||
| 751 | if (NILP (new_value)) { | ||
| 752 | gtk_css_provider_load_from_data(css_provider, "", -1, NULL); | ||
| 753 | } else if (STRINGP (new_value)) { | ||
| 754 | Emacs_Color rgb; | ||
| 755 | |||
| 756 | if (!pgtk_parse_color (SSDATA (new_value), &rgb)) | ||
| 757 | error ("Unknown color."); | ||
| 758 | |||
| 759 | char css[64]; | ||
| 760 | sprintf(css, "scrollbar slider { background-color: #%06x; }", (unsigned int) rgb.pixel & 0xffffff); | ||
| 761 | gtk_css_provider_load_from_data(css_provider, css, -1, NULL); | ||
| 762 | |||
| 763 | } else | ||
| 764 | error ("Invalid scroll-bar-foreground."); | ||
| 765 | } | ||
| 766 | |||
| 767 | static void | ||
| 768 | pgtk_set_scroll_bar_background (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) | ||
| 769 | { | ||
| 770 | GtkCssProvider *css_provider = FRAME_X_OUTPUT (f)->scrollbar_background_css_provider; | ||
| 771 | |||
| 772 | if (NILP (new_value)) { | ||
| 773 | gtk_css_provider_load_from_data(css_provider, "", -1, NULL); | ||
| 774 | } else if (STRINGP (new_value)) { | ||
| 775 | Emacs_Color rgb; | ||
| 776 | |||
| 777 | if (!pgtk_parse_color (SSDATA (new_value), &rgb)) | ||
| 778 | error ("Unknown color."); | ||
| 779 | |||
| 780 | char css[64]; | ||
| 781 | sprintf(css, "scrollbar trough { background-color: #%06x; }", (unsigned int) rgb.pixel & 0xffffff); | ||
| 782 | gtk_css_provider_load_from_data(css_provider, css, -1, NULL); | ||
| 783 | |||
| 784 | } else | ||
| 785 | error ("Invalid scroll-bar-background."); | ||
| 786 | } | ||
| 787 | |||
| 746 | /* Note: see frame.c for template, also where generic functions are impl */ | 788 | /* Note: see frame.c for template, also where generic functions are impl */ |
| 747 | frame_parm_handler pgtk_frame_parm_handlers[] = | 789 | frame_parm_handler pgtk_frame_parm_handlers[] = |
| 748 | { | 790 | { |
| @@ -771,8 +813,8 @@ frame_parm_handler pgtk_frame_parm_handlers[] = | |||
| 771 | gui_set_horizontal_scroll_bars, /* generic OK */ | 813 | gui_set_horizontal_scroll_bars, /* generic OK */ |
| 772 | gui_set_visibility, /* generic OK */ | 814 | gui_set_visibility, /* generic OK */ |
| 773 | x_set_tool_bar_lines, | 815 | x_set_tool_bar_lines, |
| 774 | 0, /* x_set_scroll_bar_foreground, will ignore */ | 816 | pgtk_set_scroll_bar_foreground, |
| 775 | 0, /* x_set_scroll_bar_background, will ignore */ | 817 | pgtk_set_scroll_bar_background, |
| 776 | gui_set_screen_gamma, /* generic OK */ | 818 | gui_set_screen_gamma, /* generic OK */ |
| 777 | gui_set_line_spacing, /* generic OK, sets f->extra_line_spacing to int */ | 819 | gui_set_line_spacing, /* generic OK, sets f->extra_line_spacing to int */ |
| 778 | gui_set_left_fringe, /* generic OK */ | 820 | gui_set_left_fringe, /* generic OK */ |
| @@ -1043,13 +1085,12 @@ This function is an internal primitive--use `make-frame' instead. */) | |||
| 1043 | FRAME_X_OUTPUT(f)->icon_bitmap = -1; | 1085 | FRAME_X_OUTPUT(f)->icon_bitmap = -1; |
| 1044 | #endif | 1086 | #endif |
| 1045 | FRAME_FONTSET (f) = -1; | 1087 | FRAME_FONTSET (f) = -1; |
| 1046 | #if 0 | ||
| 1047 | FRAME_X_OUTPUT(f)->scroll_bar_foreground_pixel = -1; | ||
| 1048 | FRAME_X_OUTPUT(f)->scroll_bar_background_pixel = -1; | ||
| 1049 | #endif | ||
| 1050 | FRAME_X_OUTPUT(f)->white_relief.pixel = -1; | 1088 | FRAME_X_OUTPUT(f)->white_relief.pixel = -1; |
| 1051 | FRAME_X_OUTPUT(f)->black_relief.pixel = -1; | 1089 | FRAME_X_OUTPUT(f)->black_relief.pixel = -1; |
| 1052 | 1090 | ||
| 1091 | FRAME_X_OUTPUT(f)->scrollbar_foreground_css_provider = gtk_css_provider_new(); | ||
| 1092 | FRAME_X_OUTPUT(f)->scrollbar_background_css_provider = gtk_css_provider_new(); | ||
| 1093 | |||
| 1053 | fset_icon_name (f, | 1094 | fset_icon_name (f, |
| 1054 | gui_display_get_arg (dpyinfo, parms, Qicon_name, "iconName", "Title", | 1095 | gui_display_get_arg (dpyinfo, parms, Qicon_name, "iconName", "Title", |
| 1055 | RES_TYPE_STRING)); | 1096 | RES_TYPE_STRING)); |
| @@ -1195,14 +1236,10 @@ This function is an internal primitive--use `make-frame' instead. */) | |||
| 1195 | gui_default_parameter (f, parms, Qno_special_glyphs, Qnil, | 1236 | gui_default_parameter (f, parms, Qno_special_glyphs, Qnil, |
| 1196 | NULL, NULL, RES_TYPE_BOOLEAN); | 1237 | NULL, NULL, RES_TYPE_BOOLEAN); |
| 1197 | 1238 | ||
| 1198 | #if 0 | 1239 | gui_default_parameter (f, parms, Qscroll_bar_foreground, Qnil, |
| 1199 | x_default_scroll_bar_color_parameter (f, parms, Qscroll_bar_foreground, | 1240 | "scrollBarForeground", "ScrollBarForeground", RES_TYPE_STRING); |
| 1200 | "scrollBarForeground", | 1241 | gui_default_parameter (f, parms, Qscroll_bar_background, Qnil, |
| 1201 | "ScrollBarForeground", true); | 1242 | "scrollBarBackground", "ScrollBarBackground", RES_TYPE_STRING); |
| 1202 | x_default_scroll_bar_color_parameter (f, parms, Qscroll_bar_background, | ||
| 1203 | "scrollBarBackground", | ||
| 1204 | "ScrollBarBackground", false); | ||
| 1205 | #endif | ||
| 1206 | 1243 | ||
| 1207 | /* Init faces before gui_default_parameter is called for the | 1244 | /* Init faces before gui_default_parameter is called for the |
| 1208 | scroll-bar-width parameter because otherwise we end up in | 1245 | scroll-bar-width parameter because otherwise we end up in |
diff --git a/src/pgtkterm.c b/src/pgtkterm.c index 5890326430f..4665a934718 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c | |||
| @@ -194,8 +194,6 @@ x_free_frame_resources (struct frame *f) | |||
| 194 | if (f == hlinfo->mouse_face_mouse_frame) | 194 | if (f == hlinfo->mouse_face_mouse_frame) |
| 195 | reset_mouse_highlight (hlinfo); | 195 | reset_mouse_highlight (hlinfo); |
| 196 | 196 | ||
| 197 | gtk_widget_destroy(FRAME_GTK_OUTER_WIDGET(f)); | ||
| 198 | |||
| 199 | if (FRAME_X_OUTPUT(f)->border_color_css_provider != NULL) { | 197 | if (FRAME_X_OUTPUT(f)->border_color_css_provider != NULL) { |
| 200 | GtkStyleContext *ctxt = gtk_widget_get_style_context(FRAME_GTK_OUTER_WIDGET(f)); | 198 | GtkStyleContext *ctxt = gtk_widget_get_style_context(FRAME_GTK_OUTER_WIDGET(f)); |
| 201 | GtkCssProvider *old = FRAME_X_OUTPUT(f)->border_color_css_provider; | 199 | GtkCssProvider *old = FRAME_X_OUTPUT(f)->border_color_css_provider; |
| @@ -203,6 +201,20 @@ x_free_frame_resources (struct frame *f) | |||
| 203 | FRAME_X_OUTPUT(f)->border_color_css_provider = NULL; | 201 | FRAME_X_OUTPUT(f)->border_color_css_provider = NULL; |
| 204 | } | 202 | } |
| 205 | 203 | ||
| 204 | if (FRAME_X_OUTPUT(f)->scrollbar_foreground_css_provider != NULL) { | ||
| 205 | GtkCssProvider *old = FRAME_X_OUTPUT(f)->scrollbar_foreground_css_provider; | ||
| 206 | g_object_unref (old); | ||
| 207 | FRAME_X_OUTPUT(f)->scrollbar_foreground_css_provider = NULL; | ||
| 208 | } | ||
| 209 | |||
| 210 | if (FRAME_X_OUTPUT(f)->scrollbar_background_css_provider != NULL) { | ||
| 211 | GtkCssProvider *old = FRAME_X_OUTPUT(f)->scrollbar_background_css_provider; | ||
| 212 | g_object_unref (old); | ||
| 213 | FRAME_X_OUTPUT(f)->scrollbar_background_css_provider = NULL; | ||
| 214 | } | ||
| 215 | |||
| 216 | gtk_widget_destroy(FRAME_GTK_OUTER_WIDGET(f)); | ||
| 217 | |||
| 206 | if (FRAME_X_OUTPUT(f)->cr_surface_visible_bell != NULL) { | 218 | if (FRAME_X_OUTPUT(f)->cr_surface_visible_bell != NULL) { |
| 207 | cairo_surface_destroy(FRAME_X_OUTPUT(f)->cr_surface_visible_bell); | 219 | cairo_surface_destroy(FRAME_X_OUTPUT(f)->cr_surface_visible_bell); |
| 208 | FRAME_X_OUTPUT(f)->cr_surface_visible_bell = NULL; | 220 | FRAME_X_OUTPUT(f)->cr_surface_visible_bell = NULL; |
diff --git a/src/pgtkterm.h b/src/pgtkterm.h index c85a9ea097e..4c6ef0f6bb8 100644 --- a/src/pgtkterm.h +++ b/src/pgtkterm.h | |||
| @@ -265,6 +265,10 @@ struct pgtk_output | |||
| 265 | unsigned long border_pixel; | 265 | unsigned long border_pixel; |
| 266 | GtkCssProvider *border_color_css_provider; | 266 | GtkCssProvider *border_color_css_provider; |
| 267 | 267 | ||
| 268 | /* scrollbar color */ | ||
| 269 | GtkCssProvider *scrollbar_foreground_css_provider; | ||
| 270 | GtkCssProvider *scrollbar_background_css_provider; | ||
| 271 | |||
| 268 | /* Widget whose cursor is hourglass_cursor. This widget is temporarily | 272 | /* Widget whose cursor is hourglass_cursor. This widget is temporarily |
| 269 | mapped to display an hourglass cursor. */ | 273 | mapped to display an hourglass cursor. */ |
| 270 | GtkWidget *hourglass_widget; | 274 | GtkWidget *hourglass_widget; |