From 0987f51b85673cbc038babc734b7d89d39ff9dd1 Mon Sep 17 00:00:00 2001 From: bNobo Date: Fri, 5 Apr 2024 19:18:20 +0200 Subject: [PATCH 01/10] set version to 3.0.7 --- NeedABreak/NeedABreak.csproj | 314 +++++++++--------- .../Package.appxmanifest | 124 +++---- 2 files changed, 219 insertions(+), 219 deletions(-) diff --git a/NeedABreak/NeedABreak.csproj b/NeedABreak/NeedABreak.csproj index e3c6815..6792e56 100644 --- a/NeedABreak/NeedABreak.csproj +++ b/NeedABreak/NeedABreak.csproj @@ -1,158 +1,158 @@ - - - net8.0-windows10.0.18362.0 - WinExe - SAK - SAK - SAK - SAK - true - publish\ - true - Web - true - Foreground - 7 - Days - false - false - true - https://bnobo.github.io/needabreak/NeedABreak/publish/ - https://bnobo.github.io/needabreak - NEED A BREAK! - Benoit Rocco - 0 - 3.0.0.0 - false - true - true - true - true - true - true - AnyCPU;x64;x86 - 3.0.7.0 - 3.0.7.0 - win-x86;win-x64 - - - false - - - false - - - false - - - 470269ACD0D9A601150DEC90E877EB74DE4B1898 - - - NeedABreak_1_TemporaryKey.pfx - - - true - - - false - - - 4.0 - fr-FR - true - true - - - coffee cup.ico - - - - - - - False - Microsoft .NET Framework 4.8 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - False - - - - - Include - True - Assembly - - - - - - - - - - - - - - - - - - 1.1.0 - - - 2.0.17 - - - 2.4.10 - - - - 1.1.77 - - - 4.1.0 - All - - - - - - - - - True - True - Resources.resx - - - True - True - Settings.settings - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - + + + net8.0-windows10.0.18362.0 + WinExe + SAK + SAK + SAK + SAK + true + publish\ + true + Web + true + Foreground + 7 + Days + false + false + true + https://bnobo.github.io/needabreak/NeedABreak/publish/ + https://bnobo.github.io/needabreak + NEED A BREAK! + Benoit Rocco + 0 + 3.0.0.0 + false + true + true + true + true + true + true + AnyCPU;x64;x86 + 3.0.7.0 + 3.0.7.0 + win-x86;win-x64 + + + false + + + false + + + false + + + 470269ACD0D9A601150DEC90E877EB74DE4B1898 + + + NeedABreak_1_TemporaryKey.pfx + + + true + + + false + + + 4.0 + fr-FR + true + true + + + coffee cup.ico + + + + + + + False + Microsoft .NET Framework 4.8 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + False + + + + + Include + True + Assembly + + + + + + + + + + + + + + + + + + 1.1.0 + + + 2.0.17 + + + 2.4.10 + + + + 1.1.77 + + + 4.1.0 + All + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + \ No newline at end of file diff --git a/NeedABreakPackagingProject/Package.appxmanifest b/NeedABreakPackagingProject/Package.appxmanifest index 53d3de8..2562f08 100644 --- a/NeedABreakPackagingProject/Package.appxmanifest +++ b/NeedABreakPackagingProject/Package.appxmanifest @@ -1,62 +1,62 @@ - - - - - - - - NEED A BREAK! - bNobo - Images\StoreLogo.png - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + NEED A BREAK! + bNobo + Images\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bc628534a2bd44c12af83a2e080b80bbe4d8ace3 Mon Sep 17 00:00:00 2001 From: bNobo Date: Fri, 5 Apr 2024 19:22:08 +0200 Subject: [PATCH 02/10] set relative path to images --- readme.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/readme.md b/readme.md index 25df028..8f742b0 100644 --- a/readme.md +++ b/readme.md @@ -10,23 +10,23 @@ I have made it for my personal usage and personaly use it every day at work and You will be notified a minute before lockdown: -imminent lockdown +imminent lockdown When it is time to have a break a countdown will appear. The screen will be locked when it reaches 0: -countdown +countdown You can verify that the application is running thanks to the task bar icon: -task bar icon +task bar icon You can display the application menu by clicking on the coffee cup: -menu +menu The settings window let you choose how long the application will wait before lockdown: -settings +settings You can find this documentation on my github page: https://bnobo.github.io/needabreak/ From 5a99ced3b6e50888af50082caef337062e1f7678 Mon Sep 17 00:00:00 2001 From: bNobo Date: Fri, 5 Apr 2024 19:29:04 +0200 Subject: [PATCH 03/10] update readme.md --- Captures/en/taskbar.jpg | Bin 41703 -> 7852 bytes readme.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Captures/en/taskbar.jpg b/Captures/en/taskbar.jpg index 2e3e6b65897b4bbcf4925f640355a3268c7147ae..5c6103140dd7d265cd679edc3d4d197389dee316 100644 GIT binary patch literal 7852 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 literal 41703 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

i)uM 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 I7x+E-KZ)qs6aWAK diff --git a/readme.md b/readme.md index 8f742b0..5a8d24d 100644 --- a/readme.md +++ b/readme.md @@ -16,7 +16,7 @@ When it is time to have a break a countdown will appear. The screen will be lock countdown -You can verify that the application is running thanks to the task bar icon: +You can check that the application is running thanks to the task bar icon. Hover the mouse over the icon and you'll see useful information like time remaining before lockdown and today's screen time: task bar icon From 18b00a4e8cab031e456cdc297aab660f099fc29d Mon Sep 17 00:00:00 2001 From: bNobo Date: Tue, 16 Apr 2024 08:09:23 +0200 Subject: [PATCH 04/10] Update readme.md --- readme.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index 5a8d24d..fb36709 100644 --- a/readme.md +++ b/readme.md @@ -20,7 +20,7 @@ You can check that the application is running thanks to the task bar icon. Hover task bar icon -You can display the application menu by clicking on the coffee cup: +You can display the application menu by clicking on the coffee cup icon in the taskbar: menu @@ -32,19 +32,21 @@ You can find this documentation on my github page: https://bnobo.github.io/needa ## Installation -If you just want to install and enjoy the latest version of the application, you can download the setup from [here](https://bnobo.github.io/needabreak/NeedABreak/publish/setup.exe). +You can install the latest version from the Microsoft Store : https://www.microsoft.com/store/productId/9NCXSKHB9318 -> Note that you will have a big red warning from the UAC during installation because the installer is not digitally signed. +If you prefer, you can download the version you want to install from the [Releases page](https://github.com/bNobo/needabreak/releases) + +> Starting with version 3.x you'll need Windows 10 minimum. If you have an older system, you should download a previous version from the Releases page. The latest version before 3.x was 2.3. Please note that previous versions won't benefit from new functionnalities and security updates. You should upgrade your system to benefit from the latest version. ## Get started -The project is a WPF application targeting .Net Framework 4.8. All you need is a copy of Visual Studio Community in order to build it. +The project is a WPF application targeting .Net 8. All you need is a copy of Visual Studio Community in order to build it. Once started, the application creates a coffee cup icon in the task bar to manifest its presence and permits user to interact with it. Just click on the coffee cup to open the application menu. ## Contribute -I'm sure this application could be improved in many ways and I would be happy to receive some help in doing so. If you want to contribute to this project, please go to https://github.com/bNobo/needabreak and read [contributing.md](https://github.com/bNobo/needabreak/blob/root/contributing.md) file. +I'm sure this application could be improved in many ways and I would be happy to receive some help in doing so. If you want to contribute to this project, please read [contributing.md](contributing.md) file. Every kind of contribution is welcome, it includes, but is not limited to: * Add new functionalities @@ -107,6 +109,8 @@ if (!mutex.WaitOne(0, false)) ### Translations +> Multilingual editor seems to not work anymore. Resx have to be edited directly to workaround the issue. + Use of [Multilingual App Toolkit](https://marketplace.visualstudio.com/items?itemName=MultilingualAppToolkit.MultilingualAppToolkit-18308) extension to handle translations. RESX files are automatically generated from translations made in XLF files. Use of custom markup extension to handle translations in XAML files like this: @@ -120,7 +124,5 @@ Use of custom markup extension to handle translations in XAML files like this: Use of Adorner class to surround selected tile on the settings window. - - ## License [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FbNobo%2Fneedabreak.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FbNobo%2Fneedabreak?ref=badge_large) From 6fe2f5813a463b31e9ca5aab6c7b08f1f06be9c9 Mon Sep 17 00:00:00 2001 From: bNobo Date: Tue, 16 Apr 2024 08:11:25 +0200 Subject: [PATCH 05/10] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index fb36709..471640c 100644 --- a/readme.md +++ b/readme.md @@ -32,7 +32,7 @@ You can find this documentation on my github page: https://bnobo.github.io/needa ## Installation -You can install the latest version from the Microsoft Store : https://www.microsoft.com/store/productId/9NCXSKHB9318 +You can install the latest version from the [Microsoft Store)(https://www.microsoft.com/store/productId/9NCXSKHB9318) If you prefer, you can download the version you want to install from the [Releases page](https://github.com/bNobo/needabreak/releases) From 21426ea394d147e62948eaedd56bfc48eeabe98a Mon Sep 17 00:00:00 2001 From: bNobo Date: Tue, 16 Apr 2024 08:14:05 +0200 Subject: [PATCH 06/10] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 471640c..2ea9001 100644 --- a/readme.md +++ b/readme.md @@ -32,7 +32,7 @@ You can find this documentation on my github page: https://bnobo.github.io/needa ## Installation -You can install the latest version from the [Microsoft Store)(https://www.microsoft.com/store/productId/9NCXSKHB9318) +You can install the latest version from the [Microsoft Store](https://www.microsoft.com/store/productId/9NCXSKHB9318) If you prefer, you can download the version you want to install from the [Releases page](https://github.com/bNobo/needabreak/releases) From c601d29403a63a72b29d812acb0109acd7f90f7e Mon Sep 17 00:00:00 2001 From: bNobo Date: Sat, 20 Apr 2024 11:05:23 +0200 Subject: [PATCH 07/10] Update readme.md --- readme.md | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/readme.md b/readme.md index 2ea9001..6005966 100644 --- a/readme.md +++ b/readme.md @@ -10,23 +10,23 @@ I have made it for my personal usage and personaly use it every day at work and You will be notified a minute before lockdown: -imminent lockdown +imminent lockdown When it is time to have a break a countdown will appear. The screen will be locked when it reaches 0: -countdown +countdown You can check that the application is running thanks to the task bar icon. Hover the mouse over the icon and you'll see useful information like time remaining before lockdown and today's screen time: -task bar icon +task bar icon You can display the application menu by clicking on the coffee cup icon in the taskbar: -menu +menu The settings window let you choose how long the application will wait before lockdown: -settings +settings You can find this documentation on my github page: https://bnobo.github.io/needabreak/ @@ -56,6 +56,20 @@ Every kind of contribution is welcome, it includes, but is not limited to: * Test to find issues * Fix typos +## Locate log file and user settings + +The log file of the application can be found in `%TEMP%\NeedABreak Logs` folder. + +Sometimes it is usefull to vary user settings values during debug. In order to easily locate the user settings file of the application, its path is logged when the app starts in debug mode. Open the log file and search for `User settings path`. You should see a line similar to: + +``` +2024-04-20 08:41:39,206 [1] DEBUG - NeedABreak.App User settings path = C:\Users\your_name\AppData\Local\NeedABreak\NeedABreak_Url_zfnovop1ow4emdxnmewxhry05gwrornw\3.0.3.0\user.config +``` + +Open the `user.config` file and change settings values as needed. + +> Be careful while editing this XML file. If you break it, the application won't start anymore. You should make a backup copy before editing it. In case you accidentally broke it, just delete the `user.config` file and restart the application. The file will be restored with default values. + ## Points of interest in code ### P/Invoke From 7404486a691caffa364316998b8ba761dbc5dc14 Mon Sep 17 00:00:00 2001 From: bNobo Date: Tue, 23 Apr 2024 08:09:41 +0200 Subject: [PATCH 08/10] remove RegistryTool.cs --- NeedABreak/Utils/RegistryTool.cs | 51 -------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 NeedABreak/Utils/RegistryTool.cs diff --git a/NeedABreak/Utils/RegistryTool.cs b/NeedABreak/Utils/RegistryTool.cs deleted file mode 100644 index acdcc9e..0000000 --- a/NeedABreak/Utils/RegistryTool.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - NEED A BREAK is an application intended to help you take care of your health while you work on a computer. - It will encourage you to regularly have a break in order to rest your back and your eyes. - Copyright (C) 2020 Benoit Rocco - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -using Microsoft.Win32; -using System; - -namespace NeedABreak.Utils -{ - public static class RegistryTool - { - ///

- /// Check that key is not null then close and dispose it - /// - /// - /// - public static void ActOnRegistryKey(RegistryKey key, Action action) - { - if (key != null) - { - action(key); - key.Close(); - key.Dispose(); - } - } - - public static RegistryKey GetRunRegistryKey(bool writable) - { - // Not possible to put \ in string because it breaks Fody during build :/ - // Using Replace to workaround the problem - return Registry.CurrentUser - .OpenSubKey("Software/Microsoft/Windows/CurrentVersion/Run" - .Replace('/', '\\'), writable); - } - - } -} From 3eecf97a2e964db3af6e6ccbe85d5aef21ff5dfe Mon Sep 17 00:00:00 2001 From: bNobo Date: Tue, 23 Apr 2024 08:20:15 +0200 Subject: [PATCH 09/10] code cleanup --- NeedABreak/AboutBoxWindow.xaml.cs | 12 -- NeedABreak/App.xaml.cs | 9 +- NeedABreak/BorderSelectedAdorner.cs | 13 +- .../BooleanToOppositeValueConverter.cs | 4 - .../BooleanToVisibilityConverter.cs | 4 - NeedABreak/Enums/SuspensionCause.cs | 7 - NeedABreak/Enums/UserNotificationState.cs | 6 - NeedABreak/Extensions/TimeSpanExtensions.cs | 4 - NeedABreak/MainWindow.xaml.cs | 7 +- NeedABreak/SettingsWindow.xaml.cs | 8 -- NeedABreak/SettingsWindowViewModel.cs | 36 +++-- .../Utils/QueryUserNotificationState.cs | 7 +- NeedABreak/Utils/SessionLock.cs | 11 +- NeedABreak/Utils/TextResourceExtension.cs | 4 - NeedABreak/Utils/UserActivity.cs | 130 +++++++++--------- 15 files changed, 91 insertions(+), 171 deletions(-) diff --git a/NeedABreak/AboutBoxWindow.xaml.cs b/NeedABreak/AboutBoxWindow.xaml.cs index b8ed5ab..50ab2f1 100644 --- a/NeedABreak/AboutBoxWindow.xaml.cs +++ b/NeedABreak/AboutBoxWindow.xaml.cs @@ -17,21 +17,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using MahApps.Metro.Controls; -using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using System.Reflection; -using System.Text; -using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Shapes; namespace NeedABreak { diff --git a/NeedABreak/App.xaml.cs b/NeedABreak/App.xaml.cs index 181bd73..eab8d44 100644 --- a/NeedABreak/App.xaml.cs +++ b/NeedABreak/App.xaml.cs @@ -20,15 +20,10 @@ You should have received a copy of the GNU General Public License using NeedABreak.Properties; using NeedABreak.Utils; using System; -using System.Collections.Generic; using System.Configuration; -using System.Data; -using System.Linq; -using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Timers; using System.Windows; -using System.Windows.Threading; namespace NeedABreak { @@ -88,7 +83,7 @@ static App() _cumulativeScreenTime += interruptionDuration; } } - + _dayStart = DateTime.Today; _startShowingScreen = DateTime.Now; @@ -283,7 +278,7 @@ private static void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.Se if (e.Reason == Microsoft.Win32.SessionSwitchReason.SessionUnlock) { Logger.Debug("SessionUnlock"); - + Current.Dispatcher.BeginInvoke(() => { var mainWindow = GetMainWindow(); diff --git a/NeedABreak/BorderSelectedAdorner.cs b/NeedABreak/BorderSelectedAdorner.cs index c7517d8..94c06e9 100644 --- a/NeedABreak/BorderSelectedAdorner.cs +++ b/NeedABreak/BorderSelectedAdorner.cs @@ -16,11 +16,6 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the You should have received a copy of the GNU General Public License along with this program. If not, see . */ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; using System.Windows.Documents; using System.Windows.Media; @@ -42,7 +37,7 @@ protected override void OnRender(DrawingContext drawingContext) var pen = new Pen(brush, 6); var whitePen = new Pen(Brushes.White, 8); drawingContext.DrawRectangle(Brushes.Transparent, pen, adornedElementRect); - var miniRect = new Rect(adornedElementRect.Right - 50, adornedElementRect.Bottom - 50, + var miniRect = new Rect(adornedElementRect.Right - 50, adornedElementRect.Bottom - 50, 50, 50); drawingContext.DrawRectangle(brush, pen, miniRect); var p1 = new Point(adornedElementRect.Right - 40, adornedElementRect.Bottom - 25); @@ -51,8 +46,8 @@ protected override void OnRender(DrawingContext drawingContext) var p3 = new Point(p2.X + 20, p2.Y - 20); drawingContext.DrawLine(whitePen, p1, p2); drawingContext.DrawLine(whitePen, p4, p3); - } - - + } + + } } diff --git a/NeedABreak/Converters/BooleanToOppositeValueConverter.cs b/NeedABreak/Converters/BooleanToOppositeValueConverter.cs index b99d0a1..25a8c82 100644 --- a/NeedABreak/Converters/BooleanToOppositeValueConverter.cs +++ b/NeedABreak/Converters/BooleanToOppositeValueConverter.cs @@ -17,11 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; -using System.Collections.Generic; using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Data; namespace NeedABreak.Converters diff --git a/NeedABreak/Converters/BooleanToVisibilityConverter.cs b/NeedABreak/Converters/BooleanToVisibilityConverter.cs index 8582438..914b1b7 100644 --- a/NeedABreak/Converters/BooleanToVisibilityConverter.cs +++ b/NeedABreak/Converters/BooleanToVisibilityConverter.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; using System.Windows.Data; diff --git a/NeedABreak/Enums/SuspensionCause.cs b/NeedABreak/Enums/SuspensionCause.cs index 375f1ec..e77e1c0 100644 --- a/NeedABreak/Enums/SuspensionCause.cs +++ b/NeedABreak/Enums/SuspensionCause.cs @@ -16,13 +16,6 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the You should have received a copy of the GNU General Public License along with this program. If not, see . */ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - namespace NeedABreak { public enum SuspensionCause diff --git a/NeedABreak/Enums/UserNotificationState.cs b/NeedABreak/Enums/UserNotificationState.cs index f886f76..c91440a 100644 --- a/NeedABreak/Enums/UserNotificationState.cs +++ b/NeedABreak/Enums/UserNotificationState.cs @@ -16,12 +16,6 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the You should have received a copy of the GNU General Public License along with this program. If not, see . */ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace NeedABreak.Utils { public enum UserNotificationState diff --git a/NeedABreak/Extensions/TimeSpanExtensions.cs b/NeedABreak/Extensions/TimeSpanExtensions.cs index cc99870..3064585 100644 --- a/NeedABreak/Extensions/TimeSpanExtensions.cs +++ b/NeedABreak/Extensions/TimeSpanExtensions.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace NeedABreak.Extensions { diff --git a/NeedABreak/MainWindow.xaml.cs b/NeedABreak/MainWindow.xaml.cs index fb9805c..f2a622b 100644 --- a/NeedABreak/MainWindow.xaml.cs +++ b/NeedABreak/MainWindow.xaml.cs @@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using MahApps.Metro.Controls; -using Microsoft.Win32; using NeedABreak.Extensions; using NeedABreak.Utils; using System; @@ -109,9 +108,9 @@ private async void LaunchOnStartupMenuItem_Unchecked(object sender, RoutedEventA } private async void LaunchOnStartupMenuItem_Checked(object sender, RoutedEventArgs e) - { + { StartupTask startupTask = await StartupTask.GetAsync("NeedABreak.StartupTask"); - + switch (startupTask.State) { case StartupTaskState.Disabled: @@ -387,7 +386,7 @@ private void AutomaticSuspensionMenuItem_Unchecked(object sender, RoutedEventArg if (App.IsSuspended && App.SuspensionCause == SuspensionCause.Automatic) { - App.Resume(); + App.Resume(); } } diff --git a/NeedABreak/SettingsWindow.xaml.cs b/NeedABreak/SettingsWindow.xaml.cs index 0d139d7..dd9111d 100644 --- a/NeedABreak/SettingsWindow.xaml.cs +++ b/NeedABreak/SettingsWindow.xaml.cs @@ -17,19 +17,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using MahApps.Metro.Controls; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Shapes; namespace NeedABreak { diff --git a/NeedABreak/SettingsWindowViewModel.cs b/NeedABreak/SettingsWindowViewModel.cs index d81780b..b8949a8 100644 --- a/NeedABreak/SettingsWindowViewModel.cs +++ b/NeedABreak/SettingsWindowViewModel.cs @@ -17,38 +17,34 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using PropertyChanged; -using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; namespace NeedABreak -{ - [DoNotNotify] - public class SettingsWindowViewModel : INotifyPropertyChanged +{ + [DoNotNotify] + public class SettingsWindowViewModel : INotifyPropertyChanged { - public int Delay - { - get { return App.Delay / 60; } - set { - App.Delay = value * 60; - Properties.Settings.Default.Delay = App.Delay; - Properties.Settings.Default.Save(); - OnPropertyChanged(); - } - } + public int Delay + { + get { return App.Delay / 60; } + set + { + App.Delay = value * 60; + Properties.Settings.Default.Delay = App.Delay; + Properties.Settings.Default.Save(); + OnPropertyChanged(); + } + } public event PropertyChangedEventHandler PropertyChanged; - public virtual void OnPropertyChanged([CallerMemberName]string propertyName = "") + public virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") { if (null != PropertyChanged) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); - } + } } public SettingsWindowViewModel() diff --git a/NeedABreak/Utils/QueryUserNotificationState.cs b/NeedABreak/Utils/QueryUserNotificationState.cs index fb22ae5..7db2dc9 100644 --- a/NeedABreak/Utils/QueryUserNotificationState.cs +++ b/NeedABreak/Utils/QueryUserNotificationState.cs @@ -16,12 +16,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the You should have received a copy of the GNU General Public License along with this program. If not, see . */ -using System; -using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace NeedABreak.Utils { @@ -33,7 +28,7 @@ public static class QueryUserNotificationState public static UserNotificationState GetState() { UserNotificationState state; - + int res = SHQueryUserNotificationState(out state); if (res != 0) diff --git a/NeedABreak/Utils/SessionLock.cs b/NeedABreak/Utils/SessionLock.cs index 7452c89..4529471 100644 --- a/NeedABreak/Utils/SessionLock.cs +++ b/NeedABreak/Utils/SessionLock.cs @@ -16,15 +16,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the You should have received a copy of the GNU General Public License along with this program. If not, see . */ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Runtime.InteropServices; -using System.Windows; using System.ComponentModel; -using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; namespace NeedABreak.Utils { @@ -41,7 +34,7 @@ public static void LockSession() // Only cases when this function will fail are if user is not logged on or if workstation is already locked // In both cases we just don't care => log and continue App.Logger.Error( - "Session Could not be locked!", + "Session Could not be locked!", new Win32Exception(Marshal.GetLastWin32Error())); } } diff --git a/NeedABreak/Utils/TextResourceExtension.cs b/NeedABreak/Utils/TextResourceExtension.cs index f5744d5..42dea8d 100644 --- a/NeedABreak/Utils/TextResourceExtension.cs +++ b/NeedABreak/Utils/TextResourceExtension.cs @@ -18,10 +18,6 @@ You should have received a copy of the GNU General Public License */ using NeedABreak.Properties; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Markup; namespace NeedABreak.Utils diff --git a/NeedABreak/Utils/UserActivity.cs b/NeedABreak/Utils/UserActivity.cs index 4fd04c1..6998461 100644 --- a/NeedABreak/Utils/UserActivity.cs +++ b/NeedABreak/Utils/UserActivity.cs @@ -1,88 +1,84 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; -using System.Text; using System.Threading.Tasks; -using System.Windows.Input; namespace NeedABreak.Utils { - public class UserActivity - { - private TimeSpan _idleTime; - - /// - /// UserActivity constructor - /// - /// time after which the user will be considered idle. - public UserActivity(TimeSpan idleTime) - { - if (idleTime == TimeSpan.Zero) - { - idleTime = TimeSpan.FromSeconds(7); - } + public class UserActivity + { + private TimeSpan _idleTime; - _idleTime = idleTime; - } + /// + /// UserActivity constructor + /// + /// time after which the user will be considered idle. + public UserActivity(TimeSpan idleTime) + { + if (idleTime == TimeSpan.Zero) + { + idleTime = TimeSpan.FromSeconds(7); + } - public UserActivity() : this(TimeSpan.Zero) { } + _idleTime = idleTime; + } - [StructLayout(LayoutKind.Sequential)] - [System.Diagnostics.CodeAnalysis.SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "")] - [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "")] - public struct LASTINPUTINFO - { - public uint cbSize; - public uint dwTime; - } + public UserActivity() : this(TimeSpan.Zero) { } - [DllImport("user32.dll")] - static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + [StructLayout(LayoutKind.Sequential)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "")] + public struct LASTINPUTINFO + { + public uint cbSize; + public uint dwTime; + } - public static TimeSpan GetInactiveTime() - { - LASTINPUTINFO info = new LASTINPUTINFO(); - info.cbSize = (uint)Marshal.SizeOf(info); + [DllImport("user32.dll")] + static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); - if (GetLastInputInfo(ref info)) - { - return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime); - } - else - { - return TimeSpan.Zero; - } - } + public static TimeSpan GetInactiveTime() + { + LASTINPUTINFO info = new LASTINPUTINFO(); + info.cbSize = (uint)Marshal.SizeOf(info); - public async Task WaitForUserToBeIdleAsync() - { - TimeSpan inactiveTime = GetInactiveTime(); + if (GetLastInputInfo(ref info)) + { + return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime); + } + else + { + return TimeSpan.Zero; + } + } - while (inactiveTime < _idleTime - || AMouseButtonIsPressed()) - { - await Task.Delay(1000); - inactiveTime = GetInactiveTime(); - } - } + public async Task WaitForUserToBeIdleAsync() + { + TimeSpan inactiveTime = GetInactiveTime(); - public static bool AMouseButtonIsPressed() - { + while (inactiveTime < _idleTime + || AMouseButtonIsPressed()) + { + await Task.Delay(1000); + inactiveTime = GetInactiveTime(); + } + } + + public static bool AMouseButtonIsPressed() + { #if DEBUG - System.Diagnostics.Debug.WriteLine("LeftButton State = {0}", GetAsyncKeyState(VK_LBUTTON)); - System.Diagnostics.Debug.WriteLine("MiddleButton State = {0}", GetAsyncKeyState(VK_MBUTTON)); - System.Diagnostics.Debug.WriteLine("RightButton State = {0}", GetAsyncKeyState(VK_RBUTTON)); + System.Diagnostics.Debug.WriteLine("LeftButton State = {0}", GetAsyncKeyState(VK_LBUTTON)); + System.Diagnostics.Debug.WriteLine("MiddleButton State = {0}", GetAsyncKeyState(VK_MBUTTON)); + System.Diagnostics.Debug.WriteLine("RightButton State = {0}", GetAsyncKeyState(VK_RBUTTON)); #endif - return GetAsyncKeyState(VK_LBUTTON) > 0 || GetAsyncKeyState(VK_MBUTTON) > 0 || GetAsyncKeyState(VK_RBUTTON) > 0; - } + return GetAsyncKeyState(VK_LBUTTON) > 0 || GetAsyncKeyState(VK_MBUTTON) > 0 || GetAsyncKeyState(VK_RBUTTON) > 0; + } - [DllImport("user32.dll")] - static extern ushort GetAsyncKeyState(ushort virtualKeyCode); + [DllImport("user32.dll")] + static extern ushort GetAsyncKeyState(ushort virtualKeyCode); - const int VK_LBUTTON = 0x01; - const int VK_MBUTTON = 0x04; - const int VK_RBUTTON = 0x02; - } + const int VK_LBUTTON = 0x01; + const int VK_MBUTTON = 0x04; + const int VK_RBUTTON = 0x02; + } } From 14c486d37d03bcc00f64c96f01096448bda70a91 Mon Sep 17 00:00:00 2001 From: bNobo Date: Tue, 23 Apr 2024 08:54:08 +0200 Subject: [PATCH 10/10] update readme.me --- readme.md | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 6005966..6f1cd89 100644 --- a/readme.md +++ b/readme.md @@ -40,7 +40,7 @@ If you prefer, you can download the version you want to install from the [Releas ## Get started -The project is a WPF application targeting .Net 8. All you need is a copy of Visual Studio Community in order to build it. +The project is a WPF application targeting .NET 8. All you need is a copy of Visual Studio Community in order to build it. Once started, the application creates a coffee cup icon in the task bar to manifest its presence and permits user to interact with it. Just click on the coffee cup to open the application menu. @@ -58,7 +58,7 @@ Every kind of contribution is welcome, it includes, but is not limited to: ## Locate log file and user settings -The log file of the application can be found in `%TEMP%\NeedABreak Logs` folder. +The log file of the application can be found under `%TEMP%\NeedABreak Logs` folder. Sometimes it is usefull to vary user settings values during debug. In order to easily locate the user settings file of the application, its path is logged when the app starts in debug mode. Open the log file and search for `User settings path`. You should see a line similar to: @@ -123,10 +123,6 @@ if (!mutex.WaitOne(0, false)) ### Translations -> Multilingual editor seems to not work anymore. Resx have to be edited directly to workaround the issue. - -Use of [Multilingual App Toolkit](https://marketplace.visualstudio.com/items?itemName=MultilingualAppToolkit.MultilingualAppToolkit-18308) extension to handle translations. RESX files are automatically generated from translations made in XLF files. - Use of custom markup extension to handle translations in XAML files like this: ```XAML @@ -138,5 +134,47 @@ Use of custom markup extension to handle translations in XAML files like this: Use of Adorner class to surround selected tile on the settings window. +### Startup Task + +Use of `StartupTask` class in order to run the application at Windows Startup. + +The manifest has to be manually edited to add the startup task extension: + +```xml +[...] +xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10" +[...] + + + + + + + + + +``` + +The csproj file has to target Windows 10: + +```xml +net8.0-windows10.0.18362.0 +``` + +And then it is possible to make use of the StartupTask class: + +```cs +StartupTask startupTask = await StartupTask.GetAsync("NeedABreak.StartupTask"); +StartupTaskState newState = await startupTask.RequestEnableAsync(); +``` + ## License [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FbNobo%2Fneedabreak.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FbNobo%2Fneedabreak?ref=badge_large)