diff --git a/include/wx/evtloop.h b/include/wx/evtloop.h index 2a71defd7a..4ff934f8a7 100644 --- a/include/wx/evtloop.h +++ b/include/wx/evtloop.h @@ -47,6 +47,9 @@ public: // return currently active (running) event loop, may be NULL static wxEventLoop *GetActive() { return ms_activeLoop; } + // set currently active (running) event loop + static void SetActive(wxEventLoop* loop) { ms_activeLoop = loop; } + protected: // the pointer to the port specific implementation class class WXDLLEXPORT wxEventLoopImpl *m_impl; diff --git a/src/x11/app.cpp b/src/x11/app.cpp index b41f8955e7..8d9e58933b 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -991,6 +991,16 @@ bool wxApp::Yield(bool onlyIfNeeded) s_inYield = TRUE; + // Make sure we have an event loop object, + // or Pending/Dispatch will fail + wxEventLoop* eventLoop = wxEventLoop::GetActive(); + wxEventLoop* newEventLoop = NULL; + if (!eventLoop) + { + newEventLoop = new wxEventLoop; + wxEventLoop::SetActive(newEventLoop); + } + while (wxTheApp && wxTheApp->Pending()) wxTheApp->Dispatch(); @@ -999,6 +1009,12 @@ bool wxApp::Yield(bool onlyIfNeeded) #endif ProcessIdle(); + if (newEventLoop) + { + wxEventLoop::SetActive(NULL); + delete newEventLoop; + } + s_inYield = FALSE; return TRUE; diff --git a/src/x11/toplevel.cpp b/src/x11/toplevel.cpp index b26cd79947..1e84bc6b1c 100644 --- a/src/x11/toplevel.cpp +++ b/src/x11/toplevel.cpp @@ -280,7 +280,6 @@ bool wxTopLevelWindowX11::Show(bool show) m_needResizeInIdle = FALSE; } - if (show) { // This does the layout _before_ the @@ -292,8 +291,10 @@ bool wxTopLevelWindowX11::Show(bool show) Layout(); } } + wxYield(); - return wxWindowX11::Show(show); + bool ret = wxWindowX11::Show(show); + return ret; } // ---------------------------------------------------------------------------- @@ -637,8 +638,9 @@ void wxTopLevelWindowX11::DoSetClientSize(int width, int height) void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags) { + // wxLogDebug("DoSetSize: %s (%ld) %d, %d %dx%d", GetClassInfo()->GetClassName(), GetId(), x, y, width, height); + #if 0 - // wxLogDebug( "Setting pos: %d, %d", x, y ); wxWindowX11::DoSetSize(x, y, width, height, sizeFlags); #endif XSync(wxGlobalDisplay(), False); @@ -715,6 +717,11 @@ void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int siz XSync(wxGlobalDisplay(), False); XSync(wxGlobalDisplay(), False); #endif +#if 1 + wxSizeEvent event(wxSize(width, height), GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); +#endif } void wxTopLevelWindowX11::DoGetPosition(int *x, int *y) const diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 7568f13c88..9533b1d1a8 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -735,6 +735,8 @@ void wxWindowX11::DoGetClientSize(int *x, int *y) const void wxWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags) { + // wxLogDebug("DoSetSize: %s (%ld) %d, %d %dx%d", GetClassInfo()->GetClassName(), GetId(), x, y, width, height); + Window xwindow = (Window) GetMainWindow(); wxCHECK_RET( xwindow, wxT("invalid window") ); @@ -775,10 +777,18 @@ void wxWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags) } DoMoveWindow( new_x, new_y, new_w, new_h ); + +#if 0 + wxSizeEvent event(wxSize(new_w, new_h), GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); +#endif } void wxWindowX11::DoSetClientSize(int width, int height) { + // wxLogDebug("DoSetClientSize: %s (%ld) %dx%d", GetClassInfo()->GetClassName(), GetId(), width, height); + Window xwindow = (Window) GetMainWindow(); wxCHECK_RET( xwindow, wxT("invalid window") ); @@ -787,6 +797,12 @@ void wxWindowX11::DoSetClientSize(int width, int height) XResizeWindow( wxGlobalDisplay(), xwindow, width, height ); +#if 0 + wxSizeEvent event(wxSize(width, height), GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); +#endif + #else XWindowAttributes attr; @@ -1053,6 +1069,8 @@ void wxWindowX11::SendEraseEvents() void wxWindowX11::SendPaintEvents() { + // wxLogDebug("SendPaintEvents: %s (%ld)", GetClassInfo()->GetClassName(), GetId()); + m_clipPaintRegion = TRUE; wxNcPaintEvent nc_paint_event( GetId() );