summaryrefslogtreecommitdiff
path: root/platform/x11
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2015-04-03 19:51:24 +0100
committerRobin Watts <robin.watts@artifex.com>2015-04-06 19:32:00 +0100
commit928939c346e12ecce75d8de573b13c411f1bebd5 (patch)
tree79962a4adf3b96cc203e88c145bd39dec23a1b7e /platform/x11
parent4c9611cb3d9f18322f8e77f8ba493799d77c0a0a (diff)
downloadmupdf-928939c346e12ecce75d8de573b13c411f1bebd5.tar.xz
Bug 693688: MuPDF viewer; if reload fails, don't crash out.
Use a placeholder document instead - just a big red 'X'. Supposedly lots of people use MuPDF to view the output of their TeX documents. Sometimes the compilation of the TeX document fails, and reload results in MuPDF closing. This should allow their window to stay open until they fix the problem and reload again.
Diffstat (limited to 'platform/x11')
-rw-r--r--platform/x11/jstest_main.c6
-rw-r--r--platform/x11/pdfapp.c94
-rw-r--r--platform/x11/pdfapp.h2
-rw-r--r--platform/x11/win_main.c9
-rw-r--r--platform/x11/x11_main.c8
5 files changed, 95 insertions, 24 deletions
diff --git a/platform/x11/jstest_main.c b/platform/x11/jstest_main.c
index 98fec194..e83cbfe3 100644
--- a/platform/x11/jstest_main.c
+++ b/platform/x11/jstest_main.c
@@ -152,12 +152,6 @@ void windocopy(pdfapp_t *app)
{
}
-void winreloadfile(pdfapp_t *app)
-{
- pdfapp_close(app);
- pdfapp_open(app, filename, 1);
-}
-
void winreloadpage(pdfapp_t *app)
{
}
diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c
index 3eda4c6f..651b3844 100644
--- a/platform/x11/pdfapp.c
+++ b/platform/x11/pdfapp.c
@@ -133,6 +133,17 @@ void pdfapp_invert(pdfapp_t *app, const fz_rect *rect)
fz_invert_pixmap_rect(app->ctx, app->image, fz_round_rect(&b, rect));
}
+void pdfapp_reloadfile(pdfapp_t *app)
+{
+ fz_context *ctx = app->ctx;
+ char *filename = app->docpath;
+
+ app->docpath = NULL;
+ pdfapp_close(app);
+ pdfapp_open(app, filename, 1);
+ fz_free(ctx, filename);
+}
+
static void event_cb(fz_context *ctx, pdf_document *doc, pdf_doc_event *event, void *data)
{
pdfapp_t *app = (pdfapp_t *)data;
@@ -208,6 +219,75 @@ pdfapp_more_data(void *app_, int complete)
}
#endif
+static int make_fake_doc(pdfapp_t *app)
+{
+ fz_context *ctx = app->ctx;
+ fz_matrix ctm = { 1, 0, 0, 1, 0, 0 };
+ fz_rect bounds;
+ pdf_page *newpage = NULL;
+ pdf_document *pdf = NULL;
+ fz_device *dev = NULL;
+ fz_path *path = NULL;
+ fz_stroke_state stroke = fz_default_stroke_state;
+ float red[3] = { 1, 0, 0 };
+ int i;
+
+ fz_var(pdf);
+ fz_var(dev);
+ fz_var(newpage);
+
+ fz_try(ctx)
+ {
+ pdf = pdf_create_document(ctx);
+ app->doc = &pdf->super;
+ bounds.x0 = 0;
+ bounds.y0 = 0;
+ bounds.x1 = app->winw;
+ bounds.y1 = app->winh;
+
+ newpage = pdf_create_page(ctx, pdf, bounds, 72, 0);
+
+ dev = pdf_page_write(ctx, pdf, newpage);
+
+ /* Now the page content */
+ fz_begin_page(ctx, dev, &bounds, &ctm);
+
+ path = fz_new_path(ctx);
+ fz_moveto(ctx, path, 0, 0);
+ fz_lineto(ctx, path, bounds.x1, bounds.y1);
+ fz_moveto(ctx, path, 0, bounds.y1);
+ fz_lineto(ctx, path, bounds.x1, 0);
+
+ stroke.linewidth = fz_min(bounds.x1, bounds.y1)/4;
+
+ fz_stroke_path(ctx, dev, path, &stroke, &ctm, fz_device_rgb(ctx), red, 1);
+
+ fz_end_page(ctx, dev);
+
+ fz_drop_device(ctx, dev);
+ dev = NULL;
+
+ /* Create enough copies of our blank(ish) page so that the
+ * page number is preserved if and when a subsequent load
+ * works. */
+ for (i = 0; i < app->pagecount; i++)
+ pdf_insert_page(ctx, pdf, newpage, INT_MAX);
+ }
+ fz_always(ctx)
+ {
+ fz_drop_path(ctx, path);
+ pdf_drop_page(ctx, newpage);
+ fz_drop_device(ctx, dev);
+ dev = NULL;
+ }
+ fz_catch(ctx)
+ {
+ fz_rethrow(ctx);
+ }
+
+ return 0;
+}
+
void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
{
fz_context *ctx = app->ctx;
@@ -215,8 +295,6 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
fz_try(ctx)
{
- pdf_document *idoc;
-
fz_register_document_handlers(ctx);
#ifdef HAVE_CURL
@@ -270,6 +348,16 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
break;
}
}
+ }
+ fz_catch(ctx)
+ {
+ if (!reload || make_fake_doc(app))
+ pdfapp_error(app, "cannot open document");
+ }
+
+ fz_try(ctx)
+ {
+ pdf_document *idoc;
idoc = pdf_specifics(app->ctx, app->doc);
@@ -1332,7 +1420,7 @@ void pdfapp_onkey(pdfapp_t *app, int c, int modifiers)
case 'r':
panto = DONT_PAN;
oldpage = -1;
- winreloadfile(app);
+ pdfapp_reloadfile(app);
break;
/*
diff --git a/platform/x11/pdfapp.h b/platform/x11/pdfapp.h
index 3c298b67..5d748ad6 100644
--- a/platform/x11/pdfapp.h
+++ b/platform/x11/pdfapp.h
@@ -32,7 +32,6 @@ extern int winchoiceinput(pdfapp_t*, int nopts, char *opts[], int *nvals, char *
extern void winopenuri(pdfapp_t*, char *s);
extern void wincursor(pdfapp_t*, int curs);
extern void windocopy(pdfapp_t*);
-extern void winreloadfile(pdfapp_t*);
extern void windrawstring(pdfapp_t*, int x, int y, char *s);
extern void winclose(pdfapp_t*);
extern void winhelp(pdfapp_t*);
@@ -141,6 +140,7 @@ void pdfapp_open(pdfapp_t *app, char *filename, int reload);
void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps);
void pdfapp_close(pdfapp_t *app);
int pdfapp_preclose(pdfapp_t *app);
+void pdfapp_reloadfile(pdfapp_t *app);
char *pdfapp_version(pdfapp_t *app);
char *pdfapp_usage(pdfapp_t *app);
diff --git a/platform/x11/win_main.c b/platform/x11/win_main.c
index 32121f5f..444e8d67 100644
--- a/platform/x11/win_main.c
+++ b/platform/x11/win_main.c
@@ -650,8 +650,10 @@ void winopen()
static void
do_close(pdfapp_t *app)
{
+ fz_context *ctx = app->ctx;
pdfapp_close(app);
free(dibinf);
+ fz_drop_context(ctx);
}
void winclose(pdfapp_t *app)
@@ -881,12 +883,6 @@ void windocopy(pdfapp_t *app)
justcopied = 1; /* keep inversion around for a while... */
}
-void winreloadfile(pdfapp_t *app)
-{
- pdfapp_close(app);
- pdfapp_open(app, filename, 1);
-}
-
void winreloadpage(pdfapp_t *app)
{
SendMessage(hwndview, WM_APP, 0, 0);
@@ -1229,7 +1225,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow
}
do_close(&gapp);
- fz_drop_context(ctx);
return 0;
}
diff --git a/platform/x11/x11_main.c b/platform/x11/x11_main.c
index 085c58d8..0da79469 100644
--- a/platform/x11/x11_main.c
+++ b/platform/x11/x11_main.c
@@ -713,12 +713,6 @@ void winreloadpage(pdfapp_t *app)
XCloseDisplay(dpy);
}
-void winreloadfile(pdfapp_t *app)
-{
- pdfapp_close(app);
- pdfapp_open(app, filename, 1);
-}
-
void winopenuri(pdfapp_t *app, char *buf)
{
char *browser = getenv("BROWSER");
@@ -1078,7 +1072,7 @@ int main(int argc, char **argv)
{
if (reloading)
{
- winreloadfile(&gapp);
+ pdfapp_reloadfile(&gapp);
reloading = 0;
}
}