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;
}
+