[MWF] Implement multi-display support on Linux (Fixes #325669)
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / XplatUIDriver.cs
index 7239cbb2943091c01d199fc4884585ca29d1bbac..ff2427e069041443921e17fff29bb2903512acac 100644 (file)
@@ -116,6 +116,11 @@ namespace System.Windows.Forms {
                internal virtual bool IsTitleBarGradientEnabled { get { return false; } }
                internal virtual bool IsToolTipAnimationEnabled { get { return false; } }
                internal virtual Size MenuBarButtonSize { get { return new Size (19, 19); } }
+               public virtual Size MenuButtonSize {
+                       get {
+                               return new Size(18, 18);
+                       }
+               }
                internal virtual int MenuShowDelay { get { return 0; } }
                
                internal virtual Keys ModifierKeys {
@@ -168,18 +173,16 @@ namespace System.Windows.Forms {
                        get { return LeftRightAlignment.Left; }
                }
                
-#if NET_2_0
                internal virtual PowerStatus PowerStatus {
                        get { throw new NotImplementedException ("Has not been implemented yet for this platform."); }
                }
-#endif
 
                internal virtual int SizingBorderWidth {
                        get { return 4; }
                }
                
                internal virtual Size SmallCaptionButtonSize {
-                       get { return new Size (17, 17); }
+                       get { return new Size (15, 15); }
                }
                
                internal virtual bool UIEffectsEnabled {
@@ -223,24 +226,56 @@ namespace System.Windows.Forms {
                internal abstract Size IconSize { get; }
                internal abstract Size MaxWindowTrackSize { get; }
                internal abstract bool MenuAccessKeysUnderlined { get; }
-               internal abstract Size MinimizedWindowSize { get; }
+               internal virtual Size MinimizedWindowSize {
+                       get {
+                               const int BorderWidth = 3;
+                               return new Size (154 + 2 * BorderWidth, SystemInformation.CaptionHeight + 2 * BorderWidth - 1);
+                       }
+               }
                internal abstract Size MinimizedWindowSpacingSize { get; }
                internal abstract Size MinimumWindowSize { get; }
-               internal abstract Size MinWindowTrackSize { get; }
+               internal virtual Size MinimumFixedToolWindowSize { get { return Size.Empty; } }
+               internal virtual Size MinimumSizeableToolWindowSize { get { return Size.Empty; } }
+               internal virtual Size MinimumNoBorderWindowSize { get { return Size.Empty; } }
+               internal virtual Size MinWindowTrackSize {
+                       get {
+                               return new Size (112, 27);
+                       }
+               }
                internal abstract Size SmallIconSize { get; }
                internal abstract int MouseButtonCount { get; }
                internal abstract bool MouseButtonsSwapped { get; }
                internal abstract bool MouseWheelPresent { get; }
                internal abstract Rectangle VirtualScreen { get; }
                internal abstract Rectangle WorkingArea { get; }
+               internal abstract Screen[] AllScreens { get; }
                internal abstract bool ThemesEnabled { get; }
 
+               internal virtual bool RequiresPositiveClientAreaSize {
+                       get {
+                               return true;
+                       }
+               }
+
+               public virtual int ToolWindowCaptionHeight {
+                       get {
+                               return 16;
+                       }
+               }
+
+               public virtual Size ToolWindowCaptionButtonSize {
+                       get {
+                               return new Size (15, 15);
+                       }
+               }
                #endregion      // XplatUI Driver Properties
 
                internal abstract event EventHandler Idle;
 
                #region XplatUI Driver Methods
-               internal abstract void AudibleAlert();
+               internal abstract void AudibleAlert(AlertType alert);
+
+               internal abstract void BeginMoveResize (IntPtr handle); // init a window manager driven resize event
 
                internal abstract void EnableThemes();
 
@@ -280,6 +315,7 @@ namespace System.Windows.Forms {
                internal abstract bool SetVisible(IntPtr handle, bool visible, bool activate);
                internal abstract bool IsVisible(IntPtr handle);
                internal abstract bool IsEnabled(IntPtr handle);
+               internal virtual bool IsKeyLocked (VirtualKeys key) { return false; }
                internal abstract IntPtr SetParent(IntPtr handle, IntPtr parent);
                internal abstract IntPtr GetParent(IntPtr handle);
 
@@ -343,6 +379,7 @@ namespace System.Windows.Forms {
                internal abstract IntPtr GetFocus();
                internal abstract void SetFocus(IntPtr hwnd);
                internal abstract IntPtr GetActive();
+               internal abstract IntPtr GetPreviousWindow(IntPtr hwnd);
 
                internal abstract void ScrollWindow(IntPtr hwnd, Rectangle rectangle, int XAmount, int YAmount, bool with_children);
                internal abstract void ScrollWindow(IntPtr hwnd, int XAmount, int YAmount, bool with_children);
@@ -352,9 +389,7 @@ namespace System.Windows.Forms {
                internal abstract bool SystrayAdd(IntPtr hwnd, string tip, Icon icon, out ToolTip tt);
                internal abstract bool SystrayChange(IntPtr hwnd, string tip, Icon icon, ref ToolTip tt);
                internal abstract void SystrayRemove(IntPtr hwnd, ref ToolTip tt);
-#if NET_2_0            
                internal abstract void SystrayBalloon(IntPtr hwnd, int timeout, string title, string text, ToolTipIcon icon);
-#endif
 
                internal abstract Point GetMenuOrigin(IntPtr hwnd);
                internal abstract void MenuToScreen(IntPtr hwnd, ref int x, ref int y);
@@ -365,7 +400,7 @@ namespace System.Windows.Forms {
                internal abstract void ClipboardClose(IntPtr handle);
                internal abstract IntPtr ClipboardOpen (bool primary_selection);
                internal abstract int ClipboardGetID(IntPtr handle, string format);
-               internal abstract void ClipboardStore(IntPtr handle, object obj, int id, XplatUI.ObjectToClipboard converter);
+               internal abstract void ClipboardStore(IntPtr handle, object obj, int id, XplatUI.ObjectToClipboard converter, bool copy);
                internal abstract int[] ClipboardAvailableFormats(IntPtr handle);
                internal abstract object ClipboardRetrieve(IntPtr handle, int id, XplatUI.ClipboardToObject converter);
 
@@ -425,18 +460,33 @@ namespace System.Windows.Forms {
                {
                        dest_dc.DrawImage ((Bitmap)offscreen_drawable, r, r, GraphicsUnit.Pixel);
                }
+               
+               internal virtual void SetForegroundWindow (IntPtr handle)
+               {
+               }
 
 #endregion     // XplatUI Driver Methods
        }
 
        internal class XplatUIDriverSupport {
                #region XplatUI Driver Support Methods
-#if NET_2_0
                internal static void ExecutionCallback (object state)
                {
                        AsyncMethodData data = (AsyncMethodData) state;
                        AsyncMethodResult result = data.Result;
-                       object ret = data.Method.DynamicInvoke (data.Args);
+                       
+                       object ret;
+                       try {
+                               ret = data.Method.DynamicInvoke (data.Args);
+                       } catch (Exception ex) {
+                               if (result != null) {
+                                       result.CompleteWithException (ex);
+                                       return;
+                               }
+                               
+                               throw;
+                       }
+               
                        if (result != null) {
                                result.Complete (ret);
                        }
@@ -456,38 +506,6 @@ namespace System.Windows.Forms {
                                gchandle.Free ();
                        }
                }
-#else
-               // for NET_1_0 and NET_1_1 no (public) ExecutionContext exists 
-               // so we must use the System.Threading.CompressedStack class
-               internal static void ExecuteClientMessage (GCHandle gchandle) {
-                       AsyncMethodData data = (AsyncMethodData) gchandle.Target;
-                       CompressedStack original = null;
-                       
-#if !MWF_ON_MSRUNTIME
-                       // Stack is non-null only if the security manager is active
-                       if (data.Stack != null) {
-                               original = Thread.CurrentThread.GetCompressedStack ();
-                               Thread.CurrentThread.SetCompressedStack (data.Stack);
-                       }
-#endif
-
-                       try {
-                               AsyncMethodResult result = data.Result;
-                               object ret = data.Method.DynamicInvoke (data.Args);
-                               result.Complete (ret);
-                       }
-                       finally {
-#if !MWF_ON_MSRUNTIME
-                               if (data.Stack != null) {
-                                       // whatever occurs we must revert to the original compressed
-                                       // stack (null being a valid, empty, value in this case).
-                                       Thread.CurrentThread.SetCompressedStack (original);
-                               }
-#endif
-                               gchandle.Free ();
-                       }
-               }
-#endif
                
                #endregion      // XplatUI Driver Support Methods
        }