This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / os2 / OS2 / Process / Process.xs
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
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 *
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
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(HWND, QueryClipbrdViewer, (HAB hab), (hab));
319 DeclWinFunc_CACHE(HWND, QueryClipbrdOwner, (HAB hab), (hab));
320 DeclWinFunc_CACHE(BOOL, QueryClipbrdFmtInfo, (HAB hab, ULONG fmt, PULONG prgfFmtInfo), (hab, fmt, prgfFmtInfo));
321 DeclWinFunc_CACHE(ULONG, QueryClipbrdData, (HAB hab, ULONG fmt), (hab, fmt));
322 DeclWinFunc_CACHE(HWND, SetClipbrdViewer, (HAB hab, HWND hwnd), (hab, hwnd));
323 DeclWinFunc_CACHE(HWND, SetClipbrdOwner, (HAB hab, HWND hwnd), (hab, hwnd));
324 DeclWinFunc_CACHE(ULONG, EnumClipbrdFmts, (HAB hab, ULONG fmt), (hab, fmt));
325 DeclWinFunc_CACHE(ATOM, AddAtom, (HATOMTBL hAtomTbl, PCSZ pszAtomName),
326                   (hAtomTbl, pszAtomName));
327 DeclWinFunc_CACHE(ATOM, FindAtom, (HATOMTBL hAtomTbl, PCSZ pszAtomName),
328                   (hAtomTbl, pszAtomName));
329 DeclWinFunc_CACHE(ATOM, DeleteAtom, (HATOMTBL hAtomTbl, PCSZ pszAtomName),
330                   (hAtomTbl, pszAtomName));
331 DeclWinFunc_CACHE(ULONG, QueryAtomUsage, (HATOMTBL hAtomTbl, ATOM atom),
332                   (hAtomTbl, atom));
333 DeclWinFunc_CACHE(ULONG, QueryAtomLength, (HATOMTBL hAtomTbl, ATOM atom),
334                   (hAtomTbl, atom));
335 DeclWinFunc_CACHE(ULONG, QueryAtomName,
336                   (HATOMTBL hAtomTbl, ATOM atom, PSZ pchBuffer, ULONG cchBufferMax),
337                   (hAtomTbl, atom, pchBuffer, cchBufferMax));
338 DeclWinFunc_CACHE(HATOMTBL, QuerySystemAtomTable, (VOID), ());
339 DeclWinFunc_CACHE(HATOMTBL, CreateAtomTable, (ULONG initial, ULONG buckets),
340                   (initial, buckets));
341 DeclWinFunc_CACHE(HATOMTBL, DestroyAtomTable, (HATOMTBL hAtomTbl), (hAtomTbl));
342 DeclWinFunc_CACHE(ULONG, MessageBox, (HWND hwndParent, HWND hwndOwner, PCSZ pszText, PCSZ pszCaption, ULONG idWindow, ULONG flStyle), (hwndParent, hwndOwner, pszText, pszCaption, idWindow, flStyle));
343 DeclWinFunc_CACHE(ULONG, MessageBox2,
344                   (HWND hwndParent, HWND hwndOwner, PCSZ pszText,
345                    PCSZ pszCaption, ULONG idWindow, PMB2INFO pmb2info),
346                   (hwndParent, hwndOwner, pszText, pszCaption, idWindow, pmb2info));
347 DeclWinFunc_CACHE(HPOINTER, LoadPointer,
348                   (HWND hwndDesktop, HMODULE hmod, ULONG idres),
349                   (hwndDesktop, hmod, idres));
350 DeclWinFunc_CACHE(HPOINTER, QuerySysPointer,
351                   (HWND hwndDesktop, LONG lId, BOOL fCopy),
352                   (hwndDesktop, lId, fCopy));
353 DeclWinFunc_CACHE(BOOL, Alarm, (HWND hwndDesktop, ULONG rgfType), (hwndDesktop, rgfType));
354 DeclWinFunc_CACHE(BOOL, FlashWindow, (HWND hwndFrame, BOOL fFlash), (hwndFrame, fFlash));
355
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
382 /* No die()ing on error */
383 DeclWinFunc_CACHE_survive(BOOL, IsWindow, (HAB hab, HWND hwnd), (hab, hwnd))
384
385 /* These functions are called frow complicated wrappers: */
386 ULONG (*pWinQuerySwitchList) (HAB hab, PSWBLOCK pswblk, ULONG usDataLength);
387 ULONG (*pWinChangeSwitchEntry) (HSWITCH hsw, __const__ SWCNTRL *pswctl);
388 HWND (*pWinWindowFromPoint)(HWND hwnd, __const__ POINTL *pptl, BOOL fChildren);
389
390
391 /* These functions have different names/signatures than what is
392    declared above */
393 #define QueryFocusWindow QueryFocus
394 #define FocusWindow_set(hwndFocus, hwndDesktop) SetFocus(hwndDesktop, hwndFocus)
395 #define WindowPos_set(hwnd, x, y, fl, cx, cy, hwndInsertBehind) \
396         SetWindowPos(hwnd, hwndInsertBehind, x, y, cx, cy, fl)
397 #define myWinQueryWindowPtr(hwnd, i)    ((ULONG)QueryWindowPtr(hwnd, i))
398 #define _ClipbrdData_set SetClipbrdData
399 #define ClipbrdOwner_set SetClipbrdOwner
400 #define ClipbrdViewer_set SetClipbrdViewer
401
402 int
403 WindowText_set(HWND hwnd, char* text)
404 {
405    return !CheckWinError(myWinSetWindowText(hwnd, text));
406 }
407
408 SV *
409 myQueryWindowText(HWND hwnd)
410 {
411     LONG l = QueryWindowTextLength(hwnd), len;
412     SV *sv;
413     STRLEN n_a;
414
415     if (l == 0) {
416         if (Perl_rc)            /* Last error */
417             return &PL_sv_undef;
418         return &PL_sv_no;
419     }
420     sv = newSVpvn("", 0);
421     SvGROW(sv, l + 1);
422     len = QueryWindowText(hwnd, l + 1, SvPV_force(sv, n_a));
423     if (len != l) {
424         Safefree(sv);
425         croak("WinQueryWindowText() uncompatible with WinQueryWindowTextLength()");
426     }
427     SvCUR_set(sv, l);
428     return sv;
429 }
430
431 SWP
432 QueryWindowSWP_(HWND hwnd)
433 {
434     SWP swp;
435
436     if (!QueryWindowPos(hwnd, &swp))
437         croak("WinQueryWindowPos() error");
438     return swp;
439 }
440
441 SV *
442 QueryWindowSWP(HWND hwnd)
443 {
444     SWP swp = QueryWindowSWP_(hwnd);
445
446     return newSVpvn((char*)&swp, sizeof(swp));
447 }
448
449 SV *
450 myQueryClassName(HWND hwnd)
451 {
452     SV *sv = newSVpvn("",0);
453     STRLEN l = 46, len = 0, n_a;
454
455     while (l + 1 >= len) {
456         if (len)
457             len = 2*len + 10;           /* Grow quick */
458         else
459             len = l + 2;
460         SvGROW(sv, len);
461         l = QueryClassName(hwnd, len, SvPV_force(sv, n_a));
462     }
463     SvCUR_set(sv, l);
464     return sv;
465 }
466
467 HWND
468 WindowFromPoint(long x, long y, HWND hwnd, BOOL fChildren)
469 {
470     POINTL ppl;
471
472     ppl.x = x; ppl.y = y;
473     if (!pWinWindowFromPoint)
474         AssignFuncPByORD(pWinWindowFromPoint, ORD_WinWindowFromPoint);
475     return SaveWinError(pWinWindowFromPoint(hwnd, &ppl, fChildren));
476 }
477
478 static HSWITCH
479 switch_of(HWND hwnd, PID pid)
480 {
481          HSWITCH hSwitch;    
482
483          if (!(_emx_env & 0x200)) 
484              croak("switch_entry not implemented on DOS"); /* not OS/2. */
485          if (CheckWinError(hSwitch = 
486                            myWinQuerySwitchHandle(hwnd, pid)))
487              croak_with_os2error("WinQuerySwitchHandle");
488          return hSwitch;
489 }
490
491
492 static void
493 fill_swentry(SWENTRY *swentryp, HWND hwnd, PID pid)
494 {
495          int rc;
496          HSWITCH hSwitch = switch_of(hwnd, pid);
497
498          swentryp->hswitch = hSwitch;
499          if (CheckOSError(myWinQuerySwitchEntry(hSwitch, &swentryp->swctl)))
500              croak_with_os2error("WinQuerySwitchEntry");
501 }
502
503 static void
504 fill_swentry_default(SWENTRY *swentryp)
505 {
506         fill_swentry(swentryp, NULLHANDLE, getpid());
507 }
508
509 static SV*
510 myWinQueryActiveDesktopPathname()
511 {
512     SV *buf = newSVpv("",0);
513     STRLEN n_a;
514
515     SvGROW(buf, MAXPATHLEN);
516     QueryActiveDesktopPathname(SvPV(buf,n_a), MAXPATHLEN);
517     SvCUR_set(buf, strlen(SvPV(buf, n_a)));
518     return buf;
519 }
520
521 SV *
522 myWinQueryAtomName(ATOM atom, HATOMTBL hAtomTbl)
523 {
524     ULONG len = QueryAtomLength(hAtomTbl, atom);
525     SV *sv = newSVpvn("",0);
526     STRLEN n_a;
527
528     SvGROW(sv, len + 1);
529     QueryAtomName(hAtomTbl, atom, SvPV(sv, n_a), len);
530     SvCUR_set(sv, len);
531     *SvEND(sv) = 0;
532     return sv;
533 }
534
535 #define myWinQueryClipbrdFmtInfo        QueryClipbrdFmtInfo
536
537 /* Put data into shared memory, then call SetClipbrdData */
538 void
539 ClipbrdData_set(SV *sv, int convert_nl, unsigned long fmt, unsigned long rgfFmtInfo, HAB hab)
540 {
541     STRLEN len;
542     char *buf = SvPV_force(sv, len);
543     char *pByte = 0, *s = buf, c;
544     ULONG nls = 0, rc;
545
546     if (convert_nl) {
547         while ((c = *s++)) {
548             if (c == '\r' && *s == '\n')
549                 s++;
550             else if (c == '\n')
551                 nls++;
552         }
553     }
554
555     if (CheckOSError(DosAllocSharedMem((PPVOID)&pByte, 0, len + nls + 1,
556                                        PAG_WRITE | PAG_COMMIT | OBJ_GIVEABLE | OBJ_GETTABLE)))
557         croak_with_os2error("ClipbrdData_set: DosAllocSharedMem error");
558
559     if (!nls)
560         memcpy(pByte, buf, len + 1);
561     else {
562         char *t = pByte, *e = buf + len;
563
564         while (buf < e) {
565             c = *t++ = *buf++;
566             if (c == '\n' && (t == pByte + 1 || t[-2] != '\r'))
567                 t[-1] = '\r', *t++ = '\n';
568         }
569     }
570
571     if (!SetClipbrdData(hab, (ULONG)pByte, fmt, rgfFmtInfo)) {
572         DosFreeMem((PPVOID)&pByte);
573         croak_with_os2error("ClipbrdData_set: WinSetClipbrdData error");
574     }
575 }
576
577 #if 0
578
579 ULONG
580 myWinMessageBox(HWND hwndParent, HWND hwndOwner, PCSZ pszText, PCSZ pszCaption, ULONG idWindow, ULONG flStyle)
581 {
582     ULONG rc = MessageBox(hwndParent, hwndOwner, pszText, pszCaption,
583                           idWindow, flStyle);
584
585     if (rc == MBID_ERROR)
586         rc = 0;
587     if (CheckWinError(rc))
588         croak_with_os2error("MessageBox");
589     return rc;
590 }
591
592 ULONG
593 myWinMessageBox2(HWND hwndParent, HWND hwndOwner, PCSZ pszText,
594                    PCSZ pszCaption, ULONG idWindow, PMB2INFO pmb2info)
595 {
596     ULONG rc = MessageBox2(hwndParent, hwndOwner, pszText, pszCaption, idWindow, pmb2info);
597
598     if (rc == MBID_ERROR)
599         rc = 0;
600     if (CheckWinError(rc))
601         croak_with_os2error("MessageBox2");
602     return rc;
603 }
604 #endif
605
606 /* static ULONG (* APIENTRY16 pDosSmSetTitle)(ULONG, PSZ); */
607 ULONG _THUNK_FUNCTION(DosSmSetTitle)(ULONG, PSZ);
608
609 #if 0                   /*  Does not work.  */
610 static ULONG (*pDosSmSetTitle)(ULONG, PSZ);
611
612 static void
613 sesmgr_title_set(char *s)
614 {
615     SWENTRY swentry;
616     static HMODULE hdosc = 0;
617     BYTE buf[20];
618     long rc;
619
620     fill_swentry_default(&swentry);
621     if (!pDosSmSetTitle || !hdosc) {
622         if (CheckOSError(DosLoadModule(buf, sizeof buf, "sesmgr", &hdosc)))
623             croak("Cannot load SESMGR: no `%s'", buf);
624         if (CheckOSError(DosQueryProcAddr(hdosc, 0, "DOSSMSETTITLE",
625                                           (PFN*)&pDosSmSetTitle)))
626             croak("Cannot load SESMGR.DOSSMSETTITLE, err=%ld", rc);
627     }
628 /*     (pDosSmSetTitle)(swcntrl.idSession,s); */
629     rc = ((USHORT)
630           (_THUNK_PROLOG (2+4);
631            _THUNK_SHORT (swcntrl.idSession);
632            _THUNK_FLAT (s);
633            _THUNK_CALLI (*pDosSmSetTitle)));
634     if (CheckOSError(rc))
635         warn("*DOSSMSETTITLE: err=%ld, ses=%ld, addr=%x, *paddr=%x", 
636              rc, swcntrl.idSession, &_THUNK_FUNCTION(DosSmSetTitle),
637              pDosSmSetTitle);
638 }
639
640 #else /* !0 */
641
642 static bool
643 sesmgr_title_set(char *s)
644 {
645     SWENTRY swentry;
646     long rc;
647
648     fill_swentry_default(&swentry);
649     rc = ((USHORT)
650           (_THUNK_PROLOG (2+4);
651            _THUNK_SHORT (swentry.swctl.idSession);
652            _THUNK_FLAT (s);
653            _THUNK_CALL (DosSmSetTitle)));
654 #if 0
655     if (CheckOSError(rc))
656         warn("DOSSMSETTITLE: err=%ld, ses=%ld, addr=%x", 
657              rc, swcntrl.idSession, _THUNK_FUNCTION(DosSmSetTitle));
658 #endif
659     return !CheckOSError(rc);
660 }
661 #endif /* !0 */
662
663 #if 0                   /*  Does not work.  */
664 USHORT _THUNK_FUNCTION(Win16SetTitle) ();
665
666 static void
667 set_title2(char *s)
668 {
669     long rc;
670
671     rc = ((USHORT)
672           (_THUNK_PROLOG (4);
673            _THUNK_FLAT (s);
674            _THUNK_CALL (Win16SetTitle)));
675     if (CheckWinError(rc))
676         warn("Win16SetTitle: err=%ld", rc);
677 }
678 #endif
679
680 SV *
681 process_swentry(unsigned long pid, HWND hwnd)
682 {
683     SWENTRY swentry;
684
685     if (!(_emx_env & 0x200)) 
686              croak("process_swentry not implemented on DOS"); /* not OS/2. */
687     fill_swentry(&swentry, hwnd, pid);
688     return newSVpvn((char*)&swentry, sizeof(swentry));
689 }
690
691 SV *
692 swentries_list()
693 {
694     int num, n = 0;
695     STRLEN n_a;
696     PSWBLOCK pswblk;
697     SV *sv = newSVpvn("",0);
698
699     if (!(_emx_env & 0x200)) 
700              croak("swentries_list not implemented on DOS"); /* not OS/2. */
701     if (!pWinQuerySwitchList)
702         AssignFuncPByORD(pWinQuerySwitchList, ORD_WinQuerySwitchList);
703     num = pWinQuerySwitchList(0, NULL, 0);      /* HAB is not required */
704     if (!num)
705         croak("(Unknown) error during WinQuerySwitchList()");
706     /* Allow one extra entry to allow overflow detection (may happen
707         if the list has been changed). */
708     while (num > n) {
709         if (n == 0)
710             n = num + 1;
711         else
712             n = 2*num + 10;                     /* Enlarge quickly */
713         SvGROW(sv, sizeof(ULONG) + sizeof(SWENTRY) * n + 1);
714         pswblk = (PSWBLOCK) SvPV_force(sv, n_a);
715         num = pWinQuerySwitchList(0, pswblk, SvLEN(sv));
716     }
717     SvCUR_set(sv, sizeof(ULONG) + sizeof(SWENTRY) * num);
718     *SvEND(sv) = 0;
719     return sv;
720 }
721
722 SWENTRY
723 swentry( char *title, HWND sw_hwnd, HWND icon_hwnd, HPROGRAM owner_phandle,
724          PID owner_pid, ULONG owner_sid, ULONG visible, ULONG nonswitchable,
725          ULONG jumpable, ULONG ptype, HSWITCH sw_entry)
726 {
727   SWENTRY e;
728
729   strncpy(e.swctl.szSwtitle, title, MAXNAMEL);
730   e.swctl.szSwtitle[60] = 0;
731   e.swctl.hwnd = sw_hwnd;
732   e.swctl.hwndIcon = icon_hwnd;
733   e.swctl.hprog = owner_phandle;
734   e.swctl.idProcess = owner_pid;
735   e.swctl.idSession = owner_sid;
736   e.swctl.uchVisibility = ((visible ? SWL_VISIBLE : SWL_INVISIBLE)
737                            | (nonswitchable ? SWL_GRAYED : 0));
738   e.swctl.fbJump = (jumpable ? SWL_JUMPABLE : 0);
739   e.swctl.bProgType = ptype;
740   e.hswitch = sw_entry;
741   return e;
742 }
743
744 SV *
745 create_swentry( char *title, HWND owner_hwnd, HWND icon_hwnd, HPROGRAM owner_phandle,
746          PID owner_pid, ULONG owner_sid, ULONG visible, ULONG nonswitchable,
747          ULONG jumpable, ULONG ptype, HSWITCH sw_entry)
748 {
749     SWENTRY e = swentry(title, owner_hwnd, icon_hwnd, owner_phandle, owner_pid,
750                         owner_sid, visible, nonswitchable, jumpable, ptype,
751                         sw_entry);
752
753     return newSVpvn((char*)&e, sizeof(e));
754 }
755
756 int
757 change_swentrysw(SWENTRY *sw)
758 {
759     ULONG rc;                   /* For CheckOSError */
760
761     if (!(_emx_env & 0x200)) 
762              croak("change_entry() not implemented on DOS"); /* not OS/2. */
763     if (!pWinChangeSwitchEntry)
764         AssignFuncPByORD(pWinChangeSwitchEntry, ORD_WinChangeSwitchEntry);
765     return !CheckOSError(pWinChangeSwitchEntry(sw->hswitch, &sw->swctl));
766 }
767
768 int
769 change_swentry(SV *sv)
770 {
771     STRLEN l;
772     PSWENTRY pswentry = (PSWENTRY)SvPV(sv, l);
773
774     if (l != sizeof(SWENTRY))
775         croak("Wrong structure size %ld!=%ld in change_swentry()", (long)l, (long)sizeof(SWENTRY));
776     return change_swentrysw(pswentry);
777 }
778
779
780 #define swentry_size()          (sizeof(SWENTRY))
781
782 void
783 getscrsize(int *wp, int *hp)
784 {
785     int i[2];
786
787     _scrsize(i);
788     *wp = i[0];
789     *hp = i[1];
790 }
791
792 /* Force vio to not cross 64K-boundary: */
793 #define VIO_FROM_VIOB                   \
794     vio = viob;                         \
795     if (!_THUNK_PTR_STRUCT_OK(vio))     \
796         vio++
797
798 bool
799 scrsize_set(int w, int h)
800 {
801     VIOMODEINFO viob[2], *vio;
802     ULONG rc;
803
804     VIO_FROM_VIOB;
805
806     if (h == -9999)
807         h = w, w = 0;
808     vio->cb = sizeof(*vio);
809     if (CheckOSError(VioGetMode( vio, 0 )))
810         return 0;
811
812     if( w > 0 )
813       vio->col = (USHORT)w;
814
815     if( h > 0 )
816       vio->row = (USHORT)h;
817
818     vio->cb = 8;
819     if (CheckOSError(VioSetMode( vio, 0 )))
820         return 0;
821     return 1;
822 }
823
824 void
825 cursor(int *sp, int *ep, int *wp, int *ap)
826 {
827     VIOCURSORINFO viob[2], *vio;
828     ULONG rc;
829
830     VIO_FROM_VIOB;
831
832     if (CheckOSError(VioGetCurType( vio, 0 )))
833         croak_with_os2error("VioGetCurType() error");
834
835     *sp = vio->yStart;
836     *ep = vio->cEnd;
837     *wp = vio->cx;
838     *ep = vio->attr;
839 }
840
841 bool
842 cursor__(int is_a)
843 {
844     int s,e,w,a;
845
846     cursor(&s, &e, &w, &a);
847     if (is_a)
848         return a;
849     else
850         return w;
851 }
852
853 bool
854 cursor_set(int s, int e, int w, int a)
855 {
856     VIOCURSORINFO viob[2], *vio;
857     ULONG rc;
858
859     VIO_FROM_VIOB;
860
861     vio->yStart = s;
862     vio->cEnd = e;
863     vio->cx = w;
864     vio->attr = a;
865     return !CheckOSError(VioSetCurType( vio, 0 ));
866 }
867
868 static int
869 bufsize(void)
870 {
871 #if 1
872     VIOMODEINFO viob[2], *vio;
873     ULONG rc;
874
875     VIO_FROM_VIOB;
876
877     vio->cb = sizeof(*vio);
878     if (CheckOSError(VioGetMode( vio, 0 )))
879         croak_with_os2error("Can't get size of buffer for screen");
880 #if 0   /* buf=323552247, full=1118455, partial=0 */
881     croak("Lengths: buf=%d, full=%d, partial=%d",vio->buf_length,vio->full_length,vio->partial_length);
882     return newSVpvn((char*)vio->buf_addr, vio->full_length);
883 #endif
884     return vio->col * vio->row * 2;     /* How to get bytes/cell?  2 or 4? */
885 #else   /* 0 */
886     int i[2];
887
888     _scrsize(i);
889     return i[0]*i[1]*2;
890 #endif  /* 0 */
891 }
892     
893 SV *
894 screen(void)
895 {
896     ULONG rc;
897     USHORT bufl = bufsize();
898     char b[(1<<16) * 3]; /* This/3 is enough for 16-bit calls, we need
899                             2x overhead due to 2 vs 4 issue, and extra
900                             64K due to alignment logic */
901     char *buf = b;
902     
903     if (((ULONG)buf) & 0xFFFF)
904         buf += 0x10000 - (((ULONG)buf) & 0xFFFF);
905     if ((sizeof(b) - (buf - b)) < 2*bufl)
906         croak("panic: VIO buffer allocation");
907     if (CheckOSError(VioReadCellStr( buf, &bufl, 0, 0, 0 )))
908         return &PL_sv_undef;
909     return newSVpvn(buf,bufl);
910 }
911
912 bool
913 screen_set(SV *sv)
914 {
915     ULONG rc;
916     STRLEN l = SvCUR(sv), bufl = bufsize();
917     char b[(1<<16) * 2]; /* This/2 is enough for 16-bit calls, we need
918                             extra 64K due to alignment logic */
919     char *buf = b;
920     
921     if (((ULONG)buf) & 0xFFFF)
922         buf += 0x10000 - (((ULONG)buf) & 0xFFFF);
923     if (!SvPOK(sv) || ((l != bufl) && (l != 2*bufl)))
924         croak("Wrong size %d of saved screen data", SvCUR(sv));
925     if ((sizeof(b) - (buf - b)) < l)
926         croak("panic: VIO buffer allocation");
927     Copy(SvPV(sv,l), buf, bufl, char);
928     if (CheckOSError(VioWrtCellStr( buf, bufl, 0, 0, 0 )))
929         return 0;
930     return 1;
931 }
932
933 int
934 process_codepages()
935 {
936     ULONG cps[4], cp, rc;
937
938     if (CheckOSError(DosQueryCp( sizeof(cps), cps, &cp )))
939         croak_with_os2error("DosQueryCp()");
940     return cp;
941 }
942
943 int
944 out_codepage()
945 {
946     USHORT cp, rc;
947
948     if (CheckOSError(VioGetCp( 0, &cp, 0 )))
949         croak_with_os2error("VioGetCp()");
950     return cp;
951 }
952
953 bool
954 out_codepage_set(int cp)
955 {
956     USHORT rc;
957
958     return !(CheckOSError(VioSetCp( 0, cp, 0 )));
959 }
960
961 int
962 in_codepage()
963 {
964     USHORT cp, rc;
965
966     if (CheckOSError(KbdGetCp( 0, &cp, 0 )))
967         croak_with_os2error("KbdGetCp()");
968     return cp;
969 }
970
971 bool
972 in_codepage_set(int cp)
973 {
974     USHORT rc;
975
976     return !(CheckOSError(KbdSetCp( 0, cp, 0 )));
977 }
978
979 bool
980 process_codepage_set(int cp)
981 {
982     USHORT rc;
983
984     return !(CheckOSError(DosSetProcessCp( cp )));
985 }
986
987 int
988 ppidOf(int pid)
989 {
990   PQTOPLEVEL psi;
991   int ppid;
992
993   if (!pid)
994       return -1;
995   psi = get_sysinfo(pid, QSS_PROCESS);
996   if (!psi)
997       return -1;
998   ppid = psi->procdata->ppid;
999   Safefree(psi);
1000   return ppid;
1001 }
1002
1003 int
1004 sidOf(int pid)
1005 {
1006   PQTOPLEVEL psi;
1007   int sid;
1008
1009   if (!pid)
1010       return -1;
1011   psi = get_sysinfo(pid, QSS_PROCESS);
1012   if (!psi)
1013       return -1;
1014   sid = psi->procdata->sessid;
1015   Safefree(psi);
1016   return sid;
1017 }
1018
1019 #define ulMPFROMSHORT(i)                ((unsigned long)MPFROMSHORT(i))
1020 #define ulMPVOID()                      ((unsigned long)MPVOID)
1021 #define ulMPFROMCHAR(i)                 ((unsigned long)MPFROMCHAR(i))
1022 #define ulMPFROM2SHORT(x1,x2)           ((unsigned long)MPFROM2SHORT(x1,x2))
1023 #define ulMPFROMSH2CH(s, c1, c2)        ((unsigned long)MPFROMSH2CH(s, c1, c2))
1024 #define ulMPFROMLONG(x)                 ((unsigned long)MPFROMLONG(x))
1025
1026 #define _MessageBox                     MessageBox
1027 #define _MessageBox2                    MessageBox2
1028
1029 MODULE = OS2::Process           PACKAGE = OS2::Process
1030
1031 PROTOTYPES: ENABLE
1032
1033 unsigned long
1034 constant(name,arg)
1035         char *          name
1036         int             arg
1037
1038 char *
1039 my_type()
1040
1041 U32
1042 file_type(path)
1043     char *path
1044
1045 SV *
1046 swentry_expand( SV *sv )
1047     PPCODE:
1048      {
1049          STRLEN l;
1050          PSWENTRY pswentry = (PSWENTRY)SvPV(sv, l);
1051
1052          if (l != sizeof(SWENTRY))
1053                 croak("Wrong structure size %ld!=%ld in swentry_expand()", (long)l, (long)sizeof(SWENTRY));
1054          EXTEND(sp,11);
1055          PUSHs(sv_2mortal(newSVpv(pswentry->swctl.szSwtitle, 0)));
1056          PUSHs(sv_2mortal(newSVnv(pswentry->swctl.hwnd)));
1057          PUSHs(sv_2mortal(newSVnv(pswentry->swctl.hwndIcon)));
1058          PUSHs(sv_2mortal(newSViv(pswentry->swctl.hprog)));
1059          PUSHs(sv_2mortal(newSViv(pswentry->swctl.idProcess)));
1060          PUSHs(sv_2mortal(newSViv(pswentry->swctl.idSession)));
1061          PUSHs(sv_2mortal(newSViv(pswentry->swctl.uchVisibility & SWL_VISIBLE)));
1062          PUSHs(sv_2mortal(newSViv(pswentry->swctl.uchVisibility & SWL_GRAYED)));
1063          PUSHs(sv_2mortal(newSViv(pswentry->swctl.fbJump == SWL_JUMPABLE)));
1064          PUSHs(sv_2mortal(newSViv(pswentry->swctl.bProgType)));
1065          PUSHs(sv_2mortal(newSViv(pswentry->hswitch)));
1066      }
1067
1068 SV *
1069 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)
1070 PROTOTYPE: DISABLE
1071
1072 int
1073 change_swentry( SV *sv )
1074
1075 bool
1076 sesmgr_title_set(s)
1077     char *s
1078
1079 SV *
1080 process_swentry(unsigned long pid = getpid(), HWND hwnd = NULLHANDLE);
1081   PROTOTYPE: DISABLE
1082
1083 int
1084 swentry_size()
1085
1086 SV *
1087 swentries_list()
1088
1089 void
1090 ResetWinError()
1091
1092 int
1093 WindowText_set(HWND hwndFrame, char *title)
1094
1095 bool
1096 FocusWindow_set(HWND hwndFocus, HWND hwndDesktop = HWND_DESKTOP)
1097
1098 bool
1099 ShowWindow(HWND hwnd, bool fShow = TRUE)
1100
1101 bool
1102 EnableWindow(HWND hwnd, bool fEnable = TRUE)
1103
1104 bool
1105 PostMsg(HWND hwnd, unsigned long msg, unsigned long mp1 = 0, unsigned long mp2 = 0)
1106     C_ARGS: hwnd, msg, (MPARAM)mp1, (MPARAM)mp2
1107
1108 bool
1109 WindowPos_set(HWND hwnd, long x, long y, unsigned long fl = SWP_MOVE, long cx = 0, long cy = 0, HWND hwndInsertBehind = HWND_TOP)
1110   PROTOTYPE: DISABLE
1111
1112 unsigned long
1113 BeginEnumWindows(HWND hwnd)
1114
1115 bool
1116 EndEnumWindows(unsigned long henum)
1117
1118 unsigned long
1119 GetNextWindow(unsigned long henum)
1120
1121 bool
1122 IsWindowVisible(HWND hwnd)
1123
1124 bool
1125 IsWindowEnabled(HWND hwnd)
1126
1127 bool
1128 IsWindowShowing(HWND hwnd)
1129
1130 unsigned long
1131 QueryWindow(HWND hwnd, long cmd)
1132
1133 unsigned long
1134 IsChild(HWND hwnd, HWND hwndParent)
1135
1136 unsigned long
1137 WindowFromId(HWND hwndParent, unsigned long id)
1138
1139 unsigned long
1140 WindowFromPoint(long x, long y, HWND hwnd = HWND_DESKTOP, bool fChildren = TRUE)
1141 PROTOTYPE: DISABLE
1142
1143 unsigned long
1144 EnumDlgItem(HWND hwndDlg, unsigned long code, HWND hwnd = NULLHANDLE)
1145    C_ARGS: hwndDlg, hwnd, code
1146
1147 bool
1148 EnableWindowUpdate(HWND hwnd, bool fEnable = TRUE)
1149
1150 bool
1151 SetWindowBits(HWND hwnd, long index, unsigned long flData, unsigned long flMask)
1152
1153 bool
1154 SetWindowPtr(HWND hwnd, long index, unsigned long p)
1155     C_ARGS: hwnd, index, (PVOID)p
1156
1157 bool
1158 SetWindowULong(HWND hwnd, long index, unsigned long i)
1159
1160 bool
1161 SetWindowUShort(HWND hwnd, long index, unsigned short i)
1162
1163 bool
1164 IsWindow(HWND hwnd, HAB hab = Acquire_hab())
1165     C_ARGS: hab, hwnd
1166
1167 BOOL
1168 ActiveWindow_set(HWND hwnd, HWND hwndDesktop = HWND_DESKTOP)
1169     CODE:
1170         RETVAL = SetActiveWindow(hwndDesktop, hwnd);
1171
1172 unsigned long
1173 LoadPointer(unsigned long idres, unsigned long hmod = 0, HWND hwndDesktop = HWND_DESKTOP)
1174     C_ARGS: hwndDesktop, hmod, idres
1175
1176 int
1177 out_codepage()
1178
1179 bool
1180 out_codepage_set(int cp)
1181
1182 int
1183 in_codepage()
1184
1185 bool
1186 in_codepage_set(int cp)
1187
1188 SV *
1189 screen()
1190
1191 bool
1192 screen_set(SV *sv)
1193
1194 SV *
1195 process_codepages()
1196   PPCODE:
1197   {
1198     ULONG cps[4], c, i = 0, rc;
1199
1200     if (CheckOSError(DosQueryCp( sizeof(cps), cps, &c )))
1201         c = 0;
1202     c /= sizeof(ULONG);
1203     if (c >= 3)
1204     EXTEND(sp, c);
1205     while (i < c)
1206         PUSHs(sv_2mortal(newSViv(cps[i++])));
1207   }
1208
1209 bool
1210 process_codepage_set(int cp)
1211
1212 void
1213 cursor(OUTLIST int stp, OUTLIST int ep, OUTLIST int wp, OUTLIST int ap)
1214   PROTOTYPE:
1215
1216 bool
1217 cursor_set(int s, int e, int w = cursor__(0), int a = cursor__(1))
1218
1219 NO_OUTPUT bool
1220 _ClipbrdData_set(unsigned long ulData, unsigned long fmt = CF_TEXT, unsigned long rgfFmtInfo = ((fmt == CF_TEXT || fmt == CF_DSPTEXT) ? CFI_POINTER : CFI_HANDLE), HAB hab = perl_hab_GET())
1221     PROTOTYPE: DISABLE
1222     C_ARGS: hab, ulData, fmt, rgfFmtInfo
1223     POSTCALL:
1224         if (CheckWinError(RETVAL))
1225             croak_with_os2error("_ClipbrdData_set() error");
1226
1227 void
1228 ClipbrdData_set(SV *text, int convert_nl = 1, unsigned long fmt = CF_TEXT, unsigned long rgfFmtInfo = ((fmt == CF_TEXT || fmt == CF_DSPTEXT) ? CFI_POINTER : CFI_HANDLE), HAB hab = perl_hab_GET())
1229     PROTOTYPE: DISABLE
1230
1231 void
1232 ClipbrdOwner_set(HWND hwnd, HAB hab = perl_hab_GET())
1233     C_ARGS: hab, hwnd
1234
1235 void
1236 ClipbrdViewer_set(HWND hwnd, HAB hab = perl_hab_GET())
1237     C_ARGS: hab, hwnd
1238
1239 unsigned long
1240 EnumClipbrdFmts(unsigned long fmt = 0, HAB hab = perl_hab_GET())
1241     C_ARGS: hab, fmt
1242
1243 unsigned long
1244 AddAtom(char *pszAtomName, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1245     C_ARGS: hAtomTbl, pszAtomName
1246
1247 unsigned long
1248 FindAtom(char *pszAtomName, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1249     C_ARGS: hAtomTbl, pszAtomName
1250
1251 unsigned long
1252 DeleteAtom(char *pszAtomName, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1253     C_ARGS: hAtomTbl, pszAtomName
1254
1255 void
1256 Alarm(unsigned long rgfType = WA_ERROR, HWND hwndDesktop = HWND_DESKTOP)
1257     C_ARGS: hwndDesktop, rgfType
1258
1259 void
1260 FlashWindow(HWND hwndFrame, bool fFlash)
1261
1262 MODULE = OS2::Process           PACKAGE = OS2::Process  PREFIX = myQuery
1263
1264 SV *
1265 myQueryWindowText(HWND hwnd)
1266
1267 SV *
1268 myQueryClassName(HWND hwnd)
1269
1270 MODULE = OS2::Process           PACKAGE = OS2::Process  PREFIX = Query
1271
1272 unsigned long
1273 QueryFocusWindow(HWND hwndDesktop = HWND_DESKTOP)
1274
1275 long
1276 QueryWindowTextLength(HWND hwnd)
1277
1278 SV *
1279 QueryWindowSWP(HWND hwnd)
1280
1281 unsigned long
1282 QueryWindowULong(HWND hwnd, long index)
1283
1284 unsigned short
1285 QueryWindowUShort(HWND hwnd, long index)
1286
1287 unsigned long
1288 QueryActiveWindow(HWND hwnd = HWND_DESKTOP)
1289
1290 unsigned long
1291 QueryDesktopWindow(HAB hab = Acquire_hab(), unsigned long hdc = NULLHANDLE)
1292
1293 unsigned long
1294 QueryClipbrdData(unsigned long fmt = CF_TEXT, HAB hab = perl_hab_GET())
1295     C_ARGS: hab, fmt
1296     PROTOTYPE: DISABLE
1297
1298 unsigned long
1299 QueryClipbrdViewer(HAB hab = perl_hab_GET())
1300
1301 unsigned long
1302 QueryClipbrdOwner(HAB hab = perl_hab_GET())
1303
1304 void
1305 CloseClipbrd(HAB hab = perl_hab_GET())
1306
1307 void
1308 EmptyClipbrd(HAB hab = perl_hab_GET())
1309
1310 bool
1311 OpenClipbrd(HAB hab = perl_hab_GET())
1312
1313 unsigned long
1314 QueryAtomUsage(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1315     C_ARGS: hAtomTbl, atom
1316
1317 unsigned long
1318 QueryAtomLength(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1319     C_ARGS: hAtomTbl, atom
1320
1321 unsigned long
1322 QuerySystemAtomTable()
1323
1324 unsigned long
1325 QuerySysPointer(long lId, bool fCopy = 1, HWND hwndDesktop = HWND_DESKTOP)
1326     C_ARGS: hwndDesktop, lId, fCopy
1327
1328 unsigned long
1329 CreateAtomTable(unsigned long initial = 0, unsigned long buckets = 0)
1330
1331 unsigned long
1332 DestroyAtomTable(HATOMTBL hAtomTbl)
1333
1334
1335 MODULE = OS2::Process           PACKAGE = OS2::Process  PREFIX = myWinQuery
1336
1337 unsigned long
1338 myWinQueryWindowPtr(HWND hwnd, long index)
1339
1340 NO_OUTPUT BOOL
1341 myWinQueryWindowProcess(HWND hwnd, OUTLIST unsigned long pid, OUTLIST unsigned long tid)
1342    PROTOTYPE: $
1343    POSTCALL:
1344         if (CheckWinError(RETVAL))
1345             croak_with_os2error("WindowProcess() error");
1346
1347 SV *
1348 myWinQueryActiveDesktopPathname()
1349
1350 void
1351 myWinQueryClipbrdFmtInfo(OUTLIST unsigned long prgfFmtInfo, unsigned long fmt = CF_TEXT, HAB hab = perl_hab_GET())
1352    C_ARGS: hab, fmt, &prgfFmtInfo
1353
1354 SV *
1355 myWinQueryAtomName(ATOM atom, HATOMTBL hAtomTbl = QuerySystemAtomTable())
1356
1357 MODULE = OS2::Process           PACKAGE = OS2::Process  PREFIX = myWin
1358
1359 int
1360 myWinSwitchToProgram(HSWITCH hsw = switch_of(NULLHANDLE, getpid()))
1361     PREINIT:
1362         ULONG rc;
1363
1364 #if 0
1365
1366 unsigned long
1367 myWinMessageBox(unsigned long pszText, char* pszCaption = "Perl script error", unsigned long flStyle = MB_CANCEL | MB_ICONHAND, HWND hwndParent = HWND_DESKTOP, HWND hwndOwner = HWND_DESKTOP, unsigned long idWindow = 0)
1368     C_ARGS: hwndParent, hwndOwner, pszText, pszCaption, idWindow, flStyle
1369
1370 #endif
1371
1372 unsigned long
1373 _MessageBox(char* pszText, char* pszCaption = "Perl script error", unsigned long flStyle = MB_CANCEL | MB_INFORMATION | MB_MOVEABLE, HWND hwndParent = HWND_DESKTOP, HWND hwndOwner = NULLHANDLE, unsigned long idWindow = 0)
1374     C_ARGS: hwndParent, hwndOwner, pszText, pszCaption, idWindow, flStyle
1375     POSTCALL:
1376         if (RETVAL == MBID_ERROR)
1377             RETVAL = 0;
1378
1379 unsigned long
1380 _MessageBox2(char *pszText, char* pmb2info, char *pszCaption, HWND hwndParent = HWND_DESKTOP, HWND hwndOwner = NULLHANDLE, unsigned long idWindow = 0)
1381     C_ARGS: hwndParent, hwndOwner, pszText, pszCaption, idWindow, (PMB2INFO)pmb2info
1382     POSTCALL:
1383         if (RETVAL == MBID_ERROR)
1384             RETVAL = 0;
1385
1386 MODULE = OS2::Process           PACKAGE = OS2::Process  PREFIX = myWinQuery
1387
1388 MODULE = OS2::Process           PACKAGE = OS2::Process  PREFIX = get
1389
1390 int
1391 getppid()
1392
1393 int
1394 ppidOf(int pid = getpid())
1395
1396 int
1397 sidOf(int pid = getpid())
1398
1399 void
1400 getscrsize(OUTLIST int wp, OUTLIST int hp)
1401   PROTOTYPE:
1402
1403 bool
1404 scrsize_set(int w_or_h, int h = -9999)
1405
1406 void
1407 get_InvalidateRect(HWND hwnd, char *prcl, bool fIncludeChildren)
1408
1409 void
1410 get_CreateFrameControls(HWND hwndFrame, char *pfcdata, char* pszTitle)
1411
1412 MODULE = OS2::Process           PACKAGE = OS2::Process  PREFIX = ul
1413
1414 unsigned long
1415 ulMPFROMSHORT(unsigned short i)
1416
1417 unsigned long
1418 ulMPVOID()
1419
1420 unsigned long
1421 ulMPFROMCHAR(unsigned char i)
1422
1423 unsigned long
1424 ulMPFROM2SHORT(unsigned short x1, unsigned short x2)
1425   PROTOTYPE: DISABLE
1426
1427 unsigned long
1428 ulMPFROMSH2CH(unsigned short s, unsigned char c1, unsigned char c2)
1429   PROTOTYPE: DISABLE
1430
1431 unsigned long
1432 ulMPFROMLONG(unsigned long x)
1433