diff options
author | Po Lu <luangruo@yahoo.com> | 2022-09-25 13:22:45 +0000 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2022-09-25 13:24:03 +0000 |
commit | 568920a5b703e80c43e1b6f31778ea5776218a1e (patch) | |
tree | b0609b2c5c04598fb25494e4420807d3c5ce1134 /src/haikufont.c | |
parent | 3502fd98310ad0870965511f600a92cd888a6de0 (diff) | |
download | emacs-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.c | 106 |
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); } |