From: Ivan Zlatev Date: Wed, 17 Sep 2008 21:00:00 +0000 (-0000) Subject: 2008-09-17 Ivan N. Zlatev X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=ab280984dc0d82399506999a16b4b356767d496d;p=mono.git 2008-09-17 Ivan N. Zlatev * XplatUIX11.cs, X11Structs.cs: For mapped windows SetTopMost should ask the window manager to do the work instead of changing the property directly. [Fixes bug #423417] svn path=/trunk/mcs/; revision=113351 --- diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog index 979f2a8af3e..30c264c0e01 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog @@ -1,3 +1,10 @@ +2008-09-17 Ivan N. Zlatev + + * XplatUIX11.cs, X11Structs.cs: For mapped windows SetTopMost should + ask the window manager to do the work instead of changing the property + directly. + [Fixes bug #423417] + 2008-09-17 Everaldo Canuto * CurrencyManager.cs: Check for positon before call ChangeRecordState in diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/X11Structs.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/X11Structs.cs index d7e18895eef..38622afb673 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/X11Structs.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/X11Structs.cs @@ -1353,6 +1353,12 @@ namespace System.Windows.Forms { SYSTEM_TRAY_CANCEL_MESSAGE = 2 } + internal enum NetWmStateRequest { + _NET_WM_STATE_REMOVE = 0, + _NET_WM_STATE_ADD = 1, + _NET_WM_STATE_TOGGLE = 2 + } + [Flags] internal enum XSizeHintsFlags { USPosition = (1 << 0), diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs index fda0b2efbdf..6e91d4e7262 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs @@ -5394,13 +5394,20 @@ namespace System.Windows.Forms { if (enabled) { lock (XlibLock) { - int[] atoms = new int[8]; - atoms[0] = _NET_WM_STATE_ABOVE.ToInt32(); - XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1); + if (hwnd.Mapped) { + SendNetWMMessage(hwnd.WholeWindow, _NET_WM_STATE, (IntPtr) NetWmStateRequest._NET_WM_STATE_ADD, _NET_WM_STATE_ABOVE, IntPtr.Zero); + } else { + int[] atoms = new int[8]; + atoms[0] = _NET_WM_STATE_ABOVE.ToInt32(); + XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1); + } } } else { lock (XlibLock) { - XDeleteProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE); + if (hwnd.Mapped) + SendNetWMMessage(hwnd.WholeWindow, _NET_WM_STATE, (IntPtr) NetWmStateRequest._NET_WM_STATE_REMOVE, _NET_WM_STATE_ABOVE, IntPtr.Zero); + else + XDeleteProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE); } } return true;