X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f809133f9eb30d4746c71098bbc14c621b94ef0d..b58a1455e15477cac9d335b5f7a2c3fc3111b342:/src/x11/window.cpp diff --git a/src/x11/window.cpp b/src/x11/window.cpp index cd6575da0c..7568f13c88 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; @@ -251,7 +253,17 @@ void wxWindowX11::SetFocus() Window xwindow = (Window) GetMainWindow(); wxCHECK_RET( xwindow, wxT("invalid window") ); - + + wxCHECK_RET( AcceptsFocus(), wxT("set focus on window that doesn't accept the focus") ); + +#if 0 + if (GetName() == "scrollBar") + { + char *crash = NULL; + *crash = 0; + } +#endif + if (wxWindowIsVisible(xwindow)) { XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime ); @@ -636,7 +648,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 ); @@ -654,7 +666,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); @@ -708,7 +720,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); @@ -771,6 +783,12 @@ void wxWindowX11::DoSetClientSize(int width, int height) wxCHECK_RET( xwindow, wxT("invalid window") ); +#if 1 + + XResizeWindow( wxGlobalDisplay(), xwindow, width, height ); + +#else + XWindowAttributes attr; Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr ); wxCHECK_RET( status, wxT("invalid window attributes") ); @@ -787,6 +805,8 @@ void wxWindowX11::DoSetClientSize(int width, int height) new_h = height; DoMoveWindow( new_x, new_y, new_w, new_h ); + +#endif } // For implementation purposes - sometimes decorations make the client area @@ -836,6 +856,28 @@ void wxWindowX11::DoMoveWindow(int x, int y, int width, int height) wxCHECK_RET( xwindow, wxT("invalid window") ); +#if !wxUSE_NANOX + + 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; @@ -845,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 } // --------------------------------------------------------------------------- @@ -960,6 +1004,7 @@ void wxWindowX11::Update() { if (!m_updateRegion.IsEmpty()) { + // wxLogDebug("wxWindowX11::Update: %s", GetClassInfo()->GetClassName()); // Actually send erase events. SendEraseEvents(); @@ -978,43 +1023,38 @@ 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 ); - if (!GetEventHandler()->ProcessEvent(erase_event)) + 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; - + wxNcPaintEvent nc_paint_event( GetId() ); nc_paint_event.SetEventObject( this ); GetEventHandler()->ProcessEvent( nc_paint_event ); @@ -1022,7 +1062,7 @@ void wxWindowX11::SendPaintEvents() wxPaintEvent paint_event( GetId() ); paint_event.SetEventObject( this ); GetEventHandler()->ProcessEvent( paint_event ); - + m_updateRegion.Clear(); m_clipPaintRegion = FALSE; @@ -1062,7 +1102,9 @@ void wxWindowX11::OnInternalIdle() // Set the input focus if couldn't do it before if (m_needsInputFocus) + { SetFocus(); + } } // ----------------------------------------------------------------------------