2023-05-15 23:32:26 +01:00
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System ;
using System.Diagnostics ;
using System.Diagnostics.CodeAnalysis ;
using System.Drawing ;
using System.Globalization ;
using System.Text.RegularExpressions ;
using System.Windows.Forms ;
2024-09-16 16:09:43 -04:00
2023-05-15 23:32:26 +01:00
using Microsoft.PowerToys.Telemetry ;
// <summary>
// Matrix/Settings form.
// </summary>
// <history>
// 2008 created by Truong Do (ductdo).
// 2009-... modified by Truong Do (TruongDo).
// 2023- Included in PowerToys.
// </history>
using MouseWithoutBorders.Class ;
2024-10-18 17:32:08 +01:00
using MouseWithoutBorders.Core ;
2023-05-15 23:32:26 +01:00
using Timer = System . Windows . Forms . Timer ;
[module: SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#buttonOK_Click(System.Object,System.EventArgs)", Justification = "Dotnet port with style preservation")]
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#buttonSendHello_Click(System.Object,System.EventArgs)", Justification = "Dotnet port with style preservation")]
[module: SuppressMessage("Microsoft.Globalization", "CA1304:SpecifyCultureInfo", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#frmMatrix_Load(System.Object,System.EventArgs)", MessageId = "System.String.ToLower", Justification = "Dotnet port with style preservation")]
// [module: SuppressMessage("Microsoft.Mobility", "CA1601:DoNotUseTimersThatPreventPowerStateChanges", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#ChangeUI2OneRow(System.Boolean)")]
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#logoTimer_Tick(System.Object,System.EventArgs)", Justification = "Dotnet port with style preservation")]
[module: SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#Dispose(System.Boolean)", MessageId = "logoBitmap", Justification = "Dotnet port with style preservation")]
[module: SuppressMessage("Microsoft.Mobility", "CA1601:DoNotUseTimersThatPreventPowerStateChanges", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#frmMatrix_Shown(System.Object,System.EventArgs)", Justification = "Dotnet port with style preservation")]
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.frmMatrix.#PaintMyLogo()", Justification = "Dotnet port with style preservation")]
[Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)
* [Analyzers] Remove duplicate pascal case style from .editorconfig
* [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS
Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263
* [Analyzers] Fix mismatched analyzer descriptions
* [Analyzers] Fix misspelling
* Update .editorconfig
Made the following style rules `silent` instead of `suggestion`:
- Use explicit type instead of 'var'
- Use expression body for ...
- Use block-scoped namespace
* [Analyzers] Set IDE0290 to silent
* [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries
* [Analyzers][Indexer] Add IDE1006 suppressions
* [Analyzers][Peek] Add IDE1006 suppression
* [Analyzers][MWB] Add IDE1006 suppression.
* [Analyzers][Plugins] Add IDE1006 suppression
* [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright
* [Analyzers] Remove IDE0073 severity change in .editorconfig
---------
Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
2024-12-04 12:58:36 -05:00
[module: SuppressMessage("Style", "IDE1006:Naming Styles", Scope = "member", Target = "~M:MouseWithoutBorders.FrmMatrix.M_EnabledChanged(System.Object,System.EventArgs)", Justification = "Dotnet port with style preservation")]
2023-05-15 23:32:26 +01:00
namespace MouseWithoutBorders
{
internal partial class FrmMatrix : System . Windows . Forms . Form , IDisposable
{
#pragma warning disable CA2213 // Disposing is done by ComponentResourceManager
private Timer helperTimer ;
#pragma warning restore CA2213
private bool formShown ;
private int formOrgHeight ;
private bool matrixOneRow ;
internal FrmMatrix ( )
{
InitializeComponent ( ) ;
textBoxEnc . Font = new System . Drawing . Font ( Control . DefaultFont . Name , 12F , System . Drawing . FontStyle . Bold , System . Drawing . GraphicsUnit . Point , 0 ) ;
Text = Application . ProductName + " " + Application . ProductVersion + " - Settings" ;
toolTip . ToolTipTitle = Application . ProductName ;
toolTipManual . ToolTipTitle = Application . ProductName ;
labelExitMM . Text = "Exit the application, Ctrl+Alt+Shift+:" ;
textBoxMachineName2IP . Text = Setting . Values . Name2IP ;
}
private void ButtonCancel_Click ( object sender , EventArgs e )
{
buttonCancel . Enabled = false ;
Close ( ) ;
Common . MatrixForm = null ;
}
private void ButtonOK_Click ( object sender , EventArgs e )
{
buttonOK . Enabled = false ;
if ( ! UpdateKey ( Regex . Replace ( textBoxEnc . Text , @"\s+" , string . Empty ) ) )
{
buttonOK . Enabled = true ;
return ;
}
2025-02-21 08:31:44 +00:00
string [ ] st = new string [ MachineStuff . MAX_MACHINE ] ;
for ( int i = 0 ; i < MachineStuff . MAX_MACHINE ; i + + )
2023-05-15 23:32:26 +01:00
{
if ( machines [ i ] . MachineEnabled )
{
for ( int j = 0 ; j < i ; j + + )
{
if ( st [ j ] . Equals ( machines [ i ] . MachineName , StringComparison . OrdinalIgnoreCase ) )
{
machines [ i ] . MachineName = string . Empty ;
machines [ i ] . MachineEnabled = false ;
}
}
st [ i ] = machines [ i ] . MachineName ;
}
else
{
st [ i ] = string . Empty ;
}
}
2025-02-21 08:31:44 +00:00
MachineStuff . MachineMatrix = st ;
2023-05-15 23:32:26 +01:00
Setting . Values . MatrixOneRow = matrixOneRow = ! checkBoxTwoRow . Checked ;
if ( Process . GetCurrentProcess ( ) . SessionId ! = NativeMethods . WTSGetActiveConsoleSessionId ( ) )
{
Program . StartService ( ) ;
Common . ShowToolTip ( "New settings applied on the physical console session!" , 3000 , ToolTipIcon . Warning , false ) ;
}
else
{
SocketStuff . InvalidKeyFound = false ;
showInvalidKeyMessage = false ;
Common . ReopenSocketDueToReadError = true ;
Common . ReopenSockets ( true ) ;
for ( int i = 0 ; i < 10 ; i + + )
{
if ( Common . AtLeastOneSocketConnected ( ) )
{
Common . MMSleep ( 0.5 ) ;
break ;
}
Common . MMSleep ( 0.2 ) ;
}
2025-02-21 08:31:44 +00:00
MachineStuff . SendMachineMatrix ( ) ;
2023-05-15 23:32:26 +01:00
}
buttonOK . Enabled = true ;
}
internal void UpdateKeyTextBox ( )
{
_ = Common . GetUserName ( ) ;
textBoxEnc . Text = Common . MyKey ;
}
private void InitAll ( )
{
formOrgHeight = Height ;
matrixOneRow = Setting . Values . MatrixOneRow ;
CreateMachines ( ) ;
LoadSettingsToUI ( ) ;
UpdateKeyTextBox ( ) ;
}
private void LoadMachines ( )
{
bool meAdded = false ;
string machineName ;
2025-02-21 08:31:44 +00:00
if ( MachineStuff . MachineMatrix ! = null & & MachineStuff . MachineMatrix . Length = = MachineStuff . MAX_MACHINE )
2023-05-15 23:32:26 +01:00
{
2024-10-18 17:32:08 +01:00
Logger . LogDebug ( "LoadMachines: Machine Matrix: " + Setting . Values . MachineMatrixString ) ;
2023-05-15 23:32:26 +01:00
2025-02-21 08:31:44 +00:00
for ( int i = 0 ; i < MachineStuff . MAX_MACHINE ; i + + )
2023-05-15 23:32:26 +01:00
{
2025-02-21 08:31:44 +00:00
machineName = MachineStuff . MachineMatrix [ i ] . Trim ( ) ;
2023-05-15 23:32:26 +01:00
machines [ i ] . MachineName = machineName ;
if ( string . IsNullOrEmpty ( machineName ) )
{
machines [ i ] . CheckAble = true ;
}
else
{
machines [ i ] . MachineEnabled = true ;
}
2025-02-21 08:31:44 +00:00
bool found = MachineStuff . MachinePool . TryFindMachineByName ( machineName , out MachineInf machineInfo ) ;
2023-05-15 23:32:26 +01:00
if ( found )
{
if ( machineInfo . Id = = Common . MachineID )
{
machines [ i ] . LocalHost = true ;
meAdded = true ;
}
}
}
}
if ( ! meAdded )
{
foreach ( Machine m in machines )
{
if ( string . IsNullOrEmpty ( m . MachineName ) )
{
m . MachineName = Common . MachineName . Trim ( ) ;
m . LocalHost = true ;
meAdded = true ;
break ;
}
}
}
}
private void CheckBoxShowKey_CheckedChanged ( object sender , EventArgs e )
{
textBoxEnc . PasswordChar = checkBoxShowKey . Checked ? ( char ) 0 : '*' ;
}
private void FrmMatrix_Shown ( object sender , EventArgs e )
{
if ( Setting . Values . FirstRun )
{
Setting . Values . FirstRun = false ;
Common . ReopenSockets ( false ) ;
/ *
string fireWallLog = Path . GetDirectoryName ( Application . ExecutablePath ) + "\\FirewallError.log" ;
if ( File . Exists ( fireWallLog ) )
{
//@"http://bing.com/search?q=Allow+a+program+through+Windows+Firewall"
MessageBox . Show ( Application . ProductName + " was unable to add itself to the Firewall exception list.\r\n" +
"The following application needs to be added to the Firewall exception list:\r\n\r\n" +
Application . ExecutablePath +
"\r\n\r\nYou can go to bing.com and do a search on" + "\r\n'Allow a program through Windows Firewall' to know how." ,
Application . ProductName ,
MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
}
linkLabelHelp_LinkClicked ( null , null ) ;
* * /
}
InitAll ( ) ;
if ( Setting . Values . IsMyKeyRandom )
{
Setting . Values . IsMyKeyRandom = false ;
checkBoxShowKey . Checked = true ;
}
if ( helperTimer = = null )
{
helperTimer = new Timer ( ) ;
helperTimer . Interval = 200 ;
helperTimer . Tick + = new EventHandler ( HelperTimer_Tick ) ;
helperTimer . Start ( ) ;
}
formShown = true ;
}
private void FrmMatrix_FormClosed ( object sender , FormClosedEventArgs e )
{
/ *
if ( logoTimer ! = null )
{
logoTimer . Stop ( ) ;
logoTimer . Dispose ( ) ;
logoTimer = null ;
}
* * /
if ( helperTimer ! = null )
{
helperTimer . Stop ( ) ;
helperTimer . Dispose ( ) ;
helperTimer = null ;
}
// if (logoBitmap != null) logoBitmap.Dispose();
Common . MatrixForm = null ;
}
private int pivot ;
private Bitmap logoBitmap ;
private void PaintMyLogo ( )
{
if ( ! Visible | | ! ( tabControlSetting . SelectedTab = = tabPageAdvancedSettings ) )
{
return ;
}
uint rv = 0 ;
try
{
Color c ;
uint cl ;
double dC ;
logoBitmap ? ? = new Bitmap ( pictureBoxMouseWithoutBorders0 . BackgroundImage ) ;
int bWidth = logoBitmap . Width ;
int bHeight = logoBitmap . Height ;
double dx = ( double ) pictureBoxMouseWithoutBorders . Width / bWidth ;
double dy = ( double ) pictureBoxMouseWithoutBorders . Height / bHeight ;
IntPtr hdc = NativeMethods . GetWindowDC ( pictureBoxMouseWithoutBorders . Handle ) ;
for ( int i = 0 ; i < bWidth ; i + + )
{
for ( int j = 0 ; j < bHeight ; j + + )
{
c = logoBitmap . GetPixel ( i , j ) ;
// c.G > 245
if ( c . R < 240 & & c . B < 240 )
{
dC = Math . Abs ( pivot - i ) ;
if ( bWidth - pivot + i < dC )
{
dC = bWidth - pivot + i ;
}
if ( bWidth - i + pivot < dC )
{
dC = bWidth - i + pivot ;
}
dC / = bWidth ;
// c = Color.FromArgb(80, (int)(255 - 255 * dC), 80);
cl = ( 160 < < 16 ) | ( ( uint ) ( 255 - ( 255 * dC ) ) < < 8 ) | 160 ;
// Using GDI SetPixel so we dont have to assign the image later on
// b.SetPixel(i, j, c);
rv = NativeMethods . SetPixel ( hdc , ( int ) ( i * dx ) , ( int ) ( j * dy ) , cl ) ;
}
}
}
// Image im = pictureBoxMouseWithoutBorders.BackgroundImage;
// pictureBoxMouseWithoutBorders.BackgroundImage = b;
// if (im != null) im.Dispose();
rv = ( uint ) NativeMethods . ReleaseDC ( pictureBoxMouseWithoutBorders . Handle , hdc ) ;
pivot = ( pivot + 5 ) % bWidth ;
}
catch ( Exception ee )
{
2024-10-18 17:32:08 +01:00
Logger . Log ( ee ) ;
Logger . Log ( rv . ToString ( CultureInfo . CurrentCulture ) ) ;
2023-05-15 23:32:26 +01:00
}
}
private void AddNewMachine ( )
{
string newMachine ;
Machine unUsedMachine ;
2025-02-21 08:31:44 +00:00
foreach ( MachineInf inf in MachineStuff . MachinePool . ListAllMachines ( ) )
2023-05-15 23:32:26 +01:00
{
bool found = false ;
unUsedMachine = null ;
newMachine = inf . Name . Trim ( ) ;
foreach ( Machine m in machines )
{
if ( m . MachineName . Equals (
newMachine ,
StringComparison . OrdinalIgnoreCase ) )
{
found = true ;
}
else if ( unUsedMachine = = null & & string . IsNullOrEmpty ( m . MachineName . Trim ( ) ) )
{
unUsedMachine = m ;
}
}
if ( ! found & & unUsedMachine ! = null )
{
unUsedMachine . MachineName = newMachine ;
}
}
}
private int helperTimerCounter ;
private bool showInvalidKeyMessage ;
private void HelperTimer_Tick ( object sender , EventArgs e )
{
string keyNotMatchedMachines = string . Empty ;
if ( Setting . Values . Changed )
{
Setting . Values . Changed = false ;
matrixOneRow = Setting . Values . MatrixOneRow ;
LoadSettingsToUI ( ) ;
/ *
if ( ! Common . InMachineMatrix ( Common . MachineName ) )
{
foreach ( Machine m in machines )
{
if ( ! m . LocalHost )
{
m . MachineEnabled = false ;
}
}
}
* * /
}
helperTimerCounter + + ;
// 1 sec
if ( helperTimerCounter % 5 = = 0 )
{
comboBoxEasyMouseOption . Text = ( ( EasyMouseOption ) Setting . Values . EasyMouse ) . ToString ( ) ;
if ( ! textBoxMachineName2IP . Text . Equals ( Setting . Values . Name2IP , StringComparison . OrdinalIgnoreCase ) )
{
Setting . Values . Name2IP = textBoxMachineName2IP . Text ;
}
// 2 times
if ( helperTimerCounter < 15 )
{
Common . SendHello ( ) ;
}
AddNewMachine ( ) ;
}
2023-05-30 18:46:42 +02:00
// NOTE(@yuyoyuppe): this option is deprecated
// checkBoxVKMap.Checked = Setting.Values.UseVKMap;
2023-05-15 23:32:26 +01:00
foreach ( Machine m in machines )
{
if ( m . StatusClient ! = SocketStatus . NA )
{
m . StatusClient = SocketStatus . NA ;
}
if ( m . StatusServer ! = SocketStatus . NA )
{
m . StatusServer = SocketStatus . NA ;
}
}
SocketStuff sk = Common . Sk ;
if ( sk ! = null )
{
lock ( sk . TcpSocketsLock )
{
if ( sk . TcpSockets ! = null )
{
foreach ( TcpSk t in sk . TcpSockets )
{
if ( t . Status = = SocketStatus . InvalidKey )
{
keyNotMatchedMachines + = string . Format ( CultureInfo . CurrentCulture , "[{0}]" , t . MachineName ) ;
}
foreach ( Machine m in machines )
{
if ( m . MachineEnabled )
{
if ( m . MachineName . Equals ( t . MachineName , StringComparison . OrdinalIgnoreCase ) )
{
if ( t . IsClient )
{
if ( t . Status > m . StatusClient )
{
m . StatusClient = t . Status ;
}
}
else
{
if ( t . Status > m . StatusServer )
{
m . StatusServer = t . Status ;
}
}
}
}
}
}
}
}
}
if ( SocketStuff . InvalidKeyFound )
{
if ( ! showInvalidKeyMessage )
{
showInvalidKeyMessage = true ;
Common . ShowToolTip (
"Security Keys not matched.\r\nVerify that you entered the same key in all machines.\r\nAnd make sure you run the same version of "
+ Application . ProductName + " in all machines.\r\n" + keyNotMatchedMachines + "\r\nThis version: " + FrmAbout . AssemblyVersion ,
20000 ,
ToolTipIcon . Warning ,
Setting . Values . ShowClipNetStatus ) ;
}
}
else
{
showInvalidKeyMessage = false ;
}
PaintMyLogo ( ) ;
}
private void ShowKeyErrorMsg ( string msg )
{
Common . ShowToolTip ( msg , 10000 , ToolTipIcon . Error , false ) ;
_ = textBoxEnc . Focus ( ) ;
textBoxEnc . SelectAll ( ) ;
}
private bool UpdateKey ( string newKey )
{
if ( ! Common . IsKeyValid ( newKey , out string rv ) )
{
ShowKeyErrorMsg ( rv ) ;
return false ;
}
if ( ! newKey . Equals ( Common . MyKey , StringComparison . OrdinalIgnoreCase ) )
{
Common . MyKey = newKey ;
Common . GeneratedKey = false ;
}
Common . MagicNumber = Common . Get24BitHash ( Common . MyKey ) ;
return true ;
}
2025-02-21 08:31:44 +00:00
private readonly Machine [ ] machines = new Machine [ MachineStuff . MAX_MACHINE ] ;
2023-05-15 23:32:26 +01:00
private Machine dragDropMachine ;
private Machine desMachine ;
private Machine desMachineX ;
private Machine desMachineY ;
private Machine oldDesMachine ;
private Point desMachinePos ;
private Point oldDesMachinePos ;
private void CreateMachines ( )
{
2025-02-21 08:31:44 +00:00
for ( int i = 0 ; i < MachineStuff . MAX_MACHINE ; i + + )
2023-05-15 23:32:26 +01:00
{
Machine m = new ( ) ;
m . MouseDown + = Machine_MouseDown ;
m . EnabledChanged + = new EventHandler ( M_EnabledChanged ) ;
m . Parent = groupBoxMachineMatrix ;
m . MachineEnabled = false ;
machines [ i ] = m ;
}
FrmMatrix_Resize ( this , EventArgs . Empty ) ;
ArrangeMachines ( ) ;
}
private void ArrangeMachines ( )
{
Height = matrixOneRow ? formOrgHeight : formOrgHeight + 60 ;
int dx = ( groupBoxMachineMatrix . Width - 40 ) / 4 ;
int yOffset = groupBoxMachineMatrix . Height / 3 ;
2025-02-21 08:31:44 +00:00
for ( int i = 0 ; i < MachineStuff . MAX_MACHINE ; i + + )
2023-05-15 23:32:26 +01:00
{
machines [ i ] . Left = matrixOneRow ? 22 + ( i * dx ) : 22 + dx + ( ( i % 2 ) * dx ) ;
machines [ i ] . Top = matrixOneRow ? yOffset : ( yOffset / 2 ) + ( i / 2 * ( machines [ i ] . Width + 2 ) ) ;
machines [ i ] . Visible = true ;
}
}
private void M_EnabledChanged ( object sender , EventArgs e )
{
Machine m = sender as Machine ;
SocketStuff sk = Common . Sk ;
if ( ! m . MachineEnabled & & sk ! = null )
{
lock ( sk . TcpSocketsLock )
{
if ( sk . TcpSockets ! = null )
{
foreach ( TcpSk t in sk . TcpSockets )
{
if ( t . MachineName ! = null & & t . MachineName . Equals ( m . MachineName . Trim ( ) , StringComparison . OrdinalIgnoreCase ) )
{
t . Status = SocketStatus . NA ;
}
}
}
}
}
}
private void Machine_MouseDown ( object sender , MouseEventArgs e )
{
oldDesMachine = desMachine = dragDropMachine = sender as Machine ;
desMachinePos . X = desMachine . Left ;
desMachinePos . Y = desMachine . Top ;
oldDesMachinePos . X = oldDesMachine . Left ;
oldDesMachinePos . Y = oldDesMachine . Top ;
dragDropMachineOrgX = dragDropMachine . Left ;
dragDropMachineOrgY = dragDropMachine . Top ;
dragDropMachine . BringToFront ( ) ;
_ = DoDragDrop ( dragDropMachine , DragDropEffects . Move ) ;
}
private int startX ;
private int startY ;
private int dragDropMachineOrgX ;
private int dragDropMachineOrgY ;
private void Form_DragEnter ( object sender , DragEventArgs e )
{
startX = e . X ;
startY = e . Y ;
e . Effect = DragDropEffects . Move ;
}
private bool IsOnSameRow ( Machine m1 , Machine m2 )
{
return matrixOneRow | | ( m1 = = dragDropMachine ? desMachinePos . Y : m1 . Top ) = = m2 . Top ;
}
private bool IsOnSameCol ( Machine m1 , Machine m2 )
{
return ! matrixOneRow & & ( m1 = = dragDropMachine ? desMachinePos . X : m1 . Left ) = = m2 . Left ;
}
private long lastMove ;
private void Form_DragOver ( object sender , DragEventArgs e )
{
if ( dragDropMachine = = null )
{
return ;
}
e . Effect = DragDropEffects . Move ;
dragDropMachine . Left = dragDropMachineOrgX + ( e . X - startX ) ;
dragDropMachine . Top = dragDropMachineOrgY + ( e . Y - startY ) ;
/ *
dragDropMachine . Left = e . X - dragDropMachine . MouseDownPos . X - Left - 3
- groupBoxMachineMatrix . Left - tabControlSetting . Left ;
dragDropMachine . Top = e . Y - dragDropMachine . MouseDownPos . Y - Top - 25
- groupBoxMachineMatrix . Top - tabControlSetting . Top ;
* * /
if ( ! matrixOneRow & & Common . GetTick ( ) - lastMove < 500 )
{
return ;
}
int minX = Math . Abs ( dragDropMachine . Left - desMachinePos . X ) ;
int minY = Math . Abs ( dragDropMachine . Top - desMachinePos . Y ) ;
desMachineX = desMachineY = desMachine ;
2025-02-21 08:31:44 +00:00
for ( int i = 0 ; i < MachineStuff . MAX_MACHINE ; i + + )
2023-05-15 23:32:26 +01:00
{
if ( machines [ i ] = = dragDropMachine )
{
continue ;
}
if ( IsOnSameRow ( oldDesMachine , machines [ i ] ) )
{
if ( minX > Math . Abs ( dragDropMachine . Left - machines [ i ] . Left ) )
{
minX = Math . Abs ( dragDropMachine . Left - machines [ i ] . Left ) ;
desMachineX = machines [ i ] ;
}
}
if ( IsOnSameCol ( oldDesMachine , machines [ i ] ) )
{
if ( minY > Math . Abs ( dragDropMachine . Top - machines [ i ] . Top ) )
{
minY = Math . Abs ( dragDropMachine . Top - machines [ i ] . Top ) ;
desMachineY = machines [ i ] ;
}
}
}
oldDesMachine = desMachine ;
desMachine = desMachineY = = oldDesMachine ? desMachineX : desMachineX = = oldDesMachine ? desMachineY : minX < minY ? desMachineX : desMachineY ;
if ( desMachine ! = oldDesMachine )
{
oldDesMachinePos . X = desMachinePos . X ;
desMachinePos . X = desMachine . Left ;
oldDesMachinePos . Y = desMachinePos . Y ;
desMachinePos . Y = desMachine . Top ;
desMachine . Left = oldDesMachinePos . X ;
desMachine . Top = oldDesMachinePos . Y ;
desMachine = dragDropMachine ;
lastMove = Common . GetTick ( ) ;
}
}
private void Form_DragDrop ( object sender , DragEventArgs e )
{
if ( desMachine ! = null )
{
dragDropMachine . Left = desMachinePos . X ;
dragDropMachine . Top = desMachinePos . Y ;
Machine tmp ;
2025-02-21 08:31:44 +00:00
for ( int i = 0 ; i < MachineStuff . MAX_MACHINE - 1 ; i + + )
2023-05-15 23:32:26 +01:00
{
2025-02-21 08:31:44 +00:00
for ( int j = 0 ; j < MachineStuff . MAX_MACHINE - 1 - i ; j + + )
2023-05-15 23:32:26 +01:00
{
if ( machines [ j + 1 ] . Top < machines [ j ] . Top | | ( machines [ j + 1 ] . Top = = machines [ j ] . Top & & machines [ j + 1 ] . Left < machines [ j ] . Left ) )
{
tmp = machines [ j ] ;
machines [ j ] = machines [ j + 1 ] ;
machines [ j + 1 ] = tmp ;
}
}
}
}
}
private void FrmMatrix_DragLeave ( object sender , EventArgs e )
{
Form_DragDrop ( sender , null ) ;
InputSimulation . MouseUp ( ) ;
}
private void LoadSettingsToUI ( )
{
checkBoxCircle . Checked = Setting . Values . MatrixCircle ;
checkBoxTwoRow . Checked = ! matrixOneRow ;
checkBoxBlockMouseAtCorners . Checked = Setting . Values . BlockMouseAtCorners ;
checkBoxDrawMouse . Checked = Setting . Values . DrawMouse ;
checkBoxReverseLookup . Checked = Setting . Values . ReverseLookup ;
checkBoxSameSubNet . Checked = Setting . Values . SameSubNetOnly ;
2023-05-30 18:46:42 +02:00
// NOTE(@yuyoyuppe): this option is deprecated
// checkBoxVKMap.Checked = Setting.Values.UseVKMap;
2023-05-15 23:32:26 +01:00
foreach ( Machine m in machines )
{
m . MachineName = string . Empty ;
m . MachineEnabled = false ;
m . LocalHost = false ;
}
LoadMachines ( ) ;
}
2023-12-28 13:37:13 +03:00
internal static readonly string [ ] Separator = new string [ ] { "\r\n" } ;
2023-05-15 23:32:26 +01:00
internal void ShowTip ( ToolTipIcon icon , string text , int duration )
{
int x = 0 ;
text + = "\r\n " ;
2023-12-28 13:37:13 +03:00
int y = ( - text . Split ( Separator , StringSplitOptions . None ) . Length * 15 ) - 30 ;
2023-05-15 23:32:26 +01:00
toolTipManual . Hide ( this ) ;
toolTipManual . ToolTipIcon = icon ;
toolTipManual . Show ( text , this , x , y , duration ) ;
}
private void LinkLabelHelp_LinkClicked ( object sender , LinkLabelLinkClickedEventArgs e )
{
linkLabelHelp . Enabled = false ;
linkLabelHelp . Enabled = true ;
}
private void CheckBoxShareClipboard_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . ShareClipboard = checkBoxShareClipboard . Checked ;
checkBoxTransferFile . Enabled = checkBoxTransferFile . Checked = Setting . Values . ShareClipboard ;
ShowUpdateMessage ( ) ;
}
private void CheckBoxTransferFile_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . TransferFile = checkBoxTransferFile . Checked ;
ShowUpdateMessage ( ) ;
Common . HasSwitchedMachineSinceLastCopy = true ;
}
private void CheckBoxDisableCAD_CheckedChanged ( object sender , EventArgs e )
{
if ( ! Common . RunWithNoAdminRight )
{
Common . ApplyCADSetting ( ) ;
ShowUpdateMessage ( ) ;
}
}
private void FrmMatrix_Load ( object sender , EventArgs e )
{
if ( Common . RunWithNoAdminRight )
{
checkBoxDisableCAD . Enabled = false ;
checkBoxHideLogo . Enabled = false ;
}
2024-07-17 15:51:38 +02:00
// Note(@htcfreek): Disable checkboxes of settings that we don't support in the PowerToys implementation
checkBoxDisableCAD . Enabled = false ;
checkBoxDisableCAD . Text = checkBoxDisableCAD . Text + " [Unsupported!]" ;
checkBoxHideLogo . Enabled = false ;
checkBoxHideLogo . Text = checkBoxHideLogo . Text + " [Unsupported!]" ;
checkBoxSendLog . Enabled = false ;
checkBoxSendLog . Text = checkBoxSendLog . Text + " [Unsupported!]" ;
2023-05-15 23:32:26 +01:00
checkBoxShareClipboard . Checked = Setting . Values . ShareClipboard ;
if ( ! Setting . Values . ShareClipboard )
{
checkBoxTransferFile . Enabled = checkBoxTransferFile . Checked = false ;
}
else
{
checkBoxTransferFile . Checked = Setting . Values . TransferFile ;
}
checkBoxDisableCAD . Checked = Setting . Values . DisableCAD ;
checkBoxHideLogo . Checked = Setting . Values . HideLogonLogo ;
checkBoxHideMouse . Checked = Setting . Values . HideMouse ;
checkBoxBlockScreenSaver . Checked = Setting . Values . BlockScreenSaver ;
checkBoxMouseMoveRelatively . Checked = Setting . Values . MoveMouseRelatively ;
checkBoxClipNetStatus . Checked = Setting . Values . ShowClipNetStatus ;
checkBoxSendLog . Checked = Setting . Values . SendErrorLogV2 ;
if ( Setting . Values . HotKeySwitchMachine = = ( int ) VK . F1 )
{
radioButtonF1 . Checked = true ;
}
else if ( Setting . Values . HotKeySwitchMachine = = '1' )
{
radioButtonNum . Checked = true ;
}
else
{
radioButtonDisable . Checked = true ;
}
comboBoxShowSettings . Text = "Disable" ;
comboBoxExitMM . Text = Setting . Values . HotKeyExitMM = = 0 ? "Disable" : new string ( new char [ ] { ( char ) Setting . Values . HotKeyExitMM } ) ;
2023-07-26 13:46:41 +02:00
#if OBSOLETE_SHORTCUTS
2023-05-15 23:32:26 +01:00
comboBoxLockMachine . Text = Setting . Values . HotKeyLockMachine = = 0 ? "Disable" : new string ( new char [ ] { ( char ) Setting . Values . HotKeyLockMachine } ) ;
comboBoxReconnect . Text = Setting . Values . HotKeyReconnect = = 0 ? "Disable" : new string ( new char [ ] { ( char ) Setting . Values . HotKeyReconnect } ) ;
comboBoxSwitchToAllPC . Text = Setting . Values . HotKeySwitch2AllPC = = 1
? "Ctrl*3"
: Setting . Values . HotKeySwitch2AllPC = = 0 ? "Disable" : new string ( new char [ ] { ( char ) Setting . Values . HotKeySwitch2AllPC } ) ;
comboBoxEasyMouseOption . Text = ( ( EasyMouseOption ) Setting . Values . EasyMouse ) . ToString ( ) ;
comboBoxEasyMouse . Text = Setting . Values . HotKeyToggleEasyMouse = = 0 ? "Disable" : new string ( new char [ ] { ( char ) Setting . Values . HotKeyToggleEasyMouse } ) ;
2023-07-26 13:46:41 +02:00
#endif
2024-07-22 16:49:45 +02:00
// Apply policy configuration on UI elements
// Has to be the last action
if ( Setting . Values . ShareClipboardIsGpoConfigured )
{
checkBoxShareClipboard . Enabled = false ;
checkBoxShareClipboard . Text + = " [Managed]" ;
// transfer file setting depends on clipboard sharing
checkBoxTransferFile . Enabled = false ;
}
if ( Setting . Values . TransferFileIsGpoConfigured )
{
checkBoxTransferFile . Enabled = false ;
checkBoxTransferFile . Text + = " [Managed]" ;
}
if ( Setting . Values . BlockScreenSaverIsGpoConfigured )
{
checkBoxBlockScreenSaver . Enabled = false ;
checkBoxBlockScreenSaver . Text + = " [Managed]" ;
}
if ( Setting . Values . SameSubNetOnlyIsGpoConfigured )
{
checkBoxSameSubNet . Enabled = false ;
checkBoxSameSubNet . Text + = " [Managed]" ;
}
if ( Setting . Values . ReverseLookupIsGpoConfigured )
{
checkBoxReverseLookup . Enabled = false ;
checkBoxReverseLookup . Text + = " [Managed]" ;
}
if ( Setting . Values . Name2IpIsGpoConfigured )
{
textBoxMachineName2IP . Enabled = false ;
groupBoxDNS . ForeColor = Color . DimGray ;
groupBoxDNS . Text + = " [Managed]" ;
}
if ( Setting . Values . Name2IpPolicyListIsGpoConfigured )
{
pictureBoxMouseWithoutBorders . Visible = false ;
groupBoxName2IPPolicyList . Visible = true ;
textBoxMachineName2IPPolicyList . Visible = true ;
textBoxMachineName2IPPolicyList . Text = Setting . Values . Name2IpPolicyList ;
}
2023-05-15 23:32:26 +01:00
}
private void RadioButton_CheckedChanged ( object sender , EventArgs e )
{
RadioButton r = sender as RadioButton ;
if ( r . Checked )
{
Setting . Values . HotKeySwitchMachine = sender . Equals ( radioButtonF1 ) ? ( int ) VK . F1 : sender . Equals ( radioButtonNum ) ? '1' : 0 ;
ShowUpdateMessage ( ) ;
}
}
private void ComboBoxShowSettings_TextChanged ( object sender , EventArgs e )
{
ShowUpdateMessage ( ) ;
}
private void ComboBoxExitMM_TextChanged ( object sender , EventArgs e )
{
ShowUpdateMessage ( ) ;
}
private void ComboBoxLockMachine_TextChanged ( object sender , EventArgs e )
{
2023-07-26 13:46:41 +02:00
#if OBSOLETE_SHORTCUTS
2023-05-15 23:32:26 +01:00
if ( comboBoxLockMachine . Text . Contains ( "Disable" ) )
{
Setting . Values . HotKeyLockMachine = 0 ;
}
else if ( comboBoxLockMachine . Text . Length > 0 )
{
Setting . Values . HotKeyLockMachine = comboBoxLockMachine . Text [ 0 ] ;
}
2023-07-26 13:46:41 +02:00
#endif
2023-05-15 23:32:26 +01:00
}
private void ComboBoxSwitchToAllPC_TextChanged ( object sender , EventArgs e )
{
2023-07-26 13:46:41 +02:00
#if OBSOLETE_SHORTCUTS
2023-05-15 23:32:26 +01:00
if ( comboBoxSwitchToAllPC . Text . Contains ( "Disable" ) )
{
Setting . Values . HotKeySwitch2AllPC = 0 ;
}
else if ( comboBoxSwitchToAllPC . Text . Contains ( "Ctrl*3" ) )
{
Setting . Values . HotKeySwitch2AllPC = 1 ;
}
else if ( comboBoxSwitchToAllPC . Text . Length > 0 )
{
Setting . Values . HotKeySwitch2AllPC = comboBoxSwitchToAllPC . Text [ 0 ] ;
}
2023-07-26 13:46:41 +02:00
#endif
2023-05-15 23:32:26 +01:00
ShowUpdateMessage ( ) ;
}
private void CheckBoxHideLogo_CheckedChanged ( object sender , EventArgs e )
{
ShowUpdateMessage ( ) ;
}
private void ShowUpdateMessage ( )
{
if ( ! formShown )
{
return ;
}
foreach ( Control c in tabPageOther . Controls )
{
if ( c ! = groupBoxShortcuts )
{
c . Enabled = false ;
}
}
foreach ( Control c in groupBoxShortcuts . Controls )
{
if ( c ! = pictureBoxMouseWithoutBorders )
{
c . Enabled = false ;
}
}
for ( int i = 0 ; i < 3 ; i + + )
{
Application . DoEvents ( ) ;
Thread . Sleep ( 20 ) ;
}
foreach ( Control c in tabPageOther . Controls )
{
if ( c ! = groupBoxShortcuts )
{
c . Enabled = true ;
}
}
foreach ( Control c in groupBoxShortcuts . Controls )
{
if ( c ! = pictureBoxMouseWithoutBorders & & c ! = comboBoxExitMM & & c ! = comboBoxShowSettings & & c ! = comboBoxScreenCapture )
{
c . Enabled = true ;
}
}
}
private void CheckBoxBlockScreenSaver_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . BlockScreenSaver = checkBoxBlockScreenSaver . Checked ;
ShowUpdateMessage ( ) ;
}
private void ComboBoxReconnect_TextChanged ( object sender , EventArgs e )
{
2023-07-26 13:46:41 +02:00
#if OBSOLETE_SHORTCUTS
2023-05-15 23:32:26 +01:00
if ( comboBoxReconnect . Text . Contains ( "Disable" ) )
{
Setting . Values . HotKeyReconnect = 0 ;
}
else if ( comboBoxReconnect . Text . Length > 0 )
{
Setting . Values . HotKeyReconnect = comboBoxReconnect . Text [ 0 ] ;
}
2023-07-26 13:46:41 +02:00
#endif
2023-05-15 23:32:26 +01:00
ShowUpdateMessage ( ) ;
}
private void CheckBoxCircle_CheckedChanged ( object sender , EventArgs e )
{
if ( Setting . Values . MatrixCircle ! = checkBoxCircle . Checked )
{
Setting . Values . MatrixCircle = checkBoxCircle . Checked ;
ShowUpdateMessage ( ) ;
2025-02-21 08:31:44 +00:00
MachineStuff . SendMachineMatrix ( ) ;
2023-05-15 23:32:26 +01:00
}
}
private void CheckBoxBlockMouseAtCorners_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . BlockMouseAtCorners = checkBoxBlockMouseAtCorners . Checked ;
ShowUpdateMessage ( ) ;
}
private void CheckBoxHideMouse_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . HideMouse = checkBoxHideMouse . Checked ;
ShowUpdateMessage ( ) ;
}
private void ComboBoxEasyMouseOption_TextChanged ( object sender , EventArgs e )
{
string selectedOption = comboBoxEasyMouseOption . Text ;
int oldEasyMouseOption = Setting . Values . EasyMouse ;
Setting . Values . EasyMouse = Enum . TryParse < EasyMouseOption > ( selectedOption , out EasyMouseOption easyMouseOption ) ? ( int ) easyMouseOption : ( int ) EasyMouseOption . Enable ;
if ( oldEasyMouseOption ! = Setting . Values . EasyMouse )
{
ShowUpdateMessage ( ) ;
}
}
private void ComboBoxEasyMouse_TextChanged ( object sender , EventArgs e )
{
2023-07-26 13:46:41 +02:00
#if OBSOLETE_SHORTCUTS
2023-05-15 23:32:26 +01:00
if ( comboBoxEasyMouse . Text . Contains ( "Disable" ) )
{
Setting . Values . HotKeyToggleEasyMouse = 0 ;
}
else if ( comboBoxEasyMouse . Text . Length > 0 )
{
Setting . Values . HotKeyToggleEasyMouse = comboBoxEasyMouse . Text [ 0 ] ;
}
2023-07-26 13:46:41 +02:00
#endif
2023-05-15 23:32:26 +01:00
ShowUpdateMessage ( ) ;
}
private void CheckBoxMouseMoveRelatively_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . MoveMouseRelatively = checkBoxMouseMoveRelatively . Checked ;
ShowUpdateMessage ( ) ;
}
private void CheckBoxDrawMouse_CheckedChanged ( object sender , EventArgs e )
{
if ( ! ( Setting . Values . DrawMouse = checkBoxDrawMouse . Checked ) )
{
CustomCursor . ShowFakeMouseCursor ( int . MinValue , int . MinValue ) ;
}
ShowUpdateMessage ( ) ;
}
private void CheckBoxTwoRow_CheckedChanged ( object sender , EventArgs e )
{
matrixOneRow = ! checkBoxTwoRow . Checked ;
ArrangeMachines ( ) ;
}
private void ButtonNewKey_Click ( object sender , EventArgs e )
{
string message = "Do you really want to generate a new key?\r\n" +
"(You would need to enter this key in all other machines to re-establish the connections)" ;
if ( MessageBox . Show ( message , Application . ProductName , MessageBoxButtons . YesNo , MessageBoxIcon . Warning , MessageBoxDefaultButton . Button2 ) = = DialogResult . Yes )
{
Setting . Values . MyKey = Common . MyKey = Common . CreateRandomKey ( ) ;
textBoxEnc . Text = Common . MyKey ;
checkBoxShowKey . Checked = true ;
Common . GeneratedKey = true ;
ButtonOK_Click ( null , null ) ;
Common . ShowToolTip ( "New security key was generated, update other machines to the same key." , 10000 , ToolTipIcon . Info , false ) ;
}
}
private void CheckBoxClipNetStatus_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . ShowClipNetStatus = checkBoxClipNetStatus . Checked ;
ShowUpdateMessage ( ) ;
}
private void CheckBoxSendLog_CheckedChanged ( object sender , EventArgs e )
{
ShowUpdateMessage ( ) ;
}
private void FrmMatrix_Resize ( object sender , EventArgs e )
{
if ( WindowState ! = FormWindowState . Minimized )
{
groupBoxMachineMatrix . Top = groupBoxKeySetup . Top + groupBoxKeySetup . Height + 10 ;
groupBoxMachineMatrix . Height = ClientSize . Height - groupBoxKeySetup . Height - ( int ) ( buttonOK . Height * 3.5 ) ;
checkBoxTwoRow . Top = groupBoxMachineMatrix . Height - ( int ) ( checkBoxTwoRow . Height * 1.4 ) ;
buttonOK . Top = groupBoxMachineMatrix . Bottom + ( int ) ( buttonOK . Height * 0.3 ) ;
buttonCancel . Top = groupBoxMachineMatrix . Bottom + ( int ) ( buttonCancel . Height * 0.3 ) ;
groupBoxShortcuts . Height = ClientSize . Height - groupBoxOtherOptions . Bottom - 40 ;
groupBoxDNS . Height = ClientSize . Height - pictureBoxMouseWithoutBorders . Height - textBoxDNS . Height - 70 ;
}
}
private void CheckBoxReverseLookup_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . ReverseLookup = checkBoxReverseLookup . Checked ;
ShowUpdateMessage ( ) ;
}
private void CheckBoxVKMap_CheckedChanged ( object sender , EventArgs e )
{
2023-05-30 18:46:42 +02:00
// NOTE(@yuyoyuppe): this option is deprecated
// Setting.Values.UseVKMap = checkBoxVKMap.Checked;
2023-05-15 23:32:26 +01:00
ShowUpdateMessage ( ) ;
}
private void LinkLabelMiniLog_LinkClicked ( object sender , LinkLabelLinkClickedEventArgs e )
{
string miniLog = Common . GetMiniLog ( new [ ] { groupBoxOtherOptions . Controls , groupBoxShortcuts . Controls } ) ;
Clipboard . SetText ( miniLog ) ;
Common . ShowToolTip ( "Log has been placed in the clipboard." , 30000 , ToolTipIcon . Info , false ) ;
}
private void ComboBoxScreenCapture_TextChanged ( object sender , EventArgs e )
{
ShowUpdateMessage ( ) ;
}
private void LinkLabelReConfigure_LinkClicked ( object sender , LinkLabelLinkClickedEventArgs e )
{
string message = "WARNING: This will clear the Computer Matrix and allows you to run the setup experience like the first time you installed the program.\r\n" ;
message + = "You need to start this setup experience in all machines. In the next Dialog, click NO in the first machine and click YES in the rest of the machines.\r\n" ;
message + = "And then follow the steps to complete the configuration.\r\n\r\n" ;
message + = "Are you sure you want to continue?" ;
if ( MessageBox . Show ( message , Application . ProductName , MessageBoxButtons . YesNo , MessageBoxIcon . Warning , MessageBoxDefaultButton . Button2 ) = = System . Windows . Forms . DialogResult . Yes )
{
PowerToysTelemetry . Log . WriteEvent ( new MouseWithoutBorders . Telemetry . MouseWithoutBordersOldUIReconfigureEvent ( ) ) ;
ButtonCancel_Click ( this , new EventArgs ( ) ) ;
Setting . Values . FirstRun = true ;
Setting . Values . EasyMouse = ( int ) EasyMouseOption . Enable ;
2025-02-21 08:31:44 +00:00
MachineStuff . ClearComputerMatrix ( ) ;
MachineStuff . ShowSetupForm ( true ) ;
2023-05-15 23:32:26 +01:00
}
}
private void CheckBoxSameSubNet_CheckedChanged ( object sender , EventArgs e )
{
Setting . Values . SameSubNetOnly = checkBoxSameSubNet . Checked ;
ShowUpdateMessage ( ) ;
}
#if USE_TO_CREATE_LOGO_BITMAP
private void PaintMyLogo ( )
{
Graphics g = Graphics . FromHwnd ( this . Handle ) ;
Font font = new Font ( "Chiller" , 40 ) ;
g . DrawString ( Common . BinaryName , font , Brushes . Lime , comboBoxIPs . Right + 50 , comboBoxIPs . Bottom - 5 ) ;
Bitmap b = new Bitmap ( 220 , 100 ) ;
Graphics g2 = Graphics . FromImage ( b ) ;
g2 . FillRectangle ( Brushes . WhiteSmoke , 0 , 0 , 220 , 100 ) ;
g2 . DrawString ( Common . BinaryName , font , Brushes . Lime , 0 , 0 ) ;
b . Save ( "c:\\zzz.bmp" ) ;
string p = "" ;
Color c ;
int l = 0 ;
for ( int i = 0 ; i < b . Width ; i + + )
{
for ( int j = 0 ; j < b . Height ; j + + )
{
c = b . GetPixel ( i , j ) ;
if ( c . G > 0 )
{
p + = "{" + i + "," + j + "}," ;
l + + ;
}
}
p + = "\r\n" ;
}
//File.WriteAllText("c:\\zzz.txt", l + ":" + p, Encoding.Unicode);
b . Dispose ( ) ;
g2 . Dispose ( ) ;
}
#endif
}
}