X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/461e93f921df33c09637db5dddcfd07411ff0ded..818503a1826c8d32340234318afe6de35f756c2f:/src/x11/window.cpp diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 54b47095d0..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; @@ -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 ); @@ -383,7 +395,7 @@ void wxWindowX11::DoCaptureMouse() return; } - /// wxLogDebug("Grabbed pointer"); + // wxLogDebug("Grabbed pointer in %s", GetName().c_str() ); #if 0 res = XGrabButton(wxGlobalDisplay(), AnyButton, AnyModifier, @@ -443,7 +455,7 @@ void wxWindowX11::DoReleaseMouse() #endif } - // wxLogDebug("Ungrabbed pointer"); + // wxLogDebug( "Ungrabbed pointer in %s", GetName().c_str() ); m_winCaptured = FALSE; } @@ -479,7 +491,7 @@ bool wxWindowX11::SetCursor(const wxCursor& cursor) Cursor xcursor = (Cursor) cursorToUse.GetCursor(); - XDefineCursor( (Display*) wxGlobalDisplay(), xwindow, xcursor ); + XDefineCursor( wxGlobalDisplay(), xwindow, xcursor ); return TRUE; } @@ -529,14 +541,15 @@ void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect) GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL ); XSetGraphicsExposures( xdisplay, xgc, True ); - int s_x; - int s_y; + int s_x = 0; + int s_y = 0; int cw; int ch; if (rect) { s_x = rect->x; s_y = rect->y; + cw = rect->width; ch = rect->height; } @@ -550,7 +563,7 @@ void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect) wxPoint offset = GetClientAreaOrigin(); s_x += offset.x; s_y += offset.y; - + int w = cw - abs(dx); int h = ch - abs(dy); @@ -561,23 +574,24 @@ void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect) else { wxRect rect; - if (dx < 0) rect.x = cw+dx; else rect.x = s_x; - if (dy < 0) rect.y = ch+dy; else rect.y = s_y; + if (dx < 0) rect.x = cw+dx + offset.x; else rect.x = s_x; + if (dy < 0) rect.y = ch+dy + offset.y; else rect.y = s_y; if (dy != 0) rect.width = cw; else rect.width = abs(dx); if (dx != 0) rect.height = ch; else rect.height = abs(dy); int d_x = s_x; int d_y = s_y; + if (dx < 0) s_x += -dx; if (dy < 0) s_y += -dy; - if (dx > 0) d_x = dx; - if (dy > 0) d_y = dy; + if (dx > 0) d_x = dx + offset.x; + if (dy > 0) d_y = dy + offset.y; XCopyArea( xdisplay, xwindow, xwindow, xgc, s_x, s_y, w, h, d_x, d_y ); - // printf( "s_x %d s_y %d w %d h %d d_x %d d_y %d\n", s_x, s_y, w, h, d_x, d_y ); + // wxLogDebug( "Copy: s_x %d s_y %d w %d h %d d_x %d d_y %d", s_x, s_y, w, h, d_x, d_y ); - // printf( "rect %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height ); + // wxLogDebug( "Update: %d %d %d %d", rect.x, rect.y, rect.width, rect.height ); m_updateRegion.Union( rect ); m_clearRegion.Union( rect ); @@ -634,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 ); @@ -652,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); @@ -706,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); @@ -769,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") ); @@ -785,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 @@ -794,17 +816,6 @@ wxPoint wxWindowX11::GetClientAreaOrigin() const return wxPoint(0, 0); } -// Makes an adjustment to the window position (for example, a frame that has -// a toolbar that it manages itself). -void wxWindowX11::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) -{ - if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent()) - { - wxPoint pt(GetParent()->GetClientAreaOrigin()); - x += pt.x; y += pt.y; - } -} - void wxWindowX11::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH) { m_minWidth = minW; @@ -845,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; @@ -854,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 } // --------------------------------------------------------------------------- @@ -969,6 +1004,7 @@ void wxWindowX11::Update() { if (!m_updateRegion.IsEmpty()) { + // wxLogDebug("wxWindowX11::Update: %s", GetClassInfo()->GetClassName()); // Actually send erase events. SendEraseEvents(); @@ -987,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 ); - 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; @@ -1031,7 +1062,7 @@ void wxWindowX11::SendPaintEvents() wxPaintEvent paint_event( GetId() ); paint_event.SetEventObject( this ); GetEventHandler()->ProcessEvent( paint_event ); - + m_updateRegion.Clear(); m_clipPaintRegion = FALSE; @@ -1071,7 +1102,9 @@ void wxWindowX11::OnInternalIdle() // Set the input focus if couldn't do it before if (m_needsInputFocus) + { SetFocus(); + } } // ----------------------------------------------------------------------------