From 550802b584f89279d8af35ee8a9221dc24ea1f27 Mon Sep 17 00:00:00 2001 From: Roland Mainz Date: Mon, 3 Jan 2005 01:06:36 +0000 Subject: xc/lib/XprintAppUtil/xpapputil.c xc/lib/XprintAppUtil/xpapputil.h xc/lib/XprintUtil/xprintutil.c xc/lib/XprintUtil/xprintutil.h xc/programs/glxgears/glxgears.c xc/programs/xdbedizzy/xdbedizzy.c xc/programs/xedit/Xedit-xprint.ad xc/programs/xedit/commands.c xc/programs/xlogo/print.c xc/programs/xlsfonts/xlsfonts.c xc/programs/xlsfonts/xlsfonts.man xc/programs/xlsfonts/xlsfonts.sgml xc/programs/xman/Xman-xprint.ad xc/programs/xman/handler.c xc/programs/xman/print.c xc/programs/xman/print.h xc/programs/xmore/XMore.ad xc/programs/xmore/print.c xc/programs/xmore/print.h xc/programs/xmore/printdialog.c xc/programs/xmore/printdialog.h xc/programs/xmore/printdialogprivates.h xc/programs/xmore/xmore.c xc/programs/xphelloworld/xpawhelloworld/xpawhelloworld.c xc/programs/xphelloworld/xphelloworld/xphelloworld.c xc/programs/xphelloworld/xpsimplehelloworld/xpsimplehelloworld.c xc/programs/xphelloworld/xpxmhelloworld/xpxmhelloworld.c xc/programs/xphelloworld/xpxthelloworld/xpxthelloworld.c xc/programs/xplsprinters/xplsprinters.c //bugs.freedesktop.org/show_bug.cgi?id=1706) attachment #1615 (https://bugs.freedesktop.org/attachment.cgi?id=1615): XprintUtils 2004/Q3 update. This adds various new features to the XprintUtils library including support for page resolutions where X_resolution!=Y_resolution, listfonts-mode control and initial framework for the COLORSPACE extension. Patch by Roland Mainz and Julien Lafon . --- XMore.ad | 2 ++ print.c | 44 ++++++++++++++++++++----------- print.h | 1 + printdialog.c | 71 ++++++++++++++++++++++++++++++++++++++++----------- printdialog.h | 9 ++++--- printdialogprivates.h | 6 +++++ xmore.c | 3 ++- 7 files changed, 101 insertions(+), 35 deletions(-) diff --git a/XMore.ad b/XMore.ad index 84001d7..98704d9 100644 --- a/XMore.ad +++ b/XMore.ad @@ -101,6 +101,8 @@ *printdialogshell*setup*orientationlist.tip: Select page orientation *printdialogshell*setup*plexlist.fromHoriz: orientationlist *printdialogshell*setup*plexlist.tip: Select page plex mode (simplex, duplex, etc.) +*printdialogshell*setup*colorspacelist.fromHoriz: plexlist +*printdialogshell*setup*colorspacelist.tip: Select color space (color, grayscale, CYMK, etc.) *printdialogshell*setup*jobcopieslabel.fromVert: paperlist *printdialogshell*setup*jobcopieslabel.tip: Set number of job copies *printdialogshell*setup*jobcopieslabel.label: Job Copies: diff --git a/print.c b/print.c index 54f5a29..dad23e5 100644 --- a/print.c +++ b/print.c @@ -41,7 +41,8 @@ in this Software without prior written authorization from The Open Group. static Widget CreatePrintShell(Widget videoshell, - Screen *pscreen, + Screen *pscreen, + Visual *pvisual, String printshell_name, ArgList args, Cardinal numargs) @@ -53,6 +54,9 @@ CreatePrintShell(Widget videoshell, Display *pdpy = XDisplayOfScreen(pscreen); int dummyc = 0; String dummys = ""; + Cardinal shell_n; + Arg shell_args[5]; + XtGetApplicationNameAndClass(XtDisplay(videoshell), &videoname, &videoclass); @@ -62,11 +66,15 @@ CreatePrintShell(Widget videoshell, NULL, 0, &dummyc, &dummys); - pappshell = XtVaAppCreateShell(videoname, videoclass, + shell_n = 0; + XtSetArg(shell_args[shell_n], XtNscreen, pscreen); shell_n++; + if (pvisual) { + XtSetArg(shell_args[shell_n], XtNvisual, pvisual); shell_n++; + } + pappshell = XtAppCreateShell(videoname, videoclass, applicationShellWidgetClass, pdpy, - XtNscreen, pscreen, - NULL); + shell_args, shell_n); printshell = XtCreatePopupShell(printshell_name, xawPrintShellWidgetClass, pappshell, args, numargs); @@ -224,7 +232,7 @@ void PrintEndJobCB(Widget pshell, XtPointer client_data, XtPointer call_data) } static -XFontSet GetPrintTextFontSet(const char *appname, Display *pdpy, long dpi) +XFontSet GetPrintTextFontSet(const char *appname, Display *pdpy, long dpi_x, long dpi_y) { XFontSet fontset; char fontname[1024]; @@ -242,11 +250,11 @@ XFontSet GetPrintTextFontSet(const char *appname, Display *pdpy, long dpi) "-wadalab-gothic-medium-r-normal--*-120-%ld-%ld-*-*," /* Fallback */ "-*-*-*-*-*--*-120-%ld-%ld-*-*", - dpi, dpi, - dpi, dpi, - dpi, dpi, - dpi, dpi, - dpi, dpi); + dpi_x, dpi_y, + dpi_x, dpi_y, + dpi_x, dpi_y, + dpi_x, dpi_y, + dpi_x, dpi_y); fontset = XCreateFontSet(pdpy, fontname, &missing_charset_list_return, &missing_charset_count_return, @@ -265,10 +273,12 @@ XFontSet GetPrintTextFontSet(const char *appname, Display *pdpy, long dpi) void DoPrintTextSource(const char *programname, Widget textsource, Widget toplevel, Display *pdpy, XPContext pcontext, + XpuColorspaceRec *colorspace, XtCallbackProc pdpyDestroyCB, const char *jobtitle, const char *toFile) { - long dpi = 0; + long dpi_x = 0L, + dpi_y = 0L; int n; Arg args[20]; XFontSet textfontset = NULL; @@ -292,7 +302,7 @@ void DoPrintTextSource(const char *programname, XpSetContext(pdpy, pcontext); /* Get default printer resolution */ - if (XpuGetResolution(pdpy, pcontext, &dpi) != 1) { + if (XpuGetResolution(pdpy, pcontext, &dpi_x, &dpi_y) != 1) { fprintf(stderr, "%s: No default resolution for printer.\n", apd->programname); XpuClosePrinterDisplay(pdpy, pcontext); return; @@ -310,14 +320,18 @@ void DoPrintTextSource(const char *programname, * |XawPrintLAYOUTMODE_PAGESIZE| are used. */ XtSetArg(args[n], XtNgeometry, "+0+0"); n++; XtSetArg(args[n], XawNlayoutMode, XawPrintLAYOUTMODE_DRAWABLEAREA); n++; - apd->printshell = CreatePrintShell(toplevel, apd->pscreen, "printshell", args, n); - + if (colorspace) { + printf("Setting visual to id=0x%lx.\n", colorspace->visualinfo.visualid); + } + apd->printshell = CreatePrintShell(toplevel, apd->pscreen, + (colorspace?(colorspace->visualinfo.visual):(NULL)), + "printshell", args, n); n = 0; XtSetArg(args[n], XtNresizable, True); n++; XtSetArg(args[n], XtNright, XtChainRight); n++; apd->content.form = XtCreateManagedWidget("form", formWidgetClass, apd->printshell, args, n); - textfontset = GetPrintTextFontSet(apd->programname, pdpy, dpi); + textfontset = GetPrintTextFontSet(apd->programname, pdpy, dpi_x, dpi_y); n = 0; XtSetArg(args[n], XtNinternational, True); n++; diff --git a/print.h b/print.h index 69321a1..d1ecbf6 100644 --- a/print.h +++ b/print.h @@ -40,6 +40,7 @@ void DoPrintTextSource(const char *programname, Widget textsource, Widget toplevel, Display *pdpy, XPContext pcontext, + XpuColorspaceRec *colorspace, XtCallbackProc printDisplayDestroyCallback, const char *jobTitle, const char *toFile); diff --git a/printdialog.c b/printdialog.c index 97cf4c9..3642c07 100644 --- a/printdialog.c +++ b/printdialog.c @@ -86,6 +86,7 @@ static String *xppaperlist_to_widget_paperlist(XpuMediumSourceSizeList paperlis static String *xpresolutionlist_to_widget_resolutionlist(XpuResolutionList reslist, int num_resolutions); static String *xporientationlist_to_widget_orientationlist(XpuOrientationList orientationlist, int num_orientations); static String *xpplexlist_to_widget_plexlist(XpuPlexList plexlist, int num_plex); +static String *xpcolorspacelist_to_widget_colorspacelist(XpuColorspaceList colorspacelist, int num_colorspaces); static void printerSelectionPrinterSelectedXtProc(Widget w, XtPointer client_data, XtPointer callData); static void printSelectPrinterXtProc(Widget w, XtPointer client_data, XtPointer callData); static void printerSelectionClose(PrintDialogWidget pdw); @@ -258,6 +259,15 @@ printSetupOKXtProc(Widget w, XtPointer client_data, XtPointer callData) } XtFree((char *)lrs); + /* Set colorspace */ + lrs = XawListShowCurrent(pdp->setup.colorspacelist); + if (lrs->list_index != XAW_LIST_NONE) { + Log(("selected colorspace is '%s'/'%d'\n", lrs->string, lrs->list_index)); + Assertion(lrs->list_index < pdp->num_colorspaces, (("Error: lrs->list_index < pdp->num_colorspaces\n"))); + pdp->selected_colorspace = &pdp->colorspacelist[lrs->list_index]; + } + XtFree((char *)lrs); + printSetupClose(pdw); } @@ -386,6 +396,7 @@ printOKXtProc(Widget w, XtPointer client_data, XtPointer callData) pdcs.pcontext = pdp->pcontext; pdcs.printToFile = pdp->printToFile; pdcs.printToFileName = (const char *)pdp->filename; + pdcs.colorspace = pdp->selected_colorspace; XtCallCallbackList((Widget)pdw, pdp->ok_callback, &pdcs); } @@ -500,6 +511,17 @@ void closePrinterConnection(PrintDialogWidget pdw, Bool closeDisplay) pdp->widget_plexlist = NULL; } + if (pdp->colorspacelist) { + XpuFreeColorspaceList(pdp->colorspacelist); + pdp->colorspacelist = NULL; + } + + if (pdp->widget_colorspacelist) { + free(pdp->widget_colorspacelist); + pdp->widget_colorspacelist = NULL; + } + pdp->selected_colorspace = NULL; + if (pdp->pdpy) { if (closeDisplay) { XpuClosePrinterDisplay(pdp->pdpy, pdp->pcontext); @@ -535,11 +557,13 @@ Bool openPrinterConnection(PrintDialogWidget pdw) pdp->resolutionlist = XpuGetResolutionList(pdp->pdpy, pdp->pcontext, &pdp->num_resolutions); pdp->orientationlist = XpuGetOrientationList(pdp->pdpy, pdp->pcontext, &pdp->num_orientations); pdp->plexlist = XpuGetPlexList(pdp->pdpy, pdp->pcontext, &pdp->num_plex); + pdp->colorspacelist = XpuGetColorspaceList(pdp->pdpy, pdp->pcontext, &pdp->num_colorspaces); pdp->widget_paperlist = xppaperlist_to_widget_paperlist(pdp->paperlist, pdp->num_papers); pdp->widget_resolutionlist = xpresolutionlist_to_widget_resolutionlist(pdp->resolutionlist, pdp->num_resolutions); pdp->widget_orientationlist = xporientationlist_to_widget_orientationlist(pdp->orientationlist, pdp->num_orientations); pdp->widget_plexlist = xpplexlist_to_widget_plexlist(pdp->plexlist, pdp->num_plex); + pdp->widget_colorspacelist = xpcolorspacelist_to_widget_colorspacelist(pdp->colorspacelist, pdp->num_colorspaces); updateWidgetStates(pdw); @@ -568,6 +592,7 @@ void destroyPrintSetupDialog(PrintDialogWidget pdw) pdp->setup.resolutionlist = NULL; pdp->setup.orientationlist = NULL; pdp->setup.plexlist = NULL; + pdp->setup.colorspacelist = NULL; pdp->setup.ok = NULL; pdp->setup.cancel = NULL; } @@ -653,6 +678,15 @@ Widget buildPrintSetupDialog(PrintDialogWidget pdw) XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++; pdp->setup.plexlist = XtCreateManagedWidget("plexlist", listWidgetClass, listform, args, n); + n = 0; + XtSetArg(args[n], XtNresizable, True); n++; + XtSetArg(args[n], XtNforceColumns, True); n++; + XtSetArg(args[n], XtNdefaultColumns, 1); n++; + XtSetArg(args[n], XtNsensitive, True); n++; + XtSetArg(args[n], XtNlist, pdp->widget_colorspacelist); n++; + XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++; + pdp->setup.colorspacelist = XtCreateManagedWidget("colorspacelist", listWidgetClass, listform, args, n); + n = 0; XtSetArg(args[n], XtNborderWidth, 0); n++; XtSetArg(args[n], XtNresizable, False); n++; @@ -726,24 +760,13 @@ String *xpresolutionlist_to_widget_resolutionlist(XpuResolutionList reslist, int { int i; String *names; - char *mem; - - /* Allocate a chunk of memory... */ - mem = malloc((sizeof(String *)+32) * (num_resolutions+2)); - /* ... which has enougth space for the list pointers... */ - names = (String *)mem; + names = malloc(sizeof(String *) * (num_resolutions+1)); if (!names) - return NULL; - - /* ... and the numbers (assuming one number isn't longer than 32-1 chars) */ - mem += sizeof(String *) * (num_resolutions+2); + return NULL; - for(i = 0 ; i < num_resolutions ; i++) { - sprintf(mem, "%d", (int)reslist[i].dpi); - names[i] = mem; - mem += strlen(mem) + 1; - } + for(i = 0 ; i < num_resolutions ; i++) + names[i] = (char *)reslist[i].name; names[i] = NULL; /* Terminate the list */ @@ -786,6 +809,24 @@ String *xpplexlist_to_widget_plexlist(XpuPlexList plexlist, int num_plex) return names; } +static +String *xpcolorspacelist_to_widget_colorspacelist(XpuColorspaceList colorspacelist, int num_colorspaces) +{ + int i; + String *names; + + names = malloc(sizeof(String *) * (num_colorspaces+1)); + if(!names) + return NULL; + + for(i = 0 ; i < num_colorspaces ; i++) + names[i] = (char *)colorspacelist[i].name; + + names[i] = NULL; /* Terminate the list */ + + return names; +} + static void printerSelectionPrinterSelectedXtProc(Widget w, XtPointer client_data, XtPointer callData) { diff --git a/printdialog.h b/printdialog.h index e963847..f166a27 100644 --- a/printdialog.h +++ b/printdialog.h @@ -48,10 +48,11 @@ in this Software without prior written authorization from The Open Group. typedef struct { - Display *pdpy; - XPContext pcontext; - const char *printToFileName; - Boolean printToFile; + Display *pdpy; + XPContext pcontext; + const char *printToFileName; + Boolean printToFile; + XpuColorspaceRec *colorspace; } XawPrintDialogCallbackStruct; typedef struct _PrintDialogClassRec *PrintDialogWidgetClass; diff --git a/printdialogprivates.h b/printdialogprivates.h index 314a91c..1e66eb8 100644 --- a/printdialogprivates.h +++ b/printdialogprivates.h @@ -100,6 +100,7 @@ typedef struct _PrintDialogPart { char *filename; Bool canPrint, /* can we print ? */ canReallyPrint; /* is it really save to print ? */ + XpuColorspaceRec *selected_colorspace; struct { @@ -118,6 +119,7 @@ typedef struct _PrintDialogPart { resolutionlist, orientationlist, plexlist, + colorspacelist, jobcopieslabel, jobcopies, ok, @@ -153,6 +155,10 @@ typedef struct _PrintDialogPart { XpuPlexList plexlist; int num_plex; String *widget_plexlist; + + XpuColorspaceList colorspacelist; + int num_colorspaces; + String *widget_colorspacelist; } PrintDialogPart; typedef struct _PrintDialogRec { diff --git a/xmore.c b/xmore.c index 78a63d4..67be5e8 100644 --- a/xmore.c +++ b/xmore.c @@ -166,7 +166,8 @@ printOKXtProc(Widget w, XtPointer client_data, XtPointer callData) DoPrintTextSource(ProgramName, textsource, toplevel, - pdcs->pdpy, pdcs->pcontext, printshellDestroyXtProc, + pdcs->pdpy, pdcs->pcontext, pdcs->colorspace, + printshellDestroyXtProc, printJobNameBuffer, pdcs->printToFile?pdcs->printToFileName:NULL); -- cgit v1.2.3