WMLIB(2)                                                 WMLIB(2)

     NAME
          wmlib: titlebar, titlectl, taskbar, unhide, geom, snarfput,
          snarfget, tkquote, tkcmds, dialog, getstring, filename,
          mktabs, tabsctl - window manager toolkit

     SYNOPSIS
          include "wmlib.m";
          wmlib := load Wmlib Wmlib->PATH;

          Resize,
          Hide,
          Help,
          OK:     con 1 << iota;

          Appl:   con Resize | Hide;

          init:        fn();
          titlebar:    fn(scr: ref Draw->Screen, where,
                         title: string, buts: int):
                         (ref Tk->Toplevel, chan of string);
          titlectl:    fn(t: ref Tk->Toplevel, request: string);
          taskbar:     fn(t: ref Tk->Toplevel, name: string): string;
          unhide:      fn();
          geom:        fn(t: ref Tk->Toplevel): string;
          snarfput:    fn(buf: string);
          snarfget:    fn(): string;
          tkquote:     fn(s: string): string;
          tkcmds:      fn(t: ref Tk->Toplevel, cmds: array of string);
          dialog:      fn(p: ref Tk->Toplevel, icon, title, msg: string,
                         dflt: int, labs: list of string): int;
          getstring:   fn(p: ref Tk->Toplevel, s: string): string;
          filename:    fn(scr: ref Draw->Screen, t: ref Tk->Toplevel,
                         title: string,
                         pat: list of string,
                         dir: string): string;

          mktabs:      fn(p: ref Tk->Toplevel, book: string,
                         tabs: array of (string, string), dflt: int):
                         chan of string;

          tabsctl:     fn(p: ref Tk->Toplevel, book: string,
                         tabs: array of (string, string), curid: int,
                         newid: string): int;

     DESCRIPTION
          The Wmlib module provides routines for making and updating
          windows controlled by wm(1).

          Init should be called once to initialize the internal state
          of wmlib.

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

     WMLIB(2)                                                 WMLIB(2)

          Titlebar creates a collection of Tk widgets on Screen scr,
          rooted at .Wm_t, using the Tk geometry specification given
          in where. Additionally where may also contain other required
          characteristics (such as a font specification) by simply
          adding them to any geometry specification.  The widgets have
          been packed in the Toplevel returned by titlebar to create a
          managed titlebar.  The title bar consists of a label,
          .Wm_t.title, and the buttons specified by the bit mask buts.
          .Wm_t.title is initialized with the string title, and can be
          reconfigured to change the title of the window.  An exit
          button is always created in the title bar; the buttons
          defined by the constants Resize, Hide, Help, and OK are
          optional.  Most applications should use the buttons defined
          by the constant Appl, which is Resize|Hide.

          A tk(2) event channel is returned by titlebar.  Messages
          received on it should be processed by the application or
          passed to the titlectl function.  The messages include

          exit The window should be closed.  Titlectl will terminate
               the current process and all members of its process
               group.

          ok   The OK button was activated.  The window should be
               closed.

          help The Help button was activated.

          task The Hide button was activated.  Titlectl will unmap the
               Toplevel, make an entry in the task bar, and suspend
               the current process.  Selecting the task bar entry will
               remap the Toplevel and allow the process to resume.

          The simplest well-behaved wm (1) client will therefore con-
          tain:

               (t, titlec) := wmlib->titlebar(ctxt.screen, "", "My Program", Wmlib->Appl);
               # ...
               for(;;){
                    alt{
                    s := <-titlec =>
                         wmlib->titlectl(t, s);

                    # handle any other channels
                    }
               }

          An application can assign a separate process to handle
          titlectl, so that only that process will block on Hide,
          allowing the rest of the application to proceed in the back-
          ground.  Unhide can be called from another process in the
          same application to unblock the process executing titlectl,

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

     WMLIB(2)                                                 WMLIB(2)

          and remap the Toplevel as if by selecting the taskbar entry.

          Taskbar changes the name displayed in the title bar and the
          window's name when it is in the task bar.

          Geom returns a string with the coordinates for a child win-
          dow.

          Snarfget and snarfput retrieve and replace the contents of
          the window manager's snarf buffer.

          The remaining functions build on the Tk module to provide
          some common user interface functions.

          Filename makes a dialog panel for selecting a file.  It is
          displayed on screen near parent. Dir gives the directory
          where the file search should begin.  Only files that match
          pat are displayed.  The returned string is the name of the
          selected file, or the empty string if no file was selected.

          Tkquote returns a string that is the same as its arguments,
          but enclosed in curly braces and with internal curly braces
          escaped.  This can be used to make an arbitrary string into
          a word suitable as an argument to a Tk function.

          Tkcmds executes tkcmd on all strings in the argument array,
          using top for the first argument of Tkcmd.  It does not
          check for error returns.

          Dialog pops up a dialog box, with the given title and an
          optional icon, near the corner of the parent top level wid-
          get, p. It displays the given msg and a number of buttons,
          labelled with the strings in labs. The dialog box waits for
          the user to push a button, and then returns the index of the
          button pushed (the first element of labs is index 0).  If
          the user types a newline, the dflt value is returned.  The
          button with the dflt index is specially outlined in the dia-
          log box.

          Getstring pops up a dialog box near the corner of the parent
          top level widget, p. The box contains the msg and an entry
          widget.  It waits for the user to type a string and a new-
          line, and then returns the typed string, without the new-
          line.

          Mktabs creates a tabbed notebook pseudo widget, book, for
          insertion into widget p. Once created, book can be packed
          like any other Tk widget.  Information for specific tab
          pages is contained in the tabs array.  For each page, tabs
          contains the name displayed in the tab and a Tk widget name.
          Whenever a page is selected, its widget is packed in book
          and displayed.  The notebook will initially display the page

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

     WMLIB(2)                                                 WMLIB(2)

          indexed by dflt. Mktabs returns a Tk event channel.  Mes-
          sages received on this channel should be passed as the newid
          argument to tabsctl.

          Tabsctl controls a tabbed notebook.  Curid is the index of
          the page currently selected in the notebook.  Newid is a
          string containing the index of the new page to be displayed;
          this is usually the information received on the tabs chan-
          nel.  The index of the newly selected page is returned.

     FILES
          /chan/snarf  snarf buffer maintained by wm(1)
          /chan/wm     channel for interaction with wm(1)

     SOURCE
          /appl/lib/wmlib.b

     SEE ALSO
          draw-context(2), tk(2)

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