diff -pruN paps-0.6.8.orig/configure.in paps-0.6.8/configure.in --- paps-0.6.8.orig/configure.in 2007-01-19 20:06:10.000000000 +0900 +++ paps-0.6.8/configure.in 2008-11-07 08:21:19.000000000 +0900 @@ -7,6 +7,19 @@ AC_LANG_C AC_PROG_CC AM_PROG_LIBTOOL +dnl ====================================================== +dnl check for CUPS +dnl ====================================================== +AC_PATH_PROG(CUPS_CONFIG, cups-config, no) +if test "$CUPS_CONFIG" = "no"; then + AC_MSG_ERROR([Please install cups development packages/files]) +fi +CUPS_CFLAGS=`$CUPS_CONFIG --cflags | sed -e 's/-O[0-9]*//' -e 's/-m[^\t]*//g'` +CUPS_LIBS=`$CUPS_CONFIG --libs` + +AC_SUBST(CUPS_CFLAGS) +AC_SUBST(CUPS_LIBS) + DX_HTML_FEATURE(ON) DX_CHM_FEATURE(OFF) DX_CHI_FEATURE(OFF) diff -pruN paps-0.6.8.orig/src/Makefile.am paps-0.6.8/src/Makefile.am --- paps-0.6.8.orig/src/Makefile.am 2008-11-07 08:21:05.000000000 +0900 +++ paps-0.6.8/src/Makefile.am 2008-11-07 08:21:19.000000000 +0900 @@ -5,10 +5,10 @@ libpapsinc_HEADERS = libpaps.h libpapsincdir = $(includedir) bin_PROGRAMS = paps -paps_CFLAGS = -Wall +paps_CFLAGS = -Wall $(CUPS_CFLAGS) paps_SOURCES = paps.c paps_LDADD = $(lib_LTLIBRARIES) $(all_libraries) -paps_LDFLAGS = `pkg-config --libs pangoft2` +paps_LDFLAGS = `pkg-config --libs pangoft2` $(CUPS_LIBS) paps_DEPENDENCIES = $(lib_LTLIBRARIES) EXTRA_DIST = test_libpaps.c paps.1 diff -pruN paps-0.6.8.orig/src/paps.c paps-0.6.8/src/paps.c --- paps-0.6.8.orig/src/paps.c 2008-11-07 08:21:05.000000000 +0900 +++ paps-0.6.8/src/paps.c 2008-11-07 08:26:28.000000000 +0900 @@ -31,6 +31,8 @@ #include #include #include +#include +#include #define BUFSIZE 1024 #define DEFAULT_FONT_FAMILY "Monospace" @@ -86,9 +88,11 @@ typedef struct { gboolean do_wordwrap; gboolean do_use_markup; gboolean do_stretch_chars; + gboolean cups_mode; PangoDirection pango_dir; gchar *filename; gchar *header_font_desc; + gchar *owner; gint lpi; gint cpi; } page_layout_t; @@ -320,8 +324,8 @@ int main(int argc, char *argv[]) int num_pages = 1; int gutter_width = 40; int total_gutter_width; - int page_width = paper_sizes[0].width; - int page_height = paper_sizes[0].height; + int page_width = -1; + int page_height = -1; int do_tumble = -1; /* -1 means not initialized */ int do_duplex = -1; gchar *paps_header = NULL; @@ -331,6 +335,8 @@ int main(int argc, char *argv[]) int max_width = 0, w; GIConv cvh = NULL; GOptionGroup *options; + gboolean cups_mode = FALSE; + gchar *page_owner = NULL; /* Set locale from environment. */ setlocale(LC_ALL, ""); @@ -348,6 +354,130 @@ int main(int argc, char *argv[]) g_option_context_add_main_entries(ctxt, entries, NULL); #endif + /* check if the process is being invoked as CUPS filter */ + G_STMT_START { + gchar *prgname = g_path_get_basename(argv[0]); + cups_option_t *options = NULL; + ppd_file_t *ppd; + ppd_size_t *pagesize; + int num_options; + const char *val; + + if (strncmp(prgname, "texttopaps", 10) == 0 || + getenv("CUPS_SERVER") != NULL) { + g_set_prgname(prgname); + /* argument format should be job-id user title copies options [file] */ + cups_mode = TRUE; + /* set default values */ + page_layout.lpi = 6.0L; + page_layout.cpi = 10.0L; + left_margin = 18; + right_margin = 18; + top_margin = 36; + bottom_margin = 36; + page_width = 612; + page_height = 792; + font = g_strdup(MAKE_FONT_NAME ("Courier", DEFAULT_FONT_SIZE)); + header_font_desc = g_strdup(MAKE_FONT_NAME ("Courier", HEADER_FONT_SCALE)); + + if (argc < 6 || argc > 7) { + fprintf(stderr, "ERROR: %s job-id user title copies options [file]\n", prgname); + exit(1); + } + if (argc == 6) { + filename_in = "stdin"; + IN = stdin; + } else { + filename_in = argv[6]; + if ((IN = fopen(filename_in, "rb")) == NULL) { + fprintf(stderr, "ERROR: unable to open print file -\n"); + exit(1); + } + } + title = argv[3]; + page_owner = argv[2]; + num_options = cupsParseOptions(argv[5], 0, &options); + + if ((val = cupsGetOption("prettyprint", num_options, options)) != NULL && + g_ascii_strcasecmp(val, "no") && + g_ascii_strcasecmp(val, "off") && + g_ascii_strcasecmp(val, "false")) { + /* XXX: need to support the keywords highlighting */ + } + ppd = ppdOpenFile(getenv("PPD")); + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + if ((pagesize = ppdPageSize(ppd, NULL)) != NULL) { + page_width = pagesize->width; + page_height = pagesize->length; + top_margin = pagesize->length - pagesize->top; + bottom_margin = pagesize->bottom; + left_margin = pagesize->left; + right_margin = pagesize->width - pagesize->right; + } + + if ((val = cupsGetOption("landscape", num_options, options)) != NULL) { + if (g_ascii_strcasecmp(val, "no") && + g_ascii_strcasecmp(val, "off") && + g_ascii_strcasecmp(val, "false")) + do_landscape = TRUE; + } + /* XXX: need to support orientation-requested? */ + if ((val = cupsGetOption("page-left", num_options, options)) != NULL) { + left_margin = (int)atof(val); + } + if ((val = cupsGetOption("page-right", num_options, options)) != NULL) { + right_margin = (int)atof(val); + } + if ((val = cupsGetOption("page-bottom", num_options, options)) != NULL) { + bottom_margin = (int)atof(val); + } + if ((val = cupsGetOption("page-top", num_options, options)) != NULL) { + top_margin = (int)atof(val); + } + if (ppdIsMarked(ppd, "Duplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "Duplex", "DuplexTumble") || + ppdIsMarked(ppd, "JCLDuplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "JCLDuplex", "DuplexTumble") || + ppdIsMarked(ppd, "EFDuplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "EFDuplex", "DuplexTumble") || + ppdIsMarked(ppd, "KD03Duplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "KD03Duplex", "DuplexTumble")) { + do_duplex = TRUE; + } + if ((val = cupsGetOption("wrap", num_options, options)) != NULL) { + do_wordwrap = !g_ascii_strcasecmp(val, "true") || + !g_ascii_strcasecmp(val, "on") || + !g_ascii_strcasecmp(val, "yes"); + } + if ((val = cupsGetOption("columns", num_options, options)) != NULL) { + num_columns = atoi(val); + } + if ((val = cupsGetOption("cpi", num_options, options)) != NULL) { + page_layout.cpi = atof(val); + } + if ((val = cupsGetOption("lpi", num_options, options)) != NULL) { + page_layout.lpi = atof(val); + } + if (getenv("CHARSET") != NULL) { + char *charset = getenv("CHARSET"); + /* Map CUPS charset names to real ones. + * http://cups.org/newsgroups.php?s9797+gcups.general+v9797+T1 + */ + if (!g_ascii_strcasecmp(charset, "windows-932")) { + charset = "WINDOWS-31J"; + } + if (g_ascii_strcasecmp(charset, "utf-8") && + g_ascii_strcasecmp(charset, "utf8")) { + encoding = g_strdup(charset); + } + } + } + } G_STMT_END; + + if (!cups_mode) { + /* Parse command line */ if (!g_option_context_parse(ctxt, &argc, &argv, &error)) { @@ -374,6 +504,8 @@ int main(int argc, char *argv[]) IN = stdin; } title = filename_in; + + } /* if (!cups_mode) */ paps = paps_new(); pango_context = paps_get_pango_context (paps); @@ -392,8 +524,10 @@ int main(int argc, char *argv[]) pango_context_set_font_description (pango_context, font_description); /* Page layout */ - page_width = paper_sizes[(int)paper_type].width; - page_height = paper_sizes[(int)paper_type].height; + if (page_width < 0) + page_width = paper_sizes[(int)paper_type].width; + if (page_height < 0) + page_height = paper_sizes[(int)paper_type].height; if (num_columns == 1) total_gutter_width = 0; @@ -456,6 +590,8 @@ int main(int argc, char *argv[]) page_layout.pango_dir = pango_dir; page_layout.filename = filename_in; page_layout.header_font_desc = header_font_desc; + page_layout.owner = page_owner; + page_layout.cups_mode = cups_mode; /* calculate x-coordinate scale */ if (page_layout.cpi > 0.0L) @@ -756,6 +892,12 @@ split_text_into_paragraphs (PangoContext if (wc == (gunichar)-1) { fprintf (stderr, "%s: Invalid character in input\n", g_get_prgname ()); + if (page_layout->cups_mode) + { + /* try to continue parsing texts */ + p = next; + continue; + } wc = 0; } if (!*p || !wc || wc == '\n' || wc == '\f') @@ -925,21 +1067,32 @@ void print_postscript_header(FILE *OUT, int orientation = page_layout->page_width > page_layout->page_height; int bb_page_width = page_layout->page_width; int bb_page_height = page_layout->page_height; + char *owner = NULL; /* Keep bounding box non-rotated to make ggv happy */ - if (orientation) + /* ensure the correct bounding box for CUPS */ + if (orientation && !page_layout->cups_mode) { int tmp = bb_page_width; bb_page_width = bb_page_height; bb_page_height = tmp; } + if (page_layout->owner) + { + owner = g_strdup_printf("%%%%For: %s\n", page_layout->owner); + } + else + { + owner = g_strdup(""); + } fprintf(OUT, "%%!PS-Adobe-3.0\n" + "%s" "%%%%Title: %s\n" "%%%%Creator: paps version 0.6.7 by Dov Grobgeld\n" "%%%%Pages: (atend)\n" - "%%%%BoundingBox: 0 0 %d %d\n" + "%%%%BoundingBox: 0 0 %d %d\n%s" "%%%%BeginProlog\n" "%%%%Orientation: %s\n" "/papsdict 1 dict def\n" @@ -961,7 +1114,7 @@ void print_postscript_header(FILE *OUT, " pagewidth\n" " /pagewidth pageheight def\n" " /pageheight exch def\n" - " /orientation 3 def\n" + " /orientation %d def\n" " } if\n" " 2 dict\n" " dup /PageSize [pagewidth pageheight] put\n" @@ -986,11 +1139,21 @@ void print_postscript_header(FILE *OUT, " 90 rotate\n" " 0 pageheight neg translate\n" "} def\n", + /* + * Put %%cupsRotation tag to prevent the rotation in pstops. + * This breaks paps's behavior to make it in landscape say. + * (RH#222137) + */ + (page_layout->cups_mode ? "%cupsRotation: 0\n" : ""), title, bb_page_width, bb_page_height, - orientation_names[orientation] + owner, + orientation_names[orientation], + /* For landscape, rotate page to portrait orientation for CUPS (RH#222137) */ + page_layout->cups_mode ? 2 : 3 ); + g_free(owner); fprintf(OUT, "%% User settings\n"