1pod::Prima::Window(3) User Contributed Perl Documentationpod::Prima::Window(3)
2
3
4
6 Prima::Window - top-level window management
7
9 use Prima;
10 use Prima::Application;
11
12 # this window, when closed, terminated the application
13 my $main = Prima::MainWindow-> new( text => 'Hello world' );
14
15 # this is a modal window
16 my $dialog = Prima::Dialog->create( size => [ 100, 100 ]);
17 my $result = $dialog-> execute;
18 $dialog-> destroy;
19
20 run Prima;
21
23 Prima::Window is a descendant of Prima::Widget class. It deals with
24 top-level windows, the windows that are specially treated by the
25 system. Its major difference from Prima::Widget is that instances of
26 Prima::Window can only be inferior by the screen, not the other
27 windows, and that the system or window manager add decorations to these
28 - usually menus, buttons and title bars. Prima::Window provides methods
29 that communicate with the system and hint these decorations.
30
32 A typical program communicates with the user with aid of widgets,
33 collected upon one or more top-level windows. Prima::Widget already
34 has all functionality required for these child-parent operations, so
35 Prima::Window is not special in respect of widget grouping and
36 relationship. Its usage therefore is straightforward:
37
38 my $w = Prima::Window-> create(
39 size => [300,300],
40 text => 'Startup window',
41 );
42
43 There are more about Prima::Window in areas, that it is specifically
44 designed to - the system window management and the dialog execution.
45
46 System window management
47 As noted before, top-level windows are special for the system, not only
48 in their 'look', but also in 'feel': the system adds specific functions
49 to the windows, aiding the user to navigate through the desktop. The
50 system often dictates the size and position for windows, and some times
51 these rules are hard or even impossible to circumvent. This document
52 will be long if it would venture to describe the features of different
53 window management systems, and the task would be never accomplished -
54 brand new window managers emerge every month, and the old change their
55 behavior in an unpredictable way. The only golden rule is to never rely
56 on the behavior of one window manager, and test programs with at least
57 two.
58
59 The Prima toolkit provides simple access to buttons, title bar and
60 borders of a window. Buttons and title bar are managed by the
61 "::borderIcons" property, and borders by the "::borderStyle" property.
62 These operate with set of predefined constants, "bi::XXX" and
63 "bs::XXX", correspondingly. The button constants can be combined with
64 each other, but not all combinations may be granted by the system. The
65 same is valid also for the border constant, except that they can not be
66 combined - the value of "::borderStyle" is one of the integer
67 constants.
68
69 There are other hints that the toolkit can set for a window manager.
70 The system can be supplied with an icon that a window is bound to; the
71 icon dimensions are much different, and although can be requested via
72 "sv::XIcon" and "sv::YIcon" system values, the "::icon" property scales
73 the image automatically to the closest system-recognizable dimension.
74 The window icon is not shown by the toolkit, it is usually resides in
75 the window decorations and sometimes on a task bar, along with the
76 window's name. The system can be hinted to not reflect the window on
77 the task bar, by setting the "::taskListed" property to 0.
78
79 Another issue is the window positioning. Usually, if no explicit
80 position was given, the window is positioned automatically by the
81 system. The same is valid for the size. But some window managers bend
82 it to the extreme - for example, default CDE setup force the user to
83 set newly created windows' positions explicitly. However, there is at
84 least one point of certainty. Typically, when the initial size and/or
85 position of a top-level window are expected to be set by the system,
86 the "::originDontCare" and "::sizeDontCare" properties can be set to 1
87 during window creation. If these set, the system is asked to
88 size/position a window regarding its own windowing policy. The reverse
89 is not always true, unfortunately. Either if these properties set to
90 0, or explicit size or positions are given, the system is hinted to use
91 these values instead, but this does not always happen. Actually, this
92 behavior is expected by the user and often does not get even noticed as
93 something special. Therefore it is a good practice to test a top-level
94 windowing code with several window managers.
95
96 There are different policies about window positioning and sizing; some
97 window managers behave best when the position is given to the window
98 with the system-dependent decorations. It is hardly can be called a
99 good policy, since it is not possible to calculate the derived window
100 coordinates with certainty. This problem results in that it is
101 impossible to be sure about window position and size before these are
102 set explicitly. The only, not much efficient help the toolkit can
103 provide is the property pair "::frameOrigin" and "::frameSize", which
104 along with "::origin" and "::size" reflect the position and size of a
105 window, but taking into account the system-dependent decorations.
106
107 Dialog execution
108 Method of Prima::Window, execute() brings a window in a modal state on
109 top of other toolkit windows, and returns after the window is dismissed
110 in one or another way. This method is special as it is an implicit
111 event loop, similar to
112
113 run Prima;
114
115 code. The event flow is not disrupted, but the windows and widgets that
116 do not belong to the currently executed, the 'modal' window group can
117 not be activated. There can be many modal windows on top of each other,
118 but only one is accessible. As an example a message box can be
119 depicted, a window that prevents the user to work with the application
120 windows until dismissed. There can be other message boxes on top of
121 each other, preventing the windows below from operation as well. This
122 scheme is called the 'exclusive' modality.
123
124 The toolkit also provides the shared modality scheme, where there can
125 be several stacks of modal windows, not interfering with each other.
126 Each window stack is distinct and contains its own windows. An example
127 analogy is when several independent applications run with modal message
128 boxes being activated. This scheme, however, can not be achieved with
129 single execute()-like call without creating interlocking conditions.
130 The shared model call, execute_shared(), inserts the window into the
131 shared modal stack, activates the window and returns immediately.
132
133 The both kinds of modal windows can coexist, but the exclusive windows
134 prevents the shared from operation; while there are exclusive windows,
135 the shared have same rights as the usual windows.
136
137 The stacking order for these two models is slightly different. A
138 window after execute() call is set on top of the last exclusive modal
139 window, or, in other words, is added to the exclusive window stack.
140 There can be only one exclusive window stack, but many shared window
141 stacks; a window after execute_shared() call is added to a shared
142 window stack, to the one the window's owner belongs to. The shared
143 window stacks are rooted in so-called modal horizons, windows with
144 boolean property "::modalHorizon" set to "true". The default horizon is
145 "::application".
146
147 A window in modal state can return to the normal (non-modal) state by
148 calling end_modal() method. The window is then hidden and disabled, and
149 the windows below are accessible to the user. If the window was in the
150 exclusive modal state, the execute() call is finished and returns the
151 exit code, the value of "::modalResult" property. There two shortcut
152 methods that end modal state, setting "::modalResult" to the basic 'ok'
153 and 'not ok' code, correspondingly ok() and cancel() methods. Behavior
154 of cancel() is identical to when the user closes the modal window by
155 clicking the system close button, pressing Escape key, or otherwise
156 canceling the dialog execution. ok() sets "::modalResult" to "mb::OK",
157 cancel() to "mb::Cancel", correspondingly. There are more "mb::XXX"
158 constants, but these have no special meaning, any integer value can be
159 passed. For example, "Prima::MsgBox::message" method uses these
160 constants so the message window can return up to four different "mb"
161 codes.
162
163 Menu
164 A top-level window can be equipped with a menu bar. Its outlook is
165 system-dependent, but can be controlled by the toolkit up to a certain
166 level. The "::menuItems" property, that manages the menu items of a
167 "::menu" object of Prima::Menu class, arrange the layout of the menu.
168 The syntax of the items-derived properties is described in Prima::Menu,
169 but it must be reiterated that menu items contain only hints, not
170 requests for their exact representation. The same is valid for the
171 color and font properties, "::menuColorIndex" and "::menuFont".
172
173 Only one menu at a time can be displayed in a top-level window,
174 although a window can be an owner for many menu objects. The key
175 property is "Prima::Menu::selected" - if a menu object is selected on a
176 widget or a window object, it refers to the default menu actions,
177 which, in case of Prima::Window is being displayed as menu bar.
178
179 NB: A window can be an owner for several menu objects and still do not
180 have a menu bar displayed, if no menu objects are marked as selected.
181
182 Prima::Dialog
183 Prima::Dialog, a descendant from Prima::Window, introduces no new
184 functionality. It has its default values adjusted so the colors use
185 more appropriate system colors, and hints the system that the outlook
186 of a window is to be different, to resemble the system dialogs on
187 systems where such are provided.
188
189 Prima::MainWindow
190 The class is a simple descendant of Prima::Window, which overloads
191 "on_destroy" notification and calls "$application->close" inside it.
192 The purpose of declaration of a separate class for such a trifle
193 difference is that many programs are designed under a paradigm where
194 these is a main window, which is most 'important' to the user. As such
195 the construct is used more often than any other, it is considered an
196 optimization to write
197
198 Prima::MainWindow-> create( ... )
199
200 rather than
201
202 Prima::Window-> create( ...,
203 mainWindow => 1,
204 onDestroy => sub { $::application-> close }
205 )
206
207 , although these lines are equivalent.
208
209 Also, the $::main_window is pointed to a newly created main window.
210
211 See also "mainWindow".
212
214 Properties
215 borderIcons INTEGER
216 Hints the system about window's decorations, by selecting the
217 combination of "bi::XXX" constants. The constants are:
218
219 bi::SystemMenu - system menu button and/or close button
220 ( usually with icon ) is shown
221 bi::Minimize - minimize button
222 bi::Maximize - maximize ( and eventual restore )
223 bi::TitleBar - window title
224 bi::All - all of the above
225
226 Not all systems respect these hints, and many systems provide more
227 navigating decoration controls than these.
228
229 borderStyle STYLE
230 Hints the system about window's border style, by selecting one of
231 "bs::XXX" constants. The constants are:
232
233 bs::None - no border
234 bs::Single - thin border
235 bs::Dialog - thick border
236 bs::Sizeable - thick border with interactive resize capabilities
237
238 "bs::Sizeable" is an unique window mode. If selected, the user can
239 resize the window, not only by dragging the window borders with the
240 mouse but by other system-dependent means. The other border styles
241 disallow interactive resizing.
242
243 Not all systems recognize all these hints, although many recognize
244 interactive resizing flag.
245
246 effects HASH or undef
247 This generic property implements system-specific window effects,
248 not necessarily portable. The format of the hash is also system-
249 specific. The only portable behavior here is that setting the value
250 to "undef" cancels all effects.
251
252 Example:
253
254 $window->effects({
255 effect1 => {
256 key1 => $value1,
257 ...
258 },
259 });
260
261 Previously this was the mechanism for setting the DWM blur on
262 Windows 7 and 8, but as Windows 10 removed it, this capability was
263 also removed, so as for now this is basically an empty call.
264
265 frameHeight HEIGHT
266 Maintains the height of a window, including the window decorations.
267
268 frameOrigin X_OFFSET, Y_OFFSET
269 Maintains the left X and bottom Y boundaries of a window's
270 decorations relative to the screen.
271
272 frameSize WIDTH, HEIGHT
273 Maintains the width and height of a window, including the window
274 decorations.
275
276 frameWidth WIDTH
277 Maintains the width of a window, including the window decorations.
278
279 icon OBJECT
280 Hints the system about an icon, associated with a window. If
281 OBJECT is "undef", the system-default icon is assumed.
282
283 See also: "ownerIcon"
284
285 mainWindow BOOLEAN
286 Tells the system that the window is the main window for the
287 application. When dialogs and modal windows are not anchored to
288 any specific window, the main window is used. In this context,
289 anchoring means that if, for example, a window spawns a dialog, and
290 then is minimized or obscured, and then the user clicks on either
291 window, both can be brought forward (also in correct Z-order) by
292 the system window manager.
293
294 menu OBJECT
295 Manages a Prima::Menu object associated with a window.
296 Prima::Window can host many Prima::Menu objects, but only the one
297 that is set in "::menu" property will be seen as a menu bar.
298
299 See also: "Prima::Menu", "menuItems"
300
301 menuColorIndex INDEX, COLOR
302 Maintains eight color properties of a menu, associated with a
303 window. INDEX must be one of "ci::XXX" constants ( see
304 Prima::Widget, colorIndex section ).
305
306 See also: "menuItems", "menuFont", "menu"
307
308 menuColor COLOR
309 Basic foreground menu color.
310
311 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
312
313 menuBackColor COLOR
314 Basic background menu color.
315
316 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
317
318 menuDark3DColor COLOR
319 Color for drawing dark shadings in menus.
320
321 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
322
323 menuDisabledColor COLOR
324 Foreground color for disabled items in menus.
325
326 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
327
328 menuDisabledBackColor COLOR
329 Background color for disabled items in menus.
330
331 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
332
333 menuFont %FONT
334 Maintains the font of a menu, associated with a window.
335
336 See also: "menuItems", "menuColorIndex", "menu"
337
338 menuHiliteColor COLOR
339 Foreground color for selected items in menus.
340
341 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
342
343 menuHiliteBackColor COLOR
344 Background color for selected items in menus.
345
346 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
347
348 menuItems [ ITEM_LIST ]
349 Manages items of a Prima::Menu object associated with a window.
350 The ITEM_LIST format is same as "Prima::AbstractMenu::items" and is
351 described in Prima::Menu.
352
353 See also: "menu", "menuColorIndex", "menuFont"
354
355 menuLight3DColor COLOR
356 Color for drawing light shadings in menus.
357
358 See also: "menuItems", "menuColorIndex", "menuFont", "menu"
359
360 modalHorizon BOOLEAN
361 Reflects if a window serves as root to the shared modal window
362 stack. A window with "::modalHorizon" set to 1 in shared modal
363 state groups its children windows in a window stack, separate from
364 other shared modal stacks. The "::modalHorizon" is therefore useful
365 only when several shared modal window stacks are needed.
366
367 The property also serves as an additional grouping factor for
368 widgets and windows. For example, default keyboard navigation by
369 tab and arrow keys is limited to the windows and widgets of a
370 single window stack.
371
372 modalResult INTEGER
373 Maintains a custom integer value, returned by execute().
374 Historically it is one of "mb::XXX" constants, but any integer
375 value can be used. The most useful "mb::" constants are:
376
377 mb::OK, mb::Ok
378 mb::Cancel
379 mb::Yes
380 mb::No
381 mb::Abort
382 mb::Retry
383 mb::Ignore
384 mb::Help
385
386 NB: These constants are defined so they can be bitwise-or'ed, and
387 Prima::MsgBox package uses this feature, where one of its functions
388 parameters is a combination of "mb::" constants.
389
390 onTop BOOLEAN
391 If set, the window is hinted to stay on top of all other windows.
392
393 Default value: 0
394
395 ownerIcon BOOLEAN
396 If 1, the icon is synchronized with the owner's. Automatically set
397 to 0 if "::icon" property is explicitly set. Default value is 1,
398 so assigning an icon to $::application spawns the icon to all
399 windows.
400
401 taskListed BOOLEAN
402 If set to 0, hints the system against reflecting existence of a
403 window into a system task bar, or a top-level window list, or
404 otherwise lower the window's value before the other windows. If 1,
405 does not hint anything.
406
407 Default value: 1
408
409 windowState STATE
410 A three-state property, that governs the state of a window. STATE
411 can be one of four "ws::XXX" constants:
412
413 ws::Normal
414 ws::Minimized
415 ws::Maximized
416 ws::Fullscreen
417
418 There can be more or less, or other window states provided by the
419 system, but these four were chosen as a 'least common denominator'.
420 The property can be changed either by explicit set-mode call or by
421 the user. In either case, a "WindowState" notification is
422 triggered.
423
424 The property has three convenience wrappers: maximize(),
425 minimize(), restore(), and fullscreen().
426
427 See also: "WindowState"
428
429 Methods
430 cancel
431 A standard method to dismiss a modal window with "mb::Cancel"
432 result. The effect of calling this method is equal to when the user
433 selects a 'close window' action with system-provided menu, button
434 or other tool.
435
436 See also: "ok", "modalResult", "execute", "execute_shared"
437
438 end_modal
439 If a window is in modal state, the "EndModal" notification is
440 activated. Then the window is returned from the modal state, gets
441 hidden and disabled. If the window was on top in the exclusive
442 modal state, the last called execute() function finishes. If the
443 window was not on top in the exclusive modal state, the
444 corresponding execute() function finishes after all subsequent
445 execute() calls are finished.
446
447 execute INSERT_BEFORE = undef
448 A window is turned to the exclusive modal state and is put on top
449 of non-modal and shared-modal windows. By default, if
450 INSERT_BEFORE object is undef, the window is also put on top of
451 other exclusive-modal windows; if INSERT_BEFORE is one of the
452 exclusive-modal windows the window is placed in queue before the
453 INSERT_BEFORE window. The window is showed and enabled, if
454 necessary, and "Execute" notification is triggered.
455
456 The function is returned when a window is dismissed, or if the
457 system-dependent 'exit'-event is triggered by the user ( the latter
458 case falls through all execute() calls and terminates "run Prima;"
459 call, exiting gracefully).
460
461 execute_shared INSERT_BEFORE = undef
462 A window is turned to the shared modal state and is put on top of
463 non-modal windows in the stack of its "::modalHorizon". A window
464 with "::modalHorizon" set to 1 starts its own stack, independent of
465 all other window stacks.
466
467 By default, if INSERT_BEFORE object is undef, the window is also
468 put on top of other shared-modal windows in its stack. If
469 INSERT_BEFORE is one of the shared-modal windows in its stack, the
470 window is placed in queue before the INSERT_BEFORE window.
471
472 The window is showed and enabled, if necessary, and "Execute"
473 notification is triggered.
474
475 The function is returned immediately.
476
477 fullscreen
478 Sets window in a fullscreen mode. A shortcut for
479 windowState(ws::Fullscreen).
480
481 get_client_handle
482 Returns a system handle for a system window that is inserted in
483 top-level windows and covers all of its area. Is different from
484 "Window::get_handle" in that it returns the system handle of the
485 top-level window itself. In other terms, window returned by this
486 function is a child of the window returned by "Window::get_handle".
487
488 See also: "get_handle"
489
490 get_default_menu_font
491 Returns the default font for a Prima::Menu class.
492
493 get_modal
494 Returns one of three constants, reflecting the modal state of a
495 window:
496
497 mt::None
498 mt::Shared
499 mt::Exclusive
500
501 Value of "mt::None" is 0, so result of get_modal() can be also
502 treated as a boolean value, if only the fact of modality is needed
503 to check.
504
505 get_modal_window MODALITY_TYPE = mt::Exclusive, NEXT = 1
506 Returns a modal window, that is next to the given window in the
507 modality chain. MODALITY_TYPE selects the chain, and can be either
508 "mt::Exclusive" or "mt::Shared". NEXT is a boolean flag, selecting
509 the lookup direction; if it is 1, the 'upper' window is returned,
510 if 0, the 'lower' one ( in a simple case when window A is made
511 modal (executed) after modal window B, the A window is the 'upper'
512 one ).
513
514 If a window has no immediate modal relations, "undef" is returned.
515
516 maximize
517 Maximizes window. A shortcut for windowState(ws::Maximized).
518
519 minimize
520 Minimizes window. A shortcut for windowState(ws::Minimized).
521
522 ok A standard method to dismiss a modal window with "mb::OK" result.
523 Typically the effect of calling this method is equal to when the
524 user presses the enter key of a modal window, signaling that the
525 default action is to be taken.
526
527 See also: "cancel", "modalResult", "execute", "execute_shared"
528
529 restore
530 Restores window to normal state from minimized or maximized state.
531 A shortcut for windowState(ws::Normal).
532
533 Events
534 Activate
535 Triggered when a window is activated by the user. Activation mark
536 is usually resides on a window that contains keyboard focus, and is
537 usually reflected by highlighted system decorations.
538
539 The toolkit does not provide standalone activation functions;
540 select() call is used instead.
541
542 Deactivate
543 Triggered when a window is deactivated by the user. Window is
544 usually marked inactive, when it contains no keyboard focus.
545
546 The toolkit does not provide standalone de-activation functions;
547 deselect() call is used instead.
548
549 EndModal
550 Called before a window leaves modal state.
551
552 Execute
553 Called after a window enters modal state.
554
555 SysHandle
556 Same as in "Widget", but it addition to the Widget properties that
557 may trigger the event, the following "Window" properties can
558 trigger it as well: taskListed, borderIcons, borderStyle, onTop
559
560 WindowState STATE
561 Triggered when window state is changed, either by an explicit
562 windowState() call, or by the user. STATE is the new window state,
563 one of three "ws::XXX" constants.
564
566 Dmitry Karasik, <dmitry@karasik.eu.org>.
567
569 Prima, Prima::Object, Prima::Drawable, Prima::Widget.
570
571
572
573perl v5.36.0 2023-03-20 pod::Prima::Window(3)