private void AdjustPointer(object sender, ZoneChangeEventArgs args) { if (args.NewZone.Dpi - args.OldZone.Dpi < 1) { return; } if (args.NewZone.Dpi > 110) { LbmMouse.SetCursorAero(args.NewZone.Dpi > 138 ? 3 : 2); } else { LbmMouse.SetCursorAero(1); } }
private void OnMouseMoveExt(object sender, MouseEventExtArgs e) { // If first time called just save that point if (_oldPoint == null) { _oldPoint = new Point(e.X, e.Y); return; } if (e.Clicked) { return; } Screen oldScreen = Config.ScreenFromPixel(_oldPoint.Value); Point pIn = new Point(e.X, e.Y); // No move if (pIn.Equals(_oldPoint)) { return; } //Debug.Print(pIn.X + " , " + pIn.Y + " -> " + pIn.TargetScreen?.Monitor.Adapter.DeviceName); // no screen change if (oldScreen == null || Equals(Config.ScreenFromPixel(pIn), oldScreen)) { _oldPoint = pIn; return; } Point oldpInMm = oldScreen.InMm.GetPoint(oldScreen.InPixel, _oldPoint.Value); Point pInMm = oldScreen.InMm.GetPoint(oldScreen.InPixel, pIn); Screen screenOut = null; //Config.ScreenFromMmPosition(pInMm);// pIn.Mm.TargetScreen; Debug.Print(oldScreen?.Monitor.Adapter.DeviceName + "P:" + _oldPoint + " --> P:" + pIn + " " + screenOut?.Monitor.Adapter.DeviceName); Point pOut = pIn; // // Allow Corner Jump // if (screenOut == null) { double dist = double.PositiveInfinity;// (100.0); Segment seg = new Segment(oldpInMm, pInMm); // Calculate side to enter screen when corner crossing not allowed. Side side = seg.IntersectSide(oldScreen.InMm.Bounds); if (Config.AllowCornerCrossing) { foreach (var screen in Config.AllBut(oldScreen)) { foreach (Point p in seg.Line.Intersect(screen.InMm.Bounds)) { var travel = new Segment(oldpInMm, p); if (!travel.Rect.Contains(pInMm)) { continue; } if (travel.Size > dist) { continue; } dist = travel.Size; pOut = screen.InPixel.GetPoint(screen.InMm, p); // (new PhysicalPoint(Config, screen, p.X, p.Y)).Pixel.Inside; pOut = screen.InPixel.Inside(pOut); screenOut = screen; } } } else { foreach (var screen in Config.AllBut(oldScreen)) { Vector offset = new Vector(0, 0); switch (side) { case Side.None: break; case Side.Bottom: offset.Y = seg.Rect.Height + screen.InMm.Y - (oldScreen.InMm.Y + oldScreen.InMm.Height); if (offset.Y < 0) { offset.Y = 0; } break; case Side.Top: offset.Y = -seg.Rect.Height + (screen.InMm.Y + screen.InMm.Height) - oldScreen.InMm.Y; if (offset.Y > 0) { offset.Y = 0; } break; case Side.Right: offset.X = seg.Rect.Width + screen.InMm.X - (oldScreen.InMm.X + oldScreen.InMm.Width); if (offset.X < 0) { offset.X = 0; } break; case Side.Left: offset.X = -seg.Rect.Width + (screen.InMm.X + screen.InMm.Width) - oldScreen.InMm.X; if (offset.X > 0) { offset.X = 0; } break; default: throw new ArgumentOutOfRangeException(); } Debug.Print(screen.Monitor.Adapter.DeviceName + " = " + offset.Length); if (offset.Length > 0 && offset.Length < dist) { Point shiftedPoint = pInMm + offset; if (Equals(Config.ScreenFromMmPosition(shiftedPoint), screen)) { dist = offset.Length; pOut = screen.InPixel.GetPoint(screen.InMm, shiftedPoint); pOut = screen.InPixel.Inside(pOut); screenOut = screen; } else { } } } } } // if new position is not within another screen if (screenOut == null) { Debug.Print("Out"); LbmMouse.CursorPos = _oldPoint.Value;//TODO : .Inside.Point; e.Handled = true; return; } // Actual mouving mouse to new location LbmMouse.CursorPos = pOut;//.Mm.ToScreen(screenOut).Pixel.Inside.Point; Debug.Print(">" + pOut.X + "," + pOut.Y); Debug.Print(">" + LbmMouse.CursorPos.X + "," + LbmMouse.CursorPos.Y); // Adjust pointer size to dpi ratio : should not be usefull if windows screen ratio is used if (Config.AdjustPointer) { if (screenOut.RealDpiAvg > 110) { LbmMouse.SetCursorAero(screenOut.RealDpiAvg > 138 ? 3 : 2); } else { LbmMouse.SetCursorAero(1); } } // Adjust pointer speed to dpi ratio : should not be usefull if windows screen ratio is used if (Config.AdjustSpeed) { LbmMouse.MouseSpeed = Math.Round((5.0 / 96.0) * screenOut.RealDpiAvg, 0); } if (Config.HomeCinema) { oldScreen.Monitor.Vcp().Power = false; } screenOut.Monitor.Vcp().Power = true; _oldPoint = pOut; e.Handled = true; }