Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs')
-rw-r--r--mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs4444
1 files changed, 0 insertions, 4444 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs
deleted file mode 100644
index 149841ccbf7..00000000000
--- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs
+++ /dev/null
@@ -1,4444 +0,0 @@
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// 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-2006 Novell, Inc.
-//
-// Authors:
-// Peter Bartok pbartok@novell.com
-//
-//
-
-// NOTE:
-// This driver understands the following environment variables: (Set the var to enable feature)
-//
-// MONO_XEXCEPTIONS = throw an exception when a X11 error is encountered;
-// by default a message is displayed but execution continues
-//
-// MONO_XSYNC = perform all X11 commands synchronous; this is slower but
-// helps in debugging errors
-//
-
-// NOT COMPLETE
-
-// define to log Window handles and relationships to stdout
-#undef DriverDebug
-
-// Extra detailed debug
-#undef DriverDebugExtra
-
-using System;
-using System.ComponentModel;
-using System.Collections;
-using System.Diagnostics;
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.Drawing.Imaging;
-using System.IO;
-using System.Net;
-using System.Net.Sockets;
-using System.Reflection;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
-
-// Only do the poll when building with mono for now
-#if __MonoCS__
-using Mono.Unix.Native;
-#endif
-
-/// X11 Version
-namespace System.Windows.Forms {
- internal class XplatUIX11 : XplatUIDriver {
- #region Local Variables
- // General
- static volatile XplatUIX11 Instance;
- private static int RefCount;
- private static object XlibLock; // Our locking object
- private static bool ThemesEnabled;
-
- // General X11
- private static IntPtr DisplayHandle; // X11 handle to display
- private static int ScreenNo; // Screen number used
- private static IntPtr DefaultColormap; // Colormap for screen
- private static IntPtr CustomVisual; // Visual for window creation
- private static IntPtr CustomColormap; // Colormap for window creation
- private static IntPtr RootWindow; // Handle of the root window for the screen/display
- private static IntPtr FosterParent; // Container to hold child windows until their parent exists
- private static XErrorHandler ErrorHandler; // Error handler delegate
- private static bool ErrorExceptions; // Throw exceptions on X errors
- private static bool PostQuitState; // True if we've got an pending exit
-
- // Clipboard
- private static IntPtr ClipMagic = new IntPtr(27051977);
- private static ClipboardStruct Clipboard; // Our clipboard
-
- // Communication
- private static IntPtr PostAtom; // PostMessage atom
- private static IntPtr AsyncAtom; // Support for async messages
-
- // Message Loop
- private static XEventQueue MessageQueue; // Holds our queued up events
- #if __MonoCS__ //
- private static Pollfd[] pollfds; // For watching the X11 socket
- #endif //
- private static X11Keyboard Keyboard; //
- private static X11Dnd Dnd;
- private static Socket listen; //
- private static Socket wake; //
- private static Socket wake_receive; //
- private static byte[] network_buffer; //
-
-
- // Focus tracking
- private static IntPtr ActiveWindow; // Handle of the active window
- private static IntPtr FocusWindow; // Handle of the window with keyboard focus (if any)
-
- // Modality support
- private static Stack ModalWindows; // Stack of our modal windows
-
- // Systray
- private static IntPtr SystrayMgrWindow; // Handle of the Systray Manager window
-
- // Cursors
- private static IntPtr LastCursorWindow; // The last window we set the cursor on
- private static IntPtr LastCursorHandle; // The handle that was last set on LastCursorWindow
- private static IntPtr OverrideCursorHandle; // The cursor that is set to override any other cursors
-
- // Caret
- private static CaretStruct Caret; //
-
- // Support for Window Styles
- private static IntPtr[] NetAtoms; // All atoms we know
-
- // mouse hover message generation
- private static HoverStruct HoverState; //
-
- // double click message generation
- private static ClickStruct ClickPending; //
-
- // Support for mouse grab
- private static GrabStruct Grab; //
-
- // State
- private static Point MousePosition; // Last position of mouse, in screen coords
- internal static MouseButtons MouseState; // Last state of mouse buttons
-
- // Timers
- private static ArrayList TimerList; // Holds SWF.Timers
-
- // 'Constants'
- private static int DoubleClickInterval; // msec; max interval between clicks to count as double click
-
- const EventMask SelectInputMask = EventMask.ButtonPressMask |
- EventMask.ButtonReleaseMask |
- EventMask.KeyPressMask |
- EventMask.KeyReleaseMask |
- EventMask.EnterWindowMask |
- EventMask.LeaveWindowMask |
- EventMask.ExposureMask |
- EventMask.FocusChangeMask |
- EventMask.PointerMotionMask |
- EventMask.VisibilityChangeMask |
- EventMask.SubstructureNotifyMask |
- EventMask.StructureNotifyMask;
-
- static readonly object lockobj = new object ();
-
- #endregion // Local Variables
- #region Constructors
- private XplatUIX11() {
- // Handle singleton stuff first
- RefCount = 0;
-
- // Now regular initialization
- XlibLock = new object ();
- MessageQueue = new XEventQueue ();
- TimerList = new ArrayList ();
- XInitThreads();
-
- ErrorExceptions = false;
-
- // X11 Initialization
- SetDisplay(XOpenDisplay(IntPtr.Zero));
- X11DesktopColors.Initialize();
-
- // Handle any upcoming errors; we re-set it here, X11DesktopColor stuff might have stolen it (gtk does)
- ErrorHandler = new XErrorHandler(HandleError);
- XSetErrorHandler(ErrorHandler);
- }
- #endregion // Constructors
-
- #region Singleton Specific Code
- public static XplatUIX11 GetInstance() {
- lock (lockobj) {
- if (Instance == null) {
- Instance=new XplatUIX11();
- }
- RefCount++;
- }
- return Instance;
- }
-
- public int Reference {
- get {
- return RefCount;
- }
- }
- #endregion
-
- #region Internal Properties
- internal static IntPtr Display {
- get {
- return DisplayHandle;
- }
-
- set {
- XplatUIX11.GetInstance().SetDisplay(value);
- }
- }
-
- internal static int Screen {
- get {
- return ScreenNo;
- }
-
- set {
- ScreenNo = value;
- }
- }
-
- internal static IntPtr RootWindowHandle {
- get {
- return RootWindow;
- }
-
- set {
- RootWindow = value;
- }
- }
-
- internal static IntPtr Visual {
- get {
- return CustomVisual;
- }
-
- set {
- CustomVisual = value;
- }
- }
-
- internal static IntPtr ColorMap {
- get {
- return CustomColormap;
- }
-
- set {
- CustomColormap = value;
- }
- }
- #endregion
-
- #region XExceptionClass
- internal class XException : ApplicationException {
- IntPtr Display;
- IntPtr ResourceID;
- IntPtr Serial;
- XRequest RequestCode;
- byte ErrorCode;
- byte MinorCode;
-
- public XException(IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode) {
- this.Display = Display;
- this.ResourceID = ResourceID;
- this.Serial = Serial;
- this.RequestCode = RequestCode;
- this.ErrorCode = ErrorCode;
- this.MinorCode = MinorCode;
- }
-
- public override string Message {
- get {
- return GetMessage(Display, ResourceID, Serial, ErrorCode, RequestCode, MinorCode);
- }
- }
-
- public static string GetMessage(IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode) {
- StringBuilder sb;
- string x_error_text;
- string error;
-
- sb = new StringBuilder(160);
- XGetErrorText(Display, ErrorCode, sb, sb.Capacity);
- x_error_text = sb.ToString();
-
- error = String.Format("\n Error: {0}\n Request: {1:D} ({2})\n Resource ID: 0x{3:x}\n Serial: {4}", x_error_text, RequestCode, RequestCode, ResourceID.ToInt32(), Serial);
- return error;
- }
- }
- #endregion // XExceptionClass
-
- #region Internal Methods
- internal void SetDisplay(IntPtr display_handle) {
- if (display_handle != IntPtr.Zero) {
- Hwnd hwnd;
-
- if ((DisplayHandle != IntPtr.Zero) && (FosterParent != IntPtr.Zero)) {
- hwnd = Hwnd.ObjectFromHandle(FosterParent);
- XDestroyWindow(DisplayHandle, FosterParent);
- hwnd.Dispose();
- }
-
- if (DisplayHandle != IntPtr.Zero) {
- XCloseDisplay(DisplayHandle);
- }
-
- DisplayHandle=display_handle;
-
- // We need to tell System.Drawing our DisplayHandle. FromHdcInternal has
- // been hacked to do this for us.
- Graphics.FromHdcInternal (DisplayHandle);
-
- // Debugging support
- if (Environment.GetEnvironmentVariable ("MONO_XSYNC") != null) {
- XSynchronize(DisplayHandle, true);
- }
-
- if (Environment.GetEnvironmentVariable ("MONO_XEXCEPTIONS") != null) {
- ErrorExceptions = true;
- }
-
- // Generic X11 setup
- ScreenNo = XDefaultScreen(DisplayHandle);
- RootWindow = XRootWindow(DisplayHandle, ScreenNo);
- DefaultColormap = XDefaultColormap(DisplayHandle, ScreenNo);
-
- // Create the foster parent
- FosterParent=XCreateSimpleWindow(DisplayHandle, RootWindow, 0, 0, 1, 1, 4, UIntPtr.Zero, UIntPtr.Zero);
- if (FosterParent==IntPtr.Zero) {
- Console.WriteLine("XplatUIX11 Constructor failed to create FosterParent");
- }
-
- hwnd = new Hwnd();
- hwnd.WholeWindow = FosterParent;
- hwnd.ClientWindow = FosterParent;
-
- // For sleeping on the X11 socket
- listen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
- IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 0);
- listen.Bind(ep);
- listen.Listen(1);
-
- // To wake up when a timer is ready
- network_buffer = new byte[10];
-
- wake = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
- wake.Connect(listen.LocalEndPoint);
- wake_receive = listen.Accept();
-
- #if __MonoCS__
- pollfds = new Pollfd [2];
- pollfds [0] = new Pollfd ();
- pollfds [0].fd = XConnectionNumber (DisplayHandle);
- pollfds [0].events = PollEvents.POLLIN;
-
- pollfds [1] = new Pollfd ();
- pollfds [1].fd = wake_receive.Handle.ToInt32 ();
- pollfds [1].events = PollEvents.POLLIN;
- #endif
-
- Keyboard = new X11Keyboard(DisplayHandle);
- Dnd = new X11Dnd (DisplayHandle);
-
- PostQuitState = false;
-
- DoubleClickInterval = 500;
-
- HoverState.Interval = 500;
- HoverState.Timer = new Timer();
- HoverState.Timer.Enabled = false;
- HoverState.Timer.Interval = HoverState.Interval;
- HoverState.Timer.Tick +=new EventHandler(MouseHover);
- HoverState.X = -1;
- HoverState.Y = -1;
-
- ActiveWindow = IntPtr.Zero;
- FocusWindow = IntPtr.Zero;
- ModalWindows = new Stack(3);
-
- MouseState = MouseButtons.None;
- MousePosition = new Point(0, 0);
-
- Caret.Timer = new Timer();
- Caret.Timer.Interval = 500; // FIXME - where should this number come from?
- Caret.Timer.Tick += new EventHandler(CaretCallback);
-
- SetupAtoms();
-
- // Grab atom changes off the root window to catch certain WM events
- XSelectInput(DisplayHandle, RootWindow, new IntPtr ((int)EventMask.PropertyChangeMask));
-
- // Handle any upcoming errors
- ErrorHandler = new XErrorHandler(HandleError);
- XSetErrorHandler(ErrorHandler);
- } else {
- throw new ArgumentNullException("Display", "Could not open display (X-Server required. Check you DISPLAY environment variable)");
- }
- }
-
- internal static void Where() {
- Console.WriteLine("Here: {0}\n", WhereString());
- }
-
- internal static string WhereString() {
- StackTrace stack;
- StackFrame frame;
- string newline;
- string unknown;
- StringBuilder sb;
- MethodBase method;
-
- newline = String.Format("{0}\t {1} ", Environment.NewLine, Locale.GetText("at"));
- unknown = Locale.GetText("<unknown method>");
- sb = new StringBuilder();
- stack = new StackTrace(true);
-
- for (int i = 0; i < stack.FrameCount; i++) {
- frame = stack.GetFrame(i);
- sb.Append(newline);
-
- method = frame.GetMethod();
- if (method != null) {
- #if not
- sb.AppendFormat(frame.ToString());
- #endif
- if (frame.GetFileLineNumber() != 0) {
- sb.AppendFormat("{0}.{1} () [{2}:{3}]", method.DeclaringType.FullName, method.Name, Path.GetFileName(frame.GetFileName()), frame.GetFileLineNumber());
- } else {
- sb.AppendFormat("{0}.{1} ()", method.DeclaringType.FullName, method.Name);
- }
- } else {
- sb.Append(unknown);
- }
- }
- return sb.ToString();
- }
- #endregion // Internal Methods
-
- #region Private Methods
- private static void SetupAtoms() {
- NetAtoms = new IntPtr[(int)NA.LAST_NET_ATOM];
-
- NetAtoms[(int)NA.WM_PROTOCOLS] = XInternAtom(DisplayHandle, "WM_PROTOCOLS", false);
- NetAtoms[(int)NA.WM_DELETE_WINDOW] = XInternAtom(DisplayHandle, "WM_DELETE_WINDOW", false);
- NetAtoms[(int)NA.WM_TAKE_FOCUS] = XInternAtom(DisplayHandle, "WM_TAKE_FOCUS", false);
-
- NetAtoms[(int)NA._NET_SUPPORTED] = XInternAtom(DisplayHandle, "_NET_SUPPORTED", false);
- NetAtoms[(int)NA._NET_CLIENT_LIST] = XInternAtom(DisplayHandle, "_NET_CLIENT_LIST", false);
- NetAtoms[(int)NA._NET_NUMBER_OF_DESKTOPS] = XInternAtom(DisplayHandle, "_NET_NUMBER_OF_DESKTOPS", false);
- NetAtoms[(int)NA._NET_DESKTOP_GEOMETRY] = XInternAtom(DisplayHandle, "_NET_DESKTOP_GEOMETRY", false);
- NetAtoms[(int)NA._NET_DESKTOP_VIEWPORT] = XInternAtom(DisplayHandle, "_NET_DESKTOP_VIEWPORT", false);
- NetAtoms[(int)NA._NET_CURRENT_DESKTOP] = XInternAtom(DisplayHandle, "_NET_CURRENT_DESKTOP", false);
- NetAtoms[(int)NA._NET_DESKTOP_NAMES] = XInternAtom(DisplayHandle, "_NET_DESKTOP_NAMES", false);
- NetAtoms[(int)NA._NET_ACTIVE_WINDOW] = XInternAtom(DisplayHandle, "_NET_ACTIVE_WINDOW", false);
- NetAtoms[(int)NA._NET_WORKAREA] = XInternAtom(DisplayHandle, "_NET_WORKAREA", false);
- NetAtoms[(int)NA._NET_SUPPORTING_WM_CHECK] = XInternAtom(DisplayHandle, "_NET_SUPPORTING_WM_CHECK", false);
- NetAtoms[(int)NA._NET_VIRTUAL_ROOTS] = XInternAtom(DisplayHandle, "_NET_VIRTUAL_ROOTS", false);
- NetAtoms[(int)NA._NET_DESKTOP_LAYOUT] = XInternAtom(DisplayHandle, "_NET_DESKTOP_LAYOUT", false);
- NetAtoms[(int)NA._NET_SHOWING_DESKTOP] = XInternAtom(DisplayHandle, "_NET_SHOWING_DESKTOP", false);
-
- NetAtoms[(int)NA._NET_CLOSE_WINDOW] = XInternAtom(DisplayHandle, "_NET_CLOSE_WINDOW", false);
- NetAtoms[(int)NA._NET_MOVERESIZE_WINDOW] = XInternAtom(DisplayHandle, "_NET_MOVERESIZE_WINDOW", false);
- NetAtoms[(int)NA._NET_WM_MOVERESIZE] = XInternAtom(DisplayHandle, "_NET_WM_MOVERESIZE", false);
- NetAtoms[(int)NA._NET_RESTACK_WINDOW] = XInternAtom(DisplayHandle, "_NET_RESTACK_WINDOW", false);
- NetAtoms[(int)NA._NET_REQUEST_FRAME_EXTENTS] = XInternAtom(DisplayHandle, "_NET_REQUEST_FRAME_EXTENTS", false);
-
- NetAtoms[(int)NA._NET_WM_NAME] = XInternAtom(DisplayHandle, "_NET_WM_NAME", false);
- NetAtoms[(int)NA._NET_WM_VISIBLE_NAME] = XInternAtom(DisplayHandle, "_NET_WM_VISIBLE_NAME", false);
- NetAtoms[(int)NA._NET_WM_ICON_NAME] = XInternAtom(DisplayHandle, "_NET_WM_ICON_NAME", false);
- NetAtoms[(int)NA._NET_WM_VISIBLE_ICON_NAME] = XInternAtom(DisplayHandle, "_NET_WM_VISIBLE_ICON_NAME", false);
- NetAtoms[(int)NA._NET_WM_DESKTOP] = XInternAtom(DisplayHandle, "_NET_WM_DESKTOP", false);
- NetAtoms[(int)NA._NET_WM_WINDOW_TYPE] = XInternAtom(DisplayHandle, "_NET_WM_WINDOW_TYPE", false);
- NetAtoms[(int)NA._NET_WM_STATE] = XInternAtom(DisplayHandle, "_NET_WM_STATE", false);
- NetAtoms[(int)NA._NET_WM_ALLOWED_ACTIONS] = XInternAtom(DisplayHandle, "_NET_WM_ALLOWED_ACTIONS", false);
- NetAtoms[(int)NA._NET_WM_STRUT] = XInternAtom(DisplayHandle, "_NET_WM_STRUT", false);
- NetAtoms[(int)NA._NET_WM_STRUT_PARTIAL] = XInternAtom(DisplayHandle, "_NET_WM_STRUT_PARTIAL", false);
- NetAtoms[(int)NA._NET_WM_ICON_GEOMETRY] = XInternAtom(DisplayHandle, "_NET_WM_ICON_GEOMETRY", false);
- NetAtoms[(int)NA._NET_WM_ICON] = XInternAtom(DisplayHandle, "_NET_WM_ICON", false);
- NetAtoms[(int)NA._NET_WM_PID] = XInternAtom(DisplayHandle, "_NET_WM_PID", false);
- NetAtoms[(int)NA._NET_WM_HANDLED_ICONS] = XInternAtom(DisplayHandle, "_NET_WM_HANDLED_ICONS", false);
- NetAtoms[(int)NA._NET_WM_USER_TIME] = XInternAtom(DisplayHandle, "_NET_WM_USER_TIME", false);
- NetAtoms[(int)NA._NET_FRAME_EXTENTS] = XInternAtom(DisplayHandle, "_NET_FRAME_EXTENTS", false);
-
- NetAtoms[(int)NA._NET_WM_PING] = XInternAtom(DisplayHandle, "_NET_WM_PING", false);
- NetAtoms[(int)NA._NET_WM_SYNC_REQUEST] = XInternAtom(DisplayHandle, "_NET_WM_SYNC_REQUEST", false);
-
- NetAtoms[(int)NA._NET_SYSTEM_TRAY_S] = XInternAtom(DisplayHandle, "_NET_SYSTEM_TRAY_S" + ScreenNo.ToString(), false);
- NetAtoms[(int)NA._NET_SYSTEM_TRAY_OPCODE] = XInternAtom(DisplayHandle, "_NET_SYSTEM_TRAY_OPCODE", false);
- NetAtoms[(int)NA._NET_SYSTEM_TRAY_ORIENTATION] = XInternAtom(DisplayHandle, "_NET_SYSTEM_TRAY_ORIENTATION", false);
-
- NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_HORZ] = XInternAtom(DisplayHandle, "_NET_WM_STATE_MAXIMIZED_HORZ", false);
- NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_VERT] = XInternAtom(DisplayHandle, "_NET_WM_STATE_MAXIMIZED_VERT", false);
- NetAtoms[(int)NA._NET_WM_STATE_HIDDEN] = XInternAtom(DisplayHandle, "_NET_WM_STATE_HIDDEN", false);
-
- NetAtoms[(int)NA._XEMBED] = XInternAtom(DisplayHandle, "_XEMBED", false);
- NetAtoms[(int)NA._XEMBED_INFO] = XInternAtom(DisplayHandle, "_XEMBED_INFO", false);
-
- NetAtoms[(int)NA._MOTIF_WM_HINTS] = XInternAtom(DisplayHandle, "_MOTIF_WM_HINTS", false);
-
- NetAtoms[(int)NA._NET_WM_STATE_NO_TASKBAR] = XInternAtom(DisplayHandle, "_NET_WM_STATE_NO_TASKBAR", false);
- NetAtoms[(int)NA._NET_WM_STATE_ABOVE] = XInternAtom(DisplayHandle, "_NET_WM_STATE_ABOVE", false);
- NetAtoms[(int)NA._NET_WM_STATE_MODAL] = XInternAtom(DisplayHandle, "_NET_WM_STATE_MODAL", false);
- NetAtoms[(int)NA._NET_WM_CONTEXT_HELP] = XInternAtom(DisplayHandle, "_NET_WM_CONTEXT_HELP", false);
- NetAtoms[(int)NA._NET_WM_WINDOW_OPACITY] = XInternAtom(DisplayHandle, "_NET_WM_WINDOW_OPACITY", false);
-
- // Clipboard support
- NetAtoms[(int)NA.CLIPBOARD] = XInternAtom (DisplayHandle, "CLIPBOARD", false);
- NetAtoms[(int)NA.DIB] = (IntPtr)Atom.XA_PIXMAP;
- NetAtoms[(int)NA.OEMTEXT] = XInternAtom(DisplayHandle, "COMPOUND_TEXT", false);
- NetAtoms[(int)NA.UNICODETEXT] = XInternAtom(DisplayHandle, "UTF8_STRING", false);
- NetAtoms[(int)NA.TARGETS] = XInternAtom(DisplayHandle, "TARGETS", false);
-
- // Special Atoms
- AsyncAtom = XInternAtom(DisplayHandle, "_SWF_AsyncAtom", false);
- PostAtom = XInternAtom (DisplayHandle, "_SWF_PostMessageAtom", false);
- HoverState.Atom = XInternAtom(DisplayHandle, "_SWF_HoverAtom", false);
- }
-
- private void GetSystrayManagerWindow() {
- XGrabServer(DisplayHandle);
- SystrayMgrWindow = XGetSelectionOwner(DisplayHandle, NetAtoms[(int)NA._NET_SYSTEM_TRAY_S]);
- XUngrabServer(DisplayHandle);
- XFlush(DisplayHandle);
- }
-
- private void SendNetWMMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2) {
- XEvent xev;
-
- xev = new XEvent();
- xev.ClientMessageEvent.type = XEventName.ClientMessage;
- xev.ClientMessageEvent.send_event = true;
- xev.ClientMessageEvent.window = window;
- xev.ClientMessageEvent.message_type = message_type;
- xev.ClientMessageEvent.format = 32;
- xev.ClientMessageEvent.ptr1 = l0;
- xev.ClientMessageEvent.ptr2 = l1;
- xev.ClientMessageEvent.ptr3 = l2;
- XSendEvent(DisplayHandle, RootWindow, false, new IntPtr ((int) (EventMask.SubstructureRedirectMask | EventMask.SubstructureNotifyMask)), ref xev);
- }
-
- private void SendNetClientMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2) {
- XEvent xev;
-
- xev = new XEvent();
- xev.ClientMessageEvent.type = XEventName.ClientMessage;
- xev.ClientMessageEvent.send_event = true;
- xev.ClientMessageEvent.window = window;
- xev.ClientMessageEvent.message_type = message_type;
- xev.ClientMessageEvent.format = 32;
- xev.ClientMessageEvent.ptr1 = l0;
- xev.ClientMessageEvent.ptr2 = l1;
- xev.ClientMessageEvent.ptr3 = l2;
- XSendEvent(DisplayHandle, window, false, new IntPtr ((int)EventMask.NoEventMask), ref xev);
- }
-
- private void DeriveStyles(IntPtr handle, int Style, int ExStyle, out FormBorderStyle border_style, out TitleStyle title_style, out int caption_height, out int tool_caption_height) {
-
- // Only MDI windows get caption_heights
- caption_height = 0;
- tool_caption_height = 19;
-
- if ((Style & (int) WindowStyles.WS_CHILD) != 0) {
- if ((Style & (int) WindowStyles.WS_BORDER) == 0) {
- border_style = FormBorderStyle.None;
- } else if ((ExStyle & (int) WindowStyles.WS_EX_CLIENTEDGE) != 0) {
- border_style = FormBorderStyle.Fixed3D;
- } else {
- border_style = FormBorderStyle.FixedSingle;
- }
- title_style = TitleStyle.None;
-
- if ((ExStyle & (int) WindowStyles.WS_EX_MDICHILD) != 0) {
- caption_height = 26;
-
- if ((Style & (int)WindowStyles.WS_CAPTION) != 0) {
- if ((ExStyle & (int)WindowStyles.WS_EX_TOOLWINDOW) != 0) {
- title_style = TitleStyle.Tool;
- } else {
- title_style = TitleStyle.Normal;
- }
- }
-
- if ((Style & (int) WindowStyles.WS_OVERLAPPEDWINDOW) != 0 ||
- (ExStyle & (int) WindowStyles.WS_EX_TOOLWINDOW) != 0) {
- border_style = (FormBorderStyle) 0xFFFF;
- } else {
- border_style = FormBorderStyle.None;
- }
- }
-
- } else {
- title_style = TitleStyle.None;
- if ((Style & (int)WindowStyles.WS_CAPTION) != 0) {
- if ((ExStyle & (int)WindowStyles.WS_EX_TOOLWINDOW) != 0) {
- title_style = TitleStyle.Tool;
- } else {
- title_style = TitleStyle.Normal;
- }
- }
-
- border_style = FormBorderStyle.None;
-
- if ((Style & (int)WindowStyles.WS_THICKFRAME) != 0) {
- if ((ExStyle & (int)WindowStyles.WS_EX_TOOLWINDOW) != 0) {
- border_style = FormBorderStyle.SizableToolWindow;
- } else {
- border_style = FormBorderStyle.Sizable;
- }
- } else {
- if ((ExStyle & (int)WindowStyles.WS_EX_CLIENTEDGE) != 0) {
- border_style = FormBorderStyle.Fixed3D;
- } else if ((ExStyle & (int)WindowStyles.WS_EX_DLGMODALFRAME) != 0) {
- border_style = FormBorderStyle.FixedDialog;
- } else if ((ExStyle & (int)WindowStyles.WS_EX_TOOLWINDOW) != 0) {
- border_style = FormBorderStyle.FixedToolWindow;
- } else if ((Style & (int)WindowStyles.WS_BORDER) != 0) {
- border_style = FormBorderStyle.Sizable;
- } else {
- border_style = FormBorderStyle.None;
- }
- }
- }
- }
-
- private void SetHwndStyles(Hwnd hwnd, CreateParams cp) {
- DeriveStyles(hwnd.Handle, cp.Style, cp.ExStyle, out hwnd.border_style, out hwnd.title_style, out hwnd.caption_height, out hwnd.tool_caption_height);
- }
-
- private void SetWMStyles(Hwnd hwnd, CreateParams cp) {
- MotifWmHints mwmHints;
- MotifFunctions functions;
- MotifDecorations decorations;
- int atom_count;
- Rectangle client_rect;
-
- mwmHints = new MotifWmHints();
- functions = 0;
- decorations = 0;
-
- mwmHints.flags = (IntPtr)(MotifFlags.Functions | MotifFlags.Decorations);
- mwmHints.functions = (IntPtr)0;
- mwmHints.decorations = (IntPtr)0;
-
- if ((cp.Style & (int)WindowStyles.WS_CAPTION) != 0) {
- functions |= MotifFunctions.Move;
- decorations |= MotifDecorations.Title | MotifDecorations.Menu;
- }
-
- if ((cp.Style & ((int)WindowStyles.WS_THICKFRAME)) != 0) {
- functions |= MotifFunctions.Move | MotifFunctions.Resize;
- decorations |= MotifDecorations.Border | MotifDecorations.ResizeH;
- }
- if ((cp.Style & ((int)WindowStyles.WS_MINIMIZEBOX)) != 0) {
- functions |= MotifFunctions.Minimize;
- decorations |= MotifDecorations.Minimize;
- }
-
- if ((cp.Style & ((int)WindowStyles.WS_MAXIMIZEBOX)) != 0) {
- functions |= MotifFunctions.Maximize;
- decorations |= MotifDecorations.Maximize;
- }
-
- if ((cp.Style & ((int)WindowStyles.WS_SYSMENU)) != 0) {
- functions |= MotifFunctions.Close;
- }
-
- if ((cp.ExStyle & ((int)WindowStyles.WS_EX_DLGMODALFRAME)) != 0) {
- decorations |= MotifDecorations.Border;
- }
-
- if ((cp.Style & ((int)WindowStyles.WS_DLGFRAME)) != 0) {
- decorations |= MotifDecorations.Border;
- }
-
- if ((cp.Style & ((int)WindowStyles.WS_BORDER)) != 0) {
- decorations |= MotifDecorations.Border;
- }
-
- if ((cp.ExStyle & ((int)WindowStyles.WS_EX_TOOLWINDOW)) != 0) {
- functions = 0;
- decorations = 0;
- }
-
- if ((functions & MotifFunctions.Resize) == 0) {
- XplatUI.SetWindowMinMax(hwnd.Handle, new Rectangle(cp.X, cp.Y, cp.Width, cp.Height), new Size(cp.Width, cp.Height), new Size(cp.Width, cp.Height));
- }
-
- mwmHints.functions = (IntPtr)functions;
- mwmHints.decorations = (IntPtr)decorations;
-
- client_rect = hwnd.ClientRect;
- lock (XlibLock) {
- XChangeProperty(DisplayHandle, hwnd.whole_window, NetAtoms[(int)NA._MOTIF_WM_HINTS], NetAtoms[(int)NA._MOTIF_WM_HINTS], 32, PropertyMode.Replace, ref mwmHints, 5);
-
- if (((cp.Style & (int)WindowStyles.WS_POPUP) != 0) && (hwnd.parent != null) && (hwnd.parent.whole_window != IntPtr.Zero)) {
- XSetTransientForHint(DisplayHandle, hwnd.whole_window, hwnd.parent.whole_window);
- }
- XMoveResizeWindow(DisplayHandle, hwnd.client_window, client_rect.X, client_rect.Y, client_rect.Width, client_rect.Height);
-
- int[] atoms = new int[8];
- atom_count = 0;
-
- if ((cp.ExStyle & ((int)WindowStyles.WS_EX_TOOLWINDOW)) != 0) {
- atoms[atom_count++] = NetAtoms[(int)NA._NET_WM_STATE_NO_TASKBAR].ToInt32();
- }
- XChangeProperty(DisplayHandle, hwnd.whole_window, NetAtoms[(int)NA._NET_WM_STATE], (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, atom_count);
-
- atom_count = 0;
- IntPtr[] atom_ptrs = new IntPtr[2];
-
- atom_ptrs[atom_count++] = NetAtoms[(int)NA.WM_DELETE_WINDOW];
- if ((cp.ExStyle & (int)WindowStyles.WS_EX_CONTEXTHELP) != 0) {
- atom_ptrs[atom_count++] = NetAtoms[(int)NA._NET_WM_CONTEXT_HELP];
- }
-
- XSetWMProtocols(DisplayHandle, hwnd.whole_window, atom_ptrs, atom_count);
- }
- }
-
- private void SetIcon(Hwnd hwnd, Icon icon) {
- Bitmap bitmap;
- int size;
- uint[] data;
- int index;
-
- bitmap = icon.ToBitmap();
- index = 0;
- size = bitmap.Width * bitmap.Height + 2;
- data = new uint[size];
-
- data[index++] = (uint)bitmap.Width;
- data[index++] = (uint)bitmap.Height;
-
- for (int y = 0; y < bitmap.Height; y++) {
- for (int x = 0; x < bitmap.Width; x++) {
- data[index++] = (uint)bitmap.GetPixel(x, y).ToArgb();
- }
- }
- XChangeProperty(DisplayHandle, hwnd.whole_window, NetAtoms[(int)NA._NET_WM_ICON], (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, data, size);
- }
-
- private IntPtr ImageToPixmap(Image image) {
- return IntPtr.Zero;
- }
-
- private void WakeupMain () {
- wake.Send (new byte [] { 0xFF });
- }
-
- private void TranslatePropertyToClipboard(IntPtr property) {
- IntPtr actual_atom;
- int actual_format;
- IntPtr nitems;
- IntPtr bytes_after;
- IntPtr prop = IntPtr.Zero;
-
- Clipboard.Item = null;
-
- XGetWindowProperty(DisplayHandle, FosterParent, property, IntPtr.Zero, new IntPtr (0x7fffffff), true, (IntPtr)Atom.AnyPropertyType, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
-
- if ((long)nitems > 0) {
- if (property == (IntPtr)Atom.XA_STRING) {
- Clipboard.Item = Marshal.PtrToStringAnsi(prop);
- } else if (property == (IntPtr)Atom.XA_BITMAP) {
- // FIXME - convert bitmap to image
- } else if (property == (IntPtr)Atom.XA_PIXMAP) {
- // FIXME - convert pixmap to image
- } else if (property == NetAtoms[(int)NA.OEMTEXT]) {
- Clipboard.Item = Marshal.PtrToStringAnsi(prop);
- } else if (property == NetAtoms[(int)NA.UNICODETEXT]) {
- Clipboard.Item = Marshal.PtrToStringAnsi(prop);
- }
-
- XFree(prop);
- }
- }
-
- private void AddExpose (XEvent xevent) {
- Hwnd hwnd;
-
- hwnd = Hwnd.GetObjectFromWindow(xevent.AnyEvent.window);
-
- // Don't waste time
- if (hwnd == null) {
- return;
- }
-
- if (xevent.AnyEvent.window == hwnd.client_window) {
- hwnd.AddInvalidArea(xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
- if (!hwnd.expose_pending) {
- MessageQueue.Enqueue(xevent);
- hwnd.expose_pending = true;
- }
- } else {
- hwnd.AddNcInvalidArea (xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
-
- if (!hwnd.nc_expose_pending) {
- MessageQueue.Enqueue(xevent);
- hwnd.nc_expose_pending = true;
- }
- }
- }
-
- private void InvalidateWholeWindow(IntPtr handle) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- InvalidateWholeWindow(handle, new Rectangle(0, 0, hwnd.Width, hwnd.Height));
- }
-
- private void InvalidateWholeWindow(IntPtr handle, Rectangle rectangle) {
- Hwnd hwnd;
- XEvent xevent;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
-
- xevent = new XEvent ();
- xevent.type = XEventName.Expose;
- xevent.ExposeEvent.display = DisplayHandle;
- xevent.ExposeEvent.window = hwnd.whole_window;
-
- xevent.ExposeEvent.x = rectangle.X;
- xevent.ExposeEvent.y = rectangle.Y;
- xevent.ExposeEvent.width = rectangle.Width;
- xevent.ExposeEvent.height = rectangle.Height;
-
- AddExpose (xevent);
- }
-
- private void WholeToScreen(IntPtr handle, ref int x, ref int y) {
- int dest_x_return;
- int dest_y_return;
- IntPtr child;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- lock (XlibLock) {
- XTranslateCoordinates(DisplayHandle, hwnd.whole_window, RootWindow, x, y, out dest_x_return, out dest_y_return, out child);
- }
-
- x = dest_x_return;
- y = dest_y_return;
- }
-
- private void AbsoluteGeometry(IntPtr window, out int ret_x, out int ret_y, out int width, out int height) {
- IntPtr root;
- IntPtr win;
- IntPtr parent;
- IntPtr children;
- int x;
- int y;
- int w;
- int h;
- int absX;
- int absY;
- int b;
- int d;
- int nchildren;
-
- absX = 0;
- absY = 0;
- win = window;
- width = 0;
- height = 0;
- do {
- XGetGeometry(DisplayHandle, win, out root, out x, out y, out w, out h, out b, out d);
- if (win == window) {
- width = w;
- height = h;
- }
- absX += x;
- absY += y;
- if (XQueryTree(DisplayHandle, win, out root, out parent, out children, out nchildren) == 0) {
- break;
- }
-
- if (children != IntPtr.Zero) {
- XFree(children);
- }
- win = parent;
- } while (win != root);
-
- ret_x = absX;
- ret_y = absY;
-
-//Console.WriteLine("Absolute pos for window {0} = {1},{2} {3}x{4}", XplatUI.Window(window), ret_x, ret_y, width, height);
- }
-
- private void FrameExtents(IntPtr window, out int left, out int top) {
- IntPtr actual_atom;
- int actual_format;
- IntPtr nitems;
- IntPtr bytes_after;
- IntPtr prop = IntPtr.Zero;
-
- XGetWindowProperty(DisplayHandle, window, NetAtoms[(int)NA._NET_FRAME_EXTENTS], IntPtr.Zero, new IntPtr (16), false, (IntPtr)Atom.XA_CARDINAL, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
- if (((long)nitems == 4) && (prop != IntPtr.Zero)) {
- left = Marshal.ReadInt32(prop, 0);
- //right = Marshal.ReadInt32(prop, 4);
- top = Marshal.ReadInt32(prop, 8);
- //bottom = Marshal.ReadInt32(prop, 12);
- } else {
- left = 0;
- top = 0;
- }
-
- if (prop != IntPtr.Zero) {
- XFree(prop);
- }
- return;
- }
-
- private void AddConfigureNotify (XEvent xevent) {
- Hwnd hwnd;
-
- hwnd = Hwnd.GetObjectFromWindow(xevent.ConfigureEvent.window);
-
- // Don't waste time
- if (hwnd == null) {
- return;
- }
-
- if (xevent.ConfigureEvent.window == hwnd.whole_window) {
- if (!hwnd.reparented) {
- hwnd.x = xevent.ConfigureEvent.x;
- hwnd.y = xevent.ConfigureEvent.y;
- } else {
- // This sucks ass, part 1
- // Every WM does the ConfigureEvents of toplevel windows different, so there's
- // no standard way of getting our adjustment.
- // The code below is needed for KDE and FVWM, the 'whacky_wm' part is for metacity
- // Several other WMs do their decorations different yet again and we fail to deal
- // with that, since I couldn't find any frigging commonality between them.
- // The only sane WM seems to be KDE
-
- if (!xevent.ConfigureEvent.send_event) {
- IntPtr dummy_ptr;
-
- XTranslateCoordinates(DisplayHandle, hwnd.whole_window, RootWindow, -xevent.ConfigureEvent.x, -xevent.ConfigureEvent.y, out hwnd.x, out hwnd.y, out dummy_ptr);
- } else {
- // This is a synthetic event, coordinates are in root space
- hwnd.x = xevent.ConfigureEvent.x;
- hwnd.y = xevent.ConfigureEvent.y;
- if (hwnd.whacky_wm) {
- int frame_left;
- int frame_top;
-
- FrameExtents(hwnd.whole_window, out frame_left, out frame_top);
- hwnd.x -= frame_left;
- hwnd.y -= frame_top;
- }
- }
- }
- hwnd.width = xevent.ConfigureEvent.width;
- hwnd.height = xevent.ConfigureEvent.height;
-
- if (!hwnd.configure_pending) {
- MessageQueue.Enqueue(xevent);
- hwnd.configure_pending = true;
- }
- }
- // We drop configure events for Client windows
- }
-
- private void ShowCaret() {
- if ((Caret.gc == IntPtr.Zero) || Caret.On) {
- return;
- }
- Caret.On = true;
-
- lock (XlibLock) {
- XDrawLine(DisplayHandle, Caret.Window, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
- }
- }
-
- private void HideCaret() {
- if ((Caret.gc == IntPtr.Zero) || !Caret.On) {
- return;
- }
- Caret.On = false;
-
- lock (XlibLock) {
- XDrawLine(DisplayHandle, Caret.Window, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
- }
- }
-
- private int NextTimeout (DateTime now) {
- int timeout = Int32.MaxValue;
- lock (TimerList) {
- foreach (Timer timer in TimerList) {
- int next = (int) (timer.Expires - now).TotalMilliseconds;
- if (next < 0) {
- return 0; // Have a timer that has already expired
- }
-
- if (next < timeout) {
- timeout = next;
- }
- }
- }
- if (timeout < Timer.Minimum) {
- timeout = Timer.Minimum;
- }
-
- return timeout;
- }
-
- private void CheckTimers (DateTime now) {
- lock (TimerList) {
- int count;
-
- count = TimerList.Count;
-
- if (count == 0) {
- return;
- }
-
- for (int i = 0; i < TimerList.Count; i++) {
- Timer timer;
-
- timer = (Timer) TimerList[i];
-
- if (timer.Enabled && timer.Expires <= now) {
- timer.Update (now);
- timer.FireTick ();
- }
- }
- }
- }
-
- private void UpdateMessageQueue () {
- DateTime now;
- int pending;
-
- now = DateTime.Now;
-
- lock (XlibLock) {
- pending = XPending (DisplayHandle);
- }
-
- if (pending == 0) {
- if (Idle != null) {
- Idle (this, EventArgs.Empty);
- }
-
- lock (XlibLock) {
- pending = XPending (DisplayHandle);
- }
- }
-
- if (pending == 0) {
- int timeout;
-
- timeout = NextTimeout (now);
- if (timeout > 0) {
- #if __MonoCS__
- Syscall.poll (pollfds, (uint) pollfds.Length, timeout);
- // Clean out buffer, so we're not busy-looping on the same data
- if (pollfds[1].revents != 0) {
- wake_receive.Receive(network_buffer, 0, 1, SocketFlags.None);
- }
- #endif
- lock (XlibLock) {
- pending = XPending (DisplayHandle);
- }
- }
- }
-
- CheckTimers (now);
-
- if (pending == 0) {
- lock (XlibLock) {
- pending = XPending (DisplayHandle);
- }
- }
-
- while (pending > 0) {
- XEvent xevent = new XEvent ();
-
- lock (XlibLock) {
- XNextEvent (DisplayHandle, ref xevent);
- }
-//Console.WriteLine("Got x event {0}", xevent);
- switch (xevent.type) {
- case XEventName.Expose:
- AddExpose (xevent);
- break;
-
- case XEventName.SelectionClear: {
- // Should we do something?
- break;
- }
-
- case XEventName.SelectionRequest: {
- if (Dnd.HandleSelectionRequestEvent (ref xevent))
- break;
- XEvent sel_event;
-
- sel_event = new XEvent();
- sel_event.SelectionEvent.type = XEventName.SelectionNotify;
- sel_event.SelectionEvent.send_event = true;
- sel_event.SelectionEvent.display = DisplayHandle;
- sel_event.SelectionEvent.selection = xevent.SelectionRequestEvent.selection;
- sel_event.SelectionEvent.target = xevent.SelectionRequestEvent.target;
- sel_event.SelectionEvent.requestor = xevent.SelectionRequestEvent.requestor;
- sel_event.SelectionEvent.time = xevent.SelectionRequestEvent.time;
- sel_event.SelectionEvent.property = IntPtr.Zero;
-
- // Seems that some apps support asking for supported types
- if (xevent.SelectionEvent.target == NetAtoms[(int)NA.TARGETS]) {
- int[] atoms;
- int atom_count;
-
- atoms = new int[5];
- atom_count = 0;
-
- if (Clipboard.Item is String) {
- atoms[atom_count++] = (int)Atom.XA_STRING;
- atoms[atom_count++] = (int)NetAtoms[(int)NA.OEMTEXT];
- atoms[atom_count++] = (int)NetAtoms[(int)NA.UNICODETEXT];
- } else if (Clipboard.Item is Image) {
- atoms[atom_count++] = (int)Atom.XA_PIXMAP;
- atoms[atom_count++] = (int)Atom.XA_BITMAP;
- } else {
- // FIXME - handle other types
- }
-
- XChangeProperty(DisplayHandle, xevent.SelectionEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property, (IntPtr)xevent.SelectionRequestEvent.target, 32, PropertyMode.Replace, atoms, atom_count);
- } else if (Clipboard.Item is string) {
- IntPtr buffer;
- int buflen;
-
- buflen = 0;
-
- if (xevent.SelectionRequestEvent.target == (IntPtr)Atom.XA_STRING) {
- Byte[] bytes;
-
- bytes = new ASCIIEncoding().GetBytes((string)Clipboard.Item);
- buffer = Marshal.AllocHGlobal(bytes.Length);
- buflen = bytes.Length;
-
- for (int i = 0; i < buflen; i++) {
- Marshal.WriteByte(buffer, i, bytes[i]);
- }
- } else if (xevent.SelectionRequestEvent.target == NetAtoms[(int)NA.OEMTEXT]) {
- // FIXME - this should encode into ISO2022
- buffer = Marshal.StringToHGlobalAnsi((string)Clipboard.Item);
- while (Marshal.ReadByte(buffer, buflen) != 0) {
- buflen++;
- }
- } else if (xevent.SelectionRequestEvent.target == NetAtoms[(int)NA.UNICODETEXT]) {
- buffer = Marshal.StringToHGlobalAnsi((string)Clipboard.Item);
- while (Marshal.ReadByte(buffer, buflen) != 0) {
- buflen++;
- }
- } else {
- buffer = IntPtr.Zero;
- }
-
- if (buffer != IntPtr.Zero) {
- XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property, (IntPtr)xevent.SelectionRequestEvent.target, 8, PropertyMode.Replace, buffer, buflen);
- sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
- Marshal.FreeHGlobal(buffer);
- }
- } else if (Clipboard.Item is Image) {
- if (xevent.SelectionEvent.target == (IntPtr)Atom.XA_PIXMAP) {
- // FIXME - convert image and store as property
- } else if (xevent.SelectionEvent.target == (IntPtr)Atom.XA_PIXMAP) {
- // FIXME - convert image and store as property
- }
- }
-
- XSendEvent(DisplayHandle, xevent.SelectionRequestEvent.requestor, false, new IntPtr ((int)EventMask.NoEventMask), ref sel_event);
- break;
- }
-
- case XEventName.SelectionNotify: {
- if (Clipboard.Enumerating) {
- Clipboard.Enumerating = false;
- if (xevent.SelectionEvent.property != IntPtr.Zero) {
- XDeleteProperty(DisplayHandle, FosterParent, (IntPtr)xevent.SelectionEvent.property);
- if (!Clipboard.Formats.Contains(xevent.SelectionEvent.property)) {
- Clipboard.Formats.Add(xevent.SelectionEvent.property);
- #if DriverDebugExtra
- Console.WriteLine("Got supported clipboard atom format: {0}", xevent.SelectionEvent.property);
- #endif
- }
- }
- } else if (Clipboard.Retrieving) {
- Clipboard.Retrieving = false;
- if (xevent.SelectionEvent.property != IntPtr.Zero) {
- TranslatePropertyToClipboard(xevent.SelectionEvent.property);
- } else {
- Clipboard.Item = null;
- }
- } else {
- Dnd.HandleSelectionNotifyEvent (ref xevent);
- }
- break;
- }
-
- case XEventName.KeyPress:
- case XEventName.KeyRelease:
- case XEventName.ButtonPress:
- case XEventName.ButtonRelease:
- case XEventName.MotionNotify:
- case XEventName.EnterNotify:
- case XEventName.LeaveNotify:
- case XEventName.CreateNotify:
- case XEventName.DestroyNotify:
- case XEventName.FocusIn:
- case XEventName.FocusOut:
- case XEventName.ClientMessage:
- case XEventName.ReparentNotify:
- MessageQueue.Enqueue (xevent);
- break;
-
- case XEventName.ConfigureNotify:
- AddConfigureNotify(xevent);
- break;
-
- case XEventName.PropertyNotify:
- if (xevent.PropertyEvent.atom == NetAtoms[(int)NA._NET_ACTIVE_WINDOW]) {
- IntPtr actual_atom;
- int actual_format;
- IntPtr nitems;
- IntPtr bytes_after;
- IntPtr prop = IntPtr.Zero;
- IntPtr prev_active;;
-
- prev_active = ActiveWindow;
- XGetWindowProperty(DisplayHandle, RootWindow, NetAtoms[(int)NA._NET_ACTIVE_WINDOW], IntPtr.Zero, new IntPtr (1), false, (IntPtr)Atom.XA_WINDOW, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
- if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
- ActiveWindow = Hwnd.GetHandleFromWindow((IntPtr)Marshal.ReadInt32(prop));
- XFree(prop);
-
- if (prev_active != ActiveWindow) {
- if (prev_active != IntPtr.Zero) {
- PostMessage(prev_active, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_INACTIVE, IntPtr.Zero);
- }
- if (ActiveWindow != IntPtr.Zero) {
- PostMessage(ActiveWindow, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_ACTIVE, IntPtr.Zero);
- }
- }
- if (ModalWindows.Count == 0) {
- break;
- } else {
- // Modality handling, if we are modal and the new active window is one
- // of ours but not the modal one, switch back to the modal window
-
- if (NativeWindow.FindWindow(ActiveWindow) != null) {
- if (ActiveWindow != (IntPtr)ModalWindows.Peek()) {
- Activate((IntPtr)ModalWindows.Peek());
- }
- }
- break;
- }
- }
- }
- break;
-
- }
-
- lock (XlibLock) {
- pending = XPending (DisplayHandle);
- }
- }
- }
-
- private IntPtr GetMousewParam(int Delta) {
- int result = 0;
-
- if ((MouseState & MouseButtons.Left) != 0) {
- result |= (int)MsgButtons.MK_LBUTTON;
- }
-
- if ((MouseState & MouseButtons.Middle) != 0) {
- result |= (int)MsgButtons.MK_MBUTTON;
- }
-
- if ((MouseState & MouseButtons.Right) != 0) {
- result |= (int)MsgButtons.MK_RBUTTON;
- }
-
- Keys mods = ModifierKeys;
- if ((mods & Keys.Control) != 0) {
- result |= (int)MsgButtons.MK_CONTROL;
- }
-
- if ((mods & Keys.Shift) != 0) {
- result |= (int)MsgButtons.MK_SHIFT;
- }
-
- result |= Delta << 16;
-
- return (IntPtr)result;
- }
- private IntPtr XGetParent(IntPtr handle) {
- IntPtr Root;
- IntPtr Parent;
- IntPtr Children;
- int ChildCount;
-
- lock (XlibLock) {
- XQueryTree(DisplayHandle, handle, out Root, out Parent, out Children, out ChildCount);
- }
-
- if (Children!=IntPtr.Zero) {
- lock (XlibLock) {
- XFree(Children);
- }
- }
- return Parent;
- }
-
- private int HandleError(IntPtr display, ref XErrorEvent error_event) {
- if (ErrorExceptions) {
- throw new XException(error_event.display, error_event.resourceid, error_event.serial, error_event.error_code, error_event.request_code, error_event.minor_code);
- } else {
- Console.WriteLine("X11 Error encountered: {0}{1}\n", XException.GetMessage(error_event.display, error_event.resourceid, error_event.serial, error_event.error_code, error_event.request_code, error_event.minor_code), WhereString());
- }
- return 0;
- }
-
- private void DestroyChildWindow(Control c) {
- Hwnd hwnd;
- int i;
- Control[] controls;
-
- if (c != null) {
- controls = c.child_controls.GetAllControls ();
-
- for (i = 0; i < controls.Length; i++) {
- if (controls[i].IsHandleCreated) {
- hwnd = Hwnd.ObjectFromHandle(controls[i].Handle);
- SendMessage(controls[i].Handle, Msg.WM_DESTROY, IntPtr.Zero, IntPtr.Zero);
- hwnd.Dispose();
- }
- DestroyChildWindow(controls[i]);
- }
- }
- }
-
- #endregion // Private Methods
-
- #region Callbacks
- private void MouseHover(object sender, EventArgs e) {
- if ((HoverState.X == MousePosition.X) && (HoverState.Y == MousePosition.Y)) {
- XEvent xevent;
-
- HoverState.Timer.Enabled = false;
-
- 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);
-
- MessageQueue.EnqueueLocked (xevent);
-
- WakeupMain ();
- }
- }
- }
-
- private void CaretCallback(object sender, EventArgs e) {
- if (Caret.Paused) {
- return;
- }
- Caret.On = !Caret.On;
-
- XDrawLine(DisplayHandle, Caret.Hwnd, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
- }
- #endregion // Callbacks
-
- #region Public Properties
-
- internal override int Caption {
- get {
- return 19;
- }
- }
-
- internal override Size CursorSize {
- get {
- int x;
- int y;
-
- if (XQueryBestCursor(DisplayHandle, RootWindow, 32, 32, out x, out y) != 0) {
- return new Size(x, y);
- } else {
- return new Size(16, 16);
- }
- }
- }
-
- internal override bool DragFullWindows {
- get {
- return true;
- }
- }
-
- internal override Size DragSize {
- get {
- return new Size(4, 4);
- }
- }
-
- internal override Size FrameBorderSize {
- get {
- throw new NotImplementedException();
- }
- }
-
- internal override Size IconSize {
- get {
- IntPtr list;
- XIconSize size;
- int count;
-
- if (XGetIconSizes(DisplayHandle, RootWindow, out list, out count) != 0) {
- long current;
- int largest;
-
- current = (long)list;
- largest = 0;
-
- size = new XIconSize();
-
- for (int i = 0; i < count; i++) {
- size = (XIconSize)Marshal.PtrToStructure((IntPtr)current, size.GetType());
- current += Marshal.SizeOf(size);
-
- // Look for our preferred size
- if (size.min_width == 32) {
- XFree(list);
- return new Size(32, 32);
- }
-
- if (size.max_width == 32) {
- XFree(list);
- return new Size(32, 32);
- }
-
- if (size.min_width < 32 && size.max_width > 32) {
- int x;
-
- // check if we can fit one
- x = size.min_width;
- while (x < size.max_width) {
- x += size.width_inc;
- if (x == 32) {
- XFree(list);
- return new Size(32, 32);
- }
- }
- }
-
- if (largest < size.max_width) {
- largest = size.max_width;
- }
- }
-
- // We didn't find a match or we wouldn't be here
- return new Size(largest, largest);
-
- } else {
- return new Size(32, 32);
- }
- }
- }
-
- internal override int KeyboardSpeed {
- get{
- //
- // A lot harder: need to do:
- // XkbQueryExtension(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 1
- // XkbAllocKeyboard(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 0x080517a8
- // XkbGetControls(0x08051008, 1, 0x080517a8, 0xbfffdf54, 0xbfffdf58) = 0
- //
- // And from that we can tell the repetition rate
- //
- // Notice, the values must map to:
- // [0, 31] which maps to 2.5 to 30 repetitions per second.
- //
- return 0;
- }
- }
-
- internal override int KeyboardDelay {
- get {
- //
- // Return values must range from 0 to 4, 0 meaning 250ms,
- // and 4 meaning 1000 ms.
- //
- return 1; // ie, 500 ms
- }
- }
-
- internal override Size MaxWindowTrackSize {
- get {
- return new Size (WorkingArea.Width, WorkingArea.Height);
- }
- }
-
- internal override Size MinimizedWindowSize {
- get {
- return new Size(1, 1);
- }
- }
-
- internal override Size MinimizedWindowSpacingSize {
- get {
- return new Size(1, 1);
- }
- }
-
- internal override Size MinimumWindowSize {
- get {
- return new Size(1, 1);
- }
- }
-
- internal override Size MinWindowTrackSize {
- get {
- return new Size(1, 1);
- }
- }
-
- internal override Keys ModifierKeys {
- get {
- return Keyboard.ModifierKeys;
- }
- }
-
- internal override Size SmallIconSize {
- get {
- IntPtr list;
- XIconSize size;
- int count;
-
- if (XGetIconSizes(DisplayHandle, RootWindow, out list, out count) != 0) {
- long current;
- int smallest;
-
- current = (long)list;
- smallest = 0;
-
- size = new XIconSize();
-
- for (int i = 0; i < count; i++) {
- size = (XIconSize)Marshal.PtrToStructure((IntPtr)current, size.GetType());
- current += Marshal.SizeOf(size);
-
- // Look for our preferred size
- if (size.min_width == 16) {
- XFree(list);
- return new Size(16, 16);
- }
-
- if (size.max_width == 16) {
- XFree(list);
- return new Size(16, 16);
- }
-
- if (size.min_width < 16 && size.max_width > 16) {
- int x;
-
- // check if we can fit one
- x = size.min_width;
- while (x < size.max_width) {
- x += size.width_inc;
- if (x == 16) {
- XFree(list);
- return new Size(16, 16);
- }
- }
- }
-
- if (smallest == 0 || smallest > size.min_width) {
- smallest = size.min_width;
- }
- }
-
- // We didn't find a match or we wouldn't be here
- return new Size(smallest, smallest);
-
- } else {
- return new Size(16, 16);
- }
- }
- }
-
- internal override int MouseButtonCount {
- get {
- return 3;
- }
- }
-
- internal override bool MouseButtonsSwapped {
- get {
- return false; // FIXME - how to detect?
- }
- }
-
- internal override bool MouseWheelPresent {
- get {
- return true; // FIXME - how to detect?
- }
- }
-
- internal override Rectangle VirtualScreen {
- get {
- return WorkingArea;
- }
- }
-
- internal override Rectangle WorkingArea {
- get {
- IntPtr actual_atom;
- int actual_format;
- IntPtr nitems;
- IntPtr bytes_after;
- IntPtr prop = IntPtr.Zero;
- int width;
- int height;
-
- XGetWindowProperty(DisplayHandle, RootWindow, NetAtoms[(int)NA._NET_DESKTOP_GEOMETRY], IntPtr.Zero, new IntPtr (256), false, (IntPtr)Atom.XA_CARDINAL, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
- if (((long)nitems == 2) && (prop != IntPtr.Zero) && IntPtr.Size == 4) {
- width = Marshal.ReadInt32(prop, 0);
- height = Marshal.ReadInt32(prop, 4);
-
- XFree(prop);
- return new Rectangle(0, 0, width, height);
- } else {
- XWindowAttributes attributes=new XWindowAttributes();
-
- lock (XlibLock) {
- XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
- }
-
- return new Rectangle(0, 0, attributes.width, attributes.height);
- }
- }
- }
- #endregion // Public properties
-
- #region Public Static Methods
- internal override IntPtr InitializeDriver() {
- lock (this) {
- if (DisplayHandle==IntPtr.Zero) {
- SetDisplay(XOpenDisplay(IntPtr.Zero));
- }
- }
- return IntPtr.Zero;
- }
-
- internal override void ShutdownDriver(IntPtr token) {
- lock (this) {
- if (DisplayHandle!=IntPtr.Zero) {
- XCloseDisplay(DisplayHandle);
- DisplayHandle=IntPtr.Zero;
- }
- }
- }
-
- internal override void EnableThemes() {
- ThemesEnabled = true;
- }
-
-
- internal override void Activate(IntPtr handle) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (hwnd != null) lock (XlibLock) {
- SendNetWMMessage(hwnd.whole_window, NetAtoms[(int)NA._NET_ACTIVE_WINDOW], IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
- //XRaiseWindow(DisplayHandle, handle);
- }
- return;
- }
-
- internal override void AudibleAlert() {
- XBell(DisplayHandle, 0);
- return;
- }
-
-
- internal override void CaretVisible(IntPtr handle, bool visible) {
- // Visible is cumulative; two hides require two shows before the caret is visible again
- if (Caret.Hwnd == handle) {
- if (visible) {
- if (Caret.Visible < 1) {
- Caret.Visible++;
- Caret.On = false;
- if (Caret.Visible == 1) {
- ShowCaret();
- Caret.Timer.Start();
- }
- }
- } else {
- Caret.Visible--;
- if (Caret.Visible == 0) {
- Caret.Timer.Stop();
- HideCaret();
- }
- }
- }
- }
-
- internal override bool CalculateWindowRect(IntPtr handle, ref Rectangle ClientRect, int Style, int ExStyle, Menu menu, out Rectangle WindowRect) {
- FormBorderStyle border_style;
- TitleStyle title_style;
- int caption_height;
- int tool_caption_height;
-
- DeriveStyles(handle, Style, ExStyle, out border_style, out title_style,
- out caption_height, out tool_caption_height);
-
- WindowRect = Hwnd.GetWindowRectangle(border_style, menu, title_style,
- caption_height, tool_caption_height,
- ClientRect);
-
- return true;
- }
-
- internal override void ClientToScreen(IntPtr handle, ref int x, ref int y) {
- int dest_x_return;
- int dest_y_return;
- IntPtr child;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- lock (XlibLock) {
- XTranslateCoordinates(DisplayHandle, hwnd.client_window, RootWindow, x, y, out dest_x_return, out dest_y_return, out child);
- }
-
- x = dest_x_return;
- y = dest_y_return;
- }
-
- internal override int[] ClipboardAvailableFormats(IntPtr handle) {
- DataFormats.Format f;
- int[] result;
-
- f = DataFormats.Format.List;
-
- if (XGetSelectionOwner(DisplayHandle, NetAtoms[(int)NA.CLIPBOARD]) == IntPtr.Zero) {
- return null;
- }
-
- Clipboard.Formats = new ArrayList();
-
- while (f != null) {
- XConvertSelection(DisplayHandle, NetAtoms[(int)NA.CLIPBOARD], (IntPtr)f.Id, (IntPtr)f.Id, FosterParent, IntPtr.Zero);
-
- Clipboard.Enumerating = true;
- while (Clipboard.Enumerating) {
- UpdateMessageQueue();
- }
- f = f.Next;
- }
-
- result = new int[Clipboard.Formats.Count];
-
- for (int i = 0; i < Clipboard.Formats.Count; i++) {
- result[i] = (int)Clipboard.Formats[i];
- }
-
- Clipboard.Formats = null;
- return result;
- }
-
- internal override void ClipboardClose(IntPtr handle) {
- if (handle != ClipMagic) {
- throw new ArgumentException("handle is not a valid clipboard handle");
- }
- return;
- }
-
- internal override int ClipboardGetID(IntPtr handle, string format) {
- if (handle != ClipMagic) {
- throw new ArgumentException("handle is not a valid clipboard handle");
- }
-
- if (format == "Text" ) return (int)Atom.XA_STRING;
- else if (format == "Bitmap" ) return (int)Atom.XA_BITMAP;
- //else if (format == "MetaFilePict" ) return 3;
- //else if (format == "SymbolicLink" ) return 4;
- //else if (format == "DataInterchangeFormat" ) return 5;
- //else if (format == "Tiff" ) return 6;
- else if (format == "OEMText" ) return XInternAtom(DisplayHandle, "COMPOUND_TEXT", false).ToInt32();
- else if (format == "DeviceIndependentBitmap" ) return (int)Atom.XA_PIXMAP;
- else if (format == "Palette" ) return (int)Atom.XA_COLORMAP; // Useless
- //else if (format == "PenData" ) return 10;
- //else if (format == "RiffAudio" ) return 11;
- //else if (format == "WaveAudio" ) return 12;
- else if (format == "UnicodeText" ) return XInternAtom(DisplayHandle, "UTF8_STRING", false).ToInt32();
- //else if (format == "EnhancedMetafile" ) return 14;
- //else if (format == "FileDrop" ) return 15;
- //else if (format == "Locale" ) return 16;
-
- return XInternAtom(DisplayHandle, format, false).ToInt32();
- }
-
- internal override IntPtr ClipboardOpen() {
- return ClipMagic;
- }
-
- internal override object ClipboardRetrieve(IntPtr handle, int type, XplatUI.ClipboardToObject converter) {
- XConvertSelection(DisplayHandle, NetAtoms[(int)NA.CLIPBOARD], (IntPtr)type, (IntPtr)type, FosterParent, IntPtr.Zero);
-
- Clipboard.Retrieving = true;
- while (Clipboard.Retrieving) {
- UpdateMessageQueue();
- }
-
- return Clipboard.Item;
- }
-
- internal override void ClipboardStore(IntPtr handle, object obj, int type, XplatUI.ObjectToClipboard converter) {
- Clipboard.Item = obj;
- Clipboard.Type = type;
- Clipboard.Converter = converter;
-
- if (obj != null) {
- XSetSelectionOwner(DisplayHandle, NetAtoms[(int)NA.CLIPBOARD], FosterParent, IntPtr.Zero);
- } else {
- // Clearing the selection
- XSetSelectionOwner(DisplayHandle, NetAtoms[(int)NA.CLIPBOARD], IntPtr.Zero, IntPtr.Zero);
- }
- }
-
- internal override void CreateCaret(IntPtr handle, int width, int height) {
- XGCValues gc_values;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (Caret.Hwnd != IntPtr.Zero) {
- DestroyCaret(Caret.Hwnd);
- }
-
- Caret.Hwnd = handle;
- Caret.Window = hwnd.client_window;
- Caret.Width = width;
- Caret.Height = height;
- Caret.Visible = 0;
- Caret.On = false;
-
- gc_values = new XGCValues();
- gc_values.line_width = width;
-
- Caret.gc = XCreateGC(DisplayHandle, Caret.Window, new IntPtr ((int)GCFunction.GCLineWidth), ref gc_values);
- if (Caret.gc == IntPtr.Zero) {
- Caret.Hwnd = IntPtr.Zero;
- return;
- }
-
- XSetFunction(DisplayHandle, Caret.gc, GXFunction.GXinvert);
- }
-
- internal override IntPtr CreateWindow(CreateParams cp) {
- XSetWindowAttributes Attributes;
- Hwnd hwnd;
- int X;
- int Y;
- int Width;
- int Height;
- IntPtr ParentHandle;
- IntPtr WholeWindow;
- IntPtr ClientWindow;
- Rectangle ClientRect;
- SetWindowValuemask ValueMask;
-
-
- hwnd = new Hwnd();
-
- Attributes = new XSetWindowAttributes();
- X = cp.X;
- Y = cp.Y;
- Width = cp.Width;
- Height = cp.Height;
-
- if (Width<1) Width=1;
- if (Height<1) Height=1;
-
- if (cp.Parent != IntPtr.Zero) {
- ParentHandle = Hwnd.ObjectFromHandle(cp.Parent).client_window;
- } else {
- if ((cp.Style & (int)WindowStyles.WS_CHILD) != 0) {
- // We need to use our foster parent window until this poor child gets it's parent assigned
- ParentHandle=FosterParent;
- } else if ((cp.Style & (int)WindowStyles.WS_POPUP) != 0) {
- ParentHandle=RootWindow;
- } else {
- // Default position on screen, if window manager doesn't place us somewhere else
- if (X<1) X = 50;
- if (Y<1) Y = 50;
- ParentHandle=RootWindow;
- }
- }
-
- ValueMask = SetWindowValuemask.BitGravity | SetWindowValuemask.WinGravity;
-
- Attributes.bit_gravity = Gravity.NorthWestGravity;
- Attributes.win_gravity = Gravity.NorthWestGravity;
-
- // Save what's under the toolwindow
- if ((cp.ExStyle & (int)WindowStyles.WS_EX_TOOLWINDOW) != 0) {
- Attributes.save_under = true;
- ValueMask |= SetWindowValuemask.SaveUnder;
- }
-
-
- // If we're a popup without caption we override the WM
- if ((cp.Style & ((int)WindowStyles.WS_POPUP)) != 0) {
- if ((cp.Style & (int)WindowStyles.WS_CAPTION) == 0) {
- Attributes.override_redirect = true;
- ValueMask |= SetWindowValuemask.OverrideRedirect;
- }
- }
-
- hwnd.x = X;
- hwnd.y = Y;
- hwnd.width = Width;
- hwnd.height = Height;
- hwnd.parent = Hwnd.ObjectFromHandle(cp.Parent);
-
- if ((cp.Style & ((int)WindowStyles.WS_DISABLED)) != 0) {
- hwnd.enabled = false;
- }
-
- ClientRect = hwnd.ClientRect;
- ClientWindow = IntPtr.Zero;
-
- lock (XlibLock) {
- WholeWindow = XCreateWindow(DisplayHandle, ParentHandle, X, Y, Width, Height, 0, (int)CreateWindowArgs.CopyFromParent, (int)CreateWindowArgs.InputOutput, IntPtr.Zero, new UIntPtr ((uint)ValueMask), ref Attributes);
- if (WholeWindow != IntPtr.Zero) {
- ValueMask &= ~(SetWindowValuemask.OverrideRedirect | SetWindowValuemask.SaveUnder);
-
- if (CustomVisual != IntPtr.Zero && CustomColormap != IntPtr.Zero) {
- ValueMask = SetWindowValuemask.ColorMap;
- Attributes.colormap = CustomColormap;
- }
- ClientWindow = XCreateWindow(DisplayHandle, WholeWindow, ClientRect.X, ClientRect.Y, ClientRect.Width, ClientRect.Height, 0, (int)CreateWindowArgs.CopyFromParent, (int)CreateWindowArgs.InputOutput, CustomVisual, new UIntPtr ((uint)ValueMask), ref Attributes);
- }
- }
-
- if ((WholeWindow == IntPtr.Zero) || (ClientWindow == IntPtr.Zero)) {
- throw new Exception("Could not create X11 windows");
- }
-
- hwnd.WholeWindow = WholeWindow;
- hwnd.ClientWindow = ClientWindow;
-
- #if DriverDebug
- Console.WriteLine("Created window {0:X} / {1:X} parent {2:X}", ClientWindow.ToInt32(), WholeWindow.ToInt32(), hwnd.parent != null ? hwnd.parent.Handle.ToInt32() : 0);
- #endif
-
- lock (XlibLock) {
- XSelectInput(DisplayHandle, hwnd.whole_window, new IntPtr ((int)SelectInputMask));
- XSelectInput(DisplayHandle, hwnd.client_window, new IntPtr ((int)SelectInputMask));
-
- if ((cp.Style & (int)WindowStyles.WS_VISIBLE) != 0) {
- XMapWindow(DisplayHandle, hwnd.whole_window);
- XMapWindow(DisplayHandle, hwnd.client_window);
- hwnd.visible = true;
- }
- }
-
- if ((cp.ExStyle & (int) WindowStyles.WS_EX_TOPMOST) != 0) {
- Console.WriteLine ("Setting transient: " + XSetTransientForHint (DisplayHandle, hwnd.whole_window, RootWindow));
- }
-
- SetWMStyles(hwnd, cp);
-
- if ((cp.Style & (int)WindowStyles.WS_MINIMIZE) != 0) {
- SetWindowState(hwnd.Handle, FormWindowState.Minimized);
- } else if ((cp.Style & (int)WindowStyles.WS_MAXIMIZE) != 0) {
- SetWindowState(hwnd.Handle, FormWindowState.Maximized);
- }
-
- // for now make all windows dnd enabled
- Dnd.SetAllowDrop (hwnd, true);
-
- // Set caption/window title
- Text(hwnd.Handle, cp.Caption);
-
- return hwnd.Handle;
- }
-
- internal override IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height) {
- CreateParams create_params = new CreateParams();
-
- create_params.Caption = "";
- create_params.X = X;
- create_params.Y = Y;
- create_params.Width = Width;
- create_params.Height = Height;
-
- create_params.ClassName=XplatUI.DefaultClassName;
- create_params.ClassStyle = 0;
- create_params.ExStyle=0;
- create_params.Parent=IntPtr.Zero;
- create_params.Param=0;
-
- return CreateWindow(create_params);
- }
-
- internal override IntPtr DefineCursor(Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot) {
- IntPtr cursor;
- Bitmap cursor_bitmap;
- Bitmap cursor_mask;
- Byte[] cursor_bits;
- Byte[] mask_bits;
- Color c_pixel;
- Color m_pixel;
- int width;
- int height;
- IntPtr cursor_pixmap;
- IntPtr mask_pixmap;
- XColor fg;
- XColor bg;
- bool and;
- bool xor;
-
- if (XQueryBestCursor(DisplayHandle, RootWindow, bitmap.Width, bitmap.Height, out width, out height) == 0) {
- return IntPtr.Zero;
- }
-
- // Win32 only allows creation cursors of a certain size
- if ((bitmap.Width != width) || (bitmap.Width != height)) {
- cursor_bitmap = new Bitmap(bitmap, new Size(width, height));
- cursor_mask = new Bitmap(mask, new Size(width, height));
- } else {
- cursor_bitmap = bitmap;
- cursor_mask = mask;
- }
-
- width = cursor_bitmap.Width;
- height = cursor_bitmap.Height;
-
- cursor_bits = new Byte[(width / 8) * height];
- mask_bits = new Byte[(width / 8) * height];
-
- for (int y = 0; y < height; y++) {
- for (int x = 0; x < width; x++) {
- c_pixel = cursor_bitmap.GetPixel(x, y);
- m_pixel = cursor_mask.GetPixel(x, y);
-
- and = c_pixel == cursor_pixel;
- xor = m_pixel == mask_pixel;
-
- if (!and && !xor) {
- // Black
- // cursor_bits[y * width / 8 + x / 8] &= (byte)~((1 << (x % 8))); // The bit already is 0
- mask_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
- } else if (and && !xor) {
- // White
- cursor_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
- mask_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
-#if notneeded
- } else if (and && !xor) {
- // Screen
- } else if (and && xor) {
- // Inverse Screen
-
- // X11 doesn't know the 'reverse screen' concept, so we'll treat them the same
- // we want both to be 0 so nothing to be done
- //cursor_bits[y * width / 8 + x / 8] &= (byte)~((1 << (x % 8)));
- //mask_bits[y * width / 8 + x / 8] |= (byte)(01 << (x % 8));
-#endif
- }
- }
- }
-
- cursor_pixmap = XCreatePixmapFromBitmapData(DisplayHandle, RootWindow, cursor_bits, width, height, (IntPtr)1, (IntPtr)0, 1);
- mask_pixmap = XCreatePixmapFromBitmapData(DisplayHandle, RootWindow, mask_bits, width, height, (IntPtr)1, (IntPtr)0, 1);
- fg = new XColor();
- bg = new XColor();
-
- fg.pixel = XWhitePixel(DisplayHandle, ScreenNo);
- fg.red = (ushort)65535;
- fg.green = (ushort)65535;
- fg.blue = (ushort)65535;
-
- bg.pixel = XBlackPixel(DisplayHandle, ScreenNo);
-
- cursor = XCreatePixmapCursor(DisplayHandle, cursor_pixmap, mask_pixmap, ref fg, ref bg, xHotSpot, yHotSpot);
-
- XFreePixmap(DisplayHandle, cursor_pixmap);
- XFreePixmap(DisplayHandle, mask_pixmap);
-
- return cursor;
- }
-
- internal override IntPtr DefineStdCursor(StdCursor id) {
- CursorFontShape shape;
- IntPtr cursor;
-
- // FIXME - define missing shapes
-
- switch (id) {
- case StdCursor.AppStarting: {
- shape = CursorFontShape.XC_watch;
- break;
- }
-
- case StdCursor.Arrow: {
- return IntPtr.Zero;
- }
-
- case StdCursor.Cross: {
- shape = CursorFontShape.XC_crosshair;
- break;
- }
-
- case StdCursor.Default: {
- return IntPtr.Zero;
- }
-
- case StdCursor.Hand: {
- shape = CursorFontShape.XC_hand1;
- break;
- }
-
- case StdCursor.Help: {
- shape = CursorFontShape.XC_question_arrow;
- break;
- }
-
- case StdCursor.HSplit: {
- shape = CursorFontShape.XC_sb_v_double_arrow;
- break;
- }
-
- case StdCursor.IBeam: {
- shape = CursorFontShape.XC_xterm;
- break;
- }
-
- case StdCursor.No: {
- shape = CursorFontShape.XC_circle;
- break;
- }
-
- case StdCursor.NoMove2D: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.NoMoveHoriz: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.NoMoveVert: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanEast: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanNE: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanNorth: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanNW: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanSE: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanSouth: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanSW: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.PanWest: {
- shape = CursorFontShape.XC_sizing;
- break;
- }
-
- case StdCursor.SizeAll: {
- shape = CursorFontShape.XC_fleur;
- break;
- }
-
- case StdCursor.SizeNESW: {
- shape = CursorFontShape.XC_top_right_corner;
- break;
- }
-
- case StdCursor.SizeNS: {
- shape = CursorFontShape.XC_sb_v_double_arrow;
- break;
- }
-
- case StdCursor.SizeNWSE: {
- shape = CursorFontShape.XC_top_left_corner;
- break;
- }
-
- case StdCursor.SizeWE: {
- shape = CursorFontShape.XC_sb_h_double_arrow;
- break;
- }
-
- case StdCursor.UpArrow: {
- shape = CursorFontShape.XC_center_ptr;
- break;
- }
-
- case StdCursor.VSplit: {
- shape = CursorFontShape.XC_sb_h_double_arrow;
- break;
- }
-
- case StdCursor.WaitCursor: {
- shape = CursorFontShape.XC_watch;
- break;
- }
-
- default: {
- return IntPtr.Zero;
- }
- }
-
- lock (XlibLock) {
- cursor = XCreateFontCursor(DisplayHandle, shape);
- }
- return cursor;
- }
-
- internal override IntPtr DefWndProc(ref Message msg) {
- switch ((Msg)msg.Msg) {
- case Msg.WM_SETCURSOR: {
- Hwnd hwnd;
- // Pass to parent window first
- hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
- while ((hwnd.parent != null) && (msg.Result == IntPtr.Zero)) {
- hwnd = hwnd.parent;
- NativeWindow.WndProc(hwnd.Handle, Msg.WM_SETCURSOR, msg.HWnd, msg.LParam);
- }
-
- if (msg.Result == IntPtr.Zero) {
- IntPtr handle;
-
- switch((HitTest)(msg.LParam.ToInt32() & 0xffff)) {
- case HitTest.HTBOTTOM: handle = Cursors.SizeNS.handle; break;
- case HitTest.HTBORDER: handle = Cursors.SizeNS.handle; break;
- case HitTest.HTBOTTOMLEFT: handle = Cursors.SizeNESW.handle; break;
- case HitTest.HTBOTTOMRIGHT: handle = Cursors.SizeNWSE.handle; break;
- case HitTest.HTERROR: if ((msg.LParam.ToInt32() >> 16) == (int)Msg.WM_LBUTTONDOWN) {
- AudibleAlert();
- }
- handle = Cursors.Default.handle;
- break;
-
- case HitTest.HTHELP: handle = Cursors.Help.handle; break;
- case HitTest.HTLEFT: handle = Cursors.SizeWE.handle; break;
- case HitTest.HTRIGHT: handle = Cursors.SizeWE.handle; break;
- case HitTest.HTTOP: handle = Cursors.SizeNS.handle; break;
- case HitTest.HTTOPLEFT: handle = Cursors.SizeNWSE.handle; break;
- case HitTest.HTTOPRIGHT: handle = Cursors.SizeNESW.handle; break;
-
- #if SameAsDefault
- case HitTest.HTGROWBOX:
- case HitTest.HTSIZE:
- case HitTest.HTZOOM:
- case HitTest.HTVSCROLL:
- case HitTest.HTSYSMENU:
- case HitTest.HTREDUCE:
- case HitTest.HTNOWHERE:
- case HitTest.HTMAXBUTTON:
- case HitTest.HTMINBUTTON:
- case HitTest.HTMENU:
- case HitTest.HSCROLL:
- case HitTest.HTBOTTOM:
- case HitTest.HTCAPTION:
- case HitTest.HTCLIENT:
- case HitTest.HTCLOSE:
- #endif
- default: handle = Cursors.Default.handle; break;
- }
- SetCursor(msg.HWnd, handle);
- }
- return (IntPtr)1;
- }
- }
- return IntPtr.Zero;
- }
-
- internal override void DestroyCaret(IntPtr handle) {
- if (Caret.Hwnd == handle) {
- if (Caret.Visible == 1) {
- Caret.Timer.Stop();
- HideCaret();
- }
- if (Caret.gc != IntPtr.Zero) {
- XFreeGC(DisplayHandle, Caret.gc);
- Caret.gc = IntPtr.Zero;
- }
- Caret.Hwnd = IntPtr.Zero;
- Caret.Visible = 0;
- Caret.On = false;
- }
- }
-
- internal override void DestroyCursor(IntPtr cursor) {
- lock (XlibLock) {
- XFreeCursor(DisplayHandle, cursor);
- }
- }
-
- internal override void DestroyWindow(IntPtr handle) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (hwnd == null) {
- #if DriverDebug
- Console.WriteLine("window {0:X} already destroyed", handle.ToInt32());
- #endif
- return;
- }
-
- #if DriverDebug
- Console.WriteLine("Destroying window {0:X}", handle.ToInt32());
- #endif
-
- // Make sure if the caret is in the window, that we destroy the caret, too
- if (Caret.Hwnd == hwnd.client_window) {
- DestroyCaret(handle);
- }
-
- // Mark our children as gone as well
- DestroyChildWindow(Control.ControlNativeWindow.ControlFromHandle(handle));
-
- // Send destroy message
- SendMessage(handle, Msg.WM_DESTROY, IntPtr.Zero, IntPtr.Zero);
-
- lock (XlibLock) {
- if (hwnd.client_window != IntPtr.Zero) {
- XDestroyWindow(DisplayHandle, hwnd.client_window);
- }
-
- if ((hwnd.whole_window != IntPtr.Zero) && (hwnd.whole_window != hwnd.client_window)) {
- XDestroyWindow(DisplayHandle, hwnd.whole_window);
- }
- }
- hwnd.Dispose();
- }
-
- internal override IntPtr DispatchMessage(ref MSG msg) {
- return NativeWindow.WndProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
- }
-
- internal override void DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width) {
- Hwnd hwnd;
- XGCValues gc_values;
- IntPtr gc;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- gc_values = new XGCValues();
-
- gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
- gc_values.line_width = line_width;
- gc_values.foreground = XBlackPixel(DisplayHandle, ScreenNo);
-
- // This logic will give us true rubber bands: (libsx, SANE_XOR)
- //mask = foreground ^ background;
- //XSetForeground(DisplayHandle, gc, 0xffffffff);
- //XSetBackground(DisplayHandle, gc, background);
- //XSetFunction(DisplayHandle, gc, GXxor);
- //XSetPlaneMask(DisplayHandle, gc, mask);
-
-
- gc = XCreateGC(DisplayHandle, hwnd.client_window, new IntPtr ((int) (GCFunction.GCSubwindowMode | GCFunction.GCLineWidth | GCFunction.GCForeground)), ref gc_values);
- uint foreground;
- uint background;
-
- Control control;
- control = Control.FromHandle(handle);
-
- XColor xcolor = new XColor();
-
- xcolor.red = (ushort)(control.ForeColor.R * 257);
- xcolor.green = (ushort)(control.ForeColor.G * 257);
- xcolor.blue = (ushort)(control.ForeColor.B * 257);
- XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
- foreground = (uint)xcolor.pixel.ToInt32();
-
- xcolor.red = (ushort)(control.BackColor.R * 257);
- xcolor.green = (ushort)(control.BackColor.G * 257);
- xcolor.blue = (ushort)(control.BackColor.B * 257);
- XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
- background = (uint)xcolor.pixel.ToInt32();
-
- uint mask = foreground ^ background;
-
- XSetForeground(DisplayHandle, gc, (UIntPtr)0xffffffff);
- XSetBackground(DisplayHandle, gc, (UIntPtr)background);
- XSetFunction(DisplayHandle, gc, GXFunction.GXxor);
- XSetPlaneMask(DisplayHandle, gc, (IntPtr)mask);
-
- if ((rect.Width > 0) && (rect.Height > 0)) {
- XDrawRectangle(DisplayHandle, hwnd.client_window, gc, rect.Left, rect.Top, rect.Width, rect.Height);
- } else {
- if (rect.Width > 0) {
- XDrawLine(DisplayHandle, hwnd.client_window, gc, rect.X, rect.Y, rect.Right, rect.Y);
- } else {
- XDrawLine(DisplayHandle, hwnd.client_window, gc, rect.X, rect.Y, rect.X, rect.Bottom);
- }
- }
- XFreeGC(DisplayHandle, gc);
- }
-
- internal override void DoEvents() {
- MSG msg = new MSG ();
-
- if (OverrideCursorHandle != IntPtr.Zero) {
- OverrideCursorHandle = IntPtr.Zero;
- }
-
- while (PeekMessage(ref msg, IntPtr.Zero, 0, 0, (uint)PeekMessageFlags.PM_REMOVE)) {
- TranslateMessage (ref msg);
- DispatchMessage (ref msg);
- }
- }
-
- internal override void EnableWindow(IntPtr handle, bool Enable) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- if (hwnd != null) {
- hwnd.Enabled = Enable;
- }
- }
-
- internal override void EndLoop(Thread thread) {
- // This is where we one day will shut down the loop for the thread
- }
-
-
- internal override IntPtr GetActive() {
- IntPtr actual_atom;
- int actual_format;
- IntPtr nitems;
- IntPtr bytes_after;
- IntPtr prop = IntPtr.Zero;
- IntPtr active = IntPtr.Zero;
-
- XGetWindowProperty(DisplayHandle, RootWindow, NetAtoms[(int)NA._NET_ACTIVE_WINDOW], IntPtr.Zero, new IntPtr (1), false, (IntPtr)Atom.XA_WINDOW, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
- if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
- active = (IntPtr)Marshal.ReadInt32(prop);
- XFree(prop);
- }
-
- if (active != IntPtr.Zero) {
- Hwnd hwnd;
-
- hwnd = Hwnd.GetObjectFromWindow(active);
- if (hwnd != null) {
- active = hwnd.Handle;
- } else {
- active = IntPtr.Zero;
- }
- }
- return active;
- }
-
- internal override void GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y) {
- throw new NotImplementedException ();
- }
-
- internal override void GetDisplaySize(out Size size) {
- XWindowAttributes attributes=new XWindowAttributes();
-
- lock (XlibLock) {
- // FIXME - use _NET_WM messages instead?
- XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
- }
-
- size = new Size(attributes.width, attributes.height);
- }
-
- internal override SizeF GetAutoScaleSize(Font font) {
- Graphics g;
- float width;
- string magic_string = "The quick brown fox jumped over the lazy dog.";
- double magic_number = 44.549996948242189;
-
- g = Graphics.FromHwnd(FosterParent);
-
- width = (float) (g.MeasureString (magic_string, font).Width / magic_number);
- return new SizeF(width, font.Height);
- }
-
- internal override IntPtr GetParent(IntPtr handle) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- if (hwnd != null && hwnd.parent != null) {
- return hwnd.parent.Handle;
- }
- return IntPtr.Zero;
- }
-
- internal override void GetCursorPos(IntPtr handle, out int x, out int y) {
- IntPtr use_handle;
- IntPtr root;
- IntPtr child;
- int root_x;
- int root_y;
- int win_x;
- int win_y;
- int keys_buttons;
-
- if (handle != IntPtr.Zero) {
- use_handle = Hwnd.ObjectFromHandle(handle).client_window;
- } else {
- use_handle = RootWindow;
- }
-
- lock (XlibLock) {
- XQueryPointer(DisplayHandle, use_handle, out root, out child, out root_x, out root_y, out win_x, out win_y, out keys_buttons);
- }
-
- if (handle != IntPtr.Zero) {
- x = win_x;
- y = win_y;
- } else {
- x = root_x;
- y = root_y;
- }
- }
-
- internal override bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent) {
- return GetFontMetrics(g.GetHdc(), font.ToHfont(), out ascent, out descent);
- }
-
- internal override Point GetMenuOrigin(IntPtr handle) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (hwnd != null) {
- return hwnd.MenuOrigin;
- }
- return Point.Empty;
- }
-
- internal override bool GetMessage(ref MSG msg, IntPtr handle, int wFilterMin, int wFilterMax) {
- XEvent xevent;
- bool client;
- Hwnd hwnd;
-
- ProcessNextMessage:
-
- if (MessageQueue.Count > 0) {
- xevent = (XEvent) MessageQueue.Dequeue ();
- } else {
- UpdateMessageQueue ();
-
- if (MessageQueue.Count > 0) {
- xevent = (XEvent) MessageQueue.Dequeue ();
- } else {
- if (!PostQuitState) {
- msg.hwnd= IntPtr.Zero;
- msg.message = Msg.WM_ENTERIDLE;
- return true;
- }
-
- // We reset ourselves so GetMessage can be called again
- PostQuitState = false;
-
- return false;
- }
- }
-
- // FIXME - handle filtering
-
- hwnd = Hwnd.GetObjectFromWindow(xevent.AnyEvent.window);
-
- // Handle messages for windows that are already or are about to be destroyed
- if (hwnd == null) {
- #if DriverDebug
- Console.WriteLine("GetMessage(): Got message {0} for non-existent or already destroyed window {1:X}", xevent.type, xevent.AnyEvent.window.ToInt32());
- #endif
- goto ProcessNextMessage;
- }
-
- if (hwnd.client_window == xevent.AnyEvent.window) {
- client = true;
- //Console.WriteLine("Client message, sending to window {0:X}", msg.hwnd.ToInt32());
- } else {
- client = false;
- //Console.WriteLine("Non-Client message, sending to window {0:X}", msg.hwnd.ToInt32());
- }
-
- msg.hwnd = hwnd.Handle;
-
- //
- // If you add a new event to this switch make sure to add it in
- // UpdateMessage also unless it is not coming through the X event system.
- //
- switch(xevent.type) {
- case XEventName.KeyPress: {
- Keyboard.KeyEvent (FocusWindow, xevent, ref msg);
- break;
- }
-
- case XEventName.KeyRelease: {
- Keyboard.KeyEvent (FocusWindow, xevent, ref msg);
- break;
- }
-
- case XEventName.ButtonPress: {
- switch(xevent.ButtonEvent.button) {
- case 1: {
- MouseState |= MouseButtons.Left;
- if (client) {
- msg.message = Msg.WM_LBUTTONDOWN;
- } else {
- msg.message = Msg.WM_NCLBUTTONDOWN;
- WholeToScreen (msg.hwnd, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
- }
- // TODO: For WM_NCLBUTTONDOWN wParam specifies a hit-test value not the virtual keys down
- msg.wParam=GetMousewParam(0);
- break;
- }
-
- case 2: {
- MouseState |= MouseButtons.Middle;
- if (client) {
- msg.message = Msg.WM_MBUTTONDOWN;
- } else {
- msg.message = Msg.WM_NCMBUTTONDOWN;
- WholeToScreen (msg.hwnd, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
- }
- msg.wParam=GetMousewParam(0);
- break;
- }
-
- case 3: {
- MouseState |= MouseButtons.Right;
- if (client) {
- msg.message = Msg.WM_RBUTTONDOWN;
- } else {
- msg.message = Msg.WM_NCRBUTTONDOWN;
- WholeToScreen (msg.hwnd, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
- }
- msg.wParam=GetMousewParam(0);
- break;
- }
-
- case 4: {
- msg.message=Msg.WM_MOUSEWHEEL;
- msg.wParam=GetMousewParam(120);
- break;
- }
-
- case 5: {
- msg.message=Msg.WM_MOUSEWHEEL;
- msg.wParam=GetMousewParam(-120);
- break;
- }
-
- }
-
- msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
- MousePosition.X = xevent.ButtonEvent.x;
- MousePosition.Y = xevent.ButtonEvent.y;
-
- if (!hwnd.Enabled) {
- IntPtr dummy;
-
- msg.hwnd = hwnd.EnabledHwnd;
- XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.ButtonEvent.x, xevent.ButtonEvent.y, out xevent.ButtonEvent.x, out xevent.ButtonEvent.y, out dummy);
- msg.lParam = (IntPtr)(MousePosition.Y << 16 | MousePosition.X);
- }
-
- if (Grab.Hwnd != IntPtr.Zero) {
- msg.hwnd = Grab.Hwnd;
- }
-
- if (!ClickPending.Pending) {
- ClickPending.Pending = true;
- ClickPending.Hwnd = msg.hwnd;
- ClickPending.Message = msg.message;
- ClickPending.wParam = msg.wParam;
- ClickPending.lParam = msg.lParam;
- ClickPending.Time = (long)xevent.ButtonEvent.time;
- } else {
- if ((((long)xevent.ButtonEvent.time - ClickPending.Time) < DoubleClickInterval) && (msg.wParam == ClickPending.wParam) && (msg.lParam == ClickPending.lParam) && (msg.message == ClickPending.Message)) {
- // Looks like a genuine double click, clicked twice on the same spot with the same keys
- switch(xevent.ButtonEvent.button) {
- case 1: {
- msg.message = client ? Msg.WM_LBUTTONDBLCLK : Msg.WM_NCLBUTTONDBLCLK;
- break;
- }
-
- case 2: {
- msg.message = client ? Msg.WM_MBUTTONDBLCLK : Msg.WM_NCMBUTTONDBLCLK;
- break;
- }
-
- case 3: {
- msg.message = client ? Msg.WM_RBUTTONDBLCLK : Msg.WM_NCRBUTTONDBLCLK;
- break;
- }
- }
- }
- ClickPending.Pending = false;
- }
-
- break;
- }
-
- case XEventName.ButtonRelease: {
- Dnd.HandleButtonRelease (ref xevent);
- switch(xevent.ButtonEvent.button) {
- case 1: {
- MouseState &= ~MouseButtons.Left;
- if (client) {
- msg.message = Msg.WM_LBUTTONUP;
- } else {
- msg.message = Msg.WM_NCLBUTTONUP;
- WholeToScreen (msg.hwnd, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
- }
- msg.wParam=GetMousewParam(0);
- break;
- }
-
- case 2: {
- MouseState &= ~MouseButtons.Middle;
- if (client) {
- msg.message = Msg.WM_MBUTTONUP;
- } else {
- msg.message = Msg.WM_NCMBUTTONUP;
- WholeToScreen (msg.hwnd, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
- }
- msg.wParam=GetMousewParam(0);
- break;
- }
-
- case 3: {
- MouseState &= ~MouseButtons.Right;
- if (client) {
- msg.message = Msg.WM_RBUTTONUP;
- } else {
- msg.message = Msg.WM_NCRBUTTONUP;
- WholeToScreen (msg.hwnd, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
- }
- msg.wParam=GetMousewParam(0);
- break;
- }
-
- case 4: {
- goto ProcessNextMessage;
- }
-
- case 5: {
- goto ProcessNextMessage;
- }
- }
-
- if (!hwnd.Enabled) {
- IntPtr dummy;
-
- msg.hwnd = hwnd.EnabledHwnd;
- XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.ButtonEvent.x, xevent.ButtonEvent.y, out xevent.ButtonEvent.x, out xevent.ButtonEvent.y, out dummy);
- msg.lParam = (IntPtr)(MousePosition.Y << 16 | MousePosition.X);
- }
-
- if (Grab.Hwnd != IntPtr.Zero) {
- msg.hwnd = Grab.Hwnd;
- }
-
- msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
- MousePosition.X = xevent.ButtonEvent.x;
- MousePosition.Y = xevent.ButtonEvent.y;
- break;
- }
-
- case XEventName.MotionNotify: {
- if (client) {
- #if DriverDebugExtra
- Console.WriteLine("GetMessage(): Window {0:X} MotionNotify x={1} y={2}", client ? hwnd.client_window.ToInt32() : hwnd.whole_window.ToInt32(), xevent.MotionEvent.x, xevent.MotionEvent.y);
- #endif
-
- if (Dnd.HandleMotionNotify (ref xevent))
- goto ProcessNextMessage;
- if (Grab.Hwnd != IntPtr.Zero) {
- msg.hwnd = Grab.Hwnd;
- } else {
- NativeWindow.WndProc(msg.hwnd, Msg.WM_SETCURSOR, msg.hwnd, (IntPtr)HitTest.HTCLIENT);
- }
-
- msg.message = Msg.WM_MOUSEMOVE;
- msg.wParam = GetMousewParam(0);
- msg.lParam = (IntPtr) (xevent.MotionEvent.y << 16 | xevent.MotionEvent.x & 0xFFFF);
-
- if (!hwnd.Enabled) {
- IntPtr dummy;
-
- msg.hwnd = hwnd.EnabledHwnd;
- XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.MotionEvent.x, xevent.MotionEvent.y, out xevent.MotionEvent.x, out xevent.MotionEvent.y, out dummy);
- msg.lParam = (IntPtr)(MousePosition.Y << 16 | MousePosition.X);
- }
-
- HoverState.X = MousePosition.X = xevent.MotionEvent.x;
- HoverState.Y = MousePosition.Y = xevent.MotionEvent.y;
-
- break;
- } else {
- HitTest ht;
- IntPtr dummy;
- int screen_x;
- int screen_y;
-
- #if DriverDebugExtra
- Console.WriteLine("GetMessage(): non-client area {0:X} MotionNotify x={1} y={2}", client ? hwnd.client_window.ToInt32() : hwnd.whole_window.ToInt32(), xevent.MotionEvent.x, xevent.MotionEvent.y);
- #endif
- msg.message = Msg.WM_NCMOUSEMOVE;
-
- if (!hwnd.Enabled) {
- msg.hwnd = hwnd.EnabledHwnd;
- XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.MotionEvent.x, xevent.MotionEvent.y, out xevent.MotionEvent.x, out xevent.MotionEvent.y, out dummy);
- msg.lParam = (IntPtr)(MousePosition.Y << 16 | MousePosition.X);
- }
-
- // The hit test is sent in screen coordinates
- XTranslateCoordinates (DisplayHandle, hwnd.client_window, RootWindow,
- xevent.MotionEvent.x, xevent.MotionEvent.y,
- out screen_x, out screen_y, out dummy);
-
- msg.lParam = (IntPtr) (screen_y << 16 | screen_x & 0xFFFF);
- ht = (HitTest)NativeWindow.WndProc (hwnd.client_window, Msg.WM_NCHITTEST,
- IntPtr.Zero, msg.lParam).ToInt32 ();
- NativeWindow.WndProc(hwnd.client_window, Msg.WM_SETCURSOR, msg.hwnd, (IntPtr)ht);
-
- MousePosition.X = xevent.MotionEvent.x;
- MousePosition.Y = xevent.MotionEvent.y;
- }
-
- break;
- }
-
- case XEventName.EnterNotify: {
- if (!hwnd.Enabled) {
- goto ProcessNextMessage;
- }
- if (xevent.CrossingEvent.mode != NotifyMode.NotifyNormal) {
- goto ProcessNextMessage;
- }
- msg.message = Msg.WM_MOUSE_ENTER;
- HoverState.Timer.Enabled = true;
- HoverState.Window = xevent.CrossingEvent.window;
- break;
- }
-
- case XEventName.LeaveNotify: {
- if (!hwnd.Enabled) {
- goto ProcessNextMessage;
- }
- if (xevent.CrossingEvent.mode != NotifyMode.NotifyNormal) {
- goto ProcessNextMessage;
- }
- msg.message=Msg.WM_MOUSE_LEAVE;
- HoverState.Timer.Enabled = false;
- HoverState.Window = IntPtr.Zero;
- break;
- }
-
- #if later
- case XEventName.CreateNotify: {
- if (client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) {
- msg.message = WM_CREATE;
- // Set up CreateStruct
- } else {
- goto ProcessNextMessage;
- }
- break;
- }
- #endif
-
-
- case XEventName.ReparentNotify: {
- if (hwnd.parent == null) { // Toplevel
- if ((xevent.ReparentEvent.parent != IntPtr.Zero) && (xevent.ReparentEvent.window == hwnd.whole_window)) {
- // We need to adjust x/y
- // This sucks ass, part 2
- // Every WM does the reparenting of toplevel windows different, so there's
- // no standard way of getting our adjustment considering frames/decorations
- // The code below is needed for metacity. KDE doesn't works just fine without this
- int dummy_int;
- IntPtr dummy_ptr;
- int new_x;
- int new_y;
- int frame_left;
- int frame_top;
-
- hwnd.Reparented = true;
-
- XGetGeometry(DisplayHandle, XGetParent(hwnd.whole_window), out dummy_ptr, out new_x, out new_y, out dummy_int, out dummy_int, out dummy_int, out dummy_int);
- FrameExtents(hwnd.whole_window, out frame_left, out frame_top);
- if ((frame_left != 0) && (frame_top != 0) && (new_x != frame_left) && (new_y != frame_top)) {
- hwnd.x = new_x;
- hwnd.y = new_y;
- hwnd.whacky_wm = true;
- }
-
- msg.message = Msg.WM_WINDOWPOSCHANGED;
- if (hwnd.opacity != 0xffffffff) {
- uint opacity;
-
- opacity = hwnd.opacity;
- XChangeProperty(DisplayHandle, XGetParent(hwnd.whole_window), NetAtoms[(int)NA._NET_WM_WINDOW_OPACITY], (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, ref opacity, 1);
- }
- } else {
- hwnd.Reparented = false;
- goto ProcessNextMessage;
- }
- }
- break;
- }
-
- case XEventName.ConfigureNotify: {
- if (!client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) { // Ignore events for children (SubstructureNotify) and client areas
- XplatUIWin32.NCCALCSIZE_PARAMS ncp;
- IntPtr ptr;
- Rectangle rect;
-
- #if DriverDebugExtra
- Console.WriteLine("GetMessage(): Window {0:X} ConfigureNotify x={1} y={2} width={3} height={4}", hwnd.client_window.ToInt32(), xevent.ConfigureEvent.x, xevent.ConfigureEvent.y, xevent.ConfigureEvent.width, xevent.ConfigureEvent.height);
- #endif
- msg.message = Msg.WM_WINDOWPOSCHANGED;
- hwnd.configure_pending = false;
-
- // We need to adjust our client window to track the resize of whole_window
- rect = hwnd.DefaultClientRect;
-
- ncp = new XplatUIWin32.NCCALCSIZE_PARAMS();
- ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ncp));
-
- ncp.rgrc1.left = rect.Left;
- ncp.rgrc1.top = rect.Top;
- ncp.rgrc1.right = rect.Right;
- ncp.rgrc1.bottom = rect.Bottom;
-
- Marshal.StructureToPtr(ncp, ptr, true);
- NativeWindow.WndProc(hwnd.client_window, Msg.WM_NCCALCSIZE, (IntPtr)1, ptr);
- ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(ptr, typeof(XplatUIWin32.NCCALCSIZE_PARAMS));
- Marshal.FreeHGlobal(ptr);
-
- // FIXME - debug this with Menus, need to set hwnd.ClientRect
-
- rect = new Rectangle(ncp.rgrc1.left, ncp.rgrc1.top, ncp.rgrc1.right - ncp.rgrc1.left, ncp.rgrc1.bottom - ncp.rgrc1.top);
-
- XMoveResizeWindow(DisplayHandle, hwnd.client_window, rect.X, rect.Y, rect.Width, rect.Height);
- } else {
- goto ProcessNextMessage;
- }
-
- msg.lParam=IntPtr.Zero; // FIXME - Generate LPWINDOWPOS structure and pass on
- break;
- }
-
- case XEventName.FocusIn: {
- if (!hwnd.Enabled) {
- goto ProcessNextMessage;
- }
- msg.message=Msg.WM_SETFOCUS;
- msg.wParam=IntPtr.Zero;
- break;
- }
-
- case XEventName.FocusOut: {
- if (!hwnd.Enabled) {
- goto ProcessNextMessage;
- }
- msg.message=Msg.WM_KILLFOCUS;
- msg.wParam=IntPtr.Zero;
- break;
- }
-
- case XEventName.Expose: {
- if (PostQuitState) {
- goto ProcessNextMessage;
- }
-
-
- if (client) {
- if (!hwnd.expose_pending) {
- goto ProcessNextMessage;
- }
- } else {
- if (!hwnd.nc_expose_pending) {
- goto ProcessNextMessage;
- }
-
- switch (hwnd.border_style) {
- case FormBorderStyle.Fixed3D: {
- Graphics g;
-
- g = Graphics.FromHwnd(hwnd.whole_window);
- ControlPaint.DrawBorder3D(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height));
- g.Dispose();
- break;
- }
-
- case FormBorderStyle.FixedSingle: {
- Graphics g;
-
- g = Graphics.FromHwnd(hwnd.whole_window);
- ControlPaint.DrawBorder(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height), Color.Black, ButtonBorderStyle.Solid);
- g.Dispose();
- break;
- }
- }
- #if DriverDebugExtra
- Console.WriteLine("GetMessage(): Window {0:X} Exposed non-client area {1},{2} {3}x{4}", hwnd.client_window.ToInt32(), xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
- #endif
-
- Rectangle rect = new Rectangle (xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
- Region region = new Region (rect);
- IntPtr hrgn = region.GetHrgn (null); // Graphics object isn't needed
- msg.message = Msg.WM_NCPAINT;
- msg.wParam = hrgn;
- hwnd.nc_expose_pending = false;
- break;
- }
- #if DriverDebugExtra
- Console.WriteLine("GetMessage(): Window {0:X} Exposed area {1},{2} {3}x{4}", hwnd.client_window.ToInt32(), xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
- #endif
- if (Caret.Visible == 1) {
- Caret.Paused = true;
- HideCaret();
- }
-
- if (Caret.Visible == 1) {
- ShowCaret();
- Caret.Paused = false;
- }
- msg.message = Msg.WM_PAINT;
- break;
- }
-
- case XEventName.DestroyNotify: {
-
- // This is a bit tricky, we don't receive our own DestroyNotify, we only get those for our children
- hwnd = Hwnd.ObjectFromHandle(xevent.DestroyWindowEvent.window);
-
- // We may get multiple for the same window, act only one the first (when Hwnd still knows about it)
- if ((hwnd != null) && (hwnd.client_window == xevent.DestroyWindowEvent.window)) {
- msg.hwnd = hwnd.client_window;
- msg.message=Msg.WM_DESTROY;
- hwnd.Dispose();
-
- #if DriverDebug
- Console.WriteLine("Got DestroyNotify on Window {0:X}", msg.hwnd.ToInt32());
- #endif
- } else {
- goto ProcessNextMessage;
- }
-
- break;
- }
-
- case XEventName.ClientMessage: {
- if (Dnd.HandleClientMessage (ref xevent)) {
- goto ProcessNextMessage;
- }
-
- if (xevent.ClientMessageEvent.message_type == AsyncAtom) {
- XplatUIDriverSupport.ExecuteClientMessage((GCHandle)xevent.ClientMessageEvent.ptr1);
- break;
- }
-
- if (xevent.ClientMessageEvent.message_type == HoverState.Atom) {
- msg.message = Msg.WM_MOUSEHOVER;
- msg.wParam = GetMousewParam(0);
- msg.lParam = (IntPtr) (xevent.ClientMessageEvent.ptr1);
- break;
- }
-
- if (xevent.ClientMessageEvent.message_type == (IntPtr)PostAtom) {
- msg.hwnd = xevent.ClientMessageEvent.ptr1;
- msg.message = (Msg) xevent.ClientMessageEvent.ptr2.ToInt32 ();
- msg.wParam = xevent.ClientMessageEvent.ptr3;
- msg.lParam = xevent.ClientMessageEvent.ptr4;
- break;
- }
-
- #if dontcare
- if (xevent.ClientMessageEvent.message_type == NetAtoms[(int)NA._XEMBED]) {
- Console.WriteLine("GOT EMBED MESSAGE {0:X}", xevent.ClientMessageEvent.ptr2.ToInt32());
- break;
- }
- #endif
-
- if (xevent.ClientMessageEvent.message_type == NetAtoms[(int)NA.WM_PROTOCOLS]) {
- if (xevent.ClientMessageEvent.ptr1 == NetAtoms[(int)NA.WM_DELETE_WINDOW]) {
- msg.message = Msg.WM_CLOSE;
- Graphics.FromHdcInternal (IntPtr.Zero);
- break;
- }
-
- // We should not get this, but I'll leave the code in case we need it in the future
- if (xevent.ClientMessageEvent.ptr1 == NetAtoms[(int)NA.WM_TAKE_FOCUS]) {
- goto ProcessNextMessage;
- }
- }
- break;
- }
-
- case XEventName.TimerNotify: {
- xevent.TimerNotifyEvent.handler (this, EventArgs.Empty);
- break;
- }
-
- default: {
- goto ProcessNextMessage;
- }
- }
-
- return true;
- }
-
- internal override bool GetText(IntPtr handle, out string text) {
- IntPtr textptr;
-
- textptr = IntPtr.Zero;
-
- lock (XlibLock) {
- // FIXME - use _NET properties
- XFetchName(DisplayHandle, Hwnd.ObjectFromHandle(handle).whole_window, ref textptr);
- }
- if (textptr != IntPtr.Zero) {
- text = Marshal.PtrToStringAnsi(textptr);
- XFree(textptr);
- return true;
- } else {
- text = "";
- return false;
- }
- }
-
- internal override 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) {
- Hwnd hwnd;
- Rectangle rect;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (hwnd != null) {
- x = hwnd.x;
- y = hwnd.y;
- width = hwnd.width;
- height = hwnd.height;
-
- rect = Hwnd.GetClientRectangle(hwnd.border_style, hwnd.menu, hwnd.title_style, hwnd.caption_height, hwnd.tool_caption_height, width, height);
-
- client_width = rect.Width;
- client_height = rect.Height;
-
- return;
- }
-
- // Should we throw an exception or fail silently?
- // throw new ArgumentException("Called with an invalid window handle", "handle");
-
- x = 0;
- y = 0;
- width = 0;
- height = 0;
- client_width = 0;
- client_height = 0;
- }
-
- internal override FormWindowState GetWindowState(IntPtr handle) {
- IntPtr actual_atom;
- int actual_format;
- IntPtr nitems;
- IntPtr bytes_after;
- IntPtr prop = IntPtr.Zero;
- IntPtr atom;
- int maximized;
- bool minimized;
- XWindowAttributes attributes;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- maximized = 0;
- minimized = false;
- XGetWindowProperty(DisplayHandle, hwnd.whole_window, NetAtoms[(int)NA._NET_WM_STATE], IntPtr.Zero, new IntPtr (256), false, (IntPtr)Atom.XA_ATOM, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
- if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
- for (int i = 0; i < (long)nitems; i++) {
- atom = (IntPtr)Marshal.ReadInt32(prop, i * 4);
- if ((atom == NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_HORZ]) || (atom == NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_VERT])) {
- maximized++;
- } else if (atom == NetAtoms[(int)NA._NET_WM_STATE_HIDDEN]) {
- minimized = true;
- }
- }
- XFree(prop);
- }
-
- if (minimized) {
- return FormWindowState.Minimized;
- } else if (maximized == 2) {
- return FormWindowState.Maximized;
- }
-
- attributes = new XWindowAttributes();
- XGetWindowAttributes(DisplayHandle, handle, ref attributes);
- if (attributes.map_state == MapState.IsUnmapped) {
- throw new NotSupportedException("Cannot retrieve the state of an unmapped window");
- }
-
-
- return FormWindowState.Normal;
- }
-
- internal override void GrabInfo(out IntPtr handle, out bool GrabConfined, out Rectangle GrabArea) {
- handle = Grab.Hwnd;
- GrabConfined = Grab.Confined;
- GrabArea = Grab.Area;
- }
-
- internal override void GrabWindow(IntPtr handle, IntPtr confine_to_handle) {
- Hwnd hwnd;
- IntPtr confine_to_window;
-
- confine_to_window = IntPtr.Zero;
-
- if (confine_to_handle != IntPtr.Zero) {
- XWindowAttributes attributes = new XWindowAttributes();
-
- hwnd = Hwnd.ObjectFromHandle(confine_to_handle);
-
- lock (XlibLock) {
- XGetWindowAttributes(DisplayHandle, hwnd.client_window, ref attributes);
- }
- Grab.Area.X = attributes.x;
- Grab.Area.Y = attributes.y;
- Grab.Area.Width = attributes.width;
- Grab.Area.Height = attributes.height;
- Grab.Confined = true;
- confine_to_window = hwnd.client_window;
- }
-
- Grab.Hwnd = handle;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- lock (XlibLock) {
- XGrabPointer(DisplayHandle, hwnd.client_window, false,
- EventMask.ButtonPressMask | EventMask.ButtonMotionMask |
- EventMask.ButtonReleaseMask | EventMask.PointerMotionMask,
- GrabMode.GrabModeAsync, GrabMode.GrabModeAsync, confine_to_window, IntPtr.Zero, IntPtr.Zero);
- }
- }
-
- internal override void UngrabWindow(IntPtr hwnd) {
- lock (XlibLock) {
- XUngrabPointer(DisplayHandle, IntPtr.Zero);
- XFlush(DisplayHandle);
- }
- Grab.Hwnd = IntPtr.Zero;
- Grab.Confined = false;
- }
-
- internal override void HandleException(Exception e) {
- StackTrace st = new StackTrace(e, true);
- Console.WriteLine("Exception '{0}'", e.Message+st.ToString());
- Console.WriteLine("{0}{1}", e.Message, st.ToString());
- }
-
- internal override void Invalidate(IntPtr handle, Rectangle rc, bool clear) {
- Hwnd hwnd;
- XEvent xevent;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
-
- xevent = new XEvent ();
- xevent.type = XEventName.Expose;
- xevent.ExposeEvent.display = DisplayHandle;
- xevent.ExposeEvent.window = hwnd.client_window;
-
- if (clear) {
- xevent.ExposeEvent.x = hwnd.X;
- xevent.ExposeEvent.y = hwnd.Y;
- xevent.ExposeEvent.width = hwnd.Width;
- xevent.ExposeEvent.height = hwnd.Height;
- } else {
- xevent.ExposeEvent.x = rc.X;
- xevent.ExposeEvent.y = rc.Y;
- xevent.ExposeEvent.width = rc.Width;
- xevent.ExposeEvent.height = rc.Height;
- }
-
- AddExpose (xevent);
- }
-
- internal override bool IsEnabled(IntPtr handle) {
- return Hwnd.ObjectFromHandle(handle).Enabled;
- }
-
- internal override bool IsVisible(IntPtr handle) {
- return Hwnd.ObjectFromHandle(handle).visible;
- }
-
- internal override void KillTimer(Timer timer) {
- lock (TimerList) {
- TimerList.Remove(timer);
- }
- }
-
- internal override void MenuToScreen(IntPtr handle, ref int x, ref int y) {
- int dest_x_return;
- int dest_y_return;
- IntPtr child;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- lock (XlibLock) {
- XTranslateCoordinates(DisplayHandle, hwnd.whole_window, RootWindow, x, y, out dest_x_return, out dest_y_return, out child);
- }
-
- x = dest_x_return;
- y = dest_y_return;
- }
-
- internal override void OverrideCursor(IntPtr cursor) {
- OverrideCursorHandle = cursor;
- }
-
- internal override PaintEventArgs PaintEventStart(IntPtr handle, bool client) {
- PaintEventArgs paint_event;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (Caret.Visible == 1) {
- Caret.Paused = true;
- HideCaret();
- }
-
- if (client) {
- hwnd.client_dc = Graphics.FromHwnd (hwnd.client_window);
- hwnd.client_dc.SetClip(hwnd.invalid);
- paint_event = new PaintEventArgs(hwnd.client_dc, hwnd.invalid);
- hwnd.expose_pending = false;
-
- return paint_event;
- } else {
- hwnd.non_client_dc = Graphics.FromHwnd (hwnd.whole_window);
- hwnd.non_client_dc.SetClip (hwnd.nc_invalid);
- paint_event = new PaintEventArgs(hwnd.non_client_dc, hwnd.nc_invalid);
- hwnd.nc_expose_pending = false;
-
- return paint_event;
- }
- }
-
- internal override void PaintEventEnd(IntPtr handle, bool client) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (client) {
- hwnd.ClearInvalidArea();
-
- hwnd.client_dc.Flush();
- hwnd.client_dc.Dispose();
- hwnd.client_dc = null;
- } else {
- hwnd.ClearNcInvalidArea ();
-
- hwnd.non_client_dc.Flush ();
- hwnd.non_client_dc.Dispose ();
- hwnd.non_client_dc = null;
- }
-
-
-
- if (Caret.Visible == 1) {
- ShowCaret();
- Caret.Paused = false;
- }
- }
-
- internal override bool PeekMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags) {
- bool pending;
-
- // FIXME - imlement filtering
-
- if ((flags & (uint)PeekMessageFlags.PM_REMOVE) == 0) {
- throw new NotImplementedException("PeekMessage PM_NOREMOVE is not implemented yet"); // FIXME - Implement PM_NOREMOVE flag
- }
-
- pending = false;
- if (MessageQueue.Count > 0) {
- pending = true;
- } else {
- // Only call UpdateMessageQueue if real events are pending
- // otherwise we go to sleep on the socket
- if (XPending(DisplayHandle) != 0) {
- UpdateMessageQueue();
- pending = true;
- }
- }
-
- CheckTimers(DateTime.Now);
-
- if (!pending) {
- return false;
- }
- return GetMessage(ref msg, hWnd, wFilterMin, wFilterMax);
- }
-
- // FIXME - I think this should just enqueue directly
- internal override bool PostMessage (IntPtr handle, Msg message, IntPtr wparam, IntPtr lparam) {
- XEvent xevent = new XEvent ();
- Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
-
- xevent.type = XEventName.ClientMessage;
- xevent.ClientMessageEvent.display = DisplayHandle;
-
- if (hwnd != null) {
- xevent.ClientMessageEvent.window = hwnd.whole_window;
- } else {
- xevent.ClientMessageEvent.window = IntPtr.Zero;
- }
-
- xevent.ClientMessageEvent.message_type = (IntPtr) PostAtom;
- xevent.ClientMessageEvent.format = 32;
- xevent.ClientMessageEvent.ptr1 = handle;
- xevent.ClientMessageEvent.ptr2 = (IntPtr) message;
- xevent.ClientMessageEvent.ptr3 = wparam;
- xevent.ClientMessageEvent.ptr4 = lparam;
-
- MessageQueue.Enqueue (xevent);
-
- return true;
- }
-
- internal override void PostQuitMessage(int exitCode) {
- XFlush(DisplayHandle);
- PostQuitState = true;
-
- // Remove our display handle from S.D
- Graphics.FromHdcInternal (IntPtr.Zero);
- }
-
- internal override void ScreenToClient(IntPtr handle, ref int x, ref int y) {
- int dest_x_return;
- int dest_y_return;
- IntPtr child;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- lock (XlibLock) {
- XTranslateCoordinates (DisplayHandle, RootWindow, hwnd.client_window, x, y, out dest_x_return, out dest_y_return, out child);
- }
-
- x = dest_x_return;
- y = dest_y_return;
- }
-
- internal override void ScreenToMenu(IntPtr handle, ref int x, ref int y) {
- int dest_x_return;
- int dest_y_return;
- IntPtr child;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- lock (XlibLock) {
- XTranslateCoordinates (DisplayHandle, RootWindow, hwnd.whole_window, x, y, out dest_x_return, out dest_y_return, out child);
- }
-
- x = dest_x_return;
- y = dest_y_return;
- }
-
- internal override void ScrollWindow(IntPtr handle, Rectangle area, int XAmount, int YAmount, bool with_children) {
- Hwnd hwnd;
- IntPtr gc;
- XGCValues gc_values;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (hwnd.invalid != Rectangle.Empty) {
- // BIG FAT WARNING. This only works with how we use this function right now
- // where we basically still scroll the whole window, but work around areas
- // that are covered by our children
-
- hwnd.invalid.X += XAmount;
- hwnd.invalid.Y += YAmount;
-
- if (hwnd.invalid.X < 0) {
- hwnd.invalid.Width += hwnd.invalid.X;
- hwnd.invalid.X =0;
- }
-
- if (hwnd.invalid.Y < 0) {
- hwnd.invalid.Height += hwnd.invalid.Y;
- hwnd.invalid.Y =0;
- }
- }
-
- gc_values = new XGCValues();
-
- if (with_children) {
- gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
- }
-
- gc = XCreateGC(DisplayHandle, hwnd.client_window, IntPtr.Zero, ref gc_values);
-
- XCopyArea(DisplayHandle, hwnd.client_window, hwnd.client_window, gc, area.X - XAmount, area.Y - YAmount, area.Width, area.Height, area.X, area.Y);
-
- // Generate an expose for the area exposed by the horizontal scroll
- if (XAmount > 0) {
- hwnd.AddInvalidArea (area.X, area.Y, XAmount, area.Height);
- } else if (XAmount < 0) {
- hwnd.AddInvalidArea (XAmount + area.X + area.Width, area.Y, -XAmount, area.Height);
- }
-
- // Generate an expose for the area exposed by the vertical scroll
- if (YAmount > 0) {
- hwnd.AddInvalidArea (area.X, area.Y, area.Width, YAmount);
- } else if (YAmount < 0) {
- hwnd.AddInvalidArea (area.X, YAmount + area.Y + area.Height, area.Width, -YAmount);
- }
- XFreeGC(DisplayHandle, gc);
-
- UpdateWindow(handle);
- }
-
- internal override void ScrollWindow(IntPtr handle, int XAmount, int YAmount, bool with_children) {
- Hwnd hwnd;
-
- hwnd = Hwnd.GetObjectFromWindow(handle);
-
- ScrollWindow(handle, hwnd.ClientRect, XAmount, YAmount, with_children);
- }
-
- internal override void SendAsyncMethod (AsyncMethodData method) {
- XEvent xevent = new XEvent ();
-
- xevent.type = XEventName.ClientMessage;
- xevent.ClientMessageEvent.display = DisplayHandle;
- xevent.ClientMessageEvent.window = FosterParent;
- xevent.ClientMessageEvent.message_type = (IntPtr)AsyncAtom;
- xevent.ClientMessageEvent.format = 32;
- xevent.ClientMessageEvent.ptr1 = (IntPtr) GCHandle.Alloc (method);
-
- MessageQueue.EnqueueLocked (xevent);
-
- WakeupMain ();
- }
-
- internal override IntPtr SendMessage (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam) {
- return NativeWindow.WndProc(hwnd, message, wParam, lParam);
- }
-
- internal override void SetAllowDrop (IntPtr handle, bool value)
- {
- // We allow drop on all windows
- }
-
- internal override DragDropEffects StartDrag (IntPtr handle, object data,
- DragDropEffects allowed_effects)
- {
- Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
-
- if (hwnd == null)
- throw new ArgumentException ("Attempt to begin drag from invalid window handle (" + handle.ToInt32 () + ").");
-
- return Dnd.StartDrag (hwnd.client_window, data, allowed_effects);
- }
-
- internal override void SetBorderStyle(IntPtr handle, FormBorderStyle border_style) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- hwnd.border_style = border_style;
-
- XMoveResizeWindow(DisplayHandle, hwnd.client_window, hwnd.ClientRect.X, hwnd.ClientRect.Y, hwnd.ClientRect.Width, hwnd.ClientRect.Height);
-
- InvalidateWholeWindow(handle);
- }
-
- internal override void SetCaretPos(IntPtr handle, int x, int y) {
- if (Caret.Hwnd == handle) {
- Caret.Timer.Stop();
- HideCaret();
-
- Caret.X = x;
- Caret.Y = y;
-
- if (Caret.Visible == 1) {
- ShowCaret();
- Caret.Timer.Start();
- }
- }
- }
-
- internal override void SetCursor(IntPtr handle, IntPtr cursor) {
- Hwnd hwnd;
-
- if (OverrideCursorHandle == IntPtr.Zero) {
- if ((LastCursorWindow == handle) && (LastCursorHandle == cursor)) {
- return;
- }
-
- LastCursorHandle = cursor;
- LastCursorWindow = handle;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- lock (XlibLock) {
- if (cursor != IntPtr.Zero) {
- XDefineCursor(DisplayHandle, hwnd.whole_window, cursor);
- } else {
- XUndefineCursor(DisplayHandle, hwnd.whole_window);
- }
- }
- return;
- }
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- lock (XlibLock) {
- XDefineCursor(DisplayHandle, hwnd.whole_window, OverrideCursorHandle);
- }
- }
-
- internal override void SetCursorPos(IntPtr handle, int x, int y) {
- if (handle == IntPtr.Zero) {
- lock (XlibLock) {
- XWarpPointer(DisplayHandle, IntPtr.Zero, IntPtr.Zero, 0, 0, 0, 0, x, y);
- }
- return;
- } else {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- lock (XlibLock) {
- XWarpPointer(DisplayHandle, IntPtr.Zero, hwnd.client_window, 0, 0, 0, 0, x, y);
- }
- return;
- }
- }
-
- internal override void SetFocus(IntPtr handle) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (FocusWindow != IntPtr.Zero) {
- PostMessage(FocusWindow, Msg.WM_KILLFOCUS, hwnd.client_window, IntPtr.Zero);
- }
- PostMessage(hwnd.client_window, Msg.WM_SETFOCUS, FocusWindow, IntPtr.Zero);
- FocusWindow = hwnd.client_window;
-
- //XSetInputFocus(DisplayHandle, Hwnd.ObjectFromHandle(handle).client_window, RevertTo.None, IntPtr.Zero);
- }
-
- internal override void SetIcon(IntPtr handle, Icon icon) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- if (hwnd != null) {
- SetIcon(hwnd, icon);
- }
- }
-
- internal override void SetMenu(IntPtr handle, Menu menu) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- hwnd.menu = menu;
-
- // FIXME - do we need to trigger some resize?
- }
-
- internal override void SetModal(IntPtr handle, bool Modal) {
- if (Modal) {
- ModalWindows.Push(handle);
- } else {
- if (ModalWindows.Contains(handle)) {
- ModalWindows.Pop();
- }
- if (ModalWindows.Count > 0) {
- Activate((IntPtr)ModalWindows.Peek());
- }
- }
- }
-
- internal override IntPtr SetParent(IntPtr handle, IntPtr parent) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- hwnd.parent = Hwnd.ObjectFromHandle(parent);
-
- lock (XlibLock) {
- #if DriverDebug
- Console.WriteLine("Parent for window {0:X} / {1:X} = {2:X} (Handle:{3:X})", hwnd.ClientWindow.ToInt32(), hwnd.WholeWindow.ToInt32(), hwnd.parent != null ? hwnd.parent.Handle.ToInt32() : 0, parent.ToInt32());
- #endif
- XReparentWindow(DisplayHandle, hwnd.whole_window, hwnd.parent.client_window, hwnd.x, hwnd.y);
- }
-
- return IntPtr.Zero;
- }
-
- internal override void SetTimer (Timer timer) {
- lock (TimerList) {
- TimerList.Add(timer);
- }
- WakeupMain ();
- }
-
- internal override bool SetTopmost(IntPtr handle, IntPtr handle_owner, bool enabled) {
- Hwnd hwnd;
- Hwnd hwnd_owner;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (handle_owner != IntPtr.Zero) {
- hwnd_owner = Hwnd.ObjectFromHandle(handle_owner);
- } else {
- hwnd_owner = null;
- }
-
- if (enabled) {
- lock (XlibLock) {
- if (hwnd_owner != null) {
- XSetTransientForHint(DisplayHandle, hwnd.whole_window, hwnd_owner.whole_window);
- } else {
- XSetTransientForHint(DisplayHandle, hwnd.whole_window, FosterParent);
- }
- }
- } else {
- lock (XlibLock) {
- XDeleteProperty(DisplayHandle, hwnd.whole_window, (IntPtr)Atom.XA_WM_TRANSIENT_FOR);
- }
- }
- return true;
- }
-
- internal override bool SetVisible(IntPtr handle, bool visible) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- hwnd.visible = visible;
-
- lock (XlibLock) {
- if (visible) {
- if (Control.FromHandle(handle) is Form) {
- FormWindowState s;
-
- s = ((Form)Control.FromHandle(handle)).WindowState;
-
- XMapWindow(DisplayHandle, hwnd.whole_window);
- XMapWindow(DisplayHandle, hwnd.client_window);
-
- switch(s) {
- case FormWindowState.Minimized: SetWindowState(handle, FormWindowState.Minimized); break;
- case FormWindowState.Maximized: SetWindowState(handle, FormWindowState.Maximized); break;
- }
- } else {
- XMapWindow(DisplayHandle, hwnd.whole_window);
- XMapWindow(DisplayHandle, hwnd.client_window);
- }
- } else {
- XUnmapWindow(DisplayHandle, hwnd.whole_window);
- }
- }
- return true;
- }
-
- internal override void SetWindowMinMax(IntPtr handle, Rectangle maximized, Size min, Size max) {
- Hwnd hwnd;
- XSizeHints hints;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- if (hwnd == null) {
- return;
- }
-
- hints = new XSizeHints();
-
- if (min != Size.Empty) {
- hints.flags = (IntPtr)((int)hints.flags | (int)XSizeHintsFlags.PMinSize);
- hints.min_width = min.Width;
- hints.min_height = min.Height;
- }
-
- if (max != Size.Empty) {
- hints.flags = (IntPtr)((int)hints.flags | (int)XSizeHintsFlags.PMaxSize);
- hints.max_width = max.Width;
- hints.max_height = max.Height;
- }
-
- XSetWMNormalHints(DisplayHandle, hwnd.whole_window, ref hints);
-
- if (maximized != Rectangle.Empty) {
- hints.flags = (IntPtr)XSizeHintsFlags.PPosition;
- hints.x = maximized.X;
- hints.y = maximized.Y;
- hints.width = maximized.Width;
- hints.height = maximized.Height;
-
- // Metacity does not seem to follow this constraint for maximized (zoomed) windows
- XSetZoomHints(DisplayHandle, hwnd.whole_window, ref hints);
- }
- }
-
-
- internal override void SetWindowPos(IntPtr handle, int x, int y, int width, int height) {
- Hwnd hwnd;
- Rectangle client_rect;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- // X requires a sanity check for width & height; otherwise it dies
- if (hwnd.zero_sized && width > 0 && height > 0) {
- if (hwnd.visible) {
- XMapWindow(DisplayHandle, hwnd.whole_window);
- }
- hwnd.zero_sized = false;
- }
-
- if (width < 1) {
- hwnd.zero_sized = true;
- XUnmapWindow(DisplayHandle, hwnd.whole_window);
- }
-
- if (height < 1) {
- hwnd.zero_sized = true;
- XUnmapWindow(DisplayHandle, hwnd.whole_window);
- }
-
- client_rect = Hwnd.GetClientRectangle(hwnd.border_style, hwnd.menu, hwnd.title_style, hwnd.caption_height, hwnd.tool_caption_height, width, height);
-
- // Save a server roundtrip (and prevent a feedback loop)
- if ((hwnd.x == x) && (hwnd.y == y) &&
- (hwnd.width == width) && (hwnd.height == height) &&
- (hwnd.ClientRect == client_rect)) {
- return;
- }
-
- if (!hwnd.zero_sized) {
- lock (XlibLock) {
- XMoveResizeWindow(DisplayHandle, hwnd.whole_window, x, y, width, height);
- XMoveResizeWindow(DisplayHandle, hwnd.client_window, client_rect.X, client_rect.Y, client_rect.Width, client_rect.Height);
- }
- }
-
- // Prevent an old queued ConfigureNotify from setting our width with outdated data, set it now
- hwnd.width = width;
- hwnd.height = height;
- }
-
- internal override void SetWindowState(IntPtr handle, FormWindowState state) {
- FormWindowState current_state;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- current_state = GetWindowState(handle);
-
- if (current_state == state) {
- return;
- }
-
- switch(state) {
- case FormWindowState.Normal: {
- lock (XlibLock) {
- if (current_state == FormWindowState.Minimized) {
- XMapWindow(DisplayHandle, hwnd.whole_window);
- XMapWindow(DisplayHandle, hwnd.client_window);
- } else if (current_state == FormWindowState.Maximized) {
- SendNetWMMessage(hwnd.whole_window, NetAtoms[(int)NA._NET_WM_STATE], (IntPtr)2 /* toggle */, NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_HORZ], NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_VERT]);
- }
- }
- Activate(handle);
- return;
- }
-
- case FormWindowState.Minimized: {
- lock (XlibLock) {
- if (current_state == FormWindowState.Maximized) {
- SendNetWMMessage(hwnd.whole_window, NetAtoms[(int)NA._NET_WM_STATE], (IntPtr)2 /* toggle */, NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_HORZ], NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_VERT]);
- }
- XIconifyWindow(DisplayHandle, hwnd.whole_window, ScreenNo);
- }
- return;
- }
-
- case FormWindowState.Maximized: {
- lock (XlibLock) {
- if (current_state == FormWindowState.Minimized) {
- XMapWindow(DisplayHandle, hwnd.whole_window);
- XMapWindow(DisplayHandle, hwnd.client_window);
- }
-
- SendNetWMMessage(hwnd.whole_window, NetAtoms[(int)NA._NET_WM_STATE], (IntPtr)1 /* Add */, NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_HORZ], NetAtoms[(int)NA._NET_WM_STATE_MAXIMIZED_VERT]);
- }
- Activate(handle);
- return;
- }
- }
- }
-
- internal override void SetWindowStyle(IntPtr handle, CreateParams cp) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- SetHwndStyles(hwnd, cp);
- SetWMStyles(hwnd, cp);
- }
-
- internal override void SetWindowTransparency(IntPtr handle, double transparency, Color key) {
- Hwnd hwnd;
- uint opacity;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (hwnd == null) {
- return;
- }
-
- hwnd.opacity = (uint)(0xffffffff * transparency);
- opacity = hwnd.opacity;
-
- if (hwnd.reparented) {
- XChangeProperty(DisplayHandle, XGetParent(hwnd.whole_window), NetAtoms[(int)NA._NET_WM_WINDOW_OPACITY], (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, ref opacity, 1);
- }
- }
-
- internal override bool SetZOrder(IntPtr handle, IntPtr after_handle, bool top, bool bottom) {
- Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (top) {
- lock (XlibLock) {
- XRaiseWindow(DisplayHandle, hwnd.whole_window);
- }
- return true;
- } else if (!bottom) {
- Hwnd after_hwnd = null;
-
- if (after_handle != IntPtr.Zero) {
- after_hwnd = Hwnd.ObjectFromHandle(after_handle);
- }
-
- XWindowChanges values = new XWindowChanges();
-
- if (after_hwnd == null) {
- throw new ArgumentNullException("after_handle", "Need sibling to adjust z-order");
- }
- values.sibling = after_hwnd.whole_window;
- values.stack_mode = StackMode.Below;
-
- lock (XlibLock) {
- XConfigureWindow(DisplayHandle, hwnd.whole_window, ChangeWindowFlags.CWStackMode | ChangeWindowFlags.CWSibling, ref values);
- }
- } else {
- // Bottom
- lock (XlibLock) {
- XLowerWindow(DisplayHandle, hwnd.whole_window);
- }
- return true;
- }
- return false;
- }
-
- internal override void ShowCursor(bool show) {
- ; // FIXME - X11 doesn't 'hide' the cursor. we could create an empty cursor
- }
-
- internal override void StartLoop(Thread thread) {
- // Future place for prepping a new queue for this specific thread
- }
-
- internal override bool SupportsTransparency() {
- // We need to check if the x compositing manager is running
- return true;
- }
-
- internal override bool SystrayAdd(IntPtr handle, string tip, Icon icon, out ToolTip tt) {
- GetSystrayManagerWindow();
-
- if (SystrayMgrWindow != IntPtr.Zero) {
- XSizeHints size_hints;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
- #if DriverDebug
- Console.WriteLine("Adding Systray Whole:{0:X}, Client:{1:X}", hwnd.whole_window.ToInt32(), hwnd.client_window.ToInt32());
- #endif
-
- XUnmapWindow(DisplayHandle, hwnd.whole_window);
- XUnmapWindow(DisplayHandle, hwnd.client_window);
-
- // Oh boy.
- XDestroyWindow(DisplayHandle, hwnd.client_window);
- hwnd.client_window = hwnd.whole_window;
-
- size_hints = new XSizeHints();
-
- size_hints.flags = (IntPtr)(XSizeHintsFlags.PMinSize | XSizeHintsFlags.PMaxSize | XSizeHintsFlags.PBaseSize);
- size_hints.min_width = icon.Width;
- size_hints.min_height = icon.Height;
-
- size_hints.max_width = icon.Width;
- size_hints.max_height = icon.Height;
-
- size_hints.base_width = icon.Width;
- size_hints.base_height = icon.Height;
- XSetWMNormalHints(DisplayHandle, hwnd.whole_window, ref size_hints);
-
- int[] atoms = new int[2];
- atoms [0] = 1; // Version 1
- atoms [1] = 0; // We're not mapped
-
- // This line cost me 3 days...
- XChangeProperty(DisplayHandle, hwnd.whole_window, NetAtoms[(int)NA._XEMBED_INFO], NetAtoms[(int)NA._XEMBED_INFO], 32, PropertyMode.Replace, atoms, 2);
-
- // Need to pick some reasonable defaults
- tt = new ToolTip();
- tt.AutomaticDelay = 100;
- tt.InitialDelay = 250;
- tt.ReshowDelay = 250;
- tt.ShowAlways = true;
-
- if ((tip != null) && (tip != string.Empty)) {
- tt.SetToolTip(Control.FromHandle(handle), tip);
- tt.Active = true;
- } else {
- tt.Active = false;
- }
-
- // Make sure the window exists
- XSync(DisplayHandle, hwnd.whole_window);
-
- SendNetClientMessage(SystrayMgrWindow, NetAtoms[(int)NA._NET_SYSTEM_TRAY_OPCODE], IntPtr.Zero, (IntPtr)SystrayRequest.SYSTEM_TRAY_REQUEST_DOCK, hwnd.whole_window);
- return true;
- }
- tt = null;
- return false;
- }
-
- internal override bool SystrayChange(IntPtr handle, string tip, Icon icon, ref ToolTip tt) {
- Control control;
-
- control = Control.FromHandle(handle);
- if (control != null && tt != null) {
- tt.SetToolTip(control, tip);
- tt.Active = true;
- return true;
- } else {
- return false;
- }
- }
-
- internal override void SystrayRemove(IntPtr handle, ref ToolTip tt) {
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- XUnmapWindow(DisplayHandle, hwnd.whole_window);
- SetParent(hwnd.whole_window, FosterParent);
-
- // The caller can now re-dock it later...
- if (tt != null) {
- tt.Dispose();
- tt = null;
- }
- }
-
- internal override bool Text(IntPtr handle, string text) {
- lock (XlibLock) {
- // FIXME - use _NET properties
- XStoreName(DisplayHandle, Hwnd.ObjectFromHandle(handle).whole_window, text);
- }
- return true;
- }
-
- internal override bool TranslateMessage(ref MSG msg) {
- return Keyboard.TranslateMessage (ref msg);
- }
-
- internal override void UpdateWindow(IntPtr handle) {
- XEvent xevent;
- Hwnd hwnd;
-
- hwnd = Hwnd.ObjectFromHandle(handle);
-
- if (!hwnd.visible || hwnd.expose_pending) {
- return;
- }
-
-#if not
- SendMessage(handle, Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
-#else
- xevent = new XEvent();
- xevent.type = XEventName.Expose;
- xevent.ExposeEvent.display = DisplayHandle;
- xevent.ExposeEvent.window = hwnd.client_window;
-
- MessageQueue.Enqueue(xevent);
- hwnd.expose_pending = true;
-#endif
- }
- #endregion // Public Static Methods
-
- #region Events
- internal override event EventHandler Idle;
- #endregion // Events
-
- #region X11 Imports
- [DllImport ("libX11", EntryPoint="XOpenDisplay")]
- internal extern static IntPtr XOpenDisplay(IntPtr display);
- [DllImport ("libX11", EntryPoint="XCloseDisplay")]
- internal extern static int XCloseDisplay(IntPtr display);
- [DllImport ("libX11", EntryPoint="XSynchronize")]
- internal extern static IntPtr XSynchronize(IntPtr display, bool onoff);
-
- [DllImport ("libX11", EntryPoint="XCreateWindow")]
- internal extern static IntPtr XCreateWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, int depth, int xclass, IntPtr visual, UIntPtr valuemask, ref XSetWindowAttributes attributes);
- [DllImport ("libX11", EntryPoint="XCreateSimpleWindow")]
- internal extern static IntPtr XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background);
- [DllImport ("libX11", EntryPoint="XMapWindow")]
- internal extern static int XMapWindow(IntPtr display, IntPtr window);
- [DllImport ("libX11", EntryPoint="XUnmapWindow")]
- internal extern static int XUnmapWindow(IntPtr display, IntPtr window);
- [DllImport ("libX11", EntryPoint="XMapSubwindows")]
- internal extern static int XMapSubindows(IntPtr display, IntPtr window);
- [DllImport ("libX11", EntryPoint="XUnmapSubwindows")]
- internal extern static int XUnmapSubwindows(IntPtr display, IntPtr window);
- [DllImport ("libX11", EntryPoint="XRootWindow")]
- internal extern static IntPtr XRootWindow(IntPtr display, int screen_number);
- [DllImport ("libX11", EntryPoint="XNextEvent")]
- internal extern static IntPtr XNextEvent(IntPtr display, ref XEvent xevent);
- [DllImport ("libX11")]
- internal extern static int XConnectionNumber (IntPtr diplay);
- [DllImport ("libX11")]
- internal extern static int XPending (IntPtr diplay);
- [DllImport ("libX11", EntryPoint="XSelectInput")]
- internal extern static IntPtr XSelectInput(IntPtr display, IntPtr window, IntPtr mask);
-
- [DllImport ("libX11", EntryPoint="XDestroyWindow")]
- internal extern static int XDestroyWindow(IntPtr display, IntPtr window);
-
- [DllImport ("libX11", EntryPoint="XReparentWindow")]
- internal extern static int XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y);
- [DllImport ("libX11", EntryPoint="XMoveResizeWindow")]
- internal extern static int XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height);
-
- [DllImport ("libX11", EntryPoint="XResizeWindow")]
- internal extern static int XResizeWindow(IntPtr display, IntPtr window, int width, int height);
-
- [DllImport ("libX11", EntryPoint="XGetWindowAttributes")]
- internal extern static int XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes);
-
- [DllImport ("libX11", EntryPoint="XFlush")]
- internal extern static int XFlush(IntPtr display);
-
- [DllImport ("libX11", EntryPoint="XSetWMName")]
- internal extern static int XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop);
-
- [DllImport ("libX11", EntryPoint="XStoreName")]
- internal extern static int XStoreName(IntPtr display, IntPtr window, string window_name);
-
- [DllImport ("libX11", EntryPoint="XFetchName")]
- internal extern static int XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name);
-
- [DllImport ("libX11", EntryPoint="XSendEvent")]
- internal extern static int XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event);
-
- [DllImport ("libX11", EntryPoint="XQueryTree")]
- internal extern static int XQueryTree(IntPtr display, IntPtr window, out IntPtr root_return, out IntPtr parent_return, out IntPtr children_return, out int nchildren_return);
-
- [DllImport ("libX11", EntryPoint="XFree")]
- internal extern static int XFree(IntPtr data);
-
- [DllImport ("libX11", EntryPoint="XRaiseWindow")]
- internal extern static int XRaiseWindow(IntPtr display, IntPtr window);
-
- [DllImport ("libX11", EntryPoint="XLowerWindow")]
- internal extern static uint XLowerWindow(IntPtr display, IntPtr window);
-
- [DllImport ("libX11", EntryPoint="XConfigureWindow")]
- internal extern static uint XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values);
-
- [DllImport ("libX11", EntryPoint="XInternAtom")]
- internal extern static IntPtr XInternAtom(IntPtr display, string atom_name, bool only_if_exists);
-
- [DllImport ("libX11", EntryPoint="XSetWMProtocols")]
- internal extern static int XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count);
-
- [DllImport ("libX11", EntryPoint="XGrabPointer")]
- internal extern static int XGrabPointer(IntPtr display, IntPtr window, bool owner_events, EventMask event_mask, GrabMode pointer_mode, GrabMode keyboard_mode, IntPtr confine_to, IntPtr cursor, IntPtr timestamp);
-
- [DllImport ("libX11", EntryPoint="XUngrabPointer")]
- internal extern static int XUngrabPointer(IntPtr display, IntPtr timestamp);
-
- [DllImport ("libX11", EntryPoint="XQueryPointer")]
- internal extern static bool XQueryPointer(IntPtr display, IntPtr window, out IntPtr root, out IntPtr child, out int root_x, out int root_y, out int win_x, out int win_y, out int keys_buttons);
-
- [DllImport ("libX11", EntryPoint="XTranslateCoordinates")]
- internal extern static bool XTranslateCoordinates (IntPtr display, IntPtr src_w, IntPtr dest_w, int src_x, int src_y, out int intdest_x_return, out int dest_y_return, out IntPtr child_return);
-
- [DllImport ("libX11", EntryPoint="XGetGeometry")]
- internal extern static bool XGetGeometry(IntPtr display, IntPtr window, out IntPtr root, out int x, out int y, out int width, out int height, out int border_width, out int depth);
-
- [DllImport ("libX11", EntryPoint="XGetGeometry")]
- internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, out int width, out int height, IntPtr border_width, IntPtr depth);
-
- [DllImport ("libX11", EntryPoint="XGetGeometry")]
- internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, IntPtr width, IntPtr height, IntPtr border_width, IntPtr depth);
-
- [DllImport ("libX11", EntryPoint="XGetGeometry")]
- internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, IntPtr x, IntPtr y, out int width, out int height, IntPtr border_width, IntPtr depth);
-
- [DllImport ("libX11", EntryPoint="XWarpPointer")]
- internal extern static uint XWarpPointer(IntPtr display, IntPtr src_w, IntPtr dest_w, int src_x, int src_y, uint src_width, uint src_height, int dest_x, int dest_y);
-
- [DllImport ("libX11", EntryPoint="XClearWindow")]
- internal extern static int XClearWindow(IntPtr display, IntPtr window);
-
- [DllImport ("libX11", EntryPoint="XClearArea")]
- internal extern static int XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures);
-
- // Colormaps
- [DllImport ("libX11", EntryPoint="XDefaultScreenOfDisplay")]
- internal extern static IntPtr XDefaultScreenOfDisplay(IntPtr display);
-
- [DllImport ("libX11", EntryPoint="XScreenNumberOfScreen")]
- internal extern static int XScreenNumberOfScreen(IntPtr display, IntPtr Screen);
-
- [DllImport ("libX11", EntryPoint="XDefaultVisual")]
- internal extern static IntPtr XDefaultVisual(IntPtr display, int screen_number);
-
- [DllImport ("libX11", EntryPoint="XDefaultDepth")]
- internal extern static uint XDefaultDepth(IntPtr display, int screen_number);
-
- [DllImport ("libX11", EntryPoint="XDefaultScreen")]
- internal extern static int XDefaultScreen(IntPtr display);
-
- [DllImport ("libX11", EntryPoint="XDefaultColormap")]
- internal extern static IntPtr XDefaultColormap(IntPtr display, int screen_number);
-
- [DllImport ("libX11", EntryPoint="XLookupColor")]
- internal extern static int XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color);
-
- [DllImport ("libX11", EntryPoint="XAllocColor")]
- internal extern static int XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def);
-
- [DllImport ("libX11", EntryPoint="XSetTransientForHint")]
- internal extern static int XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window);
-
- [DllImport ("libX11", EntryPoint="XChangeProperty")]
- internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements);
-
- [DllImport ("libX11", EntryPoint="XChangeProperty")]
- internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements);
-
- [DllImport ("libX11", EntryPoint="XChangeProperty")]
- internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements);
-
- [DllImport ("libX11", EntryPoint="XChangeProperty")]
- internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements);
-
- [DllImport ("libX11", EntryPoint="XChangeProperty")]
- internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements);
-
- [DllImport ("libX11", EntryPoint="XChangeProperty", CharSet=CharSet.Ansi)]
- internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length);
-
- [DllImport ("libX11", EntryPoint="XDeleteProperty")]
- internal extern static int XDeleteProperty(IntPtr display, IntPtr window, IntPtr property);
-
- [DllImport ("gdiplus", EntryPoint="GetFontMetrics")]
- internal extern static bool GetFontMetrics(IntPtr graphicsObject, IntPtr nativeObject, out int ascent, out int descent);
-
- // Drawing
- [DllImport ("libX11", EntryPoint="XCreateGC")]
- internal extern static IntPtr XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values);
-
- [DllImport ("libX11", EntryPoint="XFreeGC")]
- internal extern static int XFreeGC(IntPtr display, IntPtr gc);
-
- [DllImport ("libX11", EntryPoint="XSetFunction")]
- internal extern static int XSetFunction(IntPtr display, IntPtr gc, GXFunction function);
-
- [DllImport ("libX11", EntryPoint="XDrawLine")]
- internal extern static int XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2);
-
- [DllImport ("libX11", EntryPoint="XDrawRectangle")]
- internal extern static int XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
-
- [DllImport ("libX11", EntryPoint="XSetWindowBackground")]
- internal extern static int XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background);
-
- [DllImport ("libX11", EntryPoint="XCopyArea")]
- internal extern static int XCopyArea(IntPtr display, IntPtr src, IntPtr dest, IntPtr gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y);
-
- [DllImport ("libX11", EntryPoint="XGetWindowProperty")]
- internal extern static int XGetWindowProperty(IntPtr display, IntPtr window, IntPtr atom, IntPtr long_offset, IntPtr long_length, bool delete, IntPtr req_type, out IntPtr actual_type, out int actual_format, out IntPtr nitems, out IntPtr bytes_after, ref IntPtr prop);
-
- [DllImport ("libX11", EntryPoint="XSetInputFocus")]
- internal extern static int XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time);
-
- [DllImport ("libX11", EntryPoint="XIconifyWindow")]
- internal extern static int XIconifyWindow(IntPtr display, IntPtr window, int screen_number);
-
- [DllImport ("libX11", EntryPoint="XDefineCursor")]
- internal extern static int XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor);
-
- [DllImport ("libX11", EntryPoint="XUndefineCursor")]
- internal extern static int XUndefineCursor(IntPtr display, IntPtr window);
-
- [DllImport ("libX11", EntryPoint="XFreeCursor")]
- internal extern static int XFreeCursor(IntPtr display, IntPtr cursor);
-
- [DllImport ("libX11", EntryPoint="XCreateFontCursor")]
- internal extern static IntPtr XCreateFontCursor(IntPtr display, CursorFontShape shape);
-
- [DllImport ("libX11", EntryPoint="XCreatePixmapCursor")]
- internal extern static IntPtr XCreatePixmapCursor(IntPtr display, IntPtr source, IntPtr mask, ref XColor foreground_color, ref XColor background_color, int x_hot, int y_hot);
-
- [DllImport ("libX11", EntryPoint="XCreatePixmapFromBitmapData")]
- internal extern static IntPtr XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth);
-
- [DllImport ("libX11", EntryPoint="XFreePixmap")]
- internal extern static IntPtr XFreePixmap(IntPtr display, IntPtr pixmap);
-
- [DllImport ("libX11", EntryPoint="XQueryBestCursor")]
- internal extern static int XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height);
-
- [DllImport ("libX11", EntryPoint="XWhitePixel")]
- internal extern static IntPtr XWhitePixel(IntPtr display, int screen_no);
-
- [DllImport ("libX11", EntryPoint="XBlackPixel")]
- internal extern static IntPtr XBlackPixel(IntPtr display, int screen_no);
-
- [DllImport ("libX11", EntryPoint="XGrabServer")]
- internal extern static void XGrabServer(IntPtr display);
-
- [DllImport ("libX11", EntryPoint="XUngrabServer")]
- internal extern static void XUngrabServer(IntPtr display);
-
- [DllImport ("libX11", EntryPoint="XSetWMNormalHints")]
- internal extern static void XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints);
-
- [DllImport ("libX11", EntryPoint="XSetZoomHints")]
- internal extern static void XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints);
-
- [DllImport ("libX11", EntryPoint="XSetWMHints")]
- internal extern static void XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints);
-
- [DllImport ("libX11", EntryPoint="XSync")]
- internal extern static void XSync(IntPtr display, IntPtr window);
-
- [DllImport ("libX11", EntryPoint="XGetIconSizes")]
- internal extern static int XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count);
-
- [DllImport ("libX11", EntryPoint="XSetErrorHandler")]
- internal extern static IntPtr XSetErrorHandler(XErrorHandler error_handler);
-
- [DllImport ("libX11", EntryPoint="XGetErrorText")]
- internal extern static IntPtr XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length);
-
- [DllImport ("libX11", EntryPoint="XInitThreads")]
- internal extern static int XInitThreads();
-
- [DllImport ("libX11", EntryPoint="XConvertSelection")]
- internal extern static int XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time);
-
- [DllImport ("libX11", EntryPoint="XGetSelectionOwner")]
- internal extern static IntPtr XGetSelectionOwner(IntPtr display, IntPtr selection);
-
- [DllImport ("libX11", EntryPoint="XSetSelectionOwner")]
- internal extern static int XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time);
-
- [DllImport ("libX11", EntryPoint="XSetPlaneMask")]
- internal extern static int XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask);
-
- [DllImport ("libX11", EntryPoint="XSetForeground")]
- internal extern static int XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground);
-
- [DllImport ("libX11", EntryPoint="XSetBackground")]
- internal extern static int XSetBackground(IntPtr display, IntPtr gc, UIntPtr background);
-
- [DllImport ("libX11", EntryPoint="XBell")]
- internal extern static int XBell(IntPtr display, int percent);
-
- [DllImport ("libX11", EntryPoint="XChangeActivePointerGrab")]
- internal extern static int XChangeActivePointerGrab (IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time);
- #endregion
- }
-}