+2006-03-21 Peter Dennis Bartok <pbartok@novell.com>
+
+ * XplatUI.cs, XplatUIDriver.cs, XplatUIX11.cs, XplatUIWin32.cs,
+ XplatUIOSX.cs:
+ - Added ResetMouseHover method to allow controls to retrigger
+ hovering if they need it more than once
+ - Implemented MouseHoverTime and MouseHoverSize properties
+ * Timer.cs: Start() must reset the interval
+ * SystemInformation.cs: Added 2.0 MouseHoverTime and MouseHoverSize
+ properties
+
2006-03-21 Jackson Harper <jackson@ximian.com>
* X11Keyboard.cs: improved layout detection. Move the nonchar
}
}
+#if NET_2_0
+ public static Size MouseHoverSize {
+ get {
+ return XplatUI.MouseHoverSize;
+ }
+ }
+
+ public static int MouseHoverTime {
+ get {
+ return XplatUI.MouseHoverTime;
+ }
+ }
+#endif
+
public static bool MousePresent {
get {
return true;
if (value != enabled) {
enabled = value;
if (value) {
+ // Use AddTicks so we get some rounding
+ expires = DateTime.Now.AddMilliseconds (interval > Minimum ? interval : Minimum);
XplatUI.SetTimer (this);
} else {
XplatUI.KillTimer (this);
#region Constructor & Destructor
static XplatUI() {
- Console.WriteLine("Mono System.Windows.Forms Assembly [Revision: 57713; built: 2006/03/09 03:26:24]");
+ Console.WriteLine("Mono System.Windows.Forms Assembly [$auto_build_revision$]");
- // Don't forget to throw the mac in here somewhere, too
default_class_name="SWFClass";
// check for Unix platforms - see FAQ for more details
}
}
+ static public Size MouseHoverSize {
+ get {
+ return driver.MouseHoverSize;
+ }
+ }
+
+ static public int MouseHoverTime {
+ get {
+ return driver.MouseHoverTime;
+ }
+ }
+
static public bool MouseWheelPresent {
get {
return driver.MouseWheelPresent;
driver.RequestNCRecalc(handle);
}
+ internal static void ResetMouseHover(IntPtr handle) {
+ #if DriverDebug
+ Console.WriteLine("ResetMouseHover({0}): Called", Window(handle));
+ #endif
+ driver.ResetMouseHover(handle);
+ }
+
internal static void ScreenToClient(IntPtr handle, ref int x, ref int y) {
#if DriverDebug
Console.WriteLine("ScreenToClient({0}, {1}, {2}): Called", Window(handle), x, y);
}
}
+ internal virtual Size MouseHoverSize {
+ get {
+ return new Size (1, 1);
+ }
+ }
+
+ internal virtual int MouseHoverTime {
+ get {
+ return 500;
+ }
+ }
+
internal virtual Point MousePosition {
get {
return Point.Empty;
internal abstract void EndLoop(Thread thread);
internal abstract void RequestNCRecalc(IntPtr hwnd);
+ internal abstract void ResetMouseHover(IntPtr hwnd);
// System information
internal abstract int KeyboardSpeed { get; }
throw new NotImplementedException();
}
+ [MonoTODO]
+ internal override void ResetMouseHover(IntPtr handle) {
+ throw new NotImplementedException();
+ }
+
internal override void ScreenToClient(IntPtr handle, ref int x, ref int y) {
CGPoint pt = new CGPoint ();
Rect wBounds = new Rect ();
}
internal enum SPIAction {
- SPI_GETWORKAREA = 0x0030
+ SPI_GETWORKAREA = 0x0030,
+ SPI_GETMOUSEHOVERWIDTH = 0x0062,
+ SPI_GETMOUSEHOVERHEIGHT = 0x0064,
+ SPI_GETMOUSEHOVERTIME = 0x0066,
}
internal enum WindowPlacementFlags {
}
}
+ internal override Size MouseHoverSize {
+ get {
+ int width = 4;
+ int height = 4;
+
+ Win32SystemParametersInfo(SPIAction.SPI_GETMOUSEHOVERWIDTH, 0, ref width, 0);
+ Win32SystemParametersInfo(SPIAction.SPI_GETMOUSEHOVERWIDTH, 0, ref height, 0);
+ return new Size(width, height);
+ }
+ }
+
+ internal override int MouseHoverTime {
+ get {
+ int time = 500;
+
+ Win32SystemParametersInfo(SPIAction.SPI_GETMOUSEHOVERTIME, 0, ref time, 0);
+ return time;
+ }
+ }
+
+
internal override bool DropTarget {
get {
return false;
Win32SetWindowPos(handle, IntPtr.Zero, 0, 0, 0, 0, SetWindowPosFlags.SWP_FRAMECHANGED | SetWindowPosFlags.SWP_NOOWNERZORDER | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOMOVE);
}
+ internal override void ResetMouseHover(IntPtr handle) {
+ TRACKMOUSEEVENT tme;
+
+ tme = new TRACKMOUSEEVENT();
+ tme.size = Marshal.SizeOf(tme);
+ tme.hWnd = handle;
+ tme.dwFlags = TMEFlags.TME_LEAVE | TMEFlags.TME_HOVER;
+ Win32TrackMouseEvent(ref tme);
+ }
+
+
internal override bool GetMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax) {
return GetMessage(ref msg, hWnd, wFilterMin, wFilterMax, true);
}
[DllImport ("user32.dll", EntryPoint="SystemParametersInfoW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
private extern static bool Win32SystemParametersInfo(SPIAction uiAction, uint uiParam, ref RECT rect, uint fWinIni);
+ [DllImport ("user32.dll", EntryPoint="SystemParametersInfoW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
+ private extern static bool Win32SystemParametersInfo(SPIAction uiAction, uint uiParam, ref uint value, uint fWinIni);
+
+ [DllImport ("user32.dll", EntryPoint="SystemParametersInfoW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
+ private extern static bool Win32SystemParametersInfo(SPIAction uiAction, uint uiParam, ref int value, uint fWinIni);
+
[DllImport ("user32.dll", EntryPoint="OpenClipboard", CallingConvention=CallingConvention.StdCall)]
private extern static bool Win32OpenClipboard(IntPtr hwnd);
HoverState.Timer = new Timer();
HoverState.Timer.Enabled = false;
HoverState.Timer.Interval = HoverState.Interval;
- HoverState.Timer.Tick +=new EventHandler(MouseHover);
+ HoverState.Timer.Tick += new EventHandler(MouseHover);
+ HoverState.Size = new Size(4, 4);
HoverState.X = -1;
HoverState.Y = -1;
#region Callbacks
private void MouseHover(object sender, EventArgs e) {
- if ((HoverState.X == MousePosition.X) && (HoverState.Y == MousePosition.Y)) {
- XEvent xevent;
+ XEvent xevent;
+ HoverState.Timer.Enabled = false;
- HoverState.Timer.Enabled = false;
-
- if (HoverState.Window != IntPtr.Zero) {
- xevent = new XEvent ();
+ if (HoverState.Window != IntPtr.Zero) {
+ xevent = new XEvent ();
- xevent.type = XEventName.ClientMessage;
- xevent.ClientMessageEvent.display = DisplayHandle;
- xevent.ClientMessageEvent.window = HoverState.Window;
- xevent.ClientMessageEvent.message_type = HoverState.Atom;
- xevent.ClientMessageEvent.format = 32;
- xevent.ClientMessageEvent.ptr1 = (IntPtr) (HoverState.Y << 16 | HoverState.X);
+ xevent.type = XEventName.ClientMessage;
+ xevent.ClientMessageEvent.display = DisplayHandle;
+ xevent.ClientMessageEvent.window = HoverState.Window;
+ xevent.ClientMessageEvent.message_type = HoverState.Atom;
+ xevent.ClientMessageEvent.format = 32;
+ xevent.ClientMessageEvent.ptr1 = (IntPtr) (HoverState.Y << 16 | HoverState.X);
- MessageQueue.EnqueueLocked (xevent);
+ MessageQueue.EnqueueLocked (xevent);
- WakeupMain ();
- }
+ WakeupMain ();
}
}
}
}
+ internal override Size MouseHoverSize {
+ get {
+ return new Size (1, 1);
+ }
+ }
+
+ internal override int MouseHoverTime {
+ get {
+ return HoverState.Interval;
+ }
+ }
+
+
+
internal override bool MouseWheelPresent {
get {
return true; // FIXME - how to detect?
msg.lParam = (IntPtr)(MousePosition.Y << 16 | MousePosition.X);
}
- HoverState.X = MousePosition.X = xevent.MotionEvent.x;
- HoverState.Y = MousePosition.Y = xevent.MotionEvent.y;
+ MousePosition.X = xevent.MotionEvent.x;
+ MousePosition.Y = xevent.MotionEvent.y;
+
+ if ((HoverState.Timer.Enabled) &&
+ (((MousePosition.X + HoverState.Size.Width) < HoverState.X) ||
+ ((MousePosition.X - HoverState.Size.Width) > HoverState.X) ||
+ ((MousePosition.Y + HoverState.Size.Height) < HoverState.Y) ||
+ ((MousePosition.Y - HoverState.Size.Height) > HoverState.Y))) {
+ HoverState.Timer.Stop();
+ HoverState.Timer.Start();
+ HoverState.X = MousePosition.X;
+ HoverState.Y = MousePosition.Y;
+ }
break;
} else {
goto ProcessNextMessage;
}
msg.message = Msg.WM_MOUSE_ENTER;
+ HoverState.X = xevent.CrossingEvent.x;
+ HoverState.Y = xevent.CrossingEvent.y;
HoverState.Timer.Enabled = true;
HoverState.Window = xevent.CrossingEvent.window;
break;
InvalidateWholeWindow(handle);
}
+ internal override void ResetMouseHover(IntPtr handle) {
+ Hwnd hwnd;
+
+ hwnd = Hwnd.ObjectFromHandle(handle);
+ if (hwnd == null) {
+ return;
+ }
+
+ HoverState.Timer.Enabled = true;
+ HoverState.X = MousePosition.X;
+ HoverState.Y = MousePosition.Y;
+ HoverState.Window = handle;
+ }
+
+
internal override void ScreenToClient(IntPtr handle, ref int x, ref int y) {
int dest_x_return;
int dest_y_return;