Compare commits
1 Commits
master
...
view/targe
| Author | SHA1 | Date | |
|---|---|---|---|
| b4bb15672a |
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"ActiveProfile": "capacitor",
|
|
||||||
"Profiles": [
|
|
||||||
"Default",
|
|
||||||
"capacitor",
|
|
||||||
"target-3row",
|
|
||||||
"target-1row",
|
|
||||||
"target-3row"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
"EnablePerClientThumbnailLayouts": false,
|
"EnablePerClientThumbnailLayouts": false,
|
||||||
"HideThumbnailsOnLostFocus": false,
|
"HideThumbnailsOnLostFocus": false,
|
||||||
"HideThumbnailsDelay": 2,
|
"HideThumbnailsDelay": 2,
|
||||||
"ThumbnailSize": "512, 288",
|
"ThumbnailSize": "451, 388",
|
||||||
"ThumbnailMaximumSize": "960, 540",
|
"ThumbnailMaximumSize": "960, 540",
|
||||||
"ThumbnailMinimumSize": "192, 108",
|
"ThumbnailMinimumSize": "192, 108",
|
||||||
"EnableThumbnailSnap": true,
|
"EnableThumbnailSnap": true,
|
||||||
@@ -93,14 +93,14 @@
|
|||||||
"ShowThumbnailFrames": false,
|
"ShowThumbnailFrames": false,
|
||||||
"LockThumbnailLocation": false,
|
"LockThumbnailLocation": false,
|
||||||
"ThumbnailSnapToGrid": true,
|
"ThumbnailSnapToGrid": true,
|
||||||
"ThumbnailSnapToGridSizeX": 32,
|
"ThumbnailSnapToGridSizeX": 112,
|
||||||
"ThumbnailSnapToGridSizeY": 18,
|
"ThumbnailSnapToGridSizeY": 97,
|
||||||
"EnableActiveClientHighlight": true,
|
"EnableActiveClientHighlight": true,
|
||||||
"ActiveClientHighlightColor": "GreenYellow",
|
"ActiveClientHighlightColor": "GreenYellow",
|
||||||
"OverlayLabelColor": "Orange",
|
"OverlayLabelColor": "Orange",
|
||||||
"OverlayLabelSize": 10,
|
"OverlayLabelSize": 10,
|
||||||
"EnableThumbnailRegionSnipping": false,
|
"EnableThumbnailRegionSnipping": true,
|
||||||
"DefaultThumbnailRegion": "1664, 188, 128, 72",
|
"DefaultThumbnailRegion": "1384, 188, 451, 388",
|
||||||
"CurrentProfile": "Default",
|
"CurrentProfile": "Default",
|
||||||
"AvailableProfiles": [
|
"AvailableProfiles": [
|
||||||
"Default"
|
"Default"
|
||||||
@@ -110,30 +110,19 @@
|
|||||||
"LoginThumbnailLocation": "5, 5",
|
"LoginThumbnailLocation": "5, 5",
|
||||||
"ToggleTrackingHotkey": "Alt+F16",
|
"ToggleTrackingHotkey": "Alt+F16",
|
||||||
"ToggleSingleProcessHotkey": "Control+F16",
|
"ToggleSingleProcessHotkey": "Control+F16",
|
||||||
"ToggleAllThumbnailsHotkey": "Alt+Oem3",
|
"ToggleAllThumbnailsHotkey": "Shift+Alt+Oem3",
|
||||||
|
"ThumbnailsManuallyHidden": true,
|
||||||
"PerClientLayout": {},
|
"PerClientLayout": {},
|
||||||
"FlatLayout": {
|
"FlatLayout": {
|
||||||
"EVE - PhatPhuckDave": "-1216, 1080",
|
"EVE - Quartio": "-1229, 1067",
|
||||||
"EVE - Primorium": "-704, 1080",
|
"EVE - Tertiale": "-1680, 1067",
|
||||||
"EVE - Secundamen": "-1216, 1368",
|
"EVE - Secundamen": "-2131, 1067",
|
||||||
"EVE - Tertiale": "-704, 1368",
|
"EVE - Primorium": "-2576, 679",
|
||||||
"EVE - Quartio": "-960, 1656",
|
"EVE - PhatPhuckDave": "-2576, 291"
|
||||||
"EVE - PhuckingWeebDave": "-1216, 1062",
|
|
||||||
"EVE - Primosaki": "-704, 1062",
|
|
||||||
"EVE - Secundaru": "-1216, 1350",
|
|
||||||
"EVE - Tertiashi": "-704, 1350",
|
|
||||||
"EVE - Quartomo": "-960, 1638",
|
|
||||||
"EVE - BastardSlavDave": "-1216, 1044",
|
|
||||||
"EVE - Primuskov": "-704, 1044",
|
|
||||||
"EVE - Secundovich": "-1216, 1332",
|
|
||||||
"EVE - Tertioslav": "-704, 1332",
|
|
||||||
"EVE - Quartinski": "-960, 1638"
|
|
||||||
},
|
},
|
||||||
"ClientLayout": {},
|
"ClientLayout": {},
|
||||||
"ClientHotkey": {},
|
"ClientHotkey": {},
|
||||||
"DisableThumbnail": {
|
"DisableThumbnail": {},
|
||||||
"EVE - PhatPhuckDave (1)": false
|
|
||||||
},
|
|
||||||
"PriorityClients": [],
|
"PriorityClients": [],
|
||||||
"ExecutablesToPreview": [
|
"ExecutablesToPreview": [
|
||||||
"exefile"
|
"exefile"
|
||||||
|
|||||||
@@ -1,139 +0,0 @@
|
|||||||
{
|
|
||||||
"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": "432, 144",
|
|
||||||
"ThumbnailMaximumSize": "960, 540",
|
|
||||||
"ThumbnailMinimumSize": "192, 108",
|
|
||||||
"EnableThumbnailSnap": true,
|
|
||||||
"ThumbnailSnapRange": 0,
|
|
||||||
"EnableThumbnailZoom": false,
|
|
||||||
"ThumbnailZoomFactor": 2,
|
|
||||||
"ThumbnailZoomAnchor": 0,
|
|
||||||
"OverlayLabelAnchor": 0,
|
|
||||||
"ShowThumbnailOverlays": true,
|
|
||||||
"ShowThumbnailFrames": false,
|
|
||||||
"LockThumbnailLocation": false,
|
|
||||||
"ThumbnailSnapToGrid": true,
|
|
||||||
"ThumbnailSnapToGridSizeX": 27,
|
|
||||||
"ThumbnailSnapToGridSizeY": 16,
|
|
||||||
"EnableActiveClientHighlight": true,
|
|
||||||
"ActiveClientHighlightColor": "GreenYellow",
|
|
||||||
"OverlayLabelColor": "Orange",
|
|
||||||
"OverlayLabelSize": 10,
|
|
||||||
"EnableThumbnailRegionSnipping": true,
|
|
||||||
"DefaultThumbnailRegion": "1205, 1269, 432, 144",
|
|
||||||
"CurrentProfile": "Default",
|
|
||||||
"AvailableProfiles": [
|
|
||||||
"Default"
|
|
||||||
],
|
|
||||||
"IconName": "IconOriginal",
|
|
||||||
"ActiveClientHighlightThickness": 3,
|
|
||||||
"LoginThumbnailLocation": "5, 5",
|
|
||||||
"ToggleTrackingHotkey": "Alt+F16",
|
|
||||||
"ToggleSingleProcessHotkey": "Control+F16",
|
|
||||||
"ToggleAllThumbnailsHotkey": "Alt+Oem3",
|
|
||||||
"PerClientLayout": {},
|
|
||||||
"FlatLayout": {
|
|
||||||
"EVE - Quartio": "0, 1296",
|
|
||||||
"EVE - Tertiale": "0, 1152",
|
|
||||||
"EVE - Secundamen": "0, 1008",
|
|
||||||
"EVE - Primorium": "0, 864",
|
|
||||||
"EVE - PhatPhuckDave": "0, 720",
|
|
||||||
"EVE - Quartomo": "0, 1295",
|
|
||||||
"EVE - Tertiashi": "0, 1155",
|
|
||||||
"EVE - Secundaru": "0, 1015",
|
|
||||||
"EVE - Primosaki": "0, 875",
|
|
||||||
"EVE - PhuckingWeebDave": "0, 735",
|
|
||||||
"EVE - BastardSlavDave": "0, 735",
|
|
||||||
"EVE - Primuskov": "0, 875",
|
|
||||||
"EVE - Secundovich": "0, 1015",
|
|
||||||
"EVE - Tertioslav": "0, 1155",
|
|
||||||
"EVE - Quartinski": "0, 1295"
|
|
||||||
},
|
|
||||||
"ClientLayout": {},
|
|
||||||
"ClientHotkey": {},
|
|
||||||
"DisableThumbnail": {},
|
|
||||||
"PriorityClients": [],
|
|
||||||
"ExecutablesToPreview": [
|
|
||||||
"exefile"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
{
|
|
||||||
"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": "351, 148",
|
|
||||||
"ThumbnailMaximumSize": "960, 540",
|
|
||||||
"ThumbnailMinimumSize": "192, 108",
|
|
||||||
"EnableThumbnailSnap": true,
|
|
||||||
"ThumbnailSnapRange": 0,
|
|
||||||
"EnableThumbnailZoom": false,
|
|
||||||
"ThumbnailZoomFactor": 2,
|
|
||||||
"ThumbnailZoomAnchor": 0,
|
|
||||||
"OverlayLabelAnchor": 0,
|
|
||||||
"ShowThumbnailOverlays": true,
|
|
||||||
"ShowThumbnailFrames": false,
|
|
||||||
"LockThumbnailLocation": false,
|
|
||||||
"ThumbnailSnapToGrid": true,
|
|
||||||
"ThumbnailSnapToGridSizeX": 22,
|
|
||||||
"ThumbnailSnapToGridSizeY": 10,
|
|
||||||
"EnableActiveClientHighlight": true,
|
|
||||||
"ActiveClientHighlightColor": "GreenYellow",
|
|
||||||
"OverlayLabelColor": "Orange",
|
|
||||||
"OverlayLabelSize": 10,
|
|
||||||
"EnableThumbnailRegionSnipping": true,
|
|
||||||
"DefaultThumbnailRegion": "1764, 988, 351, 148",
|
|
||||||
"CurrentProfile": "Default",
|
|
||||||
"AvailableProfiles": [
|
|
||||||
"Default"
|
|
||||||
],
|
|
||||||
"IconName": "IconOriginal",
|
|
||||||
"ActiveClientHighlightThickness": 3,
|
|
||||||
"LoginThumbnailLocation": "5, 5",
|
|
||||||
"ToggleTrackingHotkey": "Alt+F16",
|
|
||||||
"ToggleSingleProcessHotkey": "Control+F16",
|
|
||||||
"ToggleAllThumbnailsHotkey": "Alt+Oem3",
|
|
||||||
"PerClientLayout": {},
|
|
||||||
"FlatLayout": {
|
|
||||||
"EVE - PhatPhuckDave": "-348, 222",
|
|
||||||
"EVE - Primorium": "-348, 370",
|
|
||||||
"EVE - Secundamen": "-348, 518",
|
|
||||||
"EVE - Tertiale": "-348, 666",
|
|
||||||
"EVE - Quartio": "-348, 814",
|
|
||||||
|
|
||||||
"EVE - PhuckingWeebDave": "-348, 222",
|
|
||||||
"EVE - Primosaki": "-348, 370",
|
|
||||||
"EVE - Secundaru": "-348, 518",
|
|
||||||
"EVE - Tertiashi": "-348, 666",
|
|
||||||
"EVE - Quartomo": "-348, 814",
|
|
||||||
|
|
||||||
"EVE - BastardSlavDave": "-348, 222",
|
|
||||||
"EVE - Primuskov": "-348, 370",
|
|
||||||
"EVE - Secundovich": "-348, 518",
|
|
||||||
"EVE - Tertioslav": "-348, 666",
|
|
||||||
"EVE - Quartinski": "-348, 814"
|
|
||||||
},
|
|
||||||
"ClientLayout": {},
|
|
||||||
"ClientHotkey": {},
|
|
||||||
"DisableThumbnail": {},
|
|
||||||
"PriorityClients": [],
|
|
||||||
"ExecutablesToPreview": [
|
|
||||||
"exefile"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
{
|
|
||||||
"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": 0,
|
|
||||||
"EnableThumbnailZoom": false,
|
|
||||||
"ThumbnailZoomFactor": 2,
|
|
||||||
"ThumbnailZoomAnchor": 0,
|
|
||||||
"OverlayLabelAnchor": 0,
|
|
||||||
"ShowThumbnailOverlays": true,
|
|
||||||
"ShowThumbnailFrames": false,
|
|
||||||
"LockThumbnailLocation": false,
|
|
||||||
"ThumbnailSnapToGrid": true,
|
|
||||||
"ThumbnailSnapToGridSizeX": 29,
|
|
||||||
"ThumbnailSnapToGridSizeY": 15,
|
|
||||||
"EnableActiveClientHighlight": true,
|
|
||||||
"ActiveClientHighlightColor": "GreenYellow",
|
|
||||||
"OverlayLabelColor": "Orange",
|
|
||||||
"OverlayLabelSize": 10,
|
|
||||||
"EnableThumbnailRegionSnipping": true,
|
|
||||||
"DefaultThumbnailRegion": "1384, 188, 451, 238",
|
|
||||||
"CurrentProfile": "Default",
|
|
||||||
"AvailableProfiles": [
|
|
||||||
"Default"
|
|
||||||
],
|
|
||||||
"IconName": "IconOriginal",
|
|
||||||
"ActiveClientHighlightThickness": 3,
|
|
||||||
"LoginThumbnailLocation": "5, 5",
|
|
||||||
"ToggleTrackingHotkey": "Alt+F16",
|
|
||||||
"ToggleSingleProcessHotkey": "Control+F16",
|
|
||||||
"ToggleAllThumbnailsHotkey": "Alt+Oem3",
|
|
||||||
"PerClientLayout": {},
|
|
||||||
"FlatLayout": {
|
|
||||||
"EVE - PhatPhuckDave": "0, 703",
|
|
||||||
"EVE - Primorium": "0, 851",
|
|
||||||
"EVE - Secundamen": "0, 999",
|
|
||||||
"EVE - Tertiale": "0, 1147",
|
|
||||||
"EVE - Quartio": "0, 1295",
|
|
||||||
|
|
||||||
"EVE - PhuckingWeebDave": "0, 703",
|
|
||||||
"EVE - Primosaki": "0, 851",
|
|
||||||
"EVE - Secundaru": "0, 999",
|
|
||||||
"EVE - Tertiashi": "0, 1147",
|
|
||||||
"EVE - Quartomo": "0, 1295",
|
|
||||||
|
|
||||||
"EVE - BastardSlavDave": "0, 703",
|
|
||||||
"EVE - Primuskov": "0, 851",
|
|
||||||
"EVE - Secundovich": "0, 999",
|
|
||||||
"EVE - Tertioslav": "0, 1147",
|
|
||||||
"EVE - Quartinski": "0, 1295"
|
|
||||||
},
|
|
||||||
"ClientLayout": {},
|
|
||||||
"ClientHotkey": {},
|
|
||||||
"DisableThumbnail": {},
|
|
||||||
"PriorityClients": [],
|
|
||||||
"ExecutablesToPreview": [
|
|
||||||
"exefile"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
{
|
|
||||||
"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": "448, 384",
|
|
||||||
"ThumbnailMaximumSize": "960, 540",
|
|
||||||
"ThumbnailMinimumSize": "192, 108",
|
|
||||||
"EnableThumbnailSnap": true,
|
|
||||||
"ThumbnailSnapRange": 16,
|
|
||||||
"EnableThumbnailZoom": false,
|
|
||||||
"ThumbnailZoomFactor": 2,
|
|
||||||
"ThumbnailZoomAnchor": 0,
|
|
||||||
"OverlayLabelAnchor": 0,
|
|
||||||
"ShowThumbnailOverlays": true,
|
|
||||||
"ShowThumbnailFrames": false,
|
|
||||||
"LockThumbnailLocation": false,
|
|
||||||
"ThumbnailSnapToGrid": true,
|
|
||||||
"ThumbnailSnapToGridSizeX": 28,
|
|
||||||
"ThumbnailSnapToGridSizeY": 24,
|
|
||||||
"EnableActiveClientHighlight": true,
|
|
||||||
"ActiveClientHighlightColor": "GreenYellow",
|
|
||||||
"OverlayLabelColor": "Orange",
|
|
||||||
"OverlayLabelSize": 10,
|
|
||||||
"EnableThumbnailRegionSnipping": true,
|
|
||||||
"DefaultThumbnailRegion": "1274, 198, 448, 384",
|
|
||||||
"CurrentProfile": "Default",
|
|
||||||
"AvailableProfiles": [
|
|
||||||
"Default"
|
|
||||||
],
|
|
||||||
"IconName": "IconOriginal",
|
|
||||||
"ActiveClientHighlightThickness": 3,
|
|
||||||
"LoginThumbnailLocation": "5, 5",
|
|
||||||
"ToggleTrackingHotkey": "Alt+F16",
|
|
||||||
"ToggleSingleProcessHotkey": "Control+F16",
|
|
||||||
"ToggleAllThumbnailsHotkey": "Alt+Oem3",
|
|
||||||
"PerClientLayout": {},
|
|
||||||
"FlatLayout": {
|
|
||||||
"EVE - Quartio": "-448, -48",
|
|
||||||
"EVE - Tertiale": "-896, -48",
|
|
||||||
"EVE - Secundamen": "-1344, -48",
|
|
||||||
"EVE - Primorium": "-644, -432",
|
|
||||||
"EVE - PhatPhuckDave": "-1092, -432"
|
|
||||||
},
|
|
||||||
"ClientLayout": {},
|
|
||||||
"ClientHotkey": {},
|
|
||||||
"DisableThumbnail": {},
|
|
||||||
"PriorityClients": [],
|
|
||||||
"ExecutablesToPreview": [
|
|
||||||
"exefile"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeTarget": {
|
|
||||||
"name": ".NETCoreApp,Version=v6.0",
|
|
||||||
"signature": ""
|
|
||||||
},
|
|
||||||
"compilationOptions": {},
|
|
||||||
"targets": {
|
|
||||||
".NETCoreApp,Version=v6.0": {
|
|
||||||
"ExeFile/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"System.Data.DataSetExtensions": "4.5.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"ExeFile.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.CSharp/4.7.0": {},
|
|
||||||
"System.Data.DataSetExtensions/4.5.0": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"ExeFile/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"System.Data.DataSetExtensions/4.5.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-221clPs1445HkTBZPL+K9sDBdJRB8UN8rgjO3ztB0CQ26z//fmJXtlsr6whGatscsKGBrhJl5bwJuKSA8mwFOw==",
|
|
||||||
"path": "system.data.datasetextensions/4.5.0",
|
|
||||||
"hashPath": "system.data.datasetextensions.4.5.0.nupkg.sha512"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<configuration>
|
|
||||||
</configuration>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +1,16 @@
|
|||||||
using System;
|
using System.IO;
|
||||||
using System.IO;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace EveOPreview.Configuration.Implementation {
|
namespace EveOPreview.Configuration.Implementation {
|
||||||
class ConfigurationStorage : IConfigurationStorage {
|
class ConfigurationStorage : IConfigurationStorage {
|
||||||
private const string CONFIGURATION_FILE_NAME = "EVE-O-Preview.json";
|
private const string CONFIGURATION_FILE_NAME = "EVE-O-Preview.json";
|
||||||
private const string PROFILES_FOLDER_NAME = "Profiles";
|
|
||||||
private const string PROFILE_CONFIG_FILE_EXTENSION = ".json";
|
|
||||||
|
|
||||||
private readonly IAppConfig _appConfig;
|
private readonly IAppConfig _appConfig;
|
||||||
private readonly IThumbnailConfiguration _thumbnailConfiguration;
|
private readonly IThumbnailConfiguration _thumbnailConfiguration;
|
||||||
private readonly string _baseDirectory;
|
|
||||||
private string _currentProfile;
|
|
||||||
|
|
||||||
public ConfigurationStorage(IAppConfig appConfig, IThumbnailConfiguration thumbnailConfiguration) {
|
public ConfigurationStorage(IAppConfig appConfig, IThumbnailConfiguration thumbnailConfiguration) {
|
||||||
this._appConfig = appConfig;
|
this._appConfig = appConfig;
|
||||||
this._thumbnailConfiguration = thumbnailConfiguration;
|
this._thumbnailConfiguration = thumbnailConfiguration;
|
||||||
this._baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
|
||||||
this._currentProfile = "Default";
|
|
||||||
}
|
|
||||||
|
|
||||||
public string CurrentProfile {
|
|
||||||
get => this._currentProfile;
|
|
||||||
set {
|
|
||||||
if (this._currentProfile != value) {
|
|
||||||
this._currentProfile = value ?? "Default";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Load() {
|
public void Load() {
|
||||||
@@ -54,12 +38,6 @@ namespace EveOPreview.Configuration.Implementation {
|
|||||||
string filename = this.GetConfigFileName();
|
string filename = this.GetConfigFileName();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Ensure the directory exists before saving
|
|
||||||
string directory = Path.GetDirectoryName(filename);
|
|
||||||
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) {
|
|
||||||
Directory.CreateDirectory(directory);
|
|
||||||
}
|
|
||||||
|
|
||||||
File.WriteAllText(filename, rawData);
|
File.WriteAllText(filename, rawData);
|
||||||
} catch (IOException) {
|
} catch (IOException) {
|
||||||
// Ignore error if for some reason the updated config cannot be written down
|
// Ignore error if for some reason the updated config cannot be written down
|
||||||
@@ -67,19 +45,8 @@ namespace EveOPreview.Configuration.Implementation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private string GetConfigFileName() {
|
private string GetConfigFileName() {
|
||||||
// If a custom config file is specified via command line, use it
|
return string.IsNullOrEmpty(this._appConfig.ConfigFileName) ? ConfigurationStorage.CONFIGURATION_FILE_NAME
|
||||||
if (!string.IsNullOrEmpty(this._appConfig.ConfigFileName)) {
|
: this._appConfig.ConfigFileName;
|
||||||
return this._appConfig.ConfigFileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If using the Default profile or no profile is set, use the main config file
|
|
||||||
if (string.IsNullOrEmpty(this._currentProfile) || this._currentProfile == "Default") {
|
|
||||||
return Path.Combine(this._baseDirectory, CONFIGURATION_FILE_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For named profiles, use the profile-specific config file in the Profiles folder
|
|
||||||
string profilesFolder = Path.Combine(this._baseDirectory, PROFILES_FOLDER_NAME);
|
|
||||||
return Path.Combine(profilesFolder, this._currentProfile + PROFILE_CONFIG_FILE_EXTENSION);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,282 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Security.AccessControl;
|
|
||||||
using System.Security.Principal;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace EveOPreview.Configuration.Implementation {
|
|
||||||
class ProfileManager : IProfileManager {
|
|
||||||
private const string PROFILES_FOLDER_NAME = "Profiles";
|
|
||||||
private const string MASTER_CONFIG_FILE_NAME = "EVE-O-Preview-Master.json";
|
|
||||||
private const string PROFILE_CONFIG_FILE_EXTENSION = ".json";
|
|
||||||
private const string PROFILE_LOCK_MUTEX_PREFIX = "EVE-O-Preview_ProfileLock_";
|
|
||||||
|
|
||||||
private readonly IAppConfig _appConfig;
|
|
||||||
private readonly IConfigurationStorage _configurationStorage;
|
|
||||||
private readonly string _baseDirectory;
|
|
||||||
private readonly Dictionary<string, Mutex> _acquiredLocks;
|
|
||||||
private Mutex _currentProfileLock;
|
|
||||||
|
|
||||||
public ProfileManager(IAppConfig appConfig, IConfigurationStorage configurationStorage) {
|
|
||||||
this._appConfig = appConfig;
|
|
||||||
this._configurationStorage = configurationStorage;
|
|
||||||
|
|
||||||
// Get the base directory (where the main config file is located)
|
|
||||||
// We'll use the application base directory
|
|
||||||
this._baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
|
||||||
|
|
||||||
// Ensure Profiles folder exists
|
|
||||||
this.EnsureProfilesFolderExists();
|
|
||||||
|
|
||||||
// Ensure master config exists
|
|
||||||
this.EnsureMasterConfigExists();
|
|
||||||
|
|
||||||
this._acquiredLocks = new Dictionary<string, Mutex>();
|
|
||||||
this._currentProfileLock = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public System.Collections.Generic.List<string> GetAvailableProfiles() {
|
|
||||||
string profilesPath = this.GetProfilesFolderPath();
|
|
||||||
var profiles = new System.Collections.Generic.List<string> { "Default" };
|
|
||||||
|
|
||||||
if (Directory.Exists(profilesPath)) {
|
|
||||||
var profileFiles = Directory.GetFiles(profilesPath, "*" + PROFILE_CONFIG_FILE_EXTENSION);
|
|
||||||
foreach (var file in profileFiles) {
|
|
||||||
string profileName = Path.GetFileNameWithoutExtension(file);
|
|
||||||
if (!string.IsNullOrEmpty(profileName) && !profiles.Contains(profileName)) {
|
|
||||||
profiles.Add(profileName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return profiles;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GetActiveProfile() {
|
|
||||||
string masterConfigPath = this.GetMasterConfigPath();
|
|
||||||
|
|
||||||
if (!File.Exists(masterConfigPath)) {
|
|
||||||
return "Default";
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
string rawData = File.ReadAllText(masterConfigPath);
|
|
||||||
var masterConfig = JsonConvert.DeserializeObject<MasterConfig>(rawData);
|
|
||||||
return masterConfig?.ActiveProfile ?? "Default";
|
|
||||||
} catch {
|
|
||||||
return "Default";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SwitchProfile(string profileName) {
|
|
||||||
if (string.IsNullOrEmpty(profileName)) {
|
|
||||||
profileName = "Default";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the profile is locked by another instance
|
|
||||||
if (this.IsProfileLocked(profileName)) {
|
|
||||||
MessageBox.Show(
|
|
||||||
$"Cannot switch to profile '{profileName}' because it is already in use by another instance.",
|
|
||||||
"Profile In Use",
|
|
||||||
MessageBoxButtons.OK,
|
|
||||||
MessageBoxIcon.Warning
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the current instance ID
|
|
||||||
int instanceId = global::EveOPreview.Program.InstanceId;
|
|
||||||
|
|
||||||
// Get the current profile for this instance
|
|
||||||
var profiles = this.GetProfilesList();
|
|
||||||
string currentProfile = instanceId >= 0 && instanceId < profiles.Count
|
|
||||||
? profiles[instanceId]
|
|
||||||
: "Default";
|
|
||||||
|
|
||||||
// Save current configuration first
|
|
||||||
this._configurationStorage.Save();
|
|
||||||
|
|
||||||
// Release current profile lock
|
|
||||||
this.ReleaseProfileLock(currentProfile);
|
|
||||||
|
|
||||||
// Acquire new profile lock
|
|
||||||
this.AcquireProfileLock(profileName);
|
|
||||||
|
|
||||||
// Update the Profiles array for this instance
|
|
||||||
this.UpdateProfileForInstance(instanceId, profileName);
|
|
||||||
|
|
||||||
// Restart the application
|
|
||||||
this.RestartApplication();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GetProfileConfigPath(string profileName) {
|
|
||||||
if (string.IsNullOrEmpty(profileName) || profileName == "Default") {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Path.Combine(this.GetProfilesFolderPath(), profileName + PROFILE_CONFIG_FILE_EXTENSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetProfilesFolderPath() {
|
|
||||||
return Path.Combine(this._baseDirectory, PROFILES_FOLDER_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetMasterConfigPath() {
|
|
||||||
return Path.Combine(this._baseDirectory, MASTER_CONFIG_FILE_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void EnsureProfilesFolderExists() {
|
|
||||||
string profilesPath = this.GetProfilesFolderPath();
|
|
||||||
if (!Directory.Exists(profilesPath)) {
|
|
||||||
Directory.CreateDirectory(profilesPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void EnsureMasterConfigExists() {
|
|
||||||
string masterConfigPath = this.GetMasterConfigPath();
|
|
||||||
|
|
||||||
if (!File.Exists(masterConfigPath)) {
|
|
||||||
var availableProfiles = this.GetAvailableProfiles();
|
|
||||||
var defaultConfig = new MasterConfig {
|
|
||||||
ActiveProfile = "Default",
|
|
||||||
Profiles = availableProfiles
|
|
||||||
};
|
|
||||||
string rawData = JsonConvert.SerializeObject(defaultConfig, Formatting.Indented);
|
|
||||||
File.WriteAllText(masterConfigPath, rawData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SaveActiveProfile(string profileName) {
|
|
||||||
// Read existing config to preserve Profiles array
|
|
||||||
var existingConfig = this.LoadMasterConfig();
|
|
||||||
if (existingConfig == null) {
|
|
||||||
existingConfig = new MasterConfig { Profiles = this.GetAvailableProfiles() };
|
|
||||||
}
|
|
||||||
|
|
||||||
existingConfig.ActiveProfile = profileName;
|
|
||||||
string rawData = JsonConvert.SerializeObject(existingConfig, Formatting.Indented);
|
|
||||||
string masterConfigPath = this.GetMasterConfigPath();
|
|
||||||
|
|
||||||
try {
|
|
||||||
File.WriteAllText(masterConfigPath, rawData);
|
|
||||||
} catch (IOException) {
|
|
||||||
// Ignore error if config cannot be written
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private MasterConfig LoadMasterConfig() {
|
|
||||||
string masterConfigPath = this.GetMasterConfigPath();
|
|
||||||
|
|
||||||
if (!File.Exists(masterConfigPath)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
string rawData = File.ReadAllText(masterConfigPath);
|
|
||||||
return JsonConvert.DeserializeObject<MasterConfig>(rawData);
|
|
||||||
} catch {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RestartApplication() {
|
|
||||||
// Call the static method in Program which properly handles the mutex
|
|
||||||
Program.RestartApplication();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<string> GetProfilesList() {
|
|
||||||
var masterConfig = this.LoadMasterConfig();
|
|
||||||
if (masterConfig?.Profiles != null && masterConfig.Profiles.Count > 0) {
|
|
||||||
return masterConfig.Profiles;
|
|
||||||
}
|
|
||||||
return this.GetAvailableProfiles();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GetProfileForInstance(int instanceId) {
|
|
||||||
var profiles = this.GetProfilesList();
|
|
||||||
if (instanceId >= 0 && instanceId < profiles.Count) {
|
|
||||||
return profiles[instanceId];
|
|
||||||
}
|
|
||||||
return "Default";
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsProfileLocked(string profileName) {
|
|
||||||
if (string.IsNullOrEmpty(profileName) || profileName == "Default") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
string mutexName = PROFILE_LOCK_MUTEX_PREFIX + profileName;
|
|
||||||
try {
|
|
||||||
Mutex.OpenExisting(mutexName);
|
|
||||||
return true;
|
|
||||||
} catch (UnauthorizedAccessException) {
|
|
||||||
return true;
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool AcquireProfileLock(string profileName) {
|
|
||||||
if (string.IsNullOrEmpty(profileName) || profileName == "Default") {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
string mutexName = PROFILE_LOCK_MUTEX_PREFIX + profileName;
|
|
||||||
try {
|
|
||||||
var mutex = new Mutex(true, mutexName);
|
|
||||||
this._currentProfileLock = mutex;
|
|
||||||
return true;
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ReleaseProfileLock(string profileName) {
|
|
||||||
if (this._currentProfileLock != null) {
|
|
||||||
this._currentProfileLock.ReleaseMutex();
|
|
||||||
this._currentProfileLock.Dispose();
|
|
||||||
this._currentProfileLock = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateProfileForInstance(int instanceId, string profileName) {
|
|
||||||
var masterConfig = this.LoadMasterConfig();
|
|
||||||
if (masterConfig == null) {
|
|
||||||
masterConfig = new MasterConfig { Profiles = this.GetAvailableProfiles() };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure the Profiles array is large enough
|
|
||||||
if (masterConfig.Profiles == null) {
|
|
||||||
masterConfig.Profiles = this.GetAvailableProfiles();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Expand the array if necessary
|
|
||||||
while (masterConfig.Profiles.Count <= instanceId) {
|
|
||||||
masterConfig.Profiles.Add("Default");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the profile for this instance
|
|
||||||
masterConfig.Profiles[instanceId] = profileName;
|
|
||||||
|
|
||||||
// Save the updated config
|
|
||||||
string rawData = JsonConvert.SerializeObject(masterConfig, Formatting.Indented);
|
|
||||||
string masterConfigPath = this.GetMasterConfigPath();
|
|
||||||
|
|
||||||
try {
|
|
||||||
File.WriteAllText(masterConfigPath, rawData);
|
|
||||||
} catch (IOException) {
|
|
||||||
// Ignore error if config cannot be written
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class MasterConfig {
|
|
||||||
public string ActiveProfile { get; set; }
|
|
||||||
public List<string> Profiles { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -332,7 +332,7 @@ namespace EveOPreview.Configuration.Implementation {
|
|||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonProperty("ThumbnailsManuallyHidden")]
|
||||||
public bool ThumbnailsManuallyHidden {
|
public bool ThumbnailsManuallyHidden {
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace EveOPreview.Configuration {
|
|
||||||
public interface IProfileManager {
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the list of available profile names from the Profiles folder
|
|
||||||
/// </summary>
|
|
||||||
List<string> GetAvailableProfiles();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the currently active profile name from the master config
|
|
||||||
/// </summary>
|
|
||||||
string GetActiveProfile();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Switches to the specified profile, saves current config, updates master config, and restarts the application
|
|
||||||
/// </summary>
|
|
||||||
void SwitchProfile(string profileName);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the full path to a profile's config file
|
|
||||||
/// </summary>
|
|
||||||
string GetProfileConfigPath(string profileName);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the list of profiles from the master config array
|
|
||||||
/// </summary>
|
|
||||||
List<string> GetProfilesList();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the profile name for the specified instance ID
|
|
||||||
/// </summary>
|
|
||||||
string GetProfileForInstance(int instanceId);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Checks if a profile is currently locked by another instance
|
|
||||||
/// </summary>
|
|
||||||
bool IsProfileLocked(string profileName);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Acquires a lock on the specified profile for the current instance
|
|
||||||
/// </summary>
|
|
||||||
bool AcquireProfileLock(string profileName);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Releases the lock on the specified profile
|
|
||||||
/// </summary>
|
|
||||||
void ReleaseProfileLock(string profileName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -18,7 +18,6 @@ namespace EveOPreview.Presenters {
|
|||||||
private readonly IMediator _mediator;
|
private readonly IMediator _mediator;
|
||||||
private readonly IThumbnailConfiguration _configuration;
|
private readonly IThumbnailConfiguration _configuration;
|
||||||
private readonly IConfigurationStorage _configurationStorage;
|
private readonly IConfigurationStorage _configurationStorage;
|
||||||
private readonly IProfileManager _profileManager;
|
|
||||||
private readonly IDictionary<string, IThumbnailDescription> _descriptionsCache;
|
private readonly IDictionary<string, IThumbnailDescription> _descriptionsCache;
|
||||||
private bool _suppressSizeNotifications;
|
private bool _suppressSizeNotifications;
|
||||||
|
|
||||||
@@ -26,13 +25,11 @@ namespace EveOPreview.Presenters {
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public MainFormPresenter(IApplicationController controller, IMainFormView view, IMediator mediator,
|
public MainFormPresenter(IApplicationController controller, IMainFormView view, IMediator mediator,
|
||||||
IThumbnailConfiguration configuration, IConfigurationStorage configurationStorage,
|
IThumbnailConfiguration configuration, IConfigurationStorage configurationStorage)
|
||||||
IProfileManager profileManager)
|
|
||||||
: base(controller, view) {
|
: base(controller, view) {
|
||||||
this._mediator = mediator;
|
this._mediator = mediator;
|
||||||
this._configuration = configuration;
|
this._configuration = configuration;
|
||||||
this._configurationStorage = configurationStorage;
|
this._configurationStorage = configurationStorage;
|
||||||
this._profileManager = profileManager;
|
|
||||||
|
|
||||||
this._descriptionsCache = new Dictionary<string, IThumbnailDescription>();
|
this._descriptionsCache = new Dictionary<string, IThumbnailDescription>();
|
||||||
|
|
||||||
@@ -47,22 +44,21 @@ namespace EveOPreview.Presenters {
|
|||||||
this.View.ThumbnailStateChanged = this.UpdateThumbnailState;
|
this.View.ThumbnailStateChanged = this.UpdateThumbnailState;
|
||||||
this.View.DocumentationLinkActivated = this.OpenDocumentationLink;
|
this.View.DocumentationLinkActivated = this.OpenDocumentationLink;
|
||||||
this.View.ApplicationExitRequested = this.ExitApplication;
|
this.View.ApplicationExitRequested = this.ExitApplication;
|
||||||
this.View.ProfileSwitchRequested = this.SwitchProfile;
|
|
||||||
this.View.CloseAllInstances = this.CloseAllInstances;
|
|
||||||
|
|
||||||
this.View.IconName = this._configuration.IconName;
|
this.View.IconName = this._configuration.IconName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTrayProfileMenu() {
|
private void Activate() {
|
||||||
var profiles = this._profileManager.GetAvailableProfiles();
|
this._suppressSizeNotifications = true;
|
||||||
// Get the profile for this specific instance
|
this.LoadApplicationSettings();
|
||||||
int instanceId = global::EveOPreview.Program.InstanceId;
|
this.View.SetDocumentationUrl(MainFormPresenter.FORUM_URL);
|
||||||
var currentProfile = this._profileManager.GetProfileForInstance(instanceId);
|
this.View.SetVersionInfo(this.GetApplicationVersion());
|
||||||
this.View.UpdateTrayProfileMenu(profiles, currentProfile);
|
if (this._configuration.MinimizeToTray) {
|
||||||
}
|
this.View.Minimize();
|
||||||
|
}
|
||||||
|
|
||||||
private void SwitchProfile(string profileName) {
|
this._mediator.Send(new StartService());
|
||||||
this._profileManager.SwitchProfile(profileName);
|
this._suppressSizeNotifications = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Minimize() {
|
private void Minimize() {
|
||||||
@@ -290,78 +286,5 @@ namespace EveOPreview.Presenters {
|
|||||||
this._exitApplication = true;
|
this._exitApplication = true;
|
||||||
this.View.Close();
|
this.View.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private const string CLOSE_ALL_EVENT_NAME = "EVE-O-Preview_CloseAllEvent";
|
|
||||||
private static System.Threading.EventWaitHandle _closeAllEvent;
|
|
||||||
private static bool _closeAllListenerInitialized = false;
|
|
||||||
|
|
||||||
private void CloseAllInstances() {
|
|
||||||
// Signal all instances to close
|
|
||||||
if (_closeAllEvent == null) {
|
|
||||||
bool created;
|
|
||||||
_closeAllEvent = new System.Threading.EventWaitHandle(false, System.Threading.EventResetMode.ManualReset, CLOSE_ALL_EVENT_NAME, out created);
|
|
||||||
if (!created) {
|
|
||||||
_closeAllEvent = System.Threading.EventWaitHandle.OpenExisting(CLOSE_ALL_EVENT_NAME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_closeAllEvent.Set();
|
|
||||||
|
|
||||||
// Give time for signal to propagate to other instances
|
|
||||||
// DO NOT reset - let each instance handle its own exit
|
|
||||||
System.Threading.Thread.Sleep(500);
|
|
||||||
|
|
||||||
// Close this instance
|
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InitializeCloseAllListener() {
|
|
||||||
if (_closeAllListenerInitialized) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_closeAllListenerInitialized = true;
|
|
||||||
|
|
||||||
// Initialize the close all event listener on app startup
|
|
||||||
System.Threading.Thread listenerThread = new System.Threading.Thread(() => {
|
|
||||||
try {
|
|
||||||
bool created;
|
|
||||||
var closeEvent = new System.Threading.EventWaitHandle(false, System.Threading.EventResetMode.ManualReset, CLOSE_ALL_EVENT_NAME, out created);
|
|
||||||
if (!created) {
|
|
||||||
closeEvent = System.Threading.EventWaitHandle.OpenExisting(CLOSE_ALL_EVENT_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for the close all signal (one-time wait, then exit)
|
|
||||||
closeEvent.WaitOne();
|
|
||||||
|
|
||||||
// Force immediate exit - no marshaling needed since we're terminating the process
|
|
||||||
Environment.Exit(0);
|
|
||||||
} catch {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}) {
|
|
||||||
IsBackground = true,
|
|
||||||
Name = "CloseAllListener"
|
|
||||||
};
|
|
||||||
listenerThread.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Activate() {
|
|
||||||
// Initialize the close all listener on first activation
|
|
||||||
this.InitializeCloseAllListener();
|
|
||||||
|
|
||||||
this._suppressSizeNotifications = true;
|
|
||||||
this.LoadApplicationSettings();
|
|
||||||
this.View.SetDocumentationUrl(MainFormPresenter.FORUM_URL);
|
|
||||||
this.View.SetVersionInfo(this.GetApplicationVersion());
|
|
||||||
if (this._configuration.MinimizeToTray) {
|
|
||||||
this.View.Minimize();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the tray profile menu
|
|
||||||
this.UpdateTrayProfileMenu();
|
|
||||||
|
|
||||||
this._mediator.Send(new StartService());
|
|
||||||
this._suppressSizeNotifications = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using EveOPreview.Configuration;
|
using EveOPreview.Configuration;
|
||||||
using EveOPreview.Configuration.Implementation;
|
|
||||||
using EveOPreview.Presenters;
|
using EveOPreview.Presenters;
|
||||||
using EveOPreview.Services;
|
using EveOPreview.Services;
|
||||||
using EveOPreview.View;
|
using EveOPreview.View;
|
||||||
@@ -11,27 +9,17 @@ using MediatR;
|
|||||||
|
|
||||||
namespace EveOPreview {
|
namespace EveOPreview {
|
||||||
static class Program {
|
static class Program {
|
||||||
private const string MUTEX_PREFIX = "EVE-O-Preview_Instance_";
|
private static string MUTEX_NAME = "EVE-O-Preview Single Instance Mutex";
|
||||||
private const string INSTANCE_ID_ARG = "--instance-id=";
|
|
||||||
|
|
||||||
private static Mutex _singleInstanceMutex;
|
private static Mutex _singleInstanceMutex;
|
||||||
private static int _instanceId = 0;
|
|
||||||
|
|
||||||
/// <summary>The main entry point for the application.</summary>
|
/// <summary>The main entry point for the application.</summary>
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args) {
|
static void Main() {
|
||||||
// Parse instance ID from command line arguments, or auto-detect next available
|
|
||||||
Program._instanceId = ParseInstanceId(args);
|
|
||||||
|
|
||||||
// If no instance ID was provided, find the next available one
|
|
||||||
if (Program._instanceId == 0 && !HasInstanceIdArgument(args)) {
|
|
||||||
Program._instanceId = FindNextAvailableInstanceId();
|
|
||||||
}
|
|
||||||
|
|
||||||
// The very usual Mutex-based single-instance screening
|
// The very usual Mutex-based single-instance screening
|
||||||
// 'token' variable is used to store reference to the instance Mutex
|
// 'token' variable is used to store reference to the instance Mutex
|
||||||
// during the app lifetime
|
// during the app lifetime
|
||||||
Program._singleInstanceMutex = Program.GetInstanceToken(Program._instanceId);
|
Program._singleInstanceMutex = Program.GetInstanceToken();
|
||||||
|
|
||||||
// If it was not possible to acquire the app token then another app instance is already running
|
// If it was not possible to acquire the app token then another app instance is already running
|
||||||
// Nothing to do here
|
// Nothing to do here
|
||||||
@@ -48,57 +36,20 @@ namespace EveOPreview {
|
|||||||
controller.Run<MainFormPresenter>();
|
controller.Run<MainFormPresenter>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool HasInstanceIdArgument(string[] args) {
|
private static Mutex GetInstanceToken() {
|
||||||
if (args == null || args.Length == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return args.Any(a => a.StartsWith(INSTANCE_ID_ARG));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int ParseInstanceId(string[] args) {
|
|
||||||
if (args == null || args.Length == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
var arg = args.FirstOrDefault(a => a.StartsWith(INSTANCE_ID_ARG));
|
|
||||||
if (arg != null && int.TryParse(arg.Substring(INSTANCE_ID_ARG.Length), out int id)) {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int FindNextAvailableInstanceId() {
|
|
||||||
// Try instance IDs starting from 0, find the first one that's not in use
|
|
||||||
for (int id = 0; id < 10; id++) {
|
|
||||||
string mutexName = MUTEX_PREFIX + id;
|
|
||||||
try {
|
|
||||||
Mutex.OpenExisting(mutexName);
|
|
||||||
// This instance ID is taken, try next
|
|
||||||
} catch {
|
|
||||||
// This instance ID is available
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0; // Fallback to 0 if all are taken
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Mutex GetInstanceToken(int instanceId) {
|
|
||||||
string mutexName = MUTEX_PREFIX + instanceId;
|
|
||||||
|
|
||||||
// The code might look overcomplicated here for a single Mutex operation
|
// The code might look overcomplicated here for a single Mutex operation
|
||||||
// Yet we had already experienced a Windows-level issue
|
// Yet we had already experienced a Windows-level issue
|
||||||
// where .NET finalizer thread was literally paralyzed by
|
// where .NET finalizer thread was literally paralyzed by
|
||||||
// a failed Mutex operation. That did lead to weird OutOfMemory
|
// a failed Mutex operation. That did lead to weird OutOfMemory
|
||||||
// exceptions later
|
// exceptions later
|
||||||
try {
|
try {
|
||||||
Mutex.OpenExisting(mutexName);
|
Mutex.OpenExisting(Program.MUTEX_NAME);
|
||||||
// if that didn't fail then another instance is already running
|
// if that didn't fail then another instance is already running
|
||||||
return null;
|
return null;
|
||||||
} catch (UnauthorizedAccessException) {
|
} catch (UnauthorizedAccessException) {
|
||||||
return null;
|
return null;
|
||||||
} catch (Exception) {
|
} catch (Exception) {
|
||||||
Mutex token = new Mutex(true, mutexName, out var result);
|
Mutex token = new Mutex(true, Program.MUTEX_NAME, out var result);
|
||||||
return result ? token : null;
|
return result ? token : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,13 +78,9 @@ namespace EveOPreview {
|
|||||||
container.Register(typeof(IRequestHandler<, >), typeof(Program).Assembly);
|
container.Register(typeof(IRequestHandler<, >), typeof(Program).Assembly);
|
||||||
|
|
||||||
// Configuration services
|
// Configuration services
|
||||||
|
container.Register<IConfigurationStorage>();
|
||||||
container.Register<IAppConfig>();
|
container.Register<IAppConfig>();
|
||||||
container.Register<IThumbnailConfiguration>();
|
container.Register<IThumbnailConfiguration>();
|
||||||
container.Register<IConfigurationStorage>();
|
|
||||||
container.Register<IProfileManager>();
|
|
||||||
|
|
||||||
// Initialize profile system
|
|
||||||
Program.InitializeProfileSystem(container);
|
|
||||||
|
|
||||||
// Application services
|
// Application services
|
||||||
container.Register<IThumbnailManager>();
|
container.Register<IThumbnailManager>();
|
||||||
@@ -151,58 +98,5 @@ namespace EveOPreview {
|
|||||||
|
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void InitializeProfileSystem(IIocContainer container) {
|
|
||||||
var profileManager = container.Resolve<IProfileManager>();
|
|
||||||
var configurationStorage = container.Resolve<IConfigurationStorage>();
|
|
||||||
var thumbnailConfiguration = container.Resolve<IThumbnailConfiguration>();
|
|
||||||
|
|
||||||
// Get the active profile for this instance based on instance ID
|
|
||||||
string activeProfile = profileManager.GetProfileForInstance(Program._instanceId);
|
|
||||||
|
|
||||||
// Acquire the profile lock for this instance
|
|
||||||
profileManager.AcquireProfileLock(activeProfile);
|
|
||||||
|
|
||||||
// Set the current profile in the configuration storage
|
|
||||||
if (configurationStorage is ConfigurationStorage configStorage) {
|
|
||||||
configStorage.CurrentProfile = activeProfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the thumbnail configuration with the active profile
|
|
||||||
thumbnailConfiguration.CurrentProfile = activeProfile;
|
|
||||||
thumbnailConfiguration.AvailableProfiles = profileManager.GetAvailableProfiles();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void RestartApplication() {
|
|
||||||
// Get the current executable path
|
|
||||||
string executablePath = System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName;
|
|
||||||
if (string.IsNullOrEmpty(executablePath)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release the mutex first so the new instance can start
|
|
||||||
Program._singleInstanceMutex?.Dispose();
|
|
||||||
Program._singleInstanceMutex = null;
|
|
||||||
|
|
||||||
// Small delay to ensure the mutex is fully released
|
|
||||||
System.Threading.Thread.Sleep(100);
|
|
||||||
|
|
||||||
// Start a new instance of the application with the same instance ID
|
|
||||||
try {
|
|
||||||
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo {
|
|
||||||
FileName = executablePath,
|
|
||||||
Arguments = INSTANCE_ID_ARG + Program._instanceId,
|
|
||||||
UseShellExecute = true
|
|
||||||
});
|
|
||||||
} catch (Exception) {
|
|
||||||
// If starting the new process fails, we're in a bad state
|
|
||||||
// Just exit anyway
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exit the current application immediately
|
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int InstanceId => Program._instanceId;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,6 @@ using System.ComponentModel;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
@@ -55,11 +54,6 @@ namespace EveOPreview.Services {
|
|||||||
private HotkeyHandler _toggleTrackingHotkey;
|
private HotkeyHandler _toggleTrackingHotkey;
|
||||||
private HotkeyHandler _toggleSingleProcessHotkey;
|
private HotkeyHandler _toggleSingleProcessHotkey;
|
||||||
private HotkeyHandler _toggleAllThumbnailsHotkey;
|
private HotkeyHandler _toggleAllThumbnailsHotkey;
|
||||||
private EventWaitHandle _toggleEvent;
|
|
||||||
private Thread _toggleEventThread;
|
|
||||||
private SynchronizationContext _syncContext;
|
|
||||||
private const string TOGGLE_EVENT_NAME = "EVE-O-Preview_ToggleEvent";
|
|
||||||
private bool _isToggleInitiator;
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public ThumbnailManager(IMediator mediator, IThumbnailConfiguration configuration,
|
public ThumbnailManager(IMediator mediator, IThumbnailConfiguration configuration,
|
||||||
@@ -82,9 +76,6 @@ namespace EveOPreview.Services {
|
|||||||
|
|
||||||
this._thumbnailViews = new Dictionary<IntPtr, IThumbnailView>();
|
this._thumbnailViews = new Dictionary<IntPtr, IThumbnailView>();
|
||||||
|
|
||||||
// Capture the current synchronization context (UI thread)
|
|
||||||
this._syncContext = SynchronizationContext.Current;
|
|
||||||
|
|
||||||
// DispatcherTimer setup
|
// DispatcherTimer setup
|
||||||
this._thumbnailUpdateTimer = new DispatcherTimer();
|
this._thumbnailUpdateTimer = new DispatcherTimer();
|
||||||
this._thumbnailUpdateTimer.Tick += ThumbnailUpdateTimerTick;
|
this._thumbnailUpdateTimer.Tick += ThumbnailUpdateTimerTick;
|
||||||
@@ -185,34 +176,13 @@ namespace EveOPreview.Services {
|
|||||||
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
|
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
|
||||||
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
|
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
|
||||||
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
|
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
|
||||||
// Mark this instance as the initiator so we don't process our own event
|
|
||||||
this._isToggleInitiator = true;
|
|
||||||
|
|
||||||
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
|
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
|
||||||
this._hideThumbnailsDelay = 0;
|
|
||||||
this.RefreshThumbnails();
|
|
||||||
|
|
||||||
// Signal all other instances to toggle as well
|
|
||||||
this._toggleEvent?.Set();
|
|
||||||
|
|
||||||
// Reset the event after a short delay so other instances can process it
|
|
||||||
// Then clear the initiator flag
|
|
||||||
System.Threading.Timer resetTimer = null;
|
|
||||||
resetTimer = new System.Threading.Timer(_ => {
|
|
||||||
this._toggleEvent?.Reset();
|
|
||||||
this._isToggleInitiator = false;
|
|
||||||
resetTimer?.Dispose();
|
|
||||||
}, null, 50, System.Threading.Timeout.Infinite);
|
|
||||||
|
|
||||||
System.Diagnostics.Debug.WriteLine(
|
System.Diagnostics.Debug.WriteLine(
|
||||||
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
|
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
registered = this._toggleAllThumbnailsHotkey.Register();
|
registered = this._toggleAllThumbnailsHotkey.Register();
|
||||||
System.Diagnostics.Debug.WriteLine($"Toggle all thumbnails hotkey registration result: {registered}");
|
System.Diagnostics.Debug.WriteLine($"Toggle all thumbnails hotkey registration result: {registered}");
|
||||||
|
|
||||||
// Initialize the toggle event for multi-instance synchronization
|
|
||||||
this.InitializeToggleEvent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReRegisterHotkeys() {
|
public void ReRegisterHotkeys() {
|
||||||
@@ -285,25 +255,7 @@ namespace EveOPreview.Services {
|
|||||||
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
|
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
|
||||||
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
|
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
|
||||||
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
|
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
|
||||||
// Mark this instance as the initiator so we don't process our own event
|
|
||||||
this._isToggleInitiator = true;
|
|
||||||
|
|
||||||
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
|
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
|
||||||
this._hideThumbnailsDelay = 0;
|
|
||||||
this.RefreshThumbnails();
|
|
||||||
|
|
||||||
// Signal all other instances to toggle as well
|
|
||||||
this._toggleEvent?.Set();
|
|
||||||
|
|
||||||
// Reset the event after a short delay so other instances can process it
|
|
||||||
// Then clear the initiator flag
|
|
||||||
System.Threading.Timer resetTimer = null;
|
|
||||||
resetTimer = new System.Threading.Timer(_ => {
|
|
||||||
this._toggleEvent?.Reset();
|
|
||||||
this._isToggleInitiator = false;
|
|
||||||
resetTimer?.Dispose();
|
|
||||||
}, null, 50, System.Threading.Timeout.Infinite);
|
|
||||||
|
|
||||||
System.Diagnostics.Debug.WriteLine(
|
System.Diagnostics.Debug.WriteLine(
|
||||||
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
|
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
@@ -311,62 +263,6 @@ namespace EveOPreview.Services {
|
|||||||
this._toggleAllThumbnailsHotkey.Register();
|
this._toggleAllThumbnailsHotkey.Register();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeToggleEvent() {
|
|
||||||
bool created;
|
|
||||||
try {
|
|
||||||
// Create or open the named event - use ManualReset to wake all instances
|
|
||||||
this._toggleEvent = new EventWaitHandle(false, EventResetMode.ManualReset, TOGGLE_EVENT_NAME, out created);
|
|
||||||
if (!created) {
|
|
||||||
// Event already exists, use it
|
|
||||||
this._toggleEvent = EventWaitHandle.OpenExisting(TOGGLE_EVENT_NAME);
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
// Fallback: create a new one
|
|
||||||
this._toggleEvent = new EventWaitHandle(false, EventResetMode.ManualReset, TOGGLE_EVENT_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start a thread to listen for toggle events from other instances
|
|
||||||
this._toggleEventThread = new Thread(this.ToggleEventListener) {
|
|
||||||
IsBackground = true,
|
|
||||||
Name = "ToggleEventListener"
|
|
||||||
};
|
|
||||||
this._toggleEventThread.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ToggleEventListener() {
|
|
||||||
while (true) {
|
|
||||||
try {
|
|
||||||
// Wait for the toggle event
|
|
||||||
this._toggleEvent?.WaitOne();
|
|
||||||
|
|
||||||
// Reset the event so we can wait again
|
|
||||||
this._toggleEvent?.Reset();
|
|
||||||
|
|
||||||
// Skip processing if we initiated this toggle
|
|
||||||
// Check inside the UI thread callback to avoid race conditions
|
|
||||||
this._syncContext?.Post(_ => {
|
|
||||||
// Double-check the flag on the UI thread after a small delay
|
|
||||||
// to ensure the initiator's flag is still set
|
|
||||||
System.Threading.Thread.Sleep(10);
|
|
||||||
if (this._isToggleInitiator) {
|
|
||||||
return; // Skip - we initiated this toggle
|
|
||||||
}
|
|
||||||
|
|
||||||
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
|
|
||||||
this._hideThumbnailsDelay = 0;
|
|
||||||
this.RefreshThumbnails();
|
|
||||||
System.Diagnostics.Debug.WriteLine(
|
|
||||||
$"Received toggle event: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
|
|
||||||
}, null);
|
|
||||||
} catch (ThreadAbortException) {
|
|
||||||
// Thread is being aborted, exit gracefully
|
|
||||||
break;
|
|
||||||
} catch {
|
|
||||||
// Ignore other errors and continue listening
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IThumbnailView GetClientByTitle(string title) {
|
public IThumbnailView GetClientByTitle(string title) {
|
||||||
return _thumbnailViews.FirstOrDefault(x => x.Value.Title == title).Value;
|
return _thumbnailViews.FirstOrDefault(x => x.Value.Title == title).Value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,9 +45,6 @@ namespace EveOPreview.View {
|
|||||||
// Add mouse wheel event handlers for aspect ratio maintenance
|
// Add mouse wheel event handlers for aspect ratio maintenance
|
||||||
this.ThumbnailsWidthNumericEdit.MouseWheel += ThumbnailSizeNumeric_MouseWheel;
|
this.ThumbnailsWidthNumericEdit.MouseWheel += ThumbnailSizeNumeric_MouseWheel;
|
||||||
this.ThumbnailsHeightNumericEdit.MouseWheel += ThumbnailSizeNumeric_MouseWheel;
|
this.ThumbnailsHeightNumericEdit.MouseWheel += ThumbnailSizeNumeric_MouseWheel;
|
||||||
|
|
||||||
// Set tray icon text with instance ID
|
|
||||||
this.SetTrayIconText();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool MinimizeToTray {
|
public bool MinimizeToTray {
|
||||||
@@ -422,83 +419,6 @@ namespace EveOPreview.View {
|
|||||||
|
|
||||||
public Action DocumentationLinkActivated { get; set; }
|
public Action DocumentationLinkActivated { get; set; }
|
||||||
|
|
||||||
public Action<string> ProfileSwitchRequested { get; set; }
|
|
||||||
|
|
||||||
public Action CloseAllInstances { get; set; }
|
|
||||||
|
|
||||||
public void UpdateTrayProfileMenu(List<string> profiles, string currentProfile) {
|
|
||||||
// Clear existing items from the tray menu
|
|
||||||
this.TrayMenu.Items.Clear();
|
|
||||||
|
|
||||||
// Add title
|
|
||||||
ToolStripMenuItem titleMenuItem = new ToolStripMenuItem();
|
|
||||||
titleMenuItem.Enabled = false;
|
|
||||||
titleMenuItem.Name = "TitleMenuItem";
|
|
||||||
titleMenuItem.Size = new System.Drawing.Size(200, 22);
|
|
||||||
titleMenuItem.Text = "EVE-O-Preview";
|
|
||||||
this.TrayMenu.Items.Add(titleMenuItem);
|
|
||||||
|
|
||||||
// Add restore option
|
|
||||||
ToolStripMenuItem restoreMenuItem = new ToolStripMenuItem();
|
|
||||||
restoreMenuItem.Name = "RestoreWindowMenuItem";
|
|
||||||
restoreMenuItem.Size = new System.Drawing.Size(200, 22);
|
|
||||||
restoreMenuItem.Text = "Restore";
|
|
||||||
restoreMenuItem.Click += this.RestoreMainForm_Handler;
|
|
||||||
this.TrayMenu.Items.Add(restoreMenuItem);
|
|
||||||
|
|
||||||
// Add separator
|
|
||||||
ToolStripSeparator separatorMenuItem = new ToolStripSeparator();
|
|
||||||
separatorMenuItem.Name = "SeparatorMenuItem";
|
|
||||||
separatorMenuItem.Size = new System.Drawing.Size(200, 6);
|
|
||||||
this.TrayMenu.Items.Add(separatorMenuItem);
|
|
||||||
|
|
||||||
// Add profile submenu
|
|
||||||
ToolStripMenuItem profileMenuItem = new ToolStripMenuItem();
|
|
||||||
profileMenuItem.Name = "ProfileMenuItem";
|
|
||||||
profileMenuItem.Size = new System.Drawing.Size(200, 22);
|
|
||||||
profileMenuItem.Text = "Profiles";
|
|
||||||
|
|
||||||
foreach (var profile in profiles) {
|
|
||||||
ToolStripMenuItem profileItem = new ToolStripMenuItem();
|
|
||||||
profileItem.Name = "Profile_" + profile;
|
|
||||||
profileItem.Size = new System.Drawing.Size(180, 22);
|
|
||||||
profileItem.Text = profile;
|
|
||||||
profileItem.Checked = (profile == currentProfile);
|
|
||||||
|
|
||||||
profileItem.Click += (sender, e) => {
|
|
||||||
this.ProfileSwitchRequested?.Invoke(profile);
|
|
||||||
};
|
|
||||||
|
|
||||||
profileMenuItem.DropDownItems.Add(profileItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.TrayMenu.Items.Add(profileMenuItem);
|
|
||||||
|
|
||||||
// Add final separator
|
|
||||||
ToolStripSeparator finalSeparatorMenuItem = new ToolStripSeparator();
|
|
||||||
finalSeparatorMenuItem.Name = "FinalSeparatorMenuItem";
|
|
||||||
finalSeparatorMenuItem.Size = new System.Drawing.Size(200, 6);
|
|
||||||
this.TrayMenu.Items.Add(finalSeparatorMenuItem);
|
|
||||||
|
|
||||||
// Add close all option
|
|
||||||
ToolStripMenuItem closeAllMenuItem = new ToolStripMenuItem();
|
|
||||||
closeAllMenuItem.Name = "CloseAllMenuItem";
|
|
||||||
closeAllMenuItem.Size = new System.Drawing.Size(200, 22);
|
|
||||||
closeAllMenuItem.Text = "Close All Instances";
|
|
||||||
closeAllMenuItem.Click += (sender, e) => {
|
|
||||||
this.CloseAllInstances?.Invoke();
|
|
||||||
};
|
|
||||||
this.TrayMenu.Items.Add(closeAllMenuItem);
|
|
||||||
|
|
||||||
// Add exit option
|
|
||||||
ToolStripMenuItem exitMenuItem = new ToolStripMenuItem();
|
|
||||||
exitMenuItem.Name = "ExitMenuItem";
|
|
||||||
exitMenuItem.Size = new System.Drawing.Size(200, 22);
|
|
||||||
exitMenuItem.Text = "Exit";
|
|
||||||
exitMenuItem.Click += this.ExitMenuItemClick_Handler;
|
|
||||||
this.TrayMenu.Items.Add(exitMenuItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region UI events
|
#region UI events
|
||||||
private void ContentTabControl_DrawItem(object sender, DrawItemEventArgs e) {
|
private void ContentTabControl_DrawItem(object sender, DrawItemEventArgs e) {
|
||||||
TabControl control = (TabControl)sender;
|
TabControl control = (TabControl)sender;
|
||||||
@@ -750,12 +670,6 @@ namespace EveOPreview.View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetTrayIconText() {
|
|
||||||
// Get the instance ID from Program
|
|
||||||
int instanceId = EveOPreview.Program.InstanceId;
|
|
||||||
this.NotifyIcon.Text = $"EVE-O-Preview [{instanceId}]";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AnimationStyleCombo_SelectedIndexChanged(object sender, EventArgs e) {}
|
private void AnimationStyleCombo_SelectedIndexChanged(object sender, EventArgs e) {}
|
||||||
|
|
||||||
private void GeneralSettingsPanel_Paint(object sender, PaintEventArgs e) {}
|
private void GeneralSettingsPanel_Paint(object sender, PaintEventArgs e) {}
|
||||||
|
|||||||
@@ -63,11 +63,6 @@ namespace EveOPreview.View {
|
|||||||
void RemoveThumbnails(IList<IThumbnailDescription> thumbnails);
|
void RemoveThumbnails(IList<IThumbnailDescription> thumbnails);
|
||||||
void RefreshZoomSettings();
|
void RefreshZoomSettings();
|
||||||
|
|
||||||
void UpdateTrayProfileMenu(List<string> profiles, string currentProfile);
|
|
||||||
Action<string> ProfileSwitchRequested { get; set; }
|
|
||||||
|
|
||||||
Action CloseAllInstances { get; set; }
|
|
||||||
|
|
||||||
Action ApplicationExitRequested { get; set; }
|
Action ApplicationExitRequested { get; set; }
|
||||||
Action FormActivated { get; set; }
|
Action FormActivated { get; set; }
|
||||||
Action FormMinimized { get; set; }
|
Action FormMinimized { get; set; }
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
{
|
|
||||||
"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.8",
|
|
||||||
"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.8": {},
|
|
||||||
"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.8": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==",
|
|
||||||
"path": "microsoft.net.illink.tasks/8.0.8",
|
|
||||||
"hashPath": "microsoft.net.illink.tasks.8.0.8.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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeOptions": {
|
|
||||||
"tfm": "net8.0",
|
|
||||||
"frameworks": [
|
|
||||||
{
|
|
||||||
"name": "Microsoft.NETCore.App",
|
|
||||||
"version": "8.0.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Microsoft.WindowsDesktop.App",
|
|
||||||
"version": "8.0.0"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"configProperties": {
|
|
||||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user