// Determine if a specific child currently has the focus. internal bool HasFocus(InputOnlyWidget widget) { return (hasPrimaryFocus && focusWidget == widget); }
// Detect that this top-level window has gained the primary focus. private void PrimaryFocusIn() { if(!hasPrimaryFocus) { hasPrimaryFocus = true; OnPrimaryFocusIn(); if(defaultFocus != null) { focusWidget = defaultFocus; focusWidget.DispatchFocusIn(null); } else if(focusWidget != null) { focusWidget.DispatchFocusIn(null); } } }
// Set the focus widget to a specific child. internal void SetFocus(InputOnlyWidget widget) { if(!hasPrimaryFocus) { focusWidget = widget; } else if(focusWidget != widget) { InputOnlyWidget oldFocus = focusWidget; focusWidget = widget; oldFocus.DispatchFocusOut(widget); if(focusWidget == widget) { widget.DispatchFocusIn(oldFocus); } } }
// Internal constructor, that can create a top-level window on either // the root window or underneath an MDI client parent. public TopLevelWindow(Widget parent, String name, int x, int y, int width, int height) : base(parent, x, y, width, height, new Color(StandardColor.Foreground), new Color(StandardColor.Background), true, false) { // Check the parent. if(!(parent is RootWindow) && !(parent is CaptionWidget)) { throw new XInvalidOperationException(); } // Initialize this object's state. this.name = ((name != null) ? name : String.Empty); this.iconic = false; this.maximized = false; this.hasPrimaryFocus = false; this.reparented = false; this.sticky = false; this.shaded = false; this.hidden = false; this.fullScreen = false; this.keyBuffer = IntPtr.Zero; this.focusWidget = this; this.defaultFocus = null; this.decorations = MotifDecorations.All; this.functions = MotifFunctions.All; this.inputType = MotifInputType.Normal; this.transientFor = null; this.resizeTimer = null; this.expectedWidth = -1; this.expectedHeight = -1; // Top-level widgets receive all key and focus events. SelectInput(EventMask.KeyPressMask | EventMask.KeyReleaseMask | EventMask.FocusChangeMask | EventMask.StructureNotifyMask | EventMask.PropertyChangeMask); // We don't use WM properties if the parent is a CaptionWidget. if(parent is CaptionWidget) { return; } // Set the initial WM properties. try { // Lock down the display and get the window handle. IntPtr display = dpy.Lock(); XWindow handle = GetWidgetHandle(); // Make this the group leader if we don't have one yet. bool isFirst = false; if(dpy.groupLeader == XWindow.Zero) { dpy.groupLeader = handle; isFirst = true; } // Set the WM_CLASS hint. Application app = Application.Primary; if(app != null) { XClassHint classHint = new XClassHint(); classHint.res_name = app.ResourceName; classHint.res_class = app.ResourceClass; Xlib.XSetClassHint(display, handle, ref classHint); classHint.Free(); } // Set the title bar and icon names. SetWindowName(display, handle, this.name); // Ask for "WM_DELETE_WINDOW" and "WM_TAKE_FOCUS". SetProtocols(display, handle); // Set the window hints. if(isFirst && app != null && app.StartIconic) { // The user supplied "-iconic" on the command-line. iconic = true; } SetWMHints(display, handle); // Set some other string properties. String cultureName = CultureInfo.CurrentCulture.Name; if(cultureName == null || (cultureName.Length == 0)) { cultureName = "en_US"; } else { cultureName = cultureName.Replace("-", "_"); } SetTextProperty(display, handle, "WM_LOCALE_NAME", cultureName); String hostname = Application.Hostname; if(hostname != null) { SetTextProperty(display, handle, "WM_CLIENT_MACHINE", hostname); } if(isFirst) { String[] args = Environment.GetCommandLineArgs(); if(args != null && args.Length > 0) { // We put "ilrun" at the start of the command, // because the command needs to be in a form // that can be directly executed by fork/exec, // and IL binaries normally aren't in this form. String[] newArgs = new String [args.Length + 1]; newArgs[0] = "ilrun"; Array.Copy(args, 0, newArgs, 1, args.Length); SetTextProperty(display, handle, "WM_COMMAND", newArgs); } } #if CONFIG_EXTENDED_DIAGNOSTICS // Put the process ID on the window. int pid = Process.GetCurrentProcess().Id; if(pid != -1 && pid != 0) { Xlib.XChangeProperty (display, handle, Xlib.XInternAtom(display, "_NET_WM_PID", XBool.False), Xlib.XInternAtom(display, "CARDINAL", XBool.False), 32, 0 /* PropModeReplace */, new Xlib.Xlong [] {(Xlib.Xlong)(pid)}, 1); } #endif } finally { dpy.Unlock(); } }