1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004-2006 Novell, Inc.
23 // Peter Bartok pbartok@novell.com
24 // Sebastien Pouliot sebastien@ximian.com
30 using System.Threading;
31 using System.Runtime.InteropServices;
33 namespace System.Windows.Forms {
34 internal abstract class XplatUIDriver {
35 internal abstract IntPtr InitializeDriver();
36 internal abstract void ShutdownDriver(IntPtr token);
37 internal delegate IntPtr WndProc(IntPtr hwnd, Msg msg, IntPtr wParam, IntPtr lParam);
40 #region XplatUI Driver Properties
41 internal virtual Color ForeColor {
43 return ThemeEngine.Current.DefaultWindowForeColor;
47 internal virtual Color BackColor {
49 return ThemeEngine.Current.DefaultWindowBackColor;
53 internal virtual Font Font {
55 return ThemeEngine.Current.DefaultFont;
59 internal virtual Keys ModifierKeys {
65 internal virtual MouseButtons MouseButtons {
67 return MouseButtons.None;
71 internal virtual Size MouseHoverSize {
73 return new Size (1, 1);
77 internal virtual int MouseHoverTime {
83 internal virtual Point MousePosition {
89 internal virtual int MenuHeight {
95 internal virtual bool DropTarget {
104 internal virtual int HorizontalScrollBarHeight {
110 internal virtual bool UserClipWontExposeParent {
116 internal virtual int VerticalScrollBarWidth {
122 internal abstract int Caption { get; }
123 internal abstract Size CursorSize { get; }
124 internal abstract bool DragFullWindows { get; }
125 internal abstract Size DragSize { get; }
126 internal abstract Size FrameBorderSize { get; }
127 internal abstract Size IconSize { get; }
128 internal abstract Size MaxWindowTrackSize { get; }
129 internal abstract Size MinimizedWindowSize { get; }
130 internal abstract Size MinimizedWindowSpacingSize { get; }
131 internal abstract Size MinimumWindowSize { get; }
132 internal abstract Size MinWindowTrackSize { get; }
133 internal abstract Size SmallIconSize { get; }
134 internal abstract int MouseButtonCount { get; }
135 internal abstract bool MouseButtonsSwapped { get; }
136 internal abstract bool MouseWheelPresent { get; }
137 internal abstract Rectangle VirtualScreen { get; }
138 internal abstract Rectangle WorkingArea { get; }
139 internal abstract bool ThemesEnabled { get; }
141 #endregion // XplatUI Driver Properties
143 internal abstract event EventHandler Idle;
145 #region XplatUI Driver Methods
146 internal abstract void AudibleAlert();
148 internal abstract void EnableThemes();
150 internal abstract void GetDisplaySize(out Size size);
152 internal abstract IntPtr CreateWindow(CreateParams cp);
153 internal abstract IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height);
154 internal abstract void DestroyWindow(IntPtr handle);
156 internal abstract FormWindowState GetWindowState(IntPtr handle);
157 internal abstract void SetWindowState(IntPtr handle, FormWindowState state);
158 internal abstract void SetWindowMinMax(IntPtr handle, Rectangle maximized, Size min, Size max);
160 internal abstract void SetWindowStyle(IntPtr handle, CreateParams cp);
162 internal abstract void SetWindowTransparency(IntPtr handle, double transparency, Color key);
163 internal abstract bool SupportsTransparency();
165 internal virtual void SetAllowDrop (IntPtr handle, bool value)
167 Console.Error.WriteLine ("Drag and Drop is currently " +
168 "not supported on this platform");
171 internal virtual DragDropEffects StartDrag(IntPtr handle, object data, DragDropEffects allowedEffects) {
172 Console.Error.WriteLine ("Drag and Drop is currently " +
173 "not supported on this platform");
174 return DragDropEffects.None;
177 internal abstract void SetBorderStyle(IntPtr handle, FormBorderStyle border_style);
178 internal abstract void SetMenu(IntPtr handle, Menu menu);
180 internal abstract bool GetText(IntPtr handle, out string text);
181 internal abstract bool Text(IntPtr handle, string text);
182 internal abstract bool SetVisible(IntPtr handle, bool visible);
183 internal abstract bool IsVisible(IntPtr handle);
184 internal abstract bool IsEnabled(IntPtr handle);
185 internal abstract IntPtr SetParent(IntPtr handle, IntPtr parent);
186 internal abstract IntPtr GetParent(IntPtr handle);
188 internal abstract void UpdateWindow(IntPtr handle);
189 internal abstract PaintEventArgs PaintEventStart(IntPtr handle, bool client);
190 internal abstract void PaintEventEnd(IntPtr handle, bool client);
192 internal abstract void SetWindowPos(IntPtr handle, int x, int y, int width, int height);
193 internal abstract 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);
194 internal abstract void Activate(IntPtr handle);
195 internal abstract void EnableWindow(IntPtr handle, bool Enable);
196 internal abstract void SetModal(IntPtr handle, bool Modal);
197 internal abstract void Invalidate(IntPtr handle, Rectangle rc, bool clear);
198 internal abstract IntPtr DefWndProc(ref Message msg);
199 internal abstract void HandleException(Exception e);
200 internal abstract void DoEvents();
201 internal abstract bool PeekMessage(Object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags);
202 internal abstract void PostQuitMessage(int exitCode);
203 internal abstract bool GetMessage(object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax);
204 internal abstract bool TranslateMessage(ref MSG msg);
205 internal abstract IntPtr DispatchMessage(ref MSG msg);
207 internal abstract bool SetZOrder(IntPtr hWnd, IntPtr AfterhWnd, bool Top, bool Bottom);
208 internal abstract bool SetTopmost(IntPtr hWnd, IntPtr hWndOwner, bool Enabled);
210 internal abstract bool CalculateWindowRect(ref Rectangle ClientRect, int Style, int ExStyle, Menu menu, out Rectangle WindowRect);
212 internal abstract Region GetClipRegion(IntPtr hwnd);
213 internal abstract void SetClipRegion(IntPtr hwnd, Region region);
215 internal abstract void SetCursor(IntPtr hwnd, IntPtr cursor);
216 internal abstract void ShowCursor(bool show);
217 internal abstract void OverrideCursor(IntPtr cursor);
218 internal abstract IntPtr DefineCursor(Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot);
219 internal abstract IntPtr DefineStdCursor(StdCursor id);
220 internal abstract void DestroyCursor(IntPtr cursor);
221 internal abstract void GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y);
223 internal abstract void GetCursorPos(IntPtr hwnd, out int x, out int y);
224 internal abstract void SetCursorPos(IntPtr hwnd, int x, int y);
226 internal abstract void ScreenToClient(IntPtr hwnd, ref int x, ref int y);
227 internal abstract void ClientToScreen(IntPtr hwnd, ref int x, ref int y);
229 internal abstract void GrabWindow(IntPtr hwnd, IntPtr ConfineToHwnd);
230 internal abstract void GrabInfo(out IntPtr hwnd, out bool GrabConfined, out Rectangle GrabArea);
231 internal abstract void UngrabWindow(IntPtr hwnd);
233 internal abstract void SendAsyncMethod (AsyncMethodData method);
234 internal abstract void SetTimer (Timer timer);
235 internal abstract void KillTimer (Timer timer);
237 internal abstract void CreateCaret(IntPtr hwnd, int width, int height);
238 internal abstract void DestroyCaret(IntPtr hwnd);
239 internal abstract void SetCaretPos(IntPtr hwnd, int x, int y);
240 internal abstract void CaretVisible(IntPtr hwnd, bool visible);
242 internal abstract IntPtr GetFocus();
243 internal abstract void SetFocus(IntPtr hwnd);
244 internal abstract IntPtr GetActive();
246 internal abstract void ScrollWindow(IntPtr hwnd, Rectangle rectangle, int XAmount, int YAmount, bool with_children);
247 internal abstract void ScrollWindow(IntPtr hwnd, int XAmount, int YAmount, bool with_children);
249 internal abstract bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent);
251 internal abstract bool SystrayAdd(IntPtr hwnd, string tip, Icon icon, out ToolTip tt);
252 internal abstract bool SystrayChange(IntPtr hwnd, string tip, Icon icon, ref ToolTip tt);
253 internal abstract void SystrayRemove(IntPtr hwnd, ref ToolTip tt);
255 internal abstract Point GetMenuOrigin(IntPtr hwnd);
256 internal abstract void MenuToScreen(IntPtr hwnd, ref int x, ref int y);
257 internal abstract void ScreenToMenu(IntPtr hwnd, ref int x, ref int y);
259 internal abstract void SetIcon(IntPtr handle, Icon icon);
261 internal abstract void ClipboardClose(IntPtr handle);
262 internal abstract IntPtr ClipboardOpen (bool primary_selection);
263 internal abstract int ClipboardGetID(IntPtr handle, string format);
264 internal abstract void ClipboardStore(IntPtr handle, object obj, int id, XplatUI.ObjectToClipboard converter);
265 internal abstract int[] ClipboardAvailableFormats(IntPtr handle);
266 internal abstract object ClipboardRetrieve(IntPtr handle, int id, XplatUI.ClipboardToObject converter);
268 internal abstract void DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width);
270 internal abstract SizeF GetAutoScaleSize(Font font);
272 internal abstract IntPtr SendMessage(IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam);
273 internal abstract bool PostMessage(IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam);
275 internal abstract object StartLoop(Thread thread);
276 internal abstract void EndLoop(Thread thread);
278 internal abstract void RequestNCRecalc(IntPtr hwnd);
279 internal abstract void ResetMouseHover(IntPtr hwnd);
281 // System information
282 internal abstract int KeyboardSpeed { get; }
283 internal abstract int KeyboardDelay { get; }
285 #endregion // XplatUI Driver Methods
288 internal class XplatUIDriverSupport {
289 #region XplatUI Driver Support Methods
291 internal static void ExecutionCallback (object state)
293 AsyncMethodData data = (AsyncMethodData) state;
294 AsyncMethodResult result = data.Result;
295 object ret = data.Method.DynamicInvoke (data.Args);
296 if (result != null) {
297 result.Complete (ret);
301 internal static void ExecuteClientMessage (GCHandle gchandle)
303 AsyncMethodData data = (AsyncMethodData) gchandle.Target;
305 if (data.Context == null) {
306 ExecutionCallback (data);
308 ExecutionContext.Run (data.Context, new ContextCallback (ExecutionCallback), data);
316 // for NET_1_0 and NET_1_1 no (public) ExecutionContext exists
317 // so we must use the System.Threading.CompressedStack class
318 internal static void ExecuteClientMessage (GCHandle gchandle) {
319 AsyncMethodData data = (AsyncMethodData) gchandle.Target;
320 CompressedStack original = null;
322 #if !MWF_ON_MSRUNTIME
323 // Stack is non-null only if the security manager is active
324 if (data.Stack != null) {
325 original = Thread.CurrentThread.GetCompressedStack ();
326 Thread.CurrentThread.SetCompressedStack (data.Stack);
331 AsyncMethodResult result = data.Result;
332 object ret = data.Method.DynamicInvoke (data.Args);
333 result.Complete (ret);
336 #if !MWF_ON_MSRUNTIME
337 if (data.Stack != null) {
338 // whatever occurs we must revert to the original compressed
339 // stack (null being a valid, empty, value in this case).
340 Thread.CurrentThread.SetCompressedStack (original);
348 #endregion // XplatUI Driver Support Methods