cdesktopenv/cde/examples/dtprint/Main.c

245 lines
6.3 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: Main.c /main/6 1996/06/07 12:04:30 daniel $ */
#include "PrintDemo.h"
/*
* VideoShell structure definition
*/
typedef struct _VideoShell
{
Widget widget;
Boolean print_only;
String file_name;
} VideoShell;
/*
* application-level resources
*/
static XrmOptionDescRec XrmOptions[] =
{
{"-print", "printOnly", XrmoptionNoArg, (caddr_t)"True"},
{"-fileName", "fileName", XrmoptionSepArg, (caddr_t)NULL},
};
static XtResource VideoResources[] =
{
{"printOnly", "PrintOnly", XmRBoolean, sizeof (Boolean),
XtOffsetOf (VideoShell, print_only), XmRImmediate, (XtPointer)False,
},
{"fileName", "FileName", XmRString, sizeof (char *),
XtOffsetOf (VideoShell, file_name), XmRImmediate, (XtPointer)NULL,
},
};
/*
* static function declarations
*/
static VideoShell* VideoShell_new(Display* display);
/*
* ------------------------------------------------------------------------
* Name: VideoShell_new
*
* Description:
*
* Allocates a new VideoShell data structure.
*
* This function creates a top level application shell on the passed
* video display.
*
* Return value:
*
* A pointer to the new VideoShell structure.
*/
static VideoShell*
VideoShell_new(Display* display)
{
VideoShell* me = (VideoShell*)XtCalloc(1, sizeof(VideoShell));
me->widget = XtVaAppCreateShell(NULL, APP_CLASS,
applicationShellWidgetClass,
display,
XmNtitle, "DtPrint Demo",
NULL);
XtGetApplicationResources(me->widget, me,
VideoResources, XtNumber(VideoResources),
NULL, 0);
return me;
}
/*
* ------------------------------------------------------------------------
* Name: CloseProgramCB
*
* Description:
*
* Exit the program.
*
* Return value:
*
* None.
*/
void
CloseProgramCB(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
AppPrintData * p = (AppPrintData *) client_data ;
/* we want to wait for the current job to complete before exiting */
/* if a job is running, just unmap the windows and install itself
as endjob callback, which will be called when printed_lines is
back to zero */
if (p->printed_lines) {
/* put up a dialog saying it's waiting for the job
to complete */
XtAddCallback(p->print_shell, XmNendJobCallback, CloseProgramCB, p);
} else {
exit(0);
}
}
static String fallbacks[] = {
"Dtprint.Print*background:white",
"Dtprint.Print*renderTable:-dt-application-bold-r-normal-serif-0-0-0-0-p-0-iso8859-1",
"Dtprint.Print*shadowThickness:0",
"Dtprint.Print*highlightThickness:0",
"Dtprint.Print*pform.marginHeight: 1in",
"Dtprint.Print*pform.marginWidth: 1in",
"Dtprint.Print*ptext.Attachment:attach_form",
NULL
};
/*
* ------------------------------------------------------------------------
* Name: main
*
* Description:
*
* "main" function for the DtPrint demo program.
*
*
*/
int main(int argc, char* argv[])
{
XtAppContext app_context;
VideoShell* video_shell;
MainWindow* main_window;
Display* video_display;
AppPrintData* p;
/*
* attempt to open the X video display
*/
XtSetLanguageProc(NULL, (XtLanguageProc)NULL, NULL);
XtToolkitInitialize();
app_context = XtCreateApplicationContext();
video_display = XtOpenDisplay(app_context, NULL, NULL, APP_CLASS,
XrmOptions, XtNumber(XrmOptions),
&argc, argv);
XtAppSetFallbackResources(app_context, fallbacks);
if(video_display == (Display*)NULL)
{
/*
* parse command line and determine if "GUI-less" printing is
* desired
*/
/*
* XXX exit for now
*/
fprintf(stderr, "unable to open display\n");
return 1;
}
/*
* Create the top level video shell
*/
video_shell = VideoShell_new(video_display);
/*
* one AppPrintData object per app
*/
p = AppPrintData_new();
p->print_only = video_shell->print_only;
/*
* check to see if we're running the app, or just printing (e.g. from
* within a print action)
*/
if(video_shell->print_only)
{
/*
* create the application-specific object, and add it to the
* AppPrintData structure.
*/
p->app_object = AppObject_new((Widget)NULL, video_shell->file_name);
/*
* create the print setup box as the child of the top level shell
*/
CreatePrintSetup(video_shell->widget, p);
/*
* set the cancel button to exit the program
*/
XtAddCallback(p->print_dialog, DtNcancelCallback, CloseProgramCB, p);
/*
* manage the print setup box
*/
XtManageChild(p->print_dialog);
}
else
{
/*
* create the main window
*/
main_window = MainWindow_new(video_shell->widget);
/*
* add callbacks to the main window
*/
XtAddCallback(main_window->print_menu_button, XmNactivateCallback,
PrintMenuCB, p);
p->pr_button = main_window->print_menu_button;
XtAddCallback(main_window->quick_print_button, XmNactivateCallback,
QuickPrintCB, p);
XtAddCallback(main_window->exit_button, XmNactivateCallback,
CloseProgramCB, p);
/*
* create the application-specific object, and add it to the
* AppPrintData structure.
*/
p->app_object =
AppObject_new(main_window->widget, video_shell->file_name);
/*
* manage the main window
*/
XtManageChild(main_window->widget);
}
/*
* main loop
*/
XtRealizeWidget(video_shell->widget);
XtAppMainLoop(app_context);
/*
* we never get here, but this makes the compiler happy
*/
return 0;
}