]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/window.cpp
fixed compilation problem with old gcc releases
[wxWidgets.git] / src / x11 / window.cpp
index cd6575da0c1d4ca8de8d7e1f834d9abe322b5006..7568f13c88bdbea196311864151f52842ebf57d3 100644 (file)
@@ -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();
+    }
 }
 
 // ----------------------------------------------------------------------------