From 59db9cfaa723f0dad93226b5ca858e087e291635 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Tue, 12 Mar 2002 10:56:39 +0000 Subject: [PATCH] Replaced Blit with DrawBitmap in wxPoem to make it run with wxX11 Added some XSyncs because it seems the only way to make dialog sizing work git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14560 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- demos/poem/wxpoem.cpp | 3 ++ src/x11/toplevel.cpp | 72 +++++++++++++++++++++++++++++++------------ src/x11/window.cpp | 6 ++-- 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/demos/poem/wxpoem.cpp b/demos/poem/wxpoem.cpp index 3866bdef48..8550d6d261 100644 --- a/demos/poem/wxpoem.cpp +++ b/demos/poem/wxpoem.cpp @@ -727,9 +727,12 @@ void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) int xx, yy; TheMainWindow->GetClientSize(&xx, &yy); + dc.DrawBitmap(* backingBitmap, 0, 0); +#if 0 wxMemoryDC memDC; memDC.SelectObject(* backingBitmap); dc.Blit(0, 0, backingBitmap->GetWidth(), backingBitmap->GetHeight(), &memDC, 0, 0); +#endif } } diff --git a/src/x11/toplevel.cpp b/src/x11/toplevel.cpp index 123f4f836d..f1981aeb72 100644 --- a/src/x11/toplevel.cpp +++ b/src/x11/toplevel.cpp @@ -557,39 +557,44 @@ bool wxMWMIsRunning(Window w) // smaller wxPoint wxTopLevelWindowX11::GetClientAreaOrigin() const { - // In fact wxFrame::GetClientAreaOrigin + // wxFrame::GetClientAreaOrigin // does the required calculation already. -#if 0 - if (this->IsKindOf(CLASSINFO(wxFrame))) - { - wxFrame* frame = (wxFrame*) this; - if (frame->GetMenuBar()) - return wxPoint(0, frame->GetMenuBar()->GetSize().y); - } -#endif return wxPoint(0, 0); } void wxTopLevelWindowX11::DoGetClientSize( int *width, int *height ) const { + XSync(wxGlobalDisplay(), False); wxWindowX11::DoGetClientSize(width, height); - // Done by wxTopLevelWindow -#if 0 - if (this->IsKindOf(CLASSINFO(wxFrame))) - { - wxFrame* frame = (wxFrame*) this; - if (frame->GetMenuBar()) - (*height) -= frame->GetMenuBar()->GetSize().y; - if (frame->GetStatusBar()) - (*height) -= frame->GetStatusBar()->GetSize().y; - } -#endif } void wxTopLevelWindowX11::DoSetClientSize(int width, int height) { wxWindowX11::DoSetClientSize(width, height); + // Set the top-level window size + XSizeHints size_hints; + wxSize oldSize = GetSize(); + wxSize oldClientSize = GetClientSize(); + + size_hints.flags = PSize; + size_hints.width = width + (oldSize.x - oldClientSize.x); + size_hints.height = height + (oldSize.y - oldClientSize.y); + XSetWMNormalHints( (Display*) GetXDisplay(), (Window) GetMainWindow(), + &size_hints); + + // This seems to be necessary or resizes don't get performed + XSync(wxGlobalDisplay(), False); + XSync(wxGlobalDisplay(), False); + +#if 0 + wxLogDebug("DoSetClientSize: Tried to set size to %d, %d", (int) size_hints.width, (int) size_hints.height); + + XSync(wxGlobalDisplay(), False); + wxSize newSize = GetSize(); + wxLogDebug("New size is %d, %d", (int) newSize.x, (int) newSize.y); +#endif + #if 0 if (!GetMainWindow()) return; @@ -617,6 +622,33 @@ void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int siz // wxLogDebug( "Setting pos: %d, %d", x, y ); wxWindowX11::DoSetSize(x, y, width, height, sizeFlags); + XSizeHints size_hints; + size_hints.flags = 0; + if (x > -1 && y > -1) + size_hints.flags |= PPosition; + if (width > -1 && height > -1) + size_hints.flags |= PSize; + size_hints.width = width; + size_hints.height = height; + size_hints.x = x; + size_hints.y = y; + XSetWMNormalHints( (Display*) GetXDisplay(), (Window) GetMainWindow(), + &size_hints); + + // This seems to be necessary or resizes don't get performed. + // Take them out (or even just one of them), and the About + // box of the minimal sample probably won't be resized right. + XSync(wxGlobalDisplay(), False); + XSync(wxGlobalDisplay(), False); + +#if 0 + wxLogDebug("DoSetSize: Tried to set size to %d, %d", (int) size_hints.width, (int) size_hints.height); + + XSync(wxGlobalDisplay(), False); + wxSize newSize = GetSize(); + wxLogDebug("New size is %d, %d", (int) newSize.x, (int) newSize.y); +#endif + #if 0 wxPoint pt = GetPosition(); // wxLogDebug( "After, pos: %d, %d", pt.x, pt.y ); diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 270bb56364..4fd8cb243b 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -646,7 +646,7 @@ void wxWindowX11::DoGetSize(int *x, int *y) const wxCHECK_RET( xwindow, wxT("invalid window") ); - // XSync(wxGlobalDisplay(), False); + //XSync(wxGlobalDisplay(), False); XWindowAttributes attr; Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr ); @@ -664,7 +664,7 @@ void wxWindowX11::DoGetPosition(int *x, int *y) const Window window = (Window) m_mainWidget; if (window) { - // XSync(wxGlobalDisplay(), False); + //XSync(wxGlobalDisplay(), False); XWindowAttributes attr; Status status = XGetWindowAttributes(wxGlobalDisplay(), window, & attr); wxASSERT(status); @@ -718,7 +718,7 @@ void wxWindowX11::DoGetClientSize(int *x, int *y) const if (window) { - // XSync(wxGlobalDisplay(), False); // Is this really a good idea? + //XSync(wxGlobalDisplay(), False); // Is this really a good idea? XWindowAttributes attr; Status status = XGetWindowAttributes( wxGlobalDisplay(), window, &attr ); wxASSERT(status); -- 2.45.2