From 9fc8ed79533bfb8207a73e03f2a2d3a7a4a23f80 Mon Sep 17 00:00:00 2001 From: Chris Toshok Date: Thu, 15 Mar 2007 17:55:53 +0000 Subject: [PATCH] * Hwnd.cs: add an internal field for the cached_window_state. * XplatUIX11.cs: cache the window state, invalidating the cache (and thus re-querying the X server) only when we see an update to the _NET_WM_STATE property. 2007-03-15 Chris Toshok svn path=/trunk/mcs/; revision=74404 --- .../System.Windows.Forms/ChangeLog | 8 ++++++++ .../Managed.Windows.Forms/System.Windows.Forms/Hwnd.cs | 1 + .../System.Windows.Forms/XplatUIX11.cs | 17 ++++++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog index 81f3703719a..29065dd8b12 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog @@ -1,5 +1,13 @@ 2007-03-15 Chris Toshok + * Hwnd.cs: add an internal field for the cached_window_state. + + * XplatUIX11.cs: cache the window state, invalidating the cache + (and thus re-querying the X server) only when we see an update to + the _NET_WM_STATE property. + +2007-03-15 Chris Toshok + * BindingSource.cs: get a lot of the unit tests working. 2007-03-15 Jonathan Pobst diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Hwnd.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Hwnd.cs index fb7f3563baa..590989c36bd 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Hwnd.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Hwnd.cs @@ -79,6 +79,7 @@ namespace System.Windows.Forms { internal static Graphics bmp_g = Graphics.FromImage (bmp); internal XEventQueue queue; internal WindowExStyles initial_ex_style; + internal FormWindowState cached_window_state = (FormWindowState)(-1); /* X11 only field */ #endregion // Local Variables // locks for some operations (used in XplatUIX11.cs) 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 f66f2cf1591..11efd9e3e2e 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs @@ -1618,6 +1618,10 @@ namespace System.Windows.Forms { } } } + else if (xevent.PropertyEvent.atom == _NET_WM_STATE) { + // invalidate our cache - we'll query again the next time someone does GetWindowState. + hwnd.cached_window_state = (FormWindowState)(-1); + } break; } @@ -2446,7 +2450,7 @@ namespace System.Windows.Forms { } lock (XlibLock) { - XSelectInput(DisplayHandle, hwnd.whole_window, new IntPtr ((int)(SelectInputMask | EventMask.StructureNotifyMask))); + XSelectInput(DisplayHandle, hwnd.whole_window, new IntPtr ((int)(SelectInputMask | EventMask.StructureNotifyMask | EventMask.PropertyChangeMask))); if (hwnd.whole_window != hwnd.client_window) XSelectInput(DisplayHandle, hwnd.client_window, new IntPtr ((int)(SelectInputMask | EventMask.StructureNotifyMask))); } @@ -3982,6 +3986,17 @@ namespace System.Windows.Forms { } internal override FormWindowState GetWindowState(IntPtr handle) { + Hwnd hwnd; + + hwnd = Hwnd.ObjectFromHandle(handle); + + if (hwnd.cached_window_state == (FormWindowState)(-1)) + hwnd.cached_window_state = UpdateWindowState (handle); + + return hwnd.cached_window_state; + } + + private FormWindowState UpdateWindowState (IntPtr handle) { IntPtr actual_atom; int actual_format; IntPtr nitems; -- 2.11.4.GIT