summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland Mainz <roland.mainz@nrubsig.org>2004-04-13 23:32:21 +0000
committerRoland Mainz <roland.mainz@nrubsig.org>2004-04-13 23:32:21 +0000
commit1bff3e6fb4cadb41bdb72c064f312a82fc921f6a (patch)
tree0011b3ed48c83efdf6f4872d2214fe9c7308d93f
parentb91d8481b812527e9f37adc31e617cf10558bc7d (diff)
Fix for http://xprint.freedesktop.org/cgi-bin/bugzilla/show_bug.cgi?id=466XPRINT
- RFE: Add XawPrintShell to the Athena toolkit library
-rw-r--r--include/X11/Xaw/Print.h141
-rw-r--r--include/X11/Xaw/PrintSP.h135
-rw-r--r--src/AllWidgets.c2
-rw-r--r--src/PrintShell.c786
-rw-r--r--src/sharedlib.c4
5 files changed, 1068 insertions, 0 deletions
diff --git a/include/X11/Xaw/Print.h b/include/X11/Xaw/Print.h
new file mode 100644
index 0000000..c39000a
--- /dev/null
+++ b/include/X11/Xaw/Print.h
@@ -0,0 +1,141 @@
+/* $Xorg: Print.h,v 1.1 2003/07/11 19:46:06 gisburn Exp $ */
+/******************************************************************************
+ ******************************************************************************
+ **
+ ** (c) Copyright 2003 Danny Backx <danny.backx@skynet.be>
+ ** (c) Copyright 2003-2004 Roland Mainz <roland.mainz@nrubsig.org>
+ **
+ ** Permission is hereby granted, free of charge, to any person obtaining a copy
+ ** of this software and associated documentation files (the "Software"), to deal
+ ** in the Software without restriction, including without limitation the rights
+ ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ ** copies of the Software, and to permit persons to whom the Software is
+ ** furnished to do so, subject to the following conditions:
+ **
+ ** The above copyright notice and this permission notice shall be included in
+ ** all copies or substantial portions of the Software.
+ **
+ ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ ** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ ** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ ** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ **
+ ** Except as contained in this notice, the names of the copyright holders shall
+ ** not be used in advertising or otherwise to promote the sale, use or other
+ ** dealings in this Software without prior written authorization from said
+ ** copyright holders.
+ **
+ ******************************************************************************
+ *****************************************************************************/
+
+
+#ifndef _XAW_PRINT_H
+#define _XAW_PRINT_H 1
+
+#include <X11/extensions/Print.h>
+
+/* XawPrintConfigureLayoutMode - define how the shell resizes/moves itself
+ * to match the paper size
+ * Values:
+ * - XawPrintLAYOUTMODE_NONE
+ * do nothing
+ * - XawPrintLAYOUTMODE_PAGESIZE
+ * set width/height to page size
+ * (this is the default (mainly for compatibilty to XmPrintShell))
+ * - XawPrintLAYOUTMODE_DRAWABLEAREA
+ * set x/y/width/height to drawable area of pag
+ */
+typedef
+enum
+{
+ XawPrintLAYOUTMODE_NONE,
+ XawPrintLAYOUTMODE_PAGESIZE,
+ XawPrintLAYOUTMODE_DRAWABLEAREA
+} XawPrintConfigureLayoutMode;
+
+
+#define XawNstartJobCallback "XawNstartJobCallback"
+#define XawNendJobCallback "XawNendJobCallback"
+#define XawNdocSetupCallback "XawNdocSetupCallback"
+#define XawNpageSetupCallback "XawNpageSetupCallback"
+#define XawNlayoutMode "XawNlayoutMode"
+#define XawCLayoutMode "XawCLayoutMode"
+#define XawNminX "XawNminX"
+#define XawCMinX "XawCMinX"
+#define XawNminY "XawNminY"
+#define XawCMinY "XawCMinY"
+#define XawNmaxX "XawNmaxX"
+#define XawCMaxX "XawCMaxX"
+#define XawNmaxY "XawNmaxY"
+#define XawCMaxY "XawCMaxY"
+#define XawNcurrDocNumInJob "XawNcurrDocNumInJob"
+#define XawCCurrDocNumInJob "XawCCurrDocNumInJob"
+#define XawNcurrPageNumInDoc "XawNcurrPageNumInDoc"
+#define XawCCurrPageNumInDoc "XawCCurrPageNumInDoc"
+#define XawNcurrPageNumInJob "XawNcurrPageNumInJob"
+#define XawCCurrPageNumInJob "XawCCurrPageNumInJob"
+#define XawNdefaultPixmapResolution "XawNdefaultPixmapResolution"
+#define XawCDefaultPixmapResolution "XawCDefaultPixmapResolution"
+
+#define XawCR_START_JOB 70
+#define XawCR_END_JOB 71
+#define XawCR_DOC_SETUP 72
+#define XawCR_PAGE_SETUP 73
+
+typedef struct
+{
+ int reason;
+ XEvent *event;
+ XPContext context;
+ Boolean last_page_in_doc;
+ Boolean last_page_in_job;
+ XtPointer detail;
+} XawPrintShellCallbackStruct;
+
+extern WidgetClass xawPrintShellWidgetClass;
+typedef struct XawPrintShellRec *XawPrintShellWidget;
+
+/************************************************************
+ *
+ * Public Functions.
+ *
+ ************************************************************/
+
+_XFUNCPROTOBEGIN
+
+/* Returns whether the widget passed in is a print shell or "print shell"-like
+ * widget (e.g. print preview).
+ * Note that this will return |True| for more classes than |XawPrintShell| in
+ * the future (like for |XmPrintShell| etc.)
+ */
+extern Boolean XawIsPrintShell(
+#if NeedFunctionPrototypes
+ Widget w
+#endif
+);
+
+extern void XawPrintRedisplayWidget(
+#if NeedFunctionPrototypes
+ Widget w /* Widget */
+#endif
+);
+
+extern Widget XawOpenApplication(
+#if NeedFunctionPrototypes
+ XtAppContext *app_context_return,
+ Display *dpy,
+ Screen *screen,
+ String application_name,
+ String application_class,
+ WidgetClass widget_class,
+ int *argc,
+ String *argv
+#endif
+);
+
+_XFUNCPROTOEND
+
+#endif /* !_XAW_PRINT_H */
+
diff --git a/include/X11/Xaw/PrintSP.h b/include/X11/Xaw/PrintSP.h
new file mode 100644
index 0000000..e0aca27
--- /dev/null
+++ b/include/X11/Xaw/PrintSP.h
@@ -0,0 +1,135 @@
+/* $Xorg: PrintSP.h,v 1.1 2003/07/11 19:46:06 gisburn Exp $ */
+/******************************************************************************
+ ******************************************************************************
+ **
+ ** (c) Copyright 2003 Danny Backx <danny.backx@skynet.be>
+ ** (c) Copyright 2003-2004 Roland Mainz <roland.mainz@nrubsig.org>
+ **
+ ** Permission is hereby granted, free of charge, to any person obtaining a copy
+ ** of this software and associated documentation files (the "Software"), to deal
+ ** in the Software without restriction, including without limitation the rights
+ ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ ** copies of the Software, and to permit persons to whom the Software is
+ ** furnished to do so, subject to the following conditions:
+ **
+ ** The above copyright notice and this permission notice shall be included in
+ ** all copies or substantial portions of the Software.
+ **
+ ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ ** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ ** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ ** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ **
+ ** Except as contained in this notice, the names of the copyright holders shall
+ ** not be used in advertising or otherwise to promote the sale, use or other
+ ** dealings in this Software without prior written authorization from said
+ ** copyright holders.
+ **
+ ******************************************************************************
+ *****************************************************************************/
+
+#ifndef _XAW_PRINTSP_H
+#define _XAW_PRINTSP_H 1
+
+#include <X11/CoreP.h>
+#include <X11/ShellP.h>
+
+_XFUNCPROTOBEGIN
+
+/* New fields for the XawPrintShell widget class record */
+
+typedef struct {
+ XtPointer extension; /* pointer to extension record */
+} XawPrintShellClassPart;
+
+typedef struct XawPrintShellClassRec {
+ CoreClassPart core_class;
+ CompositeClassPart composite_class;
+ ShellClassPart shell_class;
+ WMShellClassPart wm_shell_class;
+ VendorShellClassPart vendor_shell_class;
+ TopLevelShellClassPart top_level_shell_class;
+ ApplicationShellClassPart application_shell_class;
+ XawPrintShellClassPart print_shell_class;
+} XawPrintShellClassRec;
+
+extern XawPrintShellClassRec xawPrintShellClassRec;
+
+/* New fields for the XawPrint shell widget */
+
+typedef struct {
+ XtCallbackList start_job_callback,
+ end_job_callback,
+ doc_setup_callback,
+ page_setup_callback;
+ XtEnum layoutmode; /* see XawPrintConfigureLayoutMode */
+ unsigned short page_width,
+ page_height;
+ Dimension min_x,
+ min_y,
+ max_x,
+ max_y;
+ unsigned int curr_doc_num_in_job, /* Current document number in job */
+ curr_page_num_in_doc, /* Current page number in doc */
+ curr_page_num_in_job; /* Current page number in job */
+ unsigned short default_pixmap_resolution;
+ long print_resolution;
+ Boolean last_page_in_doc;
+ Boolean last_page_in_job;
+} XawPrintShellPart;
+
+typedef struct XawPrintShellRec {
+ CorePart core;
+ CompositePart composite;
+ ShellPart shell;
+ WMShellPart wm;
+ VendorShellPart vendor;
+ TopLevelShellPart topLevel;
+ ApplicationShellPart application;
+ XawPrintShellPart print;
+} XawPrintShellRec;
+extern WidgetClass xawPrintShellWidgetClass;
+
+#define PS_StartJobCallback(w) \
+ (((XawPrintShellWidget) (w))->print.start_job_callback)
+#define PS_EndJobCallback(w) \
+ (((XawPrintShellWidget) (w))->print.end_job_callback)
+#define PS_DocSetupCallback(w) \
+ (((XawPrintShellWidget) (w))->print.doc_setup_callback)
+#define PS_PageSetupCallback(w) \
+ (((XawPrintShellWidget) (w))->print.page_setup_callback)
+#define PS_LayoutMode(w) \
+ (((XawPrintShellWidget) (w))->print.layoutmode)
+#define PS_PageWidth(w) \
+ (((XawPrintShellWidget) (w))->print.page_width)
+#define PS_PageHeight(w) \
+ (((XawPrintShellWidget) (w))->print.page_height)
+#define PS_MinX(w) \
+ (((XawPrintShellWidget) (w))->print.min_x)
+#define PS_MinY(w) \
+ (((XawPrintShellWidget) (w))->print.min_y)
+#define PS_MaxX(w) \
+ (((XawPrintShellWidget) (w))->print.max_x)
+#define PS_MaxY(w) \
+ (((XawPrintShellWidget) (w))->print.max_y)
+#define PS_CurrDocNumInJob(w) \
+ (((XawPrintShellWidget) (w))->print.curr_doc_num_in_job)
+#define PS_CurrPageNumInDoc(w) \
+ (((XawPrintShellWidget) (w))->print.curr_page_num_in_doc)
+#define PS_CurrPageNumInJob(w) \
+ (((XawPrintShellWidget) (w))->print.curr_page_num_in_job)
+#define PS_DefaultPixmapResolution(w) \
+ (((XawPrintShellWidget) (w))->print.default_pixmap_resolution)
+#define PS_PrintResolution(w) \
+ (((XawPrintShellWidget) (w))->print.print_resolution)
+#define PS_LastPageInDoc(w) \
+ (((XawPrintShellWidget) (w))->print.last_page_in_doc)
+#define PS_LastPageInJob(w) \
+ (((XawPrintShellWidget) (w))->print.last_page_in_job)
+
+_XFUNCPROTOEND
+
+#endif /* !_XAW_PRINTSP_H */
+
diff --git a/src/AllWidgets.c b/src/AllWidgets.c
index 9833b09..a96625b 100644
--- a/src/AllWidgets.c
+++ b/src/AllWidgets.c
@@ -67,6 +67,7 @@ extern WidgetClass treeWidgetClass;
extern WidgetClass vendorShellWidgetClass;
extern WidgetClass viewportWidgetClass;
extern WidgetClass wmShellWidgetClass;
+extern WidgetClass xawPrintShellWidgetClass;
XmuWidgetNode XawWidgetArray[] = {
{ "applicationShell", &applicationShellWidgetClass },
@@ -111,6 +112,7 @@ XmuWidgetNode XawWidgetArray[] = {
{ "vendorShell", &vendorShellWidgetClass },
{ "viewport", &viewportWidgetClass },
{ "wmShell", &wmShellWidgetClass },
+{ "printShell", &xawPrintShellWidgetClass },
};
int XawWidgetCount = XtNumber(XawWidgetArray);
diff --git a/src/PrintShell.c b/src/PrintShell.c
new file mode 100644
index 0000000..50446d3
--- /dev/null
+++ b/src/PrintShell.c
@@ -0,0 +1,786 @@
+/* $Xorg: PrintShell.c,v 1.1 2003/07/11 19:46:06 gisburn Exp $ */
+/******************************************************************************
+ ******************************************************************************
+ **
+ ** (c) Copyright 2003 Danny Backx <danny.backx@skynet.be>
+ ** (c) Copyright 2003-2004 Roland Mainz <roland.mainz@nrubsig.org>
+ **
+ ** Permission is hereby granted, free of charge, to any person obtaining a copy
+ ** of this software and associated documentation files (the "Software"), to deal
+ ** in the Software without restriction, including without limitation the rights
+ ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ ** copies of the Software, and to permit persons to whom the Software is
+ ** furnished to do so, subject to the following conditions:
+ **
+ ** The above copyright notice and this permission notice shall be included in
+ ** all copies or substantial portions of the Software.
+ **
+ ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ ** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ ** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ ** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ **
+ ** Except as contained in this notice, the names of the copyright holders shall
+ ** not be used in advertising or otherwise to promote the sale, use or other
+ ** dealings in this Software without prior written authorization from said
+ ** copyright holders.
+ **
+ ******************************************************************************
+ *****************************************************************************/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+
+#include "Print.h"
+#include "PrintSP.h"
+
+/* Local prototypes */
+static void class_initialize(void);
+static void class_part_initialize(WidgetClass w_class);
+static void initialize(Widget request, Widget new_w, ArgList args, Cardinal *num_args);
+static void destroy(Widget w);
+static Boolean set_values(Widget current, Widget request, Widget new_w, ArgList args, Cardinal *num_args);
+static void XawPrintNotify(Widget w, XtPointer client, XEvent *evp, Boolean *cont);
+static void XawAttributesNotify(Widget w, XtPointer client, XEvent *evp, Boolean *cont);
+static void XawUpdateLayout(Widget w);
+static void XawUpdateResources(Widget w, XPContext pcontext);
+
+#define Offset(field) XtOffsetOf(XawPrintShellRec, print.field)
+
+#ifdef XAWDEBUG
+#define DEBUGOUT(x) XawDebug x ;
+
+static void
+XawDebug(const char *fn, Widget w, const char *fmt, ...)
+{
+ va_list ap;
+
+ if (w) {
+ fprintf(stderr, "%s %s: ",
+ w->core.widget_class->core_class.class_name, XtName(w));
+ } else {
+ fprintf(stderr, "(null widget): ");
+ }
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+#else
+#define DEBUGOUT(x)
+#endif /* XAWDEBUG */
+
+/* Resources for the PrintShell class */
+static XtResource resources[] =
+{
+ {
+ XawNstartJobCallback, XtCCallback, XtRCallback,
+ sizeof(XtCallbackList), Offset(start_job_callback),
+ XtRImmediate, (XtPointer)NULL
+ },
+ {
+ XawNendJobCallback, XtCCallback, XtRCallback,
+ sizeof(XtCallbackList), Offset(end_job_callback),
+ XtRImmediate, (XtPointer)NULL
+ },
+ {
+ XawNdocSetupCallback, XtCCallback, XtRCallback,
+ sizeof(XtCallbackList), Offset(doc_setup_callback),
+ XtRImmediate, (XtPointer)NULL
+ },
+ {
+ XawNpageSetupCallback, XtCCallback, XtRCallback,
+ sizeof(XtCallbackList), Offset(page_setup_callback),
+ XtRImmediate, (XtPointer)NULL
+ },
+ {
+ XawNlayoutMode, XawCLayoutMode, XtREnum,
+ sizeof(XtEnum), Offset(layoutmode),
+ XtRImmediate, (XtPointer)XawPrintLAYOUTMODE_PAGESIZE
+ },
+ {
+ XawNminX, XawCMinX, XtRDimension,
+ sizeof(Dimension), Offset(min_x),
+ XtRImmediate, (XtPointer)NULL /* dynamic */
+ },
+ {
+ XawNminY, XawCMinY, XtRDimension,
+ sizeof(Dimension), Offset(min_y),
+ XtRImmediate, (XtPointer)NULL /* dynamic */
+ },
+ {
+ XawNmaxX, XawCMaxX, XtRDimension,
+ sizeof(Dimension), Offset(max_x),
+ XtRImmediate, (XtPointer)NULL /* dynamic */
+ },
+ {
+ XawNmaxY, XawCMaxY, XtRDimension,
+ sizeof(Dimension), Offset(max_y),
+ XtRImmediate, (XtPointer)NULL /* dynamic */
+ },
+ {
+ XawNcurrDocNumInJob, XawCCurrDocNumInJob, XtRInt,
+ sizeof(unsigned int), Offset(curr_doc_num_in_job),
+ XtRImmediate, (XtPointer)NULL /* dynamic */
+ },
+ {
+ XawNcurrPageNumInDoc, XawCCurrPageNumInDoc, XtRInt,
+ sizeof(unsigned int), Offset(curr_page_num_in_doc),
+ XtRImmediate, (XtPointer)NULL /* dynamic */
+ },
+ {
+ XawNcurrPageNumInJob, XawCCurrPageNumInJob, XtRInt,
+ sizeof(unsigned int), Offset(curr_page_num_in_job),
+ XtRImmediate, (XtPointer)NULL /* dynamic */
+ },
+ {
+ XawNdefaultPixmapResolution, XawCDefaultPixmapResolution, XtRShort,
+ sizeof(unsigned short), Offset(default_pixmap_resolution),
+ XtRImmediate, (XtPointer)0
+ },
+};
+
+static XtActionsRec actions[] =
+{
+ { NULL, NULL }
+};
+
+XawPrintShellClassRec xawPrintShellClassRec = {
+ /* Core class part */
+ {
+ /* superclass */ (WidgetClass) &applicationShellClassRec,
+ /* class_name */ "XawPrintShell",
+ /* widget_size */ sizeof(XawPrintShellRec),
+ /* class_initialize */ class_initialize,
+ /* class_part_initialize */ class_part_initialize,
+ /* class_inited */ False,
+ /* initialize */ initialize,
+ /* initialize_hook */ NULL,
+ /* realize */ XtInheritRealize,
+ /* actions */ actions,
+ /* num_actions */ XtNumber(actions),
+ /* resources */ resources,
+ /* num_resources */ XtNumber(resources),
+ /* xrm_class */ NULLQUARK,
+ /* compress_motion */ False,
+ /* compress_exposure */ XtExposeCompressSeries,
+ /* compress_enterleave */ False,
+ /* visible_interest */ False,
+ /* destroy */ destroy,
+ /* resize */ XtInheritResize,
+ /* expose */ XtInheritExpose,
+ /* set_values */ set_values,
+ /* set_values_hook */ NULL,
+ /* set_values_almost */ XtInheritSetValuesAlmost,
+ /* get_values_hook */ NULL,
+ /* accept_focus */ NULL,
+ /* version */ XtVersion,
+ /* callback offsets */ NULL,
+ /* tm_table */ XtInheritTranslations,
+ /* query_geometry */ XtInheritQueryGeometry,
+ /* display_accelerator */ NULL,
+ /* extension */ NULL /* (XtPointer)&_XawPrintShellCoreClassExtRec */
+ },
+ /* Composite class part */
+ {
+ /* geometry manager */ XtInheritGeometryManager,
+ /* change_managed */ XtInheritChangeManaged,
+ /* insert_child */ XtInheritInsertChild,
+ /* delete_child */ XtInheritDeleteChild,
+ /* extension */ NULL,
+ },
+ /* Shell class part */
+ {
+ /* extension */ NULL,
+ },
+ /* WM Shell class part */
+ {
+ /* extension */ NULL,
+ },
+ /* VendorShell class part */
+ {
+ /* extension */ NULL,
+ },
+ /* TopLevelShell class part */
+ {
+ /* extension */ NULL,
+ },
+ /* ApplicationShell class part */
+ {
+ /* extension */ NULL,
+ },
+ {
+ /* ?? */ NULL,
+ },
+};
+
+WidgetClass xawPrintShellWidgetClass = (WidgetClass)&xawPrintShellClassRec;
+
+
+static void
+class_initialize(void)
+{
+}
+
+
+static void
+class_part_initialize(WidgetClass widget_class)
+{
+}
+
+/*
+ * This is a static table to keep the link between widgets and XPContexts.
+ * Yeah - this is probably not a very bright idea. Maybe it should also
+ * contain the Display.
+ */
+typedef struct {
+ Widget w;
+ XPContext c;
+} WidgetContext;
+static WidgetContext *w_ctxt = NULL;
+static int wc_nfields = 0;
+
+static void
+XawStoreWidgetContext(Widget w, XPContext c)
+{
+ wc_nfields++;
+ w_ctxt = (WidgetContext *)XtRealloc((XtPointer)w_ctxt, sizeof(WidgetContext) * wc_nfields);
+ w_ctxt[wc_nfields-1].w = w;
+ w_ctxt[wc_nfields-1].c = c;
+}
+
+/* FIXME: This is not threadsafe... */
+static Widget
+XawPrintContextToWidget(XPContext c)
+{
+ int i;
+
+ for( i = 0 ; i < wc_nfields ; i++ ) {
+ if( w_ctxt[i].c == c ) {
+ return w_ctxt[i].w;
+ }
+ }
+ return NULL;
+}
+
+/* FIXME: This is not threadsafe... */
+static XPContext
+XawPrintWidgetToContext(Widget w)
+{
+ int i;
+
+ for( i = 0 ; i < wc_nfields ; i++ ) {
+ if (w_ctxt[i].w == w) {
+ return w_ctxt[i].c;
+ }
+ }
+ return (XPContext)None;
+}
+
+/* FIXME: This is not threadsafe... */
+static void
+XawPrintDeleteWidgetContext(Widget w)
+{
+ int i;
+
+ for( i = 0 ; i < wc_nfields ; i++ ) {
+ if( w_ctxt[i].w == w ) {
+ w_ctxt[i].w = NULL;
+ w_ctxt[i].c = None;
+ }
+ }
+}
+
+static void
+SelectNotify(Widget w, int *e, XtPointer *s, int n, XtPointer client)
+{
+ XPContext c = XpGetContext(XtDisplay(w));
+
+ if (!c) {
+ XtAppWarning(XtWidgetToApplicationContext(w),
+ "XawPrintShell: SelectNotify: no print context\n");
+ return;
+ }
+
+ XpSelectInput(XtDisplay(w), c, XPPrintMask|XPAttributeMask);
+}
+
+
+static Boolean
+DispatchEvent(XEvent *evp)
+{
+ XPPrintEvent *e = (XPPrintEvent*)evp;
+
+ Widget w = XawPrintContextToWidget(e->context);
+
+ /* Make sure this event is really for this window... */
+ if (XFilterEvent(evp, XtWindow(w)))
+ {
+ DEBUGOUT((__FILE__, w, "XawPrintShell-DispatchEvent *** filter XFilterEvent() matched.\n"));
+ return True;
+ }
+
+ /* Only for debugging */
+#ifdef XAWDEBUG
+ {
+ int error_base,
+ event_base;
+
+ if (!XpQueryExtension(XtDisplay(w), &event_base, &error_base)) {
+ return False;
+ }
+
+ if (e->type == event_base + XPPrintNotify) {
+ switch (e->detail) {
+ case XPStartJobNotify:
+ DEBUGOUT((__FILE__, w, "XawPrintShell-DispatchEvent XPStartJobNotify\n"));
+ break;
+ case XPEndJobNotify:
+ DEBUGOUT((__FILE__, w, "XawPrintShell-DispatchEvent XPEndJobNotify\n"));
+ break;
+ case XPStartDocNotify:
+ DEBUGOUT((__FILE__, w, "XawPrintShell-DispatchEvent XPStartDocNotify\n"));
+ break;
+ case XPStartPageNotify:
+ DEBUGOUT((__FILE__, w, "XawPrintShell-DispatchEvent XPStartPageNotify\n"));
+ break;
+ case XPEndPageNotify:
+ DEBUGOUT((__FILE__, w, "XawPrintShell-DispatchEvent XPEndPageNotify\n"));
+ break;
+ case XPEndDocNotify:
+ DEBUGOUT((__FILE__, w, "XawPrintShell-DispatchEvent XPEndDocNotify\n"));
+ break;
+ default:
+ DEBUGOUT((__FILE__, w, "XawPrintShell DispatchEvent\n"));
+ }
+ }
+ }
+#endif /* XAWDEBUG */
+
+ return XtDispatchEventToWidget(w, evp);
+}
+
+
+static void
+initialize(Widget request, Widget new_w, ArgList args, Cardinal *num_args)
+{
+ int error_base,
+ event_base;
+ XPContext pcontext;
+
+ DEBUGOUT((__FILE__, new_w, "XawPrintShell Initialize\n"));
+
+ if (!XpQueryExtension(XtDisplay(new_w), &event_base, &error_base)) {
+ DEBUGOUT((__FILE__, new_w, "XawPrintShell initialize: failed!!\n"));
+ XtAppWarning(XtWidgetToApplicationContext(new_w),
+ "XawPrintShell: initialize: XpQueryExtension() failed. BAD.\n");
+ return;
+ }
+
+ DEBUGOUT((__FILE__, new_w, "XawPrintShell Initialize event_base %d error_base %d\n",
+ event_base, error_base));
+
+ pcontext = XpGetContext(XtDisplay(new_w));
+
+ if( pcontext == None ) {
+ XtAppWarning(XtWidgetToApplicationContext(new_w),
+ "XawPrintShell: initialize: No print content. BAD.\n");
+ return;
+ }
+
+ /* Make sure that the Xt machinery is really using the right screen (assertion) */
+ if( XpGetScreenOfContext(XtDisplay(new_w), pcontext) != XtScreen(new_w) ) {
+ XtAppWarning(XtWidgetToApplicationContext(new_w),
+ "XawPrintShell: initialize: Widget's screen != print screen. BAD.\n");
+ return;
+ }
+
+ XawStoreWidgetContext(new_w, pcontext);
+
+ XtInsertEventTypeHandler(new_w,
+ event_base + XPPrintNotify,
+ (XtPointer)XPPrintMask,
+ XawPrintNotify, NULL,
+ XtListTail);
+ XtInsertEventTypeHandler(new_w,
+ event_base + XPAttributeNotify,
+ (XtPointer)XPAttributeMask,
+ XawAttributesNotify, NULL,
+ XtListTail);
+
+ XtRegisterExtensionSelector(XtDisplay(new_w),
+ event_base + XPPrintNotify,
+ event_base + XPAttributeNotify,
+ SelectNotify,
+ NULL);
+
+ XtSetEventDispatcher(XtDisplay(new_w),
+ event_base + XPPrintNotify,
+ DispatchEvent);
+ XtSetEventDispatcher(XtDisplay(new_w),
+ event_base + XPAttributeNotify,
+ DispatchEvent);
+
+ PS_LastPageInDoc(new_w) = False;
+ PS_LastPageInJob(new_w) = False;
+
+ XawUpdateResources(new_w, pcontext);
+ XawUpdateLayout(new_w);
+
+ DEBUGOUT((__FILE__, new_w, "XawPrintShell Initialize x %d y %d wid %d ht %d\n",
+ new_w->core.x,
+ new_w->core.y,
+ new_w->core.width,
+ new_w->core.height));
+}
+
+
+static void
+destroy(Widget w)
+{
+ DEBUGOUT((__FILE__, w, "XawPrintShell Destroy\n"));
+ XawPrintDeleteWidgetContext(w);
+}
+
+static Boolean
+set_values(Widget current, Widget request, Widget new_w,
+ ArgList args, Cardinal *num_args)
+{
+ DEBUGOUT((__FILE__, new_w, "XawPrintShell SetValues\n"));
+ return True;
+}
+
+void XawPrintRedisplayWidget(Widget w)
+{
+ XExposeEvent xev;
+ Region region;
+
+ xev.type = Expose;
+ xev.serial = XLastKnownRequestProcessed(XtDisplay(w));
+ xev.send_event = False;
+ xev.display = XtDisplay(w);
+ xev.window = XtWindowOfObject(w);
+ xev.x = 0;
+ xev.y = 0;
+ xev.width = w->core.width;
+ xev.height = w->core.height;
+ xev.count = 0;
+
+ region = XCreateRegion();
+ if (!region)
+ return;
+
+ XtAddExposureToRegion((XEvent*)&xev, region);
+
+ if (w->core.widget_class->core_class.expose)
+ (*(w->core.widget_class->core_class.expose))(w, (XEvent *)&xev, region);
+
+ XDestroyRegion(region);
+}
+
+/* XawOpenApplication() - mainly identical to XtOpenApplication() but
+ * takes a |Display *| and |Screen *| as arguments, too... */
+Widget XawOpenApplication(XtAppContext *app_context_return,
+ Display *dpy,
+ Screen *screen,
+ String application_name,
+ String application_class,
+ WidgetClass widget_class,
+ int *argc,
+ String *argv)
+{
+ Widget toplevel;
+ Cardinal n;
+ Arg args[2];
+
+ XtToolkitInitialize();
+ *app_context_return = XtCreateApplicationContext();
+ if( *app_context_return == NULL )
+ return NULL;
+
+ XtDisplayInitialize(*app_context_return, dpy,
+ application_name, application_class,
+ NULL, 0,
+ argc, argv);
+
+ n = 0;
+ if (screen) {
+ XtSetArg(args[n], XtNscreen, screen); n++;
+ }
+ toplevel = XtAppCreateShell(application_name,
+ application_class,
+ widget_class,
+ dpy,
+ args, n);
+
+ return toplevel;
+}
+
+
+/* Returns whether the widget passed in is a print shell or "print shell"-like
+ * widget (e.g. print preview).
+ * Note that this will return |True| for more classes than |XawPrintShell| in
+ * the future (like for |XmPrintShell| etc.)
+ */
+Boolean
+XawIsPrintShell(Widget w)
+{
+ return XtIsSubclass(w, xawPrintShellWidgetClass);
+}
+
+
+static void
+XawPrintNotify(Widget w, XtPointer client, XEvent *evp, Boolean *cont)
+{
+ XPPrintEvent *e = (XPPrintEvent *)evp;
+ XawPrintShellCallbackStruct cbs;
+
+ switch (e->detail) {
+ case XPStartPageNotify:
+ DEBUGOUT((__FILE__, w, "XPStartPageNotify\n"));
+
+ /* Re do not have to call |XawPrintRedisplayWidget(w)| here since
+ * Xprint triggers an expose event anyway
+ */
+
+ DEBUGOUT((__FILE__, w, "XpEndPage\n"));
+ XpEndPage(XtDisplay(w));
+ break;
+
+ case XPEndPageNotify:
+ DEBUGOUT((__FILE__, w, "XPEndPageNotify\n"));
+
+ if (PS_LastPageInDoc(w) || PS_LastPageInJob(w)) {
+ DEBUGOUT((__FILE__, w, "XpEndDoc\n"));
+ XpEndDoc(XtDisplay(w));
+ }
+ else {
+ /* Increment page numbers... */
+ PS_CurrPageNumInDoc(w) += 1;
+ PS_CurrPageNumInJob(w) += 1;
+
+ /* ... do the page setup callback ... */
+ cbs.reason = XawCR_PAGE_SETUP;
+ cbs.event = evp;
+ cbs.detail = NULL;
+ cbs.context = XawPrintWidgetToContext(w);
+ cbs.last_page_in_doc = False;
+ cbs.last_page_in_job = False;
+
+ if (PS_PageSetupCallback(w))
+ XtCallCallbackList(w, PS_PageSetupCallback(w), &cbs);
+
+ PS_LastPageInDoc(w) = cbs.last_page_in_doc;
+ PS_LastPageInJob(w) = cbs.last_page_in_job;
+
+ /* ... and start the new page */
+ DEBUGOUT((__FILE__, w, "XpStartPage\n"));
+ XpStartPage(XtDisplay(w), XtWindow(w));
+ }
+ break;
+
+ case XPStartDocNotify:
+ DEBUGOUT((__FILE__, w, "XPStartDocNotify\n"));
+
+ cbs.reason = XawCR_PAGE_SETUP;
+ cbs.event = evp;
+ cbs.detail = NULL;
+ cbs.context = XawPrintWidgetToContext(w);
+ cbs.last_page_in_doc = False;
+ cbs.last_page_in_job = False;
+
+ if (PS_PageSetupCallback(w))
+ XtCallCallbackList(w, PS_PageSetupCallback(w), &cbs);
+
+ PS_LastPageInDoc(w) = cbs.last_page_in_doc;
+ PS_LastPageInJob(w) = cbs.last_page_in_job;
+
+ DEBUGOUT((__FILE__, w, "XpStartPage\n"));
+ XpStartPage(XtDisplay(w), XtWindow(w));
+ break;
+
+ case XPEndDocNotify:
+ DEBUGOUT((__FILE__, w, "XPEndDocNotify\n"));
+
+ /* Start a new document (via XpStartDoc()) if we are not done with the job yet,
+ * otherwise finish the job (via XpEndJob())
+ */
+ if (PS_LastPageInJob(w)) {
+ DEBUGOUT((__FILE__, w, "XpEndJob\n"));
+ XpEndJob(XtDisplay(w));
+ }
+ else {
+ PS_CurrDocNumInJob(w) += 1;
+ PS_CurrPageNumInDoc(w) = 1;
+
+ cbs.reason = XawCR_DOC_SETUP;
+ cbs.event = evp;
+ cbs.detail = NULL;
+ cbs.context = XawPrintWidgetToContext(w);
+ cbs.last_page_in_doc = False;
+ cbs.last_page_in_job = False;
+
+ if (PS_DocSetupCallback(w))
+ XtCallCallbackList(w, PS_DocSetupCallback(w), &cbs);
+
+ PS_LastPageInDoc(w) = cbs.last_page_in_doc;
+ PS_LastPageInJob(w) = cbs.last_page_in_job;
+
+ DEBUGOUT((__FILE__, w, "XpStartDoc\n"));
+ XpStartDoc(XtDisplay(w), XPDocNormal);
+ }
+ break;
+
+ case XPStartJobNotify:
+ DEBUGOUT((__FILE__, w, "XPStartJobNotify\n"));
+ PS_LastPageInJob(w) = False;
+ PS_LastPageInDoc(w) = False;
+ PS_CurrDocNumInJob(w) = 1;
+ PS_CurrPageNumInDoc(w) = 1;
+ PS_CurrPageNumInJob(w) = 1;
+
+ cbs.reason = XawCR_START_JOB;
+ cbs.event = evp;
+ cbs.detail = NULL;
+ cbs.context = XawPrintWidgetToContext(w);
+ cbs.last_page_in_doc = False;
+ cbs.last_page_in_job = False;
+
+ if (PS_StartJobCallback(w))
+ XtCallCallbackList(w, PS_StartJobCallback(w), &cbs);
+
+ PS_LastPageInDoc(w) = cbs.last_page_in_doc;
+ PS_LastPageInJob(w) = cbs.last_page_in_job;
+
+ /* Start a document (which will trigger the first page in
+ * |XPStartDocNotify| above) */
+ if (PS_LastPageInDoc(w) || PS_LastPageInJob(w)) {
+ DEBUGOUT((__FILE__, w, "XpEndJob\n"));
+ XpEndJob(XtDisplay(w));
+ }
+ else
+ {
+ cbs.reason = XawCR_DOC_SETUP;
+ cbs.event = evp;
+ cbs.detail = NULL;
+ cbs.context = XawPrintWidgetToContext(w);
+ cbs.last_page_in_doc = False;
+ cbs.last_page_in_job = False;
+
+ if (PS_DocSetupCallback(w))
+ XtCallCallbackList(w, PS_DocSetupCallback(w), &cbs);
+
+ PS_LastPageInDoc(w) = cbs.last_page_in_doc;
+ PS_LastPageInJob(w) = cbs.last_page_in_job;
+
+ DEBUGOUT((__FILE__, w, "XpStartDoc\n"));
+ XpStartDoc(XtDisplay(w), XPDocNormal);
+ }
+ break;
+
+ case XPEndJobNotify:
+ DEBUGOUT((__FILE__, w, "XPEndJobNotify\n"));
+ cbs.reason = XawCR_END_JOB;
+ cbs.event = evp;
+ cbs.detail = NULL;
+ cbs.context = None;
+ cbs.last_page_in_doc = True;
+ cbs.last_page_in_job = True;
+
+ if (PS_EndJobCallback(w))
+ XtCallCallbackList(w, PS_EndJobCallback(w), &cbs);
+ break;
+
+ default:
+ DEBUGOUT((__FILE__, w, "XawPrintNotify(default)\n"));
+ break;
+ }
+}
+
+static void
+XawUpdateResources(Widget w, XPContext pcontext)
+{
+ XawPrintShellWidget print_shell = (XawPrintShellWidget)w;
+ String string_resolution;
+ XRectangle drawable_paper_area;
+
+ string_resolution = XpGetOneAttribute(XtDisplay(w), pcontext, XPDocAttr, "default-printer-resolution");
+ if (!string_resolution) {
+ XtAppWarning(XtWidgetToApplicationContext(w),
+ "XawPrintShell: XawUpdateResources: Could not get 'default-printer-resolution' XPDocAttr\n");
+ }
+ print_shell->print.print_resolution = atol(string_resolution);
+ XFree(string_resolution);
+
+ if (print_shell->print.print_resolution == 0) {
+ XtAppWarning(XtWidgetToApplicationContext(w),
+ "XawPrintShell: XawUpdateResources: Resolution '0' invalid\n");
+ }
+
+ /* Get the paper size... */
+ XpGetPageDimensions(XtDisplay(w), pcontext,
+ &print_shell->print.page_width, &print_shell->print.page_height,
+ &drawable_paper_area);
+ /* ... and store it in the widget */
+ print_shell->print.min_x = drawable_paper_area.x;
+ print_shell->print.min_y = drawable_paper_area.y;
+ print_shell->print.max_x = drawable_paper_area.x + drawable_paper_area.width;
+ print_shell->print.max_y = drawable_paper_area.y + drawable_paper_area.height;
+}
+
+static void
+XawUpdateLayout(Widget w)
+{
+ XawPrintShellWidget print_shell = (XawPrintShellWidget)w;
+
+ switch( print_shell->print.layoutmode )
+ {
+ case XawPrintLAYOUTMODE_NONE:
+ break;
+ case XawPrintLAYOUTMODE_PAGESIZE:
+ XtResizeWidget(w,
+ print_shell->print.page_width,
+ print_shell->print.page_height,
+ w->core.border_width);
+ break;
+ case XawPrintLAYOUTMODE_DRAWABLEAREA:
+ XtConfigureWidget(w,
+ print_shell->print.min_x,
+ print_shell->print.min_y,
+ print_shell->print.max_x - print_shell->print.min_x,
+ print_shell->print.max_y - print_shell->print.min_y,
+ w->core.border_width);
+ break;
+ default:
+ XtAppWarning(XtWidgetToApplicationContext(w),
+ "XawPrintShell: XawUpdateResources: Invalid layout mode\n");
+ break;
+ }
+}
+
+
+/* Update widget attributes+properties when the we receive
+ * "Xp attribute change"-events (e.g. paper (size/orientation/etc.)
+ * changed etc.) */
+static void
+XawAttributesNotify(Widget w,
+ XtPointer client,
+ XEvent *evp,
+ Boolean *cont)
+{
+ XawPrintShellWidget print_shell = (XawPrintShellWidget)w;
+ XPAttributeEvent *xpevp = (XPAttributeEvent *)evp;
+
+ XawUpdateResources(w, xpevp->context);
+ XawUpdateLayout(w);
+}
+
+
+
diff --git a/src/sharedlib.c b/src/sharedlib.c
index c93e964..8220a69 100644
--- a/src/sharedlib.c
+++ b/src/sharedlib.c
@@ -59,6 +59,7 @@ in this Software without prior written authorization from The Open Group.
#include <X11/Xaw/TreeP.h>
#include <X11/VendorP.h>
#include <X11/Xaw/ViewportP.h>
+#include <X11/Xaw/PrintSP.h>
extern AsciiSinkClassRec asciiSinkClassRec;
WidgetClass asciiSinkObjectClass = (WidgetClass)&asciiSinkClassRec;
@@ -168,4 +169,7 @@ WidgetClass vendorShellWidgetClass = (WidgetClass) &vendorShellClassRec;
extern ViewportClassRec viewportClassRec;
WidgetClass viewportWidgetClass = (WidgetClass)&viewportClassRec;
+extern XawPrintShellClassRec xawPrintShellClassRec;
+WidgetClass xawPrintShellWidgetClass = (WidgetClass) &xawPrintShellClassRec;
+
#endif /* SUNSHLIB */