#pragma warning restore 414 #endregion #region Constructors public X11GLNative(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device) : this() { if (width <= 0) throw new ArgumentOutOfRangeException("width", "Must be higher than zero."); if (height <= 0) throw new ArgumentOutOfRangeException("height", "Must be higher than zero."); Debug.Indent(); using (new XLock(window.Display)) { IntPtr visual; IntPtr fbconfig; window.GraphicsMode = new X11GraphicsMode() .SelectGraphicsMode(mode, out visual, out fbconfig); window.Visual = visual; window.FBConfig = fbconfig; // Create a window on this display using the visual above Debug.Write("Opening render window... "); XSetWindowAttributes attributes = new XSetWindowAttributes(); attributes.background_pixel = IntPtr.Zero; attributes.border_pixel = IntPtr.Zero; attributes.colormap = Functions.XCreateColormap(window.Display, window.RootWindow, window.VisualInfo.Visual, 0/*AllocNone*/); window.EventMask = EventMask.StructureNotifyMask /*| EventMask.SubstructureNotifyMask*/ | EventMask.ExposureMask | EventMask.KeyReleaseMask | EventMask.KeyPressMask | EventMask.KeymapStateMask | EventMask.PointerMotionMask | EventMask.FocusChangeMask | EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.EnterWindowMask | EventMask.LeaveWindowMask | EventMask.PropertyChangeMask; attributes.event_mask = (IntPtr)window.EventMask; SetWindowValuemask mask = SetWindowValuemask.ColorMap | SetWindowValuemask.EventMask | SetWindowValuemask.BackPixel | SetWindowValuemask.BorderPixel; window.Handle = Functions.XCreateWindow(window.Display, window.RootWindow, x, y, width, height, 0, window.VisualInfo.Depth/*(int)CreateWindowArgs.CopyFromParent*/, CreateWindowArgs.InputOutput, window.VisualInfo.Visual, mask, attributes); if (window.Handle == IntPtr.Zero) throw new ApplicationException("XCreateWindow call failed (returned 0)."); if (title != null) Functions.XStoreName(window.Display, window.Handle, title); } XSizeHints hints = new XSizeHints(); hints.base_width = width; hints.base_height = height; hints.flags = (IntPtr)(XSizeHintsFlags.PSize | XSizeHintsFlags.PPosition); XClassHint class_hint = new XClassHint(); class_hint.Name = Assembly.GetEntryAssembly().GetName().Name.ToLower(); class_hint.Class = Assembly.GetEntryAssembly().GetName().Name; using (new XLock(window.Display)) { Functions.XSetWMNormalHints(window.Display, window.Handle, ref hints); // Register for window destroy notification Functions.XSetWMProtocols(window.Display, window.Handle, new IntPtr[] { _atom_wm_destroy }, 1); // Set the window class hints Functions.XSetClassHint(window.Display, window.Handle, ref class_hint); } SetWindowMinMax(_min_width, _min_height, -1, -1); // Set the initial window size to ensure X, Y, Width, Height and the rest // return the correct values inside the constructor and the Load event. XEvent e = new XEvent(); e.ConfigureEvent.x = x; e.ConfigureEvent.y = y; e.ConfigureEvent.width = width; e.ConfigureEvent.height = height; RefreshWindowBounds(ref e); EmptyCursor = CreateEmptyCursor(window); Debug.WriteLine(String.Format("X11GLNative window created successfully (id: {0}).", Handle)); Debug.Unindent(); using (new XLock(window.Display)) { // Request that auto-repeat is only set on devices that support it physically. // This typically means that it's turned off for keyboards (which is what we want). // We prefer this method over XAutoRepeatOff/On, because the latter needs to // be reset before the program exits. if (Xkb.IsSupported(window.Display)) { bool supported; Xkb.SetDetectableAutoRepeat(window.Display, true, out supported); } } // The XInput2 extension makes keyboard and mouse handling much easier. // Check whether it is available. xi2_supported = XI2MouseKeyboard.IsSupported(window.Display); if (xi2_supported) { xi2_opcode = XI2MouseKeyboard.XIOpCode; xi2_version = XI2MouseKeyboard.XIVersion; } exists = true; }
public static extern void XSetClassHint(IntPtr display, IntPtr window, ref XClassHint hint);