|
|
1.1 root 1: /******************************* MODULE HEADER *******************************
2: * utils.c
3: * Functions to interface to the help system.
4: *
5: *
6: * Copyright (C) 1993 Microsoft Corporation.
7: *
8: *****************************************************************************/
9:
10: #include <stddef.h>
11: #include <stdlib.h>
12: #include <string.h>
13: #include "pscript.h"
14: #include "dlgdefs.h"
15: #include "help.h"
16: #include "pscrptui.h"
17:
18: /*
19: * Some stuff associated with help.
20: */
21:
22: static WCHAR wcHelpFNM[] = L"\\pscript.hlp";
23:
24: static int cHelpInit = 0; /* Only do it once */
25:
26: static HHOOK hhookGetMsg;
27:
28: /*
29: * Local function prototypes.
30: */
31:
32:
33: LRESULT CALLBACK GetMsgProc( int, WPARAM, LPARAM );
34: LPWSTR GetDriverDirectory(HANDLE);
35:
36:
37: /************************* Function Header *********************************
38: * vHelpInit
39: * Called to initialise the help operations. Not much to do, but er
40: * do keep track of how many times we are called, and only do the
41: * initialisation once, and hence make sure we free it only once.
42: *
43: * RETURNS:
44: * Nothing, failure of help is benign.
45: *
46: * HISTORY:
47: * 13:45 on Wed 24 Feb 1993 -by- Lindsay Harris [lindsayh]
48: * Starting.
49: *
50: ****************************************************************************/
51:
52: void
53: vHelpInit()
54: {
55:
56: /*
57: * All we need to do (and only the first time!) is put a hook function
58: * onto the message queue so that we can intercept the <F1> key and
59: * transform it into a mouse click on the "Help" button. Then the
60: * normal windowing code will display the help contents.
61: */
62:
63: if( cHelpInit == 0 )
64: {
65: /* First time only */
66:
67: hhookGetMsg = SetWindowsHookEx( WH_GETMESSAGE, GetMsgProc, hModule,
68: GetCurrentThreadId() );
69:
70: }
71:
72: ++cHelpInit; /* Only do it once */
73:
74:
75: return;
76: }
77:
78:
79: /************************** Function Header *******************************
80: * vHelpDone
81: * Called to discombobulate help.
82: *
83: * RETURNS:
84: * Nothing.
85: *
86: * HISTORY:
87: * 13:09 on Mon 01 Mar 1993 -by- Lindsay Harris [lindsayh]
88: * Free help file name when done.
89: *
90: * 13:52 on Wed 24 Feb 1993 -by- Lindsay Harris [lindsayh]
91: * First version.
92: *
93: **************************************************************************/
94:
95: void
96: vHelpDone(hWnd)
97: HWND hWnd; /* Required to allow us to clean up nicely */
98: {
99: --cHelpInit;
100:
101: if(cHelpInit == 0)
102: UnhookWindowsHookEx(hhookGetMsg);
103: else if(cHelpInit < 0)
104: cHelpInit = 0; /* Should never happen, but.... */
105:
106: return;
107: }
108:
109: /************************** Function Header *******************************
110: * vShowHelp
111: * Front end to the help facility, basically providing a pop-up if
112: * the help file is not available.
113: *
114: * RETURNS:
115: * Nothing
116: *
117: * HISTORY:
118: * 13:09 on Mon 01 Mar 1993 -by- Lindsay Harris [lindsayh]
119: * Generate the help file name when needed.
120: *
121: * 16:29 on Mon 22 Feb 1993 -by- Lindsay Harris [lindsayh]
122: * First rasddui incarnation, borrowed from printman (AndrewBe).
123: *
124: **************************************************************************/
125:
126: void
127: vShowHelp( hWnd, iType, dwData, hPrinter)
128: HWND hWnd; /* Window of interest */
129: UINT iType; /* Type of help, param #3 to WinHelp */
130: DWORD dwData; /* Additional data for WinHelp, sometimes optional */
131: HANDLE hPrinter;
132: {
133: WCHAR wcbuf1[32];
134: WCHAR wcbuf2[MAX_PATH];
135: LPWSTR pDriverDirectory;
136:
137: /*
138: * Quite easy - simply call the WinHelp function with the parameters
139: * supplied to us. If this fails, then put up a stock dialog box.
140: * BUT the first time we figure out what the file name is. We know
141: * the actual name, but we don't know where it is located, so we
142: * need to call the spooler for that information.
143: */
144:
145: if (!(pDriverDirectory = GetDriverDirectory(hPrinter)))
146: return;
147:
148: wcscpy(wcbuf2, pDriverDirectory);
149: wcscat(wcbuf2, wcHelpFNM ); /* The name */
150:
151: LocalFree(pDriverDirectory);
152:
153: if( !WinHelp( hWnd, wcbuf2, iType, dwData ) )
154: {
155: /* Well, help failed, so at least tell the user! */
156:
157: LoadString(hModule,
158: (IDS_NO_HELP + STRING_BASE),
159: (LPWSTR)wcbuf2,
160: (sizeof(wcbuf2) / sizeof(wcbuf2[0])));
161:
162: LoadString(hModule,
163: (IDS_ERROR + STRING_BASE),
164: (LPWSTR)wcbuf1,
165: (sizeof(wcbuf1) / sizeof(wcbuf1[0])));
166:
167: MessageBox(hWnd, wcbuf2, wcbuf1, MB_DEFBUTTON2 |
168: MB_ICONEXCLAMATION | MB_OK);
169: }
170:
171:
172: return;
173: }
174:
175:
176: /***************************** Function Header ****************************
177: * GetMsgProc
178: * Function to hook F1 key presses and turn them into standard
179: * help type messages.
180: *
181: * RETURNS:
182: * 0 for an F1 key press, else whatever comes back from CallNextHookEx()
183: *
184: * HISTORY:
185: * 13:26 on Wed 24 Feb 1993 -by- Lindsay Harris [lindsayh]
186: * First incarnation here, following a life in printman.c (AndrewBe)
187: *
188: **************************************************************************/
189:
190: LRESULT CALLBACK
191: GetMsgProc( iCode, wParam, lParam )
192: int iCode;
193: WPARAM wParam;
194: LPARAM lParam;
195: {
196:
197: /*
198: * This is the callback routine which hooks F1 keypresses.
199: *
200: * Any such message will be repackaged as a WM_COMMAND/IDD_HELP message
201: * and sent to the top window, which may be the frame window
202: * or a dialog box.
203: *
204: * See the Win32 API programming reference for a description of how this
205: * routine works.
206: *
207: */
208:
209: PMSG pMsg = (PMSG)lParam;
210:
211: if( iCode < 0 )
212: return CallNextHookEx( hhookGetMsg, iCode, wParam, lParam );
213:
214: if( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_F1 )
215: {
216:
217: /* Go looking for the real parent - why? */
218: HWND hwndParent;
219: BOOL bRet;
220:
221:
222: hwndParent = pMsg->hwnd;
223:
224: while( GetWindowLong( hwndParent, GWL_STYLE ) & WS_CHILD )
225: hwndParent = (HWND)GetWindowLong( hwndParent, GWL_HWNDPARENT );
226:
227:
228: /* Our window procs all use the same format for help operations. */
229: bRet = PostMessage( hwndParent, WM_COMMAND, IDD_HELP_BUTTON, 0L );
230: }
231:
232: return 0;
233: }
234:
235:
236: //--------------------------------------------------------------------------
237: // LPWSTR GetDriverDirectory(hPrinter)
238: // HANDLE hPrinter;
239: //
240: // This function returns the directory for the printer driver defined by
241: // hPrinter.
242: //
243: // History:
244: // 20-May-1993 -by- Dave Snipp (davesn)
245: // Wrote it.
246: //--------------------------------------------------------------------------
247:
248: LPWSTR GetDriverDirectory(hPrinter)
249: HANDLE hPrinter;
250: {
251: PPRINTER_INFO_2 pPrinter2;
252: DWORD cb, cb1;
253: LPWSTR pDirectory=NULL;
254: BOOL EveryThingWorked=FALSE;
255:
256: if (!GetPrinter(hPrinter, 2, NULL, 0, &cb) &&
257: GetLastError() == ERROR_INSUFFICIENT_BUFFER)
258: {
259: pPrinter2 = LocalAlloc(LMEM_FIXED, cb);
260:
261: if (pPrinter2)
262: {
263: if (GetPrinter(hPrinter, 2, (LPBYTE)pPrinter2, cb, &cb))
264: {
265: if (!GetPrinterDriverDirectory(pPrinter2->pServerName, NULL,
266: 1, NULL, 0, &cb1) &&
267: GetLastError() == ERROR_INSUFFICIENT_BUFFER)
268: {
269: pDirectory = LocalAlloc(LMEM_FIXED, cb1);
270:
271: if (pDirectory)
272: {
273: if (!GetPrinterDriverDirectory(pPrinter2->pServerName,
274: NULL, 1,
275: (LPBYTE)pDirectory,
276: cb1, &cb1))
277: {
278: LocalFree(pDirectory);
279: pDirectory = NULL;
280: }
281: }
282: }
283: }
284:
285: LocalFree(pPrinter2);
286: }
287: }
288:
289: return(pDirectory);
290: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.