summaryrefslogtreecommitdiff
path: root/src/haikufont.c
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-09-25 13:22:45 +0000
committerPo Lu <luangruo@yahoo.com>2022-09-25 13:24:03 +0000
commit568920a5b703e80c43e1b6f31778ea5776218a1e (patch)
treeb0609b2c5c04598fb25494e4420807d3c5ce1134 /src/haikufont.c
parent3502fd98310ad0870965511f600a92cd888a6de0 (diff)
downloademacs-568920a5b703e80c43e1b6f31778ea5776218a1e.tar.gz
Implement font-use-system-font on Haiku
* doc/emacs/frames.texi (Fonts): Update documentation to say what font-use-system-font really does and where it can be used. * src/haiku_font_support.cc (language_code_points): Fix coding style. (font_style_to_flags, be_font_style_to_flags): Accept const char *. (be_send_font_settings, be_listen_font_settings) (be_lock_font_defaults, be_unlock_font_defaults) (be_get_font_default, be_get_font_size): New functions used to retrieve default font data. * src/haiku_io.c (haiku_len): Handle FONT_CHANGE_EVENT. * src/haiku_support.h (enum haiku_event_type): New event type FONT_CHANGE_EVENT. (enum haiku_what_font): New enum. (struct haiku_font_change_event): New struct. * src/haikufont.c (Ffont_get_system_normal_font) (Ffont_get_system_font, haiku_handle_font_change_event): New functions. (syms_of_haikufont): Provide `dynamic-setting' and define new variables and subrs. * src/haikuterm.c (haiku_default_font_parameter): Use system font. (haiku_read_socket): Handle FONT_CHANGE_EVENTS. (haiku_term_init): Start listening for font configuration changes. * src/haikuterm.h: Update prototypes. * src/xsettings.c (Ffont_get_system_normal_font) (Ffont_get_system_font): Update doc string. (syms_of_xsettings): Replace calls to intern with a static string.
Diffstat (limited to 'src/haikufont.c')
-rw-r--r--src/haikufont.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/haikufont.c b/src/haikufont.c
index 4af9ff9d77f..335c312cebe 100644
--- a/src/haikufont.c
+++ b/src/haikufont.c
@@ -1311,6 +1311,98 @@ in the font selection dialog. */)
QCsize, lsize);
}
+DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
+ Sfont_get_system_normal_font, 0, 0, 0,
+ doc: /* SKIP: real doc in xsettings.c. */)
+ (void)
+{
+ Lisp_Object value;
+ const char *name, *style;
+ struct haiku_font_pattern pattern;
+ Lisp_Object lfamily, lweight, lslant, lwidth, ladstyle;
+ int size;
+
+ if (!be_lock_font_defaults ())
+ return Qnil;
+
+ name = be_get_font_default (DEFAULT_FAMILY);
+ style = be_get_font_default (DEFAULT_STYLE);
+ size = be_get_font_size (DEFAULT_FAMILY);
+
+ be_font_style_to_flags (style, &pattern);
+
+ lfamily = build_string_from_utf8 (name);
+ lweight = (pattern.specified & FSPEC_WEIGHT
+ ? haikufont_weight_to_lisp (pattern.weight) : Qnil);
+ lslant = (pattern.specified & FSPEC_SLANT
+ ? haikufont_slant_to_lisp (pattern.slant) : Qnil);
+ lwidth = (pattern.specified & FSPEC_WIDTH
+ ? haikufont_width_to_lisp (pattern.width) : Qnil);
+ ladstyle = (pattern.specified & FSPEC_STYLE
+ ? intern (pattern.style) : Qnil);
+
+ value = CALLN (Ffont_spec, QCfamily, lfamily,
+ QCweight, lweight, QCslant, lslant,
+ QCwidth, lwidth, QCadstyle, ladstyle,
+ QCsize, make_fixnum (size));
+ be_unlock_font_defaults ();
+
+ return value;
+}
+
+DEFUN ("font-get-system-font", Ffont_get_system_font,
+ Sfont_get_system_font, 0, 0, 0,
+ doc: /* SKIP: real doc in xsettings.c. */)
+ (void)
+{
+ Lisp_Object value;
+ const char *name, *style;
+ struct haiku_font_pattern pattern;
+ Lisp_Object lfamily, lweight, lslant, lwidth, ladstyle;
+ int size;
+
+ if (!be_lock_font_defaults ())
+ return Qnil;
+
+ name = be_get_font_default (FIXED_FAMILY);
+ style = be_get_font_default (FIXED_STYLE);
+ size = be_get_font_size (FIXED_FAMILY);
+
+ be_font_style_to_flags (style, &pattern);
+
+ lfamily = build_string_from_utf8 (name);
+ lweight = (pattern.specified & FSPEC_WEIGHT
+ ? haikufont_weight_to_lisp (pattern.weight) : Qnil);
+ lslant = (pattern.specified & FSPEC_SLANT
+ ? haikufont_slant_to_lisp (pattern.slant) : Qnil);
+ lwidth = (pattern.specified & FSPEC_WIDTH
+ ? haikufont_width_to_lisp (pattern.width) : Qnil);
+ ladstyle = (pattern.specified & FSPEC_STYLE
+ ? intern (pattern.style) : Qnil);
+
+ value = CALLN (Ffont_spec, QCfamily, lfamily,
+ QCweight, lweight, QCslant, lslant,
+ QCwidth, lwidth, QCadstyle, ladstyle,
+ QCsize, make_fixnum (size));
+ be_unlock_font_defaults ();
+
+ return value;
+}
+
+void
+haiku_handle_font_change_event (struct haiku_font_change_event *event,
+ struct input_event *ie)
+{
+ ie->kind = CONFIG_CHANGED_EVENT;
+
+ /* This is the name of the display. */
+ ie->frame_or_window = XCAR (x_display_list->name_list_element);
+
+ /* And this is the font that changed. */
+ ie->arg = (event->what == FIXED_FAMILY
+ ? Qmonospace_font_name : Qfont_name);
+}
+
static void
syms_of_haikufont_for_pdumper (void)
{
@@ -1344,6 +1436,14 @@ syms_of_haikufont (void)
DEFSYM (QCindices, ":indices");
+ DEFSYM (Qmonospace_font_name, "monospace-font-name");
+ DEFSYM (Qfont_name, "font-name");
+ DEFSYM (Qdynamic_setting, "dynamic-setting");
+
+ DEFVAR_BOOL ("font-use-system-font", use_system_font,
+ doc: /* SKIP: real doc in xsettings.c. */);
+ use_system_font = false;
+
#ifdef USE_BE_CAIRO
Fput (Qhaiku, Qfont_driver_superseded_by, Qftcr);
#endif
@@ -1353,6 +1453,12 @@ syms_of_haikufont (void)
staticpro (&font_cache);
defsubr (&Sx_select_font);
+ defsubr (&Sfont_get_system_normal_font);
+ defsubr (&Sfont_get_system_font);
be_init_font_data ();
+
+ /* This tells loadup to load dynamic-setting.el, which handles
+ config-changed events. */
+ Fprovide (Qdynamic_setting, Qnil);
}