diff options
author | Robin Watts <robin.watts@artifex.com> | 2015-04-03 19:51:24 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2015-04-06 19:32:00 +0100 |
commit | 928939c346e12ecce75d8de573b13c411f1bebd5 (patch) | |
tree | 79962a4adf3b96cc203e88c145bd39dec23a1b7e /platform/x11 | |
parent | 4c9611cb3d9f18322f8e77f8ba493799d77c0a0a (diff) | |
download | mupdf-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.c | 6 | ||||
-rw-r--r-- | platform/x11/pdfapp.c | 94 | ||||
-rw-r--r-- | platform/x11/pdfapp.h | 2 | ||||
-rw-r--r-- | platform/x11/win_main.c | 9 | ||||
-rw-r--r-- | platform/x11/x11_main.c | 8 |
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; } } |