summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}
}