diff --git a/ShareX.HelpersLib/Controls/DarkColorTable.cs b/ShareX.HelpersLib/Controls/DarkColorTable.cs index bc6ef4551..2bb1ae945 100644 --- a/ShareX.HelpersLib/Controls/DarkColorTable.cs +++ b/ShareX.HelpersLib/Controls/DarkColorTable.cs @@ -30,229 +30,61 @@ namespace ShareX.HelpersLib { public class DarkColorTable : ProfessionalColorTable { - public override Color ButtonSelectedHighlight - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color ButtonSelectedHighlightBorder - { - get { return ShareXResources.Theme.MenuHighlightBorderColor; } - } - public override Color ButtonPressedHighlight - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color ButtonPressedHighlightBorder - { - get { return ShareXResources.Theme.MenuHighlightBorderColor; } - } - public override Color ButtonCheckedHighlight - { - get { return ShareXResources.Theme.MenuCheckBackgroundColor; } - } - public override Color ButtonCheckedHighlightBorder - { - get { return ShareXResources.Theme.MenuHighlightBorderColor; } - } - public override Color ButtonPressedBorder - { - get { return ShareXResources.Theme.MenuHighlightBorderColor; } - } - public override Color ButtonSelectedBorder - { - get { return ShareXResources.Theme.MenuHighlightBorderColor; } - } - public override Color ButtonCheckedGradientBegin - { - get { return ShareXResources.Theme.MenuCheckBackgroundColor; } - } - public override Color ButtonCheckedGradientMiddle - { - get { return ShareXResources.Theme.MenuCheckBackgroundColor; } - } - public override Color ButtonCheckedGradientEnd - { - get { return ShareXResources.Theme.MenuCheckBackgroundColor; } - } - public override Color ButtonSelectedGradientBegin - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color ButtonSelectedGradientMiddle - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color ButtonSelectedGradientEnd - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color ButtonPressedGradientBegin - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color ButtonPressedGradientMiddle - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color ButtonPressedGradientEnd - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color CheckBackground - { - get { return ShareXResources.Theme.MenuCheckBackgroundColor; } - } - public override Color CheckSelectedBackground - { - get { return ShareXResources.Theme.MenuCheckBackgroundColor; } - } - public override Color CheckPressedBackground - { - get { return ShareXResources.Theme.MenuCheckBackgroundColor; } - } - public override Color GripDark - { - get { return ShareXResources.Theme.SeparatorDarkColor; } - } - public override Color GripLight - { - get { return ShareXResources.Theme.SeparatorLightColor; } - } - public override Color ImageMarginGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ImageMarginGradientMiddle - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ImageMarginGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ImageMarginRevealedGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ImageMarginRevealedGradientMiddle - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ImageMarginRevealedGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color MenuStripGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color MenuStripGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color MenuItemSelected - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color MenuItemBorder - { - get { return ShareXResources.Theme.MenuBorderColor; } - } - public override Color MenuBorder - { - get { return ShareXResources.Theme.MenuBorderColor; } - } - public override Color MenuItemSelectedGradientBegin - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color MenuItemSelectedGradientEnd - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color MenuItemPressedGradientBegin - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color MenuItemPressedGradientMiddle - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color MenuItemPressedGradientEnd - { - get { return ShareXResources.Theme.MenuHighlightColor; } - } - public override Color RaftingContainerGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color RaftingContainerGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color SeparatorDark - { - get { return ShareXResources.Theme.SeparatorDarkColor; } - } - public override Color SeparatorLight - { - get { return ShareXResources.Theme.SeparatorLightColor; } - } - public override Color StatusStripGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color StatusStripGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripBorder - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripDropDownBackground - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripGradientMiddle - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripContentPanelGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripContentPanelGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripPanelGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color ToolStripPanelGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color OverflowButtonGradientBegin - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color OverflowButtonGradientMiddle - { - get { return ShareXResources.Theme.BackgroundColor; } - } - public override Color OverflowButtonGradientEnd - { - get { return ShareXResources.Theme.BackgroundColor; } - } + public override Color ButtonSelectedHighlight => ShareXResources.Theme.MenuHighlightColor; + public override Color ButtonSelectedHighlightBorder => ShareXResources.Theme.MenuHighlightBorderColor; + public override Color ButtonPressedHighlight => ShareXResources.Theme.MenuHighlightColor; + public override Color ButtonPressedHighlightBorder => ShareXResources.Theme.MenuHighlightBorderColor; + public override Color ButtonCheckedHighlight => ShareXResources.Theme.MenuCheckBackgroundColor; + public override Color ButtonCheckedHighlightBorder => ShareXResources.Theme.MenuHighlightBorderColor; + public override Color ButtonPressedBorder => ShareXResources.Theme.MenuHighlightBorderColor; + public override Color ButtonSelectedBorder => ShareXResources.Theme.MenuHighlightBorderColor; + public override Color ButtonCheckedGradientBegin => ShareXResources.Theme.MenuCheckBackgroundColor; + public override Color ButtonCheckedGradientMiddle => ShareXResources.Theme.MenuCheckBackgroundColor; + public override Color ButtonCheckedGradientEnd => ShareXResources.Theme.MenuCheckBackgroundColor; + public override Color ButtonSelectedGradientBegin => ShareXResources.Theme.MenuHighlightColor; + public override Color ButtonSelectedGradientMiddle => ShareXResources.Theme.MenuHighlightColor; + public override Color ButtonSelectedGradientEnd => ShareXResources.Theme.MenuHighlightColor; + public override Color ButtonPressedGradientBegin => ShareXResources.Theme.MenuHighlightColor; + public override Color ButtonPressedGradientMiddle => ShareXResources.Theme.MenuHighlightColor; + public override Color ButtonPressedGradientEnd => ShareXResources.Theme.MenuHighlightColor; + public override Color CheckBackground => ShareXResources.Theme.MenuCheckBackgroundColor; + public override Color CheckSelectedBackground => ShareXResources.Theme.MenuCheckBackgroundColor; + public override Color CheckPressedBackground => ShareXResources.Theme.MenuCheckBackgroundColor; + public override Color GripDark => ShareXResources.Theme.SeparatorDarkColor; + public override Color GripLight => ShareXResources.Theme.SeparatorLightColor; + public override Color ImageMarginGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color ImageMarginGradientMiddle => ShareXResources.Theme.BackgroundColor; + public override Color ImageMarginGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color ImageMarginRevealedGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color ImageMarginRevealedGradientMiddle => ShareXResources.Theme.BackgroundColor; + public override Color ImageMarginRevealedGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color MenuStripGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color MenuStripGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color MenuItemSelected => ShareXResources.Theme.MenuHighlightColor; + public override Color MenuItemBorder => ShareXResources.Theme.MenuBorderColor; + public override Color MenuBorder => ShareXResources.Theme.MenuBorderColor; + public override Color MenuItemSelectedGradientBegin => ShareXResources.Theme.MenuHighlightColor; + public override Color MenuItemSelectedGradientEnd => ShareXResources.Theme.MenuHighlightColor; + public override Color MenuItemPressedGradientBegin => ShareXResources.Theme.MenuHighlightColor; + public override Color MenuItemPressedGradientMiddle => ShareXResources.Theme.MenuHighlightColor; + public override Color MenuItemPressedGradientEnd => ShareXResources.Theme.MenuHighlightColor; + public override Color RaftingContainerGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color RaftingContainerGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color SeparatorDark => ShareXResources.Theme.SeparatorDarkColor; + public override Color SeparatorLight => ShareXResources.Theme.SeparatorLightColor; + public override Color StatusStripGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color StatusStripGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripBorder => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripDropDownBackground => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripGradientMiddle => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripContentPanelGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripContentPanelGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripPanelGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color ToolStripPanelGradientEnd => ShareXResources.Theme.BackgroundColor; + public override Color OverflowButtonGradientBegin => ShareXResources.Theme.BackgroundColor; + public override Color OverflowButtonGradientMiddle => ShareXResources.Theme.BackgroundColor; + public override Color OverflowButtonGradientEnd => ShareXResources.Theme.BackgroundColor; } } \ No newline at end of file diff --git a/ShareX.HelpersLib/Helpers/Helpers.cs b/ShareX.HelpersLib/Helpers/Helpers.cs index d5c83c0a0..09c855fb8 100644 --- a/ShareX.HelpersLib/Helpers/Helpers.cs +++ b/ShareX.HelpersLib/Helpers/Helpers.cs @@ -625,21 +625,6 @@ namespace ShareX.HelpersLib return result; } - public static bool IsRunning(string name) - { - try - { - Mutex mutex = Mutex.OpenExisting(name); - mutex.ReleaseMutex(); - } - catch - { - return false; - } - - return true; - } - public static T ByteArrayToStructure(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); diff --git a/ShareX.HelpersLib/MutexManager.cs b/ShareX.HelpersLib/MutexManager.cs new file mode 100644 index 000000000..f3db61eea --- /dev/null +++ b/ShareX.HelpersLib/MutexManager.cs @@ -0,0 +1,84 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (c) 2007-2024 ShareX Team + + 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 2 + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Optionally you can also view the license at . +*/ + +#endregion License Information (GPL v3) + +using System; +using System.Threading; + +namespace ShareX.HelpersLib +{ + public class MutexManager : IDisposable + { + public bool HasHandle { get; private set; } + + private Mutex mutex; + + public MutexManager(string mutexName) : this(mutexName, Timeout.Infinite) + { + } + + public MutexManager(string mutexName, int timeout) + { + mutex = new Mutex(false, mutexName); + + try + { + HasHandle = mutex.WaitOne(timeout, false); + } + catch (AbandonedMutexException) + { + HasHandle = true; + } + } + + public static bool IsRunning(string mutexName) + { + try + { + using (Mutex mutex = new Mutex(false, mutexName, out bool createdNew)) + { + return !createdNew; + } + } + catch + { + } + + return false; + } + + public void Dispose() + { + if (mutex != null) + { + if (HasHandle) + { + mutex.ReleaseMutex(); + } + + mutex.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/ShareX.HelpersLib/SingleInstanceManager.cs b/ShareX.HelpersLib/SingleInstanceManager.cs index 340595eb0..f5265f566 100644 --- a/ShareX.HelpersLib/SingleInstanceManager.cs +++ b/ShareX.HelpersLib/SingleInstanceManager.cs @@ -44,7 +44,7 @@ namespace ShareX.HelpersLib private const int MaxArgumentsLength = 100; private const int ConnectTimeout = 5000; - private readonly Mutex mutex; + private readonly MutexManager mutex; private CancellationTokenSource cts; public SingleInstanceManager(string mutexName, string pipeName, string[] args) : this(mutexName, pipeName, true, args) @@ -57,31 +57,21 @@ namespace ShareX.HelpersLib PipeName = pipeName; IsSingleInstance = isSingleInstance; - mutex = new Mutex(false, MutexName); + mutex = new MutexManager(MutexName, 0); + IsFirstInstance = mutex.HasHandle; - try + if (IsSingleInstance) { - IsFirstInstance = mutex.WaitOne(100, false); - - if (IsSingleInstance) + if (IsFirstInstance) { - if (IsFirstInstance) - { - cts = new CancellationTokenSource(); + cts = new CancellationTokenSource(); - Task.Run(ListenForConnectionsAsync, cts.Token); - } - else - { - RedirectArgumentsToFirstInstance(args); - } + Task.Run(ListenForConnectionsAsync, cts.Token); + } + else + { + RedirectArgumentsToFirstInstance(args); } - } - catch (AbandonedMutexException) - { - DebugHelper.WriteLine("Single instance mutex found abandoned from another process."); - - IsFirstInstance = true; } } @@ -175,15 +165,7 @@ namespace ShareX.HelpersLib cts.Dispose(); } - if (mutex != null) - { - if (IsFirstInstance) - { - mutex.ReleaseMutex(); - } - - mutex.Dispose(); - } + mutex?.Dispose(); } } } \ No newline at end of file diff --git a/ShareX.Steam/Helpers.cs b/ShareX.Steam/Helpers.cs index c1a1ce068..dc3f46292 100644 --- a/ShareX.Steam/Helpers.cs +++ b/ShareX.Steam/Helpers.cs @@ -47,21 +47,20 @@ namespace ShareX.Steam return Path.GetFullPath(path); } - public static bool IsRunning(string name) + public static bool IsRunning(string mutexName) { - bool createdNew = true; - try { - using (Mutex mutex = new Mutex(false, name, out createdNew)) + using (Mutex mutex = new Mutex(false, mutexName, out bool createdNew)) { + return !createdNew; } } catch { } - return !createdNew; + return false; } /// diff --git a/ShareX.Steam/Launcher.cs b/ShareX.Steam/Launcher.cs index 12cc44c60..d66ce9a4c 100644 --- a/ShareX.Steam/Launcher.cs +++ b/ShareX.Steam/Launcher.cs @@ -34,7 +34,7 @@ namespace ShareX.Steam { public static class Launcher { - private static string ContentFolderPath = GetContentFolderPath(); + private static string ContentFolderPath = Helpers.GetAbsolutePath("ShareX"); private static string ContentExecutablePath = Path.Combine(ContentFolderPath, "ShareX.exe"); private static string ContentSteamFilePath = Path.Combine(ContentFolderPath, "Steam"); private static string UpdatingTempFilePath = Path.Combine(ContentFolderPath, "Updating"); @@ -55,11 +55,7 @@ namespace ShareX.Steam IsStartupRun = Helpers.IsCommandExist(args, "-silent"); -#if DEBUG - ShowInApp = true; -#else ShowInApp = File.Exists(ContentSteamFilePath); -#endif if (!IsShareXRunning()) { @@ -136,20 +132,6 @@ namespace ShareX.Steam } } - private static string GetContentFolderPath() - { -#if DEBUG - string path = Helpers.GetAbsolutePath(@"..\..\..\ShareX\bin\Debug"); - - if (Directory.Exists(path)) - { - return path; - } -#endif - - return Helpers.GetAbsolutePath("ShareX"); - } - private static bool IsShareXRunning() { // Check ShareX mutex.