2006-05-15 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / XplatUI.cs
index 2170e470139c0b618027c12e17d844cbc9e3a1a5..137d9f12d2b7b28a49146d9816a745ea367d5b35 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (c) 2004 Novell, Inc.
+// Copyright (c) 2004-2006 Novell, Inc.
 //
 // Authors:
 //     Peter Bartok    pbartok@novell.com
 
-
 // NOT COMPLETE
 
+// define to log API calls to stdout
+#undef DriverDebug
+#undef DriverDebugPaint
+#undef DriverDebugCreate
+#undef DriverDebugDestroy
+#undef DriverDebugState
+
 using System;
 using System.Drawing;
 using System.ComponentModel;
 using System.Collections;
 using System.Diagnostics;
 using System.Runtime.InteropServices;
+using System.Threading;
 
-//
-// Random architecture notes
-// We need
-// * windows
-//   - create
-//   - set location/size
-//   - define cursor
-//   - destroy
-//   - reparent?
-//   - show/hide
-// * Keyboard
-// * Mouse
-//
-
-/// X11 Version
 namespace System.Windows.Forms {
        internal class XplatUI {
                #region Local Variables
@@ -54,8 +46,13 @@ namespace System.Windows.Forms {
                static String                   default_class_name;
                #endregion      // Local Variables
 
-               #region Subclasses
+               #region Private Methods
+               internal static string Window(IntPtr handle) {
+                       return String.Format("'{0}' ({1:X})", Control.FromHandle(handle), handle.ToInt32());
+               }
+               #endregion      // Private Methods
 
+               #region Subclasses
                public class State {
                        static public Keys ModifierKeys {
                                get {
@@ -75,24 +72,19 @@ namespace System.Windows.Forms {
                                }
                        }
 
-                       static public bool DropTarget {
-                               get {
-                                       return driver.DropTarget;
-                               }
-
-                               set {
-                                       driver.DropTarget=value;
-                               }
-                       }
                }
                #endregion      // Subclasses
 
                #region Constructor & Destructor
                static XplatUI() {
-                       // Don't forget to throw the mac in here somewhere, too
+                       Console.WriteLine("Mono System.Windows.Forms Assembly [$auto_build_revision$]");
+
                        default_class_name="SWFClass";
 
-                       if (Environment.OSVersion.Platform == (PlatformID)128) {
+                       // check for Unix platforms - see FAQ for more details
+                       // http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
+                       int platform = (int) Environment.OSVersion.Platform;
+                       if ((platform == 4) || (platform == 128)) {
                                if (Environment.GetEnvironmentVariable ("MONO_MWF_USE_QUARTZ_BACKEND") != null)
                                        driver=XplatUIOSX.GetInstance();
                                else
@@ -101,11 +93,10 @@ namespace System.Windows.Forms {
                                driver=XplatUIWin32.GetInstance();
                        }
 
-                       Console.WriteLine("#region #line XplatUI Constructor called");
-               }
+                       driver.InitializeDriver();
 
-               ~XplatUI() {
-                       Console.WriteLine("XplatUI Destructor called");
+                       // Initialize things that need to be done after the driver is ready
+                       DataFormats.GetFormat(0);
                }
                #endregion      // Constructor & Destructor
 
@@ -119,8 +110,159 @@ namespace System.Windows.Forms {
                                default_class_name=value;
                        }
                }
+
+               static public int CaptionHeight {
+                       get {
+                               return driver.Caption;
+                       }
+               }
+
+               static public Size CursorSize {
+                       get {
+                               return driver.CursorSize;
+                       }
+               }
+
+               static public bool DragFullWindows {
+                       get {
+                               return driver.DragFullWindows;
+                       }
+               }
+
+               static public Size DragSize {
+                       get {
+                               return driver.DragSize;
+                       }
+               }
+
+               public static Size FrameBorderSize {
+                       get {
+                               return driver.FrameBorderSize;
+                       }
+               }
+
+               static public int HorizontalScrollBarHeight {
+                       get {
+                               return driver.HorizontalScrollBarHeight;
+                       }
+               }
+
+               static public Size IconSize {
+                       get {
+                               return driver.IconSize;
+                       }
+               }
+
+               static public int KeyboardSpeed {
+                       get {
+                               return driver.KeyboardSpeed;
+                       }
+               }
+
+               static public int KeyboardDelay {
+                       get {
+                               return driver.KeyboardSpeed;
+                       }
+               }
+
+               static public Size MaxWindowTrackSize {
+                       get {
+                               return driver.MaxWindowTrackSize;
+                       }
+               }
+
+               static public Size MinimizedWindowSize {
+                       get {
+                               return driver.MinimizedWindowSize;
+                       }
+               }
+
+               static public Size MinimizedWindowSpacingSize {
+                       get {
+                               return driver.MinimizedWindowSpacingSize;
+                       }
+               }
+
+               static public Size MinimumWindowSize {
+                       get {
+                               return driver.MinimumWindowSize;
+                       }
+               }
+
+               static public Size MinWindowTrackSize {
+                       get {
+                               return driver.MinWindowTrackSize;
+                       }
+               }
+
+               static public Size SmallIconSize {
+                       get {
+                               return driver.SmallIconSize;
+                       }
+               }
+
+               static public int MenuHeight {
+                       get {
+                               return driver.MenuHeight;
+                       }
+               }
+
+               static public int MouseButtonCount {
+                       get {
+                               return driver.MouseButtonCount;
+                       }
+               }
+
+               static public bool MouseButtonsSwapped {
+                       get {
+                               return driver.MouseButtonsSwapped;
+                       }
+               }
+
+               static public Size MouseHoverSize {
+                       get {
+                               return driver.MouseHoverSize;
+                       }
+               }
+
+               static public int MouseHoverTime {
+                       get {
+                               return driver.MouseHoverTime;
+                       }
+               }
+
+               static public bool MouseWheelPresent {
+                       get {
+                               return driver.MouseWheelPresent;
+                       }
+               }
+
+               static public bool UserClipWontExposeParent {
+                       get {
+                               return driver.UserClipWontExposeParent;
+                       }
+               }
+
+               static public int VerticalScrollBarWidth {
+                       get {
+                               return driver.VerticalScrollBarWidth;
+                       }
+               }
+
+               static public Rectangle VirtualScreen {
+                       get {
+                               return driver.VirtualScreen;
+                       }
+               }
+
+               static public Rectangle WorkingArea {
+                       get {
+                               return driver.WorkingArea;
+                       }
+               }
                #endregion      // Public Static Properties
 
+               #region Events
                 internal static event EventHandler Idle {
                         add {
                                 driver.Idle += value;
@@ -130,226 +272,664 @@ namespace System.Windows.Forms {
                         }
                 }
                 
+               #endregion      // Events
+
                #region Public Static Methods
-               internal static void Exit() {
-                       driver.Exit();
+               internal static void Activate(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("Activate({0}): Called", Window(handle));
+                       #endif
+                       driver.Activate(handle);
                }
 
-               internal static void GetDisplaySize(out Size size) {
-                       driver.GetDisplaySize(out size);
+               internal static void AudibleAlert() {
+                       #if DriverDebug
+                               Console.WriteLine("AudibleAlert(): Called");
+                       #endif
+                       driver.AudibleAlert();
                }
 
-               internal static void EnableThemes() {
-                       driver.EnableThemes();
+               internal static bool CalculateWindowRect(ref Rectangle ClientRect, int Style, int ExStyle, Menu menu, out Rectangle WindowRect) {
+                       #if DriverDebug
+                               Console.WriteLine("CalculateWindowRect({0}, {1}, {2}, {3}): Called", ClientRect, Style, ExStyle, menu);
+                       #endif
+                       return driver.CalculateWindowRect(ref ClientRect, Style, ExStyle, menu, out WindowRect);
                }
 
-               internal static bool Text(IntPtr hWnd, string text) {
-                       return driver.Text(hWnd, text);
+               internal static void CaretVisible(IntPtr handle, bool visible) {
+                       #if DriverDebug
+                               Console.WriteLine("CaretVisible({0:X}, {1}): Called", handle.ToInt32(), visible);
+                       #endif
+                       driver.CaretVisible(handle, visible);
                }
 
-               internal static bool GetText(IntPtr hWnd, out string text) {
-                       return driver.GetText(hWnd, out text);
+               internal static void CreateCaret(IntPtr handle, int width, int height) {
+                       #if DriverDebug
+                               Console.WriteLine("CreateCaret({0:X}), {1}, {2}: Called", handle.ToInt32(), width, height);
+                       #endif
+                       driver.CreateCaret(handle, width, height);
                }
 
-               internal static bool SetVisible(IntPtr hWnd, bool visible) {
-                       return driver.SetVisible(hWnd, visible);
+               internal static IntPtr CreateWindow(CreateParams cp) {
+                       #if DriverDebug || DriverDebugCreate
+                               IntPtr handle;
+
+                               handle = driver.CreateWindow(cp);
+
+                               Console.WriteLine("CreateWindow(): Called, returning {0:X}", handle.ToInt32());
+                               return handle;
+                       #else
+                               return driver.CreateWindow(cp);
+                       #endif
                }
 
-               internal static bool IsVisible(IntPtr hWnd) {
-                       return driver.IsVisible(hWnd);
+               internal static IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height) {
+                       #if DriverDebug || DriverDebugCreate
+                               Console.WriteLine("CreateWindow(): Called");
+                       #endif
+                       return driver.CreateWindow(Parent, X, Y, Width, Height);
                }
 
-               internal static IntPtr SetParent(IntPtr hWnd, IntPtr hParent) {
-                       return driver.SetParent(hWnd, hParent);
+               internal static void ClientToScreen(IntPtr handle, ref int x, ref int y) {
+                       #if DriverDebug
+                               Console.WriteLine("ClientToScreen({0}, {1}, {2}): Called", Window(handle), x, y);
+                       #endif
+                       driver.ClientToScreen(handle, ref x, ref y);
                }
 
-               internal static IntPtr GetParent(IntPtr hWnd) {
-                       return driver.GetParent(hWnd);
+               internal static int[] ClipboardAvailableFormats(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("ClipboardAvailableTypes({0:X}): Called", handle.ToInt32());
+                       #endif
+                       return driver.ClipboardAvailableFormats(handle);
                }
 
-               internal static void Version() {
-                       Console.WriteLine("Xplat version $revision: $");
+               internal static void ClipboardClose(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("ClipboardClose({0:X}): Called", handle.ToInt32());
+                       #endif
+                       driver.ClipboardClose(handle);
                }
 
-               internal static IntPtr CreateWindow(CreateParams cp) {
-                       return driver.CreateWindow(cp);
+               internal static int ClipboardGetID(IntPtr handle, string format) {
+                       #if DriverDebug
+                               Console.WriteLine("ClipboardGetID({0:X}, {1}): Called", handle.ToInt32(), format);
+                       #endif
+                       return driver.ClipboardGetID(handle, format);
                }
 
-               internal static IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height) {
-                       return driver.CreateWindow(Parent, X, Y, Width, Height);
+               internal static IntPtr ClipboardOpen() {
+                       #if DriverDebug
+                               Console.WriteLine("ClipboardOpen(): Called");
+                       #endif
+                       return driver.ClipboardOpen();
                }
 
-               internal static void DestroyWindow(IntPtr handle) {
-                       driver.DestroyWindow(handle);
+               internal static void ClipboardStore(IntPtr handle, object obj, int type, XplatUI.ObjectToClipboard converter) {
+                       #if DriverDebug
+                               Console.WriteLine("ClipboardStore({0:X}, {1}, {2}): Called", handle.ToInt32(), obj, type, converter);
+                       #endif
+                       driver.ClipboardStore(handle, obj, type, converter);
                }
 
-               internal static void RefreshWindow(IntPtr handle) {
-                       driver.RefreshWindow(handle);
+               internal static object ClipboardRetrieve(IntPtr handle, int type, XplatUI.ClipboardToObject converter) {
+                       #if DriverDebug
+                               Console.WriteLine("ClipboardRetrieve({0:X}, type, {1}): Called", handle.ToInt32(), converter);
+                       #endif
+                       return driver.ClipboardRetrieve(handle, type, converter);
                }
 
-               internal static void SetWindowBackground(IntPtr handle, Color color) {
-                       driver.SetWindowBackground(handle, color);
+               internal static IntPtr DefineCursor(Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot) {
+                       #if DriverDebug
+                               Console.WriteLine("DefineCursor(...): Called");
+                       #endif
+                       return driver.DefineCursor(bitmap, mask, cursor_pixel, mask_pixel, xHotSpot, yHotSpot);
                }
-                       
-               internal static PaintEventArgs PaintEventStart(IntPtr handle) {
-                       return driver.PaintEventStart(handle);
+
+               internal static IntPtr DefineStdCursor(StdCursor id) {
+                       return driver.DefineStdCursor(id);
                }
 
-               internal static void PaintEventEnd(IntPtr handle) {
-                       driver.PaintEventEnd(handle);
+               internal static IntPtr DefWndProc(ref Message msg) {
+                       return driver.DefWndProc(ref msg);
                }
 
-               internal static void SetWindowPos(IntPtr handle, int x, int y, int width, int height) {
-                       driver.SetWindowPos(handle, x, y, width, height);
+               internal static void DestroyCaret(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("DestroyCaret({0:X}): Called", handle.ToInt32());
+                       #endif
+                       driver.DestroyCaret(handle);
                }
 
-               internal static void GetWindowPos(IntPtr handle, out int x, out int y, out int width, out int height, out int client_width, out int client_height) {
-                       driver.GetWindowPos(handle, out x, out y, out width, out height, out client_width, out client_height);
+               internal static void DestroyCursor(IntPtr cursor) {
+                       #if DriverDebug
+                               Console.WriteLine("DestroyCursor({0:X}): Called", cursor.ToInt32());
+                       #endif
+                       driver.DestroyCursor(cursor);
                }
 
-               internal static void Invalidate(IntPtr handle, Rectangle rc, bool clear) {
-                       driver.Invalidate(handle, rc, clear);
+               internal static void DestroyWindow(IntPtr handle) {
+                       #if DriverDebug || DriverDebugDestroy
+                               Console.WriteLine("DestroyWindow({0}): Called", Window(handle));
+                       #endif
+                       driver.DestroyWindow(handle);
                }
 
-               internal static void Activate(IntPtr handle) {
-                       driver.Activate(handle);
+               internal static IntPtr DispatchMessage(ref MSG msg) {
+                       return driver.DispatchMessage(ref msg);
+               }
+
+               internal static void DoEvents() {
+                       driver.DoEvents();
+               }
+
+               internal static void DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width) {
+                       #if DriverDebug
+                               Console.WriteLine("DrawReversibleRectangle({0}, {1}, {2}): Called", Window(handle), rect, line_width);
+                       #endif
+                       driver.DrawReversibleRectangle(handle, rect, line_width);
+               }
+
+               internal static void EnableThemes() {
+                       driver.EnableThemes();
                }
 
                internal static void EnableWindow(IntPtr handle, bool Enable) {
+                       #if DriverDebug || DriverDebugState
+                               Console.WriteLine("EnableWindow({0}, {1}): Called", Window(handle), Enable);
+                       #endif
                        driver.EnableWindow(handle, Enable);
                }
 
-               internal static void SetModal(IntPtr handle, bool Modal) {
-                       driver.SetModal(handle, Modal);
+               internal static void EndLoop(Thread thread) {
+                       #if DriverDebug
+                               Console.WriteLine("EndLoop({0:X}): Called", thread.GetHashCode());
+                       #endif
+                       driver.EndLoop(thread);
                }
 
-               internal static IntPtr DefWndProc(ref Message msg) {
-                       return driver.DefWndProc(ref msg);
+               internal static IntPtr GetActive() {
+                       #if DriverDebug
+                               Console.WriteLine("GetActive(): Called");
+                       #endif
+                       return driver.GetActive();
+               }
+
+               internal static SizeF GetAutoScaleSize(Font font) {
+                       #if DriverDebug
+                               Console.WriteLine("GetAutoScaleSize({0}): Called", font);
+                       #endif
+                       return driver.GetAutoScaleSize(font);
+               }
+
+               internal static Region GetClipRegion(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("GetClipRegion({0}): Called", Window(handle));
+                       #endif
+                       return driver.GetClipRegion(handle);
+               }
+
+               internal static void GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y) {
+                       #if DriverDebug
+                               Console.WriteLine("GetCursorInfo({0}): Called", cursor.ToInt32());
+                       #endif
+                       driver.GetCursorInfo(cursor, out width, out height, out hotspot_x, out hotspot_y);
+               }
+
+               internal static void GetCursorPos(IntPtr handle, out int x, out int y) {
+                       #if DriverDebug
+                               Console.WriteLine("GetCursorPos({0}): Called", Window(handle));
+                       #endif
+                       driver.GetCursorPos(handle, out x, out y);
+               }
+
+               internal static void GetDisplaySize(out Size size) {
+                       #if DriverDebug
+                               Console.WriteLine("GetDisplaySize(): Called");
+                       #endif
+                       driver.GetDisplaySize(out size);
+               }
+
+               internal static bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent) {
+                       #if DriverDebug
+                               Console.WriteLine("GetFontMetrics(): Called");
+                       #endif
+                       return driver.GetFontMetrics(g, font, out ascent, out descent);
+               }
+                       
+               internal static Point GetMenuOrigin(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("GetMenuOrigin({0}): Called", Window(handle));
+                       #endif
+                       return driver.GetMenuOrigin(handle);
+               }
+
+               internal static bool GetMessage(object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax) {
+                       return driver.GetMessage(queue_id, ref msg, hWnd, wFilterMin, wFilterMax);
+               }
+
+               internal static IntPtr GetParent(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("GetParent({0}): Called", Window(handle));
+                       #endif
+                       return driver.GetParent(handle);
+               }
+
+               internal static bool GetText(IntPtr handle, out string text) {
+                       #if DriverDebug
+                               Console.WriteLine("GetText({0}): Called", Window(handle));
+                       #endif
+                       return driver.GetText(handle, out text);
+               }
+
+               internal static void GetWindowPos(IntPtr handle, bool is_toplevel, out int x, out int y, out int width, out int height, out int client_width, out int client_height) {
+                       #if DriverDebug
+                               Console.WriteLine("GetWindowPos({0}): Called", Window(handle));
+                       #endif
+                       driver.GetWindowPos(handle, is_toplevel, out x, out y, out width, out height, out client_width, out client_height);
+               }
+
+               internal static FormWindowState GetWindowState(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("GetWindowState({0}): Called", Window(handle));
+                       #endif
+                       return driver.GetWindowState(handle);
+               }
+
+               internal static void GrabInfo(out IntPtr handle, out bool GrabConfined, out Rectangle GrabArea) {
+                       #if DriverDebug
+                               Console.WriteLine("GrabInfo(): Called");
+                       #endif
+                       driver.GrabInfo(out handle, out GrabConfined, out GrabArea);
+               }
+
+               internal static void GrabWindow(IntPtr handle, IntPtr ConfineToHwnd) {
+                       #if DriverDebug
+                               Console.WriteLine("GrabWindow({0}, {1}): Called", Window(handle), Window(ConfineToHwnd));
+                       #endif
+                       driver.GrabWindow(handle, ConfineToHwnd);
                }
 
                internal static void HandleException(Exception e) {
                        driver.HandleException(e);
                }
 
-               internal static void DoEvents() {
-                       driver.DoEvents();
+               internal static void Invalidate(IntPtr handle, Rectangle rc, bool clear) {
+                       #if DriverDebug
+                               Console.WriteLine("Invalidate({0}, {1}, {2}): Called", Window(handle), rc, clear);
+                       #endif
+                       driver.Invalidate(handle, rc, clear);
                }
 
-               internal static bool PeekMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags) {
-                       return driver.PeekMessage(ref msg, hWnd, wFilterMin, wFilterMax, flags);
+               internal static bool IsEnabled(IntPtr handle) {
+                       #if DriverDebug || DriverDebugState
+                               Console.WriteLine("IsEnabled({0}): Called, Result={1}", Window(handle), driver.IsEnabled(handle));
+                       #endif
+                       return driver.IsEnabled(handle);
                }
 
-               internal static bool GetMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax) {
-                       return driver.GetMessage(ref msg, hWnd, wFilterMin, wFilterMax);
+               internal static bool IsVisible(IntPtr handle) {
+                       #if DriverDebug || DriverDebugState
+                               Console.WriteLine("IsVisible({0}): Called, Result={1}", Window(handle), driver.IsVisible(handle));
+                       #endif
+                       return driver.IsVisible(handle);
                }
 
-               internal static bool TranslateMessage(ref MSG msg) {
-                       return driver.TranslateMessage(ref msg);
+               internal static void KillTimer (Timer timer)
+               {
+                       #if DriverDebug
+                               Console.WriteLine("KillTimer({0}): Called", timer);
+                       #endif
+                       driver.KillTimer (timer);
                }
 
-               internal static IntPtr DispatchMessage(ref MSG msg) {
-                       return driver.DispatchMessage(ref msg);
+               internal static void MenuToScreen(IntPtr handle, ref int x, ref int y) {
+                       #if DriverDebug
+                               Console.WriteLine("MenuToScreen({0}, {1}, {2}): Called", Window(handle), x, y);
+                       #endif
+                       driver.MenuToScreen(handle, ref x, ref y);
                }
 
-               internal static void GrabWindow(IntPtr hWnd, IntPtr ConfineToHwnd) {
-                       driver.GrabWindow(hWnd, ConfineToHwnd);
+               internal static void OverrideCursor(IntPtr cursor) {
+                       #if DriverDebug
+                               Console.WriteLine("OverrideCursor({0:X}): Called", cursor.ToInt32());
+                       #endif
+                       driver.OverrideCursor(cursor);
                }
 
-               internal static void GrabInfo(out IntPtr hWnd, out bool GrabConfined, out Rectangle GrabArea) {
-                       driver.GrabInfo(out hWnd, out GrabConfined, out GrabArea);
+               internal static void PaintEventEnd(IntPtr handle, bool client) {
+                       #if DriverDebug || DriverDebugPaint
+                               Console.WriteLine("PaintEventEnd({0}, {1}): Called from thread {2}", Window(handle), client, Thread.CurrentThread.GetHashCode());
+                       #endif
+                       driver.PaintEventEnd(handle, client);
                }
 
-               internal static void ReleaseWindow(IntPtr hWnd) {
-                       driver.ReleaseWindow(hWnd);
+               internal static PaintEventArgs PaintEventStart(IntPtr handle, bool client) {
+                       #if DriverDebug || DriverDebugPaint
+                               Console.WriteLine("PaintEventStart({0}, {1}): Called from thread {2}", Window(handle), client, Thread.CurrentThread.GetHashCode());
+                       #endif
+                       return driver.PaintEventStart(handle, client);
                }
 
-               internal static bool SetZOrder(IntPtr hWnd, IntPtr AfterhWnd, bool Top, bool Bottom) {
-                       return driver.SetZOrder(hWnd, AfterhWnd, Top, Bottom);
+               internal static bool PeekMessage(Object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags) {
+                       return driver.PeekMessage(queue_id, ref msg, hWnd, wFilterMin, wFilterMax, flags);
                }
 
-               internal static bool SetTopmost(IntPtr hWnd, IntPtr hWndOwner, bool Enabled) {
-                       return driver.SetTopmost(hWnd, hWndOwner, Enabled);
+               internal static bool PostMessage(IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam) {
+                       #if DriverDebug
+                               Console.WriteLine("PostMessage({0}, {1}, {2:X}, {3:X}): Called", Window(hwnd), message, wParam.ToInt32(), lParam.ToInt32());
+                       #endif
+                       return driver.PostMessage(hwnd, message, wParam, lParam);
                }
 
-               internal static bool CalculateWindowRect(IntPtr hWnd, ref Rectangle ClientRect, int Style, bool HasMenu, out Rectangle WindowRect) {
-                       return driver.CalculateWindowRect(hWnd, ref ClientRect, Style, HasMenu, out WindowRect);
+               internal static bool PostMessage(ref MSG msg) {
+                       #if DriverDebug
+                               Console.WriteLine("PostMessage({0}): Called", msg);
+                       #endif
+                       return driver.PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
                }
 
-               internal static void SetCursorPos(IntPtr handle, int x, int y) {
-                       driver.SetCursorPos(handle, x, y);
+               internal static void PostQuitMessage(int exitCode) {
+                       #if DriverDebug
+                               Console.WriteLine("PostQuitMessage({0}): Called", exitCode);
+                       #endif
+                       driver.PostQuitMessage(exitCode);
                }
 
-               internal static void GetCursorPos(IntPtr handle, out int x, out int y) {
-                       driver.GetCursorPos(handle, out x, out y);
+               internal static void RequestNCRecalc(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("RequestNCRecalc({0}): Called", Window(handle));
+                       #endif
+                       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);
+                       #endif
                        driver.ScreenToClient (handle, ref x, ref y);
                }
 
-               internal static void ClientToScreen(IntPtr handle, ref int x, ref int y) {
-                       driver.ClientToScreen(handle, ref x, ref y);
+               internal static void ScreenToMenu(IntPtr handle, ref int x, ref int y) {
+                       #if DriverDebug
+                               Console.WriteLine("ScreenToMenu({0}, {1}, {2}): Called", Window(handle), x, y);
+                       #endif
+                       driver.ScreenToMenu(handle, ref x, ref y);
+               }
+
+               internal static void ScrollWindow(IntPtr handle, Rectangle rectangle, int XAmount, int YAmount, bool with_children) {
+                       #if DriverDebug
+                               Console.WriteLine("ScrollWindow({0}, {1}, {2}, {3}, {4}): Called", Window(handle), rectangle, XAmount, YAmount, with_children);
+                       #endif
+                       driver.ScrollWindow(handle, rectangle, XAmount, YAmount, with_children);
+               }
+
+               internal static void ScrollWindow(IntPtr handle, int XAmount, int YAmount, bool with_children) {
+                       #if DriverDebug
+                               Console.WriteLine("ScrollWindow({0}, {2}, {3}, {4}): Called", Window(handle), XAmount, YAmount, with_children);
+                       #endif
+                       driver.ScrollWindow(handle, XAmount, YAmount, with_children);
                }
 
                internal static void SendAsyncMethod (AsyncMethodData data) {
+                       #if DriverDebug
+                               Console.WriteLine("SendAsyncMethod({0}): Called", data);
+                       #endif
                        driver.SendAsyncMethod (data);
                }
 
-               internal static void CreateCaret(IntPtr hwnd, int width, int height) {
-                       driver.CreateCaret(hwnd, width, height);
+               internal static IntPtr SendMessage (IntPtr handle, Msg message, IntPtr wParam, IntPtr lParam) {
+                       #if DriverDebug
+                               Console.WriteLine("SendMessage ({0}, {1}, {2:X}, {3:X}): Called", Window(handle), message, wParam.ToInt32(), lParam.ToInt32());
+                       #endif
+                       return driver.SendMessage (handle, message, wParam, lParam);
                }
 
-               internal static void DestroyCaret(IntPtr hwnd) {
-                       driver.DestroyCaret(hwnd);
+               internal static void SendMessage (ref Message m) {
+                       #if DriverDebug
+                               Console.WriteLine("SendMessage ({0}): Called", m);
+                       #endif
+                       m.Result = driver.SendMessage(m.HWnd, (Msg)m.Msg, m.WParam, m.LParam);
                }
 
-               internal static void SetCaretPos(IntPtr hwnd, int x, int y) {
-                       driver.SetCaretPos(hwnd, x, y);
+               internal static void SetAllowDrop (IntPtr handle, bool value)
+               {
+                       #if DriverDebug
+                       Console.WriteLine ("SetAllowDrop({0}, {1}): Called", handle, value);
+                       #endif
+                       driver.SetAllowDrop (handle, value);
                }
 
-               internal static void CaretVisible(IntPtr hwnd, bool visible) {
-                       driver.CaretVisible(hwnd, visible);
+               internal static void SetBorderStyle(IntPtr handle, FormBorderStyle border_style) {
+                       #if DriverDebug
+                               Console.WriteLine("SetBorderStyle({0}, {1}): Called", Window(handle), border_style);
+                       #endif
+                       driver.SetBorderStyle(handle, border_style);
                }
 
-               internal static void SetFocus(IntPtr hwnd) {
-                       driver.SetFocus(hwnd);
+               internal static void SetCaretPos(IntPtr handle, int x, int y) {
+                       #if DriverDebug
+                               Console.WriteLine("SetCaretPos({0}, {1}, {2}): Called", Window(handle), x, y);
+                       #endif
+                       driver.SetCaretPos(handle, x, y);
                }
 
-               internal static bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent) {
-                       return driver.GetFontMetrics(g, font, out ascent, out descent);
+               internal static void SetClipRegion(IntPtr handle, Region region) {
+                       #if DriverDebug
+                               Console.WriteLine("SetClipRegion({0}, {1}): Called", Window(handle), region);
+                       #endif
+                       driver.SetClipRegion(handle, region);
                }
-                       
+
+               internal static void SetCursor(IntPtr handle, IntPtr cursor) {
+                       #if DriverDebug
+                               Console.WriteLine("SetCursor({0}, {1:X}): Called", Window(handle), cursor.ToInt32());
+                       #endif
+                       driver.SetCursor(handle, cursor);
+               }
+
+               internal static void SetCursorPos(IntPtr handle, int x, int y) {
+                       #if DriverDebug
+                               Console.WriteLine("SetCursorPos({0}, {1}, {2}): Called", Window(handle), x, y);
+                       #endif
+                       driver.SetCursorPos(handle, x, y);
+               }
+
+               internal static void SetFocus(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("SetFocus({0}): Called", Window(handle));
+                       #endif
+                       driver.SetFocus(handle);
+               }
+
+               internal static void SetIcon(IntPtr handle, Icon icon) {
+                       #if DriverDebug
+                               Console.WriteLine("SetIcon({0}, {1}): Called", Window(handle), icon);
+                       #endif
+                       driver.SetIcon(handle, icon);
+               }
+
+               internal static void SetMenu(IntPtr handle, Menu menu) {
+                       #if DriverDebug
+                               Console.WriteLine("SetMenu({0}, {1}): Called", Window(handle), menu);
+                       #endif
+                       driver.SetMenu(handle, menu);
+               }
+
+               internal static void SetModal(IntPtr handle, bool Modal) {
+                       #if DriverDebug || DriverDebugState
+                               Console.WriteLine("SetModal({0}, {1}): Called", Window(handle), Modal);
+                       #endif
+                       driver.SetModal(handle, Modal);
+               }
+
+               internal static IntPtr SetParent(IntPtr handle, IntPtr hParent) {
+                       #if DriverDebug
+                               Console.WriteLine("SetParent({0}, {1:X}): Called", Window(handle), Window(hParent));
+                       #endif
+                       return driver.SetParent(handle, hParent);
+               }
+
                internal static void SetTimer (Timer timer)
                {
+                       #if DriverDebug
+                               Console.WriteLine("SetTimer({0}): Called", timer);
+                       #endif
                        driver.SetTimer (timer);
                }
 
-               internal static void KillTimer (Timer timer)
+               internal static bool SetTopmost(IntPtr handle, IntPtr hWndOwner, bool Enabled) {
+                       #if DriverDebug
+                               Console.WriteLine("SetTopMost({0}, {1}, {2}): Called", Window(handle), Window(hWndOwner), Enabled);
+                       #endif
+                       return driver.SetTopmost(handle, hWndOwner, Enabled);
+               }
+
+               internal static bool SetVisible(IntPtr handle, bool visible) {
+                       #if DriverDebug || DriverDebugState
+                               Console.WriteLine("SetVisible({0}, {1}): Called", Window(handle), visible);
+                       #endif
+                       return driver.SetVisible(handle, visible);
+               }
+
+               internal static void SetWindowMinMax(IntPtr handle, Rectangle maximized, Size min, Size max) {
+                       #if DriverDebug || DriverDebugState
+                               Console.WriteLine("SetWindowMinMax({0}, {1}, {2}, {3}): Called", Window(handle), maximized, min, max);
+                       #endif
+                       driver.SetWindowMinMax(handle, maximized, min, max);
+               }
+
+               internal static void SetWindowPos(IntPtr handle, int x, int y, int width, int height) {
+                       #if DriverDebug
+                               Console.WriteLine("SetWindowPos({0}, {1}, {2}, {3}, {4}): Called", Window(handle), x, y, width, height);
+                       #endif
+                       driver.SetWindowPos(handle, x, y, width, height);
+               }
+
+               internal static void SetWindowState(IntPtr handle, FormWindowState state) {
+                       #if DriverDebug || DriverDebugState
+                               Console.WriteLine("SetWindowState({0} {1}): Called", Window(handle), state);
+                       #endif
+                       driver.SetWindowState(handle, state);
+               }
+
+               internal static void SetWindowStyle(IntPtr handle, CreateParams cp) {
+                       #if DriverDebug
+                               Console.WriteLine("SetWindowStyle({0}): Called", Window(handle));
+                       #endif
+                       driver.SetWindowStyle(handle, cp);
+               }
+
+               internal static void SetWindowTransparency(IntPtr handle, double transparency, Color key) 
                {
-                       driver.KillTimer (timer);
+                       #if DriverDebug
+                               Console.WriteLine("SetWindowTransparency({0}): Called", Window(handle));
+                       #endif
+                       driver.SetWindowTransparency(handle, transparency, key);
                }
 
-               internal static int KeyboardSpeed {
-                       get {
-                               return driver.KeyboardSpeed;
-                       }
+               internal static bool SetZOrder(IntPtr handle, IntPtr AfterhWnd, bool Top, bool Bottom) {
+                       #if DriverDebug
+                               Console.WriteLine("SetZOrder({0}, {1:X}, {2}, {3}): Called", Window(handle), Window(AfterhWnd), Top, Bottom);
+                       #endif
+                       return driver.SetZOrder(handle, AfterhWnd, Top, Bottom);
                }
 
-               internal static int KeyboardDelay {
-                       get {
-                               return driver.KeyboardSpeed;
-                       }
+               internal static void ShowCursor(bool show) {
+                       #if DriverDebug
+                               Console.WriteLine("ShowCursor({0}): Called", show);
+                       #endif
+                       driver.ShowCursor(show);
+               }
+
+               internal static DragDropEffects StartDrag(IntPtr handle, object data, DragDropEffects allowedEffects) {
+                       #if DriverDebug
+                       Console.WriteLine ("StartDrag({0}, {1}, {2}): Called", Window(handle), data, allowedEffects);
+                       #endif
+                       return driver.StartDrag (handle, data, allowedEffects);
+               }
+
+               internal static object StartLoop(Thread thread) {
+                       #if DriverDebug
+                               Console.WriteLine("StartLoop({0:X}): Called", thread.GetHashCode());
+                       #endif
+                       return driver.StartLoop(thread);
+               }
+
+               internal static bool SupportsTransparency() {
+                       #if DriverDebug
+                               Console.WriteLine("SupportsTransparency(): Called, result={1}", driver.SupportsTransparency());
+                       #endif
+                       return driver.SupportsTransparency();
+               }
+
+               internal static bool SystrayAdd(IntPtr handle, string tip, Icon icon, out ToolTip tt) {
+                       #if DriverDebug
+                               Console.WriteLine("SystrayAdd({0}, {1}): Called", Window(handle), tip);
+                       #endif
+                       return driver.SystrayAdd(handle, tip, icon, out tt);
+               }
+
+               internal static void SystrayChange(IntPtr handle, string tip, Icon icon, ref ToolTip tt) {
+                       #if DriverDebug
+                               Console.WriteLine("SystrayChange({0}, {1}): Called", Window(handle), tip);
+                       #endif
+                       driver.SystrayChange(handle, tip, icon, ref tt);
+               }
+
+               internal static void SystrayRemove(IntPtr handle, ref ToolTip tt) {
+                       #if DriverDebug
+                               Console.WriteLine("SystrayRemove({0}): Called", Window(handle));
+                       #endif
+                       driver.SystrayRemove(handle, ref tt);
+               }
+
+               internal static bool Text(IntPtr handle, string text) {
+                       #if DriverDebug
+                               Console.WriteLine("Text({0}, {1}): Called", Window(handle), text);
+                       #endif
+                       return driver.Text(handle, text);
+               }
+
+               internal static bool TranslateMessage(ref MSG msg) {
+                       return driver.TranslateMessage(ref msg);
                }
 
-               internal static void ScrollWindow(IntPtr hwnd, int XAmount, int YAmount) {
-                       driver.ScrollWindow(hwnd, XAmount, YAmount);
+               internal static void UngrabWindow(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("UngrabWindow({0}): Called", Window(handle));
+                       #endif
+                       driver.UngrabWindow(handle);
                }
-               
+
+               internal static void UpdateWindow(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("UpdateWindow({0}): Called", Window(handle));
+                       #endif
+                       driver.UpdateWindow(handle);
+               }
+
                // Santa's little helper
+               internal static void Version() {
+                       Console.WriteLine("Xplat version $Revision: $");
+               }
+
                internal static void Where() {
-                       Console.WriteLine("Here: {0}", new StackTrace().ToString());
+                       XplatUIX11.Where();
                }
                #endregion      // Public Static Methods
 
+               #region Delegates
+               public delegate bool ClipboardToObject(int type, IntPtr data, out object obj);
+               public delegate bool ObjectToClipboard(ref int type, object obj, out byte[] data);
+               #endregion      // Delegates
+
        }
 }