private void OnClickSave(object sender, RoutedEventArgs e) { const double shrink = 10.0; var main = DisplayManager.GetDisplayFromPoint(0, 0); foreach (var obj in DisplayCanvas.Children) { if (!(obj is Canvas)) { continue; } var c = (Canvas)obj; if (!c.Background.Equals(new SolidColorBrush(Color.FromRgb(0, 100, 0)))) { continue; } if (int.TryParse(((TextBlock)c.Children[0]).Text, out var i)) { DisplayManager.Displays[i].Location = new System.Drawing.Point { X = (int)((Canvas.GetLeft(c) + (main.Screen.Width / shrink) / 2) * shrink), Y = (int)((Canvas.GetTop(c) + (main.Screen.Height / shrink) / 2) * shrink) }; } } NetworkCommunicator.SendAsync(new HarmonyPacket { Type = HarmonyPacket.PacketType.DisplayPacket, Pack = new HarmonyPacket.DisplayPacket { screens = DisplayManager.Displays } }); }
private void _updateDisplayCanvas() { if (!Model.IsServer) { return; } const double shrink = 10.0; DisplayCanvas.Children.Clear(); var displays = DisplayManager.Displays; var main = DisplayManager.GetDisplayFromPoint(0, 0); foreach (var dis in displays) { var canv = new Canvas() { Width = dis.Screen.Width / shrink, Height = dis.Screen.Height / shrink, MaxWidth = dis.Screen.Width / shrink, MaxHeight = dis.Screen.Height / shrink, Background = dis.OwnDisplay ? new SolidColorBrush(Color.FromRgb(0, 0, 150)) : new SolidColorBrush(Color.FromRgb(0, 100, 0)), Opacity = 100 }; var disNo = new TextBlock() { Width = canv.Width, Height = 25, Text = displays.IndexOf(dis).ToString(), FontSize = 14, TextAlignment = TextAlignment.Center }; var disSize = new TextBlock() { Width = canv.Width, Height = 25, Text = $"{dis.Screen.Width} x {dis.Screen.Height}", FontSize = 14, TextAlignment = TextAlignment.Center }; Canvas.SetLeft(disNo, canv.Width / 2 - disNo.Width / 2); Canvas.SetTop(disNo, canv.Height / 2 - 10 - disNo.Height / 2); Canvas.SetLeft(disSize, canv.Width / 2 - disSize.Width / 2); Canvas.SetTop(disSize, canv.Height / 2 + 10 - disSize.Height / 2); canv.Children.Add(disNo); canv.Children.Add(disSize); Canvas.SetLeft(canv, dis.Location.X / shrink - (main.Screen.Width / shrink) / 2); Canvas.SetTop(canv, dis.Location.Y / shrink - (main.Screen.Height / shrink) / 2); if (Model.IsServer && !dis.OwnDisplay) { canv.MouseLeftButtonDown += (s, eArgs) => { MoveAllScreens((Canvas)s, eArgs.GetPosition(DisplayCanvas), false); }; canv.MouseLeftButtonUp += (s, eArgs) => { var c = (Canvas)s; bool changed; do { changed = false; foreach (var obj in DisplayCanvas.Children) { if (!(obj is Canvas)) { continue; } var o = (Canvas)obj; if (o.Background.Equals(c.Background)) { continue; } var xOverlap = Math.Round(Math.Max(0, Math.Min(Canvas.GetLeft(c) + c.Width, Canvas.GetLeft(o) + o.Width) - Math.Max(Canvas.GetLeft(c), Canvas.GetLeft(o)))); var yOverlap = Math.Round(Math.Max(0, Math.Min(Canvas.GetTop(c) + c.Height, Canvas.GetTop(o) + o.Height) - Math.Max(Canvas.GetTop(c), Canvas.GetTop(o)))); if (xOverlap == 0 || yOverlap == 0) { continue; } changed = true; MoveAllScreens(c, xOverlap < yOverlap ? new Point(-xOverlap, 0) : new Point(0, -yOverlap), true); //break; } System.Windows.Forms.Application.DoEvents(); } while (changed); }; canv.MouseMove += (s, eArgs) => { var c = (Canvas)s; if (eArgs.LeftButton != System.Windows.Input.MouseButtonState.Pressed) { return; } MoveAllScreens(c, Point.Add(eArgs.GetPosition(DisplayCanvas), new Vector(-c.Width / 2, -c.Height / 2)), false); }; } DisplayCanvas.Children.Add(canv); } }
private static void ServerClientHandler(object obj) { if (!_connections.TryGetValue((EndPoint)obj, out var client)) { return; } MainWindow.Log($"Connected to {obj} as Server!", false); var stream = client.GetStream(); { var saltPacket = HarmonyPacket.Encode(new HarmonyPacket() { Type = HarmonyPacket.PacketType.SaltPacket, Pack = _salt }); stream.Write(saltPacket, 0, saltPacket.Length); stream.Flush(); MainWindow.Log("Send Salt-Packet!", false); } var keyMap = new Dictionary <Keys, bool>(); foreach (Keys key in Enum.GetValues(typeof(Keys))) { keyMap[key] = false; } { var displayPacket = HarmonyPacket.ReadPacket(stream); if (displayPacket.Type != HarmonyPacket.PacketType.DisplayPacket) { MainWindow.Log( $"Received unexpected Packet-Type! Expected: {HarmonyPacket.PacketType.SaltPacket}; Actual: {displayPacket.Type}", true); client.Close(); _ = _connections.TryRemove((EndPoint)obj, out _); return; } foreach (var d in ((HarmonyPacket.DisplayPacket)displayPacket.Pack).screens) { if (d.Screen.Location.X == 0 && d.Screen.Location.Y == 0) { DisplayManager.SlaveMain = d; } d.OwnDisplay = false; DisplayManager.AddRight(d); } } { var returnPacket = HarmonyPacket.Encode(new HarmonyPacket { Type = HarmonyPacket.PacketType.DisplayPacket, Pack = new HarmonyPacket.DisplayPacket { screens = DisplayManager.Displays } }); stream.Write(returnPacket, 0, returnPacket.Length); stream.Flush(); MainWindow.Log($"Finished Handshake with Client {obj}!", false); } var receive = new Thread(ServerReceive); receive.Start(obj); _threads.Add(receive); var mouseX = 0; var mouseY = 0; while (stream.CanWrite) { var hp = _toSend.Take(); if (hp.Type == HarmonyPacket.PacketType.MouseMovePacket) { var mp = (HarmonyPacket.MouseMovePacket)hp.Pack; if (OnSlave == 0) { var onScreen = DisplayManager.GetDisplayFromPoint(mp.PosX, mp.PosY); if (onScreen == null) { continue; } mouseX = mp.PosX; mouseY = mp.PosY; if (onScreen.OwnDisplay) { continue; } OnSlave = 1; } else { var pos = NativeMethods.GetCursorPosition(); mouseX += mp.PosX - pos.X; mouseY += mp.PosY - pos.Y; var onScreen = DisplayManager.GetDisplayFromPoint(mouseX, mouseY); if (onScreen == null) { mouseX -= mp.PosX - pos.X; mouseY -= mp.PosY - pos.Y; continue; } if (onScreen.OwnDisplay) { NativeMethods.SetCursorPos(mouseX, mouseY); OnSlave = 0; } mp.PosX = mouseX; mp.PosY = mouseY; } } if (OnSlave == 0 && hp.Type != HarmonyPacket.PacketType.DisplayPacket) { continue; } var packet = HarmonyPacket.Encode(hp); stream.Write(packet, 0, packet.Length); stream.Flush(); } }