PACK(9)                                                   PACK(9)

     NAME
          pack - Geometry manager that packs around edges of cavity

     SYNOPSIS
          pack option arg ?arg ...?

     DESCRIPTION
          The pack command is used to communicate with the packer, a
          geometry manager that arranges the children of a parent by
          packing them in order around the edges of the parent.  The
          pack command can have any of several forms, depending on the
          option argument:

          pack slave ?slave ...? ?options?
               If the first argument to pack is a window name (any
               value starting with ``.''), then the command is
               processed in the same way as pack configure.

          pack configure slave ?slave ...? ?options?
               The arguments consist of the names of one or more slave
               windows followed by pairs of arguments that specify how
               to manage the slaves.  See ``THE PACKER ALGORITHM''
               below for details on how the options are used by the
               packer.  The following options are supported:

               -after other
                    Other must be the name of another window.  Use its
                    master as the master for the slaves, and insert
                    the slaves just after other in the packing order.

               -anchor anchor
                    Anchor must be a valid anchor position such as n
                    or sw; it specifies where to position each slave
                    in its parcel.  Defaults to center.

               -before other
                    Other must be the name of another window.  Use its
                    master as the master for the slaves, and insert
                    the slaves just before other in the packing order.

               -expand boolean
                    Specifies whether the slaves should be expanded to
                    consume extra space in their master.  Boolean may
                    have any proper boolean value, such as 1 or no.
                    Defaults to 0.

               -fill style
                    If a slave's parcel is larger than its requested
                    dimensions, this option may be used to stretch the

     Page 1                       Plan 9            (printed 12/23/24)

     PACK(9)                                                   PACK(9)

                    slave.  Style must have one of the following
                    values:

                    none Give the slave its requested dimensions plus
                         any internal padding requested with -ipadx or
                         -ipady.  This is the default.

                    x    Stretch the slave horizontally to fill the
                         entire width of its parcel (except leave
                         external padding as specified by -padx).

                    y    Stretch the slave vertically to fill the
                         entire height of its parcel (except leave
                         external padding as specified by -pady).

                    both Stretch the slave both horizontally and
                         vertically.

               -in other
                    Insert the slave(s) at the end of the packing
                    order for the master window given by other.

               -ipadx dist
                    Dist specifies how much horizontal internal
                    padding to leave on each side of the slave(s).
                    Dist must be a valid screen distance, such as 2 or
                    .5c.  It defaults to 0.

               -ipady dist
                    Dist specifies how much vertical internal padding
                    to leave on each side of the slave(s).  Dist
                    defaults to 0.

               -padx dist
                    Dist specifies how much horizontal external
                    padding to leave on each side of the slave(s).
                    Dist defaults to 0.

               -pady dist
                    Dist specifies how much vertical external padding
                    to leave on each side of the slave(s).  Dist
                    defaults to 0.

               -side side
                    Specifies which side of the master the slave(s)
                    will be packed against.  Must be left, right, top,
                    or bottom.  Defaults to top.

               If no -in, -after or -before option is specified then
               each of the slaves will be inserted at the end of the
               packing list for its parent unless it is already
               managed by the packer (in which case it will be left

     Page 2                       Plan 9            (printed 12/23/24)

     PACK(9)                                                   PACK(9)

               where it is).  If one of these options is specified
               then all the slaves will be inserted at the specified
               point.  If any of the slaves are already managed by the
               geometry manager then any unspecified options for them
               retain their previous values rather than receiving
               default values.

          pack forget slave ?slave ...?
               Removes each of the slaves from the packing order for
               its master and unmaps their windows.  The slaves will
               no longer be managed by the packer.

          pack propagate master ?boolean?
               If boolean has a true boolean value such as 1 or on
               then propagation is enabled for master, which must be a
               window name (see ``GEOMETRY PROPAGATION'' below).  If
               boolean has a false boolean value then propagation is
               disabled for master.  In either of these cases an empty
               string is returned.  If boolean is omitted then the
               command returns 0 or 1 to indicate whether propagation
               is currently enabled for master.  Propagation is
               enabled by default.

          pack slaves master
               Returns a list of all of the slaves in the packing
               order for master.  The order of the slaves in the list
               is the same as their order in the packing order.  If
               master has no slaves then an empty string is returned.

     THE PACKER ALGORITHM
          For each master the packer maintains an ordered list of
          slaves called the packing list.  The -in, -after, and
          -before configuration options are used to specify the master
          for each slave and the slave's position in the packing list.
          If none of these options is given for a slave then the slave
          is added to the end of the packing list for its parent.

          The packer arranges the slaves for a master by scanning the
          packing list in order.  At the time it processes each slave,
          a rectangular area within the master is still unallocated.
          This area is called the cavity;  for the first slave it is
          the entire area of the master.

          For each slave the packer carries out the following steps:

          [1]  The packer allocates a rectangular parcel for the slave
               along the side of the cavity given by the slave's -side
               option.  If the side is top or bottom then the width of
               the parcel is the width of the cavity and its height is
               the requested height of the slave plus the -ipady and
               -pady options.  For the left or right side the height

     Page 3                       Plan 9            (printed 12/23/24)

     PACK(9)                                                   PACK(9)

               of the parcel is the height of the cavity and the width
               is the requested width of the slave plus the -ipadx and
               -padx options.  The parcel may be enlarged further
               because of the -expand option (see ``EXPANSION'' below)

          [2]  The packer chooses the dimensions of the slave.  The
               width will normally be the slave's requested width plus
               twice its -ipadx option and the height will normally be
               the slave's requested height plus twice its -ipady
               option.  However, if the -fill option is x or both then
               the width of the slave is expanded to fill the width of
               the parcel, minus twice the -padx option.  If the -fill
               option is y or both then the height of the slave is
               expanded to fill the width of the parcel, minus twice
               the -pady option.

          [3]  The packer positions the slave over its parcel.  If the
               slave is smaller than the parcel then the -anchor
               option determines where in the parcel the slave will be
               placed.  If -padx or -pady is non-zero, then the given
               amount of external padding will always be left between
               the slave and the edges of the parcel.

          Once a given slave has been packed, the area of its parcel
          is subtracted from the cavity, leaving a smaller rectangular
          cavity for the next slave.  If a slave doesn't use all of
          its parcel, the unused space in the parcel will not be used
          by subsequent slaves.  If the cavity should become too small
          to meet the needs of a slave then the slave will be given
          whatever space is left in the cavity.  If the cavity shrinks
          to zero size, then all remaining slaves on the packing list
          will be unmapped from the screen until the master window
          becomes large enough to hold them again.

     EXPANSION
          If a master window is so large that there will be extra
          space left over after all of its slaves have been packed,
          then the extra space is distributed uniformly among all of
          the slaves for which the -expand option is set.  Extra
          horizontal space is distributed among the expandable slaves
          whose -side is left or right, and extra vertical space is
          distributed among the expandable slaves whose -side is top
          or bottom.

     GEOMETRY PROPAGATION
          The packer normally computes how large a master must be to
          just exactly meet the needs of its slaves, and it sets the
          requested width and height of the master to these
          dimensions.  This causes geometry information to propagate
          up through a window hierarchy to a top-level window so that

     Page 4                       Plan 9            (printed 12/23/24)

     PACK(9)                                                   PACK(9)

          the entire sub-tree sizes itself to fit the needs of the
          leaf windows.  However, the pack propagate command may be
          used to turn off propagation for one or more masters.  If
          propagation is disabled then the packer will not set the
          requested width and height of the packer.  This may be
          useful if, for example, you wish for a master window to have
          a fixed size that you specify.

     RESTRICTIONS ON MASTER WINDOWS
          The master for each slave must be a frame widget or the
          top-level window (``.'').  Widgets of other types can be
          specifed as the master window but will give rise to
          unpredictable results.

     SEE ALSO
          types(9)

     Page 5                       Plan 9            (printed 12/23/24)