aboutsummaryrefslogtreecommitdiffstats
path: root/src/xsettings.c
diff options
context:
space:
mode:
authorJan Djärv <[email protected]>2010-04-08 18:20:32 +0200
committerJan Djärv <[email protected]>2010-04-08 18:20:32 +0200
commit99852628a828979c55c96d7def6c5a21f2b32af5 (patch)
tree31090fefe3468ad6d12495d2e65596dc939b41d2 /src/xsettings.c
parent9a15cc5a6837f39eaefd28ab607fc39dffcc11b3 (diff)
Lucid menus can now use Xft for fonts.
* xsettings.c (current_font, SYSTEM_FONT, XSETTINGS_FONT_NAME): New. (parse_xft_settings): Also check for XSETTINGS_FONT_NAME and save that in current_font. (init_gconf): Read value of SYSTEM_FONT and save it in current_font. (Ffont_get_system_normal_font, xsettings_get_system_normal_font): New functions. (syms_of_xsettings): Initialize current_font. defsubr Sfont_get_system_normal_font. * xsettings.h (Ffont_get_system_normal_font, xsettings_get_system_normal_font): Declare. * xfns.c (extern xlwmenu_default_font): Remove. (Fx_create_frame): Remove setting of xlwmenu_default_font, moved to xlwmenu.c. * menu.c (digest_single_submenu): If USE_LUCID and HAVE_XFT, encode menu items in UTF-8. * xmenu.c: include xsettings.h and xlwmenu.h if USE_LUCID. (apply_systemfont_to_menu): New function. (set_frame_menubar, create_and_show_popup_menu): Call apply_systemfont_to_menu. * xlwmenu.c (xlwmenu_default_font): Make static. (xlwMenuResources): Add XtNfaceName and XtNdefaultFace. (string_width): Use XftTextExtentsUtf8 if HAVE_XFT. (MENU_FONT_HEIGHT, MENU_FONT_ASCENT): Add versions for HAVE_XFT. (size_menu): Set max_rest_width in window_state structure. (display_menu_item): If HAVE_XFT and xft_draw is set, use XftDrawRect and XftDrawStringUtf8 to draw text. (make_windows_if_needed): Set max_rest_width and xft_draw in windows[i]. (openXftFont): New. (XlwMenuInitialize): Call openXftFont if HAVE_XFT. If mw->menu.font is not set, load font fixed and save it in xlwmenu_default_font. (XlwMenuInitialize): Set max_rest_width and xft_draw in windows[0]. (XlwMenuClassInitialize): Initialize xlwmenu_default_font. (XlwMenuRealize): Set xft_fg, xft_bg, xft_disabled_fg and windows[0].xft_draw if xft_font is set. (XlwMenuDestroy): Destroy all xft_draw and close xft_font. (facename_changed): New. (XlwMenuSetValues): Call facename_changed. If face name did change, close old fonts and destroy xft_draw:s. Then create new ones. * xlwmenu.h (XtNfaceName, XtCFaceName, XtNdefaultFace, XtCDefaultFace): New. * xlwmenuP.h (_window_state): Add max_rest_width and xft_draw. (_XlwMenu_part): Add faceName,xft_fg, xft_bg, xft_disabled_fg and xft_font. * xresources.texi (Lucid Resources): Mention faceName to set Xft fonts.
Diffstat (limited to 'src/xsettings.c')
-rw-r--r--src/xsettings.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/src/xsettings.c b/src/xsettings.c
index 945007db2f..b71871df57 100644
--- a/src/xsettings.c
+++ b/src/xsettings.c
@@ -39,6 +39,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#endif
static char *current_mono_font;
+static char *current_font;
static struct x_display_info *first_dpyinfo;
static Lisp_Object Qfont_name, Qfont_render;
static int use_system_font;
@@ -65,7 +66,9 @@ store_font_changed_event (arg, display_name)
#ifdef HAVE_GCONF
-#define SYSTEM_MONO_FONT "/desktop/gnome/interface/monospace_font_name"
+#define SYSTEM_MONO_FONT "/desktop/gnome/interface/monospace_font_name"
+#define SYSTEM_FONT "/desktop/gnome/interface/font_name"
+#define XSETTINGS_FONT_NAME "Gtk/FontName"
/* Callback called when something changed in GConf that we care about,
that is SYSTEM_MONO_FONT. */
@@ -235,7 +238,7 @@ parse_xft_settings (prop, bytes, settings)
memset (settings, 0, sizeof (*settings));
- while (bytes_parsed+4 < bytes && settings_seen < 6
+ while (bytes_parsed+4 < bytes && settings_seen < 7
&& i < n_settings)
{
int type = prop[bytes_parsed++];
@@ -243,7 +246,7 @@ parse_xft_settings (prop, bytes, settings)
CARD32 vlen, ival = 0;
char name[128]; /* The names we are looking for are not this long. */
char sval[128]; /* The values we are looking for are not this long. */
- int is_xft;
+ int want_this;
int to_cpy;
sval[0] = '\0';
@@ -264,13 +267,14 @@ parse_xft_settings (prop, bytes, settings)
bytes_parsed += 4; /* Skip serial for this value */
if (bytes_parsed > bytes) return BadLength;
- is_xft = nlen > 6 && strncmp (name, "Xft/", 4) == 0;
+ want_this = (nlen > 6 && strncmp (name, "Xft/", 4) == 0)
+ || (strcmp (XSETTINGS_FONT_NAME, name) == 0);
switch (type)
{
case 0: /* Integer */
if (bytes_parsed+4 > bytes) return BadLength;
- if (is_xft)
+ if (want_this)
{
memcpy (&ival, prop+bytes_parsed, 4);
if (my_bo != that_bo) ival = SWAP32 (ival);
@@ -283,7 +287,7 @@ parse_xft_settings (prop, bytes, settings)
memcpy (&vlen, prop+bytes_parsed, 4);
bytes_parsed += 4;
if (my_bo != that_bo) vlen = SWAP32 (vlen);
- if (is_xft)
+ if (want_this)
{
to_cpy = vlen > 127 ? 127 : vlen;
memcpy (sval, prop+bytes_parsed, to_cpy);
@@ -303,7 +307,7 @@ parse_xft_settings (prop, bytes, settings)
return BadValue;
}
- if (is_xft)
+ if (want_this)
{
++settings_seen;
if (strcmp (name, "Xft/Antialias") == 0)
@@ -361,6 +365,11 @@ 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);
+ }
}
}
@@ -571,6 +580,12 @@ init_gconf ()
current_mono_font = xstrdup (s);
g_free (s);
}
+ s = gconf_client_get_string (gconf_client, SYSTEM_FONT, NULL);
+ if (s)
+ {
+ current_font = xstrdup (s);
+ g_free (s);
+ }
gconf_client_set_error_handling (gconf_client, GCONF_CLIENT_HANDLE_NONE);
gconf_client_add_dir (gconf_client,
SYSTEM_MONO_FONT,
@@ -635,6 +650,23 @@ xsettings_get_system_font ()
return current_mono_font;
}
+const char *
+xsettings_get_system_normal_font ()
+{
+ return current_font;
+}
+
+DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
+ Sfont_get_system_normal_font,
+ 0, 0, 0,
+ doc: /* Get the system default font. */)
+ ()
+{
+ return current_font && use_system_font
+ ? make_string (current_font, strlen (current_font))
+ : Qnil;
+}
+
DEFUN ("font-get-system-font", Ffont_get_system_font, Sfont_get_system_font,
0, 0, 0,
doc: /* Get the system default monospaced font. */)
@@ -649,6 +681,7 @@ void
syms_of_xsettings ()
{
current_mono_font = NULL;
+ current_font = NULL;
first_dpyinfo = NULL;
#ifdef HAVE_GCONF
gconf_client = NULL;
@@ -659,6 +692,7 @@ syms_of_xsettings ()
Qfont_render = intern_c_string ("font-render");
staticpro (&Qfont_render);
defsubr (&Sfont_get_system_font);
+ defsubr (&Sfont_get_system_normal_font);
DEFVAR_BOOL ("font-use-system-font", &use_system_font,
doc: /* *Non-nil means to use the system defined font. */);