Esempio n. 1
0
static void 
PrintNotifyHandler(
		    Widget w,
		    XtPointer client_data,
		    XEvent *event,
		    Boolean *continue_to_dispatch)
{
    XPPrintEvent * xpev = (XPPrintEvent *) event ;
    XmPrintShellWidget print_shell = (XmPrintShellWidget) w ;
    XmPrintShellCallbackStruct pr_cbs ;
    
    /* don't interfere with the app if it hasn't set any callback.
       (since we set the handler all the time)
       It is probably using it's own handler doing start page, etc */
    if (!print_shell->print.start_job_callback &&
	!print_shell->print.page_setup_callback &&
	!print_shell->print.end_job_callback) return ;

    pr_cbs.event = event;
    pr_cbs.context = xpev->context ;

    switch (xpev->detail) {
    case XPStartJobNotify :
	print_shell->print.last_page = False ;
	pr_cbs.reason = XmCR_START_JOB ;
	pr_cbs.last_page = False ;
	XtCallCallbackList (w, print_shell->print.start_job_callback, 
			    &pr_cbs);
	/* fall thru : call both callbacks if present */
    case XPEndPageNotify :
	/* if last end page, no need to call pagesetup again */
	if (!print_shell->print.last_page) {
	    pr_cbs.reason = XmCR_PAGE_SETUP;
	    pr_cbs.last_page = False ;
	    XtCallCallbackList (w, print_shell->print.page_setup_callback, 
				&pr_cbs);
	    /* on return from pageSetup, save whether or not that was the
	       last page set up by the app */
	    print_shell->print.last_page = pr_cbs.last_page;

	    /* only start a page if a callback is there */
	    if (print_shell->print.page_setup_callback) {
		XpStartPage(XtDisplay(w), XtWindow(w));	
	    }
	}
	break ;
    case XPStartPageNotify :
	if (print_shell->print.page_setup_callback) {
	    XpEndPage(XtDisplay(w));
	    if (print_shell->print.last_page) XpEndJob(XtDisplay(w));
	}
	break ;
    case XPEndJobNotify :
	pr_cbs.reason = XmCR_PAGE_SETUP;
	pr_cbs.last_page = True ;
	XtCallCallbackList (w, print_shell->print.page_setup_callback, 
			    &pr_cbs);
	pr_cbs.reason = XmCR_END_JOB ;
	XtCallCallbackList (w, print_shell->print.end_job_callback, 
			    &pr_cbs);
	break ;
    }
}
Esempio n. 2
0
void CreateWindow(Widget top, Display *pdpy, XPContext pctxt, Screen *scr)
{
	Widget				form, shell, tw;
	FILE				*f;
	static char			buffer[64000];
	Arg				al[20];
	int				ac;
	unsigned short			wid, ht;
	XRectangle			rect;
	Dimension			width, height;
	short				nrows = 80;
	int				nlines = 481, npages, page, i;

	int				save_data = XPGetData;

	/*
	 * Here we are sure that printer name, print display, screen are
	 * initialized, and a print context has been created.
	 */

	if (XpGetPageDimensions(pdpy, pctxt, &wid, &ht, &rect)) {
		fprintf(stderr, "Paper size is %d %d\n", wid, ht);
	} else {
		fprintf(stderr, "test8: failed to get Page Dimensions\n");
		exit(1);
	}

	ac = 0;
	/* Size from paper size */
	XtSetArg(al[ac], XmNheight, ht); ac++;
	XtSetArg(al[ac], XmNwidth, wid); ac++;
	shell = XmPrintSetup(top, scr, "Print", al, ac);

	/* start job must precede XpGetDocumentData in XmPrintToFile */
	fprintf(stderr, "test8: XpStartJob\n");
	XpStartJob(XtDisplay(shell), save_data);

	/* Maintain sequence StartJob - GetDocument */
	XFlush(XtDisplay(shell));

	XmPrintToFile(XtDisplay(shell), "test8.out", FinishPrintToFile, NULL);
	/*
	 * Now we can get the size of the shell, create widgets, etc.
	 */
	XtVaGetValues(shell,
			XmNheight,	&height,
			XmNwidth,	&width,
		NULL);
	/*
	 * Create a text widget as big as the page
	 */
	fprintf(stderr, "test8: XmCreateText(wid %d ht %d)\n",
		width, height);

	ac=0;
	XtSetArg(al[ac], XmNheight, height); ac++;
	XtSetArg(al[ac], XmNwidth, width); ac++;
	form = XmCreateForm(shell, "form", al, ac);
	XtManageChild(form);

	/* Re-use settings from above */
	XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
	XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
	XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
	XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
	XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
	tw = XmCreateText(form, "tw", al, ac);
	XtManageChild(tw);

	/*
	 * Get some data in here - the LGPL text (you probably
	 * need to be in the LessTif source tree for this to work).
	 */
	for (i=0; i<10; i++) {
		f = fopen("COPYING.LIB", "r");
		if (f)
			break;
		chdir("..");
	}
	if (f) {
		fread(buffer, 1, sizeof(buffer), f);
		fclose(f);
	}
	XmTextSetString(tw, buffer);
	XmTextShowPosition(tw, 0);

	fprintf(stderr, "test8: XtRealizeWidget()\n");
	XtRealizeWidget(shell);

	/* Get data to calculate number of pages to print */
	XtVaGetValues(tw,
			XmNrows,		&nrows,
			XmNtotalLines,		&nlines,
		NULL);

	/* Calculate number of pages to print */
	npages = nlines / nrows + 1;

	fprintf(stderr, "Text lines %d rows %d pages %d\n",
		nlines, nrows, npages);

	for (page = 0; page < npages; page++) {
		XpStartPage(XtDisplay(shell), XtWindow(shell));

		fprintf(stderr, "test8: XmRedisplayWidget\n");
		XmRedisplayWidget(tw);	/* works !! */

		/* Calling XmRedisplayWidget() only works for
		 * widgets that have an expose() method. This simple
		 * point is documented in the XmRedisplayWidget docs.
		 * Not so obvious consequence is what to do with other
		 * widgets. It seems to be up to the application
		 * programmer to figure out which widget to use.
		 *
		 * Calling it on a shell or on a form won't work.
		XmRedisplayWidget(shell);
		 */

		XpEndPage(XtDisplay(shell));

		if (XmIsText(tw))
			XmTextScroll(tw, nrows);
	}
	XpEndJob(XtDisplay(shell));
}