m_menuShown = NULL;
m_shouldShowMenu = FALSE;
+
+ // m_windowStyle |= wxNO_FULL_REPAINT_ON_RESIZE;
}
void wxMenuBar::Attach(wxFrame *frame)
return;
}
-
+
DoDrawBackground(*event.GetDC());
// if we have both scrollbars, we also have a square in the corner between
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())
#endif
{
//wxLogDebug("ConfigureNotify: %s", windowClass.c_str());
- if (win->IsTopLevel())
+ if (win->IsTopLevel() && win->IsShown())
{
wxTopLevelWindowX11 *tlw = (wxTopLevelWindowX11 *) win;
tlw->SetNeedResizeInIdle();
}
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;
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:
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__
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 |
StructureNotifyMask |
PropertyChangeMask
);
+#endif
wxAddWindowToTable( xwindow, (wxWindow*) this );
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;
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;
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") );
new_h = height;
DoMoveWindow( new_x, new_y, new_w, new_h );
+
#endif
}
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;
int valueMask = CWX | CWY | CWWidth | CWHeight;
XConfigureWindow( wxGlobalDisplay(), xwindow, valueMask, &windowChanges );
+
+#endif
}
// ---------------------------------------------------------------------------
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;
GetEventHandler()->ProcessEvent( paint_event );
m_updateRegion.Clear();
+
m_clipPaintRegion = FALSE;
}