-/*
- * Check if gs->gs_filename or gs->gs_filename_unc is a pdf file and scan
- * pdf file if necessary.
- * Set gs->filename_dsc to the name of the dsc file or NULL.
- * Error reporting via signal 'interpreter_message'.
- */
-static gchar *
-check_pdf(PSDocument * gs)
-{
- FILE *file;
- gchar buf[1024], *filename;
- int fd;
-
- /* use uncompressed file as input if necessary */
- filename = (gs->gs_filename_unc ? gs->gs_filename_unc : gs->gs_filename);
-
- if((file = fopen(filename, "r"))
- && (fread(buf, sizeof(char), 5, file) == 5)
- && (strncmp(buf, "%PDF-", 5) == 0)) {
- /* we found a PDF file */
- gchar *fname, *filename_dsc, *filename_err, *cmd, *cmdline;
- filename_dsc = g_strconcat(g_get_tmp_dir(), "/ggvXXXXXX", NULL);
- if((fd = mkstemp(filename_dsc)) < 0) {
- return NULL;
- }
- close(fd);
- filename_err = g_strconcat(g_get_tmp_dir(), "/ggvXXXXXX", NULL);
- if((fd = mkstemp(filename_err)) < 0) {
- g_free(filename_dsc);
- return NULL;
- }
- close(fd);
- fname = g_shell_quote(filename);
- cmd = g_strdup_printf(gtk_gs_defaults_get_dsc_cmd(), filename_dsc, fname);
- g_free(fname);
- /* this command (sometimes?) prints error messages to stdout! */
- cmdline = g_strdup_printf("%s >%s 2>&1", cmd, filename_err);
- g_free(cmd);
-
- if((system(cmdline) == 0) && file_readable(filename_dsc)) {
-
- /* success */
- filename = gs->gs_filename_dsc = filename_dsc;
-
- if(file_length(filename_err) > 0) {
- gchar *err_msg = " ";
- GtkWidget *dialog;
- FILE *err;
- GdkColor color;
-
- if((err = fopen(filename_err, "r"))) {
-
- /* print the content of the file to a message box */
- while(fgets(buf, 1024, err))
- err_msg = g_strconcat(err_msg, buf, NULL);
-
- /* FIXME The dialog is not yet set to modal, difficult to
- * get the parent of the dialog box here
- */
-
- dialog = gtk_message_dialog_new(NULL,
- GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_OK,
- ("There was an error while scaning the file: %s \n%s"),
- gs->gs_filename, err_msg);
-
- gdk_color_parse("white", &color);
- gtk_widget_modify_bg(GTK_WIDGET(dialog), GTK_STATE_NORMAL, &color);
-
- g_signal_connect(G_OBJECT(dialog), "response",
- G_CALLBACK(gtk_widget_destroy), NULL);
-
- gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
- gtk_widget_show(dialog);
- g_free(err_msg);
- }
- }
-
- }
- else {
- /* report error */
- g_snprintf(buf, 1024,
- _("Error while converting pdf file %s:\n"), filename);
- ps_document_emit_error_msg(gs, buf);
-
- if(file_length(filename_err) > 0) {
- FILE *err;
- if((err = fopen(filename_err, "r"))) {
- /* print file to message window */
- while(fgets(buf, 1024, err))
- ps_document_emit_error_msg(gs, buf);
- }
- }
- unlink(filename_dsc);
- g_free(filename_dsc);
- filename = NULL;
- }
- unlink(filename_err);
- g_free(filename_err);
- g_free(cmdline);
- }
- if(NULL != file)
- fclose(file);
- return filename;
-}
-
-#ifdef BROKEN_XINERAMA_PATCH_THAT_SHOULD_NOT_BE_USED
-/* never mind this patch: a properly working X server should take care of
- calculating the proper values. */
-static float
-compute_xdpi(void)
-{
-# ifndef HAVE_XINERAMA
- return 25.4 * gdk_screen_width() / gdk_screen_width_mm();
-# else
- Display *dpy;
- dpy = (Display *) GDK_DISPLAY();
- if(XineramaIsActive(dpy)) {
- int num_heads;
- XineramaScreenInfo *head_info;
- head_info = (XineramaScreenInfo *) XineramaQueryScreens(dpy, &num_heads);
- /* fake it with dimensions of the first head for now */
- return 25.4 * head_info[0].width / gdk_screen_width_mm();
- }
- else {
- return 25.4 * gdk_screen_width() / gdk_screen_width_mm();
- }
-# endif
- /* HAVE_XINERAMA */
-}
-
-static float
-compute_ydpi(void)
-{
-# ifndef HAVE_XINERAMA
- return 25.4 * gdk_screen_height() / gdk_screen_height_mm();
-# else
- Display *dpy;
- dpy = (Display *) GDK_DISPLAY();
- if(XineramaIsActive(dpy)) {
- int num_heads;
- XineramaScreenInfo *head_info;
- head_info = (XineramaScreenInfo *) XineramaQueryScreens(dpy, &num_heads);
- /* fake it with dimensions of the first head for now */
- return 25.4 * head_info[0].height / gdk_screen_height_mm();
- }
- else {
- return 25.4 * gdk_screen_height() / gdk_screen_height_mm();
- }
-# endif
- /* HAVE_XINERAMA */
-}
-#else
-static float
-compute_xdpi(void)
-{
- return 25.4 * gdk_screen_width() / gdk_screen_width_mm();
-}
-
-static float
-compute_ydpi(void)
-{
- return 25.4 * gdk_screen_height() / gdk_screen_height_mm();
-}
-#endif /* BROKEN_XINERAMA_PATCH_THAT_SHOULD_NOT_BE_USED */
-
-/* Compute new size of window, sets xdpi and ydpi if necessary.
- * returns True if new window size is different */
-static gboolean
-compute_size(PSDocument * gs)
-{
- guint new_width = 1;
- guint new_height = 1;
- gboolean change = FALSE;
- gint orientation;
-
- /* width and height can be changed, calculate window size according */
- /* to xpdi and ydpi */
- orientation = ps_document_get_orientation(gs);
-
- switch (orientation) {
- case GTK_GS_ORIENTATION_PORTRAIT:
- case GTK_GS_ORIENTATION_UPSIDEDOWN:
- new_width = (gs->urx - gs->llx) / 72.0 * gs->xdpi + 0.5;
- new_height = (gs->ury - gs->lly) / 72.0 * gs->ydpi + 0.5;
- break;
- case GTK_GS_ORIENTATION_LANDSCAPE:
- case GTK_GS_ORIENTATION_SEASCAPE:
- new_width = (gs->ury - gs->lly) / 72.0 * gs->xdpi + 0.5;
- new_height = (gs->urx - gs->llx) / 72.0 * gs->ydpi + 0.5;
- break;
- }
-
- change = (new_width != gs->width * gs->zoom_factor)
- || (new_height != gs->height * gs->zoom_factor);
- gs->width = (gint) (new_width * gs->zoom_factor);
- gs->height = (gint) (new_height * gs->zoom_factor);
-
- return (change);
-}
-