X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=ps%2Fps-document.c;h=928e38c0da43d42eb87471eff131542839089e4b;hb=85c4818353b7f7125cf7aa43abe0cf84aacc40d8;hp=fd6fc4a62d5785fcf250a806cda5b5e441f465d8;hpb=bebd9ceae1ec88ddee03bda8c7572c9cb06f6b77;p=evince.git diff --git a/ps/ps-document.c b/ps/ps-document.c index fd6fc4a6..928e38c0 100644 --- a/ps/ps-document.c +++ b/ps/ps-document.c @@ -150,6 +150,7 @@ The DONE message indicates that ghostscript has finished processing. #include #include "ps-document.h" +#include "ev-debug.h" #include "gsdefaults.h" #ifdef HAVE_LOCALE_H @@ -388,23 +389,26 @@ ps_document_cleanup(PSDocument * gs) } static void -ps_document_finalize(GObject * object) +ps_document_finalize (GObject * object) { - PSDocument *gs; + PSDocument *gs; - g_return_if_fail(object != NULL); - g_return_if_fail(GTK_IS_GS(object)); + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_GS (object)); - gs = PS_DOCUMENT(object); + LOG ("Finalize") - ps_document_cleanup(gs); + gs = PS_DOCUMENT (object); - if(gs->input_buffer) { - g_free(gs->input_buffer); - gs->input_buffer = NULL; - } + ps_document_cleanup (gs); + stop_interpreter (gs); + + if(gs->input_buffer) { + g_free(gs->input_buffer); + gs->input_buffer = NULL; + } - (*G_OBJECT_CLASS(parent_class)->finalize) (object); + (*G_OBJECT_CLASS(parent_class)->finalize) (object); } static void @@ -483,6 +487,8 @@ set_up_page(PSDocument * gs) GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; /* pixel, r, g, b */ GdkColormap *colormap; + LOG ("Setup the page") + #ifdef HAVE_LOCALE_H char *savelocale; #endif @@ -512,6 +518,7 @@ set_up_page(PSDocument * gs) gs->bpixmap = NULL; } + LOG ("Create our internal pixmap") gs->bpixmap = gdk_pixmap_new(gs->pstarget, gs->width, gs->height, -1); gdk_draw_rectangle(gs->bpixmap, fill, TRUE, @@ -711,6 +718,8 @@ start_interpreter(PSDocument * gs) int std_out[2]; /* pipe from interp stdout */ int std_err[2]; /* pipe from interp stderr */ + LOG ("Start the interpreter") + #define NUM_ARGS 100 #define NUM_GS_ARGS (NUM_ARGS - 20) #define NUM_ALPHA_ARGS 10 @@ -775,6 +784,12 @@ start_interpreter(PSDocument * gs) return -1; } + gv_env = g_strdup_printf("GHOSTVIEW=%ld %ld", + gdk_x11_drawable_get_xid(gs->pstarget), + gdk_x11_drawable_get_xid(gs->bpixmap)); + + LOG ("Launching ghostview with env %s", gv_env) + gs->busy = TRUE; gs->interpreter_pid = fork(); switch (gs->interpreter_pid) { @@ -810,9 +825,6 @@ start_interpreter(PSDocument * gs) } } - gv_env = g_strdup_printf("GHOSTVIEW=%ld %ld", - gdk_x11_drawable_get_xid(gs->pstarget), - gdk_x11_drawable_get_xid(gs->bpixmap)); putenv(gv_env); /* change to directory where the input file is. This helps @@ -862,6 +874,7 @@ stop_interpreter(PSDocument * gs) { if(gs->interpreter_pid > 0) { int status = 0; + LOG ("Stop the interpreter") kill(gs->interpreter_pid, SIGTERM); while((wait(&status) == -1) && (errno == EINTR)) ; gs->interpreter_pid = -1; @@ -1285,6 +1298,8 @@ document_load(PSDocument * gs, const gchar * fname) g_return_val_if_fail(gs != NULL, FALSE); g_return_val_if_fail(GTK_IS_GS(gs), FALSE); + LOG ("Load the document") + /* clean up previous document */ ps_document_cleanup(gs); @@ -1391,6 +1406,8 @@ ps_document_next_page(PSDocument * gs) { XEvent event; + LOG ("Make ghostscript render next page") + g_return_val_if_fail(gs != NULL, FALSE); g_return_val_if_fail(GTK_IS_GS(gs), FALSE); @@ -1418,37 +1435,14 @@ ps_document_next_page(PSDocument * gs) return TRUE; } -static gint -ps_document_get_current_page(PSDocument * gs) -{ - g_return_val_if_fail(gs != NULL, -1); - g_return_val_if_fail(GTK_IS_GS(gs), -1); - - return gs->current_page; -} - -static gint -ps_document_get_page_count(PSDocument * gs) -{ - if(!gs->gs_filename) - return 0; - - if(gs->doc) { - if(gs->structured_doc) - return gs->doc->numpages; - else - return G_MAXINT; - } - else - return 0; -} - static gboolean ps_document_goto_page(PSDocument * gs, gint page) { g_return_val_if_fail(gs != NULL, FALSE); g_return_val_if_fail(GTK_IS_GS(gs), FALSE); + LOG ("Go to page %d", page) + if(!gs->gs_filename) { return FALSE; } @@ -1458,6 +1452,9 @@ ps_document_goto_page(PSDocument * gs, gint page) page = 0; if(gs->structured_doc && gs->doc) { + + LOG ("It's a structured document, let's send one page to gs") + if(page >= gs->doc->numpages) page = gs->doc->numpages - 1; @@ -1498,6 +1495,9 @@ ps_document_goto_page(PSDocument * gs, gint page) the last page of the file was displayed. In that case, ggv restarts GS again and the first page is displayed. */ + + LOG ("It's an unstructured document, gs will just read the file") + if(page == gs->current_page && !gs->changed) return TRUE; @@ -1530,6 +1530,8 @@ ps_document_set_page_size(PSDocument * gs, gint new_pagesize, gint pageid) gint new_ury = 0; GtkGSPaperSize *papersizes = gtk_gs_defaults_get_paper_sizes(); + LOG ("Set the page size") + g_return_val_if_fail(gs != NULL, FALSE); g_return_val_if_fail(GTK_IS_GS(gs), FALSE); @@ -1709,7 +1711,15 @@ ps_document_save (EvDocument *document, static int ps_document_get_n_pages (EvDocument *document) { - return ps_document_get_page_count (PS_DOCUMENT (document)); + PSDocument *ps = PS_DOCUMENT (document); + + g_return_val_if_fail (ps != NULL, -1); + + if (!ps->gs_filename || !ps->doc) { + return -1; + } + + return ps->structured_doc ? ps->doc->numpages : 1; } static void @@ -1722,7 +1732,11 @@ ps_document_set_page (EvDocument *document, static int ps_document_get_page (EvDocument *document) { - return ps_document_get_current_page (PS_DOCUMENT (document)); + PSDocument *ps = PS_DOCUMENT (document); + + g_return_val_if_fail (ps != NULL, -1); + + return ps->current_page; } static gboolean @@ -1733,7 +1747,10 @@ ps_document_widget_event (GtkWidget *widget, GdkEvent *event, gpointer data) if(event->type != GDK_CLIENT_EVENT) return FALSE; + gs->message_window = event->client.data.l[0]; + if (event->client.message_type == gs_class->page_atom) { + LOG ("GS rendered the document") gs->busy = FALSE; ev_document_changed (EV_DOCUMENT (gs)); } @@ -1836,6 +1853,10 @@ ps_document_render (EvDocument *document, draw.x, draw.y, draw.width, draw.height); + LOG ("Copy the internal pixmap: %d %d %d %d %d %d", + draw.x - page.x, draw.y - page.y, + draw.x, draw.y, draw.width, draw.height) + g_object_unref (gc); }