From fce611e426eb2befea2e6a6dba765f7a817b69bd Mon Sep 17 00:00:00 2001 From: Paul Cornett Date: Wed, 23 Apr 2008 17:05:47 +0000 Subject: [PATCH] restore caching of WM frame extents git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53322 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/toplevel.h | 2 ++ src/gtk/minifram.cpp | 3 +++ src/gtk/toplevel.cpp | 24 +++++++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/wx/gtk/toplevel.h b/include/wx/gtk/toplevel.h index 61ec62fc9a..463537c387 100644 --- a/include/wx/gtk/toplevel.h +++ b/include/wx/gtk/toplevel.h @@ -143,6 +143,8 @@ protected: wxString m_title; private: + wxSize& GetCachedDecorSize(); + // is the frame currently iconized? bool m_isIconized; diff --git a/src/gtk/minifram.cpp b/src/gtk/minifram.cpp index b84b537ef2..a452992cc8 100644 --- a/src/gtk/minifram.cpp +++ b/src/gtk/minifram.cpp @@ -354,6 +354,9 @@ bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title m_gdkFunc = 0; if (style & wxRESIZE_BORDER) m_gdkFunc = GDK_FUNC_RESIZE; + gtk_window_set_default_size(GTK_WINDOW(m_widget), m_width, m_height); + m_decorSize.Set(0, 0); + m_deferShow = false; // don't allow sizing smaller than decorations GdkGeometry geom; diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index bf8bde87c0..f54484436b 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -624,7 +624,10 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, } } - gtk_window_set_default_size(GTK_WINDOW(m_widget), m_width, m_height); + m_decorSize = GetCachedDecorSize(); + int w, h; + GTKDoGetSize(&w, &h); + gtk_window_set_default_size(GTK_WINDOW(m_widget), w, h); return true; } @@ -975,6 +978,8 @@ void wxTopLevelWindowGTK::DoSetSizeHints( int minW, int minH, void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize) { + if (!IsMaximized() && !IsFullScreen()) + GetCachedDecorSize() = decorSize; if (m_decorSize != decorSize) { const wxSize diff = decorSize - m_decorSize; @@ -1021,6 +1026,23 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize) } } +wxSize& wxTopLevelWindowGTK::GetCachedDecorSize() +{ + static wxSize size[8]; + + int index = 0; + // title bar + if (m_gdkDecor & (GDK_DECOR_MENU | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE | GDK_DECOR_TITLE)) + index = 1; + // border + if (m_gdkDecor & GDK_DECOR_BORDER) + index |= 2; + // utility window decor can be different + if (m_windowStyle & wxFRAME_TOOL_WINDOW) + index |= 4; + return size[index]; +} + void wxTopLevelWindowGTK::OnInternalIdle() { wxWindow::OnInternalIdle();