]> git.eshelyaron.com Git - emacs.git/commitdiff
Make the NS font dialog return more correct values
authorPo Lu <luangruo@yahoo.com>
Mon, 2 May 2022 01:32:54 +0000 (09:32 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 2 May 2022 01:32:54 +0000 (09:32 +0800)
* src/nsfns.m (Fx_select_font): Update doc string.
* src/nsterm.m (ns_font_desc_to_font_spec): New
function.
([EmacsView showFontPanel]): Return selected font as a
font spec instead.

src/nsfns.m
src/nsterm.m

index b71a3d7376d9e158c6f5e30339c187eb1317da83..41fea6f0fe6d7968e7ea784145e9a204d68ff4f7 100644 (file)
@@ -1595,7 +1595,7 @@ Some window managers may refuse to restack windows.  */)
 
 DEFUN ("x-select-font", Fx_select_font, Sx_select_font, 0, 2, 0,
        doc: /* Read a font using a Nextstep dialog.
-Return a string describing the selected font.
+Return a font specification describing the selected font.
 
 FRAME is the frame on which to pop up the font chooser.  If omitted or
 nil, it defaults to the selected frame. */)
index 5e70e0d5665980382c97e744aebbe4191606b64f..730472d261e9e858927e3005a9d0e49b1afa0921 100644 (file)
@@ -6055,6 +6055,63 @@ not_in_argv (NSString *arg)
 
 @end  /* EmacsApp */
 
+static Lisp_Object
+ns_font_desc_to_font_spec (NSFontDescriptor *desc, NSFont *font)
+{
+  NSFontSymbolicTraits traits = [desc symbolicTraits];
+  NSDictionary *dict = [desc objectForKey: NSFontTraitsAttribute];
+  NSString *family = [font familyName];
+  Lisp_Object lwidth, lslant, lweight, lheight;
+  NSNumber *tem;
+
+  lwidth = Qnil;
+  lslant = Qnil;
+  lweight = Qnil;
+  lheight = Qnil;
+
+  if (traits & NSFontBoldTrait)
+    lweight = Qbold;
+
+  if (traits & NSFontItalicTrait)
+    lslant = Qitalic;
+
+  if (traits & NSFontCondensedTrait)
+    lwidth = Qcondensed;
+  else if (traits & NSFontExpandedTrait)
+    lwidth = Qexpanded;
+
+  if (dict != nil)
+    {
+      tem = [dict objectForKey: NSFontSlantTrait];
+
+      if (tem != nil)
+       lslant = ([tem floatValue] > 0
+                 ? Qitalic : ([tem floatValue] < 0
+                              ? intern ("reverse-italic")
+                              : Qnormal));
+
+      tem = [dict objectForKey: NSFontWeightTrait];
+
+      if (tem != nil)
+       lweight = ([tem floatValue] > 0
+                  ? Qbold : ([tem floatValue] < -0.4f
+                             ? Qlight : Qnormal));
+
+      tem = [dict objectForKey: NSFontWidthTrait];
+
+      if (tem != nil)
+       lwidth = ([tem floatValue] > 0
+                 ? Qexpanded : ([tem floatValue] < 0
+                                ? Qnormal : Qcondensed));
+    }
+
+  lheight = make_float ([font pointSize]);
+
+  return CALLN (Ffont_spec,
+               QCwidth, lwidth, QCslant, lslant,
+               QCweight, lweight, QCsize, lheight,
+               QCfamily, [family lispString]);
+}
 
 /* ==========================================================================
 
@@ -6151,9 +6208,9 @@ not_in_argv (NSString *arg)
   [[fm fontPanel: YES] setIsVisible: NO];
   font_panel_active = NO;
 
-  /* TODO: return a font spec instead of a string.  */
   if (result)
-    return [[result familyName] lispString];
+    return ns_font_desc_to_font_spec ([result fontDescriptor],
+                                     result);
 
   return Qnil;
 }