sources/Google.Solutions.IapDesktop.Extensions.Session/Settings/TerminalSettings.cs (163 lines of code) (raw):
//
// Copyright 2020 Google LLC
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
using Google.Solutions.Common.Util;
using Google.Solutions.Mvvm.Drawing;
using Google.Solutions.Settings;
using Google.Solutions.Settings.Collection;
using Google.Solutions.Terminal.Controls;
using System;
using System.Collections.Generic;
using System.Drawing;
namespace Google.Solutions.IapDesktop.Extensions.Session.Settings
{
/// <summary>
/// Terminal-related settings.
/// </summary>
public interface ITerminalSettings : ISettingsCollection
{
ISetting<bool> IsCopyPasteUsingCtrlCAndCtrlVEnabled { get; }
ISetting<bool> IsCopyPasteUsingShiftInsertAndCtrlInsertEnabled { get; }
ISetting<bool> IsQuoteConvertionOnPasteEnabled { get; }
ISetting<bool> IsBracketedPasteEnabled { get; }
ISetting<bool> IsScrollingUsingCtrlHomeEndEnabled { get; }
ISetting<bool> IsScrollingUsingCtrlPageUpDownEnabled { get; }
ISetting<string> FontFamily { get; }
ISetting<int> FontSizeAsDword { get; }
ISetting<int> ForegroundColorArgb { get; }
ISetting<int> BackgroundColorArgb { get; }
ISetting<VirtualTerminal.CaretStyle> CaretStyle { get; }
}
internal class TerminalSettings : ITerminalSettings
{
//
// Use a dark gray as default (xterm 236).
//
#if DEBUG
internal static Color DefaultBackgroundColor = Color.DarkBlue;
#else
internal static Color DefaultBackgroundColor = Color.FromArgb(48, 48, 48);
#endif
internal const string DefaultFontFamily = "Consolas";
internal const float DefaultFontSize = 9.75f;
internal const float MinimumFontSize = 4.0f;
internal const float MaximumFontSize = 36.0f;
/// <summary>
/// Static, empty settings. Intended for testing only.
/// </summary>
internal static TerminalSettings Default
{
get => new TerminalSettings(
new DictionarySettingsStore(new Dictionary<string, string>()));
}
//
// Font sizes are floats. To avoid loss of precision,
// multiple them by 100 before coercing them into a DWORD.
//
internal static float FontSizeFromDword(int dw) => (float)dw / 100;
internal static int DwordFromFontSize(float fontSize) => (int)(fontSize * 100);
internal static bool IsValidFont(string fontFamily)
{
try
{
using (var font = new Font(fontFamily, DefaultFontSize))
{
return font.IsMonospaced();
}
}
catch (Exception)
{
return false;
}
}
public ISetting<bool> IsCopyPasteUsingCtrlCAndCtrlVEnabled { get; }
public ISetting<bool> IsCopyPasteUsingShiftInsertAndCtrlInsertEnabled { get; }
public ISetting<bool> IsQuoteConvertionOnPasteEnabled { get; }
public ISetting<bool> IsBracketedPasteEnabled { get; }
public ISetting<bool> IsScrollingUsingCtrlHomeEndEnabled { get; }
public ISetting<bool> IsScrollingUsingCtrlPageUpDownEnabled { get; }
public ISetting<string> FontFamily { get; }
public ISetting<int> FontSizeAsDword { get; }
public ISetting<int> ForegroundColorArgb { get; }
public ISetting<int> BackgroundColorArgb { get; }
public ISetting<VirtualTerminal.CaretStyle> CaretStyle { get; }
public IEnumerable<ISetting> Settings => new ISetting[]
{
this.IsCopyPasteUsingCtrlCAndCtrlVEnabled,
this.IsCopyPasteUsingShiftInsertAndCtrlInsertEnabled,
this.IsQuoteConvertionOnPasteEnabled,
this.IsBracketedPasteEnabled,
this.IsScrollingUsingCtrlHomeEndEnabled,
this.IsScrollingUsingCtrlPageUpDownEnabled,
this.FontFamily,
this.FontSizeAsDword,
this.ForegroundColorArgb,
this.BackgroundColorArgb,
this.CaretStyle,
};
internal TerminalSettings(ISettingsStore store)
{
this.IsCopyPasteUsingCtrlCAndCtrlVEnabled = store.Read<bool>(
"IsCopyPasteUsingCtrlCAndCtrlVEnabled",
"IsCopyPasteUsingCtrlCAndCtrlVEnabled",
null,
null,
true);
this.IsCopyPasteUsingShiftInsertAndCtrlInsertEnabled = store.Read<bool>(
"IsCopyPasteUsingShiftInsertAndCtrlInsertEnabled",
"IsCopyPasteUsingShiftInsertAndCtrlInsertEnabled",
null,
null,
true);
this.IsQuoteConvertionOnPasteEnabled = store.Read<bool>(
"IsQuoteConvertionOnPasteEnabled",
"IsQuoteConvertionOnPasteEnabled",
null,
null,
true);
this.IsBracketedPasteEnabled = store.Read<bool>(
"IsBracketedPasteEnabled",
"IsBracketedPasteEnabled",
null,
null,
true);
this.IsScrollingUsingCtrlHomeEndEnabled = store.Read<bool>(
"IsScrollingUsingCtrlHomeEndEnabled",
"IsScrollingUsingCtrlHomeEndEnabled",
null,
null,
true);
this.IsScrollingUsingCtrlPageUpDownEnabled = store.Read<bool>(
"IsScrollingUsingCtrlPageUpDownEnabled",
"IsScrollingUsingCtrlPageUpDownEnabled",
null,
null,
true);
this.FontFamily = store.Read<string>(
"FontFamily",
"FontFamily",
null,
null,
DefaultFontFamily,
f => f == null || IsValidFont(f));
this.FontSizeAsDword = store.Read<int>(
"FontSize",
"FontSize",
null,
null,
DwordFromFontSize(DefaultFontSize),
Predicate.InRange(
DwordFromFontSize(MinimumFontSize),
DwordFromFontSize(MaximumFontSize)));
this.ForegroundColorArgb = store.Read<int>(
"ForegroundColor",
"ForegroundColor",
null,
null,
Color.White.ToArgb(),
Predicate.InRange(
Color.Black.ToArgb(),
Color.White.ToArgb()));
this.BackgroundColorArgb = store.Read<int>(
"BackgroundColor",
"BackgroundColor",
null,
null,
DefaultBackgroundColor.ToArgb(),
Predicate.InRange(
Color.Black.ToArgb(),
Color.White.ToArgb()));
this.CaretStyle = store.Read<VirtualTerminal.CaretStyle>(
"CaretStyle",
"CaretStyle",
null,
null,
VirtualTerminal.CaretStyle.BlinkingBar);
}
}
}