📄 xprint.c
字号:
}/* * XpFreePage is the routine called by dix:FreeResource to free the page * resource built with the same ID as a page window. It checks to see * if we're in the middle of a page, and if so calls the driver's EndPage * function with 'cancel' set TRUE. It frees the memory associated with * the page resource. */static intXpFreePage(data, id) pointer data; XID id;{ XpPagePtr page = (XpPagePtr)data; int result = Success; WindowPtr pWin = (WindowPtr )LookupIDByType(id, RT_WINDOW); /* Check to see if the window's being deleted in the middle of a page */ if(page->context != (XpContextPtr)NULL && page->context->state & PAGE_STARTED) { XpScreenPtr pPrintScreen = XpScreens[page->context->screenNum]; if(page->context->funcs.EndPage != (int (*)())NULL) result = page->context->funcs.EndPage(page->context, pWin, TRUE); SendXpNotify(page->context, XPEndPageNotify, (int)TRUE); page->context->pageWin = 0; /* None, NULL??? XXX */ } xfree(page); return result;}/* * ContextPrivate machinery. * Context privates are intended for use by the drivers, allowing the * drivers to maintain context-specific data. The driver should free * the associated data at DestroyContext time. */static voidInitContextPrivates(context) XpContextPtr context;{ register char *ptr; DevUnion *ppriv; register unsigned *sizes; register unsigned size; register int i; if (totalContextSize == sizeof(XpContextRec)) ppriv = (DevUnion *)NULL; else ppriv = (DevUnion *)(context + 1); context->devPrivates = ppriv; sizes = contextPrivateSizes; ptr = (char *)(ppriv + contextPrivateLen); for (i = contextPrivateLen; --i >= 0; ppriv++, sizes++) { if ( (size = *sizes) ) { ppriv->ptr = (pointer)ptr; ptr += size; } else ppriv->ptr = (pointer)NULL; }}static voidResetContextPrivates(){ contextPrivateCount = 0; contextPrivateLen = 0; xfree(contextPrivateSizes); contextPrivateSizes = (unsigned *)NULL; totalContextSize = sizeof(XpContextRec);}intXpAllocateContextPrivateIndex(){ return contextPrivateCount++;}BoolXpAllocateContextPrivate(index, amount) int index; unsigned amount;{ unsigned oldamount; if (index >= contextPrivateLen) { unsigned *nsizes; nsizes = (unsigned *)xrealloc(contextPrivateSizes, (index + 1) * sizeof(unsigned)); if (!nsizes) return FALSE; while (contextPrivateLen <= index) { nsizes[contextPrivateLen++] = 0; totalContextSize += sizeof(DevUnion); } contextPrivateSizes = nsizes; } oldamount = contextPrivateSizes[index]; if (amount > oldamount) { contextPrivateSizes[index] = amount; totalContextSize += (amount - oldamount); } return TRUE;}static XpClientPtrAcquireClient(pContext, client) XpContextPtr pContext; ClientPtr client;{ XpClientPtr pXpClient; if((pXpClient = FindClient(pContext, client)) != (XpClientPtr)NULL) return pXpClient; if((pXpClient = CreateXpClient(client)) == (XpClientPtr)NULL) return (XpClientPtr)NULL; pXpClient->context = pContext; pXpClient->pNext = pContext->clientHead; pContext->clientHead = pXpClient; return pXpClient;}static XpClientPtrFindClient(pContext, client) XpContextPtr pContext; ClientPtr client;{ XpClientPtr pXpClient; for(pXpClient = pContext->clientHead; pXpClient != (XpClientPtr)NULL; pXpClient = pXpClient->pNext) { if(pXpClient->client == client) return pXpClient; } return (XpClientPtr)NULL;}/****************************************************************************** * * Start/End Functions: StartJob, EndJob, StartDoc, EndDoc, StartPage, EndPage * ******************************************************************************/static intProcXpStartJob(client) ClientPtr client;{ REQUEST(xPrintStartJobReq); XpContextPtr pContext; int result = Success; XpScreenPtr pPrintScreen; REQUEST_SIZE_MATCH(xPrintStartJobReq); /* Check to see that a context has been established by this client. */ if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr) == (XpContextPtr)NULL) return XpErrorBase+XPBadContext; if(pContext->state != 0) return XpErrorBase+XPBadSequence; if(stuff->saveData != XPSpool && stuff->saveData != XPGetData) { client->errorValue = stuff->saveData; return BadValue; } pPrintScreen = XpScreens[pContext->screenNum]; if(pContext->funcs.StartJob != (int (*)())NULL) result = pContext->funcs.StartJob(pContext, (stuff->saveData == XPGetData)? TRUE:FALSE); else return BadImplementation; pContext->state = JOB_STARTED; if(stuff->saveData == XPGetData) pContext->state |= JOB_GET_DATA; SendXpNotify(pContext, XPStartJobNotify, FALSE); if (client->noClientException != Success) return client->noClientException; else return result;}static intProcXpEndJob(client) ClientPtr client;{ REQUEST(xPrintEndJobReq); XpScreenPtr pPrintScreen; WindowPtr pWin; int result = Success; XpContextPtr pContext; REQUEST_SIZE_MATCH(xPrintEndJobReq); if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr) == (XpContextPtr)NULL) return XpErrorBase+XPBadSequence; pPrintScreen = XpScreens[pContext->screenNum]; if(!(pContext->state & JOB_STARTED)) return XpErrorBase+XPBadSequence; /* Check for missing EndDoc */ if((pContext->state & DOC_RAW_STARTED) || (pContext->state & DOC_COOKED_STARTED)) { if(pContext->state & PAGE_STARTED) { WindowPtr pWin = (WindowPtr )LookupIDByType( pContext->pageWin, RT_WINDOW); XpPagePtr pPage = (XpPagePtr)LookupIDByType( pContext->pageWin, RTpage); if(stuff->cancel != TRUE) return XpErrorBase+XPBadSequence; if(pContext->funcs.EndPage != (int (*)())NULL) result = pContext->funcs.EndPage(pContext, pWin, TRUE); else return BadImplementation; SendXpNotify(pContext, XPEndPageNotify, TRUE); pContext->state &= ~PAGE_STARTED; if(pPage) pPage->context = (XpContextPtr)NULL; if(result != Success) return result; } if(pContext->funcs.EndDoc != (int (*)())NULL) result = pContext->funcs.EndDoc(pContext, stuff->cancel); else return BadImplementation; SendXpNotify(pContext, XPEndDocNotify, stuff->cancel); } if(pContext->funcs.EndJob != (int (*)())NULL) result = pContext->funcs.EndJob(pContext, stuff->cancel); else return BadImplementation; pContext->state = 0; SendXpNotify(pContext, XPEndJobNotify, stuff->cancel); if (client->noClientException != Success) return client->noClientException; else return result;}static BoolDoStartDoc(client, c) ClientPtr client; XpStDocPtr c;{ XpScreenPtr pPrintScreen; int result = Success; XpContextPtr pContext = c->pContext; if(c->pContext->state & JOB_GET_DATA && !(c->pContext->state & GET_DOC_DATA_STARTED)) { if(!c->slept) { c->slept = TRUE; ClientSleep(client, (ClientSleepProcPtr)DoStartDoc, (pointer) c); c->pContext->clientSlept = client; } return TRUE; } pPrintScreen = XpScreens[pContext->screenNum]; if(pContext->funcs.StartDoc != (int (*)())NULL) result = pContext->funcs.StartDoc(pContext, c->type); else { SendErrorToClient(client, XpReqCode, X_PrintStartPage, 0, BadImplementation); return TRUE; } if(c->type == XPDocNormal) pContext->state |= DOC_COOKED_STARTED; else pContext->state |= DOC_RAW_STARTED; SendXpNotify(pContext, XPStartDocNotify, (int)FALSE); xfree(c); return TRUE;}static intProcXpStartDoc(client) ClientPtr client;{ REQUEST(xPrintStartDocReq); XpScreenPtr pPrintScreen; int result = Success; XpContextPtr pContext; XpStDocPtr c; REQUEST_SIZE_MATCH(xPrintStartDocReq); if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr) == (XpContextPtr)NULL) return XpErrorBase+XPBadSequence; if(!(pContext->state & JOB_STARTED) || pContext->state & DOC_RAW_STARTED || pContext->state & DOC_COOKED_STARTED) return XpErrorBase+XPBadSequence; if(stuff->type != XPDocNormal && stuff->type != XPDocRaw) { client->errorValue = stuff->type; return BadValue; } c = (XpStDocPtr)xalloc(sizeof(XpStDocRec)); c->pContext = pContext; c->type = stuff->type; c->slept = FALSE; (void)DoStartDoc(client, c); if (client->noClientException != Success) return client->noClientException; else return result;}static intProcXpEndDoc(client) ClientPtr client;{ REQUEST(xPrintEndDocReq); XpScreenPtr pPrintScreen; XpContextPtr pContext; int result = Success; REQUEST_SIZE_MATCH(xPrintEndDocReq); if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr) == (XpContextPtr)NULL) return XpErrorBase+XPBadSequence; pPrintScreen = XpScreens[pContext->screenNum]; if(!(pContext->state & DOC_RAW_STARTED) && !(pContext->state & DOC_COOKED_STARTED)) return XpErrorBase+XPBadSequence; if(pContext->state & PAGE_STARTED) { if(stuff->cancel == TRUE) { WindowPtr pWin = (WindowPtr )LookupIDByType( pContext->pageWin, RT_WINDOW); XpPagePtr pPage = (XpPagePtr)LookupIDByType( pContext->pageWin, RTpage); if(pContext->funcs.EndPage != (int (*)())NULL) result = pContext->funcs.EndPage(pContext, pWin, TRUE); else return BadImplementation; SendXpNotify(pContext, XPEndPageNotify, TRUE); if(pPage) pPage->context = (XpContextPtr)NULL; } else return XpErrorBase+XPBadSequence; if(result != Success) return result; } if(pContext->funcs.EndDoc != (int (*)())NULL) result = pContext->funcs.EndDoc(pContext, stuff->cancel); else return BadImplementation; pContext->state &= ~DOC_RAW_STARTED; pContext->state &= ~DOC_COOKED_STARTED; SendXpNotify(pContext, XPEndDocNotify, stuff->cancel); if (client->noClientException != Success) return client->noClientException; else return result;}static BoolDoStartPage(client, c) ClientPtr client; XpStPagePtr c;{ XpScreenPtr pPrintScreen; WindowPtr pWin = c->pWin; int result = Success; XpContextPtr pContext = c->pContext; XpPagePtr pPage; if(c->pContext->state & JOB_GET_DATA && !(c->pContext->state & GET_DOC_DATA_STARTED)) { if(!c->slept) { c->slept = TRUE; ClientSleep(client, (ClientSleepProcPtr)DoStartPage, (pointer) c); c->pContext->clientSlept = client; } return TRUE; } if(!(pContext->state & DOC_COOKED_STARTED)) { /* Implied StartDoc if it was omitted */ if(pContext->funcs.StartDoc != (int (*)())NULL) result = pContext->funcs.StartDoc(pContext, XPDocNormal); else { SendErrorToClient(client, XpReqCode, X_PrintStartPage, 0, BadImplementation); return TRUE; } if(result != Success) { SendErrorToClient(client, XpReqCode, X_PrintStartPage, 0, result); return TRUE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -