Пример #1
0
        /// <summary>
        /// Set a winform windows "X group leader" value.
        /// By default all mono winform applications get the same group leader (WM_HINTS property)
        /// (use xprop to see a windows WM_HINTS values)
        /// </summary>
        public static void SetGroupLeader(IntPtr handle, IntPtr newValue)
        {
            var    x11Handle = MonoGetX11Window(handle);
            IntPtr ptr       = NativeX11Methods.XGetWMHints(NativeReplacements.MonoGetDisplayHandle(), x11Handle);
            var    wmhints   = (NativeX11Methods.XWMHints)Marshal.PtrToStructure(ptr, typeof(NativeX11Methods.XWMHints));

            NativeX11Methods.XFree(ptr);
            wmhints.window_group = NativeReplacements.MonoGetX11Window(newValue);
            NativeX11Methods.XSetWMHints(NativeReplacements.MonoGetDisplayHandle(), NativeReplacements.MonoGetX11Window(x11Handle), ref wmhints);
        }
Пример #2
0
        /// <summary>
        /// Set InputFocus to a WinForm controls using Mono winforms connection to the X11 server.
        /// GeckoWebBrowser.RemoveInputFocus uses the Gecko/Gtk connection to the X11 server.
        /// The undoes the call to _browser.SetInputFocus.
        /// Call this method when a winform control has gained focus, and X11 Input focus is still on the Gecko control.
        /// </summary>
        protected static void MoveInputFocusBackToAWinFormsControl()
        {
            if (Platform.IsWindows)
            {
                return;
            }

            IntPtr newTargetHandle = NativeReplacements.MonoGetFocus();
            IntPtr displayHandle   = NativeReplacements.MonoGetDisplayHandle();

            // Remove the Focus from a Gtk window back to a mono winform X11 window.
            NativeX11Methods.XSetInputFocus(displayHandle, NativeReplacements.MonoGetX11Window(newTargetHandle), NativeX11Methods.RevertTo.None, IntPtr.Zero);
        }
Пример #3
0
        protected override void OnLeave(EventArgs e)
        {
            if (_browser != null)
            {
                _browser.RemoveInputFocus();
                if (_browser.WebBrowserFocus != null)
                {
                    _browser.WebBrowserFocus.Deactivate();
                }
            }

            _entered = false;

            base.OnLeave(e);
            if (Platform.IsWindows)
            {
                return;
            }

            Action EnsureXInputFocusIsRemovedFromReceivedWinFormsControl = () =>
            {
                var control     = Control.FromHandle(NativeReplacements.MonoGetFocus());
                var controlName = control.GetType().FullName;
                if (controlName == "Gecko.GeckoWebBrowser")
                {
                    return;
                }
                MoveInputFocusBackToAWinFormsControl();

                // Setting the ActiveControl ensure a Focus event occurs on the control focus is moving to.
                // And this allows us to call RemoveinputFocus at the neccessary time.
                // This prevents keypress still going to the gecko controls when a winform TextBox has focus
                // and the mouse is over a gecko control.
                Form.ActiveForm.ActiveControl = control;
                EventHandler focusEvent = null;
                // Attach a execute once only focus handler to the Non GeckoWebBrowser control focus is moving too...
                focusEvent = (object sender, EventArgs eventArg) =>
                {
                    control.GotFocus -= focusEvent;
                    MoveInputFocusBackToAWinFormsControl();
                };

                control.GotFocus += focusEvent;
            };

            ProgressUtils.InvokeLaterOnUIThread(
                () => EnsureXInputFocusIsRemovedFromReceivedWinFormsControl());
        }
Пример #4
0
        public static void SetWmClass(string name, string @class, IntPtr handle)
        {
            var a = new NativeX11Methods.XClassHint {
                res_name = Marshal.StringToCoTaskMemAnsi(name), res_class = Marshal.StringToCoTaskMemAnsi(@class)
            };
            IntPtr classHints = Marshal.AllocCoTaskMem(Marshal.SizeOf(a));

            Marshal.StructureToPtr(a, classHints, true);

            NativeX11Methods.XSetClassHint(NativeReplacements.MonoGetDisplayHandle(), NativeReplacements.MonoGetX11Window(handle), classHints);

            Marshal.FreeCoTaskMem(a.res_name);
            Marshal.FreeCoTaskMem(a.res_class);

            Marshal.FreeCoTaskMem(classHints);
        }