diff --git a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/BaseFontAndColorCategory.cs b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/BaseFontAndColorCategory.cs index 813fb51..93b88a5 100644 --- a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/BaseFontAndColorCategory.cs +++ b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/BaseFontAndColorCategory.cs @@ -246,7 +246,7 @@ int IVsFontAndColorEvents.OnFontChanged(ref Guid rguidCategory, FontInfo[] pInfo // only want to handle the changes for this category. if (rguidCategory.Equals(_categoryGuid)) { - EmitChange((x) => x.SetFont(ref pInfo[0])); + EmitChange((x) => x.SetFont(ref pLOGFONT[0], ref pInfo[0])); } return VSConstants.S_OK; } diff --git a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFont.cs b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFont.cs index c8cac9d..5037fc1 100644 --- a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFont.cs +++ b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFont.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; using System.Windows.Media; using Microsoft.VisualStudio.PlatformUI; using Microsoft.VisualStudio.Shell.Interop; @@ -22,14 +23,16 @@ public class ConfiguredFont : ObservableObject private FontFamily? _family; private bool _hasFamily; private string _familyName; + private int _pointSize; private double _size; private byte _characterSet; - internal ConfiguredFont(ref FontInfo info) + internal ConfiguredFont(ref LOGFONTW logfont, ref FontInfo fontInfo) { - _familyName = info.bstrFaceName; - _size = info.wPointSize; - _characterSet = info.iCharSet; + _familyName = fontInfo.bstrFaceName; + _pointSize = fontInfo.wPointSize; + _size = CalculateFontSize(ref logfont); + _characterSet = fontInfo.iCharSet; } /// @@ -61,7 +64,14 @@ public FontFamily? Family public string FamilyName => _familyName; /// - /// The font size. + /// The font size, in points. This is the value specified on the Fonts and Colors options page. + /// + public int PointSize => _pointSize; + + /// + /// The font size, for use in WPF. This is the font size that can be used in WPF controls. + /// For example, the value can be used directly in the + /// property. /// public double Size => _size; @@ -70,17 +80,19 @@ public FontFamily? Family /// public byte CharacterSet => _characterSet; - internal bool Update(ref FontInfo info) + internal bool Update(ref LOGFONTW logfont, ref FontInfo info) { bool changed = false; string oldFaceName = _familyName; + int oldPointSize = _pointSize; double oldSize = _size; byte oldCharacterSet = _characterSet; // Update all of the fields first so that // everything is set before we raise the events. _familyName = info.bstrFaceName; - _size = info.wPointSize; + _pointSize = info.wPointSize; + _size = CalculateFontSize(ref logfont); _characterSet = info.iCharSet; if (!string.Equals(oldFaceName, _familyName)) @@ -92,6 +104,12 @@ internal bool Update(ref FontInfo info) NotifyPropertyChanged(nameof(FamilyName)); } + if (oldPointSize != _pointSize) + { + changed = true; + NotifyPropertyChanged(nameof(PointSize)); + } + if (oldSize != _size) { changed = true; @@ -106,5 +124,18 @@ internal bool Update(ref FontInfo info) return changed; } + + private static double CalculateFontSize(ref LOGFONTW logfont) + { + return Math.Abs(logfont.lfHeight) * 96.0 / +#if VS14 + // `DpiAwareness` does not exist in VS 14, so default + // to 96.0, which is the standard system DPI. + 96.0 +#else + Microsoft.VisualStudio.Utilities.DpiAwareness.SystemDpiY +#endif + ; + } } } diff --git a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFontAndColorSet.cs b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFontAndColorSet.cs index 2b5e3be..120a071 100644 --- a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFontAndColorSet.cs +++ b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/ConfiguredFontAndColorSet.cs @@ -14,13 +14,14 @@ namespace Community.VisualStudio.Toolkit internal ConfiguredFontAndColorSet( T category, - ref FontInfo font, + ref LOGFONTW logfont, + ref FontInfo fontInfo, Dictionary colors, Action onDispose ) { Category = category; - Font = new ConfiguredFont(ref font); + Font = new ConfiguredFont(ref logfont, ref fontInfo); _colors = colors; _onDispose = onDispose; } @@ -64,9 +65,9 @@ public ConfiguredColor GetColor(ColorDefinition definition) /// public event EventHandler? ColorChanged; - void IFontAndColorChangeListener.SetFont(ref FontInfo info) + void IFontAndColorChangeListener.SetFont(ref LOGFONTW logfont, ref FontInfo info) { - if (Font.Update(ref info)) + if (Font.Update(ref logfont, ref info)) { FontChanged?.Invoke(this, EventArgs.Empty); } diff --git a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/FontsAndColors.cs b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/FontsAndColors.cs index f6178d6..256b2a0 100644 --- a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/FontsAndColors.cs +++ b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/FontsAndColors.cs @@ -37,10 +37,12 @@ internal FontsAndColors() T category = BaseFontAndColorCategory.Instance; FontInfo[] fontInfo = new FontInfo[1]; - ErrorHandler.ThrowOnFailure(storage.GetFont(null, fontInfo)); + LOGFONTW[] logfont = new LOGFONTW[1]; + ErrorHandler.ThrowOnFailure(storage.GetFont(logfont, fontInfo)); ConfiguredFontAndColorSet set = new( category, + ref logfont[0], ref fontInfo[0], await GetColorsAsync(category, categoryGuid, storage), category.UnregisterChangeListener diff --git a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/IFontAndColorChangeListener.cs b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/IFontAndColorChangeListener.cs index a9fa542..012622c 100644 --- a/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/IFontAndColorChangeListener.cs +++ b/src/toolkit/Community.VisualStudio.Toolkit.Shared/FontsAndColors/IFontAndColorChangeListener.cs @@ -4,7 +4,7 @@ namespace Community.VisualStudio.Toolkit { internal interface IFontAndColorChangeListener { - void SetFont(ref FontInfo info); + void SetFont(ref LOGFONTW logfont, ref FontInfo info); void SetColor(ColorDefinition definition, uint background, uint foreground, FontStyle fontStyle); }