paps/paps-cups.patch

295 lines
10 KiB
Diff

diff -pruN -x Makefile -x Makefile.in -x '*.m4' -x autom4te.cache -x 'config.*' -x configure -x doc -x libtool -x .deps -x .libs -x '*.ps' -x foo -x paps -x 'lib*' -x texttopaps -x '*o' -x '*.cups' -x 'test*' -x 'stamp*' paps-0.6.6.orig/configure.in paps-0.6.6/configure.in
--- paps-0.6.6.orig/configure.in 2006-04-28 04:41:36.000000000 +0900
+++ paps-0.6.6/configure.in 2007-02-15 23:34:24.000000000 +0900
@@ -7,4 +7,17 @@ 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])
+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)
diff -pruN -x Makefile -x Makefile.in -x '*.m4' -x autom4te.cache -x 'config.*' -x configure -x doc -x libtool -x .deps -x .libs -x '*.ps' -x foo -x paps -x 'lib*' -x texttopaps -x '*o' -x '*.cups' -x 'test*' -x 'stamp*' paps-0.6.6.orig/src/Makefile.am paps-0.6.6/src/Makefile.am
--- paps-0.6.6.orig/src/Makefile.am 2007-02-15 22:59:47.000000000 +0900
+++ paps-0.6.6/src/Makefile.am 2007-02-15 23:34:24.000000000 +0900
@@ -5,10 +5,10 @@ libpaps_a_inc_HEADERS = libpaps.h
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
diff -pruN -x Makefile -x Makefile.in -x '*.m4' -x autom4te.cache -x 'config.*' -x configure -x doc -x libtool -x .deps -x .libs -x '*.ps' -x foo -x paps -x 'lib*' -x texttopaps -x '*o' -x '*.cups' -x 'test*' -x 'stamp*' paps-0.6.6.orig/src/paps.c paps-0.6.6/src/paps.c
--- paps-0.6.6.orig/src/paps.c 2007-02-15 22:59:48.000000000 +0900
+++ paps-0.6.6/src/paps.c 2007-03-07 20:58:31.000000000 +0900
@@ -32,6 +32,7 @@
#include <time.h>
#include <locale.h>
#include <wchar.h>
+#include <cups/cups.h>
#define BUFSIZE 1024
#define DEFAULT_FONT_FAMILY "Monospace"
@@ -85,9 +86,11 @@ typedef struct {
gboolean do_separation_line;
gboolean do_draw_contour;
gboolean do_wordwrap;
+ gboolean cups_mode;
PangoDirection pango_dir;
gchar *filename;
gchar *header_font_desc;
+ gchar *owner;
} page_layout_t;
typedef struct {
@@ -314,8 +317,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;
@@ -324,6 +327,8 @@ int main(int argc, char *argv[])
int header_sep = 20;
int max_width = 0, w;
GIConv cvh = NULL;
+ gboolean cups_mode = FALSE;
+ gchar *page_owner = NULL;
/* Set locale from environment. */
setlocale(LC_ALL, "");
@@ -333,6 +338,128 @@ int main(int argc, char *argv[])
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) {
+ g_set_prgname(prgname);
+ /* argument format should be job-id user title copies options [file] */
+ cups_mode = TRUE;
+ /* set default values */
+ lpi = 6.0L;
+ cpi = 10.0L;
+ left_margin = 18;
+ right_margin = 18;
+ top_margin = 36;
+ bottom_margin = 36;
+ page_width = 612;
+ page_height = 792;
+
+ 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") &&
+ g_ascii_strcasecmp(val, "off") &&
+ g_ascii_strcasecmp(val, "false")) {
+ /* We don't need to process the documentation for orientation support.
+ * pstops certainly does. (#222137)
+ */
+ }
+ }
+ /* 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";
+ 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))
{
@@ -359,6 +486,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);
@@ -377,8 +506,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;
@@ -439,6 +570,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 (cpi > 0.0L)
@@ -584,6 +717,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')
@@ -810,6 +949,7 @@ 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)
@@ -819,12 +959,20 @@ void print_postscript_header(FILE *OUT,
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"
@@ -874,8 +1022,10 @@ void print_postscript_header(FILE *OUT,
title,
bb_page_width,
bb_page_height,
+ owner,
orientation_names[orientation]
);
+ g_free(owner);
fprintf(OUT,
"%% User settings\n"