Find mono spaced fonts

Difference between version 5 and 9 - Previous - Next
[SeS] 4th Nov 2015

Following is created to find all mono spaced font types in a given OS. This can be handy in case of source code editors, their fonts often preferred to be mono spaced. An example how it is used, see [Another Font Chooser Dialog].

======
# ---------------------------------------------------------------------
# Purpose    : extract mono spaced font names within OS system
proc findFontClass {{type mono}} {
  foreach f [font families] {
    if {[font measure "{$f} 8" "A"]==[font measure "{$f} 8" "."]} {lappend fm $f} {lappend fv $f}
  }
  if {"$type"=="mono"} {return $fm} {return $fv}
}
======

This proc is now part of generic_tcl.tcl library of tcl-functions, in [tG²] v1.09.01 - beta 2. 
Tested within a wish.exe console v8.4.19.  
----

[kpv]: I believe that you can just query the font metrics to determine if the font is fixed width: 
''font metrics font_name -fixed''

----
[SeS] Thank you [kpv]! I will adapt the little proc, using the apparently already available method. I thought I had a good look to the available options in the user manual, missed it I guess.

----[bogdan] 2022-06-25 This is my variant with caching feature.
On my system, measuring procedure duration is ~35s with 100% CPU load. If I use this procedure more than one time, than I need to speeding up this process. This variant use previous results of measuring.

======
# ---------------------------------------------------------------------
# Purpose    : extract mono spaced font names within OS system
proc findFontClass {{type mono} {recache 0}} {  variable fm;
  variable fv;
  if {$recache !==1 0 || ![info exists fm] || ![info exists fv]} {
    set fm {}; set fv {};
    foreach f [font families] {      if {$f in $fm || $f in $fv} continue
      if {[font measure "{$f} 8" "A"] == [font measure "{$f} 8" "."]} {lappend fm $f} {lappend fv $f};    }
    update; # This unfreeze Tk window
  };  if {"$type eq "=="mono"} {return $fm} {return $fv};
};
======
<<categories>>Category GUI | Category Example