From 2f12683e40eee0104fc92a76524337a350a3a3a0 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 17 Mar 2002 14:31:31 +0000 Subject: [PATCH] New attempt to implement wxNO_FULL_REDRAW_ON_REPAINT. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14663 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/univ/menu.cpp | 2 + src/univ/winuniv.cpp | 2 +- src/x11/app.cpp | 142 ++++++++++++++++++++++--------------------- src/x11/toplevel.cpp | 32 ++++++---- src/x11/window.cpp | 133 +++++++++++++++++++++++----------------- 5 files changed, 173 insertions(+), 138 deletions(-) diff --git a/src/univ/menu.cpp b/src/univ/menu.cpp index 6eed51bf97..16c3f95bd4 100644 --- a/src/univ/menu.cpp +++ b/src/univ/menu.cpp @@ -1524,6 +1524,8 @@ void wxMenuBar::Init() m_menuShown = NULL; m_shouldShowMenu = FALSE; + + // m_windowStyle |= wxNO_FULL_REPAINT_ON_RESIZE; } void wxMenuBar::Attach(wxFrame *frame) diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index 7ad89e6f76..bb8c8d9b4c 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -180,7 +180,7 @@ void wxWindow::OnErase(wxEraseEvent& event) return; } - + DoDrawBackground(*event.GetDC()); // if we have both scrollbars, we also have a square in the corner between diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 87b09f85cc..8176837135 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -476,6 +476,60 @@ bool wxApp::ProcessXEvent(WXEvent* _event) switch (event->type) { + case Expose: + { + //wxLogDebug("Expose: %s", windowClass.c_str()); + win->GetUpdateRegion().Union( XExposeEventGetX(event), XExposeEventGetY(event), + XExposeEventGetWidth(event), XExposeEventGetHeight(event)); + + win->GetClearRegion().Union( XExposeEventGetX(event), XExposeEventGetY(event), + XExposeEventGetWidth(event), XExposeEventGetHeight(event)); + +#if !wxUSE_NANOX + XEvent tmp_event; + wxExposeInfo info; + info.window = event->xexpose.window; + info.found_non_matching = FALSE; + while (XCheckIfEvent( wxGlobalDisplay(), &tmp_event, expose_predicate, (XPointer) &info )) + { + win->GetUpdateRegion().Union( tmp_event.xexpose.x, tmp_event.xexpose.y, + tmp_event.xexpose.width, tmp_event.xexpose.height ); + + win->GetClearRegion().Union( tmp_event.xexpose.x, tmp_event.xexpose.y, + tmp_event.xexpose.width, tmp_event.xexpose.height ); + } +#endif + + // Only erase background, paint in idle time. + win->SendEraseEvents(); + + return TRUE; + } + +#if !wxUSE_NANOX + case GraphicsExpose: + { + // wxLogDebug( "GraphicsExpose from %s", win->GetName().c_str(), + // event->xgraphicsexpose.x, event->xgraphicsexpose.y, + // event->xgraphicsexpose.width, event->xgraphicsexpose.height); + + win->GetUpdateRegion().Union( event->xgraphicsexpose.x, event->xgraphicsexpose.y, + event->xgraphicsexpose.width, event->xgraphicsexpose.height); + + win->GetClearRegion().Union( event->xgraphicsexpose.x, event->xgraphicsexpose.y, + event->xgraphicsexpose.width, event->xgraphicsexpose.height); + + if (event->xgraphicsexpose.count == 0) + { + // Only erase background, paint in idle time. + win->SendEraseEvents(); + //win->Update(); + } + + return TRUE; + } +#endif + case KeyPress: { if (!win->IsEnabled()) @@ -526,7 +580,7 @@ bool wxApp::ProcessXEvent(WXEvent* _event) #endif { //wxLogDebug("ConfigureNotify: %s", windowClass.c_str()); - if (win->IsTopLevel()) + if (win->IsTopLevel() && win->IsShown()) { wxTopLevelWindowX11 *tlw = (wxTopLevelWindowX11 *) win; tlw->SetNeedResizeInIdle(); @@ -566,14 +620,26 @@ bool wxApp::ProcessXEvent(WXEvent* _event) } return FALSE; } -#if 1 +#if 0 + case DestroyNotify: + { + printf( "destroy from %s\n", win->GetName().c_str() ); + break; + } + case CreateNotify: + { + printf( "create from %s\n", win->GetName().c_str() ); + break; + } + case MapRequest: + { + printf( "map request from %s\n", win->GetName().c_str() ); + break; + } case ResizeRequest: { - /* - * If resize event, don't resize until the last resize event for this - * window is recieved. Prevents flicker as windows are resized. - */ - + printf( "resize request from %s\n", win->GetName().c_str() ); + Display *disp = (Display*) wxGetDisplay(); XEvent report; @@ -600,59 +666,6 @@ bool wxApp::ProcessXEvent(WXEvent* _event) return FALSE; break; } -#endif - case Expose: - { - //wxLogDebug("Expose: %s", windowClass.c_str()); - win->GetUpdateRegion().Union( XExposeEventGetX(event), XExposeEventGetY(event), - XExposeEventGetWidth(event), XExposeEventGetHeight(event)); - - win->GetClearRegion().Union( XExposeEventGetX(event), XExposeEventGetY(event), - XExposeEventGetWidth(event), XExposeEventGetHeight(event)); - - -#if !wxUSE_NANOX - XEvent tmp_event; - wxExposeInfo info; - info.window = event->xexpose.window; - info.found_non_matching = FALSE; - while (XCheckIfEvent( wxGlobalDisplay(), &tmp_event, expose_predicate, (XPointer) &info )) - { - win->GetUpdateRegion().Union( tmp_event.xexpose.x, tmp_event.xexpose.y, - tmp_event.xexpose.width, tmp_event.xexpose.height ); - - win->GetClearRegion().Union( tmp_event.xexpose.x, tmp_event.xexpose.y, - tmp_event.xexpose.width, tmp_event.xexpose.height ); - } -#endif - - // Only erase background, paint in idle time. - win->SendEraseEvents(); - - return TRUE; - } -#if !wxUSE_NANOX - case GraphicsExpose: - { - // wxLogDebug( "GraphicsExpose from %s", win->GetName().c_str(), - // event->xgraphicsexpose.x, event->xgraphicsexpose.y, - // event->xgraphicsexpose.width, event->xgraphicsexpose.height); - - win->GetUpdateRegion().Union( event->xgraphicsexpose.x, event->xgraphicsexpose.y, - event->xgraphicsexpose.width, event->xgraphicsexpose.height); - - win->GetClearRegion().Union( event->xgraphicsexpose.x, event->xgraphicsexpose.y, - event->xgraphicsexpose.width, event->xgraphicsexpose.height); - - if (event->xgraphicsexpose.count == 0) - { - // Only erase background, paint in idle time. - win->SendEraseEvents(); - //win->Update(); - } - - return TRUE; - } #endif case EnterNotify: case LeaveNotify: @@ -733,15 +746,6 @@ bool wxApp::ProcessXEvent(WXEvent* _event) return FALSE; break; } -#ifndef wxUSE_NANOX - case DestroyNotify: - { - // Do we want to process this (for top-level windows)? - // But we want to be able to veto closes, anyway - return FALSE; - break; - } -#endif default: { #ifdef __WXDEBUG__ diff --git a/src/x11/toplevel.cpp b/src/x11/toplevel.cpp index 9be69bcdad..9f2f52a173 100644 --- a/src/x11/toplevel.cpp +++ b/src/x11/toplevel.cpp @@ -118,40 +118,47 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, XSizeHints size_hints; long xattributes_mask = - CWOverrideRedirect | CWBorderPixel | CWBackPixel; xattributes.background_pixel = m_backgroundColour.GetPixel(); xattributes.border_pixel = BlackPixel( xdisplay, xscreen ); + if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE )) + { + xattributes_mask |= CWBitGravity; + xattributes.bit_gravity = StaticGravity; + } + // TODO: if we want no border, caption etc., // I think we set this to True to remove decorations // No. RR. // Yes :-) JACS (because some WMs don't respect // the hints) - xattributes.override_redirect = (style & wxNO_BORDER) ? True : False; -#endif + // xattributes.override_redirect = (style & wxNO_BORDER) ? True : False; -#if wxUSE_NANOX + xattributes_mask |= CWEventMask; + xattributes.event_mask = + ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | + ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | + KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask | + PropertyChangeMask; + + Window xwindow = XCreateWindow( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y, + 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, 0, 0, InputOutput, xvisual, backColor, foreColor); -#else - Window xwindow = XCreateWindow( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y, - 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes ); #endif + m_mainWidget = (WXWindow) xwindow; - int extraFlags = 0; #if wxUSE_NANOX - extraFlags |= GR_EVENT_MASK_CLOSE_REQ; -#endif - XSelectInput( xdisplay, xwindow, - extraFlags | + GR_EVENT_MASK_CLOSE_REQ | ExposureMask | KeyPressMask | KeyReleaseMask | @@ -167,6 +174,7 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, StructureNotifyMask | PropertyChangeMask ); +#endif wxAddWindowToTable( xwindow, (wxWindow*) this ); diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 4012874c15..b40174b341 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -140,37 +140,45 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, m_foregroundColour.CalcPixel( (WXColormap) cm ); Window xparent = (Window) parent->GetMainWindow(); + + wxSize size2(size); + if (size2.x == -1) + size2.x = 20; + if (size2.y == -1) + size2.y = 20; + wxPoint pos2(pos); + if (pos2.x == -1) + pos2.x = 0; + if (pos2.y == -1) + pos2.y = 0; + #if !wxUSE_NANOX XSetWindowAttributes xattributes; long xattributes_mask = - CWEventMask | CWBorderPixel | CWBackPixel; xattributes.background_pixel = m_backgroundColour.GetPixel(); xattributes.border_pixel = BlackPixel( xdisplay, xscreen ); + xattributes_mask |= CWEventMask; xattributes.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask | - PropertyChangeMask; -#endif - - wxSize size2(size); - if (size2.x == -1) - size2.x = 20; - if (size2.y == -1) - size2.y = 20; + PropertyChangeMask | VisibilityChangeMask ; + + if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE )) + { + xattributes_mask |= CWBitGravity; + xattributes.bit_gravity = StaticGravity; + } + + Window xwindow = XCreateWindow( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y, + 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes ); +#else - wxPoint pos2(pos); - if (pos2.x == -1) - pos2.x = 0; - if (pos2.y == -1) - pos2.y = 0; - -#if wxUSE_NANOX int extraFlags = GR_EVENT_MASK_CLOSE_REQ; long backColor, foreColor; @@ -184,12 +192,6 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask | PropertyChangeMask ); - -#else - - Window xwindow = XCreateWindow( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y, - 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes ); - #endif m_mainWidget = (WXWindow) xwindow; @@ -781,14 +783,12 @@ void wxWindowX11::DoSetClientSize(int width, int height) wxCHECK_RET( xwindow, wxT("invalid window") ); - XWindowChanges windowChanges; - windowChanges.width = width; - windowChanges.height = height; - windowChanges.stack_mode = 0; - int valueMask = CWWidth | CWHeight; +#if 1 + + XResizeWindow( wxGlobalDisplay(), xwindow, width, height ); + +#else - XConfigureWindow( wxGlobalDisplay(), xwindow, valueMask, &windowChanges ); -#if 0 XWindowAttributes attr; Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr ); wxCHECK_RET( status, wxT("invalid window attributes") ); @@ -805,6 +805,7 @@ void wxWindowX11::DoSetClientSize(int width, int height) new_h = height; DoMoveWindow( new_x, new_y, new_w, new_h ); + #endif } @@ -855,6 +856,28 @@ void wxWindowX11::DoMoveWindow(int x, int y, int width, int height) wxCHECK_RET( xwindow, wxT("invalid window") ); +#if 1 + + XWindowAttributes attr; + Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr ); + wxCHECK_RET( status, wxT("invalid window attributes") ); + + if (attr.width == width && attr.height == height) + { + XMoveWindow( wxGlobalDisplay(), xwindow, x, y ); + return; + } + + if (attr.x == x && attr.y == y) + { + XResizeWindow( wxGlobalDisplay(), xwindow, width, height ); + return; + } + + XMoveResizeWindow( wxGlobalDisplay(), xwindow, x, y, width, height ); + +#else + XWindowChanges windowChanges; windowChanges.x = x; windowChanges.y = y; @@ -864,6 +887,8 @@ void wxWindowX11::DoMoveWindow(int x, int y, int width, int height) int valueMask = CWX | CWY | CWWidth | CWHeight; XConfigureWindow( wxGlobalDisplay(), xwindow, valueMask, &windowChanges ); + +#endif } // --------------------------------------------------------------------------- @@ -998,39 +1023,34 @@ void wxWindowX11::Clear() void wxWindowX11::SendEraseEvents() { - if (!m_clearRegion.IsEmpty()) - { - m_clipPaintRegion = TRUE; - - wxWindowDC dc( (wxWindow*)this ); - dc.SetClippingRegion( m_clearRegion ); - - wxEraseEvent erase_event( GetId(), &dc ); - erase_event.SetEventObject( this ); + if (m_clearRegion.IsEmpty()) return; + + wxWindowDC dc( (wxWindow*)this ); + dc.SetClippingRegion( m_clearRegion ); + + wxEraseEvent erase_event( GetId(), &dc ); + erase_event.SetEventObject( this ); - if (!GetEventHandler()->ProcessEvent(erase_event)) + if (!GetEventHandler()->ProcessEvent(erase_event)) + { + Window xwindow = (Window) GetMainWindow(); + Display *xdisplay = wxGlobalDisplay(); + GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL ); + XSetFillStyle( xdisplay, xgc, FillSolid ); + XSetForeground( xdisplay, xgc, m_backgroundColour.GetPixel() ); + wxRegionIterator upd( m_clearRegion ); + while (upd) { - Window xwindow = (Window) GetMainWindow(); - Display *xdisplay = wxGlobalDisplay(); - GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL ); - XSetFillStyle( xdisplay, xgc, FillSolid ); - XSetForeground( xdisplay, xgc, m_backgroundColour.GetPixel() ); - wxRegionIterator upd( m_clearRegion ); - while (upd) - { - XFillRectangle( xdisplay, xwindow, xgc, - upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); - upd ++; - } - XFreeGC( xdisplay, xgc ); + XFillRectangle( xdisplay, xwindow, xgc, + upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); + upd ++; } - m_clearRegion.Clear(); - - m_clipPaintRegion = FALSE; + XFreeGC( xdisplay, xgc ); } + + m_clearRegion.Clear(); } - void wxWindowX11::SendPaintEvents() { m_clipPaintRegion = TRUE; @@ -1044,6 +1064,7 @@ void wxWindowX11::SendPaintEvents() GetEventHandler()->ProcessEvent( paint_event ); m_updateRegion.Clear(); + m_clipPaintRegion = FALSE; } -- 2.45.2