]> git.saurik.com Git - wxWidgets.git/commitdiff
Motif bug fixes; dialog OnPaint works now; wxColourDialog tweaking
authorJulian Smart <julian@anthemion.co.uk>
Wed, 11 Nov 1998 14:39:42 +0000 (14:39 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Wed, 11 Nov 1998 14:39:42 +0000 (14:39 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@989 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

19 files changed:
distrib/msw/generic.rsp
docs/motif/todo.txt
include/wx/help.h
include/wx/motif/dcclient.h
include/wx/motif/region.h
include/wx/motif/window.h
samples/help/demo.cpp
src/generic/colrdlgg.cpp
src/generic/fontdlgg.cpp
src/motif.inc
src/motif/choice.cpp
src/motif/dcclient.cpp
src/motif/dialog.cpp
src/motif/makefile.unx
src/motif/region.cpp
src/motif/slider.cpp
src/motif/utils.cpp
src/motif/utilsexc.cpp
src/motif/window.cpp

index cedfe8b6de616e0aa880a32d4f29befa9460c120..1e57c7435f405d406cf554ca0ce2b51647a09780 100644 (file)
@@ -302,6 +302,22 @@ samples/wxsocket/*.xpm
 samples/wxsocket/*.ico
 samples/wxsocket/*.rc
 
+samples/help/*.cpp
+samples/help/*.h
+samples/help/*.def
+samples/help/makefile*
+samples/help/*.xbm
+samples/help/*.xpm
+samples/help/*.ico
+samples/help/*.rc
+samples/help/doc/*.html
+samples/help/doc/*.htm
+samples/help/doc/*.class
+samples/help/doc/*.db
+samples/help/doc/*.tex
+samples/help/doc/*.gif
+samples/help/doc/*.map
+
 samples/bombs/*.cpp
 samples/bombs/*.h
 samples/bombs/*.def
index 4e8ade76ea6a9012f17c4b7f141c54840f60594d..0aaab0544dfed6b0e3b5373d4ef69b8a0d8b9e10 100644 (file)
@@ -23,6 +23,9 @@ High Priority
 
 - Make wxDialog OnPaint work.
 
+- Optimize wxWindow OnPaint, clipping the damaged
+  region.
+
 - Implementation of OnEraseBackground. How? Call OnEraseBackground
   just before OnPaint? Will duplicate Xlib's own erase of the background.
   However, this is usually OK, because the default wxWindow::OnEraseBackground
index 7448e58349734314e134e6b5b5611909697d0baf..b8d5098502f3ddcb6925f068a45211828440fa8a 100644 (file)
@@ -3,21 +3,16 @@
 
 #ifdef __WXMSW__
 #include "wx/msw/helpwin.h"
-#elif defined(__WXGTK__)
-#include "wx/generic/helpext.h"
 #else
-#include "wx/generic/helpxlp.h"
+#include "wx/generic/helpext.h"
 #endif
 
 #ifdef __WXMSW__
 #define wxHelpController wxWinHelpController
 #define sm_classwxHelpController sm_classwxWinHelpController
-#elif defined(__WXGTK__)
+#else
 #define wxHelpController wxExtHelpController
 #define sm_classwxHelpController sm_classwxExtHelpController
-#else
-#define wxHelpController wxXLPHelpController
-#define sm_classwxHelpController sm_classwxXLPHelpController
 #endif
 
 #endif
index 6784cda790f3bcae73c26857dba148aa75bd97d9..9b75bf2aada2f8ca527bf9104dbbce9855e7e3cd 100644 (file)
@@ -131,7 +131,8 @@ class WXDLLEXPORT wxPaintDC: public wxWindowDC
   DECLARE_DYNAMIC_CLASS(wxPaintDC)
 public:
   wxPaintDC() {}
-  wxPaintDC(wxWindow* win): wxWindowDC(win) {}
+  wxPaintDC(wxWindow* win);
+  ~wxPaintDC();
 };
 
 class WXDLLEXPORT wxClientDC: public wxWindowDC
index 4741405bdec1647812375f3055892c3dcabd270c..ca68dc140af831c4b6f7152444de7a620106abd0 100644 (file)
@@ -84,7 +84,8 @@ public:
 
        // Is region empty?
        bool Empty() const;
-    inline bool IsEmpty() const { return Empty(); }
+        inline bool IsEmpty() const { return Empty(); }
+        bool Ok() const { return (m_refData != NULL) ; }
 
        //# Tests
        // Does the region contain the point (x,y)?
@@ -100,6 +101,9 @@ public:
        bool Combine(long x, long y, long width, long height, wxRegionOp op);
        bool Combine(const wxRegion& region, wxRegionOp op);
        bool Combine(const wxRect& rect, wxRegionOp op);
+
+    // Get the internal Region handle
+    WXRegion GetXRegion() ;
 };
 
 class WXDLLEXPORT wxRegionIterator : public wxObject {
index a21bff3a0eecec63b9676f1617d37d7d121c07ab..6f72b727427ad83769a46a5310ec0e71a912038a 100644 (file)
@@ -231,7 +231,7 @@ public:
   virtual void DragAcceptFiles(bool accept);
 
   // Update region access
-  virtual wxRegion GetUpdateRegion() const;
+  virtual wxRegion& GetUpdateRegion() const;
   virtual bool IsExposed(int x, int y, int w, int h) const;
   virtual bool IsExposed(const wxPoint& pt) const;
   virtual bool IsExposed(const wxRect& rect) const;
@@ -486,6 +486,7 @@ public:
 
   /// Motif-specific
 
+  void ClearUpdateRects();
   void CanvasGetSize(int* width, int* height) const; // If have drawing area
   void CanvasGetClientSize(int *width, int *height) const;
   void CanvasGetPosition(int *x, int *y) const; // If have drawing area
@@ -518,7 +519,6 @@ public:
   virtual WXPixmap GetBackingPixmap() const { return m_backingPixmap; }
   inline int GetPixmapWidth() const { return m_pixmapWidth; }
   inline int GetPixmapHeight() const { return m_pixmapHeight; }
-  virtual WXRegion GetPaintRegion() const { return m_paintRegion; }
 
   // Change properties
   virtual void ChangeFont(bool keepOriginalSize = TRUE);             // Change to the current font (often overridden)
@@ -594,7 +594,6 @@ public:
   int                   m_lastButton;  // last pressed button
   wxList                m_updateRects;     // List of wxRectangles representing damaged region
   bool                  m_isShown;
-  WXRegion              m_paintRegion; // Clip region generated by expose event
 protected:
   WXWidget              m_mainWidget;
   WXWidget              m_hScrollBar;
index f7118b22d2f8f41d9c43b0d91df4ae54a2996fb4..01e9b6fbcacd360f0a43a620fc1ec1f0975a13c7 100644 (file)
@@ -41,7 +41,7 @@
 // ressources
 // ----------------------------------------------------------------------------
 // the application icon
-#ifdef __WXGTK__
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
     #include "mondrian.xpm"
 #endif
 
index 4e011463abd3583ee5ffc0553a2968e30df57ec3..8444654cca8355dbb14cdc37530c8d77a2198bf2 100644 (file)
@@ -232,7 +232,7 @@ void wxGenericColourDialog::CreateWidgets(void)
   int bw, bh;
   okButton->GetSize(&bw, &bh);
 
-  (void) new wxButton(this, wxID_CANCEL, _("Cancel"), wxPoint(okButtonX + bw + 10, buttonY));
+  (void) new wxButton(this, wxID_CANCEL, _("Cancel"), wxPoint(okButtonX + bw + 20, buttonY));
   (void) new wxButton(this, wxID_ADD_CUSTOM, _("Add to custom colours"),
      wxPoint(customButtonX, buttonY));
 
@@ -252,7 +252,7 @@ void wxGenericColourDialog::CreateWidgets(void)
   blueSlider = new wxSlider(this, wxID_BLUE_SLIDER, 0, 0, 255,
    wxPoint(sliderX + 2*sliderSpacing, 10), wxSize(-1, sliderHeight), wxVERTICAL|wxSL_LABELS);
 
-  SetClientSize(sliderX + 3*sliderSpacing, buttonY + 30);
+  SetClientSize(sliderX + 3*sliderSpacing, buttonY + 40);
   okButton->SetDefault();
 
   Centre(wxBOTH);
index 269f389d527889217e965f9c2abc0866a8f45766..603d0afad64b78b5e9c01d7d1d17c74b85805864 100644 (file)
@@ -209,8 +209,8 @@ void wxGenericFontDialog::CreateWidgets(void)
   int x=-1;
   int y=40;
   familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families);
-  styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(140, 10), wxSize(120, -1), 3, styles);
-  weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(270, 10), wxSize(120, -1), 3, weights);
+  styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(160, 10), wxSize(120, -1), 3, styles);
+  weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(310, 10), wxSize(120, -1), 3, weights);
 
   colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(190, -1), NUM_COLS, wxColourDialogNames);
 #ifdef __MOTIF__
@@ -228,8 +228,8 @@ void wxGenericFontDialog::CreateWidgets(void)
        pointSizes[i] = buf;
   }
 
-  pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(210, y), wxSize(50, -1), 40, pointSizes);
-  underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(280, y));
+  pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(230, y), wxSize(50, -1), 40, pointSizes);
+  underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y));
 
   int rectY;
   pointSizeChoice->GetPosition(&x, &rectY); //NL mod
@@ -257,7 +257,7 @@ void wxGenericFontDialog::CreateWidgets(void)
 
   okButton->SetDefault();
 
-  SetClientSize(400, by + 30);
+  SetClientSize(450, by + 40);
 
   Centre(wxBOTH);
 
index aedd2d20944baac4cc62829420c5fa097a17e30e..b8668e3742b8f2d19f3e82ae46d3ef2438bac243 100644 (file)
@@ -123,6 +123,7 @@ LIB_CPP_SRC=\
  generic/colrdlgg.cpp \
  generic/fontdlgg.cpp \
  generic/gridg.cpp \
+ generic/helpext.cpp \
  generic/imaglist.cpp \
  generic/listctrl.cpp \
  generic/laywin.cpp \
index d8c4b715f0ce5fbd08b2e7cd57d5b5267aeb0195..a70bef64bfe99e52e998b66fb369956c491dff02 100644 (file)
@@ -416,7 +416,8 @@ void wxChoiceCallback (Widget w, XtPointer clientData, XtPointer WXUNUSED(ptr))
         XtVaGetValues (w, XmNuserData, &s, NULL);
         if (s)
         {
-            wxCommandEvent event (wxEVT_COMMAND_CHOICE_SELECTED);
+            wxCommandEvent event (wxEVT_COMMAND_CHOICE_SELECTED, item->GetId());
+            event.SetEventObject(item);
             event.m_commandInt = item->FindString (s);
 //            event.m_commandString = s;
             item->ProcessCommand (event);
index 6ab2bd156ae7d29c4a198def5a6a8d94e4ea52bb..fe588047341f11102df201cb3b223035ca08a532 100644 (file)
@@ -1992,17 +1992,17 @@ void wxWindowDC:: SetDCClipping ()
   // clipping imposed on a window by a repaint.
   // We'll combine it with the user region. But for now,
   // just use the currently-defined user clipping region.
-  if (m_userRegion || (m_window && m_window->GetPaintRegion()) )
+  if (m_userRegion || (m_window && m_window->GetUpdateRegion().Ok()) )
     m_currentRegion = (WXRegion) XCreateRegion ();
   else
     m_currentRegion = (WXRegion) NULL;
 
-  if ((m_window && m_window->GetPaintRegion()) && m_userRegion)
-    XIntersectRegion ((Region) m_window->GetPaintRegion(), (Region) m_userRegion, (Region) m_currentRegion);
+  if ((m_window && m_window->GetUpdateRegion().Ok()) && m_userRegion)
+    XIntersectRegion ((Region) m_window->GetUpdateRegion().GetXRegion(), (Region) m_userRegion, (Region) m_currentRegion);
   else if (m_userRegion)
     XIntersectRegion ((Region) m_userRegion, (Region) m_userRegion, (Region) m_currentRegion);
-  else if (m_window && m_window->GetPaintRegion())
-    XIntersectRegion ((Region) m_window->GetPaintRegion(), (Region) m_window->GetPaintRegion(), 
+  else if (m_window && m_window->GetUpdateRegion().Ok())
+    XIntersectRegion ((Region) m_window->GetUpdateRegion().GetXRegion(), (Region) m_window->GetUpdateRegion().GetXRegion(), 
 (Region) m_currentRegion);
 
   if (m_currentRegion)
@@ -2225,3 +2225,56 @@ void wxWindowDC::DrawSpline( wxList *points )
 
     wx_spline_draw_point_array( this );
 };
+
+/*
+ * wxPaintDC
+ */
+
+wxPaintDC::wxPaintDC(wxWindow* win): wxWindowDC(win)
+{
+    wxRegion* region = NULL;
+
+    // Combine all the update rects into a region
+    if (win->m_updateRects.Number() > 0)
+    {
+        int i = 0;
+        for (i = 0; i < win->m_updateRects.Number(); i++)
+        {
+            wxRect* rect = (wxRect*) win->m_updateRects.Nth(i)->Data();
+           /*
+            cout << "wxPaintDC. wxRect: " << rect->x << ", " << rect->y << ", ";
+            cout << rect->width << ", " << rect->height << "\n\n";
+           */
+
+            if (!region)
+                region = new wxRegion(*rect);
+            else
+                // TODO: is this correct? In SetDCClipping above,
+                // XIntersectRegion is used to combine paint and user
+                // regions. XIntersectRegion appears to work in that case...
+                region->Union(*rect);
+        }
+    }
+    else
+    {
+        int cw, ch;
+        win->GetClientSize(&cw, &ch);
+        region = new wxRegion(wxRect(0, 0, cw, ch));
+    }
+
+    win->m_updateRegion = *region;
+
+    // Set the clipping region. Any user-defined region will be combined with this
+    // one in SetDCClipping.
+    XSetRegion ((Display*) m_display, (GC) m_gc, (Region) region->GetXRegion());
+
+    delete region;
+}
+
+wxPaintDC::~wxPaintDC()
+{
+    XSetClipMask ((Display*) m_display, (GC) m_gc, None);
+    if (m_window)
+        m_window->m_updateRegion.Clear();
+}
+
index 12f3a7ffad4531837efc1cbb76b7131e86af675b..4afc7bf1c0966e5dbbd11d313b62011ac62b34aa 100644 (file)
@@ -617,86 +617,42 @@ static void wxCloseDialogCallback( Widget WXUNUSED(widget), XtPointer client_dat
 // TODO: Preferably, we should have a universal repaint proc.
 // Meanwhile, use a special one for dialogs.
 static void wxDialogBoxRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, char *)
-   {
+{
      Window window;
      Display *display;
-/*
-     static XRectangle *xrect;
-     GC gc;
-     int llp = 0;
-     static int last_count = 0;
-     static int draw_count = 0;
-*/
 
      wxWindow* win = (wxWindow *)wxWidgetHashTable->Get((long)w);
      if (!win)
        return;
 
      switch(event -> type)
-        {
+     {
           case Expose :
+          {
                window = (Window) win -> GetXWindow();
                display = (Display *) win -> GetXDisplay();
-              /* TODO
-               gc = (GC) panel -> GetDC() -> gc;
-               
-               llp = event -> xexpose.count;
-               
-               if ((last_count == 0) && (llp == 0))
-                  {
-                    xrect = new XRectangle[1];
-                    xrect[0].x = event -> xexpose.x;
-                    xrect[0].y = event -> xexpose.y;
-                    xrect[0].width = event -> xexpose.width;
-                    xrect[0].height = event -> xexpose.height;
-                    
-                    XSetClipRectangles(display,gc,0,0,xrect,1,Unsorted);
-//                    panel->DoPaint(xrect, 1);
-                    panel->GetEventHandler()->OnPaint();
-
-                    delete xrect;
-                  }
-
-               if ((last_count == 0) && (llp != 0))
-                  {
-                    xrect = new XRectangle[llp + 1];
-                    draw_count = llp + 1;
-                    
-                    xrect[draw_count - llp - 1].x = event -> xexpose.x;
-                    xrect[draw_count - llp - 1].y = event -> xexpose.y;
-                    xrect[draw_count - llp - 1].width = event -> xexpose.width;
-                    xrect[draw_count - llp - 1].height = event -> xexpose.height;
-                  }
-
-               if ((last_count != 0) && (llp != 0))
-                  {
-                    xrect[draw_count - llp - 1].x = event -> xexpose.x;
-                    xrect[draw_count - llp - 1].y = event -> xexpose.y;
-                    xrect[draw_count - llp - 1].width = event -> xexpose.width;
-                    xrect[draw_count - llp - 1].height = event -> xexpose.height;
-                  }
-               
-               if ((last_count != 0) && (llp == 0))
-                  {
-                    xrect[draw_count - llp - 1].x = event -> xexpose.x;
-                    xrect[draw_count - llp - 1].y = event -> xexpose.y;
-                    xrect[draw_count - llp - 1].width = event -> xexpose.width;
-                    xrect[draw_count - llp - 1].height = event -> xexpose.height;
-
-                    XSetClipRectangles(display,gc,0,0,xrect,draw_count,Unsorted);
-//                    panel->DoPaint(xrect,draw_count);
-                    panel->GetEventHandler()->OnPaint();
-
-                    delete xrect;
-                  }
-               last_count = event -> xexpose.count;
-              */
+
+               wxRect* rect = new wxRect(event->xexpose.x, event->xexpose.y,
+                                       event->xexpose.width, event->xexpose.height);
+               win->m_updateRects.Append((wxObject*) rect);
+
+               if (event -> xexpose.count == 0)
+               {
+                    wxPaintEvent event(win->GetId());
+                    event.SetEventObject(win);
+                    win->GetEventHandler()->ProcessEvent(event);
+
+                    win->ClearUpdateRects();
+               }
                break;
-          default :
+         }
+        default :
+         {
                cout << "\n\nNew Event ! is = " << event -> type << "\n";
                break;
-        }
-   }
+         }
+     }
+}
 
 static void wxDialogBoxEventHandler (Widget    wid,
                               XtPointer WXUNUSED(client_data),
index f1c5a48a1f62dd7b7be9f2aab2653a480ee64c9e..05383b11ed031956bb8fc69ea6c2f2b855c8e957 100644 (file)
@@ -137,6 +137,7 @@ LIB_CPP_SRC=\
  ../generic/colrdlgg.cpp \
  ../generic/fontdlgg.cpp \
  ../generic/gridg.cpp \
+ ../generic/helpext.cpp \
  ../generic/imaglist.cpp \
  ../generic/listctrl.cpp \
  ../generic/laywin.cpp \
index 3a8f5603d0a91936fa171a0b9687eeeeb9ee77a8..914921145034bc6caf9ddcf6596670a5429c3001 100644 (file)
@@ -104,6 +104,14 @@ wxRegion::~wxRegion()
     // m_refData unrefed in ~wxObject
 }
 
+// Get the internal region handle
+WXRegion wxRegion::GetXRegion()
+{
+    wxASSERT( m_refData !=NULL );
+
+    return (WXRegion) ((wxRegionRefData*)m_refData)->m_region;
+}
+
 //-----------------------------------------------------------------------------
 //# Modify region
 //-----------------------------------------------------------------------------
@@ -237,7 +245,7 @@ wxRect wxRegion::GetBox() const
 // Is region empty?
 bool wxRegion::Empty() const
 {
-       return m_refData ? XEmptyRegion(M_REGION) : FALSE;
+       return m_refData ? XEmptyRegion(M_REGION) : TRUE;
 }
 
 //-----------------------------------------------------------------------------
index 0b09dd5e15e49715a6768d2aaa9874b0f0a25588..34aafd4a61a4972663f328983f940ec61d5df183 100644 (file)
@@ -281,6 +281,11 @@ void wxSliderCallback (Widget widget, XtPointer clientData, XmScaleCallbackStruc
             XtVaGetValues (widget, XmNvalue, &event.m_commandInt, NULL);
             event.SetEventObject(slider);
             slider->ProcessCommand(event);
+
+            // Also send a wxCommandEvent for compatibility.
+            wxCommandEvent event2(wxEVT_COMMAND_SLIDER_UPDATED, slider->GetId());
+            event2.SetEventObject(slider);
+            slider->ProcessCommand(event2);
             break;
         }
     }
index 5c2797dc175c0f5be21fc5067c48da9009d04cf8..63278446f858afd35d26048e704549b8da8e63a9 100644 (file)
@@ -615,6 +615,13 @@ bool wxIsBusy()
   return (wxBusyCursorCount > 0);
 }    
 
+const char* wxGetHomeDir( wxString *home  )
+{
+  *home = wxGetUserHome( wxString() );
+  if (home->IsNull()) *home = "/";
+  return *home;
+};
+
 char *wxGetUserHome (const wxString& user)
 {
 #ifdef VMS
index 0f4dc1119fd1ab233690054756bec7b482d00378..94ff593d4f769abfd2de6b012d8d74a7f42c7319 100644 (file)
@@ -10,7 +10,7 @@
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation
+// #pragma implementation
 #endif
 
 #include "wx/utils.h"
@@ -135,7 +135,7 @@ long wxExecute(char **argv, bool sync, wxProcess *WXUNUSED(handler))
   // end VMS
 }
 
-long wxExecute (const wxString& command, bool sync)
+long wxExecute (const wxString& command, bool sync, wxProcess* WXUNUSED(process))
 {
 #ifdef VMS
   return(0);
index 9fc441729c430a27160c2d71744321c949851a75..dad35a5234344fd5b9fe71a96e0414ba633e24ec 100644 (file)
@@ -135,7 +135,6 @@ wxWindow::wxWindow()
     m_canAddEventHandler = FALSE;
     m_scrollPosX = 0;
     m_scrollPosY = 0;
-    m_paintRegion = (WXRegion) 0;
 }
 
 // Destructor
@@ -143,10 +142,6 @@ wxWindow::~wxWindow()
 {
     //// Motif-specific
 
-    if (m_paintRegion)
-        XDestroyRegion ((Region) m_paintRegion);
-    m_paintRegion = (WXRegion) 0;
-
     if (GetMainWidget())
         DetachWidget(GetMainWidget()); // Removes event handlers
 
@@ -243,6 +238,8 @@ wxWindow::~wxWindow()
 
     if ( m_windowValidator ) delete m_windowValidator;
     if (m_clientObject) delete m_clientObject;
+
+    ClearUpdateRects();
 }
 
 // Destroy the window (delayed, if a managed window)
@@ -309,7 +306,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     m_pixmapOffsetY = 0;
     m_scrollPosX = 0;
     m_scrollPosY = 0;
-    m_paintRegion = (WXRegion) 0;
 
     if (!parent)
         return FALSE;
@@ -2016,9 +2012,9 @@ bool wxWindow::AcceptsFocus() const
 }
 
 // Update region access
-wxRegion wxWindow::GetUpdateRegion() const
+wxRegion& wxWindow::GetUpdateRegion() const
 {
-    return m_updateRegion;
+    return (wxRegion&) m_updateRegion;
 }
 
 bool wxWindow::IsExposed(int x, int y, int w, int h) const
@@ -2135,75 +2131,41 @@ void wxCanvasRepaintProc (Widget drawingArea, XtPointer clientData,
  XmDrawingAreaCallbackStruct * cbs)
 {
     if (!wxWidgetHashTable->Get ((long) (Widget) drawingArea))
-       return;
+           return;
 
     XEvent * event = cbs->event;
-    wxWindow * canvas = (wxWindow *) clientData;
-    Display * display = (Display *) canvas->GetXDisplay();
-    //    GC gc = (GC) canvas->GetDC()->gc;
+    wxWindow * win = (wxWindow *) clientData;
+    Display * display = (Display *) win->GetXDisplay();
 
     switch (event->type)
     {
-      case Expose:
-      {
-       /* TODO
-        wxCanvasDC* canvasDC = canvas->GetDC();
-        if (canvasDC)
-       {
-          if (canvasDC->onpaint_reg)
-            XDestroyRegion(canvasDC->onpaint_reg);
-          canvasDC->onpaint_reg = XCreateRegion();
-          
-       }
-       */
-
-       int n = canvas->m_updateRects.Number();
-        XRectangle* xrects = new XRectangle[n];
-        int i;
-       for (i = 0; i < canvas->m_updateRects.Number(); i++)
-       {
-         wxRect* rect = (wxRect*) canvas->m_updateRects.Nth(i)->Data();
-         xrects[i].x = rect->x;
-          xrects[i].y = rect->y;
-          xrects[i].width = rect->width;
-          xrects[i].height = rect->height;
-         /* TODO (?) Actually ignore it I think.
-          if (canvasDC)
-            XUnionRectWithRegion(&(xrects[i]), canvasDC->onpaint_reg,
-              canvasDC->onpaint_reg);
-      */
-       }
-       /* TODO must clip the area being repainted. So we need a gc.
-         * Alternatively, wxPaintDC must do the clipping
-         * when it's created.
-        XSetClipRectangles(display, gc, 0, 0, xrects, n, Unsorted);
-       */
-
-        canvas->DoPaint() ; // xrects, n);
-        delete[] xrects;
+        case Expose:
+        {
+            wxRect* rect = new wxRect(event->xexpose.x, event->xexpose.y,
+                                       event->xexpose.width, event->xexpose.height);
+           /*
+            cout << "Expose proc. wxRect: " << rect->x << ", " << rect->y << ", ";
+            cout << rect->width << ", " << rect->height << "\n\n";
+           */
 
-        canvas->m_updateRects.Clear();
+            win->m_updateRects.Append((wxObject*) rect);
 
-       /*
-        if (canvasDC)
-       {
-          XDestroyRegion(canvasDC->onpaint_reg);
-          canvasDC->onpaint_reg = NULL;
-       }
-
-       XGCValues gc_val;
-       gc_val.clip_mask = None;
-       XChangeGC(display, gc, GCClipMask, &gc_val);
-       */
+            if (event -> xexpose.count == 0)
+            {
+                wxPaintEvent event(win->GetId());
+                event.SetEventObject(win);
+                win->GetEventHandler()->ProcessEvent(event);
 
-       break;
-    }
-    default:
-    {
-       cout << "\n\nNew Event ! is = " << event -> type << "\n";
-       break;
+                win->ClearUpdateRects();
+            }
+            break;
+        }
+        default:
+        {
+               cout << "\n\nNew Event ! is = " << event -> type << "\n";
+               break;
+        }
     }
-  }
 }
 
 // Unable to deal with Enter/Leave without a separate EventHandler (Motif 1.1.4)
@@ -3138,4 +3100,14 @@ void wxWindow::SetFont(const wxFont& font)
     ChangeFont();
 }
 
-
+void wxWindow::ClearUpdateRects()
+{
+    wxNode* node = m_updateRects.First();
+    while (node)
+    {
+        wxRect* rect = (wxRect*) node->Data();
+        delete rect;
+        node = node->Next();
+    }
+    m_updateRects.Clear();
+}