]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/window.cpp
added SetString(), deprecated SetLabel()
[wxWidgets.git] / src / x11 / window.cpp
index 75c41eb94c51f975f918e0eb00269b66b3950982..31875c8e7db9f385e4867241f551583d66656df5 100644 (file)
@@ -253,6 +253,21 @@ wxWindow *wxWindowBase::FindFocus()
     return NULL;
 }
 
+#if 0
+wxWindow *wxWindowX11::GetFocusWidget()
+{
+   wxWindow *win = (wxWindow*) this;
+   while (!win->IsTopLevel())
+   {
+       win = win->GetParent();
+       if (!win)
+           return (wxWindow*) NULL;
+   }
+   
+   return win;
+}
+#endif
+
 // Enabling/disabling handled by event loop, and not sending events
 // if disabled.
 bool wxWindowX11::Enable(bool enable)
@@ -460,6 +475,29 @@ void wxWindowX11::WarpPointer (int x, int y)
 // Does a physical scroll
 void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect)
 {
+    // No scrolling requested.
+    if ((dx == 0) && (dy == 0)) return;
+    
+    if (!m_updateRegion.IsEmpty())
+    {
+        m_updateRegion.Offset( dx, dy );
+        
+        int cw = 0;
+        int ch = 0;
+        GetSize( &cw, &ch );  // GetClientSize() ??
+        m_updateRegion.Intersect( 0, 0, cw, ch );
+    }
+    
+    if (!m_clearRegion.IsEmpty())
+    {
+        m_clearRegion.Offset( dx, dy );
+        
+        int cw = 0;
+        int ch = 0;
+        GetSize( &cw, &ch );  // GetClientSize() ??
+        m_clearRegion.Intersect( 0, 0, cw, ch );
+    }
+    
     Window xwindow = (Window) GetMainWindow();
 
     wxCHECK_RET( xwindow, wxT("invalid window") );
@@ -469,34 +507,55 @@ void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect)
     GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL );
     XSetGraphicsExposures( xdisplay, xgc, True );
 
-    int cw = 0;
-    int ch = 0;
-    GetClientSize( &cw, &ch );
+    int s_x;
+    int s_y;
+    int cw;
+    int ch;
+    if (rect)
+    {
+        s_x = rect->x;
+        s_y = rect->y;
+        cw = rect->width;
+        ch = rect->height;
+    }
+    else
+    {
+        s_x = 0;
+        s_y = 0;
+        GetClientSize( &cw, &ch );
+    }
+    
+    wxPoint offset = GetClientAreaOrigin();
+    s_x += offset.x;
+    s_y += offset.y;
+
     int w = cw - abs(dx);
     int h = ch - abs(dy);
-
+        
     if ((h < 0) || (w < 0))
     {
         Refresh();
     }
     else
     {
-        int s_x = 0;
-        int s_y = 0;
-        if (dx < 0) s_x = -dx;
-        if (dy < 0) s_y = -dy;
-        int d_x = 0;
-        int d_y = 0;
+        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 (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;
 
         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 );
 
-        wxRect rect;
-        if (dx < 0) rect.x = cw+dx; else rect.x = 0;
-        if (dy < 0) rect.y = ch+dy; else rect.y = 0;
-        if (dy != 0) rect.width = cw; else rect.width = abs(dx);
-        if (dx != 0) rect.height = ch; else rect.height = abs(dy);
+        // printf( "rect %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height );
 
         m_updateRegion.Union( rect );
         m_clearRegion.Union( rect );
@@ -624,7 +683,7 @@ void wxWindowX11::DoGetClientSize(int *x, int *y) const
 
     if (window)
     {
-        XSync(wxGlobalDisplay(), False);
+        XSync(wxGlobalDisplay(), False);  // Is this really a good idea?
         XWindowAttributes attr;
         Status status = XGetWindowAttributes( wxGlobalDisplay(), window, &attr );
         wxASSERT(status);
@@ -639,72 +698,70 @@ void wxWindowX11::DoGetClientSize(int *x, int *y) const
 
 void wxWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    if (!GetMainWindow())
-        return;
+    Window xwindow = (Window) GetMainWindow();
 
-    XWindowChanges windowChanges;
-    windowChanges.x = 0;
-    windowChanges.y = 0;
-    windowChanges.width = 0;
-    windowChanges.height = 0;
-    windowChanges.stack_mode = 0;
-    int valueMask = 0;
+    wxCHECK_RET( xwindow, wxT("invalid window") );
+
+    XWindowAttributes attr;
+    Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
+    wxCHECK_RET( status, wxT("invalid window attributes") );
+        
+    int new_x = attr.x;
+    int new_y = attr.y;
+    int new_w = attr.width;
+    int new_h = attr.height;
+            
 
     if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
     {
-       int yy = 0;
+        int yy = 0;
         AdjustForParentClientOrigin( x, yy, sizeFlags);
-        windowChanges.x = x;
-        valueMask |= CWX;
+        new_x = x;
     }
     if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
     {
-       int xx = 0;
+        int xx = 0;
         AdjustForParentClientOrigin( xx, y, sizeFlags);
-        windowChanges.y = y;
-        valueMask |= CWY;
+        new_y = y;
     }
-    if (width != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    if (width != -1)
     {
-        windowChanges.width = width /* - m_borderSize*2 */;
-       if (windowChanges.width == 0)
-           windowChanges.width = 1;
-        valueMask |= CWWidth;
+        new_w = width;
+        if (new_w <= 0)
+            new_w = 20;
     }
-    if (height != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    if (height != -1)
     {
-        windowChanges.height = height /* -m_borderSize*2*/;
-       if (windowChanges.height == 0)
-           windowChanges.height = 1;
-        valueMask |= CWHeight;
+        new_h = height;
+        if (new_h <= 0)
+            new_h = 20;
     }
-
-    XConfigureWindow(wxGlobalDisplay(), (Window) GetMainWindow(),
-        valueMask, & windowChanges);
-    XSync(wxGlobalDisplay(), False);
+    
+    DoMoveWindow( new_x, new_y, new_w, new_h );
 }
 
 void wxWindowX11::DoSetClientSize(int width, int height)
 {
-    if (!GetMainWindow())
-        return;
+    Window xwindow = (Window) GetMainWindow();
 
-    XWindowChanges windowChanges;
-    int valueMask = 0;
+    wxCHECK_RET( xwindow, wxT("invalid window") );
 
+    XWindowAttributes attr;
+    Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
+    wxCHECK_RET( status, wxT("invalid window attributes") );
+        
+    int new_x = attr.x;
+    int new_y = attr.y;
+    int new_w = attr.width;
+    int new_h = attr.height;
+            
     if (width != -1)
-    {
-        windowChanges.width = width ;
-        valueMask |= CWWidth;
-    }
+        new_w = width;
+        
     if (height != -1)
-    {
-        windowChanges.height = height ;
-        valueMask |= CWHeight;
-    }
-    XConfigureWindow(wxGlobalDisplay(), (Window) GetMainWindow(),
-        valueMask, & windowChanges);
-    XSync(wxGlobalDisplay(), False);
+        new_h = height;
+    
+    DoMoveWindow( new_x, new_y, new_w, new_h );
 }
 
 // For implementation purposes - sometimes decorations make the client area
@@ -759,7 +816,19 @@ void wxWindowX11::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW,
 
 void wxWindowX11::DoMoveWindow(int x, int y, int width, int height)
 {
-    DoSetSize(x, y, width, height);
+    Window xwindow = (Window) GetMainWindow();
+
+    wxCHECK_RET( xwindow, wxT("invalid window") );
+
+    XWindowChanges windowChanges;
+    windowChanges.x = x;
+    windowChanges.y = y;
+    windowChanges.width = width;
+    windowChanges.height = height;
+    windowChanges.stack_mode = 0;
+    int valueMask = CWX | CWY | CWWidth | CWHeight;
+
+    XConfigureWindow( wxGlobalDisplay(), xwindow, valueMask, &windowChanges );
 }
 
 // ---------------------------------------------------------------------------
@@ -902,7 +971,6 @@ void wxWindowX11::X11SendPaintEvents()
     
         if (!GetEventHandler()->ProcessEvent(erase_event))
         {
-            printf( "Hallo!\n" );
             Window xwindow = (Window) GetMainWindow();
             Display *xdisplay = wxGlobalDisplay();
             GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL );
@@ -915,6 +983,7 @@ void wxWindowX11::X11SendPaintEvents()
                                 upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
                 upd ++;
             }
+            XFreeGC( xdisplay, xgc );
         }
         m_clearRegion.Clear();
     }