diff options
| author | Jan D | 2010-08-11 20:28:10 +0200 |
|---|---|---|
| committer | Jan D | 2010-08-11 20:28:10 +0200 |
| commit | 3a46642b081c504b6e25c65d81999fcc0dff5fb2 (patch) | |
| tree | a7f42c1836467e6c8539cef167977a48c182ad97 /src | |
| parent | 42ca463309fdb17f04a72dad92696312bf242328 (diff) | |
| download | emacs-3a46642b081c504b6e25c65d81999fcc0dff5fb2.tar.gz emacs-3a46642b081c504b6e25c65d81999fcc0dff5fb2.zip | |
Take colors for region face (selected text) from the Gtk+ theme.
* lisp/dynamic-setting.el (dynamic-setting-handle-config-changed-event):
Handle theme-name change.
* lisp/faces.el (region): Add type gtk that uses gtk colors.
* src/gtkutil.c (xg_check_special_colors, style_changed_cb): New functions.
(xg_create_frame_widgets): Connect theme name changes to
style_changed_cb.
* src/gtkutil.h (xg_check_special_colors): Declare.
* src/xfns.c (x_defined_color): If USE_GTK, call xg_check_special_colors
first.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 9 | ||||
| -rw-r--r-- | src/gtkutil.c | 71 | ||||
| -rw-r--r-- | src/gtkutil.h | 3 | ||||
| -rw-r--r-- | src/xfns.c | 8 |
4 files changed, 89 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 89414fa4d78..1275b4a8def 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,5 +1,14 @@ | |||
| 1 | 2010-08-11 Jan Djärv <jan.h.d@swipnet.se> | 1 | 2010-08-11 Jan Djärv <jan.h.d@swipnet.se> |
| 2 | 2 | ||
| 3 | * xfns.c (x_defined_color): If USE_GTK, call xg_check_special_colors | ||
| 4 | first. | ||
| 5 | |||
| 6 | * gtkutil.h (xg_check_special_colors): Declare. | ||
| 7 | |||
| 8 | * gtkutil.c (xg_check_special_colors, style_changed_cb): New functions. | ||
| 9 | (xg_create_frame_widgets): Connect theme name changes to | ||
| 10 | style_changed_cb. | ||
| 11 | |||
| 3 | * xterm.c (emacs_class): New char[] for EMACS_CLASS. | 12 | * xterm.c (emacs_class): New char[] for EMACS_CLASS. |
| 4 | (xim_open_dpy, xim_initialize, xim_close_dpy): Use emacs_class. | 13 | (xim_open_dpy, xim_initialize, xim_close_dpy): Use emacs_class. |
| 5 | (x_term_init): Use char[] display_opt and name_opt instead of | 14 | (x_term_init): Use char[] display_opt and name_opt instead of |
diff --git a/src/gtkutil.c b/src/gtkutil.c index a9f2d103702..fd89015aedc 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -506,6 +506,41 @@ get_utf8_string (const char *str) | |||
| 506 | return utf8_str; | 506 | return utf8_str; |
| 507 | } | 507 | } |
| 508 | 508 | ||
| 509 | /* Check for special colors used in face spec for region face. | ||
| 510 | The colors are fetched from the Gtk+ theme. | ||
| 511 | Return 1 if color was found, 0 if not. */ | ||
| 512 | |||
| 513 | int | ||
| 514 | xg_check_special_colors (struct frame *f, | ||
| 515 | const char *color_name, | ||
| 516 | XColor *color) | ||
| 517 | { | ||
| 518 | int success_p = 0; | ||
| 519 | if (FRAME_GTK_WIDGET (f)) | ||
| 520 | { | ||
| 521 | if (strcmp ("gtk_selection_bg_color", color_name) == 0) | ||
| 522 | { | ||
| 523 | GtkStyle *gsty = gtk_widget_get_style (FRAME_GTK_WIDGET (f)); | ||
| 524 | color->red = gsty->bg[GTK_STATE_SELECTED].red; | ||
| 525 | color->green = gsty->bg[GTK_STATE_SELECTED].green; | ||
| 526 | color->blue = gsty->bg[GTK_STATE_SELECTED].blue; | ||
| 527 | color->pixel = gsty->bg[GTK_STATE_SELECTED].pixel; | ||
| 528 | success_p = 1; | ||
| 529 | } | ||
| 530 | else if (strcmp ("gtk_selection_fg_color", color_name) == 0) | ||
| 531 | { | ||
| 532 | GtkStyle *gsty = gtk_widget_get_style (FRAME_GTK_WIDGET (f)); | ||
| 533 | color->red = gsty->fg[GTK_STATE_SELECTED].red; | ||
| 534 | color->green = gsty->fg[GTK_STATE_SELECTED].green; | ||
| 535 | color->blue = gsty->fg[GTK_STATE_SELECTED].blue; | ||
| 536 | color->pixel = gsty->fg[GTK_STATE_SELECTED].pixel; | ||
| 537 | success_p = 1; | ||
| 538 | } | ||
| 539 | } | ||
| 540 | |||
| 541 | return success_p; | ||
| 542 | } | ||
| 543 | |||
| 509 | 544 | ||
| 510 | 545 | ||
| 511 | /*********************************************************************** | 546 | /*********************************************************************** |
| @@ -898,6 +933,26 @@ xg_pix_to_gcolor (GtkWidget *w, long unsigned int pixel, GdkColor *c) | |||
| 898 | gdk_colormap_query_color (map, pixel, c); | 933 | gdk_colormap_query_color (map, pixel, c); |
| 899 | } | 934 | } |
| 900 | 935 | ||
| 936 | /* Callback called when the gtk theme changes. | ||
| 937 | We notify lisp code so it can fix faces used for region for example. */ | ||
| 938 | |||
| 939 | static void | ||
| 940 | style_changed_cb (GObject *go, | ||
| 941 | GParamSpec *spec, | ||
| 942 | gpointer user_data) | ||
| 943 | { | ||
| 944 | struct input_event event; | ||
| 945 | GdkDisplay *gdpy = (GdkDisplay *) user_data; | ||
| 946 | const char *display_name = gdk_display_get_name (gdpy); | ||
| 947 | |||
| 948 | EVENT_INIT (event); | ||
| 949 | event.kind = CONFIG_CHANGED_EVENT; | ||
| 950 | event.frame_or_window = make_string (display_name, strlen (display_name)); | ||
| 951 | /* Theme doesn't change often, so intern is called seldom. */ | ||
| 952 | event.arg = intern ("theme-name"); | ||
| 953 | kbd_buffer_store_event (&event); | ||
| 954 | } | ||
| 955 | |||
| 901 | /* Create and set up the GTK widgets for frame F. | 956 | /* Create and set up the GTK widgets for frame F. |
| 902 | Return 0 if creation failed, non-zero otherwise. */ | 957 | Return 0 if creation failed, non-zero otherwise. */ |
| 903 | 958 | ||
| @@ -1023,6 +1078,22 @@ xg_create_frame_widgets (FRAME_PTR f) | |||
| 1023 | g_signal_connect (wtop, "query-tooltip", G_CALLBACK (qttip_cb), f); | 1078 | g_signal_connect (wtop, "query-tooltip", G_CALLBACK (qttip_cb), f); |
| 1024 | #endif | 1079 | #endif |
| 1025 | 1080 | ||
| 1081 | { | ||
| 1082 | GdkScreen *screen = gtk_widget_get_screen (wtop); | ||
| 1083 | GtkSettings *gs = gtk_settings_get_for_screen (screen); | ||
| 1084 | /* Only connect this signal once per screen. */ | ||
| 1085 | if (! g_signal_handler_find (G_OBJECT (gs), | ||
| 1086 | G_SIGNAL_MATCH_FUNC, | ||
| 1087 | 0, 0, 0, | ||
| 1088 | G_CALLBACK (style_changed_cb), | ||
| 1089 | 0)) | ||
| 1090 | { | ||
| 1091 | g_signal_connect (G_OBJECT (gs), "notify::gtk-theme-name", | ||
| 1092 | G_CALLBACK (style_changed_cb), | ||
| 1093 | gdk_screen_get_display (screen)); | ||
| 1094 | } | ||
| 1095 | } | ||
| 1096 | |||
| 1026 | UNBLOCK_INPUT; | 1097 | UNBLOCK_INPUT; |
| 1027 | 1098 | ||
| 1028 | return 1; | 1099 | return 1; |
diff --git a/src/gtkutil.h b/src/gtkutil.h index 6e86425fb74..9b796e1138c 100644 --- a/src/gtkutil.h +++ b/src/gtkutil.h | |||
| @@ -156,6 +156,9 @@ extern void x_wm_set_size_hint (FRAME_PTR f, | |||
| 156 | long flags, | 156 | long flags, |
| 157 | int user_position); | 157 | int user_position); |
| 158 | extern void xg_set_background_color (FRAME_PTR f, unsigned long bg); | 158 | extern void xg_set_background_color (FRAME_PTR f, unsigned long bg); |
| 159 | extern int xg_check_special_colors (struct frame *f, | ||
| 160 | const char *color_name, | ||
| 161 | XColor *color); | ||
| 159 | 162 | ||
| 160 | extern void xg_set_frame_icon (FRAME_PTR f, | 163 | extern void xg_set_frame_icon (FRAME_PTR f, |
| 161 | Pixmap icon_pixmap, | 164 | Pixmap icon_pixmap, |
diff --git a/src/xfns.c b/src/xfns.c index bc28ccd3a63..8544d9e3e10 100644 --- a/src/xfns.c +++ b/src/xfns.c | |||
| @@ -648,12 +648,16 @@ int | |||
| 648 | x_defined_color (struct frame *f, const char *color_name, | 648 | x_defined_color (struct frame *f, const char *color_name, |
| 649 | XColor *color, int alloc_p) | 649 | XColor *color, int alloc_p) |
| 650 | { | 650 | { |
| 651 | int success_p; | 651 | int success_p = 0; |
| 652 | Display *dpy = FRAME_X_DISPLAY (f); | 652 | Display *dpy = FRAME_X_DISPLAY (f); |
| 653 | Colormap cmap = FRAME_X_COLORMAP (f); | 653 | Colormap cmap = FRAME_X_COLORMAP (f); |
| 654 | 654 | ||
| 655 | BLOCK_INPUT; | 655 | BLOCK_INPUT; |
| 656 | success_p = XParseColor (dpy, cmap, color_name, color); | 656 | #ifdef USE_GTK |
| 657 | success_p = xg_check_special_colors (f, color_name, color); | ||
| 658 | #endif | ||
| 659 | if (!success_p) | ||
| 660 | success_p = XParseColor (dpy, cmap, color_name, color); | ||
| 657 | if (success_p && alloc_p) | 661 | if (success_p && alloc_p) |
| 658 | success_p = x_alloc_nearest_color (f, cmap, color); | 662 | success_p = x_alloc_nearest_color (f, cmap, color); |
| 659 | UNBLOCK_INPUT; | 663 | UNBLOCK_INPUT; |