--- paps-0.6.6/src/Makefile.am.cups 2006-08-17 12:12:43.000000000 +0100 +++ paps-0.6.6/src/Makefile.am 2006-08-17 12:12:43.000000000 +0100 @@ -5,10 +5,10 @@ libpaps_a_incdir = $(includedir) bin_PROGRAMS = paps -paps_CFLAGS = -Wall +paps_CFLAGS = -Wall $(CUPS_CFLAGS) paps_SOURCES = paps.c paps_LDADD = $(noinst_LIBRARIES) $(all_libraries) -paps_LDFLAGS = `pkg-config --libs pangoft2` +paps_LDFLAGS = `pkg-config --libs pangoft2` $(CUPS_LIBS) paps_DEPENDENCIES = $(noinst_LIBRARIES) EXTRA_DIST = test_libpaps.c paps.1 --- paps-0.6.6/src/paps.c.cups 2006-08-17 12:12:43.000000000 +0100 +++ paps-0.6.6/src/paps.c 2006-08-17 12:35:56.000000000 +0100 @@ -31,6 +31,7 @@ #include #include #include +#include #define BUFSIZE 1024 #define DEFAULT_FONT_FAMILY "Monospace" @@ -87,6 +88,7 @@ PangoDirection pango_dir; gchar *filename; gchar *header_font_desc; + gchar *owner; } page_layout_t; typedef struct { @@ -313,8 +315,8 @@ 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; @@ -323,12 +325,121 @@ int header_sep = 20; int max_width = 0, w; GIConv cvh = NULL; + gboolean cups_mode = FALSE; + gchar *page_owner = NULL; /* Prerequisite when using glib. */ g_type_init(); g_option_context_add_main_entries(ctxt, entries, NULL); + /* 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) { + /* argument format should be job-id user title copies options [file] */ + cups_mode = TRUE; + 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(argv[6], "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") != 0 && + g_ascii_strcasecmp(val, "off") != 0 && + g_ascii_strcasecmp(val, "false") != 0) { + /* XXX: need to support other orientations? */ + 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) { + cpi = atof(val); + } + if ((val = cupsGetOption("lpi", num_options, options)) != NULL) { + 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"; + encoding = g_strdup(charset); + } + } + } G_STMT_END; + + if (!cups_mode) { + /* Parse command line */ if (!g_option_context_parse(ctxt, &argc, &argv, &error)) { @@ -355,6 +466,8 @@ IN = stdin; } title = filename_in; + + } /* if (!cups_mode) */ paps = paps_new(); pango_context = paps_get_pango_context (paps); @@ -373,8 +486,10 @@ 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; @@ -435,6 +550,7 @@ page_layout.pango_dir = pango_dir; page_layout.filename = filename_in; page_layout.header_font_desc = header_font_desc; + page_layout.owner = page_owner; /* calculate x-coordinate scale */ if (cpi > 0.0L) @@ -781,6 +897,7 @@ 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) @@ -790,12 +907,20 @@ 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" "%%%%Title: %s\n" "%%%%Creator: paps version 0.6.3 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" @@ -845,8 +970,10 @@ title, bb_page_width, bb_page_height, + owner, orientation_names[orientation] ); + g_free(owner); fprintf(OUT, "%% User settings\n" --- paps-0.6.6/configure.in.cups 2006-04-27 20:41:36.000000000 +0100 +++ paps-0.6.6/configure.in 2006-08-17 12:12:43.000000000 +0100 @@ -7,4 +7,17 @@ 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]) +fi +CUPS_CFLAGS=`$CUPS_CONFIG --cflags | sed 's/-O[0-9]*//' | sed 's/-m[^\t]*//g'` +CUPS_LIBS=`$CUPS_CONFIG --libs` + +AC_SUBST(CUPS_CFLAGS) +AC_SUBST(CUPS_LIBS) + AC_OUTPUT(Makefile src/Makefile doc/Makefile)