source: trunk/include/helpers/winh.h@ 12

Last change on this file since 12 was 7, checked in by umoeller, 25 years ago

Initial checkin of helpers code, which used to be in WarpIN.

  • Property svn:eol-style set to CRLF
  • Property svn:keywords set to Author Date Id Revision
File size: 26.8 KB
Line 
1/* $Id: winh.h 7 2000-10-27 21:27:02Z umoeller $ */
2
3
4/*
5 *@@sourcefile winh.h:
6 * header file for winh.c (PM helper funcs). See remarks there.
7 *
8 * Note: Version numbering in this file relates to XWorkplace version
9 * numbering.
10 */
11
12/* Copyright (C) 1997-2000 Ulrich M”ller.
13 * This file is part of the XWorkplace source package.
14 * XWorkplace is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published
16 * by the Free Software Foundation, in version 2 as it comes in the
17 * "COPYING" file of the XWorkplace main distribution.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 *@@include #define INCL_WINWINDOWMGR
24 *@@include #define INCL_WINMESSAGEMGR
25 *@@include #define INCL_WINSYS // for winhStorePresParam
26 *@@include #define INCL_WINDIALOGS
27 *@@include #define INCL_WINMENUS // for menu helpers
28 *@@include #define INCL_WINENTRYFIELDS // for entry field helpers
29 *@@include #define INCL_WINBUTTONS // for button/check box helpers
30 *@@include #define INCL_WINLISTBOXES // for list box helpers
31 *@@include #define INCL_WINSTDSPIN // for spin button helpers
32 *@@include #define INCL_WINSTDSLIDER // for slider helpers
33 *@@include #define INCL_WININPUT
34 *@@include #define INCL_WINSYS
35 *@@include #define INCL_WINSHELLDATA
36 *@@include #define INCL_WINPROGRAMLIST // for winhStartApp
37 *@@include #define INCL_WINHELP // for help manager helpers
38 *@@include #include <os2.h>
39 *@@include #include "winh.h"
40 */
41
42#if __cplusplus
43extern "C" {
44#endif
45
46#ifndef WINH_HEADER_INCLUDED
47 #define WINH_HEADER_INCLUDED
48
49 /* ******************************************************************
50 * *
51 * Declarations *
52 * *
53 ********************************************************************/
54
55 #define MPNULL (MPFROMP(NULL))
56 #define MPZERO (MPFROMSHORT(0))
57 #define MRTRUE (MRFROMSHORT((SHORT) TRUE))
58 #define MRFALSE (MRFROMSHORT((SHORT) FALSE))
59 #define BM_UNCHECKED 0 // for checkboxes: disabled
60 #define BM_CHECKED 1 // for checkboses: enabled
61 #define BM_INDETERMINATE 2 // for tri-state checkboxes: indeterminate
62
63 /* ******************************************************************
64 * *
65 * Macros *
66 * *
67 ********************************************************************/
68
69 /*
70 * Here come some monster macros for
71 * frequently needed functions.
72 */
73
74 #define winhDebugBox(hwndOwner, title, text) \
75 WinMessageBox(HWND_DESKTOP, hwndOwner, ((PSZ)text), ((PSZ)title), 0, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE)
76
77 #define winhYesNoBox(title, text) \
78 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, ((PSZ)text), ((PSZ)title), 0, MB_YESNO | MB_ICONQUESTION | MB_MOVEABLE)
79
80 #define winhSetDlgItemChecked(hwnd, id, bCheck) \
81 WinSendDlgItemMsg((hwnd), (id), BM_SETCHECK, MPFROMSHORT(bCheck), MPNULL)
82
83 #define winhIsDlgItemChecked(hwnd, id) \
84 (SHORT1FROMMR(WinSendDlgItemMsg((hwnd), (id), BM_QUERYCHECK, MPNULL, MPNULL)))
85
86 #define winhSetMenuItemChecked(hwndMenu, usId, bCheck) \
87 WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(usId, TRUE), \
88 MPFROM2SHORT(MIA_CHECKED, (((bCheck)) ? MIA_CHECKED : FALSE)))
89
90 #define winhShowDlgItem(hwnd, id, show) \
91 WinShowWindow(WinWindowFromID(hwnd, id), show)
92
93 #define winhEnableDlgItem(hwndDlg, ulId, Enable) \
94 WinEnableWindow(WinWindowFromID(hwndDlg, ulId), Enable)
95
96 #define winhIsDlgItemEnabled(hwndDlg, ulId) \
97 WinIsWindowEnabled(WinWindowFromID(hwndDlg, ulId))
98
99 #define winhSetDlgItemFocus(hwndDlg, ulId) \
100 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwndDlg, ulId))
101
102 /* ******************************************************************
103 * *
104 * Menu helpers *
105 * *
106 ********************************************************************/
107
108 /*
109 * winhCreateEmptyMenu:
110 * this macro creates an empty menu, which can
111 * be used with winhInsertMenuItem etc. later.
112 * Useful for creating popup menus on the fly.
113 * Note that even though HWND_DESKTOP is specified
114 * here as both the parent and the owner, the
115 * actual owner and parent are specified later
116 * with WinPopupMenu.
117 */
118
119 #define winhCreateEmptyMenu() \
120 WinCreateWindow(HWND_DESKTOP, WC_MENU, "", 0, 0, 0, 0, 0, \
121 HWND_DESKTOP, HWND_TOP, 0, 0, 0)
122
123 SHORT winhInsertMenuItem(HWND hwndMenu,
124 SHORT iPosition,
125 SHORT sItemId,
126 PSZ pszItemTitle,
127 SHORT afStyle,
128 SHORT afAttr);
129
130 HWND winhInsertSubmenu(HWND hwndMenu,
131 ULONG iPosition,
132 SHORT sMenuId,
133 PSZ pszSubmenuTitle,
134 USHORT afMenuStyle,
135 SHORT sItemId,
136 PSZ pszItemTitle,
137 USHORT afItemStyle,
138 USHORT afAttribute);
139
140 /*
141 *@@ winhRemoveMenuItem:
142 * removes a menu item (SHORT) from the
143 * given menu (HWND). Returns the no. of
144 * remaining menu items (SHORT).
145 *
146 * This works for whole submenus too.
147 */
148
149 #define winhRemoveMenuItem(hwndMenu, sItemId) \
150 (SHORT)WinSendMsg(hwndMenu, MM_REMOVEITEM, MPFROM2SHORT(sItemId, FALSE), 0)
151
152 /*
153 *@@ winhDeleteMenuItem:
154 * deleted a menu item (SHORT) from the
155 * given menu (HWND). Returns the no. of
156 * remaining menu items (SHORT).
157 *
158 * As opposed to MM_REMOVEITEM, MM_DELETEITEM
159 * frees submenus and bitmaps also.
160 *
161 * This works for whole submenus too.
162 */
163
164 #define winhDeleteMenuItem(hwndMenu, sItemId) \
165 (SHORT)WinSendMsg(hwndMenu, MM_DELETEITEM, MPFROM2SHORT(sItemId, FALSE), 0)
166
167 SHORT winhInsertMenuSeparator(HWND hMenu,
168 SHORT iPosition,
169 SHORT sId);
170
171 PSZ winhQueryMenuItemText(HWND hwndMenu,
172 USHORT usItemID);
173
174 BOOL winhAppend2MenuItemText(HWND hwndMenu,
175 USHORT usItemID,
176 const char *pcszAppend,
177 BOOL fTab);
178
179 VOID winhMenuRemoveEllipse(HWND hwndMenu,
180 USHORT usItemId);
181
182 SHORT winhQueryItemUnderMouse(HWND hwndMenu, POINTL *pptlMouse, RECTL *prtlItem);
183
184 /* ******************************************************************
185 * *
186 * Slider helpers *
187 * *
188 ********************************************************************/
189
190 HWND winhReplaceWithLinearSlider(HWND hwndParent,
191 HWND hwndOwner,
192 HWND hwndInsertAfter,
193 ULONG ulID,
194 ULONG ulSliderStyle,
195 ULONG ulTickCount);
196
197 BOOL winhSetSliderTicks(HWND hwndSlider,
198 MPARAM mpEveryOther,
199 ULONG ulPixels);
200
201 /*
202 * winhSetSliderArmPosition:
203 * this moves the slider arm in a given
204 * linear slider.
205 *
206 * usMode can be one of the following:
207 * -- SMA_RANGEVALUE: usOffset is in pixels
208 * from the slider's home position.
209 * -- SMA_INCREMENTVALUE: usOffset is in
210 * units of the slider's primary scale.
211 */
212
213 #define winhSetSliderArmPosition(hwndSlider, usMode, usOffset) \
214 WinSendMsg(hwndSlider, SLM_SETSLIDERINFO, \
215 MPFROM2SHORT(SMA_SLIDERARMPOSITION, \
216 usMode), \
217 MPFROMSHORT(usOffset))
218
219 /*
220 * winhQuerySliderArmPosition:
221 * reverse to the previous, this returns a
222 * slider arm position (as a LONG value).
223 */
224
225 #define winhQuerySliderArmPosition(hwndSlider, usMode) \
226 (LONG)(WinSendMsg(hwndSlider, \
227 SLM_QUERYSLIDERINFO, \
228 MPFROM2SHORT(SMA_SLIDERARMPOSITION, \
229 usMode), \
230 0))
231
232 HWND winhReplaceWithCircularSlider(HWND hwndParent,
233 HWND hwndOwner,
234 HWND hwndInsertAfter,
235 ULONG ulID,
236 ULONG ulSliderStyle,
237 SHORT sMin,
238 SHORT sMax,
239 USHORT usIncrement,
240 USHORT usTicksEvery);
241
242 /* ******************************************************************
243 * *
244 * Spin button helpers *
245 * *
246 ********************************************************************/
247
248 VOID winhSetDlgItemSpinData(HWND hwndDlg,
249 ULONG idSpinButton,
250 ULONG min,
251 ULONG max,
252 ULONG current);
253
254 LONG winhAdjustDlgItemSpinData(HWND hwndDlg,
255 USHORT usItemID,
256 LONG lGrid,
257 USHORT usNotifyCode);
258
259 /* ******************************************************************
260 * *
261 * Entry field helpers *
262 * *
263 ********************************************************************/
264
265 /*
266 * winhSetEntryFieldLimit:
267 * sets the maximum length for the entry field
268 * (EM_SETTEXTLIMIT message).
269 *
270 * PMREF doesn't say this, but the limit does
271 * _not_ include the null-terminator. That is,
272 * if you specify "12" characters here, you can
273 * really enter 12 characters.
274 *
275 * The default length is 30 characters, I think.
276 */
277
278 #define winhSetEntryFieldLimit(hwndEntryField, usLength) \
279 WinSendMsg(hwndEntryField, EM_SETTEXTLIMIT, (MPARAM)(usLength), (MPARAM)0)
280
281 /*
282 *@@ winhEntryFieldSelectAll:
283 * this selects the entire text in the entry field.
284 * Useful when the thing gets the focus.
285 */
286
287 #define winhEntryFieldSelectAll(hwndEntryField) \
288 WinSendMsg(hwndEntryField, EM_SETSEL, MPFROM2SHORT(0, 10000), MPNULL)
289
290 /*
291 *@@ winhHasEntryFieldChanged:
292 * this queries whether the entry field's contents
293 * have changed (EM_QUERYCHANGED message).
294 *
295 * This returns TRUE if changes have occured since
296 * the last time this message or WM_QUERYWINDOWPARAMS
297 * (WinQueryWindowText) was received.
298 */
299
300 #define winhHasEntryFieldChanged(hwndEntryField) \
301 (BOOL)WinSendMsg(hwndEntryField, EM_QUERYCHANGED, (MPARAM)0, (MPARAM)0)
302
303 /* ******************************************************************
304 * *
305 * List box helpers *
306 * *
307 ********************************************************************/
308
309 /*
310 *@@ winhQueryLboxItemCount:
311 * returns the no. of items in the listbox
312 * as a SHORT.
313 *
314 *@@added V0.9.1 (99-12-14) [umoeller]
315 */
316
317 #define winhQueryLboxItemCount(hwndListBox) \
318 (SHORT)WinSendMsg(hwndListBox, LM_QUERYITEMCOUNT, 0, 0)
319
320 /*
321 *@@ winhDeleteAllItems:
322 * deletes all list box items. Returns
323 * a BOOL.
324 *
325 *@@added V0.9.1 (99-12-14) [umoeller]
326 */
327
328 #define winhDeleteAllItems(hwndListBox) \
329 (BOOL)WinSendMsg(hwndListBox, \
330 LM_DELETEALL, 0, 0)
331 /*
332 *@@ winhQueryLboxSelectedItem:
333 * this queries the next selected list box item.
334 * For the first call, set sItemStart to LIT_FIRST;
335 * then repeat the call with sItemStart set to
336 * the previous return value until this returns
337 * LIT_NONE.
338 *
339 * Example:
340 + SHORT sItemStart = LIT_FIRST;
341 + while (TRUE)
342 + {
343 + sItemStart = winhQueryLboxSelectedItem(hwndListBox,
344 + sItemStart)
345 + if (sItemStart == LIT_NONE)
346 + break;
347 + ...
348 + }
349 *
350 * To have the cursored item returned, use LIT_CURSOR.
351 */
352
353 #define winhQueryLboxSelectedItem(hwndListBox, sItemStart) \
354 (SHORT)(WinSendMsg(hwndListBox, \
355 LM_QUERYSELECTION, \
356 (MPARAM)(sItemStart), \
357 MPNULL))
358
359 /*
360 *@@ winhSetLboxSelectedItem:
361 * selects a list box item.
362 * This works for both single-selection and
363 * multiple-selection listboxes.
364 * In single-selection listboxes, if an item
365 * is selected (fSelect == TRUE), the previous
366 * item is automatically deselected.
367 * Note that (BOOL)fSelect is ignored if
368 * sItemIndex == LIT_NONE.
369 */
370
371 #define winhSetLboxSelectedItem(hwndListBox, sItemIndex, fSelect) \
372 (BOOL)(WinSendMsg(hwndListBox, \
373 LM_SELECTITEM, \
374 (MPARAM)(sItemIndex), \
375 (MPARAM)(fSelect)))
376
377 ULONG winhLboxSelectAll(HWND hwndListBox,
378 BOOL fSelect);
379
380 /*
381 * winhSetLboxItemHandle:
382 * sets the "item handle" for the specified sItemIndex.
383 * See LM_SETITEMHANDLE in PMREF for details.
384 */
385
386 #define winhSetLboxItemHandle(hwndListBox, sItemIndex, ulHandle) \
387 (BOOL)(WinSendMsg(hwndListBox, LM_SETITEMHANDLE, \
388 (MPARAM)(sItemIndex), \
389 (MPARAM)ulHandle))
390
391 /*
392 * winhQueryLboxItemHandle:
393 * the reverse to the previous. Returns a ULONG.
394 */
395
396 #define winhQueryLboxItemHandle(hwndListBox, sItemIndex) \
397 (ULONG)WinSendMsg(hwndListBox, LM_QUERYITEMHANDLE, \
398 MPFROMSHORT(sItemIndex), (MPARAM)NULL)
399
400 PSZ winhQueryLboxItemText(HWND hwndListbox,
401 SHORT sIndex);
402
403 BOOL winhMoveLboxItem(HWND hwndSource,
404 SHORT sSourceIndex,
405 HWND hwndTarget,
406 SHORT sTargetIndex,
407 BOOL fSelectTarget);
408
409 /* ******************************************************************
410 * *
411 * Scroll bar helpers *
412 * *
413 ********************************************************************/
414
415 BOOL winhUpdateScrollBar(HWND hwndScrollBar,
416 ULONG ulWinPels,
417 ULONG ulViewportPels,
418 ULONG ulCurUnitOfs,
419 BOOL fAutoHide);
420
421 BOOL winhHandleScrollMsg(HWND hwnd2Scroll,
422 HWND hwndScrollBar,
423 PLONG plCurUnitOfs,
424 PRECTL prcl2Scroll,
425 LONG ulViewportPels,
426 USHORT usLineStepUnits,
427 ULONG msg,
428 MPARAM mp2);
429
430 BOOL winhProcessScrollChars(HWND hwndClient,
431 HWND hwndVScroll,
432 HWND hwndHScroll,
433 MPARAM mp1,
434 MPARAM mp2,
435 ULONG ulVertMax,
436 ULONG ulHorzMax);
437
438 /* ******************************************************************
439 * *
440 * Window positioning helpers *
441 * *
442 ********************************************************************/
443
444 BOOL winhSaveWindowPos(HWND hwnd,
445 HINI hIni,
446 PSZ pszApp,
447 PSZ pszKey);
448
449 BOOL winhRestoreWindowPos(HWND hwnd,
450 HINI hIni,
451 PSZ pszApp,
452 PSZ pszKey,
453 ULONG fl);
454
455 #define XAC_MOVEX 0x0001
456 #define XAC_MOVEY 0x0002
457 #define XAC_SIZEX 0x0004
458 #define XAC_SIZEY 0x0008
459
460 /*
461 *@@ XADJUSTCTRLS:
462 *
463 */
464
465 typedef struct _XADJUSTCTRLS
466 {
467 BOOL fInitialized;
468 SWP swpMain; // SWP for main window
469 SWP *paswp; // pointer to array of control SWP structs
470 } XADJUSTCTRLS, *PXADJUSTCTRLS;
471
472 BOOL winhAdjustControls(HWND hwndDlg,
473 MPARAM *pmpFlags,
474 ULONG ulCount,
475 PSWP pswpNew,
476 PXADJUSTCTRLS pxac);
477
478 void winhCenterWindow(HWND hwnd);
479
480 /* ******************************************************************
481 * *
482 * Presparams helpers *
483 * *
484 ********************************************************************/
485
486 PSZ winhQueryWindowFont(HWND hwnd);
487
488 BOOL winhSetWindowFont(HWND hwnd,
489 PSZ pszFont);
490
491 /*
492 *@@ winhSetDlgItemFont:
493 * invokes winhSetWindowFont on a dialog
494 * item.
495 *
496 * Returns TRUE if successful or FALSE otherwise.
497 *
498 *@@added V0.9.0
499 */
500
501 #define winhSetDlgItemFont(hwnd, usId, pszFont) \
502 (winhSetWindowFont(WinWindowFromID(hwnd, usId), pszFont))
503
504 ULONG winhSetControlsFont(HWND hwndDlg,
505 SHORT usIDMin,
506 SHORT usIDMax,
507 const char *pcszFont);
508
509 #ifdef INCL_WINSYS
510 BOOL winhStorePresParam(PPRESPARAMS *pppp,
511 ULONG ulAttrType,
512 ULONG cbData,
513 PVOID pData);
514 #endif
515
516 LONG winhQueryPresColor(HWND hwnd,
517 ULONG ulPP,
518 BOOL fInherit,
519 LONG lSysColor);
520
521 /* ******************************************************************
522 * *
523 * Help instance helpers *
524 * *
525 ********************************************************************/
526
527 #ifdef INCL_WINHELP
528 HWND winhCreateHelp(HWND hwndFrame,
529 PSZ pszFileName,
530 HMODULE hmod,
531 PHELPTABLE pHelpTable,
532 PSZ pszWindowTitle);
533
534 void winhDestroyHelp(HWND hwndHelp,
535 HWND hwndFrame);
536 #endif
537
538 /* ******************************************************************
539 *
540 * Application control
541 *
542 ********************************************************************/
543
544 #ifdef INCL_WINPROGRAMLIST
545 HAPP winhStartApp(HWND hwndNotify,
546 const PROGDETAILS *pcProgDetails);
547 #endif
548
549 BOOL winhAnotherInstance(PSZ pszSemName,
550 BOOL fSwitch);
551
552 HSWITCH winhAddToTasklist(HWND hwnd,
553 HPOINTER hIcon);
554
555 /* ******************************************************************
556 * *
557 * Miscellaneous *
558 * *
559 ********************************************************************/
560
561 VOID winhSleep(HAB hab,
562 ULONG ulSleep);
563
564 #define WINH_FOD_SAVEDLG 0x0001
565 #define WINH_FOD_INILOADDIR 0x0010
566 #define WINH_FOD_INISAVEDIR 0x0020
567
568 BOOL winhFileDlg(HWND hwndOwner,
569 PSZ pszFile,
570 ULONG flFlags,
571 HINI hini,
572 PSZ pszApplication,
573 PSZ pszKey);
574
575 HPOINTER winhSetWaitPointer(VOID);
576
577 PSZ winhQueryWindowText(HWND hwnd);
578
579 /*
580 *@@ winhQueryDlgItemText:
581 * like winhQueryWindowText, but for the dialog item
582 * in hwnd which has the ID usItemID.
583 */
584
585 #define winhQueryDlgItemText(hwnd, usItemID) winhQueryWindowText(WinWindowFromID(hwnd, usItemID))
586
587 BOOL winhReplaceWindowText(HWND hwnd,
588 PSZ pszSearch,
589 PSZ pszReplaceWith);
590
591 ULONG winhCenteredDlgBox(HWND hwndParent, HWND hwndOwner,
592 PFNWP pfnDlgProc, HMODULE hmod, ULONG idDlg, PVOID pCreateParams);
593
594 ULONG winhEnableControls(HWND hwndDlg,
595 USHORT usIDFirst,
596 USHORT usIDLast,
597 BOOL fEnable);
598
599 HWND winhCreateStdWindow(HWND hwndFrameParent,
600 PSWP pswpFrame,
601 ULONG flFrameCreateFlags,
602 ULONG ulFrameStyle,
603 PSZ pszFrameTitle,
604 ULONG ulResourcesID,
605 PSZ pszClassClient,
606 ULONG flStyleClient,
607 ULONG ulID,
608 PVOID pClientCtlData,
609 PHWND phwndClient);
610
611 /*
612 *@@ winhCreateObjectWindow:
613 * creates an object window of the specified
614 * window class, which you should have registered
615 * before calling this. pvCreateParam will be
616 * given to the window on WM_CREATE.
617 *
618 * Returns the HWND of the object window or
619 * NULLHANDLE on errors.
620 *
621 *@@added V0.9.3 (2000-04-17) [umoeller]
622 */
623
624 #define winhCreateObjectWindow(pcszWindowClass, pvCreateParam) \
625 WinCreateWindow(HWND_OBJECT, pcszWindowClass, \
626 (PSZ)"", 0, 0,0,0,0, 0, HWND_BOTTOM, 0, pvCreateParam, NULL)
627
628 VOID winhRepaintWindows(HWND hwndParent);
629
630 HMQ winhFindMsgQueue(PID pid,
631 TID tid,
632 HAB* phab);
633
634 VOID winhFindPMErrorWindows(HWND *phwndHardError,
635 HWND *phwndSysError);
636
637 HWND winhCreateFakeDesktop(HWND hwndSibling);
638
639 BOOL winhAssertWarp4Notebook(HWND hwndDlg,
640 USHORT usIdThreshold,
641 ULONG ulDownUnits);
642
643 ULONG winhDrawFormattedText(HPS hps, PRECTL prcl, PSZ pszText, ULONG flCmd);
644
645 VOID winhKillTasklist(VOID);
646
647 ULONG winhQueryPendingSpoolJobs(VOID);
648
649 VOID winhSetNumLock(BOOL fState);
650
651 /*
652 *@@ winhQueryScreenCX:
653 * helper macro for getting the screen width.
654 */
655
656 #define winhQueryScreenCX() (WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN))
657
658 /*
659 *@@ winhQueryScreenCY:
660 * helper macro for getting the screen height.
661 */
662
663 #define winhQueryScreenCY() (WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN))
664
665 /* ******************************************************************
666 * *
667 * WPS Class List helpers *
668 * *
669 ********************************************************************/
670
671 PBYTE winhQueryWPSClassList(VOID);
672
673 PBYTE winhQueryWPSClass(PBYTE pObjClass,
674 const char *pszClass);
675
676 APIRET winhRegisterClass(const char* pcszClassName,
677 const char* pcszModule,
678 PSZ pszBuf,
679 ULONG cbBuf);
680
681 BOOL winhIsClassRegistered(const char *pcszClass);
682
683 ULONG winhResetWPS(HAB hab);
684#endif
685
686#if __cplusplus
687}
688#endif
689
Note: See TracBrowser for help on using the repository browser.