From: Robert Roebling Date: Wed, 13 Mar 2002 18:25:11 +0000 (+0000) Subject: Send size events from top level windows in idle time, X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/77df2fbce63ee136e2b0004a54b09c47e4576bf4 Send size events from top level windows in idle time, this significantly improves the opaque resizing look and feel and seems to speed up dialog show up time. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14579 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/x11/toplevel.h b/include/wx/x11/toplevel.h index 1488491844..4ca3ac2df1 100644 --- a/include/wx/x11/toplevel.h +++ b/include/wx/x11/toplevel.h @@ -57,28 +57,29 @@ public: virtual void SetIcon(const wxIcon& icon); virtual void Restore(); - virtual bool Show(bool show = TRUE); + virtual bool Show( bool show = TRUE ); - virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL); + virtual bool ShowFullScreen( bool show, long style = wxFULLSCREEN_ALL ); virtual bool IsFullScreen() const { return m_fsIsShowing; } virtual void SetTitle( const wxString& title); virtual wxString GetTitle() const; - // implementation from now on - // -------------------------- + // implementation + void SetNeedResizeInIdle( bool set = TRUE ) { m_needResizeInIdle = set; } - void SetFocusWidget( wxWindow *focus ) { m_focusWidget = focus; } - wxWindow *GetFocusWidget() const { return m_focusWidget; } - protected: // common part of all ctors void Init(); - // For implementation purposes - sometimes decorations make the client area - // smaller + // For implementation purposes - sometimes decorations make the + // client area smaller virtual wxPoint GetClientAreaOrigin() const; + // For implementation of delayed resize events + bool m_needResizeInIdle; + virtual void OnInternalIdle(); + virtual void DoGetClientSize( int *width, int *height ) const; virtual void DoSetClientSize(int width, int height); virtual void DoSetSize(int x, int y, @@ -99,9 +100,6 @@ protected: bool m_fsIsMaximized; bool m_fsIsShowing; wxString m_title; - - // This widget gets the key input - wxWindow* m_focusWidget; }; // list of all frames and modeless dialogs diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 56b32f21aa..a35a1e0546 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -526,10 +526,18 @@ bool wxApp::ProcessXEvent(WXEvent* _event) #endif { //wxLogDebug("ConfigureNotify: %s", windowClass.c_str()); - wxSizeEvent sizeEvent( wxSize(XConfigureEventGetWidth(event), XConfigureEventGetHeight(event)), win->GetId() ); - sizeEvent.SetEventObject( win ); + if (win->IsTopLevel()) + { + wxTopLevelWindowX11 *tlw = (wxTopLevelWindowX11 *) win; + tlw->SetNeedResizeInIdle(); + } + else + { + wxSizeEvent sizeEvent( wxSize(XConfigureEventGetWidth(event), XConfigureEventGetHeight(event)), win->GetId() ); + sizeEvent.SetEventObject( win ); - return win->GetEventHandler()->ProcessEvent( sizeEvent ); + return win->GetEventHandler()->ProcessEvent( sizeEvent ); + } } return FALSE; break; diff --git a/src/x11/toplevel.cpp b/src/x11/toplevel.cpp index e585e1557a..1f683ae6cd 100644 --- a/src/x11/toplevel.cpp +++ b/src/x11/toplevel.cpp @@ -62,7 +62,7 @@ void wxTopLevelWindowX11::Init() m_fsIsMaximized = FALSE; m_fsIsShowing = FALSE; - m_focusWidget = NULL; + m_needResizeInIdle = FALSE; } bool wxTopLevelWindowX11::Create(wxWindow *parent, @@ -225,6 +225,18 @@ wxTopLevelWindowX11::~wxTopLevelWindowX11() } } +void wxTopLevelWindowX11::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + if (m_needResizeInIdle) + { + wxSizeEvent event( GetClientSize(), GetId() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); + } +} + // ---------------------------------------------------------------------------- // wxTopLevelWindowX11 showing // ---------------------------------------------------------------------------- @@ -235,12 +247,14 @@ bool wxTopLevelWindowX11::Show(bool show) // else there's no initial size. #if wxUSE_NANOX if (show) +#else + if (show && m_needResizeInIdle) +#endif { wxSizeEvent event(GetSize(), GetId()); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); } -#endif return wxWindowX11::Show(show); }