Skip to content

Commit b0c661f

Browse files
committed
1.0.2
Added manual "Start in HDR" button Added restart feature for apps, which need to be started while HDR is already activated
1 parent 1302c6b commit b0c661f

15 files changed

+287
-41
lines changed

Source/Debug_x64/HDRProfile.exe

5 KB
Binary file not shown.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<HDRProfileSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3+
<AutoStart>true</AutoStart>
4+
<StartMinimizedToTray>false</StartMinimizedToTray>
5+
<CloseToTray>true</CloseToTray>
6+
<HDRMode>Focused</HDRMode>
7+
<ApplicationItems>
8+
<ApplicationItem>
9+
<DisplayName>ModernWarfare</DisplayName>
10+
<ApplicationName>ModernWarfare</ApplicationName>
11+
<ApplicationFilePath>D:\Games\Call of Duty Modern Warfare\ModernWarfare.exe</ApplicationFilePath>
12+
<RestartProcess>false</RestartProcess>
13+
</ApplicationItem>
14+
<ApplicationItem>
15+
<DisplayName>Cyberpunk2077</DisplayName>
16+
<ApplicationName>Cyberpunk2077</ApplicationName>
17+
<ApplicationFilePath>C:\Games\GOG\Cyberpunk 2077\bin\x64\Cyberpunk2077.exe</ApplicationFilePath>
18+
<RestartProcess>true</RestartProcess>
19+
</ApplicationItem>
20+
<ApplicationItem>
21+
<DisplayName>starwarsjedifallenorder</DisplayName>
22+
<ApplicationName>starwarsjedifallenorder</ApplicationName>
23+
<ApplicationFilePath>C:\Games\Origin\Jedi Fallen Order\SwGame\Binaries\Win64\starwarsjedifallenorder.exe</ApplicationFilePath>
24+
<RestartProcess>false</RestartProcess>
25+
</ApplicationItem>
26+
<ApplicationItem>
27+
<DisplayName>ACOdyssey</DisplayName>
28+
<ApplicationName>ACOdyssey</ApplicationName>
29+
<ApplicationFilePath>C:\Games\UPlay\Assassin's Creed Odyssey\ACOdyssey.exe</ApplicationFilePath>
30+
<RestartProcess>false</RestartProcess>
31+
</ApplicationItem>
32+
<ApplicationItem>
33+
<DisplayName>WatchDogsLegion</DisplayName>
34+
<ApplicationName>WatchDogsLegion</ApplicationName>
35+
<ApplicationFilePath>C:\Games\UPlay\Watch Dogs Legion\bin\WatchDogsLegion.exe</ApplicationFilePath>
36+
<RestartProcess>false</RestartProcess>
37+
</ApplicationItem>
38+
<ApplicationItem>
39+
<DisplayName>Anno1800</DisplayName>
40+
<ApplicationName>Anno1800</ApplicationName>
41+
<ApplicationFilePath>C:\Games\UPlay\Anno 1800\Bin\Win64\Anno1800.exe</ApplicationFilePath>
42+
<RestartProcess>false</RestartProcess>
43+
</ApplicationItem>
44+
<ApplicationItem>
45+
<DisplayName>notepad</DisplayName>
46+
<ApplicationName>notepad</ApplicationName>
47+
<ApplicationFilePath>C:\Windows\System32\notepad.exe</ApplicationFilePath>
48+
<RestartProcess>false</RestartProcess>
49+
</ApplicationItem>
50+
</ApplicationItems>
51+
</HDRProfileSettings>
0 Bytes
Binary file not shown.

Source/HDRProfile/App.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<system:String x:Key="DonateLink">https://paypal.me/pools/c/8vksshrMln</system:String>
1414
<system:String x:Key="InfoLink">https://sourceforge.net/projects/hdr-profile</system:String>
15-
<system:String x:Key="Version">1.0.1</system:String>
15+
<system:String x:Key="Version">1.0.2</system:String>
1616
<SolidColorBrush x:Key="ButtonBackground" Color="#FF0086F5"/>
1717
<SolidColorBrush x:Key="AccentColor" Color="#FFFF581A"/>
1818
<SolidColorBrush x:Key="AccentColor2" Color="#4C87B3"/>

Source/HDRProfile/ApplicationItem.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,21 @@
1111

1212
namespace HDRProfile
1313
{
14-
public class ApplicationItem : BaseViewModel
14+
public class ApplicationItem : BaseViewModel, IEquatable<ApplicationItem>
1515
{
1616
private string displayName;
1717
private string _applicationFilePath;
1818
private string _applicationName;
1919
private System.Drawing.Bitmap icon = null;
20+
private bool _restartProcess = false;
21+
2022

2123
public string DisplayName { get => displayName; set { displayName = value; OnPropertyChanged(); } }
2224
public string ApplicationName { get => _applicationName; set { _applicationName = value; OnPropertyChanged(); } }
2325
public string ApplicationFilePath { get => _applicationFilePath; set { _applicationFilePath = value; try { Icon = System.Drawing.Icon.ExtractAssociatedIcon(value).ToBitmap(); } catch { } OnPropertyChanged(); } }
24-
26+
public bool RestartProcess { get => _restartProcess; set { _restartProcess = value; OnPropertyChanged(); } }
27+
28+
2529
[XmlIgnore]
2630
public Bitmap Icon { get => icon; set { icon = value; OnPropertyChanged(); } }
2731
private ApplicationItem()
@@ -35,5 +39,32 @@ public ApplicationItem(string displayName, string applicationFilePath)
3539
ApplicationName = new FileInfo(ApplicationFilePath).Name.Replace(".exe", "");
3640
}
3741

42+
public override bool Equals(object obj)
43+
{
44+
return Equals(obj as ApplicationItem);
45+
}
46+
47+
public bool Equals(ApplicationItem other)
48+
{
49+
return other != null &&
50+
_applicationFilePath == other._applicationFilePath;
51+
}
52+
53+
public override int GetHashCode()
54+
{
55+
int hashCode = 734317580;
56+
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(_applicationFilePath);
57+
return hashCode;
58+
}
59+
60+
public static bool operator ==(ApplicationItem left, ApplicationItem right)
61+
{
62+
return EqualityComparer<ApplicationItem>.Default.Equals(left, right);
63+
}
64+
65+
public static bool operator !=(ApplicationItem left, ApplicationItem right)
66+
{
67+
return !(left == right);
68+
}
3869
}
3970
}

Source/HDRProfile/HDRProfileHandler.cs

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public class HDRProfileHandler : BaseViewModel
4444
public RelayCommand ClosingCommand { get; private set; }
4545
public RelayCommand ShutdownCommand { get; private set; }
4646

47+
public RelayCommand<ApplicationItem> StartApplicationCommand { get; private set; }
48+
4749

4850
public HDRProfileSettings Settings { get => settings; set { settings = value; OnPropertyChanged(); } }
4951

@@ -96,9 +98,10 @@ private void LoadSettings()
9698
}
9799
Settings.ApplicationItems.CollectionChanged += ApplicationItems_CollectionChanged;
98100
settings.PropertyChanged += Settings_PropertyChanged;
99-
foreach (var proc in Settings.ApplicationItems)
101+
foreach (var application in Settings.ApplicationItems)
100102
{
101-
ProcessWatcher.AddProcess(proc.ApplicationName.ToUpperInvariant());
103+
ProcessWatcher.AddProcess(application);
104+
application.PropertyChanged += HDRProfileHandler_PropertyChanged;
102105
}
103106
SetProcessWatchMode();
104107

@@ -189,9 +192,23 @@ private void CreateRelayCommands()
189192
LoadingCommand = new RelayCommand(Starting);
190193
ClosingCommand = new RelayCommand(Closing);
191194
ShutdownCommand = new RelayCommand(Shutdown);
195+
StartApplicationCommand = new RelayCommand<ApplicationItem>(StartApplication);
192196
}
193197

194-
198+
private void StartApplication(ApplicationItem application)
199+
{
200+
HDRController.SetHDR(true);
201+
Process process = new Process();
202+
process.StartInfo = new ProcessStartInfo(application.ApplicationFilePath);
203+
process.Start();
204+
Stopwatch stopwatch = new Stopwatch();
205+
stopwatch.Start();
206+
while (!process.Responding && stopwatch.ElapsedMilliseconds < 5000)
207+
{
208+
System.Threading.Thread.Sleep(50);
209+
}
210+
System.Threading.Thread.Sleep(5000);
211+
}
195212

196213
#region Process handling
197214

@@ -203,17 +220,31 @@ private void ApplicationItems_CollectionChanged(object sender, NotifyCollectionC
203220
{
204221
case NotifyCollectionChangedAction.Add:
205222
foreach (var applicationItem in e.NewItems)
206-
ProcessWatcher.AddProcess(((ApplicationItem)applicationItem).ApplicationName.ToUpperInvariant());
223+
{
224+
ProcessWatcher.AddProcess(((ApplicationItem)applicationItem));
225+
((ApplicationItem)applicationItem).PropertyChanged += HDRProfileHandler_PropertyChanged;
226+
}
227+
207228
break;
208229
case NotifyCollectionChangedAction.Remove:
209230
foreach (var applicationItem in e.OldItems)
210-
ProcessWatcher.RemoveProcess(((ApplicationItem)applicationItem).ApplicationName.ToUpperInvariant());
231+
{
232+
ProcessWatcher.RemoveProcess(((ApplicationItem)applicationItem));
233+
((ApplicationItem)applicationItem).PropertyChanged -= HDRProfileHandler_PropertyChanged;
234+
235+
}
211236
break;
212237

213238
}
214239
Settings.SaveSettings(SettingsPath);
215240
}
216241
}
242+
243+
private void HDRProfileHandler_PropertyChanged(object sender, PropertyChangedEventArgs e)
244+
{
245+
Settings.SaveSettings(SettingsPath);
246+
}
247+
217248
private void AddAplication()
218249
{
219250
ApplicationAdder adder = new ApplicationAdder();
@@ -267,14 +298,44 @@ private void ProcessWatcher_ChangeHDRMode(object sender, EventArgs e)
267298
{
268299
lock (_accessLock)
269300
{
270-
if ((Settings.HDRMode == HDRMode.Running && ProcessWatcher.OneProcessIsRunning) ||Settings.HDRMode == HDRMode.Focused && ProcessWatcher.OneProcessIsFocused)
301+
if ((Settings.HDRMode == HDRMode.Running && ProcessWatcher.OneProcessIsRunning) || Settings.HDRMode == HDRMode.Focused && ProcessWatcher.OneProcessIsFocused)
302+
{
271303
HDRSwitcherHandler.ActivateHDR();
304+
CheckApplicationStates((IDictionary<ApplicationItem,bool>)ProcessWatcher.Applications);
305+
}
272306
else
273307
HDRSwitcherHandler.DeactivateHDR();
274308
}
275309

276310
}
277311

312+
Dictionary<ApplicationItem, bool> _lastApplicationStates = new Dictionary<ApplicationItem, bool>();
313+
314+
private void CheckApplicationStates(IDictionary<ApplicationItem, bool> applicationStates)
315+
{
316+
Dictionary<ApplicationItem, bool> newLastStates = new Dictionary<ApplicationItem, bool>();
317+
foreach (var applicationState in applicationStates)
318+
{
319+
if (!applicationState.Key.RestartProcess)
320+
continue;
321+
newLastStates.Add(applicationState.Key, applicationState.Value);
322+
if (!_lastApplicationStates.ContainsKey(applicationState.Key) && applicationState.Value)
323+
RestartProcess(applicationState.Key);
324+
else if (_lastApplicationStates.ContainsKey(applicationState.Key) && applicationState.Value && !_lastApplicationStates[applicationState.Key])
325+
RestartProcess(applicationState.Key);
326+
}
327+
328+
_lastApplicationStates.Clear();
329+
_lastApplicationStates = newLastStates;
330+
}
331+
332+
private void RestartProcess(ApplicationItem application)
333+
{
334+
Process.GetProcessesByName(application.ApplicationName).ToList().ForEach(p => p.Kill());
335+
Process proc = new Process();
336+
StartApplication(application);
337+
}
338+
278339
public void Start()
279340
{
280341
if (Started)

Source/HDRProfile/HDRProfileSettings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public class HDRProfileSettings : BaseViewModel
2424
public bool StartMinimizedToTray { get => startMinimizedToTray; set { startMinimizedToTray = value; OnPropertyChanged(); } }
2525
public bool CloseToTray { get => _closeToTray; set { _closeToTray = value; OnPropertyChanged(); } }
2626

27+
28+
2729
public HDRMode HDRMode { get => hdrMode; set { hdrMode = value; OnPropertyChanged(); } }
2830

2931
public ObservableCollection<ApplicationItem> ApplicationItems { get => _applicationItems; set {_applicationItems = value; OnPropertyChanged();} }

Source/HDRProfile/HDRSwitcherHandlerView.xaml

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
88
xmlns:local="clr-namespace:HDRProfile"
99
mc:Ignorable="d"
10-
Title="HDR Profile" Name="MainWindow" MinHeight="260" MinWidth="700" Closing="Window_Closing" Visibility="{Binding ShowView, Mode=TwoWay, Converter={StaticResource VisibilityBooleanConverter}}"
11-
Height="469"
12-
Width="502">
10+
Title="HDR Profile" Name="MainWindow" MinHeight="260" MinWidth="800" Closing="Window_Closing" Visibility="{Binding ShowView, Mode=TwoWay, Converter={StaticResource VisibilityBooleanConverter}}"
11+
Height="416.456"
12+
Width="333.919">
1313
<i:Interaction.Triggers>
1414
<i:EventTrigger EventName="Loaded">
1515
<i:InvokeCommandAction Command="{Binding LoadingCommand}"/>
@@ -30,10 +30,17 @@
3030
<StackPanel/>
3131
</ItemsPanelTemplate>
3232
<DataTemplate x:Key="ApplicationItemTemplate" DataType="ApplicationItem">
33-
<StackPanel Orientation="Horizontal">
34-
<Image Source="{Binding Icon, Converter={StaticResource BitmapToBitmapImageConverter}}" Width="32" Height="32" Margin="5" Stretch="Fill"></Image>
35-
<TextBlock Text="{Binding ApplicationName}" Margin="5" VerticalAlignment="Center"/>
36-
</StackPanel>
33+
<Grid>
34+
<Grid.ColumnDefinitions>
35+
<ColumnDefinition Width="Auto"/>
36+
<ColumnDefinition Width="Auto"/>
37+
<ColumnDefinition Width="*" />
38+
<ColumnDefinition Width="Auto" />
39+
</Grid.ColumnDefinitions>
40+
<Image Grid.Column="0" Source="{Binding Icon, Converter={StaticResource BitmapToBitmapImageConverter}}" Width="20" Height="20" Margin="5" Stretch="Fill"></Image>
41+
<TextBlock Grid.Column="1" Text="{Binding ApplicationName}" Margin="5" VerticalAlignment="Center" HorizontalAlignment="Left" />
42+
<CheckBox Grid.Column="3" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" IsChecked="{Binding RestartProcess, Mode=TwoWay}" Margin="5" />
43+
</Grid>
3744
</DataTemplate>
3845

3946
</Window.Resources>
@@ -47,17 +54,16 @@
4754
<Grid.RowDefinitions>
4855
<RowDefinition Height="Auto"/>
4956
<RowDefinition Height="Auto" />
50-
<RowDefinition Height="279*" />
57+
<RowDefinition Height="14*" />
58+
<RowDefinition Height="163*"/>
5159
</Grid.RowDefinitions>
5260
<GridSplitter VerticalAlignment="Top" Height="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Stretch" IsEnabled="False"/>
5361

54-
<ListBox Grid.Column="0" Grid.Row="2" x:Name="ApplicationList" Margin="10,10,9,35" HorizontalContentAlignment="Stretch" ItemsPanel="{StaticResource StackListViewTemplate}" ItemTemplate="{StaticResource ApplicationItemTemplate}" ItemsSource="{Binding Settings.ApplicationItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderBrush="{x:Null}" Background="#FFF1F1F1" Padding="10" RenderTransformOrigin="0.51,-2.713"/>
55-
<Button Grid.Column="0" Grid.Row="2" Width="Auto" Command="{Binding AddApplicationCommand}" Content="{x:Static local:Locale_Texts.AddApplication}" HorizontalAlignment="Left" Margin="10,0,0,10" Height="20" VerticalAlignment="Bottom" />
56-
<Button Grid.Column="0" Grid.Row="2" Width="Auto" Command="{Binding RemoveApplicationCommand}" CommandParameter="{Binding ElementName=ApplicationList, Path=SelectedItem}" Content="{x:Static local:Locale_Texts.RemoveApplication}" IsEnabled="{Binding ElementName=ApplicationList, Path=SelectedItem, Converter={StaticResource IsNotNullConverter}}" Margin="0,0,10,10" Height="20" VerticalAlignment="Bottom" RenderTransformOrigin="0.914,0.566" HorizontalAlignment="Right" />
62+
<ListBox Grid.Column="0" Grid.Row="3" x:Name="ApplicationList" Margin="10,2.373,9,35" HorizontalContentAlignment="Stretch" ItemsPanel="{StaticResource StackListViewTemplate}" ItemTemplate="{StaticResource ApplicationItemTemplate}" ItemsSource="{Binding Settings.ApplicationItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderBrush="{x:Null}" Background="#FFF1F1F1" Padding="10" RenderTransformOrigin="0.51,-2.713"/>
5763
<TextBlock Text="{x:Static local:Locale_Texts.Applications}" Grid.Row="0" Margin="10,10,10,0" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="15" FontWeight="Bold"/>
58-
<GridSplitter HorizontalAlignment="Left" Width="1" Grid.RowSpan="3" Grid.Column="1" Grid.ColumnSpan="2" IsEnabled="False"/>
64+
<GridSplitter HorizontalAlignment="Left" Width="1" Grid.RowSpan="4" Grid.Column="1" Grid.ColumnSpan="2" IsEnabled="False"/>
5965
<TextBlock Text="{x:Static local:Locale_Texts.Settings}" Margin="10,10,10,0" TextWrapping="Wrap" VerticalAlignment="Top" Grid.Column="2" FontSize="15" FontWeight="Bold"/>
60-
<Grid Grid.Column="2" Grid.Row="2" Width="Auto" HorizontalAlignment="Right" >
66+
<Grid Grid.Column="2" Grid.Row="2" Width="Auto" HorizontalAlignment="Right" Grid.RowSpan="2" >
6167
<Grid.ColumnDefinitions>
6268
<ColumnDefinition Width="Auto"/>
6369
<ColumnDefinition Width="Auto"/>
@@ -84,6 +90,20 @@
8490
</Hyperlink>
8591
</TextBlock>
8692
</Grid>
93+
<Grid Grid.Column="0" Grid.Row="3" Height="Auto" VerticalAlignment="Bottom">
94+
<Grid.ColumnDefinitions>
95+
<ColumnDefinition Width="Auto"/>
96+
<ColumnDefinition Width="1*"/>
97+
<ColumnDefinition Width="Auto"/>
98+
<ColumnDefinition Width="1*"/>
99+
<ColumnDefinition Width="Auto"/>
100+
</Grid.ColumnDefinitions>
101+
<Button Grid.Column="0" Width="Auto" IsEnabled="{Binding ElementName=ApplicationList, Path=SelectedItem, Converter={StaticResource IsNotNullConverter}}" Content="{x:Static local:Locale_Texts.StartInHDR}" Command="{Binding StartApplicationCommand}" CommandParameter="{Binding ElementName=ApplicationList, Path=SelectedItem}" Grid.Row="2" Height="20" Margin="5"/>
102+
<Button Grid.Column="2" Width="Auto" Command="{Binding AddApplicationCommand}" Content="{x:Static local:Locale_Texts.AddApplication}" Height="20" Margin="5" />
103+
<Button Grid.Column="4" Width="Auto" Command="{Binding RemoveApplicationCommand}" CommandParameter="{Binding ElementName=ApplicationList, Path=SelectedItem}" Content="{x:Static local:Locale_Texts.RemoveApplication}" IsEnabled="{Binding ElementName=ApplicationList, Path=SelectedItem, Converter={StaticResource IsNotNullConverter}}" Height="20" Margin="5" />
104+
105+
</Grid>
106+
<TextBlock Margin="0,9,10,0" Grid.Row="2" TextWrapping="Wrap" Text="{x:Static local:Locale_Texts.RestartProccessOnFirstOccurence}" HorizontalAlignment="Right" Width="Auto" Height="16" VerticalAlignment="Top"/>
87107
</Grid>
88108
</Window>
89109

0 commit comments

Comments
 (0)