From c2c0dabfa61fc435265f3dc71122592d359f0119 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 28 Mar 2002 18:57:50 +0000 Subject: [PATCH] More changes for better redraw flow under X11. Probably fixed problem with TLW appearing wrong. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14842 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/x11/privx.h | 4 + include/wx/x11/toplevel.h | 8 +- samples/dialogs/dialogs.h | 3 +- src/univ/menu.cpp | 2 +- src/x11/app.cpp | 18 +- src/x11/dcclient.cpp | 10 +- src/x11/settings.cpp | 12 +- src/x11/toplevel.cpp | 422 ++++++++++++++++++-------------------- src/x11/window.cpp | 71 ++++--- 9 files changed, 284 insertions(+), 266 deletions(-) diff --git a/include/wx/x11/privx.h b/include/wx/x11/privx.h index 999372519d..c8c63f63b8 100644 --- a/include/wx/x11/privx.h +++ b/include/wx/x11/privx.h @@ -68,6 +68,8 @@ bool wxWindowIsVisible(Window win); #if wxUSE_NANOX #define XEventGetWindow(event) event->general.wid #define XEventGetType(event) event->general.type +#define XConfigureEventGetX(event) ((int) event->update.x) +#define XConfigureEventGetY(event) ((int) event->update.y) #define XConfigureEventGetWidth(event) ((int) event->update.width) #define XConfigureEventGetHeight(event) ((int) event->update.height) #define XExposeEventGetX(event) event->exposure.x @@ -100,6 +102,8 @@ bool wxWindowIsVisible(Window win); #define XEventGetWindow(event) event->xany.window #define XEventGetType(event) event->xany.type +#define XConfigureEventGetX(event) event->xconfigure.x +#define XConfigureEventGetY(event) event->xconfigure.y #define XConfigureEventGetWidth(event) event->xconfigure.width #define XConfigureEventGetHeight(event) event->xconfigure.height #define XExposeEventGetX(event) event->xexpose.x diff --git a/include/wx/x11/toplevel.h b/include/wx/x11/toplevel.h index 74f7411c4f..ccf1a16618 100644 --- a/include/wx/x11/toplevel.h +++ b/include/wx/x11/toplevel.h @@ -67,7 +67,10 @@ public: virtual wxString GetTitle() const; // implementation - void SetNeedResizeInIdle( bool set = TRUE ) { m_needResizeInIdle = set; } + void SetNeedResizeInIdle( bool set = TRUE ) + { m_needResizeInIdle = set; } + void SetConfigureGeometry( int x, int y, int width, int height ) + { m_x = x; m_y = y; m_width = width; m_height = height; } protected: // common part of all ctors @@ -104,6 +107,9 @@ protected: bool m_fsIsMaximized; bool m_fsIsShowing; wxString m_title; + + // Geometry + int m_x,m_y,m_width,m_height; }; // list of all frames and modeless dialogs diff --git a/samples/dialogs/dialogs.h b/samples/dialogs/dialogs.h index 3193e26f2f..88b81497bb 100644 --- a/samples/dialogs/dialogs.h +++ b/samples/dialogs/dialogs.h @@ -111,7 +111,8 @@ private: class MyCanvas: public wxScrolledWindow { public: - MyCanvas(wxWindow *parent) : wxScrolledWindow(parent) { } + MyCanvas(wxWindow *parent) : + wxScrolledWindow(parent,-1,wxDefaultPosition,wxDefaultSize,wxNO_FULL_REPAINT_ON_RESIZE) { } void OnPaint(wxPaintEvent& event); diff --git a/src/univ/menu.cpp b/src/univ/menu.cpp index 2f30a0a6d8..6a64d031b9 100644 --- a/src/univ/menu.cpp +++ b/src/univ/menu.cpp @@ -1515,7 +1515,7 @@ void wxMenuBar::Init() m_shouldShowMenu = FALSE; - // m_windowStyle |= wxNO_FULL_REPAINT_ON_RESIZE; + m_windowStyle |= wxNO_FULL_REPAINT_ON_RESIZE; } void wxMenuBar::Attach(wxFrame *frame) diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 431e76420f..ca1d1cf297 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -507,7 +507,6 @@ bool wxApp::ProcessXEvent(WXEvent* _event) { win->GetUpdateRegion().Union( XExposeEventGetX(event), XExposeEventGetY(event), XExposeEventGetWidth(event), XExposeEventGetHeight(event)); - win->GetClearRegion().Union( XExposeEventGetX(event), XExposeEventGetY(event), XExposeEventGetWidth(event), XExposeEventGetHeight(event)); @@ -525,6 +524,14 @@ bool wxApp::ProcessXEvent(WXEvent* _event) tmp_event.xexpose.width, tmp_event.xexpose.height ); } #endif + + // This simplifies the expose and clear areas to simple + // rectangles. + win->GetUpdateRegion() = win->GetUpdateRegion().GetBox(); + win->GetClearRegion() = win->GetClearRegion().GetBox(); + + // If we only have one X11 window, always indicate + // that borders might have to be redrawn. if (win->GetMainWindow() == win->GetClientWindow()) win->NeedUpdateNcAreaInIdle(); @@ -553,7 +560,7 @@ bool wxApp::ProcessXEvent(WXEvent* _event) { // Only erase background, paint in idle time. win->SendEraseEvents(); - //win->Update(); + // win->Update(); } return TRUE; @@ -609,6 +616,13 @@ bool wxApp::ProcessXEvent(WXEvent* _event) if (event->update.utype == GR_UPDATE_SIZE) #endif { + if (win->IsTopLevel()) + { + wxTopLevelWindow *tlw = (wxTopLevelWindow*) win; + tlw->SetConfigureGeometry( XConfigureEventGetX(event), XConfigureEventGetY(event), + XConfigureEventGetWidth(event), XConfigureEventGetHeight(event) ); + } + if (win->IsTopLevel() && win->IsShown()) { wxTopLevelWindowX11 *tlw = (wxTopLevelWindowX11 *) win; diff --git a/src/x11/dcclient.cpp b/src/x11/dcclient.cpp index 23629d5500..659feec8ae 100644 --- a/src/x11/dcclient.cpp +++ b/src/x11/dcclient.cpp @@ -2045,11 +2045,11 @@ wxClientDC::wxClientDC( wxWindow *window ) #if wxUSE_TWO_WINDOWS #else - wxPoint ptOrigin = window->GetClientAreaOrigin(); - SetDeviceOrigin(ptOrigin.x, ptOrigin.y); - wxSize size = window->GetClientSize(); - SetClippingRegion(wxPoint(0, 0), size); -#endif // __WXUNIVERSAL__ + wxPoint ptOrigin = window->GetClientAreaOrigin(); + SetDeviceOrigin(ptOrigin.x, ptOrigin.y); + wxSize size = window->GetClientSize(); + SetClippingRegion(wxPoint(0, 0), size); +#endif } void wxClientDC::DoGetSize(int *width, int *height) const diff --git a/src/x11/settings.cpp b/src/x11/settings.cpp index d27621f7c4..f7d484b3d6 100644 --- a/src/x11/settings.cpp +++ b/src/x11/settings.cpp @@ -22,8 +22,16 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) { - // Overridden by wxSystemSettings::GetColour in wxUniversal - // to do the Right Thing + switch (index) + { + case wxSYS_COLOUR_APPWORKSPACE: + return wxColour( 0xc0c0c0 ); + + default: + break; + } + + // Overridden mostly by wxSystemSettings::GetColour in wxUniversal return *wxWHITE; } diff --git a/src/x11/toplevel.cpp b/src/x11/toplevel.cpp index e3e46bdd74..d1a58623b7 100644 --- a/src/x11/toplevel.cpp +++ b/src/x11/toplevel.cpp @@ -65,6 +65,11 @@ void wxTopLevelWindowX11::Init() m_fsIsShowing = FALSE; m_needResizeInIdle = FALSE; + + m_x = -1; + m_y = -1; + m_width = 20; + m_height = 20; } bool wxTopLevelWindowX11::Create(wxWindow *parent, @@ -103,21 +108,24 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, m_backgroundColour.CalcPixel( (WXColormap) cm ); m_hasBgCol = TRUE; - wxSize size2(size); - if (size2.x == -1) - size2.x = 100; - if (size2.y == -1) - size2.y = 100; - - wxPoint pos2(pos); - if (pos2.x == -1) - pos2.x = 100; - if (pos2.y == -1) - pos2.y = 100; + m_x = pos.x; + if (m_x < -1) + m_x = 10; + + m_y = pos.y; + if (m_y < 0) + m_y = 10; + + m_width = size.x; + if (m_width < 0) + m_width = 500; + + m_height = size.y; + if (m_height < 0) + m_height = 380; #if !wxUSE_NANOX XSetWindowAttributes xattributes; - XSizeHints size_hints; long xattributes_mask = CWBorderPixel | CWBackPixel; @@ -144,14 +152,14 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask | PropertyChangeMask; - Window xwindow = XCreateWindow( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y, + Window xwindow = XCreateWindow( xdisplay, xparent, m_x, m_y, m_width, m_height, 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes ); #else long backColor, foreColor; backColor = GR_RGB(m_backgroundColour.Red(), m_backgroundColour.Green(), m_backgroundColour.Blue()); foreColor = GR_RGB(m_foregroundColour.Red(), m_foregroundColour.Green(), m_foregroundColour.Blue()); - Window xwindow = XCreateWindowWithColor( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y, + Window xwindow = XCreateWindowWithColor( xdisplay, xparent, m_x, m_y, m_width, m_height, 0, 0, InputOutput, xvisual, backColor, foreColor); #endif @@ -201,11 +209,12 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, } } + XSizeHints size_hints; size_hints.flags = PSize | PPosition | PWinGravity; - size_hints.x = pos2.x; - size_hints.y = pos2.y; - size_hints.width = size2.x; - size_hints.height = size2.y; + size_hints.x = m_x; + size_hints.y = m_y; + size_hints.width = m_width; + size_hints.height = m_height; size_hints.win_gravity = NorthWestGravity; XSetWMNormalHints( xdisplay, xwindow, &size_hints); @@ -225,23 +234,6 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, wm_protocols[1] = XInternAtom( xdisplay, "WM_TAKE_FOCUS", False ); XSetWMProtocols( xdisplay, xwindow, wm_protocols, 2); -#if 0 // TODO - // You will need a compliant window manager for this to work - // (e.g. sawfish/enlightenment/kde/icewm/windowmaker) - if (style & wxSTAY_ON_TOP) - { - CARD32 data = 4; // or should this be 6? According to http://developer.gnome.org/doc/standards/wm/c44.html - XChangeProperty (xdisplay, - xwindow, - XInternAtom (xdisplay, "_WIN_LAYER", False), - XA_CARDINAL, - 32, - PropModeReplace, - (unsigned char *)&data, - 1); - } -#endif - #endif wxSetWMDecorations( xwindow, style); @@ -288,8 +280,6 @@ void wxTopLevelWindowX11::OnInternalIdle() bool wxTopLevelWindowX11::Show(bool show) { - XSync( wxGlobalDisplay(), False ); - // Nano-X has to force a size event, // else there's no initial size. #if wxUSE_NANOX @@ -315,9 +305,9 @@ bool wxTopLevelWindowX11::Show(bool show) Layout(); } } - wxYield(); bool ret = wxWindowX11::Show(show); + return ret; } @@ -430,32 +420,187 @@ void wxTopLevelWindowX11::SetIcons(const wxIconBundle& icons ) void wxTopLevelWindowX11::SetTitle(const wxString& title) { m_title = title; + if (GetMainWindow()) { XStoreName(wxGlobalDisplay(), (Window) GetMainWindow(), (const char*) title); XSetIconName(wxGlobalDisplay(), (Window) GetMainWindow(), (const char*) title); + } +} + +wxString wxTopLevelWindowX11::GetTitle() const +{ + return m_title; +} - // Use this if the platform doesn't supply the above functions. +// For implementation purposes - sometimes decorations make the client area +// smaller +wxPoint wxTopLevelWindowX11::GetClientAreaOrigin() const +{ + // wxFrame::GetClientAreaOrigin + // does the required calculation already. + return wxPoint(0, 0); +} + +void wxTopLevelWindowX11::DoGetClientSize( int *width, int *height ) const +{ + if (width) + *width = m_width; + if (height) + *height = m_height; +} + +void wxTopLevelWindowX11::DoSetClientSize(int width, int height) +{ + // wxLogDebug("DoSetClientSize: %s (%ld) %dx%d", GetClassInfo()->GetClassName(), GetId(), width, height); + + m_width = width; + m_height = height; + +#if !wxUSE_NANOX + XSizeHints size_hints; + size_hints.flags = PSize; + size_hints.width = width; + size_hints.height = height; + XSetWMNormalHints( wxGlobalDisplay(), (Window) GetMainWindow(), &size_hints ); +#endif + + wxWindowX11::DoSetClientSize(width, 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 (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + m_x = x; + + if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + m_y = y; + + if (width != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + m_width = width; + + if (height != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + m_height = height; + +#if !wxUSE_NANOX + XSizeHints size_hints; + size_hints.flags = 0; + size_hints.flags |= PPosition; + size_hints.flags |= PSize; + size_hints.x = m_x; + size_hints.y = m_y; + size_hints.width = m_width; + size_hints.height = m_height; + XSetWMNormalHints( wxGlobalDisplay(), (Window) GetMainWindow(), &size_hints); +#endif + + wxWindowX11::DoSetSize(x, y, width, height, sizeFlags); + #if 0 - XTextProperty textProperty; - textProperty.value = (unsigned char*) title; - textProperty.encoding = XA_STRING; - textProperty.format = 8; - textProperty.nitems = 1; - - XSetTextProperty(wxGlobalDisplay(), (Window) GetMainWindow(), - & textProperty, WM_NAME); + Display *display = wxGlobalDisplay(); + Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display)); + Window parent_window = window, + next_parent = window; + + // search for the parent that is child of ROOT, because the WM may + // reparent twice and notify only the next parent (like FVWM) + while (next_parent != root) { + Window *theChildren; +#if wxUSE_NANOX + GR_COUNT n; +#else + unsigned int n; #endif + parent_window = next_parent; + XQueryTree(display, parent_window, &root, + &next_parent, &theChildren, &n); + XFree(theChildren); // not needed + } + + XWindowChanges windowChanges; + windowChanges.x = x; + windowChanges.y = y; + windowChanges.width = width; + windowChanges.height = height; + windowChanges.stack_mode = 0; + int valueMask = CWX | CWY | CWWidth | CWHeight; + + if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + { + valueMask |= CWX; + } + if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + { + valueMask |= CWY; } + if (width != -1) + { + windowChanges.width = wxMax(1, width); + valueMask |= CWWidth; + } + if (height != -1) + { + windowChanges.height = wxMax(1, height); + valueMask |= CWHeight; + } + + XConfigureWindow( display, parent_window, valueMask, &windowChanges ); +#endif } -wxString wxTopLevelWindowX11::GetTitle() const +void wxTopLevelWindowX11::DoGetPosition(int *x, int *y) const { - return m_title; + XSync(wxGlobalDisplay(), False); + Window window = (Window) m_mainWindow; + if (!window) + return ; + + Display *display = wxGlobalDisplay(); + Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display)); + Window parent_window = window, + next_parent = window; + + // search for the parent that is child of ROOT, because the WM may + // reparent twice and notify only the next parent (like FVWM) + while (next_parent != root) { + Window *theChildren; +#if wxUSE_NANOX + GR_COUNT n; +#else + unsigned int n; +#endif + parent_window = next_parent; + XQueryTree(display, parent_window, &root, + &next_parent, &theChildren, &n); + XFree(theChildren); // not needed + } +#if 0 + int xx, yy; unsigned int dummy; + XGetGeometry(display, parent_window, &root, + &xx, &yy, &dummy, &dummy, &dummy, &dummy); + if (x) *x = xx; + if (y) *y = yy; +#else + XWindowAttributes attr; + Status status = XGetWindowAttributes( wxGlobalDisplay(), parent_window, & attr); + if (status) + { + if (x) *x = attr.x; + if (y) *y = attr.y; + } + else + { + if (x) *x = 0; + if (y) *y = 0; + } +#endif } + #ifndef MWM_DECOR_BORDER #define MWM_HINTS_FUNCTIONS (1L << 0) @@ -621,183 +766,4 @@ bool wxSetWMDecorations(Window w, long style) return TRUE; } -// For implementation purposes - sometimes decorations make the client area -// smaller -wxPoint wxTopLevelWindowX11::GetClientAreaOrigin() const -{ - // wxFrame::GetClientAreaOrigin - // does the required calculation already. - return wxPoint(0, 0); -} - -void wxTopLevelWindowX11::DoGetClientSize( int *width, int *height ) const -{ - XSync(wxGlobalDisplay(), False); - wxWindowX11::DoGetClientSize(width, height); -} - -void wxTopLevelWindowX11::DoSetClientSize(int width, int height) -{ - wxWindowX11::DoSetClientSize(width, height); - -#if !wxUSE_NANOX - // 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( wxGlobalDisplay(), (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 -#endif -} - -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 - wxWindowX11::DoSetSize(x, y, width, height, sizeFlags); -#endif - XSync(wxGlobalDisplay(), False); - Window window = (Window) m_mainWindow; - if (!window) - return ; - - Display *display = wxGlobalDisplay(); - Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display)); - Window parent_window = window, - next_parent = window; - - // search for the parent that is child of ROOT, because the WM may - // reparent twice and notify only the next parent (like FVWM) - while (next_parent != root) { - Window *theChildren; -#if wxUSE_NANOX - GR_COUNT n; -#else - unsigned int n; -#endif - parent_window = next_parent; - XQueryTree(display, parent_window, &root, - &next_parent, &theChildren, &n); - XFree(theChildren); // not needed - } - - XWindowChanges windowChanges; - windowChanges.x = x; - windowChanges.y = y; - windowChanges.width = width; - windowChanges.height = height; - windowChanges.stack_mode = 0; - int valueMask = CWX | CWY | CWWidth | CWHeight; - - if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - { - valueMask |= CWX; - } - if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - { - valueMask |= CWY; - } - if (width != -1) - { - windowChanges.width = wxMax(1, width); - valueMask |= CWWidth; - } - if (height != -1) - { - windowChanges.height = wxMax(1, height); - valueMask |= CWHeight; - } - - XConfigureWindow( display, parent_window, valueMask, &windowChanges ); - -#if !wxUSE_NANOX - 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( wxGlobalDisplay(), (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); -#endif -#if 1 - wxSizeEvent event(wxSize(width, height), GetId()); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); -#endif -} - -void wxTopLevelWindowX11::DoGetPosition(int *x, int *y) const -{ - XSync(wxGlobalDisplay(), False); - Window window = (Window) m_mainWindow; - if (!window) - return ; - Display *display = wxGlobalDisplay(); - Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display)); - Window parent_window = window, - next_parent = window; - - // search for the parent that is child of ROOT, because the WM may - // reparent twice and notify only the next parent (like FVWM) - while (next_parent != root) { - Window *theChildren; -#if wxUSE_NANOX - GR_COUNT n; -#else - unsigned int n; -#endif - parent_window = next_parent; - XQueryTree(display, parent_window, &root, - &next_parent, &theChildren, &n); - XFree(theChildren); // not needed - } -#if 0 - int xx, yy; unsigned int dummy; - XGetGeometry(display, parent_window, &root, - &xx, &yy, &dummy, &dummy, &dummy, &dummy); - if (x) *x = xx; - if (y) *y = yy; -#else - XWindowAttributes attr; - Status status = XGetWindowAttributes( wxGlobalDisplay(), parent_window, & attr); - if (status) - { - if (x) *x = attr.x; - if (y) *y = attr.y; - } - else - { - if (x) *x = 0; - if (y) *y = 0; - } -#endif -} diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 2c1888c795..ecd6293088 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -62,6 +62,7 @@ extern wxHashTable *wxWidgetHashTable; extern wxHashTable *wxClientWidgetHashTable; static wxWindow* g_captureWindow = NULL; +static GC g_eraseGC; // ---------------------------------------------------------------------------- // macros @@ -816,12 +817,6 @@ 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) @@ -1105,21 +1100,19 @@ void wxWindowX11::SendEraseEvents() wxEraseEvent erase_event( GetId(), &dc ); erase_event.SetEventObject( this ); - if (!GetEventHandler()->ProcessEvent(erase_event)) + if (!GetEventHandler()->ProcessEvent(erase_event) ) { - Window xwindow = (Window) m_clientWindow; Display *xdisplay = wxGlobalDisplay(); - GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL ); - XSetFillStyle( xdisplay, xgc, FillSolid ); - XSetForeground( xdisplay, xgc, m_backgroundColour.GetPixel() ); + Window xwindow = (Window) GetClientWindow(); + XSetForeground( xdisplay, g_eraseGC, m_backgroundColour.GetPixel() ); + wxRegionIterator upd( m_clearRegion ); while (upd) { - XFillRectangle( xdisplay, xwindow, xgc, + XFillRectangle( xdisplay, xwindow, g_eraseGC, upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); upd ++; } - XFreeGC( xdisplay, xgc ); } m_clearRegion.Clear(); @@ -1449,19 +1442,10 @@ bool wxWindowX11::SetBackgroundColour(const wxColour& col) m_backgroundColour.CalcPixel( (WXColormap) cm ); - if (!GetMainWindow()) - return FALSE; - -/* - XSetWindowAttributes attrib; - attrib.background_pixel = colour.GetPixel(); - - XChangeWindowAttributes(wxGlobalDisplay(), - (Window) GetMainWindow(), - CWBackPixel, - & attrib); -*/ - + // We don't set the background colour as we paint + // the background ourselves. + // XSetWindowBackground( xdisplay, (Window) m_clientWindow, m_backgroundColour.GetPixel() ); + return TRUE; } @@ -1527,3 +1511,38 @@ wxPoint wxGetMousePosition() int wxNoOptimize::ms_count = 0; + +// ---------------------------------------------------------------------------- +// wxDCModule +// ---------------------------------------------------------------------------- + +class wxWinModule : public wxModule +{ +public: + bool OnInit(); + void OnExit(); + +private: + DECLARE_DYNAMIC_CLASS(wxWinModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxWinModule, wxModule) + +bool wxWinModule::OnInit() +{ + Display *xdisplay = wxGlobalDisplay(); + int xscreen = DefaultScreen( xdisplay ); + Window xroot = RootWindow( xdisplay, xscreen ); + g_eraseGC = XCreateGC( xdisplay, xroot, 0, NULL ); + XSetFillStyle( xdisplay, g_eraseGC, FillSolid ); + + return TRUE; +} + +void wxWinModule::OnExit() +{ + Display *xdisplay = wxGlobalDisplay(); + XFreeGC( xdisplay, g_eraseGC ); +} + + -- 2.45.2