[ID 20020213.015] Pod::Html XHTML update for 5.7.2
[p5sagit/p5-mst-13.2.git] / os2 / OS2 / Process / Process.pm
CommitLineData
35bc1fdc 1package OS2::localMorphPM;
2
3sub new { my ($c,$f) = @_; OS2::MorphPM($f); bless [shift], $c }
4sub DESTROY { OS2::UnMorphPM(shift->[0]) }
5
760ac839 6package OS2::Process;
7
35bc1fdc 8BEGIN {
9 require Exporter;
10 require DynaLoader;
11 #require AutoLoader;
7f61b687 12
35bc1fdc 13 @ISA = qw(Exporter DynaLoader);
14 $VERSION = "1.0";
15 bootstrap OS2::Process;
16}
760ac839 17
760ac839 18# Items to export into callers namespace by default. Note: do not export
19# names by default without a very good reason. Use EXPORT_OK instead.
20# Do not simply export all your public functions/methods/constants.
21@EXPORT = qw(
22 P_BACKGROUND
23 P_DEBUG
24 P_DEFAULT
25 P_DETACH
26 P_FOREGROUND
27 P_FULLSCREEN
28 P_MAXIMIZE
29 P_MINIMIZE
30 P_NOCLOSE
31 P_NOSESSION
32 P_NOWAIT
33 P_OVERLAY
34 P_PM
35 P_QUOTE
36 P_SESSION
37 P_TILDE
38 P_UNRELATED
39 P_WAIT
40 P_WINDOWED
7f61b687 41 my_type
42 file_type
43 T_NOTSPEC
44 T_NOTWINDOWCOMPAT
45 T_WINDOWCOMPAT
46 T_WINDOWAPI
47 T_BOUND
48 T_DLL
49 T_DOS
50 T_PHYSDRV
51 T_VIRTDRV
52 T_PROTDLL
53 T_32BIT
35bc1fdc 54 ppid
55 ppidOf
56 sidOf
57 scrsize
58 scrsize_set
7f61b687 59 process_entry
35bc1fdc 60 process_entries
61 process_hentry
62 process_hentries
63 change_entry
64 change_entryh
65 Title_set
66 Title
67 WindowText
68 WindowText_set
69 WindowPos
70 WindowPos_set
71 WindowProcess
72 SwitchToProgram
73 ActiveWindow
74 ClassName
75 FocusWindow
76 FocusWindow_set
77 ShowWindow
78 PostMsg
79 BeginEnumWindows
80 EndEnumWindows
81 GetNextWindow
82 IsWindow
83 ChildWindows
84 out_codepage
85 out_codepage_set
86 in_codepage
87 in_codepage_set
88 cursor
89 cursor_set
90 screen
91 screen_set
92 process_codepages
93 QueryWindow
94 WindowFromId
95 WindowFromPoint
96 EnumDlgItem
bd60b2b9 97
98 get_title
99 set_title
760ac839 100);
35bc1fdc 101
760ac839 102sub AUTOLOAD {
103 # This AUTOLOAD is used to 'autoload' constants from the constant()
104 # XS function. If a constant is not found then control is passed
105 # to the AUTOLOAD in AutoLoader.
106
107 local($constname);
108 ($constname = $AUTOLOAD) =~ s/.*:://;
109 $val = constant($constname, @_ ? $_[0] : 0);
110 if ($! != 0) {
9c024a02 111 if ($! =~ /Invalid/ || $!{EINVAL}) {
760ac839 112 $AutoLoader::AUTOLOAD = $AUTOLOAD;
113 goto &AutoLoader::AUTOLOAD;
114 }
115 else {
116 ($pack,$file,$line) = caller;
117 die "Your vendor has not defined OS2::Process macro $constname, used at $file line $line.
118";
119 }
120 }
121 eval "sub $AUTOLOAD { $val }";
122 goto &$AUTOLOAD;
123}
124
760ac839 125# Preloaded methods go here.
126
35bc1fdc 127sub Title () { (process_entry())[0] }
128
129# *Title_set = \&sesmgr_title_set;
130
131sub swTitle_set_sw {
132 my ($title, @sw) = @_;
133 $sw[0] = $title;
134 change_entry(@sw);
135}
136
137sub swTitle_set {
138 my (@sw) = process_entry();
139 swTitle_set_sw(shift, @sw);
140}
141
142sub winTitle_set_sw {
143 my ($title, @sw) = @_;
144 my $h = OS2::localMorphPM->new(0);
145 WindowText_set $sw[1], $title;
146}
147
148sub winTitle_set {
149 my (@sw) = process_entry();
150 winTitle_set_sw(shift, @sw);
151}
152
153sub bothTitle_set {
154 my (@sw) = process_entry();
155 my $t = shift;
156 winTitle_set_sw($t, @sw);
157 swTitle_set_sw($t, @sw);
158}
159
160sub Title_set {
161 my $t = shift;
162 return 1 if sesmgr_title_set($t);
163 return 0 unless $^E == 372;
164 my (@sw) = process_entry();
165 winTitle_set_sw($t, @sw);
166 swTitle_set_sw($t, @sw);
167}
168
169sub process_entry { swentry_expand(process_swentry(@_)) }
170
171our @hentry_fields = qw( title owner_hwnd icon_hwnd
172 owner_phandle owner_pid owner_sid
173 visible nonswitchable jumpable ptype sw_entry );
174
175sub swentry_hexpand ($) {
176 my %h;
177 @h{@hentry_fields} = swentry_expand(shift);
178 \%h;
179}
180
181sub process_hentry { swentry_hexpand(process_swentry(@_)) }
182
183my $swentry_size = swentry_size();
184
185sub sw_entries () {
186 my $s = swentries_list();
187 my ($c, $s1) = unpack 'La*', $s;
188 die "Unconsistent size in swentries_list()" unless 4+$c*$swentry_size == length $s;
189 my (@l, $e);
190 push @l, $e while $e = substr $s1, 0, $swentry_size, '';
191 @l;
192}
193
194sub process_entries () {
195 map [swentry_expand($_)], sw_entries;
196}
197
198sub process_hentries () {
199 map swentry_hexpand($_), sw_entries;
200}
201
202sub change_entry {
203 change_swentry(create_swentry(@_));
204}
205
206sub create_swentryh ($) {
207 my $h = shift;
208 create_swentry(@$h{@hentry_fields});
209}
210
211sub change_entryh ($) {
212 change_swentry(create_swentryh(shift));
213}
214
215# Massage entries into the same order as WindowPos_set:
216sub WindowPos ($) {
217 my ($fl, $w, $h, $x, $y, $behind, $hwnd, @rest)
218 = unpack 'L l4 L4', WindowSWP(shift);
219 ($x, $y, $fl, $w, $h, $behind, @rest);
220}
221
222sub ChildWindows ($) {
223 my @kids;
224 my $h = BeginEnumWindows shift;
225 my $w;
226 push @kids, $w while $w = GetNextWindow $h;
227 EndEnumWindows $h;
228 @kids;
229}
7f61b687 230
bd60b2b9 231# backward compatibility
232*set_title = \&Title_set;
233*get_title = \&Title;
234
760ac839 235# Autoload methods go after __END__, and are processed by the autosplit program.
236
2371;
238__END__
239
240=head1 NAME
241
35bc1fdc 242OS2::Process - exports constants for system() call, and process control on OS2.
760ac839 243
244=head1 SYNOPSIS
245
246 use OS2::Process;
35bc1fdc 247 $pid = system(P_PM | P_BACKGROUND, "epm.exe");
760ac839 248
249=head1 DESCRIPTION
250
35bc1fdc 251=head2 Optional argument to system()
252
760ac839 253the builtin function system() under OS/2 allows an optional first
254argument which denotes the mode of the process. Note that this argument is
255recognized only if it is strictly numerical.
256
257You can use either one of the process modes:
258
259 P_WAIT (0) = wait until child terminates (default)
260 P_NOWAIT = do not wait until child terminates
261 P_SESSION = new session
262 P_DETACH = detached
263 P_PM = PM program
264
265and optionally add PM and session option bits:
266
267 P_DEFAULT (0) = default
268 P_MINIMIZE = minimized
269 P_MAXIMIZE = maximized
270 P_FULLSCREEN = fullscreen (session only)
271 P_WINDOWED = windowed (session only)
272
273 P_FOREGROUND = foreground (if running in foreground)
274 P_BACKGROUND = background
275
276 P_NOCLOSE = don't close window on exit (session only)
277
278 P_QUOTE = quote all arguments
279 P_TILDE = MKS argument passing convention
280 P_UNRELATED = do not kill child when father terminates
281
7f61b687 282=head2 Access to process properties
283
35bc1fdc 284On OS/2 processes have the usual I<parent/child> semantic;
285additionally, there is a hierarchy of sessions with their own
286I<parent/child> tree. A session is either a FS session, or a windowed
287pseudo-session created by PM. A session is a "unit of user
288interaction", a change to in/out settings in one of them does not
289affect other sessions.
7f61b687 290
88c28ceb 291=over
7f61b687 292
35bc1fdc 293=item my_type()
294
295returns the type of the current process (one of
296"FS", "DOS", "VIO", "PM", "DETACH" and "UNKNOWN"), or C<undef> on error.
297
298=item C<file_type(file)>
7f61b687 299
300returns the type of the executable file C<file>, or
301dies on error. The bits 0-2 of the result contain one of the values
302
88c28ceb 303=over
7f61b687 304
305=item C<T_NOTSPEC> (0)
306
35bc1fdc 307Application type is not specified in the executable header.
7f61b687 308
309=item C<T_NOTWINDOWCOMPAT> (1)
310
35bc1fdc 311Application type is not-window-compatible.
7f61b687 312
313=item C<T_WINDOWCOMPAT> (2)
314
35bc1fdc 315Application type is window-compatible.
7f61b687 316
317=item C<T_WINDOWAPI> (3)
318
319Application type is window-API.
320
321=back
322
323The remaining bits should be masked with the following values to
324determine the type of the executable:
325
88c28ceb 326=over
7f61b687 327
328=item C<T_BOUND> (8)
329
330Set to 1 if the executable file has been "bound" (by the BIND command)
331as a Family API application. Bits 0, 1, and 2 still apply.
332
333=item C<T_DLL> (0x10)
334
335Set to 1 if the executable file is a dynamic link library (DLL)
336module. Bits 0, 1, 2, 3, and 5 will be set to 0.
337
338=item C<T_DOS> (0x20)
339
340Set to 1 if the executable file is in PC/DOS format. Bits 0, 1, 2, 3,
341and 4 will be set to 0.
342
343=item C<T_PHYSDRV> (0x40)
344
35bc1fdc 345Set to 1 if the executable file is a physical device driver.
7f61b687 346
347=item C<T_VIRTDRV> (0x80)
348
35bc1fdc 349Set to 1 if the executable file is a virtual device driver.
7f61b687 350
351=item C<T_PROTDLL> (0x100)
352
353Set to 1 if the executable file is a protected-memory dynamic link
354library module.
355
356=item C<T_32BIT> (0x4000)
357
35bc1fdc 358Set to 1 for 32-bit executable files.
7f61b687 359
360=back
361
362file_type() may croak with one of the strings C<"Invalid EXE
363signature"> or C<"EXE marked invalid"> to indicate typical error
364conditions. If given non-absolute path, will look on C<PATH>, will
365add extention F<.exe> if no extension is present (add extension F<.>
366to suppress).
367
35bc1fdc 368=item C<@list = process_codepages()>
369
370the first element is the currently active codepage, up to 2 additional
371entries specify the system's "prepared codepages": the codepages the
372user can switch to. The active codepage of a process is one of the
373prepared codepages of the system (if present).
374
375=item C<process_codepage_set($cp)>
376
377sets the currently active codepage. [Affects printer output, in/out
378codepages of sessions started by this process, and the default
379codepage for drawing in PM; is inherited by kids. Does not affect the
380out- and in-codepages of the session.]
381
382=item ppid()
383
384returns the PID of the parent process.
385
386=item C<ppidOf($pid = $$)>
387
388returns the PID of the parent process of $pid. -1 on error.
389
390=item C<sidOf($pid = $$)>
391
392returns the session id of the process id $pid. -1 on error.
393
394=back
395
396=head2 Control of VIO sessions
397
398VIO applications are applications running in a text-mode session.
399
400=over
401
402=item out_codepage()
403
404gets code page used for screen output (glyphs). -1 means that a user font
405was loaded.
406
407=item C<out_codepage_set($cp)>
408
409sets code page used for screen output (glyphs). -1 switches to a preloaded
410user font. -2 switches off the preloaded user font.
411
412=item in_codepage()
413
414gets code page used for keyboard input. 0 means that a hardware codepage
415is used.
416
417=item C<in_codepage_set($cp)>
418
419sets code page used for keyboard input.
420
421=item C<($w, $h) = scrsize()>
422
423width and height of the given console window in character cells.
424
425=item C<scrsize_set([$w, ] $h)>
426
427set height (and optionally width) of the given console window in
428character cells. Use 0 size to keep the old size.
429
430=item C<($s, $e, $w, $a) = cursor()>
431
432gets start/end lines of the blinking cursor in the charcell, its width
433(1 on text modes) and attribute (-1 for hidden, in text modes other
434values mean visible, in graphic modes color).
435
436=item C<cursor_set($s, $e, [$w [, $a]])>
437
438sets start/end lines of the blinking cursor in the charcell. Negative
439values mean percents of the character cell height.
440
441=item screen()
442
443gets a buffer with characters and attributes of the screen.
444
445=item C<screen_set($buffer)>
446
447restores the screen given the result of screen().
448
449=back
450
451=head2 Control of the process list
452
453With the exception of Title_set(), all these calls require that PM is
454running, they would not work under alternative Session Managers.
455
456=over
457
7f61b687 458=item process_entry()
459
460returns a list of the following data:
461
88c28ceb 462=over
7f61b687 463
35bc1fdc 464=item
7f61b687 465
466Title of the process (in the C<Ctrl-Esc> list);
467
35bc1fdc 468=item
7f61b687 469
470window handle of switch entry of the process (in the C<Ctrl-Esc> list);
471
35bc1fdc 472=item
7f61b687 473
474window handle of the icon of the process;
475
35bc1fdc 476=item
7f61b687 477
478process handle of the owner of the entry in C<Ctrl-Esc> list;
479
35bc1fdc 480=item
7f61b687 481
482process id of the owner of the entry in C<Ctrl-Esc> list;
483
35bc1fdc 484=item
7f61b687 485
486session id of the owner of the entry in C<Ctrl-Esc> list;
487
35bc1fdc 488=item
7f61b687 489
490whether visible in C<Ctrl-Esc> list;
491
88c28ceb 492=item
7f61b687 493
494whether item cannot be switched to (note that it is not actually
495grayed in the C<Ctrl-Esc> list));
496
35bc1fdc 497=item
7f61b687 498
499whether participates in jump sequence;
500
35bc1fdc 501=item
7f61b687 502
35bc1fdc 503program type. Possible values are:
7f61b687 504
35bc1fdc 505 PROG_DEFAULT 0
506 PROG_FULLSCREEN 1
507 PROG_WINDOWABLEVIO 2
508 PROG_PM 3
509 PROG_VDM 4
510 PROG_WINDOWEDVDM 7
7f61b687 511
512Although there are several other program types for WIN-OS/2 programs,
513these do not show up in this field. Instead, the PROG_VDM or
514PROG_WINDOWEDVDM program types are used. For instance, for
515PROG_31_STDSEAMLESSVDM, PROG_WINDOWEDVDM is used. This is because all
516the WIN-OS/2 programs run in DOS sessions. For example, if a program
517is a windowed WIN-OS/2 program, it runs in a PROG_WINDOWEDVDM
518session. Likewise, if it's a full-screen WIN-OS/2 program, it runs in
519a PROG_VDM session.
520
35bc1fdc 521=item
522
523switch-entry handle.
88c28ceb 524
7f61b687 525=back
526
35bc1fdc 527Optional arguments: the pid and the window-handle of the application running
528in the OS/2 session to query.
529
530=item process_hentry()
531
532similar to process_entry(), but returns a hash reference, the keys being
533
534 title owner_hwnd icon_hwnd owner_phandle owner_pid owner_sid
535 visible nonswitchable jumpable ptype sw_entry
536
537(a copy of the list of keys is in @hentry_fields).
538
539=item process_entries()
7f61b687 540
35bc1fdc 541similar to process_entry(), but returns a list of array reference for all
542the elements in the switch list (one controlling C<Ctrl-Esc> window).
543
544=item process_hentries()
545
546similar to process_hentry(), but returns a list of hash reference for all
547the elements in the switch list (one controlling C<Ctrl-Esc> window).
548
549=item change_entry()
550
551changes a process entry, arguments are the same as process_entry() returns.
552
553=item change_entryh()
554
555Similar to change_entry(), but takes a hash reference as an argument.
556
557=item Title()
558
559returns a title of the current session. (There is no way to get this
560info in non-standard Session Managers, this implementation is a
561shortcut via process_entry().)
562
563=item C<Title_set(newtitle)>
564
565tries two different interfaces. The Session Manager one does not work
566with some windows (if the title is set from the start).
7f61b687 567This is a limitation of OS/2, in such a case $^E is set to 372 (type
568
569 help 372
570
35bc1fdc 571for a funny - and wrong - explanation ;-). In such cases a
572direct-manipulation of low-level entries is used. Keep in mind that
573some versions of OS/2 leak memory with such a manipulation.
574
575=item C<SwitchToProgram($sw_entry)>
576
577switch to session given by a switch list handle.
578
579Use of this function causes another window (and its related windows)
580of a PM session to appear on the front of the screen, or a switch to
581another session in the case of a non-PM program. In either case,
582the keyboard (and mouse for the non-PM case) input is directed to
583the new program.
584
585=back
586
587=head2 Control of the PM windows
588
589Some of these API's require sending a message to the specified window.
590In such a case the process needs to be a PM process, or to be morphed
591to a PM process via OS2::MorphPM().
592
593For a temporary morphing to PM use L<OS2::localMorphPM class>.
594
595Keep in mind that PM windows are engaged in 2 "orthogonal" window
596trees, as well as in the z-order list.
597
598One tree is given by the I<parent/child> relationship. This
599relationship affects drawing (child is drawn relative to its parent
600(lower-left corner), and the drawing is clipped by the parent's
601boundary; parent may request that I<it's> drawing is clipped to be
602confined to the outsize of the childs and/or siblings' windows);
603hiding; minimizing/restoring; and destroying windows.
604
605Another tree (not necessarily connected?) is given by I<ownership>
606relationship. Ownership relationship assumes cooperation of the
607engaged windows via passing messages on "important events"; e.g.,
608scrollbars send information messages when the "bar" is moved, menus
609send messages when an item is selected; frames
610move/hide/unhide/minimize/restore/change-z-order-of owned frames when
611the owner is moved/etc., and destroy the owned frames (even when these
612frames are not descendants) when the owner is destroyed; etc. [An
613important restriction on ownership is that owner should be created by
614the same thread as the owned thread, so they engage in the same
615message queue.]
616
617Windows may be in many different state: Focused, Activated (=Windows
618in the I<parent/child> tree between the root and the window with
619focus; usually indicate such "active state" by titlebar highlights),
620Enabled/Disabled (this influences *an ability* to receive user input
621(be focused?), and may change appearance, as for enabled/disabled
622buttons), Visible/Hidden, Minimized/Maximized/Restored, Modal, etc.
623
624=over
625
626=item C<WindowText($hwnd)>
627
628gets "a text content" of a window.
629
630=item C<WindowText_set($hwnd, $text)>
631
632sets "a text content" of a window.
633
634=item C<WindowPos($hwnd)>
635
636gets window position info as 8 integers (of C<SWP>), in the order suitable
637for WindowPos_set(): $x, $y, $fl, $w, $h, $behind, @rest.
638
639=item C<WindowPos_set($hwnd, $x, $y, $flags = SWP_MOVE, $wid = 0, $h = 0, $behind = HWND_TOP)>
640
641Set state of the window: position, size, zorder, show/hide, activation,
642minimize/maximize/restore etc. Which of these operations to perform
643is governed by $flags.
644
645=item C<WindowProcess($hwnd)>
646
647gets I<PID> and I<TID> of the process associated to the window.
648
649=item ActiveWindow([$parentHwnd])
650
651gets the active subwindow's handle for $parentHwnd or desktop.
652Returns FALSE if none.
653
654=item C<ClassName($hwnd)>
655
656returns the class name of the window.
657
658If this window is of any of the preregistered WC_* classes the class
659name returned is in the form "#nnnnn", where "nnnnn" is a group
660of up to five digits that corresponds to the value of the WC_* class name
661constant.
662
663=item FocusWindow()
664
665returns the handle of the focus window. Optional argument for specifying the desktop
666to use.
667
668=item C<FocusWindow_set($hwnd)>
669
670set the focus window by handle. Optional argument for specifying the desktop
671to use. E.g, the first entry in program_entries() is the C<Ctrl-Esc> list.
672To show it
673
674 WinShowWindow( wlhwnd, TRUE );
675 WinSetFocus( HWND_DESKTOP, wlhwnd );
676 WinSwitchToProgram(wlhswitch);
677
678
679=item C<ShowWindow($hwnd [, $show])>
680
681Set visible/hidden flag of the window. Default: $show is TRUE.
682
683=item C<PostMsg($hwnd, $msg, $mp1, $mp2)>
684
685post message to a window. The meaning of $mp1, $mp2 is specific for each
686message id $msg, they default to 0. E.g., in C it is done similar to
687
688 /* Emulate `Restore' */
689 WinPostMsg(SwitchBlock.tswe[i].swctl.hwnd, WM_SYSCOMMAND,
690 MPFROMSHORT(SC_RESTORE), 0);
691
692 /* Emulate `Show-Contextmenu' (Double-Click-2) */
693 hwndParent = WinQueryFocus(HWND_DESKTOP);
694 hwndActive = WinQueryActiveWindow(hwndParent);
695 WinPostMsg(hwndActive, WM_CONTEXTMENU, MPFROM2SHORT(0,0), MPFROMLONG(0));
696
697 /* Emulate `Close' */
698 WinPostMsg(pSWB->aswentry[i].swctl.hwnd, WM_CLOSE, 0, 0);
699
700 /* Same but softer: */
701 WinPostMsg(hwndactive, WM_SAVEAPPLICATION, 0L, 0L);
702 WinPostMsg(hwndactive, WM_CLOSE, 0L, 0L));
703 WinPostMsg(hwndactive, WM_QUIT, 0L, 0L));
704
705=item C<$eh = BeginEnumWindows($hwnd)>
706
707starts enumerating immediate child windows of $hwnd in z-order. The
708enumeration reflects the state at the moment of BeginEnumWindows() calls;
709use IsWindow() to be sure.
710
711=item C<$kid_hwnd = GetNextWindow($eh)>
712
713gets the next kid in the list. Gets 0 on error or when the list ends.
7f61b687 714
35bc1fdc 715=item C<EndEnumWindows($eh)>
7f61b687 716
35bc1fdc 717End enumeration and release the list.
718
719=item C<@list = ChildWindows($hwnd)>
720
721returns the list of child windows at the moment of the call. Same remark
722as for enumeration interface applies. Example of usage:
723
724 sub l {
725 my ($o,$h) = @_;
726 printf ' ' x $o . "%#x\n", $h;
727 l($o+2,$_) for ChildWindows $h;
728 }
729 l 0, $HWND_DESKTOP
730
731=item C<IsWindow($hwnd)>
732
733true if the window handle is still valid.
734
735=item C<QueryWindow($hwnd, $type)>
736
737gets the handle of a related window. $type should be one of C<QW_*> constants.
738
739=item C<IsChild($hwnd, $parent)>
740
741return TRUE if $hwnd is a descendant of $parent.
742
743=item C<WindowFromId($hwnd, $id)>
744
745return a window handle of a child of $hwnd with the given $id.
746
747 hwndSysMenu = WinWindowFromID(hwndDlg, FID_SYSMENU);
748 WinSendMsg(hwndSysMenu, MM_SETITEMATTR,
749 MPFROM2SHORT(SC_CLOSE, TRUE),
750 MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
751
752=item C<WindowFromPoint($x, $y [, $hwndParent [, $descedantsToo]])>
753
754gets a handle of a child of $hwndParent at C<($x,$y)>. If $descedantsToo
755(defaulting to 0) then children of children may be returned too. May return
756$hwndParent (defaults to desktop) if no suitable children are found,
757or 0 if the point is outside the parent.
758
759$x and $y are relative to $hwndParent.
760
761=item C<EnumDlgItem($dlgHwnd, $type [, $relativeHwnd])>
762
763gets a dialog item window handle for an item of type $type of $dlgHwnd
764relative to $relativeHwnd, which is descendant of $dlgHwnd.
765$relativeHwnd may be specified if $type is EDI_FIRSTTABITEM or
766EDI_LASTTABITEM.
767
768The return is always an immediate child of hwndDlg, even if hwnd is
769not an immediate child window. $type may be
770
771=over
772
773=item EDI_FIRSTGROUPITEM
774
775First item in the same group.
776
777=item EDI_FIRSTTABITEM
778
779First item in dialog with style WS_TABSTOP. hwnd is ignored.
780
781=item EDI_LASTGROUPITEM
782
783Last item in the same group.
784
785=item EDI_LASTTABITEM
786
787Last item in dialog with style WS_TABSTOP. hwnd is ignored.
788
789=item EDI_NEXTGROUPITEM
790
791Next item in the same group. Wraps around to beginning of group when
792the end of the group is reached.
793
794=item EDI_NEXTTABITEM
795
796Next item with style WS_TABSTOP. Wraps around to beginning of dialog
797item list when end is reached.
798
799=item EDI_PREVGROUPITEM
800
801Previous item in the same group. Wraps around to end of group when the
802start of the group is reached. For information on the WS_GROUP style,
803see Window Styles.
804
805=item EDI_PREVTABITEM
806
807Previous item with style WS_TABSTOP. Wraps around to end of dialog
808item list when beginning is reached.
7f61b687 809
810=back
811
35bc1fdc 812=back
813
814=head1 OS2::localMorphPM class
815
816This class morphs the process to PM for the duration of the given context.
817
818 {
819 my $h = OS2::localMorphPM->new(0);
820 # Do something
821 }
822
823The argument has the same meaning as one to OS2::MorphPM(). Calls can
824nest with internal ones being NOPs.
825
826=head1 TODO
827
828Constants (currently one needs to get them looking in a header file):
829
830 HWND_*
831 WM_* /* Separate module? */
832 SC_*
833 SWP_*
834 WC_*
835 PROG_*
836 QW_*
837 EDI_*
838 WS_*
839
840Show/Hide, Enable/Disable (WinShowWindow(), WinIsWindowVisible(),
841WinEnableWindow(), WinIsWindowEnabled()).
842
843Maximize/minimize/restore via WindowPos_set(), check via checking
844WS_MAXIMIZED/WS_MINIMIZED flags (how to get them?).
845
846=head1 $^E
847
848the majority of the APIs of this module set $^E on failure (no matter
849whether they die() on failure or not). By the semantic of PM API
850which returns something other than a boolean, it is impossible to
851distinguish failure from a "normal" 0-return. In such cases C<$^E ==
8520> indicates an absence of error.
853
854=head1 BUGS
855
856whether a given API dies or returns FALSE/empty-list on error may be
857confusing. This may change in the future.
858
760ac839 859=head1 AUTHOR
860
35bc1fdc 861Andreas Kaiser <ak@ananke.s.bawue.de>,
7f61b687 862Ilya Zakharevich <ilya@math.ohio-state.edu>.
760ac839 863
864=head1 SEE ALSO
865
35bc1fdc 866C<spawn*>() system calls, L<OS2::Proc> and L<OS2::WinObject> modules.
760ac839 867
868=cut