Sophie

Sophie

distrib > Mandriva > 2008.0 > x86_64 > by-pkgid > 994c49a0619533b97528793e2dcc73fb > files > 82

ion-20040729-4mdk.x86_64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

<!--Converted with LaTeX2HTML 2002-1 (1.69)
original version by:  Nikos Drakos, CBLU, University of Leeds
* revised and updated by:  Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
  Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>6. Function reference</TITLE>
<META NAME="description" CONTENT="6. Function reference">
<META NAME="keywords" CONTENT="ionconf">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="LaTeX2HTML v2002-1">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">

<LINK REL="STYLESHEET" HREF="ionconf.css">

<LINK REL="next" HREF="node8.html">
<LINK REL="previous" HREF="node6.html">
<LINK REL="up" HREF="ionconf.html">
<LINK REL="next" HREF="node8.html">
</HEAD>

<BODY >
<!--Navigation Panel-->
<A NAME="tex2html350"
  HREF="node8.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A> 
<A NAME="tex2html344"
  HREF="ionconf.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A> 
<A NAME="tex2html338"
  HREF="node6.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A> 
<A NAME="tex2html346"
  HREF="node1.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A> 
<A NAME="tex2html348"
  HREF="node10.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A> 
<BR>
<B> Next:</B> <A NAME="tex2html351"
  HREF="node8.html">A. The GNU General</A>
<B> Up:</B> <A NAME="tex2html345"
  HREF="ionconf.html">Ion: Configuring and extending</A>
<B> Previous:</B> <A NAME="tex2html339"
  HREF="node6.html">5. Scripting</A>
 &nbsp; <B>  <A NAME="tex2html347"
  HREF="node1.html">Contents</A></B> 
 &nbsp; <B>  <A NAME="tex2html349"
  HREF="node10.html">Index</A></B> 
<BR>
<BR>
<!--End of Navigation Panel-->
<!--Table of Child-Links-->
<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A>

<UL>
<LI><A NAME="tex2html352"
  HREF="node7.html#SECTION00710000000000000000">6.1 Functions exported by Ioncore</A>
<UL>
<LI><A NAME="tex2html353"
  HREF="node7.html#SECTION00711000000000000000">6.1.1 WClientWin functions</A>
<LI><A NAME="tex2html354"
  HREF="node7.html#SECTION00712000000000000000">6.1.2 WGenFrame functions</A>
<LI><A NAME="tex2html355"
  HREF="node7.html#SECTION00713000000000000000">6.1.3 WMPlex functions</A>
<LI><A NAME="tex2html356"
  HREF="node7.html#SECTION00714000000000000000">6.1.4 WRegion functions</A>
<LI><A NAME="tex2html357"
  HREF="node7.html#SECTION00715000000000000000">6.1.5 WRootWin functions</A>
<LI><A NAME="tex2html358"
  HREF="node7.html#SECTION00716000000000000000">6.1.6 WScreen functions</A>
</UL>
<BR>
<LI><A NAME="tex2html359"
  HREF="node7.html#SECTION00720000000000000000">6.2 Functions exported by the ionws module</A>
<UL>
<LI><A NAME="tex2html360"
  HREF="node7.html#SECTION00721000000000000000">6.2.1 WIonFrame functions</A>
<LI><A NAME="tex2html361"
  HREF="node7.html#SECTION00722000000000000000">6.2.2 WIonWS functions</A>
<LI><A NAME="tex2html362"
  HREF="node7.html#SECTION00723000000000000000">6.2.3 WWsSplit functions</A>
</UL>
<BR>
<LI><A NAME="tex2html363"
  HREF="node7.html#SECTION00730000000000000000">6.3 Functions exported by the floatws module</A>
<UL>
<LI><A NAME="tex2html364"
  HREF="node7.html#SECTION00731000000000000000">6.3.1 WFloatFrame functions</A>
<LI><A NAME="tex2html365"
  HREF="node7.html#SECTION00732000000000000000">6.3.2 WFloatWS functions</A>
</UL>
<BR>
<LI><A NAME="tex2html366"
  HREF="node7.html#SECTION00740000000000000000">6.4 Functions exported by the query module</A>
<UL>
<LI><A NAME="tex2html367"
  HREF="node7.html#SECTION00741000000000000000">6.4.1 WEdln functions</A>
<LI><A NAME="tex2html368"
  HREF="node7.html#SECTION00742000000000000000">6.4.2 WInput functions</A>
</UL>
<BR>
<LI><A NAME="tex2html369"
  HREF="node7.html#SECTION00750000000000000000">6.5 Functions exported by the menu module</A>
<UL>
<LI><A NAME="tex2html370"
  HREF="node7.html#SECTION00751000000000000000">6.5.1 WMenu functions</A>
</UL>
<BR>
<LI><A NAME="tex2html371"
  HREF="node7.html#SECTION00760000000000000000">6.6 Functions exported by the de module</A>
<LI><A NAME="tex2html372"
  HREF="node7.html#SECTION00770000000000000000">6.7 Functions exported by the dock module</A>
<UL>
<LI><A NAME="tex2html373"
  HREF="node7.html#SECTION00771000000000000000">6.7.1 WDock functions</A>
</UL>
<BR>
<LI><A NAME="tex2html374"
  HREF="node7.html#SECTION00780000000000000000">6.8 Functions defined in <I>ioncorelib</I></A>
<LI><A NAME="tex2html375"
  HREF="node7.html#SECTION00790000000000000000">6.9 Functions defined in <I>querylib</I></A>
<LI><A NAME="tex2html376"
  HREF="node7.html#SECTION007100000000000000000">6.10 Functions defined in <I>delib</I></A>
<LI><A NAME="tex2html377"
  HREF="node7.html#SECTION007110000000000000000">6.11 Functions defined in <I>menulib</I></A>
</UL>
<!--End of Table of Child-Links-->
<HR>

<H1><A NAME="SECTION00700000000000000000"></A>
<A NAME="sec:exports"></A>
<BR>
6. Function reference
</H1>

<P>
The following subsections list out the functions exported to Lua scripts
by Ioncore and the ionws, floatws and query modules.

<P>

<H2><A NAME="SECTION00710000000000000000"></A>
<A NAME="sec:ioncoreref"></A>
<BR>
6.1 Functions exported by Ioncore
</H2>

<P>

  <DL>
<DD><A NAME="3185"></A>
<A NAME="fn:add_shortenrule"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool add_shortenrule(string rx, string rule, bool always)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a rule describing how too long titles should be shortened to fit in tabs.
 The regular expression <TT>rx</TT> (POSIX, not Lua!) is used to match titles
 and when <TT>rx</TT> matches, <TT>rule</TT> is attempted to use as a replacement
 for title. If <TT>always</TT> is set, the rule is used even if no shortening 
 is necessary.

<P>
Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 inserted in the resulting string and specials as follows:

<P>
<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Special</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT">$0</TD>
<TD ALIGN="LEFT">Place the original string here.</TD>
</TR>
<TR><TD ALIGN="LEFT">$1 to $9</TD>
<TD ALIGN="LEFT">Insert n:th capture here (as usual,captures are surrounded
                 by parentheses in the regex).</TD>
</TR>
<TR><TD ALIGN="LEFT">$|</TD>
<TD ALIGN="LEFT">Alternative shortening separator. The shortening described
                 before the first this kind of separator is tried first and
                 if it fails to make the string short enough, the next is 
                  tried, and so on.</TD>
</TR>
<TR><TD ALIGN="LEFT">$&lt;</TD>
<TD ALIGN="LEFT">Remove characters on the left of this marker to shorten the
                 string.</TD>
</TR>
<TR><TD ALIGN="LEFT">$&gt;</TD>
<TD ALIGN="LEFT">Remove characters on the right of this marker to shorten the
                 string. Only the first $&lt; or $&gt; within an alternative 
                 shortening is used.</TD>
</TR>
</TABLE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3186"></A>
<A NAME="fn:clear_tags"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void clear_tags()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Untag all regions.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3187"></A>
<A NAME="fn:complete_clientwin"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table complete_clientwin(string nam)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Find all client windows whose name begins with <TT>nam</TT> or, if none are
 found, all whose name contains <TT>name</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3188"></A>
<A NAME="fn:complete_region"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table complete_region(string nam, string typenam)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Find all non-client window regions inheriting <TT>typename</TT> and whose
 name begins with <TT>nam</TT> or, if none are found all whose name contains
 <TT>name</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3189"></A>
<A NAME="fn:enable_opaque_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void enable_opaque_resize(bool opaque)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Enable/disable opaque move/resize mode.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3190"></A>
<A NAME="fn:enable_warp"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void enable_warp(bool warp)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Enable/disable warping pointer to be contained in activated region.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3191"></A>
<A NAME="fn:enable_workspace_saves"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void enable_workspace_saves(bool enable)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD><P>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3192"></A>
<A NAME="fn:exec"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool exec(string cmd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Run <TT>cmd</TT> with the environment variable DISPLAY set to point to the
 X display the WM is running on. No specific screen is set unlike with
 <A HREF="#fn:WRootWin.exec_on"><TT>WRootWin.exec_on</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3193"></A>
<A NAME="fn:exit_wm"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void exit_wm()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Causes the window manager to exit.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3194"></A>
<A NAME="fn:warn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void warn(string str)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Issue a warning. How the message is displayed depends on the current
 warning handler.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3195"></A>
<A NAME="fn:find_screen_id"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WScreen find_screen_id(integer id)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Find the screen with numerical id <TT>id</TT>. If Xinerama is
 not present, <TT>id</TT> corresponds to X screen numbers. Otherwise
 the ids are some arbitrary ordering of Xinerama rootwins.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3196"></A>
<A NAME="fn:genframe_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool genframe_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a set of bindings available in WGenFrames (all types of frames).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3197"></A>
<A NAME="fn:get_savefile"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string get_savefile(string basename)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get a file name to save (session) data in. The string <TT>basename</TT> should
 contain no path or extension components.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3198"></A>
<A NAME="fn:global_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool global_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a set of bindings available everywhere. The bound functions
 should accept WScreen as argument.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3199"></A>
<A NAME="fn:goto_next_screen"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WScreen goto_next_screen()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Switch focus to the next screen and return it.

<P>
Note that this function is asynchronous; the screen will not
 actually have received the focus when this function returns.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3200"></A>
<A NAME="fn:goto_nth_screen"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WScreen goto_nth_screen(integer id)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Switch focus to the screen with id <TT>id</TT> and return it.

<P>
Note that this function is asynchronous; the screen will not
 actually have received the focus when this function returns.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3201"></A>
<A NAME="fn:goto_prev_screen"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WScreen goto_prev_screen()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Switch focus to the previous screen and return it.

<P>
Note that this function is asynchronous; the screen will not
 actually have received the focus when this function returns.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3202"></A>
<A NAME="fn:goto_previous"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion goto_previous()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Go to and return the region that had its activity state previously 
 saved.

<P>
Note that this function is asynchronous; the region will not
 actually have received the focus when this function returns.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3203"></A>
<A NAME="fn:gr_read_config"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void gr_read_config()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Read drawing engine configuration file <I>draw.lua</I>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3204"></A>
<A NAME="fn:gr_refresh"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void gr_refresh()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Refresh objects' brushes to update them to use newly loaded style.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3205"></A>
<A NAME="fn:gr_select_engine"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool gr_select_engine(string engine)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Future requests for ''brushes'' are to be forwarded to the drawing engine
 <TT>engine</TT>. If no engine of such name is known, a module with that name
 is attempted to be loaded. This function is only intended to be called from
 colour scheme etc. configuration files and can not be used to change the
 look of existing objects; for that use <A HREF="#fn:reread_draw_config"><TT>reread_draw_config</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3206"></A>
<A NAME="fn:include"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool include(string what)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Execute another file with Lua code.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3207"></A>
<A NAME="fn:initialise_screen_id"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool initialise_screen_id(integer id, table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>(Intended to be called from workspace savefiles.)
 Set screen name and initial workspaces etc.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3208"></A>
<A NAME="fn:ioncore_aboutmsg"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string ioncore_aboutmsg()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns an about message (version, author, copyright notice).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3209"></A>
<A NAME="fn:ioncore_add_scriptdir"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool ioncore_add_scriptdir(string dir)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a search path.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3210"></A>
<A NAME="fn:ioncore_get_scriptdirs"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table ioncore_get_scriptdirs()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get all directories on search path.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3211"></A>
<A NAME="fn:ioncore_is_i18n"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool ioncore_is_i18n()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is Ion supporting locale-specifically multibyte-encoded strings?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3212"></A>
<A NAME="fn:ioncore_userdir"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string ioncore_userdir()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get user configuration file directory.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3213"></A>
<A NAME="fn:ioncore_version"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string ioncore_version()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns Ioncore version string.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3214"></A>
<A NAME="fn:load_module"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool load_module(string modname)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to load module <TT>modname</TT>. Ion will use libltdl to search
 the library path (the default setting is <I>~/.ion2/libs</I> and
 <I>$PREFIX/lib/ion</I>) and also try diffent extensions, so only
 the module name should usually be necessary to give here.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3216"></A>
<A NAME="fn:lookup_clientwin"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WClientWin lookup_clientwin(string name)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to find a client window with name <TT>name</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3217"></A>
<A NAME="fn:lookup_region"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion lookup_region(string name, string typenam)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to find a non-client window region with name <TT>name</TT> and type
 inheriting <TT>typenam</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3218"></A>
<A NAME="fn:lookup_script"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string lookup_script(string file, string try_in_dir)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD><P>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3219"></A>
<A NAME="fn:mplex_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool mplex_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a set of bindings available in WMPlexes (screens and all
 types of frames).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3220"></A>
<A NAME="fn:obj_is"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool obj_is(WObj obj, string typename)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>obj</TT> of type <TT>typename</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3221"></A>
<A NAME="fn:obj_typename"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string obj_typename(WObj obj)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return type name of <TT>obj</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3222"></A>
<A NAME="fn:popen_bgread"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool popen_bgread(string cmd, function handler)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Run <TT>cmd</TT> with a read pipe connected to its stdout.
 When data is received through the pipe, <TT>handler</TT> is called
 with that data.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3223"></A>
<A NAME="fn:restart_other_wm"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void restart_other_wm(string cmd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to restart another window manager <TT>cmd</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3224"></A>
<A NAME="fn:restart_wm"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void restart_wm()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Restart Ioncore.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3225"></A>
<A NAME="fn:root_windows"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table root_windows()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a table of root windows indexed by the X screen id.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3226"></A>
<A NAME="fn:set_dblclick_delay"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void set_dblclick_delay(integer dd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set double click delay in milliseconds.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3227"></A>
<A NAME="fn:set_resize_accel_params"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void set_resize_accel_params(integer t_max, integer t_min, double step, double maxacc)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set keyboard resize acceleration parameters. When a keyboard resize
 function is called, and at most <TT>t_max</TT> milliseconds has passed
 from a previous call, acceleration factor is reset to 1.0. Otherwise,
 if at least <TT>t_min</TT> milliseconds have passed from the from previous
 acceleration update or reset the squere root of the acceleration factor
 is incremented by <TT>step</TT>. The maximum acceleration factor (pixels/call 
 modulo size hints) is given by <TT>maxacc</TT>. The default values are 
 (200, 50, 30, 100). 

<P>
Notice the interplay with X keyboard acceleration parameters.
 (Maybe insteed of <TT>t_min</TT> we should use a minimum number of
 calls to the function/key presses between updated? Or maybe the
 resize should be completely time-based with key presses triggering
 the changes?)
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3228"></A>
<A NAME="fn:set_resize_delay"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void set_resize_delay(integer rd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set keyboard resize mode auto-finish delay in milliseconds.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3229"></A>
<A NAME="fn:set_switch_to_new_clients"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void set_switch_to_new_clients(bool sw)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Should newly created client window be switched to immediately or
 should the active window retain focus by default?
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00711000000000000000">
6.1.1 WClientWin functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="3231"></A>
<A NAME="3232"></A>
<A NAME="fn:WClientWin.broken_app_resize_kludge"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WClientWin.broken_app_resize_kludge(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempts to fix window size problems with non-ICCCM compliant
 programs.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3233"></A>
<A NAME="3234"></A>
<A NAME="fn:WClientWin.close"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WClientWin.close(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Request the application that owns the X window corresponding to
 <TT>cwin</TT> to close the window. This function will fail if the
 application is not responding or does not support the WM_DELETE
 protocol. In that case <A HREF="#fn:WClientWin.kill"><TT>WClientWin.kill</TT></A> should be used.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3235"></A>
<A NAME="3236"></A>
<A NAME="fn:WClientWin.get_ident"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WClientWin.get_ident(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a table containing the properties <TT>WM_CLASS</TT> (table entries
 <TT>instance</TT> and <TT>class</TT>),  <TT>WM_WINDOW_ROLE</TT> (and <TT>role</TT>)
 and <TT>_ION_KLUDGES</TT> (<TT>kludges</TT>) properties for <TT>cwin</TT>.
 If a property is not set, the corresponding field(s) are unset in the 
 table.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3237"></A>
<A NAME="3238"></A>
<A NAME="fn:WClientWin.kill"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WClientWin.kill(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to kill (with XKillWindow) the client that owns the X
 window correspoding to <TT>cwin</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3239"></A>
<A NAME="3240"></A>
<A NAME="fn:WClientWin.managed_list"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WClientWin.managed_list(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a list of regions managed by the clientwin (transients, mostly).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3241"></A>
<A NAME="3242"></A>
<A NAME="fn:WClientWin.quote_next"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WClientWin.quote_next(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Send next key press directly to <TT>cwin</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3243"></A>
<A NAME="3244"></A>
<A NAME="fn:WClientWin.toggle_fullscreen"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WClientWin.toggle_fullscreen(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle between full screen and normal (framed) mode.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3245"></A>
<A NAME="3246"></A>
<A NAME="fn:WClientWin.toggle_transients_pos"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WClientWin.toggle_transients_pos(WClientWin cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle transients managed by <TT>cwin</TT> between top/bottom
 of the window.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00712000000000000000">
6.1.2 WGenFrame functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="3248"></A>
<A NAME="3249"></A>
<A NAME="fn:WGenFrame.is_shaded"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WGenFrame.is_shaded(WGenFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>frame</TT> shaded?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3250"></A>
<A NAME="3251"></A>
<A NAME="fn:WGenFrame.maximize_horiz"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WGenFrame.maximize_horiz(WGenFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to maximize <TT>frame</TT> horizontally.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3252"></A>
<A NAME="3253"></A>
<A NAME="fn:WGenFrame.maximize_vert"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WGenFrame.maximize_vert(WGenFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to maximize <TT>frame</TT> vertically.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3254"></A>
<A NAME="3255"></A>
<A NAME="fn:WGenFrame.p_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WGenFrame.p_resize(WGenFrame genframe)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Start resizing <TT>genframe</TT> with the mouse or other pointing device.
 This function should only be used by binding it to <I>mpress</I> or
 <I>mdrag</I> action.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3256"></A>
<A NAME="3257"></A>
<A NAME="fn:WGenFrame.p_switch_tab"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WGenFrame.p_switch_tab(WGenFrame genframe)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Display the region corresponding to the tab that the user pressed on.
 This function should only be used by binding it to a mouse action.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3258"></A>
<A NAME="3259"></A>
<A NAME="fn:WGenFrame.p_tabdrag"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WGenFrame.p_tabdrag(WGenFrame genframe)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Start dragging the tab that the user pressed on with the pointing device.
 This function should only be used by binding it to <I>mpress</I> or
 <I>mdrag</I> action with area ''tab''.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3260"></A>
<A NAME="3261"></A>
<A NAME="fn:WGenFrame.toggle_tab"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WGenFrame.toggle_tab(WGenFrame genframe)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle tab visibility.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00713000000000000000">
6.1.3 WMPlex functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="3263"></A>
<A NAME="3264"></A>
<A NAME="fn:WMPlex.attach"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WMPlex.attach(WMPlex mplex, WRegion reg, table param)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attach and reparent existing region <TT>reg</TT> to <TT>mplex</TT>.
 The table <TT>param</TT> may contain the fields <TT>index</TT> and
 <TT>switchto</TT> that are interpreted as for <A HREF="#fn:WMPlex.attach_new"><TT>WMPlex.attach_new</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3265"></A>
<A NAME="3266"></A>
<A NAME="fn:WMPlex.attach_new"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WMPlex.attach_new(WMPlex mplex, table param)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Create a new region to be managed by <TT>mplex</TT>. At least the following
 fields in <TT>param</TT> are understood:

<P>
<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Field</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>type</TT></TD>
<TD ALIGN="LEFT">Class name (a string) of the object to be created. Mandatory.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>name</TT></TD>
<TD ALIGN="LEFT">Name of the object to be created (a string). Optional.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>switchto</TT></TD>
<TD ALIGN="LEFT">Should the region be switched to (boolean)? Optional.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>index</TT></TD>
<TD ALIGN="LEFT">Index of the new region in <TT>mplex</TT>'s list of
   managed objects (integer, 0 = first). Optional.</TD>
</TR>
</TABLE>

<P>
In addition parameters to the region to be created are passed in this 
 same table.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3267"></A>
<A NAME="3268"></A>
<A NAME="fn:WMPlex.attach_tagged"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMPlex.attach_tagged(WMPlex mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attach all tagged regions to <TT>mplex</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3269"></A>
<A NAME="3270"></A>
<A NAME="fn:WMPlex.current"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WMPlex.current(WMPlex mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return the object managed by and currenly displayed in <TT>mplex</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3271"></A>
<A NAME="3272"></A>
<A NAME="fn:WMPlex.current_input"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WMPlex.current_input(WMPlex mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the currently active ''input'' (query, message etc.) in
 <TT>mplex</TT> or nil.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3273"></A>
<A NAME="3274"></A>
<A NAME="fn:WMPlex.managed_count"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>integer WMPlex.managed_count(WMPlex mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the number of regions managed/multiplexed by <TT>mplex</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3275"></A>
<A NAME="3276"></A>
<A NAME="fn:WMPlex.managed_list"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WMPlex.managed_list(WMPlex mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a list of regions managed by <TT>mplex</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3277"></A>
<A NAME="3278"></A>
<A NAME="fn:WMPlex.move_to_index"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMPlex.move_to_index(WMPlex mplex, WRegion reg, integer index)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set index of <TT>reg</TT> within the multiplexer to <TT>index</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3279"></A>
<A NAME="3280"></A>
<A NAME="fn:WMPlex.move_to_next_index"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMPlex.move_to_next_index(WMPlex mplex, WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Move <TT>reg</TT> to next index within the multiplexer.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3281"></A>
<A NAME="3282"></A>
<A NAME="fn:WMPlex.move_to_prev_index"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMPlex.move_to_prev_index(WMPlex mplex, WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Move <TT>reg</TT> to previous index within the multiplexer.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3283"></A>
<A NAME="3284"></A>
<A NAME="fn:WMPlex.nth_managed"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WMPlex.nth_managed(WMPlex mplex, integer n)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the <TT>n</TT>:th object managed by <TT>mplex</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3285"></A>
<A NAME="3286"></A>
<A NAME="fn:WMPlex.switch_next"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMPlex.switch_next(WMPlex mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Have <TT>mplex</TT> display next (wrt. currently selected) object managed 
 by it.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3287"></A>
<A NAME="3288"></A>
<A NAME="fn:WMPlex.switch_nth"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMPlex.switch_nth(WMPlex mplex, integer n)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Have <TT>mplex</TT> display the <TT>n</TT>:th object managed by it.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3289"></A>
<A NAME="3290"></A>
<A NAME="fn:WMPlex.switch_prev"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMPlex.switch_prev(WMPlex mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Have <TT>mplex</TT> display previous (wrt. currently selected) object
 managed by it.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00714000000000000000">
6.1.4 WRegion functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="3292"></A>
<A NAME="3293"></A>
<A NAME="fn:WRegion.active_sub"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WRegion.active_sub(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns most recently active region that has <TT>reg</TT> as its
 parent.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3294"></A>
<A NAME="3295"></A>
<A NAME="fn:WRegion.close"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.close(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to close/destroy <TT>reg</TT>. Whether this operation works
 depends on whether the particular type of region in question has
 implemented the feature and, in case of client windows, whether
 the client supports the <TT>WM_DELETE</TT> protocol (see also
 <A HREF="#fn:WClientWin.kill"><TT>WClientWin.kill</TT></A>).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3296"></A>
<A NAME="3297"></A>
<A NAME="fn:WRegion.display"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.display(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to display <TT>reg</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3298"></A>
<A NAME="3299"></A>
<A NAME="fn:WRegion.display_sp"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.display_sp(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to display <TT>reg</TT> and save the current region
 activity status for use by <A HREF="#fn:goto_previous"><TT>goto_previous</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3300"></A>
<A NAME="3301"></A>
<A NAME="fn:WRegion.geom"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WRegion.geom(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the geometry of <TT>reg</TT> within its parent; a table with fields
 <TT>x</TT>, <TT>y</TT>, <TT>w</TT> and <TT>h</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3302"></A>
<A NAME="3303"></A>
<A NAME="fn:WRegion.goto"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.goto(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to display <TT>reg</TT>, save region activity status and then
 warp to (or simply set focus to if warping is disabled) <TT>reg</TT>.

<P>
Note that this function is asynchronous; the region will not
 actually have received the focus when this function returns.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3304"></A>
<A NAME="3305"></A>
<A NAME="fn:WRegion.is_active"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.is_active(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>reg</TT> active/does it or one of it's children of focus?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3306"></A>
<A NAME="3307"></A>
<A NAME="fn:WRegion.is_mapped"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.is_mapped(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>reg</TT> visible/is it and all it's ancestors mapped?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3308"></A>
<A NAME="3309"></A>
<A NAME="fn:WRegion.is_tagged"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.is_tagged(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>reg</TT> tagged?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3310"></A>
<A NAME="3311"></A>
<A NAME="fn:WRegion.keep_on_top"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.keep_on_top(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Inform that <TT>reg</TT> should be kept above normally stacked regions
 within its parent.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3312"></A>
<A NAME="3313"></A>
<A NAME="fn:WRegion.lower"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.lower(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Lower <TT>reg</TT> in the stack. The regions marked to be stacked above
 <TT>reg</TT> will also be lowerd and regions marked to be kept on top
 will not be lowered below normally stacked regions.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3314"></A>
<A NAME="3315"></A>
<A NAME="fn:WRegion.manager"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WRegion.manager(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the region that manages <TT>reg</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3316"></A>
<A NAME="3317"></A>
<A NAME="fn:WRegion.name"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string WRegion.name(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the name for <TT>reg</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3318"></A>
<A NAME="3319"></A>
<A NAME="fn:WRegion.parent"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WRegion.parent(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the parent region of <TT>reg</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3320"></A>
<A NAME="3321"></A>
<A NAME="fn:WRegion.raise"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.raise(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Raise <TT>reg</TT> in the stack. The regions marked to be stacked above
 <TT>reg</TT> will also be raised and normally stacked regions will not
 be raised above region marked to be kept on top.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3322"></A>
<A NAME="3323"></A>
<A NAME="fn:WRegion.request_geom"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WRegion.request_geom(WRegion reg, table g)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to resize and/or move <TT>reg</TT>. The table <TT>g</TT> is a usual
 geometry specification (fields <TT>x</TT>, <TT>y</TT>, <TT>w</TT> and <TT>h</TT>),
 but may contain missing fields, in which case, <TT>reg</TT>'s manager may
 attempt to leave that attribute unchanged.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3324"></A>
<A NAME="3325"></A>
<A NAME="fn:WRegion.reset_stacking"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.reset_stacking(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Inform that <TT>reg</TT> should be stacked normally.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3326"></A>
<A NAME="3327"></A>
<A NAME="fn:WRegion.rootwin_of"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRootWin WRegion.rootwin_of(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the root window <TT>reg</TT>&nbsp;is on.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3328"></A>
<A NAME="3329"></A>
<A NAME="fn:WRegion.screen_of"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WScreen WRegion.screen_of(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the screen <TT>reg</TT> is on.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3330"></A>
<A NAME="3331"></A>
<A NAME="fn:WRegion.set_name"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.set_name(WRegion reg, string p)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set the name of <TT>reg</TT> to <TT>p</TT>. If the name is already in use,
 an instance number suffix <TT>&lt;n&gt;</TT> will be attempted. If <TT>p</TT> has
 such a suffix, it will be modified, otherwise such a suffix will be
 added. Setting <TT>p</TT> to nil will cause current name to be removed.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3332"></A>
<A NAME="3333"></A>
<A NAME="fn:WRegion.set_name_exact"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.set_name_exact(WRegion reg, string p)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Similar to <A HREF="#fn:WRegion.set_name"><TT>WRegion.set_name</TT></A> except if the name is already in use,
 other instance numbers will not be attempted. The string <TT>p</TT> should
 not contain a <TT>&lt;n&gt;</TT> suffix or this function will fail.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3334"></A>
<A NAME="3335"></A>
<A NAME="fn:WRegion.stack_above"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRegion.stack_above(WRegion reg, WRegion above)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Inform that <TT>reg</TT> should be stacked above the region <TT>above</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3336"></A>
<A NAME="3337"></A>
<A NAME="fn:WRegion.tag"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.tag(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Tag <TT>reg</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3338"></A>
<A NAME="3339"></A>
<A NAME="fn:WRegion.toggle_tag"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.toggle_tag(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle region <TT>reg</TT> tag.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3340"></A>
<A NAME="3341"></A>
<A NAME="fn:WRegion.untag"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WRegion.untag(WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Untag <TT>reg</TT>.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00715000000000000000">
6.1.5 WRootWin functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="3343"></A>
<A NAME="3344"></A>
<A NAME="fn:WRootWin.exec_on"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WRootWin.exec_on(WRootWin rootwin, string cmd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Run <TT>cmd</TT> with the environment variable DISPLAY set to point to the
 root window <TT>rootwin</TT> of the X display the WM is running on.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3345"></A>
<A NAME="3346"></A>
<A NAME="fn:WRootWin.current_scr"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WScreen WRootWin.current_scr(WRootWin rootwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns previously active screen on root window <TT>rootwin</TT>.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00716000000000000000">
6.1.6 WScreen functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="3348"></A>
<A NAME="3349"></A>
<A NAME="fn:WScreen.id"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>integer WScreen.id(WScreen scr)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return the numerical id for screen <TT>scr</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="3350"></A>
<A NAME="3351"></A>
<A NAME="fn:WScreen.set_managed_offset"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WScreen.set_managed_offset(WScreen scr, table offset)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set offset of objects managed by the screen from actual screen geometry.
 The table <TT>offset</TT> should contain the entries <TT>x</TT>, <TT>y</TT>, 
 <TT>w</TT> and <TT>h</TT> indicating offsets of that component of screen 
 geometry.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00720000000000000000"></A>
<A NAME="sec:ionwsref"></A>
<BR>
6.2 Functions exported by the ionws module
</H2>

<P>

  <DL>
<DD><A NAME="4717"></A>
<A NAME="fn:ionframe_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool ionframe_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a set of bindings to the bindings available in WIonFrames.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4718"></A>
<A NAME="fn:ionframe_moveres_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool ionframe_moveres_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Describe WIonFrame resize mode bindings.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4719"></A>
<A NAME="fn:ionws_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool ionws_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a set of bindings to the bindings available in every object
 on WIonWS:s.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00721000000000000000">
6.2.1 WIonFrame functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="4721"></A>
<A NAME="4722"></A>
<A NAME="fn:WIonFrame.begin_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WIonFrame.begin_resize(WIonFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Enter resize mode for <TT>frame</TT>. The bindings set with
 <A HREF="#fn:ionframe_moveres_bindings"><TT>ionframe_moveres_bindings</TT></A> are used in this mode and of
 of the exported functions only <A HREF="#fn:WIonFrame.do_resize"><TT>WIonFrame.do_resize</TT></A>, 
 <A HREF="#fn:ionframe_cancel_resize"><TT>ionframe_cancel_resize</TT></A> and <A HREF="#fn:WIonFrame.end_resize"><TT>WIonFrame.end_resize</TT></A>
 are allowed to be called.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4723"></A>
<A NAME="4724"></A>
<A NAME="fn:WIonFrame.cancel_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WIonFrame.cancel_resize(WIonFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return from move/resize cancelling changes if opaque
 move/resize has not been enabled.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4725"></A>
<A NAME="4726"></A>
<A NAME="fn:WIonFrame.do_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WIonFrame.do_resize(WIonFrame frame, integer left, integer right, integer top, integer bottom)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Shrink or grow <TT>frame</TT> one step in each direction.
 Acceptable values for the parameters <TT>left</TT>, <TT>right</TT>, <TT>top</TT>
 and <TT>bottom</TT> are as follows: -1: shrink along,
 0: do not change, 1: grow along corresponding border.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4727"></A>
<A NAME="4728"></A>
<A NAME="fn:WIonFrame.end_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WIonFrame.end_resize(WIonFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return from move/resize mode and apply changes unless opaque
 move/resize is enabled.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4729"></A>
<A NAME="4730"></A>
<A NAME="fn:WIonFrame.relocate_and_close"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WIonFrame.relocate_and_close(WIonFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Try to relocate regions managed by <TT>frame</TT> somewhere else
 and if possible, destroy the frame.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4731"></A>
<A NAME="4732"></A>
<A NAME="fn:WIonFrame.split"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WIonFrame WIonFrame.split(WIonFrame frame, string dirstr)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Split <TT>frame</TT> creating a new WIonFrame to direction <TT>dir</TT>
 (one of ''left'', ''right'', ''top'' or ''bottom'') of <TT>frame</TT>.
 The active manages region in <TT>frame</TT>, if any, is moved to the
 new frame.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4733"></A>
<A NAME="4734"></A>
<A NAME="fn:WIonFrame.split_empty"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WIonFrame WIonFrame.split_empty(WIonFrame frame, string dirstr)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Similar to <A HREF="#fn:WIonFrame.split"><TT>WIonFrame.split</TT></A> except nothing is moved to the newly
 created frame.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4735"></A>
<A NAME="4736"></A>
<A NAME="fn:WIonFrame.toggle_shade"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WIonFrame.toggle_shade(WIonFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle shade (only titlebar visible) mode.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00722000000000000000">
6.2.2 WIonWS functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="4738"></A>
<A NAME="4739"></A>
<A NAME="fn:WIonWS.above"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.above(WIonWS ws, WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.next_to"><TT>WIonWS.next_to</TT></A><TT>(ws, reg, "up")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4740"></A>
<A NAME="4741"></A>
<A NAME="fn:WIonWS.below"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.below(WIonWS ws, WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.nextto"><TT>WIonWS.nextto</TT></A><TT>(ws, reg, "down")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4742"></A>
<A NAME="4743"></A>
<A NAME="fn:WIonWS.current"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.current(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns most recently active region on <TT>ws</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4744"></A>
<A NAME="4745"></A>
<A NAME="fn:WIonWS.farthest"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.farthest(WIonWS ws, string dirstr)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return the most previously active region on <TT>ws</TT> with no
 other regions next to it in  direction <TT>dirstr</TT> 
 (left/right/up/down).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4746"></A>
<A NAME="4747"></A>
<A NAME="fn:WIonWS.goto_above"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.goto_above(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.goto_dir"><TT>WIonWS.goto_dir</TT></A><TT>(ws, "up")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4748"></A>
<A NAME="4749"></A>
<A NAME="fn:WIonWS.goto_below"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.goto_below(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.goto_dir"><TT>WIonWS.goto_dir</TT></A><TT>(ws, "down")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4750"></A>
<A NAME="4751"></A>
<A NAME="fn:WIonWS.goto_dir"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.goto_dir(WIonWS ws, string dirstr)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Go to the most previously active region on <TT>ws</TT> next to <TT>reg</TT> in
 direction <TT>dirstr</TT> (up/down/left/right), wrapping around to a most 
 recently active farthest region in the opposite direction if <TT>reg</TT> 
 is already the further region in the given direction.

<P>
Note that this function is asynchronous; the region will not
 actually have received the focus when this function returns.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4752"></A>
<A NAME="4753"></A>
<A NAME="fn:WIonWS.goto_left"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.goto_left(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.goto_dir"><TT>WIonWS.goto_dir</TT></A><TT>(ws, "left")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4754"></A>
<A NAME="4755"></A>
<A NAME="fn:WIonWS.goto_right"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.goto_right(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.goto_dir"><TT>WIonWS.goto_dir</TT></A><TT>(ws, "right")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4756"></A>
<A NAME="4757"></A>
<A NAME="fn:WIonWS.left_of"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.left_of(WIonWS ws, WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.nextto"><TT>WIonWS.nextto</TT></A><TT>(ws, reg, "left")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4758"></A>
<A NAME="4759"></A>
<A NAME="fn:WIonWS.leftmost"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.leftmost(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.farthest"><TT>WIonWS.farthest</TT></A><TT>(ws, "left")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4760"></A>
<A NAME="4761"></A>
<A NAME="fn:WIonWS.lowest"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.lowest(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.farthest"><TT>WIonWS.farthest</TT></A><TT>(ws, "down")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4762"></A>
<A NAME="4763"></A>
<A NAME="fn:WIonWS.managed_list"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WIonWS.managed_list(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a list of regions managed by the workspace (frames, mostly).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4764"></A>
<A NAME="4765"></A>
<A NAME="fn:WIonWS.newframe"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WIonFrame WIonWS.newframe(WIonWS ws, string dirstr)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Create new WIonFrame on <TT>ws</TT> above/below/left of/right of
 all other objects depending on <TT>dirstr</TT>
 (one of ''left'', ''right'', ''top'' or ''bottom'').
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4766"></A>
<A NAME="4767"></A>
<A NAME="fn:WIonWS.next_to"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.next_to(WIonWS ws, WRegion reg, string dirstr)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return the most previously active region next to <TT>reg</TT> in
 direction <TT>dirstr</TT> (left/right/up/down). The region <TT>reg</TT>
 must be managed by <TT>ws</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4768"></A>
<A NAME="4769"></A>
<A NAME="fn:WIonWS.resize_tree"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WIonWS.resize_tree(WIonWS ws, WObj node, table g)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attempt to resize and/or move the split tree starting at <TT>node</TT>
 (WWsSplit or WRegion). Behaviour and the <TT>g</TT> 
 parameter are as for <A HREF="#fn:WRegion.request_geom"><TT>WRegion.request_geom</TT></A> operating on
 <TT>node</TT> (if it were a WRegion).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4770"></A>
<A NAME="4771"></A>
<A NAME="fn:WIonWS.right_of"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.right_of(WIonWS ws, WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.nextto"><TT>WIonWS.nextto</TT></A><TT>(ws, reg, "right")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4772"></A>
<A NAME="4773"></A>
<A NAME="fn:WIonWS.rightmost"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.rightmost(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.farthest"><TT>WIonWS.farthest</TT></A><TT>(ws, "right")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4774"></A>
<A NAME="4775"></A>
<A NAME="fn:WIonWS.split_of"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WWsSplit WIonWS.split_of(WIonWS ws, WRegion reg)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>For region <TT>reg</TT> managed by <TT>ws</TT> return the WWsSplit
 a leaf of which <TT>reg</TT> is.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4776"></A>
<A NAME="4777"></A>
<A NAME="fn:WIonWS.topmost"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WIonWS.topmost(WIonWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WIonWS.farthest"><TT>WIonWS.farthest</TT></A><TT>(ws, "up")</TT>.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00723000000000000000">
6.2.3 WWsSplit functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="4779"></A>
<A NAME="4780"></A>
<A NAME="fn:WWsSplit.br"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WObj WWsSplit.br(WWsSplit split)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return the object (region or split) corresponding to bottom or right
 sibling of <TT>split</TT> depending on the split's direction.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4781"></A>
<A NAME="4782"></A>
<A NAME="fn:WWsSplit.geom"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WWsSplit.geom(WWsSplit split)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the area of workspace used by the regions under <TT>split</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4783"></A>
<A NAME="4784"></A>
<A NAME="fn:WWsSplit.is_horizontal"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WWsSplit.is_horizontal(WWsSplit split)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>split</TT> a horizontal split?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4785"></A>
<A NAME="4786"></A>
<A NAME="fn:WWsSplit.is_vertical"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WWsSplit.is_vertical(WWsSplit split)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>split</TT> a vertical split?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4787"></A>
<A NAME="4788"></A>
<A NAME="fn:WWsSplit.parent"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WWsSplit WWsSplit.parent(WWsSplit split)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return parent split for <TT>split</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="4789"></A>
<A NAME="4790"></A>
<A NAME="fn:WWsSplit.tl"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WObj WWsSplit.tl(WWsSplit split)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return the object (region or split) corresponding to top or left
 sibling of <TT>split</TT> depending on the split's direction.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00730000000000000000"></A>
<A NAME="sec:floatwsref"></A>
<BR>
6.3 Functions exported by the floatws module
</H2>

<P>

  <DL>
<DD><A NAME="5405"></A>
<A NAME="fn:floatframe_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool floatframe_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Sets up bindings for WFloatFrames.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5406"></A>
<A NAME="fn:floatframe_moveres_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool floatframe_moveres_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Sets up bindings for move/resize mode of WFloatFrames.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5407"></A>
<A NAME="fn:floatws_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void floatws_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Sets up bindings available in all objects on WFloatWS:s.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5408"></A>
<A NAME="fn:set_floatws_placement_method"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void set_floatws_placement_method(string method)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set placement method for WFloatWS:s. <TT>Method</TT> can be one  of ''udlr'',
 ''lrud'' (default) and ''random''. The method ''udlr'' looks for free space
 starting from top the top left corner of the workspace moving first down
 keeping the x coordinate fixed. If it find no free space, it start looking
 similarly at next x coordinate unoccupied by other objects and so on.
 ''lrud' is the same but with the role of coordinates changed and both
 fall back to ''random'' placement if no free area was found.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00731000000000000000">
6.3.1 WFloatFrame functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="5410"></A>
<A NAME="5411"></A>
<A NAME="fn:WFloatFrame.begin_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.begin_resize(WFloatFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Enter move/resize mode for <TT>frame</TT>. The bindings set with
 <A HREF="#fn:floatframe_moveres_bindings"><TT>floatframe_moveres_bindings</TT></A> are used in this mode and of
 of the exported functions only <A HREF="#fn:WFloatFrame.do_resize"><TT>WFloatFrame.do_resize</TT></A>, 
 <A HREF="#fn:WFloatFrame.do_move"><TT>WFloatFrame.do_move</TT></A>, <A HREF="#fn:WFloatFrame.cancel_resize"><TT>WFloatFrame.cancel_resize</TT></A> and
 <A HREF="#fn:WFloatFrame.end_resize"><TT>WFloatFrame.end_resize</TT></A> are allowed to be called.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5412"></A>
<A NAME="5413"></A>
<A NAME="fn:WFloatFrame.cancel_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.cancel_resize(WFloatFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return from move/resize cancelling changes if opaque
 move/resize has not been enabled.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5414"></A>
<A NAME="5415"></A>
<A NAME="fn:WFloatFrame.do_move"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.do_move(WFloatFrame frame, integer horizmul, integer vertmul)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Move <TT>frame</TT> one step
 (must be in move/resize mode):

<P>
<TABLE CELLPADDING=3 BORDER="1">
<TR><TD ALIGN="RIGHT"><TT>horizmul</TT>/<TT>vertmul</TT></TD>
<TD ALIGN="LEFT">effect</TD>
</TR>
<TR><TD ALIGN="RIGHT">-1</TD>
<TD ALIGN="LEFT">Move left/up</TD>
</TR>
<TR><TD ALIGN="RIGHT">0</TD>
<TD ALIGN="LEFT">No effect</TD>
</TR>
<TR><TD ALIGN="RIGHT">1</TD>
<TD ALIGN="LEFT">Move right/down</TD>
</TR>
</TABLE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5416"></A>
<A NAME="5417"></A>
<A NAME="fn:WFloatFrame.do_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.do_resize(WFloatFrame frame, integer left, integer right, integer top, integer bottom)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Shrink or grow <TT>frame</TT> one step in each direction.
 Acceptable values for the parameters <TT>left</TT>, <TT>right</TT>, <TT>top</TT>
 and <TT>bottom</TT> are as follows: -1: shrink along,
 0: do not change, 1: grow along corresponding border.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5418"></A>
<A NAME="5419"></A>
<A NAME="fn:WFloatFrame.end_resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.end_resize(WFloatFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Return from move/resize mode and apply changes unless opaque
 move/resize is enabled.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5420"></A>
<A NAME="5421"></A>
<A NAME="fn:WFloatFrame.is_sticky"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WFloatFrame.is_sticky(WFloatFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>frame</TT> sticky?
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5422"></A>
<A NAME="5423"></A>
<A NAME="fn:WFloatFrame.p_move"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.p_move(WFloatFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Start moving <TT>frame</TT> with the mouse (or other pointing device).
 this should only be used by binding to the <I>mpress</I> or
 <I>mdrag</I> actions.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5424"></A>
<A NAME="5425"></A>
<A NAME="fn:WFloatFrame.toggle_shade"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.toggle_shade(WFloatFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle shade (only titlebar visible) mode.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5426"></A>
<A NAME="5427"></A>
<A NAME="fn:WFloatFrame.toggle_sticky"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WFloatFrame.toggle_sticky(WFloatFrame frame)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle <TT>frame</TT> stickyness. Only works across frames on 
 WFloatWS that have the same WMPlex parent.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00732000000000000000">
6.3.2 WFloatWS functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="5429"></A>
<A NAME="5430"></A>
<A NAME="fn:WFloatWS.attach"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WFloatWS.attach(WFloatWS ws, WClientWin cwin, table p)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Attach client window <TT>cwin</TT> on <TT>ws</TT>.
 At least the following fields in <TT>p</TT> are supported:

<P>
<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Field</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>switchto</TT></TD>
<TD ALIGN="LEFT">Should the region be switched to (boolean)? Optional.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>geom</TT></TD>
<TD ALIGN="LEFT">Geometry; <TT>x</TT> and <TT>y</TT>, if set, indicates top-left of 
   the frame to be created while <TT>width</TT> and <TT>height</TT>, if set, indicate
   the size of the client window within that frame. Optional.</TD>
</TR>
</TABLE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5431"></A>
<A NAME="5432"></A>
<A NAME="fn:WFloatWS.backcirculate"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WFloatWS.backcirculate(WFloatWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Activate previous object on <TT>ws</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5433"></A>
<A NAME="5434"></A>
<A NAME="fn:WFloatWS.circulate"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WFloatWS.circulate(WFloatWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Activate next object on <TT>ws</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5435"></A>
<A NAME="5436"></A>
<A NAME="fn:WFloatWS.current"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WRegion WFloatWS.current(WFloatWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the object that currently has or previously had focus on <TT>ws</TT>
 (if no other object on the workspace currently has focus).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5437"></A>
<A NAME="5438"></A>
<A NAME="fn:WFloatWS.managed_list"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WFloatWS.managed_list(WFloatWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a list of regions managed by the workspace (frames, mostly).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="5439"></A>
<A NAME="5440"></A>
<A NAME="fn:WFloatWS.relocate_and_close"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WFloatWS.relocate_and_close(WFloatWS ws)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Destroys <TT>ws</TT> unless this would put the WM in a possibly unusable
 state.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00740000000000000000"></A>
<A NAME="sec:queryref"></A>
<BR>
6.4 Functions exported by the query module
</H2>

<P>

  <DL>
<DD><A NAME="6006"></A>
<A NAME="fn:query_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool query_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Describe bindings common to all WInputs (WEdln,
 WMessage).
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6007"></A>
<A NAME="fn:query_fwarn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMessage query_fwarn(WMPlex mplex, string p)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Display an error message box in the multiplexer <TT>mplex</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6008"></A>
<A NAME="fn:query_history_clear"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void query_history_clear()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Clear line editor history.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6009"></A>
<A NAME="fn:query_history_get"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string query_history_get(integer n)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get entry at index <TT>n</TT> in line editor history, 0 being the latest.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6010"></A>
<A NAME="fn:query_history_push"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void query_history_push(string str)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Push an entry into line editor history.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6011"></A>
<A NAME="fn:query_message"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMessage query_message(WMPlex mplex, string p)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Display a message in the <TT>mplex</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6012"></A>
<A NAME="fn:query_query"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WEdln query_query(WMPlex mplex, string prompt, string dflt, function handler, function completor)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Show a query window in <TT>mplex</TT> with prompt <TT>prompt</TT>, initial
 contents <TT>dflt</TT>. The function <TT>handler</TT> is called with
 the entered string as the sole argument when <A HREF="#fn:WEdln.finish"><TT>WEdln.finish</TT></A>
 is called. The function <TT>completor</TT> is called with the created
 WEdln is first argument and the string to complete is the
 second argument when <A HREF="#fn:WEdln.complete"><TT>WEdln.complete</TT></A> is called.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6013"></A>
<A NAME="fn:query_wedln_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool query_wedln_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Add a set of bindings available in the line editor.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00741000000000000000">
6.4.1 WEdln functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="6015"></A>
<A NAME="6016"></A>
<A NAME="fn:WEdln.back"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.back(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Move backward one character.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6017"></A>
<A NAME="6018"></A>
<A NAME="fn:WEdln.backspace"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.backspace(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Delete previous character.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6019"></A>
<A NAME="6020"></A>
<A NAME="fn:WEdln.bkill_word"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.bkill_word(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Starting from the previous characters, delete possible whitespace and
 preceding alphanumeric characters until previous non-alphanumeric character.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6021"></A>
<A NAME="6022"></A>
<A NAME="fn:WEdln.bol"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.bol(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Go to the beginning of line.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6023"></A>
<A NAME="6024"></A>
<A NAME="fn:WEdln.bskip_word"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.bskip_word(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Go to to beginning of current sequence of alphanumeric characters
 followed by whitespace.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6025"></A>
<A NAME="6026"></A>
<A NAME="fn:WEdln.clear_mark"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.clear_mark(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Clear <I>mark</I>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6027"></A>
<A NAME="6028"></A>
<A NAME="fn:WEdln.complete"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.complete(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Call completion handler with the text between the beginning of line and
 current cursor position.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6029"></A>
<A NAME="6030"></A>
<A NAME="fn:WEdln.contents"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string WEdln.contents(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get line editor contents.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6031"></A>
<A NAME="6032"></A>
<A NAME="fn:WEdln.copy"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.copy(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Copy text between <I>mark</I> and current cursor position to clipboard.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6033"></A>
<A NAME="6034"></A>
<A NAME="fn:WEdln.cut"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.cut(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Copy text between <I>mark</I> and current cursor position to clipboard
 and then delete that sequence.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6035"></A>
<A NAME="6036"></A>
<A NAME="fn:WEdln.delete"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.delete(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Delete current character.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6037"></A>
<A NAME="6038"></A>
<A NAME="fn:WEdln.eol"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.eol(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Go to the end of line.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6039"></A>
<A NAME="6040"></A>
<A NAME="fn:WEdln.finish"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.finish(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Close <TT>wedln</TT> and call any handlers.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6041"></A>
<A NAME="6042"></A>
<A NAME="fn:WEdln.forward"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.forward(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Move forward one character.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6043"></A>
<A NAME="6044"></A>
<A NAME="fn:WEdln.history_next"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.history_next(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Replace line editor contents with the entry in history if one exists.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6045"></A>
<A NAME="6046"></A>
<A NAME="fn:WEdln.history_prev"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.history_prev(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Replace line editor contents with the previous in history if one exists.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6047"></A>
<A NAME="6048"></A>
<A NAME="fn:WEdln.insstr"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.insstr(WEdln wedln, string str)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Input <TT>str</TT> in wedln at current editing point.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6049"></A>
<A NAME="6050"></A>
<A NAME="fn:WEdln.kill_line"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.kill_line(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Delete the whole line.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6051"></A>
<A NAME="6052"></A>
<A NAME="fn:WEdln.kill_to_bol"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.kill_to_bol(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Delete all characters from previous to beginning of line.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6053"></A>
<A NAME="6054"></A>
<A NAME="fn:WEdln.kill_to_eol"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.kill_to_eol(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Delete all characters from current to end of line.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6055"></A>
<A NAME="6056"></A>
<A NAME="fn:WEdln.kill_word"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.kill_word(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Starting from the current point, delete possible whitespace and
 following alphanumeric characters until next non-alphanumeric character.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6057"></A>
<A NAME="6058"></A>
<A NAME="fn:WEdln.mark"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>integer WEdln.mark(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get current mark (start of selection) for <TT>wedln</TT>.
 Return value of -1 indicates that there is no mark, and
 0 is the beginning of the line.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6059"></A>
<A NAME="6060"></A>
<A NAME="fn:WEdln.paste"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.paste(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Request selection from application holding such.

<P>
Note that this function is asynchronous; the selection will not
 actually be inserted before Ion receives it. This will be no
 earlier than Ion return to its main loop.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6061"></A>
<A NAME="6062"></A>
<A NAME="fn:WEdln.point"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>integer WEdln.point(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get current editing point.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6063"></A>
<A NAME="6064"></A>
<A NAME="fn:WEdln.set_completions"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.set_completions(WEdln wedln, table completions)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function should be called in completors (such given as
 parameters to <TT>query_query</TT>) to return the set of completions
 found. The numerical indexes of <TT>completions</TT> list the found
 completions. If the entry <TT>common_part</TT> exists, it gives an
 extra common prefix of all found completions.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6065"></A>
<A NAME="6066"></A>
<A NAME="fn:WEdln.set_mark"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.set_mark(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set <I>mark</I> to current cursor position.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6067"></A>
<A NAME="6068"></A>
<A NAME="fn:WEdln.skip_word"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WEdln.skip_word(WEdln wedln)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Go to to end of current sequence of whitespace followed by alphanumeric
 characters..
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00742000000000000000">
6.4.2 WInput functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="6070"></A>
<A NAME="6071"></A>
<A NAME="fn:WInput.cancel"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WInput.cancel(WInput input)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Close input not calling any possible finish handlers.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6072"></A>
<A NAME="6073"></A>
<A NAME="fn:WInput.close"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WInput.close(WInput input)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WInput.cancel"><TT>WInput.cancel</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6074"></A>
<A NAME="6075"></A>
<A NAME="fn:WInput.scrolldown"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WInput.scrolldown(WInput input)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Scroll input <TT>input</TT> text contents down.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6076"></A>
<A NAME="6077"></A>
<A NAME="fn:WInput.scrollup"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WInput.scrollup(WInput input)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Scroll input <TT>input</TT> text contents up.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00750000000000000000"></A>
<A NAME="sec:menuref"></A>
<BR>
6.5 Functions exported by the menu module
</H2>

<P>

  <DL>
<DD><A NAME="6516"></A>
<A NAME="fn:menu_bindings"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool menu_bindings(table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Describe WMenu bindings.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6517"></A>
<A NAME="fn:menu_menu"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMenu menu_menu(WMPlex mplex, function handler, table tab, bool big_mode)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Display a menu inside multiplexer. The <TT>handler</TT> parameter
 is a function that gets the selected menu entry as argument and
 should call it with proper parameters; use <A HREF="#fn:make_menu_fn"><TT>make_menu_fn</TT></A>
 to create functions that pass a proper <TT>handler</TT>. The table
 <TT>tab</TT> is a list of menu entries of the form
 <TT>{name = ???, [ submenu = ??? ]}</TT>. (The table may and usually
 does contain other entries as well, such as the function to call
 when entry is activated, but this is handled by <TT>handler</TT>.)
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6518"></A>
<A NAME="fn:menu_pmenu"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMenu menu_pmenu(WWindow where, function handler, table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Display a pop-up menu inside window <TT>where</TT>. This function
 can only be called from a mouse/pointing device button press handler
 and the menu will be placed below the point where the press occured.
 The <TT>handler</TT> and <TT>tab</TT> parameters are similar to those of
 <A HREF="#fn:menu_menu"><TT>menu_menu</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6519"></A>
<A NAME="fn:menu_set_scroll_params"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void menu_set_scroll_params(integer delay, integer amount)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Set ''pmenu'' off-screen scrolling parameters: the number of pixels 
 to scroll at each timer event, <TT>amount</TT>, and the time between
 those events, <TT>delay</TT> (in milliseconds). The default values are 3
 pixels every 20msec.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00751000000000000000">
6.5.1 WMenu functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="6521"></A>
<A NAME="6522"></A>
<A NAME="fn:WMenu.cancel"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMenu.cancel(WMenu menu)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Close <TT>menu</TT> not calling any possible finish handlers.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6523"></A>
<A NAME="6524"></A>
<A NAME="fn:WMenu.close"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMenu.close(WMenu menu)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Same as <A HREF="#fn:WMenu.cancel"><TT>WMenu.cancel</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6525"></A>
<A NAME="6526"></A>
<A NAME="fn:WMenu.finish"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMenu.finish(WMenu menu)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Destroy the menu and call handler for selected entry.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6527"></A>
<A NAME="6528"></A>
<A NAME="fn:WMenu.select_next"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMenu.select_next(WMenu menu)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Select next entry in menu.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6529"></A>
<A NAME="6530"></A>
<A NAME="fn:WMenu.select_nth"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMenu.select_nth(WMenu menu, integer n)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Select <TT>n</TT>:th entry in menu.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6531"></A>
<A NAME="6532"></A>
<A NAME="fn:WMenu.select_prev"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WMenu.select_prev(WMenu menu)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Select previous entry in menu.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00760000000000000000"></A>
<A NAME="sec:deref"></A>
<BR>
6.6 Functions exported by the de module
</H2>

<P>

  <DL>
<DD><A NAME="6652"></A>
<A NAME="fn:de_do_define_style"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool de_do_define_style(WRootWin rootwin, string name, table tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Define a style for the root window <TT>rootwin</TT>. Use
 <A HREF="#fn:de_define_style"><TT>de_define_style</TT></A> instead to define for all root windows.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6653"></A>
<A NAME="fn:de_reset"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void de_reset()</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Clear all styles from drawing engine memory.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00770000000000000000"></A>
<A NAME="sec:dockref"></A>
<BR>
6.7 Functions exported by the dock module
</H2>

<P>

  <DL>
<DD><A NAME="6788"></A>
<A NAME="fn:create_dock"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WDock create_dock(integer screen, table conftab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Create a dock. <TT>screen</TT> is the screen number on which the dock should
 appear. <TT>conftab</TT> is the initial configuration table passed to
 <A HREF="#fn:WDock.set"><TT>WDock.set</TT></A>.
  
</DD>
</DL>

<P>

<H3><A NAME="SECTION00771000000000000000">
6.7.1 WDock functions</A>
</H3>

<P>

  <DL>
<DD><A NAME="6790"></A>
<A NAME="6791"></A>
<A NAME="fn:WDock.destroy"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WDock.destroy(WDock dock)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Destroys <TT>dock</TT> if it is empty.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6792"></A>
<A NAME="6793"></A>
<A NAME="fn:WDock.get"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>table WDock.get(WDock dock)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Get <TT>dock</TT>'s configuration table. See <A HREF="#fn:WDock.set"><TT>WDock.set</TT></A> for a
 description of the table.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6794"></A>
<A NAME="6795"></A>
<A NAME="fn:WDock.is_mapped"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>bool WDock.is_mapped(WDock dock)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Is <TT>dock</TT> mapped? This is much faster than calling
 <A HREF="#fn:WDock.get"><TT>WDock.get</TT></A><TT>(dock).is_mapped</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6796"></A>
<A NAME="6797"></A>
<A NAME="fn:WDock.map"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WDock.map(WDock dock)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Map (show) <TT>dock</TT>. This is much faster than calling
 <A HREF="#fn:WDock.set"><TT>WDock.set</TT></A><TT>(dock, {is_mapped=true})</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6798"></A>
<A NAME="6799"></A>
<A NAME="fn:WDock.resize"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WDock.resize(WDock dock)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Resizes and refreshes <TT>dock</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6800"></A>
<A NAME="6801"></A>
<A NAME="fn:WDock.set"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WDock.set(WDock dock, table conftab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Configure <TT>dock</TT>. <TT>conftab</TT> is a table of key/value pairs:

<P>
<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Key</TD>
<TD ALIGN="LEFT">Values</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>name</TT></TD>
<TD ALIGN="LEFT">string</TD>
<TD ALIGN="LEFT">Name of dock</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>hpos</TT></TD>
<TD ALIGN="LEFT">left/center/right</TD>
<TD ALIGN="LEFT">Horizontal position</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>vpos</TT></TD>
<TD ALIGN="LEFT">top/middle/bottom</TD>
<TD ALIGN="LEFT">Vertical position</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>grow</TT></TD>
<TD ALIGN="LEFT">up/down/left/right</TD>
<TD ALIGN="LEFT">Growth direction where new dockapps are added)</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>is_auto</TT></TD>
<TD ALIGN="LEFT">bool</TD>
<TD ALIGN="LEFT">Should <TT>dock</TT> automatically manage new dockapps?</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>is_mapped</TT></TD>
<TD ALIGN="LEFT">bool</TD>
<TD ALIGN="LEFT">Is <TT>dock</TT> mapped?</TD>
</TR>
</TABLE>

<P>
Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6802"></A>
<A NAME="6803"></A>
<A NAME="fn:WDock.toggle"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WDock.toggle(WDock dock)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Toggle <TT>dock</TT>'s mapped (shown/hidden) state.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="6804"></A>
<A NAME="6805"></A>
<A NAME="fn:WDock.unmap"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>void WDock.unmap(WDock dock)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Unmap (hide) <TT>dock</TT>. This is much faster than calling
 <A HREF="#fn:WDock.set"><TT>WDock.set</TT></A><TT>(dock, {is_mapped=false})</TT>.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00780000000000000000"></A>
<A NAME="sec:ioncorelibref"></A>
<BR>
6.8 Functions defined in <I>ioncorelib</I>
</H2>

<P>

  <DL>
<DD><A NAME="7197"></A>
<A NAME="fn:WMPlex.close_sub_or_self"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>WMPlex.close_sub_or_self</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Close a WMPlex or some child of it using <A HREF="#fn:WRegion.close"><TT>WRegion.close</TT></A> as 
 chosen by <A HREF="#fn:make_mplex_sub_or_self"><TT>make_mplex_sub_or_self</TT></A>, but also, when the chosen object
 is a WClientWin, propagate the close call to transients managed
 by the WClientWin.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7198"></A>
<A NAME="fn:WMPlex.current_index"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMPlex.current_index(mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the index of <A HREF="#fn:WMPlex.current"><TT>WMPlex.current</TT></A> in a <TT>mplex</TT>'s
 managed list or -1 if there is no current managed object.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7199"></A>
<A NAME="fn:WMPlex.managed_index"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMPlex.managed_index(mplex, mgd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns the index of <TT>mgd</TT> in <TT>mplex</TT>'s managed list or
 -1 if not on list.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7200"></A>
<A NAME="fn:WMPlex.move_current_to_next_index"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMPlex.move_current_to_next_index(mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Move currently viewed object left within mplex; same as
 <TT>mplex:move_left(mplex:current())</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7201"></A>
<A NAME="fn:WMPlex.move_current_to_prev_index"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>WMPlex.move_current_to_prev_index(mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Move currently viewed object right within mplex; same as
 <TT>mplex:move_left(mplex:current())</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7202"></A>
<A NAME="fn:add_to_hook"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>add_to_hook(hookname, fn)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Register <TT>fn</TT> as a handler for hook <TT>hookname</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7203"></A>
<A NAME="fn:call_hook"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>call_hook(hookname, ...)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Call hook <TT>hookname</TT> with the remaining arguments to this function
 as parameters.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7204"></A>
<A NAME="fn:complete_workspace"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>complete_workspace(nam)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Equivalent to <A HREF="#fn:complete_region"><TT>complete_region</TT></A><TT>(nam, "WGenWS")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7205"></A>
<A NAME="fn:exec_in"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>exec_in(where, cmd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Equivalent to 
 <A HREF="#fn:exec_on_rootwin"><TT>exec_on_rootwin</TT></A><TT>(</TT><A HREF="#fn:WRegion.rootwin_of"><TT>WRegion.rootwin_of</TT></A><TT>(where), cmd)</TT>. 
 This function should be overridden by scripts and other kludges that
 want to attempt to put new windows where they belong.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7206"></A>
<A NAME="fn:get_winprop"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>get_winprop(cwin)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Find winprop table for <TT>cwin</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7207"></A>
<A NAME="fn:kpress"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>kpress(keyspec, func)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Creates a binding description table for the action of pressing a key given 
 by <TT>keyspec</TT> (with possible modifiers) to the function <TT>func</TT>.
 For more information on bindings, see section <A HREF="node4.html#sec:bindings">3.3</A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7208"></A>
<A NAME="fn:kpress_waitrel"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>kpress_waitrel(keyspec, func)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This is similar to <A HREF="#fn:kpress"><TT>kpress</TT></A> but after calling <TT>func</TT>, 
 Ioncore waits for all modifiers to be released before processing
 any further actions.
 For more information on bindings, see section <A HREF="node4.html#sec:bindings">3.3</A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7209"></A>
<A NAME="fn:lookup_workspace"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>lookup_workspace(nam)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Equivalent to <A HREF="#fn:lookup_region"><TT>lookup_region</TT></A><TT>(nam, "WGenWS")</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7210"></A>
<A NAME="fn:make_exec_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>make_exec_fn(cmd)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function will generate another function that, depending on its
 parameter, will call either <A HREF="#fn:exec_in"><TT>exec_in</TT></A> or 
 <A HREF="#fn:exec_on_rootwin"><TT>exec_on_rootwin</TT></A> to execute <TT>cmd</TT>. You should use this
 function to bind execution commands to keys.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7211"></A>
<A NAME="fn:make_mplex_clientwin_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>make_mplex_clientwin_fn(fn)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Create a WMPlex-bindable function with arguments
 (<TT>mplex [, sub]</TT>) that chooses parameter for <TT>fn</TT>
 as <TT>sub</TT> if it is not nil and otherwise <TT>mplex:current()</TT>,
 and calls <TT>fn</TT> if the object chosen is of type <A HREF="#fn:WClientWin"><TT>WClientWin</TT></A>.

<P>
Calling this function is equivalent to
 <A HREF="#fn:make_mplex_sub_or_self_fn"><TT>make_mplex_sub_or_self_fn</TT></A><TT>(fn, true, true, true)</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7212"></A>
<A NAME="fn:make_mplex_sub_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>make_mplex_sub_fn(fn)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Create a WMPlex-bindable function with arguments
 (<TT>mplex [, sub]</TT>) that calls <TT>fn</TT> with parameter chosen
 as <TT>sub</TT> if it is not nil and otherwise <TT>mplex:current()</TT>.

<P>
Calling this function is equivalent to
 <A HREF="#fn:make_mplex_sub_or_self_fn"><TT>make_mplex_sub_or_self_fn</TT></A><TT>(fn, true, true, false)</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7213"></A>
<A NAME="fn:make_mplex_sub_or_self_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>make_mplex_sub_or_self_fn(fn, noself, noinput, cwincheck)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Create a WMPlex-bindable function with arguments
 (<TT>mplex [, sub]</TT>) that calls <TT>fn</TT> with parameter chosen
 as the first match from the following steps:
 
<OL>
<LI><TT>sub</TT> if it is not nil.
</LI>
<LI>The current input in <TT>mplex</TT> (see <A HREF="#fn:WMPlex.current_input"><TT>WMPlex.current_input</TT></A>)
   if one exists and <TT>noinput</TT> is not set.
</LI>
<LI>The currently displayed object in <TT>mplex</TT> 
   (see <A HREF="#fn:WMPlex.current"><TT>WMPlex.current</TT></A>), if not nil.
</LI>
<LI><TT>mplex</TT> itself, if <TT>noself</TT> is not set.
 
</LI>
</OL>
 Additionally, if <TT>cwincheck</TT> is set, the function is only
 called if the object selected above is of type <TT>WClientWin</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7214"></A>
<A NAME="fn:mclick"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>mclick(buttonspec, func, area)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Creates a binding description table for the action of clicking a mouse 
 button while possible modifier keys are pressed,
 both given by <TT>buttonspec</TT>, to the function <TT>func</TT>.
 The optional argument <TT>area</TT> (a string or nil) depends on the
 context.
 For more information, see section <A HREF="node4.html#sec:bindings">3.3</A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7215"></A>
<A NAME="fn:mdblclick"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>mdblclick(buttonspec, func, area)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Similar to <A HREF="#fn:mclick"><TT>mclick</TT></A> but for double-click.
 Also see section <A HREF="node4.html#sec:bindings">3.3</A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7216"></A>
<A NAME="fn:mdrag"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>mdrag(buttonspec, func, area)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Creates a binding description table for the action of moving the mouse
 (or other pointing device) while the button given by <TT>buttonspec</TT>
 is held pressed and the modifiers given by <TT>buttonspec</TT> were pressed
 when the button was initially pressed.
 Also see section <A HREF="node4.html#sec:bindings">3.3</A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7217"></A>
<A NAME="fn:mpress"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>mpress(buttonspec, func, area)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Similar to <A HREF="#fn:mclick"><TT>mclick</TT></A> but for just pressing the mouse button.
 Also see section <A HREF="node4.html#sec:bindings">3.3</A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7218"></A>
<A NAME="fn:obj_exists"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>obj_exists(obj)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Check that the WObj <TT>obj</TT> still exists in the C side of Ion.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7219"></A>
<A NAME="fn:remove_from_hook"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>remove_from_hook(hookname, fn)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Unregister <TT>fn</TT> as a handler for hook <TT>hookname</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7220"></A>
<A NAME="fn:string.shell_safe"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>string.shell_safe(str)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Make <TT>str</TT> shell-safe.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7221"></A>
<A NAME="fn:submap"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>submap(kcb_, list)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a function that creates a submap binding description table.
 When the key press action <TT>keyspec</TT> occurs, Ioncore will wait for
 a further key presse and act according to the submap.
 For details, see section <A HREF="node4.html#sec:bindings">3.3</A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7222"></A>
<A NAME="fn:winprop"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>winprop(list)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Define a winprop. For more information, see section <A HREF="node4.html#sec:winprops">3.4</A>.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION00790000000000000000"></A>
<A NAME="sec:querylibref"></A>
<BR>
6.9 Functions defined in <I>querylib</I>
</H2>

<P>

  <DL>
<DD><A NAME="7728"></A>
<A NAME="fn:querylib.make_completor"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.make_completor(completefn)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Generate a ''completor'' passable to many of the <TT>querylib.make_*_fn</TT>
 functions from a simple function <TT>completefn</TT> that completes an input 
 string to a table of completion strings.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7729"></A>
<A NAME="fn:querylib.make_execfile_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.make_execfile_fn(prompt, prog)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Generate a function that can be directly passed in mplex/frame/screen 
 binding definitions to display a query to start a program with a 
 tab-completed file as parameter. The previously inputted file's directory is 
 used as the initial input. The parameters to this function are
 <TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Parameter</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>prompt</TT></TD>
<TD ALIGN="LEFT">The prompt</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>prog</TT></TD>
<TD ALIGN="LEFT">Program name or a function that returns it when called.</TD>
</TR>
</TABLE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7730"></A>
<A NAME="fn:querylib.make_execwith_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.make_execwith_fn(prompt, dflt, prog, completor)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Generate a function that can be directly passed in mplex/frame/screen 
 binding definitions to display a query to start a program with a 
 tab-completed parameter. The parameters to this function are
 <TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Parameter</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>prompt</TT></TD>
<TD ALIGN="LEFT">The prompt</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>dflt</TT></TD>
<TD ALIGN="LEFT">Default value to call <TT>prog</TT> with</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>prog</TT></TD>
<TD ALIGN="LEFT">Program name or a function that returns it when called.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>completor</TT></TD>
<TD ALIGN="LEFT">A completor function.</TD>
</TR>
</TABLE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7731"></A>
<A NAME="fn:querylib.make_frame_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.make_frame_fn(prompt, initfn, handler, completor)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Generate a function that can be directly passed in mplex/frame/screen 
 binding definitions to display a query to call a function with 
 tab-completed parameter. The parameters to this function are
 <TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Parameter</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>prompt</TT></TD>
<TD ALIGN="LEFT">The prompt.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>initfn</TT></TD>
<TD ALIGN="LEFT">A function that returns initial input when called.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>handler</TT></TD>
<TD ALIGN="LEFT">The function to be called with the mplex/frame/screen and
                 user input as parameters when the query is finished.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>completor</TT></TD>
<TD ALIGN="LEFT">A completor function.</TD>
</TR>
</TABLE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7732"></A>
<A NAME="fn:querylib.make_simple_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.make_simple_fn(prompt, initfn, handler, completor)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Generate a function that can be directly passed in mplex/frame/screen 
 binding definitions to display a query to call a function with 
 tab-completed parameter. The parameters to this function are
 <TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
<TR><TD ALIGN="LEFT">Parameter</TD>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>prompt</TT></TD>
<TD ALIGN="LEFT">The prompt.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>initfn</TT></TD>
<TD ALIGN="LEFT">A function that returns initial input when called.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>handler</TT></TD>
<TD ALIGN="LEFT">The function to be called with the user input as parameter 
            when the query is finished.</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>completor</TT></TD>
<TD ALIGN="LEFT">A completor function.</TD>
</TR>
</TABLE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7733"></A>
<A NAME="fn:querylib.make_yesno_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.make_yesno_fn(prompt, handler)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Generate a function that can be directly passed in mplex/frame/screen 
 binding definitions to display a query to conditionally depending 
 on user's input call another function <TT>handler</TT> that will get the
 mplex/frame/screen where the query was displayed as argument.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7734"></A>
<A NAME="fn:querylib.query_attachclient"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_attachclient</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks for the name of a client window and switches
 focus to the one entered. It uses the completion function
 <A HREF="#fn:complete_clientwin"><TT>complete_clientwin</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7735"></A>
<A NAME="fn:querylib.query_editfile"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_editfile</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Asks for a file to be edited. It uses the script <I>ion-edit</I> to
 start a program to edit the file. This script uses <I>run-mailcap</I>
 by default, but if you don't have it, you may customise the script.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7736"></A>
<A NAME="fn:querylib.query_exec"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_exec</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function asks for a command to execute with <I>/bin/sh</I>.
 If the command is prefixed with a colon (':'), the command will
 be run in an XTerm (or other terminal emulator) using the script
 <I>ion-runinxterm</I>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7737"></A>
<A NAME="fn:querylib.query_exit"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_exit</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks whether the user wants to have Ioncore exit.
 If the answer is 'y', 'Y' or 'yes', so will happen.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7738"></A>
<A NAME="fn:querylib.query_gotoclient"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_gotoclient</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks for the name of a client window and attaches
 it to the frame the query was opened in. It uses the completion
 function <A HREF="#fn:complete_clientwin"><TT>complete_clientwin</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7739"></A>
<A NAME="fn:querylib.query_lua"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.query_lua(mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks for Lua code to execute. It sets the variable '<TT>_</TT>'
 in the local environment of the string to point to the mplex where the
 query was created. It also sets the table <TT>arg</TT> in the local
 environment to <TT>{_, _:current()}</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7740"></A>
<A NAME="fn:querylib.query_man"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_man</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks for a manual page to display. It uses the command
 <I>ion-man</I> to run <I>man</I> in a terminal emulator. By customizing
 this script it is possible use some other man page viewer. To enable
 tab-completion you must list paths with manuals in the table
 <TT>query_man_path</TT>. For example,
<PRE>
query_man_path = {
    "/usr/local/man","/usr/man",
    "/usr/share/man", "/usr/X11R6/man",
}
</PRE>
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7741"></A>
<A NAME="fn:querylib.query_renameframe"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_renameframe</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function asks for a name new for the frame where the query
 was created.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7742"></A>
<A NAME="fn:querylib.query_renameworkspace"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_renameworkspace</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function asks for a name new for the workspace on which the
 query resides.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7743"></A>
<A NAME="fn:querylib.query_restart"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_restart</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks whether the user wants restart Ioncore.
 If the answer is 'y', 'Y' or 'yes', so will happen.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7744"></A>
<A NAME="fn:querylib.query_runfile"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_runfile</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Asks for a file to be viewed. It uses the script <I>ion-view</I> to
 start a program to view the file. This script uses <I>run-mailcap</I>
 by default, but if you don't have it, you may customise the script.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7745"></A>
<A NAME="fn:querylib.query_ssh"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.query_ssh(mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks for a host to connect to with SSH. It starts
 up ssh in a terminal using <I>ion-ssh</I>. Hosts to tab-complete
 are read from <I>~/.ssh/known_hosts</I>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7747"></A>
<A NAME="fn:querylib.query_workspace"></A>  
</DD>
<DT><STRONG>Function:</STRONG></DT>
<DD><TT>querylib.query_workspace</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This query asks for the name of a workspace. If a workspace
 (an object inheriting WGenWS) with such a name exists,
 it will be switched to. Otherwise a new workspace with the
 entered name will be created and the user will be queried for
 the type of the workspace.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7748"></A>
<A NAME="fn:querylib.show_aboutmsg"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>querylib.show_aboutmsg(mplex)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Display an "About Ion" message in <TT>mplex</TT>.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION007100000000000000000"></A>
<A NAME="sec:delibref"></A>
<BR>
6.10 Functions defined in <I>delib</I>
</H2>

<P>

  <DL>
<DD><A NAME="7951"></A>
<A NAME="fn:de_define_style"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>de_define_style(name, list)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Define a new style for the default drawing engine (that must've
 been loaded with <A HREF="#fn:gr_select_engine"><TT>gr_select_engine</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="7952"></A>
<A NAME="fn:de_substyle"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>de_substyle(pattern, list)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Define a substyle for the default drawing engine. This function
 is to be used in constructing style definitions for 
 <A HREF="#fn:de_define_style"><TT>de_define_style</TT></A>.
  
</DD>
</DL>

<P>

<H2><A NAME="SECTION007110000000000000000"></A>
<A NAME="sec:menulibref"></A>
<BR>
6.11 Functions defined in <I>menulib</I>
</H2>

<P>

  <DL>
<DD><A NAME="8037"></A>
<A NAME="fn:defmenu"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>defmenu(name, tab)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Define a new menu with <TT>name</TT> being the menu's name and <TT>tab</TT> 
 being a table of menu entries.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="8038"></A>
<A NAME="fn:getmenu"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>getmenu(menu_or_name)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>If <TT>menu_or_name</TT> is a string, returns a menu defined
 with <A HREF="#fn:defmenu"><TT>defmenu</TT></A>, else return <TT>menu_or_name</TT>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="8039"></A>
<A NAME="fn:make_bigmenu_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>make_bigmenu_fn(menuname)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function is similar to <A HREF="#fn:make_menu_fn"><TT>make_menu_fn</TT></A> but uses a possibly
 bigger style for the menu.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="8040"></A>
<A NAME="fn:make_menu_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>make_menu_fn(menu_or_name, big)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function can be used to create a wrapper to create an
 embedded-in-an-mplex menu and to call the handler for a menu
 entry once selected. 

<P>
See also: <A HREF="#fn:menu_menu"><TT>menu_menu</TT></A>, <A HREF="#fn:make_bigmenu_fn"><TT>make_bigmenu_fn</TT></A> and 
 <A HREF="#fn:make_pmenu_fn"><TT>make_pmenu_fn</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="8041"></A>
<A NAME="fn:make_pmenu_fn"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>make_pmenu_fn(menu_or_name)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>This function can be used to create a wrapper display a drop-down menu
 and to call the handler for a menu entry once selected. The resulting
 function should only be called from a mouse press binding.

<P>
See also: <A HREF="#fn:menu_pmenu"><TT>menu_pmenu</TT></A>, <A HREF="#fn:make_menu_fn"><TT>make_menu_fn</TT></A>.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="8042"></A>
<A NAME="fn:menuentry"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>menuentry(name, fn)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Use this function to define normal menu entries.
  
</DD>
</DL>

<P>

  <DL>
<DD><A NAME="8043"></A>
<A NAME="fn:submenu"></A>  
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<DD><TT>submenu(name, sub_or_name)</TT>

</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Use this function to define menu entries for submenus.
  
</DD>
</DL>

<P>

<P>
<HR>
<!--Navigation Panel-->
<A NAME="tex2html350"
  HREF="node8.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A> 
<A NAME="tex2html344"
  HREF="ionconf.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A> 
<A NAME="tex2html338"
  HREF="node6.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A> 
<A NAME="tex2html346"
  HREF="node1.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A> 
<A NAME="tex2html348"
  HREF="node10.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A> 
<BR>
<B> Next:</B> <A NAME="tex2html351"
  HREF="node8.html">A. The GNU General</A>
<B> Up:</B> <A NAME="tex2html345"
  HREF="ionconf.html">Ion: Configuring and extending</A>
<B> Previous:</B> <A NAME="tex2html339"
  HREF="node6.html">5. Scripting</A>
 &nbsp; <B>  <A NAME="tex2html347"
  HREF="node1.html">Contents</A></B> 
 &nbsp; <B>  <A NAME="tex2html349"
  HREF="node10.html">Index</A></B> 
<!--End of Navigation Panel-->

</BODY>
</HTML>