1 #include <process.h>
2 #define INCL_DOS
3 #define INCL_DOSERRORS
4 #define INCL_DOSNLS
5 #define INCL_WINSWITCHLIST
6 #define INCL_WINWINDOWMGR
7 #define INCL_WININPUT
8 #define INCL_VIO
9 #define INCL_KBD
10 #define INCL_WINCLIPBOARD
11 #define INCL_WINATOM
12 #include <os2.h>
13 
14 #include "EXTERN.h"
15 #include "perl.h"
16 #include "XSUB.h"
17 
18 static unsigned long
constant(char * name,int arg)19 constant(char *name, int arg)
20 {
21     errno = 0;
22     if (name[0] == 'P' && name[1] == '_') {
23 	if (strEQ(name, "P_BACKGROUND"))
24 #ifdef P_BACKGROUND
25 	    return P_BACKGROUND;
26 #else
27 	    goto not_there;
28 #endif
29 	if (strEQ(name, "P_DEBUG"))
30 #ifdef P_DEBUG
31 	    return P_DEBUG;
32 #else
33 	    goto not_there;
34 #endif
35 	if (strEQ(name, "P_DEFAULT"))
36 #ifdef P_DEFAULT
37 	    return P_DEFAULT;
38 #else
39 	    goto not_there;
40 #endif
41 	if (strEQ(name, "P_DETACH"))
42 #ifdef P_DETACH
43 	    return P_DETACH;
44 #else
45 	    goto not_there;
46 #endif
47 	if (strEQ(name, "P_FOREGROUND"))
48 #ifdef P_FOREGROUND
49 	    return P_FOREGROUND;
50 #else
51 	    goto not_there;
52 #endif
53 	if (strEQ(name, "P_FULLSCREEN"))
54 #ifdef P_FULLSCREEN
55 	    return P_FULLSCREEN;
56 #else
57 	    goto not_there;
58 #endif
59 	if (strEQ(name, "P_MAXIMIZE"))
60 #ifdef P_MAXIMIZE
61 	    return P_MAXIMIZE;
62 #else
63 	    goto not_there;
64 #endif
65 	if (strEQ(name, "P_MINIMIZE"))
66 #ifdef P_MINIMIZE
67 	    return P_MINIMIZE;
68 #else
69 	    goto not_there;
70 #endif
71 	if (strEQ(name, "P_NOCLOSE"))
72 #ifdef P_NOCLOSE
73 	    return P_NOCLOSE;
74 #else
75 	    goto not_there;
76 #endif
77 	if (strEQ(name, "P_NOSESSION"))
78 #ifdef P_NOSESSION
79 	    return P_NOSESSION;
80 #else
81 	    goto not_there;
82 #endif
83 	if (strEQ(name, "P_NOWAIT"))
84 #ifdef P_NOWAIT
85 	    return P_NOWAIT;
86 #else
87 	    goto not_there;
88 #endif
89 	if (strEQ(name, "P_OVERLAY"))
90 #ifdef P_OVERLAY
91 	    return P_OVERLAY;
92 #else
93 	    goto not_there;
94 #endif
95 	if (strEQ(name, "P_PM"))
96 #ifdef P_PM
97 	    return P_PM;
98 #else
99 	    goto not_there;
100 #endif
101 	if (strEQ(name, "P_QUOTE"))
102 #ifdef P_QUOTE
103 	    return P_QUOTE;
104 #else
105 	    goto not_there;
106 #endif
107 	if (strEQ(name, "P_SESSION"))
108 #ifdef P_SESSION
109 	    return P_SESSION;
110 #else
111 	    goto not_there;
112 #endif
113 	if (strEQ(name, "P_TILDE"))
114 #ifdef P_TILDE
115 	    return P_TILDE;
116 #else
117 	    goto not_there;
118 #endif
119 	if (strEQ(name, "P_UNRELATED"))
120 #ifdef P_UNRELATED
121 	    return P_UNRELATED;
122 #else
123 	    goto not_there;
124 #endif
125 	if (strEQ(name, "P_WAIT"))
126 #ifdef P_WAIT
127 	    return P_WAIT;
128 #else
129 	    goto not_there;
130 #endif
131 	if (strEQ(name, "P_WINDOWED"))
132 #ifdef P_WINDOWED
133 	    return P_WINDOWED;
134 #else
135 	    goto not_there;
136 #endif
137     } else if (name[0] == 'T' && name[1] == '_') {
138 	if (strEQ(name, "FAPPTYP_NOTSPEC"))
139 #ifdef FAPPTYP_NOTSPEC
140 	    return FAPPTYP_NOTSPEC;
141 #else
142 	    goto not_there;
143 #endif
144 	if (strEQ(name, "T_NOTWINDOWCOMPAT"))
145 #ifdef FAPPTYP_NOTWINDOWCOMPAT
146 	    return FAPPTYP_NOTWINDOWCOMPAT;
147 #else
148 	    goto not_there;
149 #endif
150 	if (strEQ(name, "T_WINDOWCOMPAT"))
151 #ifdef FAPPTYP_WINDOWCOMPAT
152 	    return FAPPTYP_WINDOWCOMPAT;
153 #else
154 	    goto not_there;
155 #endif
156 	if (strEQ(name, "T_WINDOWAPI"))
157 #ifdef FAPPTYP_WINDOWAPI
158 	    return FAPPTYP_WINDOWAPI;
159 #else
160 	    goto not_there;
161 #endif
162 	if (strEQ(name, "T_BOUND"))
163 #ifdef FAPPTYP_BOUND
164 	    return FAPPTYP_BOUND;
165 #else
166 	    goto not_there;
167 #endif
168 	if (strEQ(name, "T_DLL"))
169 #ifdef FAPPTYP_DLL
170 	    return FAPPTYP_DLL;
171 #else
172 	    goto not_there;
173 #endif
174 	if (strEQ(name, "T_DOS"))
175 #ifdef FAPPTYP_DOS
176 	    return FAPPTYP_DOS;
177 #else
178 	    goto not_there;
179 #endif
180 	if (strEQ(name, "T_PHYSDRV"))
181 #ifdef FAPPTYP_PHYSDRV
182 	    return FAPPTYP_PHYSDRV;
183 #else
184 	    goto not_there;
185 #endif
186 	if (strEQ(name, "T_VIRTDRV"))
187 #ifdef FAPPTYP_VIRTDRV
188 	    return FAPPTYP_VIRTDRV;
189 #else
190 	    goto not_there;
191 #endif
192 	if (strEQ(name, "T_PROTDLL"))
193 #ifdef FAPPTYP_PROTDLL
194 	    return FAPPTYP_PROTDLL;
195 #else
196 	    goto not_there;
197 #endif
198 	if (strEQ(name, "T_32BIT"))
199 #ifdef FAPPTYP_32BIT
200 	    return FAPPTYP_32BIT;
201 #else
202 	    goto not_there;
203 #endif
204     }
205 
206     errno = EINVAL;
207     return 0;
208 
209 not_there:
210     errno = ENOENT;
211     return 0;
212 }
213 
214 const char* const ptypes[] = { "FS", "DOS", "VIO", "PM", "DETACH" };
215 
216 static char *
my_type()217 my_type()
218 {
219     int rc;
220     TIB *tib;
221     PIB *pib;
222 
223     if (!(_emx_env & 0x200)) return (char*)ptypes[1]; /* not OS/2. */
224     if (CheckOSError(DosGetInfoBlocks(&tib, &pib)))
225 	return NULL;
226 
227     return (pib->pib_ultype <= 4 ? (char*)ptypes[pib->pib_ultype] : "UNKNOWN");
228 }
229 
230 static ULONG
file_type(char * path)231 file_type(char *path)
232 {
233     int rc;
234     ULONG apptype;
235 
236     if (!(_emx_env & 0x200))
237 	croak("file_type not implemented on DOS"); /* not OS/2. */
238     if (CheckOSError(DosQueryAppType(path, &apptype))) {
239 #if 0
240 	if (rc == ERROR_INVALID_EXE_SIGNATURE)
241 	    croak("Invalid EXE signature");
242 	else if (rc == ERROR_EXE_MARKED_INVALID) {
243 	    croak("EXE marked invalid");
244 	}
245 #endif
246 	croak_with_os2error("DosQueryAppType");
247     }
248 
249     return apptype;
250 }
251 
252 /* These use different type of wrapper.  Good to check wrappers. ;-)  */
253 /* XXXX This assumes DOS type return type, without SEVERITY?! */
254 DeclFuncByORD(HSWITCH, myWinQuerySwitchHandle,  ORD_WinQuerySwitchHandle,
255 		  (HWND hwnd, PID pid), (hwnd, pid))
256 DeclFuncByORD(ULONG, myWinQuerySwitchEntry,  ORD_WinQuerySwitchEntry,
257 		  (HSWITCH hsw, PSWCNTRL pswctl), (hsw, pswctl))
258 DeclFuncByORD(ULONG, myWinSetWindowText,  ORD_WinSetWindowText,
259 		  (HWND hwnd, char* text), (hwnd, text))
260 DeclFuncByORD(BOOL, myWinQueryWindowProcess,  ORD_WinQueryWindowProcess,
261 		  (HWND hwnd, PPID ppid, PTID ptid), (hwnd, ppid, ptid))
262 DeclFuncByORD(ULONG, XmyWinSwitchToProgram,  ORD_WinSwitchToProgram,
263 		  (HSWITCH hsw), (hsw))
264 #define myWinSwitchToProgram(hsw) (!CheckOSError(XmyWinSwitchToProgram(hsw)))
265 
266 
267 /* These function croak if the return value is 0. */
268 DeclWinFunc_CACHE(HWND, QueryWindow, (HWND hwnd, LONG cmd), (hwnd, cmd))
269 DeclWinFunc_CACHE(BOOL, QueryWindowPos, (HWND hwnd, PSWP pswp),
270 		  (hwnd, pswp))
271 DeclWinFunc_CACHE(LONG, QueryWindowText,
272 		  (HWND hwnd, LONG cchBufferMax, PCH pchBuffer),
273 		  (hwnd, cchBufferMax, pchBuffer))
274 DeclWinFunc_CACHE(LONG, QueryClassName, (HWND hwnd, LONG cchMax, PCH pch),
275 		  (hwnd, cchMax, pch))
276 DeclWinFunc_CACHE(HWND, QueryFocus, (HWND hwndDesktop), (hwndDesktop))
277 DeclWinFunc_CACHE(BOOL, SetFocus, (HWND hwndDesktop, HWND hwndFocus),
278 		  (hwndDesktop, hwndFocus))
279 DeclWinFunc_CACHE(BOOL, ShowWindow, (HWND hwnd, BOOL fShow), (hwnd, fShow))
280 DeclWinFunc_CACHE(BOOL, EnableWindow, (HWND hwnd, BOOL fEnable),
281 		      (hwnd, fEnable))
282 DeclWinFunc_CACHE(BOOL, SetWindowPos,
283 		  (HWND hwnd, HWND hwndInsertBehind, LONG x, LONG y,
284 		   LONG cx, LONG cy, ULONG fl),
285 		  (hwnd, hwndInsertBehind, x, y, cx, cy, fl))
286 DeclWinFunc_CACHE(HENUM, BeginEnumWindows, (HWND hwnd), (hwnd))
287 DeclWinFunc_CACHE(BOOL, EndEnumWindows, (HENUM henum), (henum))
288 DeclWinFunc_CACHE(BOOL, EnableWindowUpdate, (HWND hwnd, BOOL fEnable),
289 		  (hwnd, fEnable))
290 DeclWinFunc_CACHE(BOOL, SetWindowBits,
291 		  (HWND hwnd, LONG index, ULONG flData, ULONG flMask),
292 		  (hwnd, index, flData, flMask))
293 DeclWinFunc_CACHE(BOOL, SetWindowPtr, (HWND hwnd, LONG index, PVOID p),
294 		  (hwnd, index, p))
295 DeclWinFunc_CACHE(BOOL, SetWindowULong, (HWND hwnd, LONG index, ULONG ul),
296 		  (hwnd, index, ul))
297 DeclWinFunc_CACHE(BOOL, SetWindowUShort, (HWND hwnd, LONG index, USHORT us),
298 		  (hwnd, index, us))
299 DeclWinFunc_CACHE(HWND, IsChild, (HWND hwnd, HWND hwndParent),
300 		  (hwnd, hwndParent))
301 DeclWinFunc_CACHE(HWND, WindowFromId, (HWND hwnd, ULONG id), (hwnd, id))
302 DeclWinFunc_CACHE(HWND, EnumDlgItem, (HWND hwndDlg, HWND hwnd, ULONG code),
303 		  (hwndDlg, hwnd, code))
304 DeclWinFunc_CACHE(HWND, QueryDesktopWindow, (HAB hab, HDC hdc), (hab, hdc));
305 DeclWinFunc_CACHE(BOOL, SetActiveWindow, (HWND hwndDesktop, HWND hwnd),
306 		  (hwndDesktop, hwnd));
307 DeclWinFunc_CACHE(BOOL, QueryActiveDesktopPathname, (PSZ pszPathName, ULONG ulSize),
308 		  (pszPathName, ulSize));
309 DeclWinFunc_CACHE(BOOL, InvalidateRect,
310 		  (HWND hwnd, /*RECTL*/ char *prcl, BOOL fIncludeChildren),
311 		  (hwnd, prcl, fIncludeChildren));
312 DeclWinFunc_CACHE(BOOL, CreateFrameControls,
313 		  (HWND hwndFrame, /*PFRAMECDATA*/ char* pfcdata, PCSZ pszTitle),
314 		  (hwndFrame, pfcdata, pszTitle));
315 DeclWinFunc_CACHE(BOOL, OpenClipbrd, (HAB hab), (hab));
316 DeclWinFunc_CACHE(BOOL, EmptyClipbrd, (HAB hab), (hab));
317 DeclWinFunc_CACHE(BOOL, CloseClipbrd, (HAB hab), (hab));
318 DeclWinFunc_CACHE(BOOL, QueryClipbrdFmtInfo, (HAB hab, ULONG fmt, PULONG prgfFmtInfo), (hab, fmt, prgfFmtInfo));
319 DeclWinFunc_CACHE(ULONG, QueryClipbrdData, (HAB hab, ULONG fmt), (hab, fmt));
320 DeclWinFunc_CACHE(HWND, SetClipbrdViewer, (HAB hab, HWND hwnd), (hab, hwnd));
321 DeclWinFunc_CACHE(HWND, SetClipbrdOwner, (HAB hab, HWND hwnd), (hab, hwnd));
322 DeclWinFunc_CACHE(ULONG, EnumClipbrdFmts, (HAB hab, ULONG fmt), (hab, fmt));
323 DeclWinFunc_CACHE(ATOM, AddAtom, (HATOMTBL hAtomTbl, PCSZ pszAtomName),
324 		  (hAtomTbl, pszAtomName));
325 DeclWinFunc_CACHE(ULONG, QueryAtomUsage, (HATOMTBL hAtomTbl, ATOM atom),
326 		  (hAtomTbl, atom));
327 DeclWinFunc_CACHE(ULONG, QueryAtomLength, (HATOMTBL hAtomTbl, ATOM atom),
328 		  (hAtomTbl, atom));
329 DeclWinFunc_CACHE(ULONG, QueryAtomName,
330 		  (HATOMTBL hAtomTbl, ATOM atom, PSZ pchBuffer, ULONG cchBufferMax),
331 		  (hAtomTbl, atom, pchBuffer, cchBufferMax));
332 DeclWinFunc_CACHE(HATOMTBL, QuerySystemAtomTable, (VOID), ());
333 DeclWinFunc_CACHE(HATOMTBL, CreateAtomTable, (ULONG initial, ULONG buckets),
334 		  (initial, buckets));
335 DeclWinFunc_CACHE(ULONG, MessageBox, (HWND hwndParent, HWND hwndOwner, PCSZ pszText, PCSZ pszCaption, ULONG idWindow, ULONG flStyle), (hwndParent, hwndOwner, pszText, pszCaption, idWindow, flStyle));
336 DeclWinFunc_CACHE(ULONG, MessageBox2,
337 		  (HWND hwndParent, HWND hwndOwner, PCSZ pszText,
338 		   PCSZ pszCaption, ULONG idWindow, PMB2INFO pmb2info),
339 		  (hwndParent, hwndOwner, pszText, pszCaption, idWindow, pmb2info));
340 DeclWinFunc_CACHE(HPOINTER, LoadPointer,
341 		  (HWND hwndDesktop, HMODULE hmod, ULONG idres),
342 		  (hwndDesktop, hmod, idres));
343 DeclWinFunc_CACHE(HPOINTER, QuerySysPointer,
344 		  (HWND hwndDesktop, LONG lId, BOOL fCopy),
345 		  (hwndDesktop, lId, fCopy));
346 DeclWinFunc_CACHE(BOOL, Alarm, (HWND hwndDesktop, ULONG rgfType), (hwndDesktop, rgfType));
347 DeclWinFunc_CACHE(BOOL, FlashWindow, (HWND hwndFrame, BOOL fFlash), (hwndFrame, fFlash));
348 
349 #if 0		/* Need to have the entry points described in the parent */
350 DeclWinFunc_CACHE(BOOL, QueryClassInfo, (HAB hab, char* pszClassName, PCLASSINFO pClassInfo), (hab, pszClassName, pClassInfo));
351 
352 #define _QueryClassInfo(hab, pszClassName, pClassInfo)	\
353 	QueryClassInfo(hab, pszClassName, (PCLASSINFO)pClassInfo)
354 
355 #endif
356 
357 /* These functions do not croak on error */
358 DeclWinFunc_CACHE_survive(BOOL, SetClipbrdData,
359 			  (HAB hab, ULONG ulData, ULONG fmt, ULONG rgfFmtInfo),
360 			  (hab, ulData, fmt, rgfFmtInfo));
361 
362 #define get_InvalidateRect	InvalidateRect
363 #define get_CreateFrameControls	CreateFrameControls
364 
365 /* These functions may return 0 on success; check $^E/Perl_rc on res==0: */
366 DeclWinFunc_CACHE_resetError(PVOID, QueryWindowPtr, (HWND hwnd, LONG index),
367 			     (hwnd, index))
368 DeclWinFunc_CACHE_resetError(ULONG, QueryWindowULong, (HWND hwnd, LONG index),
369 			     (hwnd, index))
370 DeclWinFunc_CACHE_resetError(SHORT, QueryWindowUShort, (HWND hwnd, LONG index),
371 			     (hwnd, index))
372 DeclWinFunc_CACHE_resetError(LONG,  QueryWindowTextLength, (HWND hwnd), (hwnd))
373 DeclWinFunc_CACHE_resetError(HWND,  QueryActiveWindow, (HWND hwnd), (hwnd))
374 DeclWinFunc_CACHE_resetError(BOOL, PostMsg,
375 			     (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2),
376 			     (hwnd, msg, mp1, mp2))
377 DeclWinFunc_CACHE_resetError(HWND, GetNextWindow, (HENUM henum), (henum))
378 DeclWinFunc_CACHE_resetError(BOOL, IsWindowEnabled, (HWND hwnd), (hwnd))
379 DeclWinFunc_CACHE_resetError(BOOL, IsWindowVisible, (HWND hwnd), (hwnd))
380 DeclWinFunc_CACHE_resetError(BOOL, IsWindowShowing, (HWND hwnd), (hwnd))
381 DeclWinFunc_CACHE_resetError(ATOM, FindAtom, (HATOMTBL hAtomTbl, PCSZ pszAtomName),
382 			     (hAtomTbl, pszAtomName));
383 DeclWinFunc_CACHE_resetError(ATOM, DeleteAtom, (HATOMTBL hAtomTbl, ATOM atom),
384 			     (hAtomTbl, atom));
385 DeclWinFunc_CACHE_resetError(HATOMTBL, DestroyAtomTable, (HATOMTBL hAtomTbl), (hAtomTbl));
386 DeclWinFunc_CACHE_resetError(HWND, QueryClipbrdViewer, (HAB hab), (hab));
387 DeclWinFunc_CACHE_resetError(HWND, QueryClipbrdOwner, (HAB hab), (hab));
388 
389 #define _DeleteAtom		DeleteAtom
390 #define _DestroyAtomTable	DestroyAtomTable
391 
392 /* No die()ing on error */
393 DeclWinFunc_CACHE_survive(BOOL, IsWindow, (HAB hab, HWND hwnd), (hab, hwnd))
394 
395 /* These functions are called frow complicated wrappers: */
396 ULONG (*pWinQuerySwitchList) (HAB hab, PSWBLOCK pswblk, ULONG usDataLength);
397 ULONG (*pWinChangeSwitchEntry) (HSWITCH hsw, __const__ SWCNTRL *pswctl);
398 HWND (*pWinWindowFromPoint)(HWND hwnd, __const__ POINTL *pptl, BOOL fChildren);
399 
400 
401 /* These functions have different names/signatures than what is
402    declared above */
403 #define QueryFocusWindow QueryFocus
404 #define FocusWindow_set(hwndFocus, hwndDesktop) SetFocus(hwndDesktop, hwndFocus)
405 #define WindowPos_set(hwnd, x, y, fl, cx, cy, hwndInsertBehind)	\
406 	SetWindowPos(hwnd, hwndInsertBehind, x, y, cx, cy, fl)
407 #define myWinQueryWindowPtr(hwnd, i)	((ULONG)QueryWindowPtr(hwnd, i))
408 #define _ClipbrdData_set SetClipbrdData
409 #define ClipbrdOwner_set SetClipbrdOwner
410 #define ClipbrdViewer_set SetClipbrdViewer
411 
412 int
WindowText_set(HWND hwnd,char * text)413 WindowText_set(HWND hwnd, char* text)
414 {
415    return !CheckWinError(myWinSetWindowText(hwnd, text));
416 }
417 
418 SV *
myQueryWindowText(HWND hwnd)419 myQueryWindowText(HWND hwnd)
420 {
421     LONG l = QueryWindowTextLength(hwnd), len;
422     SV *sv;
423     STRLEN n_a;
424 
425     if (l == 0) {
426 	if (Perl_rc)		/* Last error */
427 	    return &PL_sv_undef;
428 	return &PL_sv_no;
429     }
430     sv = newSVpvs("");
431     SvGROW(sv, l + 1);
432     len = QueryWindowText(hwnd, l + 1, SvPV_force(sv, n_a));
433     if (len != l) {
434 	Safefree(sv);
435 	croak("WinQueryWindowText() uncompatible with WinQueryWindowTextLength()");
436     }
437     SvCUR_set(sv, l);
438     return sv;
439 }
440 
441 SWP
QueryWindowSWP_(HWND hwnd)442 QueryWindowSWP_(HWND hwnd)
443 {
444     SWP swp;
445 
446     if (!QueryWindowPos(hwnd, &swp))
447 	croak("WinQueryWindowPos() error");
448     return swp;
449 }
450 
451 SV *
QueryWindowSWP(HWND hwnd)452 QueryWindowSWP(HWND hwnd)
453 {
454     SWP swp = QueryWindowSWP_(hwnd);
455 
456     return newSVpvn((char*)&swp, sizeof(swp));
457 }
458 
459 SV *
myQueryClassName(HWND hwnd)460 myQueryClassName(HWND hwnd)
461 {
462     SV *sv = newSVpvs("");
463     STRLEN l = 46, len = 0, n_a;
464 
465     while (l + 1 >= len) {
466 	if (len)
467 	    len = 2*len + 10;		/* Grow quick */
468 	else
469 	    len = l + 2;
470 	SvGROW(sv, len);
471 	l = QueryClassName(hwnd, len, SvPV_force(sv, n_a));
472     }
473     SvCUR_set(sv, l);
474     return sv;
475 }
476 
477 HWND
WindowFromPoint(long x,long y,HWND hwnd,BOOL fChildren)478 WindowFromPoint(long x, long y, HWND hwnd, BOOL fChildren)
479 {
480     POINTL ppl;
481 
482     ppl.x = x; ppl.y = y;
483     if (!pWinWindowFromPoint)
484 	AssignFuncPByORD(pWinWindowFromPoint, ORD_WinWindowFromPoint);
485     return SaveWinError(pWinWindowFromPoint(hwnd, &ppl, fChildren));
486 }
487 
488 static HSWITCH
switch_of(HWND hwnd,PID pid)489 switch_of(HWND hwnd, PID pid)
490 {
491 	 HSWITCH hSwitch;
492 
493 	 if (!(_emx_env & 0x200))
494 	     croak("switch_entry not implemented on DOS"); /* not OS/2. */
495 	 if (CheckWinError(hSwitch =
496 			   myWinQuerySwitchHandle(hwnd, pid)))
497 	     croak_with_os2error("WinQuerySwitchHandle");
498 	 return hSwitch;
499 }
500 
501 
502 static void
fill_swentry(SWENTRY * swentryp,HWND hwnd,PID pid)503 fill_swentry(SWENTRY *swentryp, HWND hwnd, PID pid)
504 {
505 	 int rc;
506 	 HSWITCH hSwitch = switch_of(hwnd, pid);
507 
508 	 swentryp->hswitch = hSwitch;
509 	 if (CheckOSError(myWinQuerySwitchEntry(hSwitch, &swentryp->swctl)))
510 	     croak_with_os2error("WinQuerySwitchEntry");
511 }
512 
513 static void
fill_swentry_default(SWENTRY * swentryp)514 fill_swentry_default(SWENTRY *swentryp)
515 {
516 	fill_swentry(swentryp, NULLHANDLE, getpid());
517 }
518 
519 static SV*
myWinQueryActiveDesktopPathname()520 myWinQueryActiveDesktopPathname()
521 {
522     SV *buf = newSVpv("",0);
523     STRLEN n_a;
524 
525     SvGROW(buf, MAXPATHLEN);
526     QueryActiveDesktopPathname(SvPV(buf,n_a), MAXPATHLEN);
527     SvCUR_set(buf, strlen(SvPV(buf, n_a)));
528     return buf;
529 }
530 
531 SV *
myWinQueryAtomName(ATOM atom,HATOMTBL hAtomTbl)532 myWinQueryAtomName(ATOM atom, HATOMTBL hAtomTbl)
533 {
534   ULONG len = QueryAtomLength(hAtomTbl, atom);
535 
536   if (len) {			/* Probably always so... */
537     SV *sv = newSVpvs("");
538     STRLEN n_a;
539 
540     SvGROW(sv, len + 1);
541     len = QueryAtomName(hAtomTbl, atom, SvPV(sv, n_a), len + 1);
542     if (len) {			/* Probably always so... */
543       SvCUR_set(sv, len);
544       *SvEND(sv) = 0;
545       return sv;
546     }
547     SvREFCNT_dec(sv);
548   }
549   return &PL_sv_undef;
550 }
551 
552 #define myWinQueryClipbrdFmtInfo	QueryClipbrdFmtInfo
553 
554 /* Put data into shared memory, then call SetClipbrdData */
555 void
ClipbrdData_set(SV * sv,int convert_nl,unsigned long fmt,unsigned long rgfFmtInfo,HAB hab)556 ClipbrdData_set(SV *sv, int convert_nl, unsigned long fmt, unsigned long rgfFmtInfo, HAB hab)
557 {
558     STRLEN len;
559     char *buf;
560     char *pByte = 0, *s, c;
561     ULONG nls = 0, rc, handle;
562 
563     if (rgfFmtInfo & CFI_POINTER) {
564       s = buf = SvPV_force(sv, len);
565       if (convert_nl) {
566 	while ((c = *s++)) {
567 	    if (c == '\r' && *s == '\n')
568 		s++;
569 	    else if (c == '\n')
570 		nls++;
571 	}
572       }
573 
574       if (CheckOSError(DosAllocSharedMem((PPVOID)&pByte, 0, len + nls + 1,
575 				       PAG_WRITE | PAG_COMMIT | OBJ_GIVEABLE | OBJ_GETTABLE)))
576 	croak_with_os2error("ClipbrdData_set: DosAllocSharedMem error");
577 
578       if (!nls)
579 	memcpy(pByte, buf, len + 1);
580       else {
581 	char *t = pByte, *e = buf + len;
582 
583 	while (buf < e) {
584 	    c = *t++ = *buf++;
585 	    if (c == '\n' && (t == pByte + 1 || t[-2] != '\r'))
586 		t[-1] = '\r', *t++ = '\n';
587 	}
588       }
589       handle = (ULONG)pByte;
590     } else {
591       handle = (ULONG)SvUV(sv);
592     }
593 
594     if (!SetClipbrdData(hab, handle, fmt, rgfFmtInfo)) {
595 	if (fmt & CFI_POINTER)
596 	    DosFreeMem((PPVOID)&pByte);
597 	croak_with_os2error("ClipbrdData_set: WinSetClipbrdData error");
598     }
599 }
600 
601 ULONG
QueryMemoryRegionSize(ULONG addr,ULONG * flagp,ULONG len,I32 interrupt)602 QueryMemoryRegionSize(ULONG addr, ULONG *flagp, ULONG len, I32 interrupt)
603 {
604     ULONG l, f;				/* Modifiable copy */
605     ULONG rc;
606 
607     do {
608 	l = len;
609 	rc = DosQueryMem((void *)addr, &l, &f);
610     } while ( interrupt ? 0 : rc == ERROR_INTERRUPT );
611 
612     /* We assume this is not about addr */
613 /*
614     if (rc == ERROR_INVALID_ADDRESS)
615 	return 0xFFFFFFFF;
616 */
617     os2cp_croak(rc,"QueryMemoryRegionSize");
618     if (flagp)
619 	*flagp = f;
620     return l;
621 }
622 
623 static ULONG
default_fmtInfo(ULONG fmt)624 default_fmtInfo(ULONG fmt)
625 {
626    switch (fmt) {
627      case CF_PALETTE:	/* Actually, fmtInfo not documented for palette... */
628      case CF_BITMAP:
629      case CF_METAFILE:
630      case CF_DSPBITMAP:
631      case CF_DSPMETAFILE:
632 	return CFI_HANDLE;
633      default:
634 	return CFI_POINTER;
635    }
636 }
637 
638 #if 0
639 
640 ULONG
641 myWinMessageBox(HWND hwndParent, HWND hwndOwner, PCSZ pszText, PCSZ pszCaption, ULONG idWindow, ULONG flStyle)
642 {
643     ULONG rc = MessageBox(hwndParent, hwndOwner, pszText, pszCaption,
644 			  idWindow, flStyle);
645 
646     if (rc == MBID_ERROR)
647 	rc = 0;
648     if (CheckWinError(rc))
649 	croak_with_os2error("MessageBox");
650     return rc;
651 }
652 
653 ULONG
654 myWinMessageBox2(HWND hwndParent, HWND hwndOwner, PCSZ pszText,
655 		   PCSZ pszCaption, ULONG idWindow, PMB2INFO pmb2info)
656 {
657     ULONG rc = MessageBox2(hwndParent, hwndOwner, pszText, pszCaption, idWindow, pmb2info);
658 
659     if (rc == MBID_ERROR)
660 	rc = 0;
661     if (CheckWinError(rc))
662 	croak_with_os2error("MessageBox2");
663     return rc;
664 }
665 #endif
666 
667 /* static ULONG (* APIENTRY16 pDosSmSetTitle)(ULONG, PSZ); */
668 ULONG _THUNK_FUNCTION(DosSmSetTitle)(ULONG, PSZ);
669 
670 #if 0			/*  Does not work.  */
671 static ULONG (*pDosSmSetTitle)(ULONG, PSZ);
672 
673 static void
674 sesmgr_title_set(char *s)
675 {
676     SWENTRY swentry;
677     static HMODULE hdosc = 0;
678     BYTE buf[20];
679     long rc;
680 
681     fill_swentry_default(&swentry);
682     if (!pDosSmSetTitle || !hdosc) {
683 	if (CheckOSError(DosLoadModule(buf, sizeof buf, "sesmgr", &hdosc)))
684 	    croak("Cannot load SESMGR: no `%s'", buf);
685 	if (CheckOSError(DosQueryProcAddr(hdosc, 0, "DOSSMSETTITLE",
686 					  (PFN*)&pDosSmSetTitle)))
687 	    croak("Cannot load SESMGR.DOSSMSETTITLE, err=%ld", rc);
688     }
689 /*     (pDosSmSetTitle)(swcntrl.idSession,s); */
690     rc = ((USHORT)
691           (_THUNK_PROLOG (2+4);
692            _THUNK_SHORT (swcntrl.idSession);
693            _THUNK_FLAT (s);
694            _THUNK_CALLI (*pDosSmSetTitle)));
695     if (CheckOSError(rc))
696 	warn("*DOSSMSETTITLE: err=%ld, ses=%ld, addr=%x, *paddr=%x",
697 	     rc, swcntrl.idSession, &_THUNK_FUNCTION(DosSmSetTitle),
698 	     pDosSmSetTitle);
699 }
700 
701 #else /* !0 */
702 
703 static bool
sesmgr_title_set(char * s)704 sesmgr_title_set(char *s)
705 {
706     SWENTRY swentry;
707     long rc;
708 
709     fill_swentry_default(&swentry);
710     rc = ((USHORT)
711           (_THUNK_PROLOG (2+4);
712            _THUNK_SHORT (swentry.swctl.idSession);
713            _THUNK_FLAT (s);
714            _THUNK_CALL (DosSmSetTitle)));
715 #if 0
716     if (CheckOSError(rc))
717 	warn("DOSSMSETTITLE: err=%ld, ses=%ld, addr=%x",
718 	     rc, swcntrl.idSession, _THUNK_FUNCTION(DosSmSetTitle));
719 #endif
720     return !CheckOSError(rc);
721 }
722 #endif /* !0 */
723 
724 #if 0			/*  Does not work.  */
725 USHORT _THUNK_FUNCTION(Win16SetTitle) ();
726 
727 static void
728 set_title2(char *s)
729 {
730     long rc;
731 
732     rc = ((USHORT)
733           (_THUNK_PROLOG (4);
734            _THUNK_FLAT (s);
735            _THUNK_CALL (Win16SetTitle)));
736     if (CheckWinError(rc))
737 	warn("Win16SetTitle: err=%ld", rc);
738 }
739 #endif
740 
741 SV *
process_swentry(unsigned long pid,HWND hwnd)742 process_swentry(unsigned long pid, HWND hwnd)
743 {
744     SWENTRY swentry;
745 
746     if (!(_emx_env & 0x200))
747 	     croak("process_swentry not implemented on DOS"); /* not OS/2. */
748     fill_swentry(&swentry, hwnd, pid);
749     return newSVpvn((char*)&swentry, sizeof(swentry));
750 }
751 
752 SV *
swentries_list()753 swentries_list()
754 {
755     int num, n = 0;
756     STRLEN n_a;
757     PSWBLOCK pswblk;
758     SV *sv = newSVpvs("");
759 
760     if (!(_emx_env & 0x200))
761 	     croak("swentries_list not implemented on DOS"); /* not OS/2. */
762     if (!pWinQuerySwitchList)
763 	AssignFuncPByORD(pWinQuerySwitchList, ORD_WinQuerySwitchList);
764     num = pWinQuerySwitchList(0, NULL, 0);	/* HAB is not required */
765     if (!num)
766 	croak("(Unknown) error during WinQuerySwitchList()");
767     /* Allow one extra entry to allow overflow detection (may happen
768 	if the list has been changed). */
769     while (num > n) {
770 	if (n == 0)
771 	    n = num + 1;
772 	else
773 	    n = 2*num + 10;			/* Enlarge quickly */
774 	SvGROW(sv, sizeof(ULONG) + sizeof(SWENTRY) * n + 1);
775 	pswblk = (PSWBLOCK) SvPV_force(sv, n_a);
776 	num = pWinQuerySwitchList(0, pswblk, SvLEN(sv));
777     }
778     SvCUR_set(sv, sizeof(ULONG) + sizeof(SWENTRY) * num);
779     *SvEND(sv) = 0;
780     return sv;
781 }
782 
783 SWENTRY
swentry(char * title,HWND sw_hwnd,HWND icon_hwnd,HPROGRAM owner_phandle,PID owner_pid,ULONG owner_sid,ULONG visible,ULONG nonswitchable,ULONG jumpable,ULONG ptype,HSWITCH sw_entry)784 swentry( char *title, HWND sw_hwnd, HWND icon_hwnd, HPROGRAM owner_phandle,
785 	 PID owner_pid, ULONG owner_sid, ULONG visible, ULONG nonswitchable,
786 	 ULONG jumpable, ULONG ptype, HSWITCH sw_entry)
787 {
788   SWENTRY e;
789 
790   strncpy(e.swctl.szSwtitle, title, MAXNAMEL);
791   e.swctl.szSwtitle[60] = 0;
792   e.swctl.hwnd = sw_hwnd;
793   e.swctl.hwndIcon = icon_hwnd;
794   e.swctl.hprog = owner_phandle;
795   e.swctl.idProcess = owner_pid;
796   e.swctl.idSession = owner_sid;
797   e.swctl.uchVisibility = ((visible ? SWL_VISIBLE : SWL_INVISIBLE)
798 			   | (nonswitchable ? SWL_GRAYED : 0));
799   e.swctl.fbJump = (jumpable ? SWL_JUMPABLE : 0);
800   e.swctl.bProgType = ptype;
801   e.hswitch = sw_entry;
802   return e;
803 }
804 
805 SV *
create_swentry(char * title,HWND owner_hwnd,HWND icon_hwnd,HPROGRAM owner_phandle,PID owner_pid,ULONG owner_sid,ULONG visible,ULONG nonswitchable,ULONG jumpable,ULONG ptype,HSWITCH sw_entry)806 create_swentry( char *title, HWND owner_hwnd, HWND icon_hwnd, HPROGRAM owner_phandle,
807 	 PID owner_pid, ULONG owner_sid, ULONG visible, ULONG nonswitchable,
808 	 ULONG jumpable, ULONG ptype, HSWITCH sw_entry)
809 {
810     SWENTRY e = swentry(title, owner_hwnd, icon_hwnd, owner_phandle, owner_pid,
811 			owner_sid, visible, nonswitchable, jumpable, ptype,
812 			sw_entry);
813 
814     return newSVpvn((char*)&e, sizeof(e));
815 }
816 
817 int
change_swentrysw(SWENTRY * sw)818 change_swentrysw(SWENTRY *sw)
819 {
820     ULONG rc;			/* For CheckOSError */
821 
822     if (!(_emx_env & 0x200))
823 	     croak("change_entry() not implemented on DOS"); /* not OS/2. */
824     if (!pWinChangeSwitchEntry)
825 	AssignFuncPByORD(pWinChangeSwitchEntry, ORD_WinChangeSwitchEntry);
826     return !CheckOSError(pWinChangeSwitchEntry(sw->hswitch, &sw->swctl));
827 }
828 
829 int
change_swentry(SV * sv)830 change_swentry(SV *sv)
831 {
832     STRLEN l;
833     PSWENTRY pswentry = (PSWENTRY)SvPV(sv, l);
834 
835     if (l != sizeof(SWENTRY))
836 	croak("Wrong structure size %ld!=%ld in change_swentry()", (long)l, (long)sizeof(SWENTRY));
837     return change_swentrysw(pswentry);
838 }
839 
840 
841 #define swentry_size()		(sizeof(SWENTRY))
842 
843 void
getscrsize(int * wp,int * hp)844 getscrsize(int *wp, int *hp)
845 {
846     int i[2];
847 
848     _scrsize(i);
849     *wp = i[0];
850     *hp = i[1];
851 }
852 
853 /* Force vio to not cross 64K-boundary: */
854 #define VIO_FROM_VIOB			\
855     vio = viob;				\
856     if (!_THUNK_PTR_STRUCT_OK(vio))	\
857 	vio++
858 
859 bool
scrsize_set(int w,int h)860 scrsize_set(int w, int h)
861 {
862     VIOMODEINFO viob[2], *vio;
863     ULONG rc;
864 
865     VIO_FROM_VIOB;
866 
867     if (h == -9999)
868 	h = w, w = 0;
869     vio->cb = sizeof(*vio);
870     if (CheckOSError(VioGetMode( vio, 0 )))
871 	return 0;
872 
873     if( w > 0 )
874       vio->col = (USHORT)w;
875 
876     if( h > 0 )
877       vio->row = (USHORT)h;
878 
879     vio->cb = 8;
880     if (CheckOSError(VioSetMode( vio, 0 )))
881 	return 0;
882     return 1;
883 }
884 
885 void
cursor(int * sp,int * ep,int * wp,int * ap)886 cursor(int *sp, int *ep, int *wp, int *ap)
887 {
888     VIOCURSORINFO viob[2], *vio;
889     ULONG rc;
890 
891     VIO_FROM_VIOB;
892 
893     if (CheckOSError(VioGetCurType( vio, 0 )))
894 	croak_with_os2error("VioGetCurType() error");
895 
896     *sp = vio->yStart;
897     *ep = vio->cEnd;
898     *wp = vio->cx;
899     *ep = vio->attr;
900 }
901 
902 bool
cursor__(int is_a)903 cursor__(int is_a)
904 {
905     int s,e,w,a;
906 
907     cursor(&s, &e, &w, &a);
908     if (is_a)
909 	return a;
910     else
911 	return w;
912 }
913 
914 bool
cursor_set(int s,int e,int w,int a)915 cursor_set(int s, int e, int w, int a)
916 {
917     VIOCURSORINFO viob[2], *vio;
918     ULONG rc;
919 
920     VIO_FROM_VIOB;
921 
922     vio->yStart = s;
923     vio->cEnd = e;
924     vio->cx = w;
925     vio->attr = a;
926     return !CheckOSError(VioSetCurType( vio, 0 ));
927 }
928 
929 static int
bufsize(void)930 bufsize(void)
931 {
932 #if 1
933     VIOMODEINFO viob[2], *vio;
934     ULONG rc;
935 
936     VIO_FROM_VIOB;
937 
938     vio->cb = sizeof(*vio);
939     if (CheckOSError(VioGetMode( vio, 0 )))
940 	croak_with_os2error("Can't get size of buffer for screen");
941 #if 0	/* buf=323552247, full=1118455, partial=0 */
942     croak("Lengths: buf=%d, full=%d, partial=%d",vio->buf_length,vio->full_length,vio->partial_length);
943     return newSVpvn((char*)vio->buf_addr, vio->full_length);
944 #endif
945     return vio->col * vio->row * 2;	/* How to get bytes/cell?  2 or 4? */
946 #else	/* 0 */
947     int i[2];
948 
949     _scrsize(i);
950     return i[0]*i[1]*2;
951 #endif	/* 0 */
952 }
953 
954 SV*
_kbdChar(unsigned int nowait,int handle)955 _kbdChar(unsigned int nowait, int handle)
956 {
957     KBDKEYINFO viob[2], *vio;
958     ULONG rc;
959 
960     VIO_FROM_VIOB;
961 
962     if (nowait > 2)
963 	croak("unexpected nowait");
964     if (CheckOSError(nowait == 2
965 		     ? KbdPeek( vio, handle )
966 		     : KbdCharIn( vio, nowait == 1, handle )))
967 	croak_with_os2error("Can't _kbdChar");
968     return newSVpvn((char*)vio, sizeof(*vio));
969 }
970 
971 SV*
_kbdStatus(int handle)972 _kbdStatus(int handle)
973 {
974     KBDINFO viob[2], *vio;
975     ULONG rc;
976 
977     VIO_FROM_VIOB;
978 
979     vio->cb = sizeof(*vio);
980     if (CheckOSError(KbdGetStatus( vio, handle )))
981 	croak_with_os2error("Can't _kbdStatus");
982     return newSVpvn((char*)vio, sizeof(*vio));
983 }
984 
985 void
_kbdStatus_set(SV * sv,int handle)986 _kbdStatus_set(SV* sv, int handle)
987 {
988     KBDINFO viob[2], *vio;
989     ULONG rc;
990     STRLEN l;
991     char *s = SvPV(sv, l);
992 
993     VIO_FROM_VIOB;
994 
995     if (l != sizeof(*vio))
996 	croak("unexpected datasize");
997     Copy((KBDINFO*)s, vio, 1, KBDINFO);
998     if (vio->cb != sizeof(*vio))
999 	croak("unexpected datasize");
1000     if (CheckOSError(KbdSetStatus( vio, handle )))
1001 	croak_with_os2error("Can't kbdStatus_set()");
1002 }
1003 
1004 SV*
_vioConfig(int which,int handle)1005 _vioConfig(int which, int handle)
1006 {
1007     struct {VIOCONFIGINFO i; short a[20];} viob[2], *vio;
1008     ULONG rc;
1009 
1010     VIO_FROM_VIOB;
1011 
1012     vio->i.cb = 2;
1013     if (CheckOSError(VioGetConfig( which, &vio->i, handle )))
1014 	croak_with_os2error("Can't get VIO config size");
1015     if (vio->i.cb > sizeof(*vio))
1016 	vio->i.cb = sizeof(*vio);
1017     if (CheckOSError(VioGetConfig( which, &vio->i, handle )))
1018 	croak_with_os2error("Can't get VIO config");
1019     return newSVpvn((char*)vio, vio->i.cb);
1020 }
1021 
1022 SV*
_vioMode(void)1023 _vioMode(void)
1024 {
1025     VIOMODEINFO viob[2], *vio;
1026     ULONG rc;
1027 
1028     VIO_FROM_VIOB;
1029 
1030     vio->cb = sizeof(*vio);
1031     if (CheckOSError(VioGetMode( vio, 0 )))
1032 	croak_with_os2error("Can't get VIO mode");
1033     return newSVpvn((char*)vio, sizeof(*vio));
1034 }
1035 
1036 void
_vioMode_set(SV * sv)1037 _vioMode_set(SV* sv)
1038 {
1039     VIOMODEINFO viob[2], *vio;
1040     ULONG rc;
1041     STRLEN l;
1042     char *s = SvPV(sv, l);
1043 
1044     VIO_FROM_VIOB;
1045 
1046     Copy((VIOMODEINFO*)s, vio, 1, VIOMODEINFO);
1047     if (vio->cb != sizeof(*vio) || l != vio->cb)
1048 	croak("unexpected datasize");
1049     if (CheckOSError(VioSetMode( vio, 0 )))
1050 	croak_with_os2error("Can't set VIO mode");
1051 }
1052 
1053 SV*
vioFont(int type,int * w,int * h)1054 vioFont(int type, int *w, int *h) /* 0 for actual RAM font, 1 for ROM font */
1055 {
1056     VIOFONTINFO viob[2], *vio;
1057     ULONG rc;
1058     UCHAR b[1<<17];
1059     UCHAR *buf = b;
1060     SV *sv;
1061 
1062     VIO_FROM_VIOB;
1063 
1064     /* Should not cross 64K boundaries too: */
1065     if (((ULONG)buf) & 0xFFFF)
1066 	buf += 0x10000 - (((ULONG)buf) & 0xFFFF);
1067 
1068     vio->cb = sizeof(*vio);
1069     vio->type = type;			/* BIOS or the loaded font. */
1070     vio->cbData = 0xFFFF;		/* How large is my buffer? */
1071     vio->pbData = _emx_32to16(buf);	/* Wants an 16:16 pointer */
1072     if (CheckOSError(VioGetFont( vio, 0 )))
1073 	croak_with_os2error("Can't get VIO font");
1074     *w = vio->cxCell;
1075     *h = vio->cyCell;
1076     return newSVpvn(buf,vio->cbData);
1077 }
1078 
1079 void
vioFont_set(SV * sv,int cellwidth,int cellheight,int type)1080 vioFont_set(SV *sv, int cellwidth, int cellheight, int type)
1081 {
1082     VIOFONTINFO viob[2], *vio;
1083     ULONG rc;
1084     UCHAR b[1<<17];
1085     UCHAR *buf = b;
1086     STRLEN l;
1087     char *s = SvPV(sv, l);
1088 
1089     VIO_FROM_VIOB;
1090 
1091     /* Should not cross 64K boundaries too: */
1092     if (((ULONG)buf) & 0xFFFF)
1093 	buf += 0x10000 - (((ULONG)buf) & 0xFFFF);
1094 
1095     if (l > 0xFFFF)
1096 	croak("length overflow of VIO font");
1097     if (l != (cellwidth + 7)/8 * cellheight * 256)
1098 	warn("unexpected length of VIO font");
1099     vio->cb = sizeof(*vio);
1100     vio->type = type;			/* BIOS or the loaded font. */
1101     vio->cbData = l;			/* How large is my buffer? */
1102     vio->pbData = _emx_32to16(buf);	/* Wants an 16:16 pointer */
1103     vio->cxCell = cellwidth;
1104     vio->cyCell = cellheight;
1105     Copy(s, buf, l, char);
1106 
1107     if (CheckOSError(VioSetFont( vio, 0 )))
1108 	croak_with_os2error("Can't set VIO font");
1109 }
1110 
1111 /*
1112   uses use32,os2def,os2base,crt,defs;
1113   var   Plt :Plt256;
1114   const Pal :VioPalState=(Cb:sizeof(VioPalState);rType:0;iFirst:0;
1115     Acolor:($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF));
1116         CReg:VioColorReg=(Cb:sizeof(VioColorReg);rType:3;FirstColorReg:0;
1117     NumColorRegs:256; ColorRegAddr:@Plt);
1118   var   ii:Pointer;
1119   begin
1120    VioGetState(Pal,0);
1121    Pal.Acolor[09]:=$0F;
1122    Pal.Acolor[10]:=$A;
1123    Pal.Acolor[13]:=$2F;
1124    VioSetState(Pal,0); // ce smena EGA registrov
1125    asm
1126   lea   eax,Plt
1127      call  DosFlatToSel
1128      mov   ii,eax
1129    end;
1130    CReg.ColorRegAddr:=ii;
1131    VioGetState(CReg,0);
1132    Plt[10,0]:=$00;
1133    Plt[10,1]:=$32;
1134    Plt[10,2]:=$2A;
1135    VioSetState(CReg,0); // a ce - VGA registrov
1136   end.
1137 */
1138 
1139 typedef union {
1140   VIOPALSTATE pal;
1141   struct { VIOPALSTATE pal; USHORT a[15]; } pal_padded;
1142   VIOOVERSCAN overscan;
1143   VIOINTENSITY intensity;
1144   VIOCOLORREG colorreg;
1145   struct { VIOCOLORREG reg; char rgb[3*256]; } colorreg_padded;
1146   VIOSETULINELOC lineloc;
1147   VIOSETTARGET target;
1148 } my_VIOSTATE;
1149 
1150 int
vio_state_size(int what)1151 vio_state_size(int what)
1152 {
1153     static const char sizes[] = {
1154 	sizeof(VIOPALSTATE),
1155 	sizeof(VIOOVERSCAN),
1156 	sizeof(VIOINTENSITY),
1157 	sizeof(VIOCOLORREG),
1158 	6,				/* Random number: Reserved entry */
1159 	sizeof(VIOSETULINELOC),
1160 	sizeof(VIOSETTARGET)
1161     };
1162     if (what < 0 || what >= sizeof(sizes))
1163 	croak("Unexpected VIO state type");
1164     return sizes[what];
1165 }
1166 
1167 SV*
_vioState(int what,int first,int count)1168 _vioState(int what, int first, int count)
1169 {
1170     my_VIOSTATE viob[2], *vio;
1171     ULONG rc, size = vio_state_size(what);
1172 
1173     VIO_FROM_VIOB;
1174 
1175     vio->pal.cb = size;
1176     vio->pal.type = what;
1177     if (what == 0) {
1178 	vio->pal.iFirst = first;
1179 	if (first < 0 || first >= 16)
1180 	    croak("unexpected palette start value");
1181 	if (count < 0 || count > 16)
1182 	    croak("unexpected palette count");
1183 	vio->pal.cb = (size += (count - 1) * sizeof(short));
1184     } else if (what == 3) {
1185 	/* Wants an 16:16 pointer */
1186 	if (count < 0 || count > 256)
1187 	    croak("unexpected palette count");
1188 	vio->colorreg.colorregaddr = (PCH)_emx_32to16(vio->colorreg_padded.rgb);
1189 	vio->colorreg.numcolorregs = count;		/* 256 is max */
1190 	vio->colorreg.firstcolorreg = first;
1191 	size += 3 * count;
1192     }
1193     if (CheckOSError(VioGetState( (void*)vio, 0 )))
1194 	croak_with_os2error("Can't get VIO state");
1195     return newSVpvn((char*)vio, size);
1196 }
1197 
1198 void
_vioState_set(SV * sv)1199 _vioState_set(SV *sv)
1200 {
1201     my_VIOSTATE viob[2], *ovio = (my_VIOSTATE*)SvPV_nolen(sv), *vio = ovio;
1202     int what = ovio->pal.type, cb = ovio->pal.cb;
1203     ULONG rc, size = vio_state_size(what);
1204     STRLEN l;
1205     char *s = SvPV(sv, l);
1206 
1207     VIO_FROM_VIOB;
1208 
1209     switch (what) {
1210     case 0:
1211 	if ( cb < size || cb > size + 15*sizeof(SHORT) || l != cb)
1212 	    croak("unexpected datasize");
1213 	size = l;
1214 	break;
1215     case 3:
1216 	if (l != cb + 3 * ovio->colorreg.numcolorregs || cb != size)
1217 	    croak("unexpected datasize");
1218 	size = l;
1219 	break;
1220     default:
1221 	if (l != cb || l != size )
1222 	    croak("unexpected datasize");
1223 	break;
1224     }
1225     Copy(s, (char*)vio, size, char);
1226     if (what == 3)	/* We expect colors put after VIOCOLORREG */
1227 	vio->colorreg.colorregaddr = (PCH)_emx_32to16(vio->colorreg_padded.rgb);
1228 
1229     if (CheckOSError(VioSetState( (void*)vio, 0 )))
1230 	croak_with_os2error("Can't set VIO state");
1231 }
1232 
1233 SV *
screen(void)1234 screen(void)
1235 {
1236     ULONG rc;
1237     USHORT bufl = bufsize();
1238     char b[(1<<16) * 3]; /* This/3 is enough for 16-bit calls, we need
1239 			    2x overhead due to 2 vs 4 issue, and extra
1240 			    64K due to alignment logic */
1241     char *buf = b;
1242 
1243     if (((ULONG)buf) & 0xFFFF)
1244 	buf += 0x10000 - (((ULONG)buf) & 0xFFFF);
1245     if ((sizeof(b) - (buf - b)) < 2*bufl)
1246 	croak("panic: VIO buffer allocation");
1247     if (CheckOSError(VioReadCellStr( buf, &bufl, 0, 0, 0 )))
1248 	return &PL_sv_undef;
1249     return newSVpvn(buf,bufl);
1250 }
1251 
1252 bool
screen_set(SV * sv)1253 screen_set(SV *sv)
1254 {
1255     ULONG rc;
1256     STRLEN l = SvCUR(sv), bufl = bufsize();
1257     char b[(1<<16) * 2]; /* This/2 is enough for 16-bit calls, we need
1258 			    extra 64K due to alignment logic */
1259     char *buf = b;
1260 
1261     if (((ULONG)buf) & 0xFFFF)
1262 	buf += 0x10000 - (((ULONG)buf) & 0xFFFF);
1263     if (!SvPOK(sv) || ((l != bufl) && (l != 2*bufl)))
1264 	croak("Wrong size %d of saved screen data", SvCUR(sv));
1265     if ((sizeof(b) - (buf - b)) < l)
1266 	croak("panic: VIO buffer allocation");
1267     Copy(SvPV(sv,l), buf, bufl, char);
1268     if (CheckOSError(VioWrtCellStr( buf, bufl, 0, 0, 0 )))
1269 	return 0;
1270     return 1;
1271 }
1272 
1273 int
process_codepages()1274 process_codepages()
1275 {
1276     ULONG cps[4], cp, rc;
1277 
1278     if (CheckOSError(DosQueryCp( sizeof(cps), cps, &cp )))
1279 	croak_with_os2error("DosQueryCp()");
1280     return cp;
1281 }
1282 
1283 int
out_codepage()1284 out_codepage()
1285 {
1286     USHORT cp, rc;
1287 
1288     if (CheckOSError(VioGetCp( 0, &cp, 0 )))
1289 	croak_with_os2error("VioGetCp()");
1290     return cp;
1291 }
1292 
1293 bool
out_codepage_set(int cp)1294 out_codepage_set(int cp)
1295 {
1296     USHORT rc;
1297 
1298     return !(CheckOSError(VioSetCp( 0, cp, 0 )));
1299 }
1300 
1301 int
in_codepage()1302 in_codepage()
1303 {
1304     USHORT cp, rc;
1305 
1306     if (CheckOSError(KbdGetCp( 0, &cp, 0 )))
1307 	croak_with_os2error("KbdGetCp()");
1308     return cp;
1309 }
1310 
1311 bool
in_codepage_set(int cp)1312 in_codepage_set(int cp)
1313 {
1314     USHORT rc;
1315 
1316     return !(CheckOSError(KbdSetCp( 0, cp, 0 )));
1317 }
1318 
1319 bool
process_codepage_set(int cp)1320 process_codepage_set(int cp)
1321 {
1322     USHORT rc;
1323 
1324     return !(CheckOSError(DosSetProcessCp( cp )));
1325 }
1326 
1327 int
ppidOf(int pid)1328 ppidOf(int pid)
1329 {
1330   PQTOPLEVEL psi;
1331   int ppid;
1332 
1333   if (!pid)
1334       return -1;
1335   psi = get_sysinfo(pid, QSS_PROCESS);
1336   if (!psi)
1337       return -1;
1338   ppid = psi->procdata->ppid;
1339   Safefree(psi);
1340   return ppid;
1341 }
1342 
1343 int
sidOf(int pid)1344 sidOf(int pid)
1345 {
1346   PQTOPLEVEL psi;
1347   int sid;
1348 
1349   if (!pid)
1350       return -1;
1351   psi = get_sysinfo(pid, QSS_PROCESS);
1352   if (!psi)
1353       return -1;
1354   sid = psi->procdata->sessid;
1355   Safefree(psi);
1356   return sid;
1357 }
1358 
1359 STRLEN
StrLen(ULONG addr,ULONG lim,I32 unitsize)1360 StrLen(ULONG addr, ULONG lim, I32 unitsize)
1361 {
1362     switch (unitsize) {
1363       case 1:
1364 	{
1365 	    char *s = (char *)addr;
1366 	    char *s1 = s, *e = (char *)(addr + lim);
1367 
1368 	    while (s < e && *s)
1369 		s++;
1370 	    return s - s1;
1371 	}
1372 	break;
1373       case 2:
1374 	{
1375 	    short *s = (short *)addr;
1376 	    short *s1 = s, *e = (short *)(addr + lim);
1377 
1378 	    while (s < e && *s)
1379 		s++;
1380 	    return (char*)s - (char*)s1;
1381 	}
1382 	break;
1383       case 4:
1384 	{
1385 	    int *s = (int *)addr;
1386 	    int *s1 = s, *e = (int *)(addr + lim);
1387 
1388 	    while (s < e && *s)
1389 		s++;
1390 	    return (char*)s - (char*)s1;
1391 	}
1392 	break;
1393       case 8:
1394 	{
1395 	    long long *s = (long long *)addr;
1396 	    long long *s1 = s, *e = (long long *)(addr + lim);
1397 
1398 	    while (s < e && *s)
1399 		s++;
1400 	    return (char*)s - (char*)s1;
1401 	}
1402 	break;
1403       default:
1404 	croak("StrLen: unknown unitsize %d", (int)unitsize);
1405     }
1406 }
1407 
1408 #define ulMPFROMSHORT(i)		((unsigned long)MPFROMSHORT(i))
1409 #define ulMPVOID()			((unsigned long)MPVOID)
1410 #define ulMPFROMCHAR(i)			((unsigned long)MPFROMCHAR(i))
1411 #define ulMPFROM2SHORT(x1,x2)		((unsigned long)MPFROM2SHORT(x1,x2))
1412 #define ulMPFROMSH2CH(s, c1, c2)	((unsigned long)MPFROMSH2CH(s, c1, c2))
1413 #define ulMPFROMLONG(x)			((unsigned long)MPFROMLONG(x))
1414 
1415 #define _MessageBox			MessageBox
1416 #define _MessageBox2			MessageBox2
1417 
1418 MODULE = OS2::Process		PACKAGE = OS2::Process
1419 
1420 PROTOTYPES: ENABLE
1421 
1422 unsigned long
constant(name,arg)1423 constant(name,arg)
1424 	char *		name
1425 	int		arg
1426 
1427 char *
1428 my_type()
1429 
1430 U32
1431 file_type(path)
1432     char *path
1433 
1434 SV *
1435 swentry_expand( SV *sv )
1436     PPCODE:
1437      {
1438 	 STRLEN l;
1439 	 PSWENTRY pswentry = (PSWENTRY)SvPV(sv, l);
1440 
1441 	 if (l != sizeof(SWENTRY))
1442 		croak("Wrong structure size %ld!=%ld in swentry_expand()", (long)l, (long)sizeof(SWENTRY));
1443 	 EXTEND(sp,11);
1444 	 PUSHs(sv_2mortal(newSVpv(pswentry->swctl.szSwtitle, 0)));
1445 	 PUSHs(sv_2mortal(newSVnv(pswentry->swctl.hwnd)));
1446 	 PUSHs(sv_2mortal(newSVnv(pswentry->swctl.hwndIcon)));
1447 	 PUSHs(sv_2mortal(newSViv(pswentry->swctl.hprog)));
1448 	 PUSHs(sv_2mortal(newSViv(pswentry->swctl.idProcess)));
1449 	 PUSHs(sv_2mortal(newSViv(pswentry->swctl.idSession)));
1450 	 PUSHs(sv_2mortal(newSViv(pswentry->swctl.uchVisibility & SWL_VISIBLE)));
1451 	 PUSHs(sv_2mortal(newSViv(pswentry->swctl.uchVisibility & SWL_GRAYED)));
1452 	 PUSHs(sv_2mortal(newSViv(pswentry->swctl.fbJump == SWL_JUMPABLE)));
1453 	 PUSHs(sv_2mortal(newSViv(pswentry->swctl.bProgType)));
1454 	 PUSHs(sv_2mortal(newSViv(pswentry->hswitch)));
1455      }
1456 
1457 SV *
1458 create_swentry( char *title, unsigned long sw_hwnd, unsigned long icon_hwnd, unsigned long owner_phandle, unsigned long owner_pid, unsigned long owner_sid, unsigned long visible, unsigned long switchable,	 unsigned long jumpable, unsigned long ptype, unsigned long sw_entry)
1459 PROTOTYPE: DISABLE
1460 
1461 int
1462 change_swentry( SV *sv )
1463 
1464 bool
1465 sesmgr_title_set(s)
1466     char *s
1467 
1468 SV *
1469 process_swentry(unsigned long pid = getpid(), HWND hwnd = NULLHANDLE);
1470   PROTOTYPE: DISABLE
1471 
1472 int
1473 swentry_size()
1474 
1475 SV *
1476 swentries_list()
1477 
1478 void
1479 ResetWinError()
1480    POSTCALL:
1481 	XSRETURN_YES;
1482 
1483 int
1484 WindowText_set(HWND hwndFrame, char *title)
1485 
1486 bool
1487 FocusWindow_set(HWND hwndFocus, HWND hwndDesktop = HWND_DESKTOP)
1488 
1489 bool
1490 ShowWindow(HWND hwnd, bool fShow = TRUE)
1491 
1492 bool
1493 EnableWindow(HWND hwnd, bool fEnable = TRUE)
1494 
1495 bool
1496 PostMsg(HWND hwnd, unsigned long msg, unsigned long mp1 = 0, unsigned long mp2 = 0)
1497     C_ARGS: hwnd, msg, (MPARAM)mp1, (MPARAM)mp2
1498 
1499 bool
1500 WindowPos_set(HWND hwnd, long x, long y, unsigned long fl = SWP_MOVE, long cx = 0, long cy = 0, HWND hwndInsertBehind = HWND_TOP)
1501   PROTOTYPE: DISABLE
1502 
1503 unsigned long
1504 BeginEnumWindows(HWND hwnd)
1505 
1506 bool
1507 EndEnumWindows(unsigned long henum)
1508 
1509 unsigned long
1510 GetNextWindow(unsigned long henum)
1511 
1512 bool
1513 IsWindowVisible(HWND hwnd)
1514 
1515 bool
1516 IsWindowEnabled(HWND hwnd)
1517 
1518 bool
1519 IsWindowShowing(HWND hwnd)
1520 
1521 unsigned long
1522 QueryWindow(HWND hwnd, long cmd)
1523 
1524 unsigned long
1525 IsChild(HWND hwnd, HWND hwndParent)
1526 
1527 unsigned long
1528 WindowFromId(HWND hwndParent, unsigned long id)
1529 
1530 unsigned long
1531 WindowFromPoint(long x, long y, HWND hwnd = HWND_DESKTOP, bool fChildren = TRUE)
1532 PROTOTYPE: DISABLE
1533 
1534 unsigned long
1535 EnumDlgItem(HWND hwndDlg, unsigned long code, HWND hwnd = NULLHANDLE)
1536    C_ARGS: hwndDlg, hwnd, code
1537 
1538 bool
1539 EnableWindowUpdate(HWND hwnd, bool fEnable = TRUE)
1540 
1541 bool
1542 SetWindowBits(HWND hwnd, long index, unsigned long flData, unsigned long flMask)
1543 
1544 bool
1545 SetWindowPtr(HWND hwnd, long index, unsigned long p)
1546     C_ARGS: hwnd, index, (PVOID)p
1547 
1548 bool
1549 SetWindowULong(HWND hwnd, long index, unsigned long i)
1550 
1551 bool
1552 SetWindowUShort(HWND hwnd, long index, unsigned short i)
1553 
1554 bool
1555 IsWindow(HWND hwnd, HAB hab = Acquire_hab())
1556     C_ARGS: hab, hwnd
1557 
1558 BOOL
1559 ActiveWindow_set(HWND hwnd, HWND hwndDesktop = HWND_DESKTOP)
1560     CODE:
1561 	RETVAL = SetActiveWindow(hwndDesktop, hwnd);
1562 
1563 unsigned long
1564 LoadPointer(unsigned long idres, unsigned long hmod = 0, HWND hwndDesktop = HWND_DESKTOP)
1565     C_ARGS: hwndDesktop, hmod, idres
1566 
1567 int
1568 out_codepage()
1569 
1570 bool
1571 out_codepage_set(int cp)
1572 
1573 int
1574 in_codepage()
1575 
1576 bool
1577 in_codepage_set(int cp)
1578 
1579 SV *
1580 screen()
1581 
1582 bool
1583 screen_set(SV *sv)
1584 
1585 SV *
1586 process_codepages()
1587   PPCODE:
1588   {
1589     ULONG cps[4], c, i = 0, rc;
1590 
1591     if (CheckOSError(DosQueryCp( sizeof(cps), cps, &c )))
1592 	c = 0;
1593     c /= sizeof(ULONG);
1594     if (c >= 3)
1595     EXTEND(sp, c);
1596     while (i < c)
1597 	PUSHs(sv_2mortal(newSViv(cps[i++])));
1598   }
1599 
1600 bool
1601 process_codepage_set(int cp)
1602 
1603 void
1604 cursor(OUTLIST int stp, OUTLIST int ep, OUTLIST int wp, OUTLIST int ap)
1605   PROTOTYPE:
1606 
1607 bool
1608 cursor_set(int s, int e, int w = cursor__(0), int a = cursor__(1))
1609 
1610 SV*
1611 _kbdChar(int nowait = 0, int handle = 0)
1612 
1613 SV*
1614 _kbdStatus(int handle = 0)
1615 
1616 void
1617 _kbdStatus_set(SV *sv, int handle = 0)
1618    POSTCALL:
1619 	XSRETURN_YES;
1620 
1621 SV*
1622 _vioConfig(int which = 0, int handle = 0)
1623 
1624 SV*
1625 _vioMode()
1626 
1627 void
1628 _vioMode_set(SV *buffer)
1629    POSTCALL:
1630 	XSRETURN_YES;
1631 
1632 SV*
1633 _vioState(int what, int first = -1, int count = -1)
1634 
1635 void
1636 _vioState_set(SV *buffer)
1637    POSTCALL:
1638 	XSRETURN_YES;
1639 
1640 SV*
1641 vioFont( int type = 0, OUTLIST int w, OUTLIST int h)
1642 
1643 void
1644 vioFont_set(SV *buffer, int cellwidth, int cellheight, int type = 0)
1645    POSTCALL:
1646 	XSRETURN_YES;
1647 
1648 NO_OUTPUT bool
1649 _ClipbrdData_set(unsigned long ulData, unsigned long fmt = CF_TEXT, unsigned long rgfFmtInfo = default_fmtInfo(fmt), HAB hab = perl_hab_GET())
1650     PROTOTYPE: DISABLE
1651     C_ARGS: hab, ulData, fmt, rgfFmtInfo
1652     POSTCALL:
1653 	if (CheckWinError(RETVAL))
1654 	    croak_with_os2error("_ClipbrdData_set() error");
1655 	XSRETURN_YES;
1656 
1657 void
1658 ClipbrdData_set(SV *text, int convert_nl = 1, unsigned long fmt = CF_TEXT, unsigned long rgfFmtInfo = default_fmtInfo(fmt), HAB hab = perl_hab_GET())
1659     PROTOTYPE: DISABLE
1660     POSTCALL:
1661 	XSRETURN_YES;
1662 
1663 void
1664 ClipbrdOwner_set(HWND hwnd, HAB hab = perl_hab_GET())
1665     C_ARGS: hab, hwnd
1666     POSTCALL:
1667 	XSRETURN_YES;
1668 
1669 void
1670 ClipbrdViewer_set(HWND hwnd, HAB hab = perl_hab_GET())
1671     C_ARGS: hab, hwnd
1672     POSTCALL:
1673 	XSRETURN_YES;
1674 
1675 unsigned long
1676 EnumClipbrdFmts(unsigned long fmt = 0, HAB hab = perl_hab_GET())
1677     C_ARGS: hab, fmt
1678 
1679 unsigned long
1680 AddAtom(char *pszAtomName, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1681     C_ARGS: hAtomTbl, pszAtomName
1682 
1683 unsigned long
1684 FindAtom(char *pszAtomName, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1685     C_ARGS: hAtomTbl, pszAtomName
1686 
1687 unsigned long
1688 _DeleteAtom(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1689     PROTOTYPE: DISABLE
1690     C_ARGS: hAtomTbl, atom
1691 
1692 #if 0
1693 
1694 unsigned long
1695 WinDeleteAtom(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1696     C_ARGS: hAtomTbl, atom
1697 
1698 #endif
1699 
1700 void
1701 Alarm(unsigned long rgfType = WA_ERROR, HWND hwndDesktop = HWND_DESKTOP)
1702     C_ARGS: hwndDesktop, rgfType
1703     POSTCALL:
1704 	XSRETURN_YES;
1705 
1706 void
1707 FlashWindow(HWND hwndFrame, bool fFlash)
1708     POSTCALL:
1709 	XSRETURN_YES;
1710 
1711 STRLEN
1712 StrLen(ULONG addr, ULONG lim, I32 unitsize = 1)
1713 
1714 MODULE = OS2::Process		PACKAGE = OS2::Process	PREFIX = myQuery
1715 
1716 SV *
1717 myQueryWindowText(HWND hwnd)
1718 
1719 SV *
1720 myQueryClassName(HWND hwnd)
1721 
1722 MODULE = OS2::Process		PACKAGE = OS2::Process	PREFIX = Query
1723 
1724 unsigned long
1725 QueryFocusWindow(HWND hwndDesktop = HWND_DESKTOP)
1726 
1727 long
1728 QueryWindowTextLength(HWND hwnd)
1729 
1730 SV *
1731 QueryWindowSWP(HWND hwnd)
1732 
1733 unsigned long
1734 QueryWindowULong(HWND hwnd, long index)
1735 
1736 unsigned short
1737 QueryWindowUShort(HWND hwnd, long index)
1738 
1739 unsigned long
1740 QueryActiveWindow(HWND hwnd = HWND_DESKTOP)
1741 
1742 unsigned long
1743 QueryDesktopWindow(HAB hab = Acquire_hab(), unsigned long hdc = NULLHANDLE)
1744 
1745 unsigned long
1746 QueryClipbrdData(unsigned long fmt = CF_TEXT, HAB hab = perl_hab_GET())
1747     C_ARGS: hab, fmt
1748     PROTOTYPE: DISABLE
1749 
1750 ULONG
1751 QueryMemoryRegionSize(ULONG addr, OUTLIST ULONG flagp, ULONG len = 0xFFFFFFFF - addr, I32 interrupt = 1)
1752 
1753 unsigned long
1754 QueryClipbrdViewer(HAB hab = perl_hab_GET())
1755 
1756 unsigned long
1757 QueryClipbrdOwner(HAB hab = perl_hab_GET())
1758 
1759 void
1760 CloseClipbrd(HAB hab = perl_hab_GET())
1761     POSTCALL:
1762 	XSRETURN_YES;
1763 
1764 void
1765 EmptyClipbrd(HAB hab = perl_hab_GET())
1766    POSTCALL:
1767 	XSRETURN_YES;
1768 
1769 bool
1770 OpenClipbrd(HAB hab = perl_hab_GET())
1771 
1772 unsigned long
1773 QueryAtomUsage(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1774     C_ARGS: hAtomTbl, atom
1775 
1776 unsigned long
1777 QueryAtomLength(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1778     C_ARGS: hAtomTbl, atom
1779    POSTCALL:
1780 	if (!RETVAL)
1781 	    XSRETURN_EMPTY;
1782 
1783 unsigned long
1784 QuerySystemAtomTable()
1785 
1786 unsigned long
1787 QuerySysPointer(long lId, bool fCopy = 1, HWND hwndDesktop = HWND_DESKTOP)
1788     C_ARGS: hwndDesktop, lId, fCopy
1789 
1790 unsigned long
1791 CreateAtomTable(unsigned long initial = 0, unsigned long buckets = 0)
1792 
1793 unsigned long
1794 _DestroyAtomTable(HATOMTBL hAtomTbl)
1795     PROTOTYPE: DISABLE
1796 
1797 
1798 MODULE = OS2::Process		PACKAGE = OS2::Process	PREFIX = myWinQuery
1799 
1800 unsigned long
1801 myWinQueryWindowPtr(HWND hwnd, long index)
1802 
1803 NO_OUTPUT BOOL
1804 myWinQueryWindowProcess(HWND hwnd, OUTLIST unsigned long pid, OUTLIST unsigned long tid)
1805    PROTOTYPE: $
1806    POSTCALL:
1807 	if (CheckWinError(RETVAL))
1808 	    croak_with_os2error("WindowProcess() error");
1809 
1810 SV *
1811 myWinQueryActiveDesktopPathname()
1812 
1813 void
1814 myWinQueryClipbrdFmtInfo(OUTLIST unsigned long prgfFmtInfo, unsigned long fmt = CF_TEXT, HAB hab = perl_hab_GET())
1815    C_ARGS: hab, fmt, &prgfFmtInfo
1816 
1817 SV *
1818 myWinQueryAtomName(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1819 
1820 MODULE = OS2::Process		PACKAGE = OS2::Process	PREFIX = myWin
1821 
1822 int
1823 myWinSwitchToProgram(HSWITCH hsw = switch_of(NULLHANDLE, getpid()))
1824     PREINIT:
1825 	ULONG rc;
1826 
1827 #if 0
1828 
1829 unsigned long
1830 myWinMessageBox(unsigned long pszText, char* pszCaption = "Perl script message", unsigned long flStyle = MB_CANCEL | MB_ICONHAND, HWND hwndParent = HWND_DESKTOP, HWND hwndOwner = HWND_DESKTOP, unsigned long idWindow = 0)
1831     C_ARGS: hwndParent, hwndOwner, pszText, pszCaption, idWindow, flStyle
1832 
1833 #endif
1834 
1835 unsigned long
1836 _MessageBox(char* pszText, char* pszCaption = "Perl script message", unsigned long flStyle = MB_CANCEL | MB_INFORMATION | MB_MOVEABLE, HWND hwndParent = HWND_DESKTOP, HWND hwndOwner = NULLHANDLE, unsigned long idWindow = 0)
1837     C_ARGS: hwndParent, hwndOwner, pszText, pszCaption, idWindow, flStyle
1838     POSTCALL:
1839 	if (RETVAL == MBID_ERROR)
1840 	    RETVAL = 0;
1841 
1842 unsigned long
1843 _MessageBox2(char *pszText, char* pmb2info, char *pszCaption = "Perl script message", HWND hwndParent = HWND_DESKTOP, HWND hwndOwner = NULLHANDLE, unsigned long idWindow = 0)
1844     C_ARGS: hwndParent, hwndOwner, pszText, pszCaption, idWindow, (PMB2INFO)pmb2info
1845     POSTCALL:
1846 	if (RETVAL == MBID_ERROR)
1847 	    RETVAL = 0;
1848 
1849 MODULE = OS2::Process		PACKAGE = OS2::Process	PREFIX = myWinQuery
1850 
1851 MODULE = OS2::Process		PACKAGE = OS2::Process	PREFIX = get
1852 
1853 int
1854 getppid()
1855 
1856 int
1857 ppidOf(int pid = getpid())
1858 
1859 int
1860 sidOf(int pid = getpid())
1861 
1862 void
1863 getscrsize(OUTLIST int wp, OUTLIST int hp)
1864   PROTOTYPE:
1865 
1866 bool
1867 scrsize_set(int w_or_h, int h = -9999)
1868 
1869 void
1870 get_InvalidateRect(HWND hwnd, char *prcl, bool fIncludeChildren)
1871 
1872 void
1873 get_CreateFrameControls(HWND hwndFrame, char *pfcdata, char* pszTitle)
1874 
1875 MODULE = OS2::Process		PACKAGE = OS2::Process	PREFIX = ul
1876 
1877 unsigned long
1878 ulMPFROMSHORT(unsigned short i)
1879 
1880 unsigned long
1881 ulMPVOID()
1882 
1883 unsigned long
1884 ulMPFROMCHAR(unsigned char i)
1885 
1886 unsigned long
1887 ulMPFROM2SHORT(unsigned short x1, unsigned short x2)
1888   PROTOTYPE: DISABLE
1889 
1890 unsigned long
1891 ulMPFROMSH2CH(unsigned short s, unsigned char c1, unsigned char c2)
1892   PROTOTYPE: DISABLE
1893 
1894 unsigned long
1895 ulMPFROMLONG(unsigned long x)
1896 
1897