private async void OnControlRelinquished(object sender, ClientConnectionChangedEventArgs e) { await EnsureInitialized(); await mutableStateLock.WaitAsync(); string desktopName = e.DesktopName.NormalizeDesktopName(); if (localState is LocalState.Controlled controlled) { HashSet <string> by = new HashSet <string>(controlled.By); by.Remove(desktopName); if (by.Count == 0) { DebugMessage("no controllers left, becoming relinquished"); localState = new LocalState.Relinquished(); DebugMessage("blocking local input"); inputManager.BlockInput(true); } else { DebugMessage("controllers remaining, not relinquished"); localState = new LocalState.Controlled(by); } } mutableStateLock.Release(); }
public async Task Initialize() { await inputManager.StartAsync(); localCursorPosition = await inputManager.MouseListener.GetCursorPosition(); await mutableStateLock.WaitAsync(); selfDesktop = new Desktop() { Name = selfName, Displays = inputManager.DisplayAdapter.GetDisplays(), PrimaryDisplay = inputManager.DisplayAdapter.GetPrimaryDisplay() }; mouseDeltaDebounceValueX = selfDesktop.PrimaryDisplay.Value.Width / 3; mouseDeltaDebounceValueY = selfDesktop.PrimaryDisplay.Value.Height / 3; desktops = new List <Desktop>() { selfDesktop }; displayLayout = new DisplayLayout(desktops); var(_, display) = displayLayout.FindPoint(TranslateLocalToGlobal(localCursorPosition)) !.Value; localState = new LocalState.Uncontrolled(display, selfDesktop.PrimaryDisplay.Value); mutableStateLock.Release(); initialized.TrySetResult(null); }
private async void OnControlAssumed(object sender, ClientConnectionChangedEventArgs e) { await EnsureInitialized(); await mutableStateLock.WaitAsync(); string desktopName = e.DesktopName.NormalizeDesktopName(); if (localState is LocalState.Controlling controlling) { var client = await workspaceNetwork.GetClientDesktop(controlling.ActiveDesktop.Name); if (client != null) { DebugMessage($"controlling {controlling.ActiveDesktop.Name}, relinquishing"); await client.RelinquishControl(); } } HashSet <string> by; if (localState is LocalState.Controlled controlled) { by = new HashSet <string>(controlled.By); } else { by = new HashSet <string>(); } DebugMessage($"adding {desktopName} to controlled by"); by.Add(desktopName); localState = new LocalState.Controlled(by); DebugMessage("unblocking local input"); inputManager.BlockInput(false); mutableStateLock.Release(); }