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
This commit is contained in:
parent
0f9390c3c5
commit
2f12683e40
@ -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)
|
||||
|
@ -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
|
||||
|
142
src/x11/app.cpp
142
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__
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -140,23 +140,6 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id,
|
||||
m_foregroundColour.CalcPixel( (WXColormap) cm );
|
||||
|
||||
Window xparent = (Window) parent->GetMainWindow();
|
||||
|
||||
#if !wxUSE_NANOX
|
||||
XSetWindowAttributes xattributes;
|
||||
|
||||
long xattributes_mask =
|
||||
CWEventMask |
|
||||
CWBorderPixel | CWBackPixel;
|
||||
|
||||
xattributes.background_pixel = m_backgroundColour.GetPixel();
|
||||
xattributes.border_pixel = BlackPixel( xdisplay, xscreen );
|
||||
|
||||
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)
|
||||
@ -170,7 +153,32 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id,
|
||||
if (pos2.y == -1)
|
||||
pos2.y = 0;
|
||||
|
||||
#if wxUSE_NANOX
|
||||
#if !wxUSE_NANOX
|
||||
XSetWindowAttributes xattributes;
|
||||
|
||||
long xattributes_mask =
|
||||
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 | 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
|
||||
|
||||
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())
|
||||
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))
|
||||
{
|
||||
m_clipPaintRegion = TRUE;
|
||||
|
||||
wxWindowDC dc( (wxWindow*)this );
|
||||
dc.SetClippingRegion( m_clearRegion );
|
||||
|
||||
wxEraseEvent erase_event( GetId(), &dc );
|
||||
erase_event.SetEventObject( this );
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user