Compare commits

...

12 Commits

18 changed files with 798 additions and 12 deletions

5
.gitignore vendored
View File

@@ -1,4 +1,3 @@
bin/
obj/
publish/
tools/
@@ -9,3 +8,7 @@ src/*/.vs/
*.DotSettings
build/Fody*
*.vs/
*.dll
*.exe
*.log
*.pdb

View File

@@ -0,0 +1,100 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v6.0": {
"EVE-O-Preview/1.0.0": {
"dependencies": {
"LightInject": "7.0.1",
"MediatR": "9.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.NET.ILLink.Analyzers": "7.0.100-1.23211.1",
"Microsoft.NET.ILLink.Tasks": "7.0.100-1.23211.1",
"Newtonsoft.Json": "13.0.3"
},
"runtime": {
"EVE-O-Preview.dll": {}
}
},
"LightInject/7.0.1": {
"runtime": {
"lib/netstandard2.0/LightInject.dll": {
"assemblyVersion": "7.0.1.0",
"fileVersion": "7.0.1.0"
}
}
},
"MediatR/9.0.0": {
"runtime": {
"lib/netstandard2.1/MediatR.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.0.0"
}
}
},
"Microsoft.CSharp/4.7.0": {},
"Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": {},
"Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": {},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
}
}
},
"libraries": {
"EVE-O-Preview/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"LightInject/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aw4ayG2Pe68i+85ws8zYk7MPCKjEd4DeBoTqVvmjA2cfpYYNnw+v0E5T3PKdriKaxdKF+eUzlnxWWZnYK/gx4w==",
"path": "lightinject/7.0.1",
"hashPath": "lightinject.7.0.1.nupkg.sha512"
},
"MediatR/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8b3UYNxegHVYcJMG2zH8wn+YqxLvXG+eMfj0cMCq/jTW72p6O3PCKMkrIv0mqyxdW7bA4gblsocw7n+/9Akg5g==",
"path": "mediatr/9.0.0",
"hashPath": "mediatr.9.0.0.nupkg.sha512"
},
"Microsoft.CSharp/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==",
"path": "microsoft.csharp/4.7.0",
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
},
"Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==",
"path": "microsoft.net.illink.analyzers/7.0.100-1.23211.1",
"hashPath": "microsoft.net.illink.analyzers.7.0.100-1.23211.1.nupkg.sha512"
},
"Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==",
"path": "microsoft.net.illink.tasks/7.0.100-1.23211.1",
"hashPath": "microsoft.net.illink.tasks.7.0.100-1.23211.1.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
}
}
}

View File

@@ -0,0 +1,128 @@
{
"ConfigVersion": 1,
"CycleGroup1ForwardHotkeys": [
"F14",
"Control+F14"
],
"CycleGroup1BackwardHotkeys": [
"F13",
"Control+F13"
],
"CycleGroup1ClientsOrder": {
"EVE - Example DPS Toon 1": 1,
"EVE - Example DPS Toon 2": 2,
"EVE - Example DPS Toon 3": 3
},
"CycleGroup2ForwardHotkeys": [
"F16",
"Control+F16"
],
"CycleGroup2BackwardHotkeys": [
"F15",
"Control+F15"
],
"CycleGroup2ClientsOrder": {
"EVE - Example Logi Toon 1": 1,
"EVE - Example Scout Toon 2": 2,
"EVE - Example Tackle Toon 3": 3
},
"CycleGroup3ForwardHotkeys": [
""
],
"CycleGroup3BackwardHotkeys": [
""
],
"CycleGroup3ClientsOrder": {
"EVE - cycle group 3": 1
},
"CycleGroup4ForwardHotkeys": [
""
],
"CycleGroup4BackwardHotkeys": [
""
],
"CycleGroup4ClientsOrder": {
"EVE - cycle group 4": 1
},
"CycleGroup5ForwardHotkeys": [
""
],
"CycleGroup5BackwardHotkeys": [
""
],
"CycleGroup5ClientsOrder": {
"EVE - cycle group 5": 1
},
"PerClientActiveClientHighlightColor": {
"EVE - Example Toon 1": "Red",
"EVE - Example Toon 2": "Green"
},
"PerClientThumbnailSize": {
"EVE - Example Toon 1": "200, 200",
"EVE - Example Toon 2": "200, 200"
},
"PerClientThumbnailRegion": {},
"PerClientZoomAnchor": {
"EVE - Example Toon 1": 1,
"EVE - Example Toon 2": 7
},
"MinimizeToTray": false,
"ThumbnailRefreshPeriod": 500,
"ThumbnailResizeTimeoutPeriod": 500,
"WineCompatibilityMode": false,
"ThumbnailsOpacity": 0.5,
"EnableClientLayoutTracking": false,
"HideActiveClientThumbnail": false,
"HideLoginClientThumbnail": false,
"MinimizeInactiveClients": false,
"WindowsAnimationStyle": 1,
"ShowThumbnailsAlwaysOnTop": true,
"EnablePerClientThumbnailLayouts": false,
"HideThumbnailsOnLostFocus": false,
"HideThumbnailsDelay": 2,
"ThumbnailSize": "408, 177",
"ThumbnailMaximumSize": "960, 540",
"ThumbnailMinimumSize": "192, 108",
"EnableThumbnailSnap": true,
"ThumbnailSnapRange": 20,
"EnableThumbnailZoom": false,
"ThumbnailZoomFactor": 2,
"ThumbnailZoomAnchor": 0,
"OverlayLabelAnchor": 0,
"ShowThumbnailOverlays": true,
"ShowThumbnailFrames": false,
"LockThumbnailLocation": false,
"ThumbnailSnapToGrid": true,
"ThumbnailSnapToGridSizeX": 102,
"ThumbnailSnapToGridSizeY": 44,
"EnableActiveClientHighlight": false,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1187, 1252, 398, 174",
"CurrentProfile": "Default",
"AvailableProfiles": [
"Default"
],
"IconName": "IconOriginal",
"ActiveClientHighlightThickness": 3,
"LoginThumbnailLocation": "5, 5",
"ToggleTrackingHotkey": "Alt+F16",
"ToggleSingleProcessHotkey": "Control+F16",
"ToggleAllThumbnailsHotkey": "Alt+F12",
"ThumbnailsManuallyHidden": false,
"PerClientLayout": {},
"FlatLayout": {
"EVE - Sn v1 cosunoo (2)": "1938, 1100",
"EVE - Primorium (1)": "1530, 1100",
"EVE - PhatPhuckDave (3)": "1122, 1100"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"
]
}

View File

@@ -0,0 +1,18 @@
{
"runtimeOptions": {
"tfm": "net6.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "6.0.0"
}
],
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false
}
}
}

View File

@@ -0,0 +1,91 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"EVE-O-Preview/1.0.0": {
"dependencies": {
"LightInject": "7.0.1",
"MediatR": "9.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.NET.ILLink.Tasks": "8.0.18",
"Newtonsoft.Json": "13.0.3"
},
"runtime": {
"EVE-O-Preview.dll": {}
}
},
"LightInject/7.0.1": {
"runtime": {
"lib/net8.0/LightInject.dll": {
"assemblyVersion": "7.0.1.0",
"fileVersion": "7.0.1.0"
}
}
},
"MediatR/9.0.0": {
"runtime": {
"lib/netstandard2.1/MediatR.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.0.0"
}
}
},
"Microsoft.CSharp/4.7.0": {},
"Microsoft.NET.ILLink.Tasks/8.0.18": {},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
}
}
},
"libraries": {
"EVE-O-Preview/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"LightInject/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aw4ayG2Pe68i+85ws8zYk7MPCKjEd4DeBoTqVvmjA2cfpYYNnw+v0E5T3PKdriKaxdKF+eUzlnxWWZnYK/gx4w==",
"path": "lightinject/7.0.1",
"hashPath": "lightinject.7.0.1.nupkg.sha512"
},
"MediatR/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8b3UYNxegHVYcJMG2zH8wn+YqxLvXG+eMfj0cMCq/jTW72p6O3PCKMkrIv0mqyxdW7bA4gblsocw7n+/9Akg5g==",
"path": "mediatr/9.0.0",
"hashPath": "mediatr.9.0.0.nupkg.sha512"
},
"Microsoft.CSharp/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==",
"path": "microsoft.csharp/4.7.0",
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
},
"Microsoft.NET.ILLink.Tasks/8.0.18": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OiXqr2YIBEV9dsAWEtasK470ALyJ0VxJ9k4MotOxlWV6HeEgrJKYMW4HHj1OCCXvqE0/A25wEKPkpfiBARgDZA==",
"path": "microsoft.net.illink.tasks/8.0.18",
"hashPath": "microsoft.net.illink.tasks.8.0.18.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
}
}
}

View File

@@ -0,0 +1,137 @@
{
"ConfigVersion": 1,
"CycleGroup1ForwardHotkeys": [
"F14",
"Control+F14"
],
"CycleGroup1BackwardHotkeys": [
"F13",
"Control+F13"
],
"CycleGroup1ClientsOrder": {
"EVE - Example DPS Toon 1": 1,
"EVE - Example DPS Toon 2": 2,
"EVE - Example DPS Toon 3": 3
},
"CycleGroup2ForwardHotkeys": [
"F16",
"Control+F16"
],
"CycleGroup2BackwardHotkeys": [
"F15",
"Control+F15"
],
"CycleGroup2ClientsOrder": {
"EVE - Example Logi Toon 1": 1,
"EVE - Example Scout Toon 2": 2,
"EVE - Example Tackle Toon 3": 3
},
"CycleGroup3ForwardHotkeys": [
""
],
"CycleGroup3BackwardHotkeys": [
""
],
"CycleGroup3ClientsOrder": {
"EVE - cycle group 3": 1
},
"CycleGroup4ForwardHotkeys": [
""
],
"CycleGroup4BackwardHotkeys": [
""
],
"CycleGroup4ClientsOrder": {
"EVE - cycle group 4": 1
},
"CycleGroup5ForwardHotkeys": [
""
],
"CycleGroup5BackwardHotkeys": [
""
],
"CycleGroup5ClientsOrder": {
"EVE - cycle group 5": 1
},
"PerClientActiveClientHighlightColor": {
"EVE - Example Toon 1": "Red",
"EVE - Example Toon 2": "Green"
},
"PerClientThumbnailSize": {
"EVE - Example Toon 1": "200, 200",
"EVE - Example Toon 2": "200, 200"
},
"PerClientThumbnailRegion": {},
"PerClientZoomAnchor": {
"EVE - Example Toon 1": 1,
"EVE - Example Toon 2": 7
},
"MinimizeToTray": true,
"ThumbnailRefreshPeriod": 500,
"ThumbnailResizeTimeoutPeriod": 500,
"WineCompatibilityMode": false,
"ThumbnailsOpacity": 1.0,
"EnableClientLayoutTracking": false,
"HideActiveClientThumbnail": false,
"HideLoginClientThumbnail": false,
"MinimizeInactiveClients": false,
"WindowsAnimationStyle": 1,
"ShowThumbnailsAlwaysOnTop": true,
"EnablePerClientThumbnailLayouts": false,
"HideThumbnailsOnLostFocus": false,
"HideThumbnailsDelay": 2,
"ThumbnailSize": "451, 238",
"ThumbnailMaximumSize": "960, 540",
"ThumbnailMinimumSize": "192, 108",
"EnableThumbnailSnap": true,
"ThumbnailSnapRange": 150,
"EnableThumbnailZoom": false,
"ThumbnailZoomFactor": 2,
"ThumbnailZoomAnchor": 0,
"OverlayLabelAnchor": 0,
"ShowThumbnailOverlays": true,
"ShowThumbnailFrames": false,
"LockThumbnailLocation": false,
"ThumbnailSnapToGrid": true,
"ThumbnailSnapToGridSizeX": 112,
"ThumbnailSnapToGridSizeY": 59,
"EnableActiveClientHighlight": true,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1664, 188, 451, 238",
"CurrentProfile": "Default",
"AvailableProfiles": [
"Default"
],
"IconName": "IconOriginal",
"ActiveClientHighlightThickness": 3,
"LoginThumbnailLocation": "5, 5",
"ToggleTrackingHotkey": "Alt+F16",
"ToggleSingleProcessHotkey": "Control+F16",
"ToggleAllThumbnailsHotkey": "Shift+Alt+Oem3",
"ThumbnailsManuallyHidden": false,
"PerClientLayout": {},
"FlatLayout": {
"EVE - Sn v1 cosunoo (2)": "1995, 1058",
"EVE - Primorium (1)": "240, 645",
"EVE - PhatPhuckDave (3)": "224, -2",
"EVE - Primorium (3)": "146, 285",
"EVE - PhatPhuckDave (2)": "146, 57",
"EVE - Sn v1 cosunoo (1)": "154, 472",
"EVE - Sn v1 cosunoo (3)": "292, 517",
"EVE - Primorium (2)": "224, 236",
"EVE - PhatPhuckDave (1)": "292, 57",
"EVE - Secundamen (1)": "224, 474"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {
"EVE - PhatPhuckDave (1)": false
},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"
]
}

View File

@@ -0,0 +1,20 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "8.0.0"
}
],
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true,
"CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false
}
}
}

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows8.0</TargetFramework>
<TargetFramework>net6.0-windows</TargetFramework>
<OutputType>WinExe</OutputType>
<RootNamespace>EveOMock</RootNamespace>
<AssemblyName>ExeFile</AssemblyName>

View File

@@ -124,6 +124,10 @@ namespace EveOPreview.Configuration.Implementation {
this.IconName = "";
this.LoginThumbnailLocation = new Point(5, 5);
this.ToggleTrackingHotkey = "Alt+F16";
this.ToggleSingleProcessHotkey = "Control+F16";
this.ToggleAllThumbnailsHotkey = "Alt+F12";
this.ThumbnailsManuallyHidden = false;
}
[JsonProperty("ConfigVersion")]
@@ -318,6 +322,21 @@ namespace EveOPreview.Configuration.Implementation {
get; set;
}
[JsonProperty("ToggleSingleProcessHotkey")]
public string ToggleSingleProcessHotkey {
get; set;
}
[JsonProperty("ToggleAllThumbnailsHotkey")]
public string ToggleAllThumbnailsHotkey {
get; set;
}
[JsonProperty("ThumbnailsManuallyHidden")]
public bool ThumbnailsManuallyHidden {
get; set;
}
[JsonProperty]
private Dictionary<string, Dictionary<string, Point>> PerClientLayout {
get; set;

View File

@@ -25,6 +25,9 @@ namespace EveOPreview.Configuration {
Dictionary<string, int> CycleGroup5ClientsOrder { get; set; }
string ToggleTrackingHotkey { get; set; }
string ToggleSingleProcessHotkey { get; set; }
string ToggleAllThumbnailsHotkey { get; set; }
bool ThumbnailsManuallyHidden { get; set; }
Dictionary<string, Color> PerClientActiveClientHighlightColor { get; set; }
Dictionary<string, Size> PerClientThumbnailSize { get; set; }

View File

@@ -0,0 +1,20 @@
using System.Threading;
using System.Threading.Tasks;
using EveOPreview.Mediator.Messages;
using EveOPreview.Services;
using MediatR;
namespace EveOPreview.Mediator.Handlers.Services {
public sealed class ReRegisterHotkeysHandler : INotificationHandler<ReRegisterHotkeys> {
private readonly IThumbnailManager _thumbnailManager;
public ReRegisterHotkeysHandler(IThumbnailManager thumbnailManager) {
this._thumbnailManager = thumbnailManager;
}
public Task Handle(ReRegisterHotkeys notification, CancellationToken cancellationToken) {
this._thumbnailManager.ReRegisterHotkeys();
return Task.CompletedTask;
}
}
}

View File

@@ -0,0 +1,5 @@
using MediatR;
namespace EveOPreview.Mediator.Messages {
public sealed class ReRegisterHotkeys : INotification {}
}

View File

@@ -133,6 +133,10 @@ namespace EveOPreview.Presenters {
this.View.AvailableProfiles = this._configuration.AvailableProfiles;
this.View.CurrentProfile = this._configuration.CurrentProfile;
this.View.ToggleTrackingHotkey = this._configuration.ToggleTrackingHotkey;
this.View.ToggleSingleProcessHotkey = this._configuration.ToggleSingleProcessHotkey;
this.View.ToggleAllThumbnailsHotkey = this._configuration.ToggleAllThumbnailsHotkey;
this.View.IconName = this._configuration.IconName;
}
@@ -181,6 +185,13 @@ namespace EveOPreview.Presenters {
this._configuration.AvailableProfiles = this.View.AvailableProfiles;
this._configuration.CurrentProfile = this.View.CurrentProfile;
this._configuration.ToggleTrackingHotkey = this.View.ToggleTrackingHotkey;
this._configuration.ToggleSingleProcessHotkey = this.View.ToggleSingleProcessHotkey;
this._configuration.ToggleAllThumbnailsHotkey = this.View.ToggleAllThumbnailsHotkey;
// Re-register hotkeys if they changed
await this._mediator.Publish(new ReRegisterHotkeys());
// Publish region settings update if they changed
if (this._configuration.EnableThumbnailRegionSnipping != this.View.EnableThumbnailRegionSnipping ||
this._configuration.DefaultThumbnailRegion != this.View.DefaultThumbnailRegion) {

View File

@@ -23,7 +23,7 @@ namespace EveOPreview.Services {
private const int WINDOW_POSITION_THRESHOLD_HIGH = 31_000;
private const int WINDOW_SIZE_THRESHOLD = 10;
private const int FORCED_REFRESH_CYCLE_THRESHOLD = 2;
private const int DEFAULT_LOCATION_CHANGE_NOTIFICATION_DELAY = 2;
private const int DEFAULT_LOCATION_CHANGE_NOTIFICATION_DELAY = 0;
private const string DEFAULT_CLIENT_TITLE = "EVE";
#endregion
@@ -52,6 +52,8 @@ namespace EveOPreview.Services {
private List<HotkeyHandler> _cycleClientHotkeyHandlers = new List<HotkeyHandler>();
private HotkeyHandler _toggleTrackingHotkey;
private HotkeyHandler _toggleSingleProcessHotkey;
private HotkeyHandler _toggleAllThumbnailsHotkey;
#endregion
public ThumbnailManager(IMediator mediator, IThumbnailConfiguration configuration,
@@ -106,10 +108,11 @@ namespace EveOPreview.Services {
// RegisterCycleClientHotkey(this._configuration.CycleGroup5BackwardHotkeys?.Select(x =>
// this._configuration.StringToKey(x)), false, this._configuration.CycleGroup5ClientsOrder);
//
// Setup toggle tracking hotkey (Ctrl+T)
// Setup toggle tracking hotkey
var mainHandle = this._processMonitor.GetMainProcess().Handle;
System.Diagnostics.Debug.WriteLine($"Registering hotkey with main window handle: {mainHandle}");
this._toggleTrackingHotkey = new HotkeyHandler(mainHandle, Keys.Alt | Keys.F16);
var toggleTrackingKey = this._configuration.StringToKey(this._configuration.ToggleTrackingHotkey);
this._toggleTrackingHotkey = new HotkeyHandler(mainHandle, toggleTrackingKey);
this._toggleTrackingHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) {
@@ -137,9 +140,10 @@ namespace EveOPreview.Services {
var registered = this._toggleTrackingHotkey.Register();
System.Diagnostics.Debug.WriteLine($"Hotkey registration result: {registered}");
// Setup single process tracking hotkey (Ctrl+F16)
var toggleSingleProcessHotkey = new HotkeyHandler(mainHandle, Keys.Control | Keys.F16);
toggleSingleProcessHotkey.Pressed += (object s, HandledEventArgs e) => {
// Setup single process tracking hotkey
var toggleSingleProcessKey = this._configuration.StringToKey(this._configuration.ToggleSingleProcessHotkey);
this._toggleSingleProcessHotkey = new HotkeyHandler(mainHandle, toggleSingleProcessKey);
this._toggleSingleProcessHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) {
uint processId;
@@ -165,8 +169,98 @@ namespace EveOPreview.Services {
}
}
};
registered = toggleSingleProcessHotkey.Register();
registered = this._toggleSingleProcessHotkey.Register();
System.Diagnostics.Debug.WriteLine($"Single process hotkey registration result: {registered}");
// Setup toggle all thumbnails hotkey
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
System.Diagnostics.Debug.WriteLine(
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
e.Handled = true;
};
registered = this._toggleAllThumbnailsHotkey.Register();
System.Diagnostics.Debug.WriteLine($"Toggle all thumbnails hotkey registration result: {registered}");
}
public void ReRegisterHotkeys() {
// Unregister existing hotkeys
this._toggleTrackingHotkey?.Unregister();
this._toggleSingleProcessHotkey?.Unregister();
this._toggleAllThumbnailsHotkey?.Unregister();
// Re-register with new settings
var mainHandle = this._processMonitor.GetMainProcess().Handle;
var toggleTrackingKey = this._configuration.StringToKey(this._configuration.ToggleTrackingHotkey);
this._toggleTrackingHotkey = new HotkeyHandler(mainHandle, toggleTrackingKey);
this._toggleTrackingHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) {
uint processId;
GetWindowThreadProcessId(foregroundHandle, out processId);
var process = Process.GetProcessById((int)processId);
if (process != null) {
System.Diagnostics.Debug.WriteLine($"Found process: {process.ProcessName}");
if (_configuration.IsExecutableToPreview(process.ProcessName)) {
System.Diagnostics.Debug.WriteLine("Removing from executables to preview");
var exesToPreview = _configuration.ExecutablesToPreview.ToList();
exesToPreview.Remove(process.ProcessName.ToLower());
_configuration.ExecutablesToPreview = exesToPreview;
} else {
System.Diagnostics.Debug.WriteLine("Adding to executables to preview");
var exesToPreview = _configuration.ExecutablesToPreview.ToList();
exesToPreview.Add(process.ProcessName.ToLower());
_configuration.ExecutablesToPreview = exesToPreview;
}
e.Handled = true;
}
}
};
this._toggleTrackingHotkey.Register();
var toggleSingleProcessKey = this._configuration.StringToKey(this._configuration.ToggleSingleProcessHotkey);
this._toggleSingleProcessHotkey = new HotkeyHandler(mainHandle, toggleSingleProcessKey);
this._toggleSingleProcessHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) {
uint processId;
GetWindowThreadProcessId(foregroundHandle, out processId);
var process = Process.GetProcessById((int)processId);
if (process != null) {
System.Diagnostics.Debug.WriteLine($"Found process: {process.ProcessName} (PID: {process.Id})");
// Get the current tracked PID from ProcessMonitor
var currentTrackedPid = this._processMonitor.GetTrackedPid();
if (currentTrackedPid == process.Id) {
// Stop tracking this process
this._processMonitor.SetTrackedPid(0);
System.Diagnostics.Debug.WriteLine($"Stopped tracking process {process.Id}");
} else {
// Start tracking this process
this._processMonitor.SetTrackedPid(process.Id);
System.Diagnostics.Debug.WriteLine($"Started tracking process {process.Id}");
}
e.Handled = true;
}
}
};
this._toggleSingleProcessHotkey.Register();
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
System.Diagnostics.Debug.WriteLine(
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
e.Handled = true;
};
this._toggleAllThumbnailsHotkey.Register();
}
public IThumbnailView GetClientByTitle(string title) {
@@ -439,7 +533,8 @@ namespace EveOPreview.Services {
}
bool hideAllThumbnails =
this._configuration.HideThumbnailsOnLostFocus && !(isClientWindow || isMainWindowActive);
this._configuration.HideThumbnailsOnLostFocus && !(isClientWindow || isMainWindowActive) ||
this._configuration.ThumbnailsManuallyHidden;
// Wait for some time before hiding all previews
if (hideAllThumbnails) {

View File

@@ -8,6 +8,7 @@ namespace EveOPreview.Services {
void UpdateThumbnailsSize();
void UpdateThumbnailFrames();
void UpdateThumbnailRegionSettings();
void ReRegisterHotkeys();
IThumbnailView GetClientByTitle(string title);
IThumbnailView GetClientByPointer(System.IntPtr ptr);

View File

@@ -64,6 +64,12 @@ namespace EveOPreview.View {
HideThumbnailsOnLostFocusCheckBox = new CheckBox();
EnablePerClientThumbnailsLayoutsCheckBox = new CheckBox();
MinimizeToTrayCheckBox = new CheckBox();
ToggleTrackingHotkeyLabel = new Label();
ToggleTrackingHotkeyTextBox = new TextBox();
ToggleSingleProcessHotkeyLabel = new Label();
ToggleSingleProcessHotkeyTextBox = new TextBox();
ToggleAllThumbnailsHotkeyLabel = new Label();
ToggleAllThumbnailsHotkeyTextBox = new TextBox();
EnableThumbnailRegionSnippingCheckBox = new CheckBox();
RegionLeftLabel = new Label();
RegionLeftNumericEdit = new NumericUpDown();
@@ -256,6 +262,12 @@ namespace EveOPreview.View {
GeneralSettingsPanel.Controls.Add(HideThumbnailsOnLostFocusCheckBox);
GeneralSettingsPanel.Controls.Add(EnablePerClientThumbnailsLayoutsCheckBox);
GeneralSettingsPanel.Controls.Add(MinimizeToTrayCheckBox);
GeneralSettingsPanel.Controls.Add(ToggleTrackingHotkeyLabel);
GeneralSettingsPanel.Controls.Add(ToggleTrackingHotkeyTextBox);
GeneralSettingsPanel.Controls.Add(ToggleSingleProcessHotkeyLabel);
GeneralSettingsPanel.Controls.Add(ToggleSingleProcessHotkeyTextBox);
GeneralSettingsPanel.Controls.Add(ToggleAllThumbnailsHotkeyLabel);
GeneralSettingsPanel.Controls.Add(ToggleAllThumbnailsHotkeyTextBox);
GeneralSettingsPanel.Dock = DockStyle.Fill;
GeneralSettingsPanel.Location = new Point(4, 4);
GeneralSettingsPanel.Margin = new Padding(4);
@@ -378,6 +390,63 @@ namespace EveOPreview.View {
MinimizeToTrayCheckBox.UseVisualStyleBackColor = true;
MinimizeToTrayCheckBox.CheckedChanged += OptionChanged_Handler;
//
// ToggleTrackingHotkeyLabel
//
ToggleTrackingHotkeyLabel.AutoSize = true;
ToggleTrackingHotkeyLabel.Location = new Point(9, 230);
ToggleTrackingHotkeyLabel.Margin = new Padding(4, 0, 4, 0);
ToggleTrackingHotkeyLabel.Name = "ToggleTrackingHotkeyLabel";
ToggleTrackingHotkeyLabel.Size = new Size(94, 15);
ToggleTrackingHotkeyLabel.TabIndex = 28;
ToggleTrackingHotkeyLabel.Text = "Toggle Tracking:";
//
// ToggleTrackingHotkeyTextBox
//
ToggleTrackingHotkeyTextBox.Location = new Point(145, 227);
ToggleTrackingHotkeyTextBox.Margin = new Padding(4);
ToggleTrackingHotkeyTextBox.Name = "ToggleTrackingHotkeyTextBox";
ToggleTrackingHotkeyTextBox.Size = new Size(137, 23);
ToggleTrackingHotkeyTextBox.TabIndex = 29;
ToggleTrackingHotkeyTextBox.Leave += HotkeyTextBox_Leave;
//
// ToggleSingleProcessHotkeyLabel
//
ToggleSingleProcessHotkeyLabel.AutoSize = true;
ToggleSingleProcessHotkeyLabel.Location = new Point(9, 260);
ToggleSingleProcessHotkeyLabel.Margin = new Padding(4, 0, 4, 0);
ToggleSingleProcessHotkeyLabel.Name = "ToggleSingleProcessHotkeyLabel";
ToggleSingleProcessHotkeyLabel.Size = new Size(124, 15);
ToggleSingleProcessHotkeyLabel.TabIndex = 30;
ToggleSingleProcessHotkeyLabel.Text = "Toggle Single Process:";
//
// ToggleSingleProcessHotkeyTextBox
//
ToggleSingleProcessHotkeyTextBox.Location = new Point(145, 257);
ToggleSingleProcessHotkeyTextBox.Margin = new Padding(4);
ToggleSingleProcessHotkeyTextBox.Name = "ToggleSingleProcessHotkeyTextBox";
ToggleSingleProcessHotkeyTextBox.Size = new Size(137, 23);
ToggleSingleProcessHotkeyTextBox.TabIndex = 31;
ToggleSingleProcessHotkeyTextBox.Leave += HotkeyTextBox_Leave;
//
// ToggleAllThumbnailsHotkeyLabel
//
ToggleAllThumbnailsHotkeyLabel.AutoSize = true;
ToggleAllThumbnailsHotkeyLabel.Location = new Point(9, 290);
ToggleAllThumbnailsHotkeyLabel.Margin = new Padding(4, 0, 4, 0);
ToggleAllThumbnailsHotkeyLabel.Name = "ToggleAllThumbnailsHotkeyLabel";
ToggleAllThumbnailsHotkeyLabel.Size = new Size(129, 15);
ToggleAllThumbnailsHotkeyLabel.TabIndex = 32;
ToggleAllThumbnailsHotkeyLabel.Text = "Toggle All Thumbnails:";
//
// ToggleAllThumbnailsHotkeyTextBox
//
ToggleAllThumbnailsHotkeyTextBox.Location = new Point(145, 287);
ToggleAllThumbnailsHotkeyTextBox.Margin = new Padding(4);
ToggleAllThumbnailsHotkeyTextBox.Name = "ToggleAllThumbnailsHotkeyTextBox";
ToggleAllThumbnailsHotkeyTextBox.Size = new Size(137, 23);
ToggleAllThumbnailsHotkeyTextBox.TabIndex = 33;
ToggleAllThumbnailsHotkeyTextBox.Leave += HotkeyTextBox_Leave;
//
// ThumbnailTabPage
//
ThumbnailTabPage.BackColor = SystemColors.Control;
@@ -1354,7 +1423,7 @@ namespace EveOPreview.View {
// VersionLabel
//
VersionLabel.AutoSize = true;
VersionLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold);
VersionLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold, GraphicsUnit.Point);
VersionLabel.Location = new Point(155, 10);
VersionLabel.Margin = new Padding(4, 0, 4, 0);
VersionLabel.Name = "VersionLabel";
@@ -1365,7 +1434,7 @@ namespace EveOPreview.View {
// NameLabel
//
NameLabel.AutoSize = true;
NameLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold);
NameLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold, GraphicsUnit.Point);
NameLabel.Location = new Point(5, 10);
NameLabel.Margin = new Padding(4, 0, 4, 0);
NameLabel.Name = "NameLabel";
@@ -1530,5 +1599,11 @@ namespace EveOPreview.View {
private RadioButton OverlayLabelSWRadioButton;
private Label label1;
private ComboBox AnimationStyleCombo;
private Label ToggleTrackingHotkeyLabel;
private TextBox ToggleTrackingHotkeyTextBox;
private Label ToggleSingleProcessHotkeyLabel;
private TextBox ToggleSingleProcessHotkeyTextBox;
private Label ToggleAllThumbnailsHotkeyLabel;
private TextBox ToggleAllThumbnailsHotkeyTextBox;
}
}

View File

@@ -229,6 +229,21 @@ namespace EveOPreview.View {
set => ThumbnailSnapRangeNumericEdit.Value = value;
}
public string ToggleTrackingHotkey {
get => this.ToggleTrackingHotkeyTextBox.Text;
set => this.ToggleTrackingHotkeyTextBox.Text = value;
}
public string ToggleSingleProcessHotkey {
get => this.ToggleSingleProcessHotkeyTextBox.Text;
set => this.ToggleSingleProcessHotkeyTextBox.Text = value;
}
public string ToggleAllThumbnailsHotkey {
get => this.ToggleAllThumbnailsHotkeyTextBox.Text;
set => this.ToggleAllThumbnailsHotkeyTextBox.Text = value;
}
public bool EnableActiveClientHighlight {
get => this.EnableActiveClientHighlightCheckBox.Checked;
set => this.EnableActiveClientHighlightCheckBox.Checked = value;
@@ -487,6 +502,11 @@ namespace EveOPreview.View {
this._suppressEvents = false;
}
// Update snap grid X and Y to 1/4 of width and height
Size currentSize = this.ThumbnailSize;
this.ThumbnailSnapToGridSizeX = currentSize.Width / 4;
this.ThumbnailSnapToGridSizeY = currentSize.Height / 4;
this.ThumbnailsSizeChanged?.Invoke();
}
@@ -533,6 +553,11 @@ namespace EveOPreview.View {
this._suppressEvents = false;
}
// Update snap grid X and Y to 1/4 of width and height
Size currentSize = this.ThumbnailSize;
this.ThumbnailSnapToGridSizeX = currentSize.Width / 4;
this.ThumbnailSnapToGridSizeY = currentSize.Height / 4;
// Prevent the default scroll behavior
((HandledMouseEventArgs)e).Handled = true;
@@ -648,5 +673,36 @@ namespace EveOPreview.View {
private void AnimationStyleCombo_SelectedIndexChanged(object sender, EventArgs e) {}
private void GeneralSettingsPanel_Paint(object sender, PaintEventArgs e) {}
private void HotkeyTextBox_Leave(object sender, EventArgs e) {
if (sender is System.Windows.Forms.TextBox textBox) {
string hotkeyText = textBox.Text.Trim();
if (!string.IsNullOrEmpty(hotkeyText)) {
try {
// Try to parse the hotkey to validate it
var keysConverter = new KeysConverter();
var key = keysConverter.ConvertFromInvariantString(hotkeyText);
if (key == null || (Keys)key == Keys.None) {
MessageBox.Show(
$"Invalid hotkey: {hotkeyText}\n\nPlease enter a valid hotkey combination (e.g., Alt+F1, Ctrl+Shift+A)",
"Invalid Hotkey", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox.Focus();
return;
}
} catch (Exception) {
MessageBox.Show(
$"Invalid hotkey: {hotkeyText}\n\nPlease enter a valid hotkey combination (e.g., Alt+F1, Ctrl+Shift+A)",
"Invalid Hotkey", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox.Focus();
return;
}
}
// If we get here, the hotkey is valid (or empty), so trigger the option change
this.OptionChanged_Handler(sender, e);
}
}
}
}

View File

@@ -47,6 +47,10 @@ namespace EveOPreview.View {
string CurrentProfile { get; set; }
List<string> AvailableProfiles { get; set; }
string ToggleTrackingHotkey { get; set; }
string ToggleSingleProcessHotkey { get; set; }
string ToggleAllThumbnailsHotkey { get; set; }
string IconName { get; set; }
void SetDocumentationUrl(string url);