diff --git a/lispusers/REGIONMANAGER b/lispusers/REGIONMANAGER index 0e05334e1..463a38c99 100644 --- a/lispusers/REGIONMANAGER +++ b/lispusers/REGIONMANAGER @@ -1,12 +1,10 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "27-Feb-2022 08:48:09"  -{DSK}kaplan>Local>medley3.5>my-medley>lispusers>REGIONMANAGER.;116 37561 +(FILECREATED "10-Oct-2023 22:19:05" {WMEDLEY}REGIONMANAGER.;129 40525 - :CHANGES-TO (FNS \RELCREATEREGION.REF \RELCREATEREGION.SIZE) + :EDIT-BY rmk - :PREVIOUS-DATE "28-Jan-2022 23:52:21" -{DSK}kaplan>Local>medley3.5>my-medley>lispusers>REGIONMANAGER.;113) + :PREVIOUS-DATE "10-Oct-2023 22:17:47" {MEDLEY}REGIONMANAGER.;9) (PRETTYCOMPRINT REGIONMANAGERCOMS) @@ -15,12 +13,12 @@ [ (* ;; "Typed regions") - [COMS (FNS SET-TYPED-REGIONS) + [COMS (FNS SET-TYPED-REGIONS GRAB-TYPED-REGION REGISTER-TYPED-REGION REGION-TYPE) (FNS RM-CREATEW RM-CLOSEW RM-GETREGION CLOSE-TYPED-W) (INITVARS (TYPED-REGIONS)) (GLOBALVARS TYPED-REGIONS) - (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS TYPED-REGION REGION-SOURCE)) - (INITRECORDS TYPED-REGION REGION-SOURCE) + (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS TYPED-REGION)) + (INITRECORDS TYPED-REGION) (P (MOVD? 'CREATEW 'CREATEW.ORIG) (MOVD? 'CLOSEW 'CLOSEW.ORIG) (MOVD? 'GETREGION 'GETREGION.ORIG) @@ -86,120 +84,170 @@ REGIONS (NCONC REGIONS (CDR PREV)))] else (push TYPED-REGIONS (CONS TYPE REGIONS]) + +(GRAB-TYPED-REGION + [LAMBDA (REGION-TYPE MINWIDTH MINHEIGHT) (* ; "Edited 10-Oct-2023 13:41 by rmk") + (* ; "Edited 14-Sep-2023 07:30 by rmk") + + (* ;; "Returns a REGIONTYPE region that satisfies MINWIDTH and MINHEIGHT, if specified") + + (for R in (CDR (ASSOC REGION-TYPE TYPED-REGIONS)) unless (fetch REGION-INUSE of R) + when [AND (OR (NULL MINWIDTH) + (ILEQ MINWIDTH (fetch WIDTH of R))) + (OR (NULL MINHEIGHT) + (ILEQ MINHEIGHT (fetch HEIGHT of R] do + + (* ;; "We don't mark it as inuse here, leave that gets done by INSTALL-TYPED-REGION when ownership is given to a window. The only downside is that the region could be reallocated before that happens, and 2 window would come up in the same place.") + + (RETURN R]) + +(REGISTER-TYPED-REGION + [LAMBDA (REGION REGION-TYPE WINDOW) (* ; "Edited 10-Oct-2023 13:30 by rmk") + (* ; "Edited 29-Sep-2023 13:33 by rmk") + (* ; "Edited 14-Sep-2023 10:03 by rmk") + + (* ;; "REGION was passed as the REGION argument to the original CREATEW. If that was NIL, CREATEW created its own region, but it didn't do it through GETREGION (=RM.GETREGION) so it hasn't been registered according to the specified type. We set up the arrangements here. ") + + (CL:WHEN REGION-TYPE + (CL:UNLESS REGION + (SETQ REGION (WINDOWREGION WINDOW))) + (LET [(TREGIONLIST (OR (ASSOC REGION-TYPE TYPED-REGIONS) + (CAR (PUSH TYPED-REGIONS (CONS REGION-TYPE] + (CL:UNLESS (MEMB REGION (CDR TREGIONLIST)) + (NCONC1 TREGIONLIST REGION)) + (replace REGION-INUSE of REGION with T) + + (* ;; "We keep the original separate from the window's region WINDOWPROP so that RM-CLOSEW can update if the user reshapes.") + + (WINDOWPROP WINDOW 'TYPED-REGION (CONS REGION-TYPE REGION)) + REGION))]) + +(REGION-TYPE + [LAMBDA (X TYPE) (* ; "Edited 10-Oct-2023 14:30 by rmk") + (* ; "Edited 16-Sep-2023 08:41 by rmk") + + (* ;; + "Value is the type of X if it is a region of type TYPE or a region of any type if TYPE is NIL.") + + (CL:WHEN (REGIONP X) + [if TYPE + then (CL:WHEN (MEMB X (CDR (ASSOC TYPE TYPED-REGIONS))) + TYPE) + else (CAR (find TYPELIST in TYPED-REGIONS suchthat (MEMB X TYPELIST])]) ) (DEFINEQ (RM-CREATEW - [LAMBDA (REGION TITLE BORDERSIZE NOOPENFLG PROPS) (* ; "Edited 1-Jan-2022 23:12 by rmk") + [LAMBDA (REGION TITLE BORDERSIZE NOOPENFLG PROPS) (* ; "Edited 24-Sep-2023 20:38 by rmk") + (* ; "Edited 14-Sep-2023 22:23 by rmk") + (* ; "Edited 1-Jan-2022 23:12 by rmk") (* ; "Edited 29-Dec-2021 19:25 by rmk") - (* ;; "Generic CREATEW function for managed regions. If REGIONTYPE is specified (as REGION or in PROPS), then we try to find a previous region for that type that is currently unused, create one if needed.") + (* ;; "Generic CREATEW function for managed regions. If REGION-TYPE is specified (as REGION or in PROPS), then we try to find a previous region for that type that is currently unused, create one if needed.") (* ;; "We have to bracket the original window creation because the we have to mark that the window uses that region, to put it back in the pool when the window is closed.") - (LET (WINDOW REGIONTYPE TYPEDREGION TYPELIST) - [SETQ REGIONTYPE (if (AND REGION (LITATOM REGION)) - then (PROG1 REGION (SETQ REGION NIL)) - else (LISTGET PROPS 'REGION-TYPE] - (SETQ TYPELIST (ASSOC REGIONTYPE TYPED-REGIONS)) + (LET [WINDOW (REGION-TYPE (if (AND (LITATOM REGION) + REGION) + then (PROG1 REGION (SETQ REGION NIL)) + else (LISTGET PROPS 'REGION-TYPE] - (* ;; "We have REGIONTYPE, but maybe also a region that already has a source. Maybe we should make sure that the source is of that type?") + (* ;; "We have REGION-TYPE, but maybe also a region that already has a source. Maybe we should make sure that the source is of that type?") (* ;; "Note: REGION can also be a screenregion, that falls through.") - (IF (REGIONP REGION) - THEN (SETQ TYPEDREGION (FETCH REGION-SOURCE OF REGION)) - ELSEIF TYPELIST - THEN - (* ;; - "If we don't find an unused region, CREATEW will create one in the ordinary way. We type it below.") - - [SETQ TYPEDREGION (FIND R FOUND in (CDR TYPELIST) - SUCHTHAT (NOT (fetch REGION-INUSE of R] - (SETQ REGION TYPEDREGION)) + (CL:WHEN REGION-TYPE + (SETQ REGION (GRAB-TYPED-REGION REGION-TYPE))) (SETQ WINDOW (CREATEW.ORIG REGION TITLE BORDERSIZE NOOPENFLG PROPS)) - - (* ;; "CREATEW doesn't call the user-entry GETREGION, so we have to trap and install its return region here.") - - (CL:WHEN (AND TYPELIST (NULL TYPEDREGION)) (* ; - "If not, we don't record this even if typed.") - (SETQ TYPEDREGION (OR (FETCH REGION-SOURCE OF (SETQ REGION (WINDOWREGION WINDOW))) - (COPY REGION))) - (NCONC1 TYPELIST TYPEDREGION)) - (CL:WHEN TYPEDREGION - (replace REGION-INUSE of TYPEDREGION with T) - (WINDOWPROP WINDOW 'TYPED-REGION TYPEDREGION) - (WINDOWPROP WINDOW 'REGION-TYPE REGIONTYPE)) + (CL:WHEN REGION-TYPE (REGISTER-TYPED-REGION REGION REGION-TYPE WINDOW)) WINDOW]) (RM-CLOSEW - [LAMBDA (WINDOW) (* ; "Edited 29-Dec-2021 15:44 by rmk") - (* ; "Edited 28-Dec-2021 11:02 by rmk") - (* ; "Edited 27-Nov-2021 10:00 by rmk:") - (* ; "Edited 26-Oct-2021 21:54 by rmk:") - (* ; - "Edited 25-Apr-94 10:08 by sybalsky") - (* ; "") + [LAMBDA (WINDOW) (* ; "Edited 10-Oct-2023 22:11 by rmk") (* ;;  "Makes the window's typed region available for reuse, if the window is marked with a TYPEDREGION.") (* ;; "It's possible that the window exists and can be reopened after it has been closed. The glitch in that case is that we may have decided to make the window's region available to another window, and if this window is opened again it will come on top of that other one (if it hasn't moved). Oh well.") - (LET [(TYPEDREGION (WINDOWPROP WINDOW 'TYPED-REGION] - (CL:WHEN (AND (CLOSEW.ORIG WINDOW) - TYPEDREGION) - (REPLACE REGION-INUSE OF TYPEDREGION WITH NIL) - (WINDOWPROP WINDOW 'TYPED-REGION NIL) - T)]) + (* ;; "This replaces the particular typed-region in TYPED-REGIONS with the region that the window ended up with, perhaps after the user reshaped it. But (WINDOWPROP WINDOW 'REGION) doesn't include the prompt window, if it's there, and (WINDOWREGION WINDOW) would union in all of the attached windows (menus etc.) This code assumes that the promptwindow was taken out of the original region (lots of funky code does that), so it unions it back in to the REGION property to reconstruct the original typed-region. The alternative would be to have the windows region copy the original grabbed region and restore only that. But then we would be ignoring any reshaping adjustments.") + + (LET* [CLOSEVAL (TYPEDREGION (WINDOWPROP WINDOW 'TYPED-REGION)) + (REGIONTYPE (CAR TYPEDREGION)) + (TREGION (CDR TYPEDREGION)) + [PWINDOW (WINDOWP (CAR (MKLIST (WINDOWPROP WINDOW 'PROMPTWINDOW] + [WREGION (CL:IF PWINDOW + (UNIONREGIONS (WINDOWPROP WINDOW 'REGION) + (WINDOWPROP PWINDOW 'REGION)) + (WINDOWPROP WINDOW 'REGION))] + (TREGIONLIST (AND REGIONTYPE (OR (ASSOC REGIONTYPE TYPED-REGIONS) + (CAR (PUSH TYPED-REGIONS (CONS REGIONTYPE] + (CL:WHEN (AND (SETQ CLOSEVAL (CLOSEW.ORIG WINDOW)) + TYPEDREGION) + (CL:UNLESS (EQUAL TREGION WREGION) + + (* ;; "The user reshaped the window after the region was taken from TYPED-REGIONS. Assume that the new shape is what should be offered when this is recycled. Important to keep the same structure") + + (with REGION TREGION (SETQ LEFT (fetch (REGION LEFT) of WREGION)) + (SETQ BOTTOM (fetch (REGION BOTTOM) of WREGION)) + (SETQ WIDTH (fetch (REGION WIDTH) of WREGION)) + (SETQ HEIGHT (fetch (REGION HEIGHT) of WREGION)))) + + (* ;; "Move TREGION to the front so most recently closed will be recycled first") + + (CL:WHEN TREGIONLIST + (change (CDR TREGIONLIST) + (CONS TREGION (DREMOVE TREGION DATUM)))) + (replace REGION-INUSE of TREGION with NIL) + (WINDOWPROP WINDOW 'TYPED-REGION NIL)) + CLOSEVAL]) (RM-GETREGION - [LAMBDA (MINWIDTH MINHEIGHT INITREGION NEWREGIONFN NEWREGIONFNARG INITCORNERS) + [LAMBDA (MINWIDTH MINHEIGHT INITREGION NEWREGIONFN NEWREGIONFNARG INITCORNERS) + (* ; "Edited 10-Oct-2023 12:39 by rmk") + (* ; "Edited 14-Sep-2023 07:50 by rmk") (* ; "Edited 1-Jan-2022 21:49 by rmk") - (* ;; "If INITREGION is a type atom and a region of that type is available, then use it as the INITREGION. Otherwise, add a copy of the new region to the available list, and assert that the new region has the copy as its source.") - - (* ;; "We don't know what will happen to the new region, but if it ends up as a region for CREATEW, the source information enables us to mark its source as inuse.") + (* ;; "If INITREGION is a type atom:") - (* ;; "This allows for the possibility that the application is actually asking the user for a constellation region that will be shrunk in anticipation of future satellite attachments. A future retrieval will return the original size and position, and it will then presumably be shrunk in the same way.") + (* ;; " If a region of that type is available, then a (copy) is returned.") - (LET (REGION (TYPELIST (ASSOC (CL:WHEN (AND INITREGION (LITATOM INITREGION)) - INITREGION) - TYPED-REGIONS))) - (FOR R in (CDR TYPELIST) UNLESS (fetch REGION-INUSE of R) - WHEN [AND (OR (NULL MINWIDTH) - (ILEQ MINWIDTH (FETCH WIDTH OF R))) - (OR (NULL MINHEIGHT) - (ILEQ MINHEIGHT (FETCH HEIGHT OF R] - DO - (* ;; "Copy so the caller can update the region without affecting the recyclable source, but remember what it is based on. We don't mark it as used here, maybe a window won't be built around it and it will fade away. However, there is the risk that another GETREGION will find the same source before it is given to a window, in which case 2 windows might open up in the same place.") + (* ;; " Otherwise, the user is asked for a new region, that is added to the type list, and again a copy is returned.") - (SETQ REGION (COPY R)) - (REPLACE REGION-SOURCE OF REGION WITH R) - (RETURN)) + (* ;; "We return a copy because we don't know what will happen to this region, whether it will be changed by future operations (e.g. by a constellation operation). A future retrieval will return the original size and position, and it will then presumably be shrunk in the same way.") - (* ;; "If we found a good one, we're done. Otherwise, run the normal code, but save the new region if it is typed.") + (* ;; " If INITREGION is not a typeatom, it is passed through to the original GETREGION, and the new region will not be managed.") + (LET (REGION TYPELIST (REGION-TYPE (AND (LITATOM INITREGION) + INITREGION))) + (SETQ REGION (GRAB-TYPED-REGION REGION-TYPE MINWIDTH MINHEIGHT)) (CL:UNLESS REGION - (SETQ REGION (GETREGION.ORIG MINWIDTH MINHEIGHT INITREGION NEWREGIONFN NEWREGIONFNARG - INITCORNERS)) - (CL:WHEN TYPELIST - (* ;; - "The new region is based on a typed region. The saved source is a copy of what we return.") + (* ;; "If we found a good one, INITREGIONS must have been a type, and we're done. Otherwise, run the normal code, but save the new region as a new instance if its typed.") + + (SETQ REGION (GETREGION.ORIG MINWIDTH MINHEIGHT (CL:IF REGION-TYPE + NIL + INITREGION) + NEWREGIONFN NEWREGIONFNARG INITCORNERS)) + (CL:WHEN REGION-TYPE - (NCONC1 TYPELIST (REPLACE REGION-SOURCE OF REGION WITH (COPY REGION))))) + (* ;; "A new typed region to add to the list . ") + + (NCONC1 [OR (ASSOC REGION-TYPE TYPED-REGIONS) + (CAR (PUSH TYPED-REGIONS (CONS REGION-TYPE] + REGION))) REGION]) (CLOSE-TYPED-W - [LAMBDA (TYPE) (* ; "Edited 29-Dec-2021 15:58 by rmk") - (* ; "Edited 27-Nov-2021 11:50 by rmk:") + [LAMBDA (TYPE) (* ; "Edited 14-Sep-2023 07:39 by rmk") + (* ; "Edited 29-Dec-2021 15:58 by rmk") + (* ; "Edited 27-Nov-2021 11:50 by rmk:") - (* ;; "Closes all windows of REGIONTYPE inside TYPE") + (* ;; "Closes all windows whose regions are of type TYPE") (CL:WHEN TYPE - (for W R in (OPENWINDOWS) when (AND (SETQ WT (WINDOWPROP W 'REGION-TYPE)) - (EQMEMB WT TYPE)) do (CLOSEW W)))]) + (for W R in (OPENWINDOWS) eachtime [SETQ WT (CAR (WINDOWPROP W 'TYPED-REGION] + when (AND WT (EQMEMB WT TYPE)) do (CLOSEW W)))]) ) (RPAQ? TYPED-REGIONS ) @@ -211,27 +259,17 @@ (DECLARE%: EVAL@COMPILE (HASHLINK TYPED-REGION (REGION-INUSE REGION-INUSE-HASH)) - -(HASHLINK REGION-SOURCE (REGION-SOURCE REGION-SOURCE-HASH)) ) (DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-INUSE-HASH)) (SETUPHASHARRAY 'REGION-INUSE-HASH NIL) - -(DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-SOURCE-HASH)) - -(SETUPHASHARRAY 'REGION-SOURCE-HASH NIL) ) (DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-INUSE-HASH)) (SETUPHASHARRAY 'REGION-INUSE-HASH NIL) -(DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-SOURCE-HASH)) - -(SETUPHASHARRAY 'REGION-SOURCE-HASH NIL) - (MOVD? 'CREATEW 'CREATEW.ORIG) (MOVD? 'CLOSEW 'CLOSEW.ORIG) @@ -683,10 +721,11 @@ ) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1672 3859 (SET-TYPED-REGIONS 1682 . 3857)) (3860 10861 (RM-CREATEW 3870 . 6377) ( -RM-CLOSEW 6379 . 7780) (RM-GETREGION 7782 . 10368) (CLOSE-TYPED-W 10370 . 10859)) (11777 19256 ( -RELCREATEREGION 11787 . 16410) (RELGETREGION 16412 . 19019) (RELCREATEPOSITION 19021 . 19254)) (19257 -26061 (\RELCREATEREGION.REF 19267 . 23018) (\RELCREATEREGION.SIZE 23020 . 26059)) (26114 35456 ( -RM-ATTACHWINDOW 26124 . 35454)) (35457 37191 (CLOSEWITH 35467 . 35994) (CLOSEWITH.DOIT 35996 . 36276) -(MOVEWITH 36278 . 36801) (MOVEWITH.DOIT 36803 . 37189))))) + (FILEMAP (NIL (1573 6691 (SET-TYPED-REGIONS 1583 . 3758) (GRAB-TYPED-REGION 3760 . 4786) ( +REGISTER-TYPED-REGION 4788 . 6085) (REGION-TYPE 6087 . 6689)) (6692 14098 (RM-CREATEW 6702 . 8325) ( +RM-CLOSEW 8327 . 11345) (RM-GETREGION 11347 . 13496) (CLOSE-TYPED-W 13498 . 14096)) (14741 22220 ( +RELCREATEREGION 14751 . 19374) (RELGETREGION 19376 . 21983) (RELCREATEPOSITION 21985 . 22218)) (22221 +29025 (\RELCREATEREGION.REF 22231 . 25982) (\RELCREATEREGION.SIZE 25984 . 29023)) (29078 38420 ( +RM-ATTACHWINDOW 29088 . 38418)) (38421 40155 (CLOSEWITH 38431 . 38958) (CLOSEWITH.DOIT 38960 . 39240) +(MOVEWITH 39242 . 39765) (MOVEWITH.DOIT 39767 . 40153))))) STOP diff --git a/lispusers/REGIONMANAGER.LCOM b/lispusers/REGIONMANAGER.LCOM index f6dd79e8f..4784c2a4c 100644 Binary files a/lispusers/REGIONMANAGER.LCOM and b/lispusers/REGIONMANAGER.LCOM differ diff --git a/lispusers/REGIONMANAGER.TEDIT b/lispusers/REGIONMANAGER.TEDIT index a53f7e029..cf4e717b0 100644 --- a/lispusers/REGIONMANAGER.TEDIT +++ b/lispusers/REGIONMANAGER.TEDIT @@ -3,7 +3,7 @@ Medley REGIONMANAGER 2 1 REGIONMANAGER 1 4 - By Ron Kaplan This document created in December 2021. + By Ron Kaplan This document created in December 2021, last edited September 2023. Medley comes equipped with a core set of functions for specifying regions and creating the windows that occupy those regions on the screen. But it can be disruptive if not irritating to have to draw out a new ghost region for every invocation of a particular application. Thus the common applications (e.g. TEDIT, SEDIT, DINFO...) implement particular strategies to reduce the number of times that a user has to sweep out a new region. They instead default to regions that were allocated for earlier invocations that are no longer active. TEDIT for example recycles the region of a session that was recently shut down, SEDIT allocates from a list of previous regions, DINFO always uses the same region, but FILEBROWSER always prompts for a new one. Applications that do recycle their regions tend to do so indiscrimately, without regard to the current arrangement of other windows on the screen or the role that those windows may play in higher-level applications. The REGIONMANAGER package provides simple extensions to the core region and window functions. These are aimed at giving users and application implementors more flexible and systematic control over the specification and reuse of screen regions. It introduces three new notions: A "typed region" allows the regions of particular applications to be specified, classified, and recycled according to their types. @@ -13,15 +13,21 @@ REGIONMANAGER is innocuous in that explicit user action is required to change th Typed regions REGIONMANAGER adds overlay veneers to the core CREATEW, CLOSEW, and GETREGION functions to make it easier to predict and control how different applications arrange their windows on the screen without always needing to respond to a ghost-region prompt. The REGION/INITREGION arguments may now be region-type atoms in addition to either NIL or particular regions as CREATEW and GETREGION otherwise allow. The type-atom will resolve to a region drawn from a predefined pool of regions associated with that type, if the pool has at least one that is not currently allocated to another window. If the pool has no available regions, then the pool will be enlarged with a region that the user produces from a normal ghost-region prompt, and the type-atom will then resolve to the newly installed region. -A typed-region is marked as "inuse" and therefore unavailable when CREATEW assigns it to a window, and the extended CLOSEW marks it as again available when the window is closed. +A typed-region is marked as "inuse" and therefore unavailable when CREATEW assigns it to a window, and the extended CLOSEW marks it as again available when the window is closed. The region of the most recently closed window will be offered the next time a region of its type is requested. An example of how an application can take advantage of this facility is the TEDIT-PF-SEE package. This provides lightweight alternatives to the PF and SEE commands that print their output to scrollable read-only Tedit windows, specifying PF-TEDIT and SEE-TEDIT as their region types. The user can predefine a preference-ordered sequence of recyclable regions that bring up multiple output windows in a predictable tiled arrangement, without region-prompting for each invocation. The global variable TYPED-REGIONS is an alist that maintains the relationship between atomic type-names and the list of regions that belong to each type. The list is ordered according to preferences set by the user, and a type-atom is always resolved to the first unused region in its list. If the user is asked to sweep out a new region, that region is added at the end, as the least preferable. The function SET-TYPED-REGIONS is provided to add or replace TYPED-REGION entries. (SET-TYPED-REGIONS TYPELISTS REPLACE) [Function] TYPELISTS is an alist of the form ((type1 . regions1)(type2 . regions2)...) -where each regioni is a possibly empty list of regions. For convenience, if TYPELISTS is just a literal type-atom, it is interpreted as ((type)), and if it is a list (type . regions) begining with an atom, it is interpreted as ((type . regions). The new regions replace preexisting regions if REPLACE, otherwise they are added at the front. +where each regionsi is a possibly empty list of regions. For convenience, if TYPELISTS is just a literal type-atom, it is interpreted as ((type)), and if it is a list (type . regions) begining with an atom, it is interpreted as ((type . regions). The new regions replace preexisting regions if REPLACE, otherwise they are added at the front. Typically, a call to SET-TYPED-REGIONS would be placed in a user's INIT file to set up the preference order for the regions that the user wants to participate in this reallocation scheme. If an application uses a type that is not on TYPED-REGIONS, then that type-atom is treated as NIL and always gives rise to the normal ghost-region prompting. Thus a user will observe no change in system behavior if TYPED-REGIONS is left with its initial value NIL. A type that is added with an empty region list (as opposed to not being on the list at all) will allow new regions to accumulate for recycling. - +The function REGION-TYPE returns NIL if X is not a typed-region or not a region of type TYPE. +(REGION-TYPE X TYPE) [Function] +In most scenarios the interpretation of a typed region specification is handled automatically by the extended CREATEW and GETREGION functions. Sometimes it may be useful to perform to for the regions dimensions to be entered into other calculations before it is installed in a window. The function GRAB-TYPED-REGION recycles an existing REGION-TYPE window if one meets the optional minimum width and height requirements, otherwise a new region is returned. +(GRAB-TYPED-REGION REGION-TYPE MINWIDTH MINHEIGHT) [Function] +A type can be assigned to an untyped region and installed in a window by the function REGISTER-TYPED-REGION. That region will then be recycled when the window is closed. +(REGISTER-TYPED-REGION REGION REGION-TYPE WINDOW) [Function] +If REGION is NIL, the (presumably) untyped region of WINDOW will be registered. An entry in TYPED-REGIONS will be created for REGION-TYPE if it is not already present. Relative regions Two functions are provided to make it easy to create regions relative and oriented with respect to a specified reference point. These may be useful for constructing an application that includes a constellation of windows arranged in a particular relative way. (RELCREATEREGION WIDTH HEIGHT CORNERX CORNERY REFX REFY ONSCREEN) [Function] @@ -48,7 +54,7 @@ Applications are often set up as a constellation of windows, a central or primar Each of these applications is constructed by anticipating the subregions that the satellite windows will occupy after they are attached, decreasing the constellation region by their estimated (using WIDTHIFWINDOW HEIGHTIFWINDOW) or actual sizes, and then using remainder as the region for the central window. An alternative approach is to construct the central window first, giving it the entire constellation region, and then to have ATTACHWINDOW reshape that window to accomodate the satellite windows as they are attached in sequence. This leads to the same final configuration, but there is no need for separate calculations to pre-adjust the region of the central window. REGIONMANAGER provides an overlay veneer for ATTACHWINDOW that implements this strategy. If the new argument TAKEFROMCENTRAL is true, then the region of the WINDOWTOATTACH will be substracted from the region of the existing central window according to the EDGE parameter of the attachment. -(ATTACHWINDOW WINDOWTOATTACH MAINWINDOW EDGE POSITIONONEDGE WINDOWCOMACTION TAKEFROMCENTRAL) [Function] +(ATTACHWINDOW WINDOWTOATTACH MAINWINDOW EDGE POSITIONONEDGE WINDOWCOMACTION TAKEFROMCENTRAL) [Function] This behavior is also triggered if the UNDERCONSTRUCTION property of the central window is true. Thus, a constellation can be set up by creating all of the satellites and the central window, marking the central window as under construction, and then doing the sequence of attachments. The property can be reset to NIL when the construction is complete, so the central window does not shrink if other other attachments (e.g. expanded menus) by later user actions. A somewhat weaker form of a constellation is a collection of windows that are not attached around a central window but stand in a parent-child relationship at least with respect to closing and moving. A parent windows spawns children that respond independently to ordinary window commands (move, shape, close). But the children close when the parent closes, and the children move when the parent moves so that they continue to appear in the same relative positions. These primitives allow the construction of a tree of windows that are dependent in this way. @@ -62,19 +68,14 @@ Establishes a link between the PARENT window and any number of CHILDREN windows If NEWPOS is the new position of PARENT, moves each of the move-children so that they stand in the same relation to PARENT after it moves as before. -(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))))) 4$4$4$4$4$1 $$1 $4$1$18$18$J$ PAGEHEADING RUNNINGHEADTERMINALTERMINAL -TIMESROMAN$TERMINALMODERN MODERN -   HRULE.GETFNMODERN -   HRULE.GETFNMODERN -  HRULE.GETFNMODERN - - - HRULE.GETFNMODERN   HRULE.GETFNMODERN   (}/ [ ChT  %   - -; 3o) MA  &MmJS-f= -3E -" - -0: /3 -t2C  "O= - , l 9 S~ - 4!U'2  " (  M.U}z \ No newline at end of file +(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))))) 1$4$4$1 $$1 $4$4$4$4$1$18$18$J$ PAGEHEADING RUNNINGHEADMODERN +rd(DEFAULTFONT 1 (TERMINAL 12) (TERMINAL 8) (TERMINAL 8) (PDF (TERMINAL 8)) (POSTSCRIPT (TERMINAL 8))) TERMINALMODERN TERMINALTERMINAL +TIMESROMAN$  HRULE.GETFN   HRULE.GETFN  HRULE.GETFN   HRULE.GETFN  HRULE.GETFN +D   }/ [ CT  1  + +; 3o)      4 n  o2 V@1 %!  A  &MmJS-f= +3E +" + +l /3 +t2C  "O=  , l)9 S~ - 4!Uh'2&$"&( )MDATE:f12z \ No newline at end of file