1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
From a20d6a58ebc6c60ff44f0f385cf399ee6fca55bf Mon Sep 17 00:00:00 2001
From: Robin Watts <Robin.Watts@artifex.com>
Date: Fri, 26 Apr 2013 12:21:17 +0100
Subject: [PATCH] Fix dirty flag handling bug in X11 event loop.
When I added transition handling to mupdf, I broke the X11
behaviour of coalescing all events and only blitting when
idle.
This commit restores that behaviour, except when transitions
are actually in progress (when it still blits instantly).
---
apps/pdfapp.c | 6 +++++-
apps/x11_main.c | 8 ++++++--
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/apps/pdfapp.c b/apps/pdfapp.c
index c3b7d54..ff23c4b 100644
--- a/apps/pdfapp.c
+++ b/apps/pdfapp.c
@@ -1677,7 +1677,6 @@ void pdfapp_postblit(pdfapp_t *app)
if (llama >= 256)
{
/* Completed. */
- app->in_transit = 0;
fz_drop_pixmap(app->ctx, app->image);
app->image = app->new_image;
app->new_image = NULL;
@@ -1689,4 +1688,9 @@ void pdfapp_postblit(pdfapp_t *app)
else
fz_generate_transition(app->image, app->old_image, app->new_image, llama, &app->transition);
winrepaint(app);
+ if (llama >= 256)
+ {
+ /* Completed. */
+ app->in_transit = 0;
+ }
}
diff --git a/apps/x11_main.c b/apps/x11_main.c
index 364013c..987e359 100644
--- a/apps/x11_main.c
+++ b/apps/x11_main.c
@@ -79,6 +79,7 @@ static int mapped = 0;
static Cursor xcarrow, xchand, xcwait, xccaret;
static int justcopied = 0;
static int dirty = 0;
+static int transition_dirty = 0;
static int dirtysearch = 0;
static char *password = "";
static XColor xbgcolor;
@@ -504,6 +505,8 @@ static void winblit(pdfapp_t *app)
void winrepaint(pdfapp_t *app)
{
dirty = 1;
+ if (app->in_transit)
+ transition_dirty = 1;
}
void winrepaintsearch(pdfapp_t *app)
@@ -779,7 +782,7 @@ int main(int argc, char **argv)
while (!closing)
{
- while (!closing && XPending(xdpy) && !dirty)
+ while (!closing && XPending(xdpy) && !transition_dirty)
{
XNextEvent(xdpy, &xevt);
@@ -886,6 +889,7 @@ int main(int argc, char **argv)
else if (dirtysearch)
winblitsearch(&gapp);
dirty = 0;
+ transition_dirty = 0;
dirtysearch = 0;
pdfapp_postblit(&gapp);
}
@@ -899,7 +903,7 @@ int main(int argc, char **argv)
timeradd(&now, &tmo, &tmo_at);
}
- if (XPending(xdpy) || dirty)
+ if (XPending(xdpy) || transition_dirty)
continue;
timeout = NULL;
--
1.8.3
|