post Expose event when we see an inval

git-svn-id: http://skia.googlecode.com/svn/trunk@9693 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/views/unix/SkOSWindow_Unix.cpp b/src/views/unix/SkOSWindow_Unix.cpp
index 0a66c7c..1733901 100644
--- a/src/views/unix/SkOSWindow_Unix.cpp
+++ b/src/views/unix/SkOSWindow_Unix.cpp
@@ -171,7 +171,7 @@
 
 static SkMSec gTimerDelay;
 
-static void MyXNextEventWithDelay(Display* dsp, XEvent* evt) {
+static bool MyXNextEventWithDelay(Display* dsp, XEvent* evt) {
     SkMSec ms = gTimerDelay;
     if (ms > 0) {
         int x11_fd = ConnectionNumber(dsp);
@@ -183,19 +183,23 @@
         tv.tv_sec = ms / 1000;              // seconds
         tv.tv_usec = (ms % 1000) * 1000;    // microseconds
 
-        (void)select(x11_fd + 1, &input_fds, NULL, NULL, &tv);
+        if (!select(x11_fd + 1, &input_fds, NULL, NULL, &tv)) {
+            if (!XPending(dsp)) {
+                return false;
+            }
+        }
     }
-
-    if (XPending(dsp)) {
-        XNextEvent(dsp, evt);
-    }
+    XNextEvent(dsp, evt);
+    return true;
 }
 
 SkOSWindow::NextXEventResult SkOSWindow::nextXEvent() {
     XEvent evt;
     Display* dsp = fUnixWindow.fDisplay;
 
-    MyXNextEventWithDelay(fUnixWindow.fDisplay, &evt);
+    if (!MyXNextEventWithDelay(fUnixWindow.fDisplay, &evt)) {
+        return kContinue_NextXEventResult;
+    }
 
     switch (evt.type) {
         case Expose:
@@ -249,29 +253,37 @@
     if (NULL == dsp) {
         return;
     }
-    XSelectInput(dsp, fUnixWindow.fWin, EVENT_MASK);
+    Window win = fUnixWindow.fWin;
 
-    bool needPaint = false;
+    XSelectInput(dsp, win, EVENT_MASK);
+
+    bool sentExposeEvent = false;
 
     for (;;) {
-        if (this->isDirty()) {
-            this->update(NULL);
-            needPaint = true;
+        SkEvent::ServiceQueueTimer();
+
+        bool moreToDo = SkEvent::ProcessEvent();
+
+        if (this->isDirty() && !sentExposeEvent) {
+            sentExposeEvent = true;
+
+            XEvent evt;
+            sk_bzero(&evt, sizeof(evt));
+            evt.type = Expose;
+            evt.xexpose.display = dsp;
+            XSendEvent(dsp, win, false, ExposureMask, &evt);
         }
-        if (needPaint) {
-            this->doPaint();
-            needPaint = false;
-        }
-        if (gTimerDelay) {
-            SkEvent::ServiceQueueTimer();
-        }
-        bool moreToDo = SkEvent::ProcessEvent() || needPaint || this->isDirty();
+
         if (XPending(dsp) || !moreToDo) {
             switch (this->nextXEvent()) {
                 case kContinue_NextXEventResult:
                     break;
                 case kPaintRequest_NextXEventResult:
-                    needPaint = true;
+                    sentExposeEvent = false;
+                    if (this->isDirty()) {
+                        this->update(NULL);
+                    }
+                    this->doPaint();
                     break;
                 case kQuitRequest_NextXEventResult:
                     return;
@@ -408,3 +420,4 @@
     // MyXNextEventWithDelay()
     gTimerDelay = delay;
 }
+