diff options
author | Jan Djärv <jan.h.d@swipnet.se> | 2010-04-20 20:52:07 +0200 |
---|---|---|
committer | Jan Djärv <jan.h.d@swipnet.se> | 2010-04-20 20:52:07 +0200 |
commit | f904c0f93825fb434f802ced019c378a20ec491d (patch) | |
tree | 8c3423c4680c054cd4ede1c2d01438d64f328a67 /src/xsettings.c | |
parent | c632dfda11b0ad6a144704dc473e4ff6bbac0990 (diff) | |
download | emacs-f904c0f93825fb434f802ced019c378a20ec491d.tar.gz |
Gtk tool bars can be text, icons with text or just icons.
* xsettings.c: Qmonospace_font_name, Qtool_bar_style and
current_tool_bar_style are new.
(store_config_changed_event): Rename from store_font_changed_event.
(XSETTINGS_TOOL_BAR_STYLE): New define.
(SEEN_FONT, SEEN_TB_STYLE): New enum values.
(struct xsettings): Add font and tb_style, set xft stuff inside #ifdef
HAVE_XFT.
(something_changedCB): store_font_changed_event is now
store_config_changed_event
(parse_settings): Rename from parse_xft_settings. Read
non-xft xsettings outside #ifdef HAVE_XFT.
(read_settings): Renamed from read_xft_settings.
(apply_xft_settings): Take current settings as parameter. Do not
call read_(xft)_settings.
(read_and_apply_settings): New function.
(xft_settings_event): Do non-xft stuff out of HAVE_XFT. Call
read_and_apply_settings if there are settings to be read.
(init_xsettings): Renamed from init_xfd_settings.
Call read_and_apply_settings unconditionally.
(xsettings_initialize): Call init_xsettings.
(Ftool_bar_get_system_style): New function.
(syms_of_xsettings): Define Qmonospace_font_name and
Qtool_bar_style. Initialize current_tool_bar_style to nil.
defsubr Stool_bar_get_system_style. Fprovide on
dynamic-setting.
* xsettings.h (Ftool_bar_get_system_style): Declare.
* xdisp.c: Vtool_bar_style, tool_bar_max_label_size,
Qtext, Qboth, Qboth_horiz are new.
(syms_of_xdisp): Intern Qtext, Qboth, Qboth_horiz, DEFVAR
Vtool_bar_style, tool_bar_max_label_size.
* lisp.h: Extern declare Qtext, Qboth, Qboth_horiz.
* keyboard.c: QClabel is new.
(parse_tool_bar_item): Take out QClabel from tool bar items.
Try to construct a label if ther is no QClabel.
(syms_of_keyboard): Intern :label as QClabel.
* dispextern.h (tool_bar_item_idx): TOOL_BAR_ITEM_LABEL is new.
(Vtool_bar_style, tool_bar_max_label_size, DEFAULT_TOOL_BAR_LABEL_SIZE):
New.
* Makefile.in (SOME_MACHINE_LISP): font-setting.el renamed to
dynamic-setting.el.
* gtkutil.c (xg_tool_bar_menu_proxy): Handle label in tool bar item.
(xg_make_tool_item, xg_show_toolbar_item): New function.
(update_frame_tool_bar): Take label from TOOL_BAR_ITEM_LABEL.
Call xg_make_tool_item to make a tool bar item.
Call xg_show_toolbar_item. Use wtoolbar instead of x->toolbar_widget.
* xterm.c (x_draw_image_relief): Take Vtool_bar_button_margin
into account for toolbars.
* vc-dir.el (vc-dir-tool-bar-map): Add :label on some tool bar items.
* tool-bar.el (tool-bar-setup): Add :label on some tool bar items.
* loadup.el: Load dynamic-setting.el if feature dynamic-setting
is present.
* info.el (info-tool-bar-map): Add labels.
* cus-start.el (all): Add tool-bar-style and tool-bar-max-label-size.
* cus-edit.el (custom-commands): Add labels for tool bar.
(custom-buffer-create-internal, Custom-mode): Adjust for
labels in custom-commands.
* dynamic-setting.el: Renamed from font-setting.el.
Diffstat (limited to 'src/xsettings.c')
-rw-r--r-- | src/xsettings.c | 254 |
1 files changed, 169 insertions, 85 deletions
diff --git a/src/xsettings.c b/src/xsettings.c index 1db7a24ebad..b30e79b904e 100644 --- a/src/xsettings.c +++ b/src/xsettings.c @@ -41,10 +41,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ static char *current_mono_font; static char *current_font; static struct x_display_info *first_dpyinfo; -static Lisp_Object Qfont_name, Qfont_render; +static Lisp_Object Qmonospace_font_name, Qfont_name, Qfont_render, + Qtool_bar_style; static int use_system_font; static Lisp_Object Vxft_settings; - +static Lisp_Object current_tool_bar_style; #ifdef HAVE_GCONF static GConfClient *gconf_client; @@ -52,7 +53,7 @@ static GConfClient *gconf_client; static void -store_font_changed_event (arg, display_name) +store_config_changed_event (arg, display_name) Lisp_Object arg; Lisp_Object display_name; { @@ -64,13 +65,38 @@ store_font_changed_event (arg, display_name) kbd_buffer_store_event (&event); } -#define XSETTINGS_FONT_NAME "Gtk/FontName" +#define XSETTINGS_FONT_NAME "Gtk/FontName" +#define XSETTINGS_TOOL_BAR_STYLE "Gtk/ToolbarStyle" #ifdef HAVE_GCONF #define SYSTEM_MONO_FONT "/desktop/gnome/interface/monospace_font_name" #define SYSTEM_FONT "/desktop/gnome/interface/font_name" +enum { + SEEN_AA = 0x01, + SEEN_HINTING = 0x02, + SEEN_RGBA = 0x04, + SEEN_LCDFILTER = 0x08, + SEEN_HINTSTYLE = 0x10, + SEEN_DPI = 0x20, + SEEN_FONT = 0x40, + SEEN_TB_STYLE = 0x80, +}; +struct xsettings +{ +#ifdef HAVE_XFT + FcBool aa, hinting; + int rgba, lcdfilter, hintstyle; + double dpi; +#endif + + char *font; + char *tb_style; + + unsigned seen; +}; + /* Callback called when something changed in GConf that we care about, that is SYSTEM_MONO_FONT. */ @@ -105,8 +131,8 @@ something_changedCB (client, cnxn_id, entry, user_data) found = dpyinfo == first_dpyinfo; if (found && use_system_font) - store_font_changed_event (Qfont_name, - XCAR (first_dpyinfo->name_list_element)); + store_config_changed_event (Qmonospace_font_name, + XCAR (first_dpyinfo->name_list_element)); } } #endif /* HAVE_GCONF */ @@ -124,6 +150,8 @@ something_changedCB (client, cnxn_id, entry, user_data) #define FC_LCD_FILTER "lcdfilter" #endif +#endif /* HAVE_XFT */ + /* Find the window that contains the XSETTINGS property values. */ static void @@ -144,23 +172,6 @@ get_prop_window (dpyinfo) XUngrabServer (dpy); } -enum { - SEEN_AA = 0x01, - SEEN_HINTING = 0x02, - SEEN_RGBA = 0x04, - SEEN_LCDFILTER = 0x08, - SEEN_HINTSTYLE = 0x10, - SEEN_DPI = 0x20, -}; -struct xsettings -{ - FcBool aa, hinting; - int rgba, lcdfilter, hintstyle; - double dpi; - - unsigned seen; -}; - #define SWAP32(nr) (((nr) << 24) | (((nr) << 8) & 0xff0000) \ | (((nr) >> 8) & 0xff00) | ((nr) >> 24)) #define SWAP16(nr) (((nr) << 8) | ((nr) >> 8)) @@ -217,7 +228,7 @@ struct xsettings */ static int -parse_xft_settings (prop, bytes, settings) +parse_settings (prop, bytes, settings) unsigned char *prop; unsigned long bytes; struct xsettings *settings; @@ -268,8 +279,13 @@ parse_xft_settings (prop, bytes, settings) bytes_parsed += 4; /* Skip serial for this value */ if (bytes_parsed > bytes) return BadLength; - want_this = (nlen > 6 && strncmp (name, "Xft/", 4) == 0) - || (strcmp (XSETTINGS_FONT_NAME, name) == 0); + want_this = +#ifdef HAVE_XFT + (nlen > 6 && strncmp (name, "Xft/", 4) == 0) + || +#endif + (strcmp (XSETTINGS_FONT_NAME, name) == 0) + || (strcmp (XSETTINGS_TOOL_BAR_STYLE, name) == 0); switch (type) { @@ -311,7 +327,18 @@ parse_xft_settings (prop, bytes, settings) if (want_this) { ++settings_seen; - if (strcmp (name, "Xft/Antialias") == 0) + if (strcmp (name, XSETTINGS_FONT_NAME) == 0) + { + settings->font = xstrdup (sval); + settings->seen |= SEEN_FONT; + } + else if (strcmp (name, XSETTINGS_TOOL_BAR_STYLE) == 0) + { + settings->tb_style = xstrdup (sval); + settings->seen |= SEEN_TB_STYLE; + } +#ifdef HAVE_XFT + else if (strcmp (name, "Xft/Antialias") == 0) { settings->seen |= SEEN_AA; settings->aa = ival != 0; @@ -366,11 +393,7 @@ parse_xft_settings (prop, bytes, settings) else settings->seen &= ~SEEN_LCDFILTER; } - else if (strcmp (name, XSETTINGS_FONT_NAME) == 0) - { - free (current_font); - current_font = xstrdup (sval); - } +#endif /* HAVE_XFT */ } } @@ -378,7 +401,7 @@ parse_xft_settings (prop, bytes, settings) } static int -read_xft_settings (dpyinfo, settings) +read_settings (dpyinfo, settings) struct x_display_info *dpyinfo; struct xsettings *settings; { @@ -400,7 +423,7 @@ read_xft_settings (dpyinfo, settings) if (rc == Success && prop != NULL && act_form == 8 && nitems > 0 && act_type == dpyinfo->Xatom_xsettings_prop) - rc = parse_xft_settings (prop, nitems, settings); + rc = parse_settings (prop, nitems, settings); XFree (prop); @@ -411,18 +434,17 @@ read_xft_settings (dpyinfo, settings) static void -apply_xft_settings (dpyinfo, send_event_p) +apply_xft_settings (dpyinfo, send_event_p, settings) struct x_display_info *dpyinfo; int send_event_p; + struct xsettings *settings; { +#ifdef HAVE_XFT FcPattern *pat; - struct xsettings settings, oldsettings; + struct xsettings oldsettings; int changed = 0; char buf[256]; - if (!read_xft_settings (dpyinfo, &settings)) - return; - memset (&oldsettings, 0, sizeof (oldsettings)); buf[0] = '\0'; pat = FcPatternCreate (); @@ -436,74 +458,74 @@ apply_xft_settings (dpyinfo, send_event_p) FcPatternGetInteger (pat, FC_RGBA, 0, &oldsettings.rgba); FcPatternGetDouble (pat, FC_DPI, 0, &oldsettings.dpi); - if ((settings.seen & SEEN_AA) != 0 && oldsettings.aa != settings.aa) + if ((settings->seen & SEEN_AA) != 0 && oldsettings.aa != settings->aa) { FcPatternDel (pat, FC_ANTIALIAS); - FcPatternAddBool (pat, FC_ANTIALIAS, settings.aa); + FcPatternAddBool (pat, FC_ANTIALIAS, settings->aa); ++changed; - oldsettings.aa = settings.aa; + oldsettings.aa = settings->aa; } sprintf (buf, "Antialias: %d", oldsettings.aa); - if ((settings.seen & SEEN_HINTING) != 0 - && oldsettings.hinting != settings.hinting) + if ((settings->seen & SEEN_HINTING) != 0 + && oldsettings.hinting != settings->hinting) { FcPatternDel (pat, FC_HINTING); - FcPatternAddBool (pat, FC_HINTING, settings.hinting); + FcPatternAddBool (pat, FC_HINTING, settings->hinting); ++changed; - oldsettings.hinting = settings.hinting; + oldsettings.hinting = settings->hinting; } if (strlen (buf) > 0) strcat (buf, ", "); sprintf (buf+strlen (buf), "Hinting: %d", oldsettings.hinting); - if ((settings.seen & SEEN_RGBA) != 0 && oldsettings.rgba != settings.rgba) + if ((settings->seen & SEEN_RGBA) != 0 && oldsettings.rgba != settings->rgba) { FcPatternDel (pat, FC_RGBA); - FcPatternAddInteger (pat, FC_RGBA, settings.rgba); - oldsettings.rgba = settings.rgba; + FcPatternAddInteger (pat, FC_RGBA, settings->rgba); + oldsettings.rgba = settings->rgba; ++changed; } if (strlen (buf) > 0) strcat (buf, ", "); sprintf (buf+strlen (buf), "RGBA: %d", oldsettings.rgba); /* Older fontconfig versions don't have FC_LCD_FILTER. */ - if ((settings.seen & SEEN_LCDFILTER) != 0 - && oldsettings.lcdfilter != settings.lcdfilter) + if ((settings->seen & SEEN_LCDFILTER) != 0 + && oldsettings.lcdfilter != settings->lcdfilter) { FcPatternDel (pat, FC_LCD_FILTER); - FcPatternAddInteger (pat, FC_LCD_FILTER, settings.lcdfilter); + FcPatternAddInteger (pat, FC_LCD_FILTER, settings->lcdfilter); ++changed; - oldsettings.lcdfilter = settings.lcdfilter; + oldsettings.lcdfilter = settings->lcdfilter; } if (strlen (buf) > 0) strcat (buf, ", "); sprintf (buf+strlen (buf), "LCDFilter: %d", oldsettings.lcdfilter); - if ((settings.seen & SEEN_HINTSTYLE) != 0 - && oldsettings.hintstyle != settings.hintstyle) + if ((settings->seen & SEEN_HINTSTYLE) != 0 + && oldsettings.hintstyle != settings->hintstyle) { FcPatternDel (pat, FC_HINT_STYLE); - FcPatternAddInteger (pat, FC_HINT_STYLE, settings.hintstyle); + FcPatternAddInteger (pat, FC_HINT_STYLE, settings->hintstyle); ++changed; - oldsettings.hintstyle = settings.hintstyle; + oldsettings.hintstyle = settings->hintstyle; } if (strlen (buf) > 0) strcat (buf, ", "); sprintf (buf+strlen (buf), "Hintstyle: %d", oldsettings.hintstyle); - if ((settings.seen & SEEN_DPI) != 0 && oldsettings.dpi != settings.dpi - && settings.dpi > 0) + if ((settings->seen & SEEN_DPI) != 0 && oldsettings.dpi != settings->dpi + && settings->dpi > 0) { Lisp_Object frame, tail; FcPatternDel (pat, FC_DPI); - FcPatternAddDouble (pat, FC_DPI, settings.dpi); + FcPatternAddDouble (pat, FC_DPI, settings->dpi); ++changed; - oldsettings.dpi = settings.dpi; + oldsettings.dpi = settings->dpi; /* Change the DPI on this display and all frames on the display. */ - dpyinfo->resy = dpyinfo->resx = settings.dpi; + dpyinfo->resy = dpyinfo->resx = settings->dpi; FOR_EACH_FRAME (tail, frame) if (FRAME_X_P (XFRAME (frame)) && FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo) - XFRAME (frame)->resy = XFRAME (frame)->resx = settings.dpi; + XFRAME (frame)->resy = XFRAME (frame)->resx = settings->dpi; } if (strlen (buf) > 0) strcat (buf, ", "); @@ -513,23 +535,68 @@ apply_xft_settings (dpyinfo, send_event_p) { XftDefaultSet (dpyinfo->display, pat); if (send_event_p) - store_font_changed_event (Qfont_render, - XCAR (dpyinfo->name_list_element)); + store_config_changed_event (Qfont_render, + XCAR (dpyinfo->name_list_element)); Vxft_settings = make_string (buf, strlen (buf)); } else FcPatternDestroy (pat); +#endif /* HAVE_XFT */ } -#endif /* HAVE_XFT */ +static void +read_and_apply_settings (dpyinfo, send_event_p) + struct x_display_info *dpyinfo; + int send_event_p; +{ + struct xsettings settings; + Lisp_Object dpyname = XCAR (dpyinfo->name_list_element); + + if (!read_settings (dpyinfo, &settings)) + return; + + apply_xft_settings (dpyinfo, True, &settings); + if (settings.seen & SEEN_TB_STYLE) + { + Lisp_Object style = Qnil; + if (strcmp (settings.tb_style, "both") == 0) + style = Qboth; + else if (strcmp (settings.tb_style, "both-horiz") == 0) + style = Qboth_horiz; + else if (strcmp (settings.tb_style, "icons") == 0) + style = Qimage; + else if (strcmp (settings.tb_style, "text") == 0) + style = Qtext; + if (!NILP (style) && !EQ (style, current_tool_bar_style)) + { + current_tool_bar_style = style; + if (send_event_p) + store_config_changed_event (Qtool_bar_style, dpyname); + } + free (settings.tb_style); + } + + if (settings.seen & SEEN_FONT) + { + if (strcmp (current_font, settings.font) != 0) + { + free (current_font); + current_font = settings.font; + if (send_event_p) + store_config_changed_event (Qfont_name, dpyname); + } + else + free (settings.font); + } +} void xft_settings_event (dpyinfo, event) struct x_display_info *dpyinfo; XEvent *event; { -#ifdef HAVE_XFT int check_window_p = 0; + int apply_settings = 0; switch (event->type) { @@ -549,20 +616,21 @@ xft_settings_event (dpyinfo, event) if (event->xproperty.window == dpyinfo->xsettings_window && event->xproperty.state == PropertyNewValue && event->xproperty.atom == dpyinfo->Xatom_xsettings_prop) - { - apply_xft_settings (dpyinfo, True); - } + apply_settings = 1; break; } + if (check_window_p) { dpyinfo->xsettings_window = None; get_prop_window (dpyinfo); if (dpyinfo->xsettings_window != None) - apply_xft_settings (dpyinfo, True); + apply_settings = 1; } -#endif /* HAVE_XFT */ + + if (apply_settings) + read_and_apply_settings (dpyinfo, True); } @@ -600,10 +668,9 @@ init_gconf () } static void -init_xfd_settings (dpyinfo) +init_xsettings (dpyinfo) struct x_display_info *dpyinfo; { -#ifdef HAVE_XFT char sel[64]; Display *dpy = dpyinfo->display; @@ -622,18 +689,9 @@ init_xfd_settings (dpyinfo) get_prop_window (dpyinfo); if (dpyinfo->xsettings_window != None) - apply_xft_settings (dpyinfo, False); + read_and_apply_settings (dpyinfo, False); UNBLOCK_INPUT; - -#else /* ! HAVE_XFT */ - - dpyinfo->Xatom_xsettings_sel = None; - dpyinfo->Xatom_xsettings_prop = None; - dpyinfo->Xatom_xsettings_mgr = None; - dpyinfo->xsettings_window = None; - -#endif /* ! HAVE_XFT */ } void @@ -642,7 +700,7 @@ xsettings_initialize (dpyinfo) { if (first_dpyinfo == NULL) first_dpyinfo = dpyinfo; init_gconf (); - init_xfd_settings (dpyinfo); + init_xsettings (dpyinfo); } const char * @@ -678,6 +736,23 @@ DEFUN ("font-get-system-font", Ffont_get_system_font, Sfont_get_system_font, : Qnil; } +DEFUN ("tool-bar-get-system-style", Ftool_bar_get_system_style, Stool_bar_get_system_style, + 0, 0, 0, + doc: /* Get the system tool bar style. +If no system tool bar style is known, return `tool-bar-style' is set to a +known style. Otherwise return image. */) + () +{ + if (EQ (Vtool_bar_style, Qimage) + || EQ (Vtool_bar_style, Qtext) + || EQ (Vtool_bar_style, Qboth) + || EQ (Vtool_bar_style, Qboth_horiz)) + return Vtool_bar_style; + if (!NILP (current_tool_bar_style)) + return current_tool_bar_style; + return Qimage; +} + void syms_of_xsettings () { @@ -688,6 +763,8 @@ syms_of_xsettings () gconf_client = NULL; #endif + Qmonospace_font_name = intern_c_string ("monospace-font-name"); + staticpro (&Qmonospace_font_name); Qfont_name = intern_c_string ("font-name"); staticpro (&Qfont_name); Qfont_render = intern_c_string ("font-render"); @@ -709,6 +786,13 @@ syms_of_xsettings () Fprovide (intern_c_string ("system-font-setting"), Qnil); #endif #endif + + current_tool_bar_style = Qnil; + Qtool_bar_style = intern_c_string ("tool-bar-style"); + staticpro (&Qtool_bar_style); + defsubr (&Stool_bar_get_system_style); + + Fprovide (intern_c_string ("dynamic-setting"), Qnil); } /* arch-tag: 541716ed-2e6b-42e1-8212-3197e01ea61d |