[xorg-commit-diffs] xc/lib/Xaw Print.h, NONE, 1.1.2.1 PrintSP.h, NONE, 1.1.2.1 PrintShell.c, NONE, 1.1.2.1 AllWidgets.c, 1.1.4.1.6.1, 1.1.4.1.6.1.6.1 Imakefile, 1.1.4.2.6.1, 1.1.4.2.6.1.6.1 sharedlib.c, 1.1, 1.1.20.1

Roland Mainz xorg-commit at pdx.freedesktop.org
Tue Apr 13 16:32:24 PDT 2004


Committed by: gisburn

Update of /cvs/xorg/xc/lib/Xaw
In directory pdx:/tmp/cvs-serv11011/lib/Xaw

Modified Files:
      Tag: XPRINT
	AllWidgets.c Imakefile sharedlib.c 
Added Files:
      Tag: XPRINT
	Print.h PrintSP.h PrintShell.c 
Log Message:
Fix for http://xprint.freedesktop.org/cgi-bin/bugzilla/show_bug.cgi?id=466 - RFE: Add XawPrintShell to the Athena toolkit library

--- NEW FILE: Print.h ---
/* $Xorg: Print.h,v 1.1 2003/07/11 19:46:06 gisburn Exp $ */
/******************************************************************************
 ******************************************************************************
 **
 ** (c) Copyright 2003 Danny Backx <danny.backx at skynet.be>
 ** (c) Copyright 2003-2004 Roland Mainz <roland.mainz at 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 */


--- NEW FILE: PrintSP.h ---
/* $Xorg: PrintSP.h,v 1.1 2003/07/11 19:46:06 gisburn Exp $ */
/******************************************************************************
 ******************************************************************************
 **
 ** (c) Copyright 2003 Danny Backx <danny.backx at skynet.be>
 ** (c) Copyright 2003-2004 Roland Mainz <roland.mainz at 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 */


--- NEW FILE: PrintShell.c ---
/* $Xorg: PrintShell.c,v 1.1 2003/07/11 19:46:06 gisburn Exp $ */
/******************************************************************************
 ******************************************************************************
 **
 ** (c) Copyright 2003 Danny Backx <danny.backx at skynet.be>
 ** (c) Copyright 2003-2004 Roland Mainz <roland.mainz at 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);
}




Index: AllWidgets.c
===================================================================
RCS file: /cvs/xorg/xc/lib/Xaw/AllWidgets.c,v
retrieving revision 1.1.4.1.6.1
retrieving revision 1.1.4.1.6.1.6.1
diff -u -d -r1.1.4.1.6.1 -r1.1.4.1.6.1.6.1
--- a/AllWidgets.c	4 Mar 2004 17:46:49 -0000	1.1.4.1.6.1
+++ b/AllWidgets.c	13 Apr 2004 23:32:21 -0000	1.1.4.1.6.1.6.1
@@ -67,6 +67,7 @@
 extern WidgetClass vendorShellWidgetClass;
 extern WidgetClass viewportWidgetClass;
 extern WidgetClass wmShellWidgetClass;
+extern WidgetClass xawPrintShellWidgetClass;
 
 XmuWidgetNode XawWidgetArray[] = {
 { "applicationShell", &applicationShellWidgetClass },
@@ -111,6 +112,7 @@
 { "vendorShell", &vendorShellWidgetClass },
 { "viewport", &viewportWidgetClass },
 { "wmShell", &wmShellWidgetClass },
+{ "printShell", &xawPrintShellWidgetClass },
 };
 
 int XawWidgetCount = XtNumber(XawWidgetArray);

Index: Imakefile
===================================================================
RCS file: /cvs/xorg/xc/lib/Xaw/Imakefile,v
retrieving revision 1.1.4.2.6.1
retrieving revision 1.1.4.2.6.1.6.1
diff -u -d -r1.1.4.2.6.1 -r1.1.4.2.6.1.6.1
--- a/Imakefile	4 Mar 2004 17:46:49 -0000	1.1.4.2.6.1
+++ b/Imakefile	13 Apr 2004 23:32:21 -0000	1.1.4.2.6.1.6.1
@@ -94,6 +94,8 @@
 	VendorEP.h \
 	Viewport.h \
 	ViewportP.h \
+        Print.h \
+        PrintSP.h \
 	XawImP.h \
 	XawInit.h
 
@@ -139,6 +141,7 @@
 	Tree.c \
 	Vendor.c \
 	Viewport.c \
+        PrintShell.c \
 	XawIm.c \
 	XawInit.c \
 	XawI18n.c \
@@ -190,6 +193,7 @@
 	Tree.o \
 	Vendor.o \
 	Viewport.o \
+        PrintShell.o \
 	XawIm.o \
 	XawI18n.o \
 	XawInit.o

Index: sharedlib.c
===================================================================
RCS file: /cvs/xorg/xc/lib/Xaw/sharedlib.c,v
retrieving revision 1.1
retrieving revision 1.1.20.1
diff -u -d -r1.1 -r1.1.20.1
--- a/sharedlib.c	14 Nov 2003 15:54:38 -0000	1.1
+++ b/sharedlib.c	13 Apr 2004 23:32:21 -0000	1.1.20.1
@@ -59,6 +59,7 @@
 #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 @@
 extern ViewportClassRec viewportClassRec;
 WidgetClass viewportWidgetClass = (WidgetClass)&viewportClassRec;
 
+extern XawPrintShellClassRec xawPrintShellClassRec;
+WidgetClass xawPrintShellWidgetClass = (WidgetClass) &xawPrintShellClassRec;
+ 
 #endif /* SUNSHLIB */




More information about the xorg-commit-diffs mailing list