diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb4444f --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Cursor GuardRail + +> A utility for locking the cursor to one or more monitors. + +![Icon](icon/icon_64.png) + +--- + +## Features + +- Lock the cursor to one of more monitors +- Good for old games that don't implement cursor boundaries +- Ideal for when you have monitors for non-interactive displays + +## Screenshots + +[![screenshot](wiki/screenshot-1-h240.png)](wiki/screenshot-1.png) [![screenshot](wiki/screenshot-2-h240.png)](wiki/screenshot-2.png) + +--- + +## Releases & Builds + +See [Releases](/Ray/cursor-guardrail-utility/releases) + +## Acknowledgements + +This software uses a number of dependencies and assets from third-parties. +These developers and artists deserve due credit for their work and for their commitment to sharing their work freely. +Each product is released under their own particular license, for more information please visit their websites. + +- [Lucide](https://lucide.dev/icons/) + +## License + +This project is licensed under the least restrictive terms of its dependencies, viz. MIT License. \ No newline at end of file diff --git a/build-installer.iss b/build-installer.iss new file mode 100644 index 0000000..65bdf5d --- /dev/null +++ b/build-installer.iss @@ -0,0 +1,52 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "CursorGuardRail" +#define MyAppVersion "0.1.0.119" +#define MyAppPublisher "Hi, I'm Ray" +#define MyAppURL "https://git.hiimray.co.uk/Ray/cursor-guardrail-utility" +#define MyAppExeName "cursorguardrail.exe" + +#define AppSourcePath "L:\gitea-hiimray\cursor-guardrail-utility\bin" +#define AppReleasePath "L:\gitea-hiimray\cursor-guardrail-utility\bin" +#define AppReleaseName "cursorguardrail-installer" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{472ED37C-C4FC-4B72-8BC3-C281A6E0D2F9} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\{#MyAppName} +DefaultGroupName={#MyAppName} +DisableProgramGroupPage=yes +; Remove the following line to run in administrative install mode (install for all users.) +PrivilegesRequired=lowest +OutputDir={#AppReleasePath} +OutputBaseFilename={#AppReleaseName} +Compression=lzma +SolidCompression=yes +WizardStyle=modern + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "{#AppSourcePath}\cursorguardrail.exe"; DestDir: "{app}"; Flags: ignoreversion +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent + diff --git a/build.bat b/build.bat index a061a7f..817290a 100644 --- a/build.bat +++ b/build.bat @@ -5,6 +5,10 @@ rmdir /s /q "source\obj\" dotnet restore CursorGuardRail.slnx dotnet publish CursorGuardRail.slnx -r win-x64 -c Release /p:PublishSingleFile=true /p:SelfContained=false /p:PublishReadyToRunfalse=true /p:PublishDir="..\bin\" +"C:\B\Portable Files (dev)\Inno Setup\v6.0.4-2\app\ISCC.exe" "build-installer.iss" + +"C:\B\Portable Files\7-Zip (Portable)\26.02\App\7-Zip64\7z.exe" a -t7z "bin\cursorguardrail.7z" ".\bin\cursorguardrail.exe" -mx9 + rmdir /s /q "source\bin\" rmdir /s /q "source\obj\" diff --git a/source/MainForm.cs b/source/MainForm.cs index 83c6da8..ce9a0ab 100644 --- a/source/MainForm.cs +++ b/source/MainForm.cs @@ -131,21 +131,26 @@ namespace CursorGuardRail if (!_lockCursorArea.HasValue || _lockCursorArea == Rectangle.Empty) { this.IsCursorLocked = false; + screensLayout1.ShowArea = false; return; } _timer.Start(); - //notifyIcon1.Visible = true; + screensLayout1.ShowArea = true; if (this.HideOnLock) this.Close(); } else { + _lockCursorArea = null; + ClipCursor(Rectangle.Empty); notifyIcon1.Visible = value || !this.Visible; if (_timer.Enabled) _timer.Stop(); + + screensLayout1.ShowArea = false; } } } = false; diff --git a/source/Windows/Forms/ScreensLayout.cs b/source/Windows/Forms/ScreensLayout.cs index 4858d9f..af61b3f 100644 --- a/source/Windows/Forms/ScreensLayout.cs +++ b/source/Windows/Forms/ScreensLayout.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Drawing; using System.Linq; using System.Windows.Forms; @@ -48,11 +49,14 @@ namespace CursorGuardRail.Windows.Forms TextRenderer.DrawText(g, label, font, rect, foreColour, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.NoPadding| TextFormatFlags.EndEllipsis); } - if (this.Screens.Any(x => x.IsSelected)) + if (this.ShowArea) { - var area = CalcMaxBound(this.Screens.Where(x => x.IsSelected).Select(x => x.Bound).ToList()); + if (this.Screens.Any(x => x.IsSelected)) + { + var area = CalcMaxBound(this.Screens.Where(x => x.IsSelected).Select(x => x.Bound).ToList()); - g.DrawRectangle(selectedAreaBorderColour, area); + g.DrawRectangle(selectedAreaBorderColour, area); + } } g.Flush(); @@ -146,11 +150,22 @@ namespace CursorGuardRail.Windows.Forms private set { field = value; - - //this.Invalidate(); } } + [Browsable(false), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public bool ShowArea + { + get => field; + set + { + field = value; + + this.Invalidate(); + } + } = false; + + private decimal ScaleRatio { get