Skip to content

Commit

Permalink
Better multi monitor support
Browse files Browse the repository at this point in the history
Better high-DPI support
  • Loading branch information
rampaa committed Aug 16, 2024
1 parent 81de4f2 commit a1b4126
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 105 deletions.
17 changes: 6 additions & 11 deletions JL.Windows/ConfigManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -361,22 +361,16 @@ public static void ApplyPreferences()
PopupWindow.PopupAutoHideTimer.Interval = AutoHidePopupIfMouseIsNotOverItDelayInMilliseconds;

PopupXOffset = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, PopupXOffset, nameof(PopupXOffset), double.TryParse);
WindowsUtils.DpiAwareXOffset = PopupXOffset / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareXOffset = PopupXOffset * WindowsUtils.Dpi.DpiScaleX;

PopupYOffset = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, PopupYOffset, nameof(PopupYOffset), double.TryParse);
WindowsUtils.DpiAwareYOffset = PopupYOffset / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwareYOffset = PopupYOffset * WindowsUtils.Dpi.DpiScaleY;

PopupMaxWidth = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, PopupMaxWidth, nameof(PopupMaxWidth), double.TryParse);
WindowsUtils.DpiAwarePopupMaxWidth = PopupMaxWidth / WindowsUtils.Dpi.DpiScaleX;

PopupMaxHeight = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, PopupMaxHeight, nameof(PopupMaxHeight), double.TryParse);
WindowsUtils.DpiAwarePopupMaxHeight = PopupMaxHeight / WindowsUtils.Dpi.DpiScaleY;

FixedPopupXPosition = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, FixedPopupXPosition, nameof(FixedPopupXPosition), double.TryParse);
WindowsUtils.DpiAwareFixedPopupXPosition = FixedPopupXPosition / WindowsUtils.Dpi.DpiScaleX;

FixedPopupYPosition = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, FixedPopupYPosition, nameof(FixedPopupYPosition), double.TryParse);
WindowsUtils.DpiAwareFixedPopupYPosition = FixedPopupYPosition / WindowsUtils.Dpi.DpiScaleY;

MainWindow.Instance.OpacitySlider.Value = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, MainWindow.Instance.OpacitySlider.Value, "MainWindowOpacity", double.TryParse);
MainWindow.Instance.FontSizeSlider.Value = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, MainWindow.Instance.FontSizeSlider.Value, "MainWindowFontSize", double.TryParse);
Expand All @@ -390,8 +384,9 @@ public static void ApplyPreferences()
MainWindow.Instance.WidthBeforeResolutionChange = MainWindowWidth;
MainWindow.Instance.HeightBeforeResolutionChange = MainWindowHeight;

MainWindow.Instance.Top = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, MainWindow.Instance.Top, "MainWindowTopPosition", double.TryParse);
MainWindow.Instance.Left = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, MainWindow.Instance.Left, "MainWindowLeftPosition", double.TryParse);
double mainWindowTop = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, MainWindow.Instance.Top, "MainWindowTopPosition", double.TryParse);
double mainWindowLeft = ConfigDBManager.GetNumberWithDecimalPointFromConfig(connection, MainWindow.Instance.Left, "MainWindowLeftPosition", double.TryParse);
WinApi.MoveWindowToPosition(MainWindow.Instance.WindowHandle, mainWindowLeft, mainWindowTop);

MainWindow.Instance.TopPositionBeforeResolutionChange = MainWindow.Instance.Top;
MainWindow.Instance.LeftPositionBeforeResolutionChange = MainWindow.Instance.Left;
Expand Down Expand Up @@ -651,7 +646,7 @@ public static void ApplyPreferences()
currentPopupWindow.Foreground = DefinitionsColor;
currentPopupWindow.FontFamily = PopupFont;

WindowsUtils.SetSizeToContent(PopupDynamicWidth, PopupDynamicHeight, WindowsUtils.DpiAwarePopupMaxWidth, WindowsUtils.DpiAwarePopupMaxHeight, currentPopupWindow);
WindowsUtils.SetSizeToContent(PopupDynamicWidth, PopupDynamicHeight, PopupMaxWidth, PopupMaxHeight, currentPopupWindow);

currentPopupWindow.AddNameMenuItem.SetInputGestureText(ShowAddNameWindowKeyGesture);
currentPopupWindow.AddWordMenuItem.SetInputGestureText(ShowAddWordWindowKeyGesture);
Expand Down
5 changes: 4 additions & 1 deletion JL.Windows/GUI/AlertWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ namespace JL.Windows.GUI;

internal sealed partial class AlertWindow : Window
{
public nint WindowHandle { get; private set; }

public AlertWindow()
{
InitializeComponent();
Expand All @@ -15,7 +17,8 @@ public AlertWindow()
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
WinApi.BringToFront(new WindowInteropHelper(this).Handle);
WindowHandle = new WindowInteropHelper(this).Handle;
WinApi.BringToFront(WindowHandle);
}

public void SetAlert(AlertLevel alertLevel, string message)
Expand Down
56 changes: 21 additions & 35 deletions JL.Windows/GUI/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1138,16 +1138,16 @@ private void DisplaySettingsChanged(object? sender, EventArgs? e)
Size oldResolution = new(WindowsUtils.ActiveScreen.Bounds.Width / WindowsUtils.Dpi.DpiScaleX, WindowsUtils.ActiveScreen.Bounds.Height / WindowsUtils.Dpi.DpiScaleY);
WindowsUtils.ActiveScreen = Screen.FromHandle(new WindowInteropHelper(this).Handle);
WindowsUtils.Dpi = VisualTreeHelper.GetDpi(this);
WindowsUtils.DpiAwareWorkAreaWidth = WindowsUtils.ActiveScreen.Bounds.Width / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareWorkAreaHeight = WindowsUtils.ActiveScreen.Bounds.Height / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwareScreenWidth = WindowsUtils.ActiveScreen.Bounds.Width / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareScreenHeight = WindowsUtils.ActiveScreen.Bounds.Height / WindowsUtils.Dpi.DpiScaleY;

if (Math.Abs(oldResolution.Width - WindowsUtils.DpiAwareWorkAreaWidth) <= 1 && Math.Abs(oldResolution.Height - WindowsUtils.DpiAwareWorkAreaHeight) <= 1)
if (Math.Abs(oldResolution.Width - WindowsUtils.DpiAwareScreenWidth) <= 1 && Math.Abs(oldResolution.Height - WindowsUtils.DpiAwareScreenHeight) <= 1)
{
return;
}

double ratioX = oldResolution.Width / WindowsUtils.DpiAwareWorkAreaWidth;
double ratioY = oldResolution.Height / WindowsUtils.DpiAwareWorkAreaHeight;
double ratioX = oldResolution.Width / WindowsUtils.DpiAwareScreenWidth;
double ratioY = oldResolution.Height / WindowsUtils.DpiAwareScreenHeight;

double fontScale = ratioX * ratioY > 1
? Math.Min(ratioX, ratioY) * 0.75
Expand Down Expand Up @@ -1183,23 +1183,19 @@ private void DisplaySettingsChanged(object? sender, EventArgs? e)

ConfigManager.PopupMaxHeight = Math.Round(ConfigManager.PopupMaxHeight / ratioY);
ConfigManager.PopupMaxWidth = Math.Round(ConfigManager.PopupMaxWidth / ratioX);
WindowsUtils.DpiAwarePopupMaxHeight = ConfigManager.PopupMaxHeight / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwarePopupMaxWidth = ConfigManager.PopupMaxWidth / WindowsUtils.Dpi.DpiScaleX;

ConfigManager.PopupYOffset = Math.Round(ConfigManager.PopupYOffset / ratioY);
ConfigManager.PopupXOffset = Math.Round(ConfigManager.PopupXOffset / ratioX);
WindowsUtils.DpiAwareXOffset = ConfigManager.PopupXOffset / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareYOffset = ConfigManager.PopupYOffset / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwareXOffset = ConfigManager.PopupXOffset * WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareYOffset = ConfigManager.PopupYOffset * WindowsUtils.Dpi.DpiScaleY;

ConfigManager.FixedPopupYPosition = Math.Round(ConfigManager.FixedPopupYPosition / ratioY);
ConfigManager.FixedPopupXPosition = Math.Round(ConfigManager.FixedPopupXPosition / ratioX);
WindowsUtils.DpiAwareXOffset = ConfigManager.PopupXOffset / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareYOffset = ConfigManager.PopupYOffset / WindowsUtils.Dpi.DpiScaleY;

PopupWindow? currentPopupWindow = FirstPopupWindow;
while (currentPopupWindow is not null)
{
WindowsUtils.SetSizeToContent(ConfigManager.PopupDynamicWidth, ConfigManager.PopupDynamicHeight, WindowsUtils.DpiAwarePopupMaxWidth, WindowsUtils.DpiAwarePopupMaxHeight, currentPopupWindow);
WindowsUtils.SetSizeToContent(ConfigManager.PopupDynamicWidth, ConfigManager.PopupDynamicHeight, ConfigManager.PopupMaxWidth, ConfigManager.PopupMaxHeight, currentPopupWindow);
currentPopupWindow = currentPopupWindow.ChildPopupWindow;
}

Expand All @@ -1219,14 +1215,10 @@ private void Window_DpiChanged(object sender, DpiChangedEventArgs e)
{
WindowsUtils.Dpi = e.NewDpi;
WindowsUtils.ActiveScreen = Screen.FromHandle(WindowHandle);
WindowsUtils.DpiAwareWorkAreaWidth = WindowsUtils.ActiveScreen.Bounds.Width / e.NewDpi.DpiScaleX;
WindowsUtils.DpiAwareWorkAreaHeight = WindowsUtils.ActiveScreen.Bounds.Height / e.NewDpi.DpiScaleY;
WindowsUtils.DpiAwareXOffset = ConfigManager.PopupXOffset / e.NewDpi.DpiScaleX;
WindowsUtils.DpiAwareYOffset = ConfigManager.PopupYOffset / e.NewDpi.DpiScaleY;
WindowsUtils.DpiAwareFixedPopupXPosition = ConfigManager.FixedPopupXPosition / e.NewDpi.DpiScaleX;
WindowsUtils.DpiAwareFixedPopupYPosition = ConfigManager.FixedPopupYPosition / e.NewDpi.DpiScaleY;
WindowsUtils.DpiAwarePopupMaxWidth = ConfigManager.PopupMaxWidth / e.NewDpi.DpiScaleX;
WindowsUtils.DpiAwarePopupMaxHeight = ConfigManager.PopupMaxHeight / e.NewDpi.DpiScaleY;
WindowsUtils.DpiAwareScreenWidth = WindowsUtils.ActiveScreen.Bounds.Width / e.NewDpi.DpiScaleX;
WindowsUtils.DpiAwareScreenHeight = WindowsUtils.ActiveScreen.Bounds.Height / e.NewDpi.DpiScaleY;
WindowsUtils.DpiAwareXOffset = ConfigManager.PopupXOffset * e.NewDpi.DpiScaleX;
WindowsUtils.DpiAwareYOffset = ConfigManager.PopupYOffset * e.NewDpi.DpiScaleY;
}

private void Border_OnMouseEnter(object sender, MouseEventArgs e)
Expand Down Expand Up @@ -1364,15 +1356,13 @@ private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
double width;
if (!MagpieUtils.IsMagpieScaling)
{
Left = WindowsUtils.ActiveScreen.Bounds.X;
Top = WindowsUtils.ActiveScreen.Bounds.Y;
width = WindowsUtils.DpiAwareWorkAreaWidth;
WinApi.MoveWindowToPosition(WindowHandle, WindowsUtils.ActiveScreen.Bounds.X, WindowsUtils.ActiveScreen.Bounds.Y);
width = WindowsUtils.DpiAwareScreenWidth;
}
else
{
Left = MagpieUtils.DpiAwareMagpieWindowLeftEdgePosition;
Top = MagpieUtils.DpiAwareMagpieWindowTopEdgePosition;
width = MagpieUtils.DpiAwareMagpieWindowRightEdgePosition - MagpieUtils.DpiAwareMagpieWindowLeftEdgePosition;
WinApi.MoveWindowToPosition(WindowHandle, MagpieUtils.MagpieWindowLeftEdgePosition, MagpieUtils.MagpieWindowTopEdgePosition);
width = MagpieUtils.DpiAwareMagpieWindowWidth;
}

if (ConfigManager.MainWindowMaxDynamicWidth < width)
Expand Down Expand Up @@ -1571,19 +1561,15 @@ private void Window_LocationChanged(object sender, EventArgs e)

WindowsUtils.ActiveScreen = Screen.FromHandle(WindowHandle);
WindowsUtils.Dpi = VisualTreeHelper.GetDpi(this);
WindowsUtils.DpiAwareWorkAreaWidth = WindowsUtils.ActiveScreen.Bounds.Width / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareWorkAreaHeight = WindowsUtils.ActiveScreen.Bounds.Height / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwareXOffset = ConfigManager.PopupXOffset / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareYOffset = ConfigManager.PopupYOffset / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwareFixedPopupXPosition = ConfigManager.FixedPopupXPosition / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareFixedPopupYPosition = ConfigManager.FixedPopupYPosition / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwarePopupMaxWidth = ConfigManager.PopupMaxWidth / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwarePopupMaxHeight = ConfigManager.PopupMaxHeight / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwareScreenWidth = WindowsUtils.ActiveScreen.Bounds.Width / WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareScreenHeight = WindowsUtils.ActiveScreen.Bounds.Height / WindowsUtils.Dpi.DpiScaleY;
WindowsUtils.DpiAwareXOffset = ConfigManager.PopupXOffset * WindowsUtils.Dpi.DpiScaleX;
WindowsUtils.DpiAwareYOffset = ConfigManager.PopupYOffset * WindowsUtils.Dpi.DpiScaleY;

PopupWindow? currentPopupWindow = FirstPopupWindow;
while (currentPopupWindow is not null)
{
WindowsUtils.SetSizeToContent(ConfigManager.PopupDynamicWidth, ConfigManager.PopupDynamicHeight, WindowsUtils.DpiAwarePopupMaxWidth, WindowsUtils.DpiAwarePopupMaxHeight, currentPopupWindow);
WindowsUtils.SetSizeToContent(ConfigManager.PopupDynamicWidth, ConfigManager.PopupDynamicHeight, ConfigManager.PopupMaxWidth, ConfigManager.PopupMaxHeight, currentPopupWindow);
currentPopupWindow = currentPopupWindow.ChildPopupWindow;
}
}
Expand Down
43 changes: 22 additions & 21 deletions JL.Windows/GUI/PopupWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ private void Init()
Foreground = ConfigManager.DefinitionsColor;
FontFamily = ConfigManager.PopupFont;

WindowsUtils.SetSizeToContent(ConfigManager.PopupDynamicWidth, ConfigManager.PopupDynamicHeight, WindowsUtils.DpiAwarePopupMaxWidth, WindowsUtils.DpiAwarePopupMaxHeight, this);
WindowsUtils.SetSizeToContent(ConfigManager.PopupDynamicWidth, ConfigManager.PopupDynamicHeight, ConfigManager.PopupMaxWidth, ConfigManager.PopupMaxHeight, this);

AddNameMenuItem.SetInputGestureText(ConfigManager.ShowAddNameWindowKeyGesture);
AddWordMenuItem.SetInputGestureText(ConfigManager.ShowAddWordWindowKeyGesture);
Expand Down Expand Up @@ -218,7 +218,7 @@ public async Task LookupOnCharPosition(TextBox textBox, int charPosition, bool e
{
if (ConfigManager.FixedPopupPositioning && this == MainWindow.Instance.FirstPopupWindow)
{
UpdatePosition(WindowsUtils.DpiAwareFixedPopupXPosition, WindowsUtils.DpiAwareFixedPopupYPosition);
UpdatePosition(ConfigManager.FixedPopupXPosition, ConfigManager.FixedPopupYPosition);
}

else
Expand Down Expand Up @@ -274,7 +274,7 @@ public async Task LookupOnCharPosition(TextBox textBox, int charPosition, bool e

if (ConfigManager.FixedPopupPositioning && this == MainWindow.Instance.FirstPopupWindow)
{
UpdatePosition(WindowsUtils.DpiAwareFixedPopupXPosition, WindowsUtils.DpiAwareFixedPopupYPosition);
UpdatePosition(ConfigManager.FixedPopupXPosition, ConfigManager.FixedPopupYPosition);
}

else
Expand Down Expand Up @@ -339,7 +339,7 @@ public async Task LookupOnSelect(TextBox textBox)
{
if (ConfigManager.FixedPopupPositioning && this == MainWindow.Instance.FirstPopupWindow)
{
UpdatePosition(WindowsUtils.DpiAwareFixedPopupXPosition, WindowsUtils.DpiAwareFixedPopupYPosition);
UpdatePosition(ConfigManager.FixedPopupXPosition, ConfigManager.FixedPopupYPosition);
}

else
Expand Down Expand Up @@ -376,7 +376,7 @@ public async Task LookupOnSelect(TextBox textBox)

if (ConfigManager.FixedPopupPositioning && this == MainWindow.Instance.FirstPopupWindow)
{
UpdatePosition(WindowsUtils.DpiAwareFixedPopupXPosition, WindowsUtils.DpiAwareFixedPopupYPosition);
UpdatePosition(ConfigManager.FixedPopupXPosition, ConfigManager.FixedPopupYPosition);
}

else
Expand Down Expand Up @@ -408,11 +408,14 @@ public async Task LookupOnSelect(TextBox textBox)

private void UpdatePosition(Point cursorPosition)
{
double mouseX = cursorPosition.X / WindowsUtils.Dpi.DpiScaleX;
double mouseY = cursorPosition.Y / WindowsUtils.Dpi.DpiScaleY;
double mouseX = cursorPosition.X;
double mouseY = cursorPosition.Y;

bool needsFlipX = ConfigManager.PopupFlipX && mouseX + ActualWidth > WindowsUtils.ActiveScreen.Bounds.X + WindowsUtils.DpiAwareWorkAreaWidth;
bool needsFlipY = ConfigManager.PopupFlipY && mouseY + ActualHeight > WindowsUtils.ActiveScreen.Bounds.Y + WindowsUtils.DpiAwareWorkAreaHeight;
double currentWidth = ActualWidth * WindowsUtils.Dpi.DpiScaleX;
double currentHeight = ActualHeight * WindowsUtils.Dpi.DpiScaleY;

bool needsFlipX = ConfigManager.PopupFlipX && mouseX + currentWidth > WindowsUtils.ActiveScreen.Bounds.Right;
bool needsFlipY = ConfigManager.PopupFlipY && mouseY + currentHeight > WindowsUtils.ActiveScreen.Bounds.Bottom;

double newLeft;
double newTop;
Expand All @@ -422,7 +425,7 @@ private void UpdatePosition(Point cursorPosition)
if (needsFlipX)
{
// flip Leftwards while preventing -OOB
newLeft = mouseX - (ActualWidth + WindowsUtils.DpiAwareXOffset);
newLeft = mouseX - (currentWidth + WindowsUtils.DpiAwareXOffset);
if (newLeft < WindowsUtils.ActiveScreen.Bounds.X)
{
newLeft = WindowsUtils.ActiveScreen.Bounds.X;
Expand All @@ -437,7 +440,7 @@ private void UpdatePosition(Point cursorPosition)
if (needsFlipY)
{
// flip Upwards while preventing -OOB
newTop = mouseY - (ActualHeight + WindowsUtils.DpiAwareYOffset);
newTop = mouseY - (currentHeight + WindowsUtils.DpiAwareYOffset);
if (newTop < WindowsUtils.ActiveScreen.Bounds.Y)
{
newTop = WindowsUtils.ActiveScreen.Bounds.Y;
Expand All @@ -450,29 +453,27 @@ private void UpdatePosition(Point cursorPosition)
}

// stick to edges if +OOB
if (newLeft + ActualWidth > WindowsUtils.ActiveScreen.Bounds.X + WindowsUtils.DpiAwareWorkAreaWidth)
if (newLeft + currentWidth > WindowsUtils.ActiveScreen.Bounds.Right)
{
newLeft = WindowsUtils.ActiveScreen.Bounds.X + WindowsUtils.DpiAwareWorkAreaWidth - ActualWidth;
newLeft = WindowsUtils.ActiveScreen.Bounds.Right - currentWidth;
}

if (newTop + ActualHeight > WindowsUtils.ActiveScreen.Bounds.Y + WindowsUtils.DpiAwareWorkAreaHeight)
if (newTop + currentHeight > WindowsUtils.ActiveScreen.Bounds.Bottom)
{
newTop = WindowsUtils.ActiveScreen.Bounds.Y + WindowsUtils.DpiAwareWorkAreaHeight - ActualHeight;
newTop = WindowsUtils.ActiveScreen.Bounds.Bottom - currentHeight;
}

if (mouseX >= newLeft && mouseX <= newLeft + ActualWidth && mouseY >= newTop && mouseY <= newTop + ActualHeight)
if (mouseX >= newLeft && mouseX <= newLeft + currentWidth && mouseY >= newTop && mouseY <= newTop + currentHeight)
{
UnavoidableMouseEnter = true;
}

Left = newLeft;
Top = newTop;
WinApi.MoveWindowToPosition(WindowHandle, newLeft, newTop);
}

private void UpdatePosition(double x, double y)
{
Left = x;
Top = y;
WinApi.MoveWindowToPosition(WindowHandle, x, y);
}

public void DisplayResults(bool generateAllResults)
Expand Down Expand Up @@ -1662,7 +1663,7 @@ public async Task HandleHotKey(KeyGesture keyGesture, KeyEventArgs? e)

else if (ConfigManager.FixedPopupPositioning && this == MainWindow.Instance.FirstPopupWindow)
{
UpdatePosition(WindowsUtils.DpiAwareFixedPopupXPosition, WindowsUtils.DpiAwareFixedPopupYPosition);
UpdatePosition(ConfigManager.FixedPopupXPosition, ConfigManager.FixedPopupYPosition);
}

else
Expand Down
Loading

0 comments on commit a1b4126

Please sign in to comment.