From: Ben Hutchings Date: Sat, 24 Mar 2007 18:52:31 +0000 (+0000) Subject: [svn-inject] Installing original source of ion3 X-Git-Tag: ion3-20061223 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3-doc.git;a=commitdiff_plain;h=6e84dc8312f2fdb5b8b7467a0279afd5b2df107f [svn-inject] Installing original source of ion3 --- 6e84dc8312f2fdb5b8b7467a0279afd5b2df107f diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..5e3a3d1 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,667 @@ +2006-12-23 15:00 UTC Tuomo Valkonen + tagged ion-doc-3ds-20061223 + +2006-10-30 21:08 UTC Tuomo Valkonen + * Updates + +2006-10-28 23:16 UTC Tuomo Valkonen + tagged ion-doc-3ds-20061029 + +2006-10-17 22:02 UTC Tuomo Valkonen + * Mention the 'float' winprop + +2006-10-15 17:53 UTC Tuomo Valkonen + tagged ion-doc-3ds-20061015 + +2006-10-15 14:36 UTC Tuomo Valkonen + * Documentation updates. + +2006-08-03 09:05 UTC Tuomo Valkonen + * much->match + +2006-06-20 18:16 UTC Tuomo Valkonen + tagged ion-doc-3ds-20060620 + +2006-06-08 17:58 UTC Tuomo Valkonen + * Moving usepackage{dvipdfm} before everything else seems to fix things. + +2006-02-12 15:19 UTC Tuomo Valkonen + * Added documentation for region_activity_hook. + +2006-01-25 23:23 UTC Tuomo Valkonen + * Updated bar_inside_border stuf. + +2006-01-07 21:03 UTC Tuomo Valkonen + tagged ion-doc-3ds-20060107 + +2005-12-10 20:46 UTC Tuomo Valkonen + tagged ion-doc-3ds-20051210 + +2005-12-10 00:39 UTC Tuomo Valkonen + * Added missing min_size winprop and changes in winprop listing. + +2005-11-10 20:22 UTC Tuomo Valkonen + * Updated frame style documentation. + +2005-10-23 22:40 UTC Tuomo Valkonen + tagged ion-doc-3ds-20051023 + +2005-08-26 17:37 UTC Tuomo Valkonen + * List oneshot winprop. + +2005-08-20 11:37 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050820 + +2005-07-28 17:40 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050728 + +2005-06-25 15:16 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050625 + +2005-06-07 13:14 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050607 + +2005-06-07 13:13 UTC Tuomo Valkonen + * predist.sh updates. + +2005-06-01 17:07 UTC Tuomo Valkonen + * Added a note on NoModifier. + +2005-05-02 14:56 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050502 + +2005-03-25 17:41 UTC Tuomo Valkonen + * Added documentation on ion-statusd monitors. + +2005-03-25 17:41 UTC Tuomo Valkonen + * Fixed a typo, etc. + +2005-03-22 14:34 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050322 + +2005-03-21 00:16 UTC Tuomo Valkonen + * Fixed typos. + +2005-03-19 13:55 UTC Tuomo Valkonen + * Added documentation on ioncore_sigchld_hook. + +2005-03-13 12:34 UTC Tuomo Valkonen + * Fixed typos etc. + +2005-03-13 12:27 UTC Tuomo Valkonen + * fnrefx macro was still wrong. + +2005-03-09 23:12 UTC Tuomo Valkonen + * Moved new layer documentation to scripting chapter. + +2005-03-09 22:23 UTC Matthieu.Moy@imag.fr + * More doc on layer 2 and placement hooks + + Be warned that: + + * I missed some LaTeX package, and therefore couldn't compile my + changes, + + * I don't know ion's internal well enough to be sure of what I write. + + +2005-03-07 09:35 UTC Tuomo Valkonen + * Fixed copy-paste error. + +2005-03-04 08:39 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050304 + +2005-03-03 18:42 UTC Tuomo Valkonen + * Added a note on hooks being called in protected mode. + +2005-03-03 18:39 UTC Tuomo Valkonen + * Updated ionws_placement_alt documentation. + +2005-02-27 13:19 UTC Tuomo Valkonen + tagged ion-doc-3ds-20050227 + +2005-02-22 22:54 UTC Tuomo Valkonen + tagged ion-doc-3-svn2darcs + +2005-01-16 11:52 UTC tuomov + tagged ion-doc-3ds-20050116 + +2005-01-16 11:29 UTC tuomov + * trunk: changeset 1931 + fixed predist.sh + +2005-01-16 11:08 UTC tuomov + * trunk: changeset 1930 + Fixed undefined references. + +2005-01-15 21:33 UTC tuomov + * trunk: changeset 1928 + Updated some scripting docs. + +2005-01-15 21:20 UTC tuomov + * trunk: changeset 1926 + tabularx header changes. + +2005-01-15 21:03 UTC tuomov + * trunk: changeset 1924 + Tuning for latex2html etc. + +2005-01-15 17:29 UTC tuomov + * trunk: changeset 1923 + Added hook reference and updated hook documentation. + +2005-01-15 17:29 UTC tuomov + * trunk: changeset 1922 + Improved function reference macros to use lists instead of tables. + +2005-01-14 14:47 UTC tuomov + * trunk: changeset 1920 + Some minor fixes. + +2005-01-14 14:25 UTC tuomov + * trunk: changeset 1918 + - Improved menu documentation. + + - Other minor improvements. + +2005-01-13 16:49 UTC tuomov + * trunk: changeset 1917 + Updated graphical styles documentation. + +2005-01-13 14:40 UTC tuomov + * trunk: changeset 1915 + Updated winprop documentation. + +2005-01-13 14:27 UTC tuomov + * trunk: changeset 1914 + Updated binding and menu definition documentation. + +2005-01-11 20:18 UTC tuomov + * trunk: changeset 1913 + Brought config file intro up-to-date + +2005-01-11 15:31 UTC tuomov + * trunk: changeset 1912 + Updated class hierarchy documentation etc. + +2004-10-11 14:16 UTC tuomov + * trunk: changeset 1821 + Just testing some settings... + +2004-10-09 06:16 UTC tuomov + * trunk: changeset 1804 + libextl related changes. + +2004-10-09 05:56 UTC tuomov + * trunk: changeset 1801 + Added predist.sh + +2004-10-09 05:56 UTC tuomov + * trunk: changeset 1800 + Fixed a typo. + +2004-09-16 22:04 UTC tuomov + * trunk: changeset 1754 + Source file path updates. + +2004-07-31 22:25 UTC tuomov + * trunk: changeset 1697 + Updated Makefile to point to the new location of mkexports.lua. + +2004-07-26 21:57 UTC tuomov + * trunk: changeset 1646 + Function reference generation updates. + +2004-05-14 12:29 UTC tuomov + * trunk: changeset 1485 + Fixed punctuation. + +2004-03-15 16:32 UTC tuomov + * trunk: changeset 1402 + Changed makefile to account for changes in Ion module directories. + +2004-03-15 16:23 UTC tuomov + * trunk: changeset 1400 + Added install target to Makefile. + +2004-03-15 08:35 UTC tuomov + * trunk: changeset 1398 + Brought document generation up-to-date with module name changes. + +2004-03-10 21:57 UTC tuomov + * trunk: changeset 1383 + Merged omission and other fixes from stable branch. + +2004-03-05 23:49 UTC tuomov + * trunk: changeset 1346 + Some more minor documentation fixes. Just to test this new svn setup. + +2004-03-05 23:00 UTC tuomov + * trunk: changeset 1345 + Minor documentation fixes. + +2004-02-16 20:33 UTC tuomov + * trunk: changeset 1323 + Build process changed for Ion3. + +2004-02-07 01:55 UTC tuomov + * trunk: changeset 1255 + Added documentation on alternative get_winprop implementations. + +2004-02-07 01:42 UTC tuomov + * trunk: changeset 1254 + Removed unobfuscated email addresses. + +2004-01-28 22:04 UTC tuomov + * trunk: changeset 1239 + Removed extra word, added function reference. + +2004-01-27 22:30 UTC tuomov + * trunk: changeset 1235 + Added 'are' in 'that they are transient for' + +2004-01-27 22:26 UTC tuomov + * trunk: changeset 1234 + Improved xprop/transient help and winprop examples. + +2004-01-27 13:54 UTC tuomov + * trunk: changeset 1231 + Minor spelling mistake fix. + +2004-01-25 18:42 UTC tuomov + * trunk: changeset 1225 + Some minor clarifications in a few sentences and put URL:s on their + own lines. + +2004-01-25 18:05 UTC tuomov + * trunk: changeset 1222 + Typo and spelling fixes. + +2004-01-23 17:32 UTC tuomov + * trunk: changeset 1215 + Fixed a few typos and added an example. + +2004-01-22 21:25 UTC tuomov + * trunk: changeset 1213 + Added dock documentation. + +2004-01-14 22:29 UTC tuomov + * trunk: changeset 1193 + Minor cleanup. + +2004-01-08 22:32 UTC tuomov + * trunk: changeset 1183 + Updated winprop documentation. + +2003-12-22 23:58 UTC tuomov + * trunk: changeset 162 + Added discussion on modules and improved the main introduction and + object hierarchy introduction. + +2003-12-21 00:17 UTC tuomov + * trunk: changeset 161 + Removed duplicate label. + +2003-12-20 19:49 UTC tuomov + * trunk: changeset 160 + Added a list of functions. + +2003-12-20 15:18 UTC tuomov + * trunk: changeset 159 + Fixed a typo. + +2003-12-20 15:15 UTC tuomov + * trunk: changeset 158 + Oops. + +2003-12-20 15:14 UTC tuomov + * trunk: changeset 157 + Added a section on object references. + +2003-12-19 22:08 UTC tuomov + * trunk: changeset 156 + Mention stylemenu. + +2003-12-18 21:37 UTC tuomov + * trunk: changeset 155 + Added a section on special menus. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20031211 + +2003-12-11 17:29 UTC tuomov + * trunk: changeset 154 + Updates for 20031211 release. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20031119 + +2003-11-19 21:57 UTC tuomov + * trunk: changeset 153 + Removed 'executive' from summary. + +2003-11-19 21:57 UTC tuomov + * trunk: changeset 152 + Removed mplexfns reference. + +2003-11-17 00:42 UTC tuomov + * trunk: changeset 151 + Added an "executive summary" to the object hierarchy chapter. + +2003-11-14 18:15 UTC tuomov + * trunk: changeset 150 + Documented menus. Changes to reflect changes in configuration files. + +2003-10-30 10:04 UTC tuomov + * trunk: changeset 149 + Get documentation from luaextl/*.c as well. + +2003-10-29 12:05 UTC tuomov + * trunk: changeset 148 + LICENSE file changed to GPL. + +2003-10-29 11:55 UTC tuomov + * trunk: changeset 147 + Removed fdl.tex. + +2003-10-29 11:55 UTC tuomov + * trunk: changeset 146 + Changed license to GPL due to problems with the GFDL. + +2003-10-29 11:54 UTC tuomov + * trunk: changeset 145 + Changed \chapter->\xchapter, \section*->\xsectionstar + +2003-10-29 11:22 UTC tuomov + * trunk: changeset 144 + Added gpl.tex; GNU General Public License. + +2003-10-29 11:20 UTC tuomov + * trunk: changeset 143 + Added menu reference and updated drawing engine documentation to + reflect the change in style names. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20030811 + +2003-08-10 23:45 UTC tuomov + * trunk: changeset 142 + Fixed a few more typos and such. + +2003-08-10 23:37 UTC tuomov + * trunk: changeset 141 + Fixed a typo. + +2003-08-10 23:37 UTC tuomov + * trunk: changeset 140 + The files draw-DISPLAY.SCREEN.lua were still being referenced to. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20030810 + +2003-08-09 12:48 UTC tuomov + * trunk: changeset 139 + Added a quote. + +2003-08-09 12:45 UTC tuomov + * trunk: changeset 138 + Added a few spaces. + +2003-08-09 12:45 UTC tuomov + * trunk: changeset 137 + Added a walk-through of ioncore.lua. + +2003-08-08 21:56 UTC tuomov + * trunk: changeset 136 + Added an introduction and some design decision rationale. + +2003-08-07 21:45 UTC tuomov + * trunk: changeset 135 + Added information on winprop name field and improved winprop lookup + order explanation. + +2003-08-06 15:08 UTC tuomov + * trunk: changeset 134 + look-cleanviolet.lua was changed and so the example. + +2003-08-06 15:06 UTC tuomov + * trunk: changeset 133 + The 'urgent' attributes was renamed 'activity'. + +2003-08-01 05:54 UTC tuomov + * trunk: changeset 132 + Added mention of ignore_cfgrq. + +2003-07-31 21:24 UTC tuomov + * trunk: changeset 131 + Started a new chapter on assorted tricks. + +2003-07-31 15:21 UTC tuomov + * trunk: changeset 130 + A few fixes. + +2003-07-31 15:17 UTC tuomov + * trunk: changeset 129 + Improved drawing engine and style documentation. + +2003-07-30 22:47 UTC tuomov + * trunk: changeset 128 + Added a \docode kludge to have latex2html interpret figure + environments instead of generating images. + +2003-07-30 22:27 UTC tuomov + * trunk: changeset 127 + Started documenting drawing engines. + +2003-07-25 20:48 UTC tuomov + * trunk: changeset 126 + Moved WRootWin under WWindow in class hierarchy. + +2003-07-24 19:35 UTC tuomov + * trunk: changeset 125 + Some bindings setup documentation improvements. + +2003-07-13 22:16 UTC tuomov + * trunk: changeset 124 + Changes to accommodate for more OO bindings. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20030710 + +2003-07-10 17:18 UTC tuomov + * trunk: changeset 123 + Class explanations improved. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20030628 + +2003-06-27 22:58 UTC tuomov + * trunk: changeset 122 + Typos etc. + +2003-06-27 20:56 UTC tuomov + * trunk: changeset 121 + Fixed QueryLib introduction. + +2003-06-17 21:02 UTC tuomov + * trunk: changeset 120 + Removed mention of region_close and make_current_or_self_fn as this + binding does not work. + +2003-06-17 10:25 UTC tuomov + * trunk: changeset 119 + Added notes on C coding style. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20030614 + +2003-06-14 19:06 UTC tuomov + * trunk: changeset 118 + Fixed "or"->"are". + +2003-06-14 18:01 UTC tuomov + * trunk: changeset 117 + \date{} setting moved to distribution building script. + +2003-06-14 17:54 UTC tuomov + * trunk: changeset 116 + Minor bug was fixed. + +2003-06-14 17:53 UTC tuomov + * trunk: changeset 115 + Some clarifications were made in a few explanations and a note on + anonymous functions was added. + +2003-06-14 17:53 UTC tuomov + * trunk: changeset 114 + Redefined the itemize environment to look better. + +2003-06-14 15:10 UTC tuomov + * trunk: changeset 113 + Updated the documentation to use the new binding setting functions. + +2003-06-08 17:58 UTC tuomov + * trunk: changeset 112 + Added FDL as a plaintext file LICENSE. + +2003-06-08 17:56 UTC tuomov + * trunk: changeset 111 + Documentation updated to mention WMPlexes. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20030531 + +2003-05-31 15:39 UTC tuomov + * trunk: changeset 110 + Dates updated. + +2003-05-30 21:32 UTC tuomov + * trunk: changeset 109 + Updated the parts that refer to the files that were moved to SHAREDIR. + +2003-05-29 13:11 UTC tuomov + * trunk: changeset 108 + Added a note on char* and const char *. + +2003-05-29 12:51 UTC tuomov + * trunk: changeset 107 + Added one more note on deferred destroy. + +2003-05-29 12:47 UTC tuomov + * trunk: changeset 106 + Added a note on deferred destroy. + +2003-05-17 13:33 UTC tuomov + * trunk: changeset 105 + Updated the documentation to switch to using WRootWins for X screens + and WScreens for physical screens. + +2003-05-13 05:22 UTC tuomov + * trunk: changeset 104 + Some minor fixes. + +2003-12-23 20:18 UTC unknown + tagged ion-doc-20030510 + +2003-05-10 20:09 UTC tuomov + * trunk: changeset 103 + Removed repeated word. + +2003-05-10 20:02 UTC tuomov + * trunk: changeset 102 + Fixed some typos. + +2003-05-10 18:55 UTC tuomov + * trunk: changeset 101 + Oops. The all-ps rule was broken. + +2003-05-10 18:51 UTC tuomov + * trunk: changeset 100 + License notes changed to use \copyright instead of "(c)" + +2003-05-10 18:28 UTC tuomov + * trunk: changeset 99 + A README was added. + +2003-05-10 18:26 UTC tuomov + * trunk: changeset 98 + File removed. + +2003-05-10 18:26 UTC tuomov + * trunk: changeset 97 + Object system implementation was split out from the chapter/section on + object and class hierarchies. + +2003-05-10 18:25 UTC tuomov + * trunk: changeset 96 + Added implementation of artikel3 for latex2html. + +2003-05-10 18:24 UTC tuomov + * trunk: changeset 95 + Implementation of rapport3 for latex2html was added. + +2003-05-10 18:24 UTC tuomov + * trunk: changeset 94 + The macros were cleaned up + +2003-05-10 18:24 UTC tuomov + * trunk: changeset 93 + Better Makefile + +2003-05-10 18:23 UTC tuomov + * trunk: changeset 92 + FDL was modified to use the \xchapter etc. macros to enable embedding + it in articles. + +2003-05-10 18:23 UTC tuomov + * trunk: changeset 91 + Clarifications (hopefully) ein the explanation of the object and class + hierarchies. + +2003-05-10 18:22 UTC tuomov + * trunk: changeset 90 + The configuration files were documented. + +2003-05-10 18:22 UTC tuomov + * trunk: changeset 89 + The original document "Ion: Objects and extending" was split into + separate documents "Ion: Configuring and extending with Lua" and "Ion: + notes for the module and patch writer". + +2003-05-10 15:50 UTC tuomov + * trunk: changeset 88 + Added the GNU Free Documentation License. + +2003-05-08 18:31 UTC tuomov + * trunk: changeset 87 + Added more documentation on binding configuration. + +2003-05-07 18:43 UTC tuomov + * trunk: changeset 86 + Added QueryLib and Ioncorelib references. Moved function reference + .tex generation code here from ion. + +2003-05-06 19:46 UTC tuomov + * trunk: changeset 85 + Did some reorganization and added links to Lua documentation. + +2003-05-06 17:48 UTC tuomov + * trunk: changeset 84 + Added a \hline in the type table. + +2003-05-06 17:35 UTC tuomov + * trunk: changeset 83 + Added Makefile rules to generate postscript and pdf + +2003-05-06 17:33 UTC tuomov + * trunk: changeset 82 + Added a Makefile + +2005-02-16 07:18 UTC tailor@f281.ttorni.ton.tut.fi + * Tailorization of trunk + Import of the upstream sources from the repository + + http://tao.uab.es/ion/svn/ion-doc/trunk + + as of revision 80 + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bd580ca --- /dev/null +++ b/Makefile @@ -0,0 +1,136 @@ +# Settings +###################################### + +TOPDIR=../ion-3 + +include $(TOPDIR)/build/system-inc.mk + +L2H=latex2html -show_section_numbers -short_index -local_icons -noaddress \ + -up_url http://iki.fi/tuomov/ion/ -up_title "Ion homepage" -nofootnode\ +## -style greyviolet.css + + +# Function documentation to build +###################################### + +DOCS=ionconf ionnotes + +FNTEXES=ioncore-fns.tex mod_tiling-fns.tex \ + mod_query-fns.tex de-fns.tex mod_menu-fns.tex \ + mod_dock-fns.tex mod_sp-fns.tex + +# Generic rules +###################################### + +nothing: + @ echo "Please read the README first." + +%.ps: %.dvi + dvips $< + +%.pdf: %.dvi + dvipdfm -p a4 $< + +%.dvi: %.tex + latex $< + +# Install +###################################### + +install: + $(INSTALLDIR) $(DOCDIR); \ + for d in $(DOCS); do \ + for e in ps pdf dvi; do \ + test -f $$d.$$e && $(INSTALL) -m $(DATA_MODE) $$d.$$e $(DOCDIR); \ + done; \ + $(INSTALLDIR) $(DOCDIR)/$$d; \ + for i in $$d/*; do \ + $(INSTALL) -m $(DATA_MODE) $$i $(DOCDIR)/$$i; \ + done; \ + done + +# ionconf rules +###################################### +ionconf-dvi-full: + latex ionconf + latex ionconf + latex ionconf + makeindex ionconf.idx + latex ionconf + +ionconf-html: + $(L2H) -split 3 ionconf + +fntexes: $(FNTEXES) + +ionconf-all: fntexes fnlist.tex ionconf-dvi-full ionconf-html + +# ionnotes rules +###################################### + +ionnotes-dvi-full: + latex ionnotes + latex ionnotes + latex ionnotes + makeindex ionnotes.idx + latex ionnotes + +ionnotes-html: + $(L2H) -split 4 ionnotes + +ionnotes-all: ionnotes-dvi-full ionnotes-html + +# More generic rules +###################################### + +all: ionconf-all ionnotes-all + +all-ps: ionconf.ps ionnotes.ps + +all-pdf: ionconf.pdf ionnotes.pdf + + +# Clean +###################################### + +clean: + rm -f $(FNTEXES) fnlist.tex + rm -f *.aux *.toc *.log + rm -f *.idx *.ild *.ilg *.ind + +realclean: clean + rm -f *.ps *.pdf *.dvi + rm -rf $(DOCS) + + +# Function reference rules +###################################### + +ioncore-fns.tex: $(TOPDIR)/ioncore/*.c $(TOPDIR)/ioncore/*.lua + $(MKEXPORTS) -module ioncore -mkdoc -o $@ $+ + +mod_tiling-fns.tex: $(TOPDIR)/mod_tiling/*.c + $(MKEXPORTS) -module mod_tiling -mkdoc -o $@ $+ + +mod_query-fns.tex: $(TOPDIR)/mod_query/*.c $(TOPDIR)/mod_query/mod_query.lua + $(MKEXPORTS) -module mod_query -mkdoc -o $@ $+ + +mod_menu-fns.tex: $(TOPDIR)/mod_menu/*.c $(TOPDIR)/mod_menu/mod_menu.lua + $(MKEXPORTS) -module mod_menu -mkdoc -o $@ $+ + +mod_dock-fns.tex: $(TOPDIR)/mod_dock/*.c + $(MKEXPORTS) -module mod_dock -mkdoc -o $@ $+ + +mod_sp-fns.tex: $(TOPDIR)/mod_sp/*.c + $(MKEXPORTS) -module mod_sp -mkdoc -o $@ $+ + +de-fns.tex: $(TOPDIR)/de/*.c + $(MKEXPORTS) -module de -mkdoc -o $@ $+ + +# Function list +###################################### + +fnlist.tex: $(FNTEXES) + grep hyperlabel $+ | \ + sed 's/.*fn:\([^}]*\).*/\\fnlisti{\1}/;'|sort -d -f \ + > $@ diff --git a/README b/README new file mode 100644 index 0000000..604bf85 --- /dev/null +++ b/README @@ -0,0 +1,23 @@ + +Ion-doc + +Tuomo Valkonen + + +This package contains some (advanced user and module writer) +documentation for the Ion window manager. + +You will need to install latex2html to build the HTML documents. + +How to build: + + 1. Modify TOPDIR in Makefile point to your top-level Ion source + directory, containing a working system.mk (or system-ac.mk). + + 3. After the above has been done, you may run 'make all' to build the + (hyperlinked) DVI and HTML versions of the documents. You may have + increase TeX pool size. + + 4. If you want Postcript versions of the documents, run 'make all-ps'. + For PDF you need to have dvipdfm installed. The PDF:s are obviously + built with 'make all-pdf'. diff --git a/artikel3.perl b/artikel3.perl new file mode 100644 index 0000000..110f32c --- /dev/null +++ b/artikel3.perl @@ -0,0 +1,12 @@ +# artikel3.perl by Tuomo Valkonen, , 2003-05-10 +# +# Implementation of the documentclass for latex2html. Just load +# article. +# + +package main; + +&do_require_package("article"); + +1; + diff --git a/conf-bindings.tex b/conf-bindings.tex new file mode 100644 index 0000000..9afb2b8 --- /dev/null +++ b/conf-bindings.tex @@ -0,0 +1,269 @@ +\section{Keys and rodents} +\label{sec:bindings} + +In the stock configuration file setup, most key and mouse bindings are set +from the file \file{cfg\_ioncore.lua} while module-specific bindings +are set from the modules' main configuration files (\file{cfg\_modname.lua}). +This, however, does not have to be so as long as the module has been +loaded prior to defining any module-specific bindings. + +Bindings are defined by calling the function +\fnrefx{ioncore}{defbindings} with the ''context'' of the +bindings and the a table of new bindings to make. The context is simply +string indicating one of the classes of regions (or modes such as +\type{WMoveresMode}) introduced in section \ref{sec:objects}, and fully +listed in appendix \ref{app:fullhierarchy}, although not all define +a binding map. For example, the following skeleton would be used to +define new bindings for all frames: + +\begin{verbatim} +defbindings("WFrame", { + -- List of bindings to make goes here. +}) +\end{verbatim} + +There has been some confusion among users about the need to define the +''context'' for each binding, so let me try to explain this design +decision here. The thing is that if there was a just a simple 'bind this +key to this action' method without knowledge of the context, some +limitations would have to be made on the available actions and writing +custom handlers would be more complicated. In addition one may want to +bind the same function to different key for different types of objects. +Indeed, the workspace and frame tab switching functions are the same both +classes being based on \type{WMPlex}, and in the stock configuration the +switch to $n$:th workspaces is bound to \key{Mod1+n} while the switch to +$n$:th tab is bound to the sequence \key{Mod1+k n}. + +Currently known ''contexts'' include: +\code{WScreen}, +\code{WMPlex}, +\code{WMPlex.toplevel}, +\code{WFrame}, +\code{WFrame.toplevel}, +\code{WFrame.floating}, +\code{WFrame.tiled}, +\code{WFrame.transient}, +\code{WMoveresMode}, +\code{WGroup}, +\code{WGroupCW}, +\code{WGroupWS}, +\code{WClientWin}, +\code{WTiling}, and +\code{WStatusBar}. +Most of these should be self-explanatory, corresponding to objects +of class with the same name. The ones with \code{.toplevel} suffix +refer to screens and ''toplevel'' frames, i.e. frames that are +not used for transient windows. Likewise \code{.transient} refers +to frames in transient mode, and \code{.tiled} and \code{.floating} +to frames in, respectively, tiled and floating modes. + + + +The following subsections describe how to construct elements of the +binding table. Note that \fnrefx{ioncore}{defbindings} adds +the the newly defined bindings to the previous bindings of the context, +overriding duplicates. To unbind an event, set the handler parameter +to \code{nil} for each of the functions to be described in the following +subsections. + +Also note that when multiple objects want to handle a binding, the +innermost (when the root window is considered the outermost) active object +in the parent--child hierarchy (see Figure \ref{fig:parentship}) of objects +gets to handle the action. + + +\subsection{Binding handlers and special variables} + +Unlike in Ion2, in Ion3 binding handlers are not normally passed as +''anonymous functions'', although this is still possible. The preferred +method now is to pass the code of the handler as a string. Two special +variables are available in this code. These are + +\begin{tabularx}{\linewidth}{lX} + \tabhead{Variable & Description} + \code{_} (underscore) & + Reference to the object on which the + binding was triggered. The object is of the same class as the the + context of the \fnrefx{ioncore}{defbindings} call + defining the binding. \\ + \code{_sub} & + Usually, the currently active \emph{managed object} of the + object referred to by \code{_}, but sometimes (e.g. mouse actions + on tabs of frames) something else relevant to the action triggering + the binding. \\ + \code{_chld} & + Object corresponding to the currently active child window of the + object referred to by \code{_}. +\end{tabularx} + +For example, supposing '\code{_}' is a \type{WFrame}, the following +handler should move the active window to the right, if possible: + +\begin{verbatim} +"_:inc_index(_sub)" +\end{verbatim} + +\subsection{Guards} + +To suppress error messages, each binding handler may also be accompanied +by a ''guard'' expression that blocks the handler from being called when +the guard condition is not met. Currently the following guard expressions +are supported (for both \code{_sub} and \code{_chld}): + +\begin{tabularx}{\linewidth}{lX} + \tabhead{Guard & Description} + \code{"_sub:non-nil"} & The \code{_sub} parameter must be set. \\ + \code{"_sub:SomeClass"} & The \code{_sub} parameter must be member + of class \type{SomeClass}. \\ +\end{tabularx} + + +\subsection{Defining the bindings} +\label{sec:binddef} + +The descriptions of the individual bindings in the binding table argument +to \fnrefx{ioncore}{defbindings} should be constructed with the following +functions. + +Key presses: +\begin{itemize} + \item \fnref{kpress}\code{(keyspec, handler [, guard])}, + \item \fnref{kpress_wait}\code{(keyspec, handler [, guard])} and + \item \fnref{submap}\code{(keyspec, \{ ... more key bindings ... \})}. +\end{itemize} +Mouse actions: +\begin{itemize} + \item \fnref{mclick}\code{(buttonspec, handler [, guard])}, + \item \fnref{mdblclick}\code{(buttonspec, handler [, guard])}, + \item \fnref{mpress}\code{(buttonspec, handler [, guard])} and + \item \fnref{mdrag}\code{(buttonspec, handler [, guard])}. +\end{itemize} + +The actions that most of these functions correspond to should be clear +and as explained in the reference, \fnref{kpress_wait} is simply +\fnref{kpress} with a flag set instructing Ioncore wait for all +modifiers to be released before processing any further actions. +This is to stop one from accidentally calling e.g. +\fnref{WRegion.rqclose} multiple times in a row. The \fnref{submap} +function is used to define submaps or ''prefix maps''. The second +argument to this function is table listing the key press actions +(\fnref{kpress}) in the submap + +The parameters \var{keyspec} and \var{buttonspec} are explained below +in detail. The parameter \var{handler} is the handler for the binding, +and the optional parameter \var{guard} its guard. These should normally +be strings as explained above. + +\subsection{Examples} + +For example, to just bind the key \key{Mod1+1} to switch to the first +workspace and \key{Mod1+Right} to the next workspace, you would make the +following call +\begin{verbatim} +defbindings("WScreen", { + kpress("Mod1+Right", "_:switch_next()"), + kpress("Mod1+1", "_:switch_nth(1)"), +}) +\end{verbatim} + +Note that \code{_:switch_nth(1)} is the same as calling +\fnref{WMPlex.switch_next}\code{(_, 1)} as \type{WScreen} inherits +\type{WMPlex} and this is where the function is actually defined. + +Similarly to the above example, to bind the key sequence \key{Mod1+k n} +switch to the next managed object within a frame, and \key{Mod1+k 1} to the +first, you would issue the following call: +\begin{verbatim} +defbindings("WFrame", { + submap("Mod1+K", { + kpress("Right", "_:switch_next()"), + kpress("1", "_:switch_nth(1)"), + }), +}) +\end{verbatim} + + +\subsection{Key specifications} + +As seen above, the functions that create key binding specifications require +a \var{keyspec} argument. This argument should be a string containing the +name of a key as listed in the X header file \file{keysymdef.h}% +\footnote{This file can usually be found in the directory +\file{/usr/X11R6/include/X11/}.} without the \code{XK_} prefix. +\index{keysymdef.h@\file{keysymdef.h}} +Most of the key names are quite intuitive while some are not. For example, +the \key{Enter} key on the main part of the keyboard has the less common +name \key{Return} while the one the numpad is called \key{KP\_Enter}. + +The \var{keyspec} string may optionally have multiple ''modifier'' names +followed by a plus sign (\code{+}) as a prefix. X defines the following +modifiers: +\begin{quotation} +\key{Shift}, \key{Control}, \key{Mod1} to \key{Mod5}, +\key{AnyModifier} and \key{Lock}. +\index{Shift@\key{Shift}} +\index{Control@\key{Control}} +\index{ModN@\key{ModN}} +\index{AnyModifier@\key{AnyModifier}} +\index{Lock@\key{Lock}} +\end{quotation} + +X allows binding all of these modifiers to almost any key and while this +list of modifiers does not explicitly list keys such as +\key{Alt}\index{Alt@\key{Alt}} that are common on modern keyboards, such +keys are bound to one of the \key{ModN}. On systems running XFree86 +\key{Alt} is usually \key{Mod1}. On Suns \key{Mod1} is the diamond key +and \key{Alt} something else. One of the ''flying window'' keys on so +called Windows-keyboards is probably mapped to \key{Mod3} if you have +such a key. Use the program \file{xmodmap}\index{xmodmap@\file{xmodmap}} +to find out what exactly is bound where. + +Ion defaults to \key{AnyModifier} in submaps. This can sometimes lead to +unwanted effects when the same key is used with and without explicitly +specified modifiers in nested regions. For this reason, Ion recognises +\key{NoModifier} as a special modifier that can be used to reset this +default. + +Ion ignores the \key{Lock} modifier and any \key{ModN} ($N=1{\ldots} 5$) +bound to \key{NumLock}\index{NumLock@\key{NumLock}} or +\key{ScrollLock}\index{ScrollLock@\key{ScrollLock}} +by default because such\footnote{Completely useless keys that should be +gotten rid of in the author's opinion.} locking keys may otherwise +cause confusion. + + +\subsection{Button specifications} + +Button specifications are similar to key definitions but now +instead of specifying modifiers and a key, you specify modifiers +and one of the button names \key{Button1} to +\key{Button5}\index{Button-n@\key{Button-n}}. Additionally the +specification may end with an optional area name following an @-sign. +Only frames currently support areas, and the supported values in this +case are +\code{"border"}, \code{"tab"}, \code{"empty_tab"}, \code{"client"} and +\code{nil} (for the whole frame). + +For example, the following code binds dragging a tab with the first +button pressed to initiate tab drag\&drop handling: + +\begin{verbatim} +defbindings("WFrame", { + mdrag("Button1@tab", "_:p_tabdrag()"), +}) +\end{verbatim} + + +\subsection{A further note on the default binding configuration} + +The default binding configuration contains references to the variables +\code{META} and \code{ALTMETA} instead of directly using the default +values of \code{"Mod1+"} and \code{""} (nothing). As explained in +section \ref{sec:walkthrough}, the definitions of these variables +appear in \file{cfg\_ion.lua}. This way you can easily change the the +modifiers used by all bindings in the default configuration without +changing the whole binding configuration. Quite a few people prefer +to use the Windows keys as modifiers because many applications already +use \key{Alt}. Nevertheless, \key{Mod1} is the default as a key bound +to it is available virtually everywhere. + diff --git a/conf-menus.tex b/conf-menus.tex new file mode 100644 index 0000000..3f9ee17 --- /dev/null +++ b/conf-menus.tex @@ -0,0 +1,120 @@ +\section{Menus} +\label{sec:menus} + +\subsection{Defining menus} + +\index{menus} +\index{defmenu@\code{defmenu}} +\index{menuentry@\code{menuentry}} +\index{submenu@\code{submenu}} +In the stock configuration file setup, menus are defined in the file +\file{cfg\_menus.lua} as previously mentioned. The \file{mod\_menu} module +must be loaded for one to be able to define menus, and this is done with +the function \fnrefx{mod_menu}{defmenu} provided by it. + +Here's an example of the definition of a rather simple menu with a submenu: + +\begin{verbatim} +defmenu("exitmenu", { + menuentry("Restart", "ioncore.restart()"), + menuentry("Exit", "ioncore.shutdown()"), +}) + +defmenu("mainmenu", { + menuentry("Lock screen", "ioncore.exec('xlock')"), + menuentry("Help", "mod_query.query_man(_)"), + submenu("Exit", "exitmenu"), +}) +\end{verbatim} + + +The \fnrefx{mod_menu}{menuentry} function is used to create an entry in the +menu with a title and an entry handler to be called when the menu entry +is activated. The parameters to the handler are similar to those of binding +handlers, and usually the same as those of the binding that opened the menu. + +The \fnrefx{mod_menu}{submenu} function is used to insert a submenu at that +point in the menu. (One could as well just pass a table with the menu +entries, but it is not encouraged.) + +\subsection{Special menus} + +The menu module predefines the following special menus. These can be used +just like the menus defined as above. + +\begin{tabularx}{\linewidth}{lX} + \tabhead{Menu name & Description} + \code{windowlist} & + List of all client windows. Activating an entry jumps to that window. \\ + \code{workspacelist} & + List of all workspaces. Activating an entry jumps to that workspaces. \\ + \code{stylemenu} & + List of available \file{look\_*.lua} style files. Activating an entry + loads that style and ask to save the selection. \\ + \code{ctxmenu} & + Context menu for given object. \\ +\end{tabularx} + + +\subsection{Defining context menus} + +The ''ctxmenu'' is a special menu that is assembled from a defined context +menu for the object for which the menu was opened for, but also includes +the context menus for the manager objects as submenus. + +Context menus for a given region class are defined with the +\fnrefx{mod_menu}{defctxmenu} function. This is other ways similar to +\fnrefx{mod_menu}{defmenu}, but the first argument instead being the name +of the menu, the name of the region class to define context menu for. +For example, here's part of the stock \type{WFrame} context menu +definition: + +\begin{verbatim} +defctxmenu("WFrame", { + menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"), + menuentry("Kill", "WClientWin.kill(_sub)", "_sub:WClientWin"), +}) +\end{verbatim} + +Some of the same ''modes'' as were available for some bindings +may also be used: \code{WFrame.tiled}, \code{WFrame.floating}, +and \code{WFrame.transient}. + + +\subsection{Displaying menus} +\label{sec:menudisp} + +The following functions may be used to display menus from binding +handlers (and elsewhere): + +\begin{tabularx}{\linewidth}{lX} + \tabhead{Function & Description} + \fnref{mod_menu.menu} & + Keyboard (or mouse) operated menus that open in the bottom-left corner + of a screen or frame. \\ + \fnref{mod_menu.bigmenu} & + Same as previous, but uses another graphical style. \\ + \fnref{mod_menu.pmenu} & + Mouse-operated drop-down menus. This function can only be called from a + mouse press or drag handler. \\ + \fnref{mod_menu.grabmenu} & + A special version of \fnref{mod_menu.menu} that grabs the keyboard + and is scrolled with a given key until all modifiers have been released, + after which the selected entry is activated. This function is meant to + be used for implementing, for example, Win***s-style \key{Alt-Tab} + handling.\footnote{See the \file{wcirculate.lua} script in the Ion + scripts repository \url{http://iki.fi/tuomov/repos/ion-scripts-3/}.} \\ +\end{tabularx} + +The \fnrefx{mod_menu}{grabmenu} function takes the extra key parameter, but +aside from that each of these functions takes three arguments, which when +called from a binding handler, should be the parameters to the handler, and +the name of the menu. For example, the following snippet of of code binds +the both ways to open a context menu for a frame: + +\begin{verbatim} +defbindings("WFrame", { + kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"), + mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"), +}) +\end{verbatim} diff --git a/conf-winprops.tex b/conf-winprops.tex new file mode 100644 index 0000000..10c1c10 --- /dev/null +++ b/conf-winprops.tex @@ -0,0 +1,279 @@ +\section{Winprops} +\label{sec:winprops} + +The so-called ''winprops''\index{Winprops} can be used to change how +specific windows are handled and to set up some kludges to deal with +badly behaving applications. They are defined by calling the function +\code{defwinprop} with a table containing the properties to set and the +necessary information to identify a window. The currently supported +winprops are listed below, and the subsequent subsections explain the +usual method of identifying windows, and how to obtain this information. + +%\begin{table} +%\begin{htmlonly} +%\docode % latex2html kludge +%\end{htmlonly} +%\caption{Supported winprops} +%\label{tab:winprops} + +\newenvironment{winprop}[2]{ + \begin{function}% + % Sigh. (La)TeX is a mess. + %\index{% + % \ifx\\#1\\% + % #2\else#1\fi% + % @\expandafter\var{#2}} + \item[Winprop:] \var{#1} (#2) + \item[Description:] +} +{ + \end{function} +} + + +\begin{winprop}{acrobatic}{boolean} + \index{acrobatic@\var{acrobatic}} + Set this to \code{true} for Acrobat Reader. It has an annoying + habit of trying to manage its dialogs instead of setting them as + transients and letting the window manager do its job, causing + Ion and acrobat go a window-switching loop when a dialog is + opened. +\end{winprop} + + +\begin{winprop}{aspect}{table} + \index{aspect@\var{aspect}} + The table should contain the entries \var{w} and \var{h} that + override application-supplied aspect ratio hint. +\end{winprop} + + +\begin{winprop}{float}{boolean} + \index{float@\var{float}} + Set this to open the window in a floating frame, when + in a group. +\end{winprop} + + +\begin{winprop}{fullscreen}{boolean} + \index{fullscreen@\var{fullscreen}} + Should the window be initially in full screen mode? +\end{winprop} + + +\begin{winprop}{ignore_cfgrq}{boolean} + \index{ignore-cfgrq@\var{ignore_cfgrq}} + Should configure requests on the window be ignored? + Only has effect on floating windows. +\end{winprop} + + +\begin{winprop}{ignore_net_active_window}{boolean} + \index{ignore-net-active-window@\var{ignore_net_active_window}} + Ignore extended WM hints \code{_NET_ACTIVE_WINDOW} request. +\end{winprop} + + +\begin{winprop}{ignore_resizeinc}{boolean} + \index{ignore-resizeinc@\var{ignore_resizeinc}} + Should application supplied size increments be ignored? +\end{winprop} + + +\begin{winprop}{jumpto}{boolean} + \index{jumpto@\var{jumpto}} + Should a newly created client window always be made + active, even if the allocated frame isn't. +\end{winprop} + + +\begin{winprop}{max_size}{table} + \index{max-size@\var{max_size}} + The table should contain the entries \var{w} and \var{h} that + override application-supplied maximum size hint. +\end{winprop} + + +\begin{winprop}{min_size}{table} + \index{min-size@\var{min_size}} + Similar to \var{max_size} but for the minimum size hint. +\end{winprop} + + +\begin{winprop}{oneshot}{boolean} + \index{oneshot@\var{oneshot}} + Discard this winprop after first use. +\end{winprop} + + +\begin{winprop}{switchto}{boolean} + \index{switchto@\var{switchto}} + Should a newly mapped client window be switched to within + its frame. +\end{winprop} + + +\begin{winprop}{target}{string} + \index{target@\var{target}} + The name of an object (workspace, frame) that should manage + windows of this type. +\end{winprop} + + +\begin{winprop}{transient_mode}{string} + \index{transient-mode@\var{transient_mode}} + "normal": No change in behaviour. "current": The window + should be thought of as a transient for the current active + client window (if any) even if it is not marked as a + transient by the application. "off": The window should be + handled as a normal window even if it is marked as a + transient by the application. +\end{winprop} + + +\begin{winprop}{transients_at_top}{boolean} + \index{transients-at-top@\var{transients_at_top}} + When transients are managed by the client window itself (as it + is the case on tiled workspaces), should the transients be + placed at the top of the window instead of bottom? +\end{winprop} + + +\begin{winprop}{transparent}{boolean} + \index{transparent@\var{transparent}} + Should frames be made transparent when this window is selected? \\ +\end{winprop} + + + +\subsection{Classes, roles and instances} +\label{sec:classesrolesinstances} + +The identification information in the winprop specification is usually the +\var{class}\index{class@\var{class}!winprop}, +\var{role}\index{role@\var{role}!winprop}, +\var{instance}\index{instance@\var{instance}!winprop} and +\var{name} +of the window. The \var{name} field is a Lua-style regular expression +matched against the window's title and the rest are strings that must +exactly match the corresponding window information. It is not necessary +to specify all of these fields. + +Ion looks for a matching winprop in the order listed by the following +table. An 'E' indicates that the field must be set in the winprop +and it must match the window's corresponding property exactly or, in +case of \var{name}, the regular expression must match the window +title. An asterisk '*' indicates that a winprop where the field is +not specified (or is itself an asterisk in case of the first three +fields) is tried. + +\begin{center} +\begin{tabular}{llll} + \tabhead{\var{class} & \var{role} & \var{instance} & \var{name}} + E & E & E & E \\ + E & E & E & * \\ + E & E & * & E \\ + E & E & * & * \\ + E & * & E & E \\ + E & * & E & * \\ + E & * & * & E \\ + \vdots & \vdots & \vdots & etc. \\ +\end{tabular} +\end{center} + +If there are multiple winprops with other identification information +the same but different \var{name}, the longest match is chosen. + +\subsection{Finding window identification} + +The 'Window info' context menu entry (\key{Mod1+M} or \key{Button3} on a tab) +can be used to list the identification information required to set winprops +for a window and all the transient windows managed within it. + +\index{xprop} +Another way to get the identification information is to use \command{xprop}. +Simply run To get class and instance, simply run \command{xprop WM_CLASS} +and click on the particular window of interest. The class is the latter of +the strings while the instance is the former. To get the role -- few +windows have this property -- use the command \command{xprop WM_ROLE}. +This method, however, will not work on transients. + +\index{transient} +So-called ''transient windows'' are usually short-lived dialogs (although +some programs abuse this property) that have a parent window that they are +''transient for''. On tiled workspaces Ion displays these windows +simulatenously with the parent window at the bottom of the same frame. +Unfortunately \command{xprop} is stupid and can't cope with this situation, +returning the parent window's properties when the transient is clicked on. +For this reason you'll have to do a little extra work to get the properties +for that window.\footnote{There's a patch to \command{xprop} to +fix this, but nothing seems to be happening with respect to including it in +XFree86.} + +Finally, it should be mentioned that too many authors these days +''forget'' to set this vital identification to anything meaningful: +everything except name is the same for all of the programs's +windows, for example. + +\subsection{Some common examples} + +\subsubsection{Acrobat Reader} + +The following is absolutely necessary for Acrobat reader: + +\begin{verbatim} +defwinprop{ + class = "AcroRead", + instance = "documentShell", + acrobatic = true, +} +\end{verbatim} + +\subsubsection{Fixing a Mozilla Firebird transient} + +Mozilla Firebird (0.7) incorrectly does not set the \code{WM_TRANSIENT_FOR} +property for the dialog that is used to ask the action to take for a file. +It, however, sets the the property point to the main window for the save +dialog. This can be annoying and confusing, as the first dialog is not +closed before the second is displayed. + +We'd like the first dialog to be transient to the main window. The closest +we can get to that is to consider it transient to the current window (if +there's one). Unfortunately Firebird does not set any meaningful classes, +instances or roles for the windows, so we'll have to rely on an ugly title +match. + +\begin{verbatim} +defwinprop{ + class = "MozillaFirebird-bin", + name = "Opening .*", + transient_mode = "current", +} +\end{verbatim} + +\subsubsection{Forcing newly created windows in named frames} + +The following winprop should place xterm started with command-line parameter +\mbox{\code{-name sysmon}} and running a system monitoring program in a +particular frame: +\begin{verbatim} +defwinprop{ + class = "XTerm", + instance = "sysmon", + target = "sysmonframe", +} +\end{verbatim} + +For this example to work, we have to somehow create a frame named +\code{sysmonframe}. One way to do this is to make the following +call in the \key{Mod1+F3} Lua code query: + +\begin{verbatim} +mod_query.query_renameframe(_) +\end{verbatim} + +Recall that \code{_} points to the multiplexer (frame or screen) in which +the query was opened. Running this code should open a new query prefilled +with the current name of the frame. In our example we would change the +name to \code{sysmonframe}, but we could just as well have used the +default name formed from the frame's class name and an instance number. diff --git a/conf.tex b/conf.tex new file mode 100644 index 0000000..109093b --- /dev/null +++ b/conf.tex @@ -0,0 +1,178 @@ + +\chapter{Basic configuration} +\label{chap:config} + +This chapter should help your configure Ion to your liking. As the your +probably already know, Ion uses Lua as a configuration and extension +language. If you're new to it, you might first want to read some Lua +documentation as already suggested and pointed to in the Introduction +before continuing with this chapter. + +Section \ref{sec:conffiles} is an overview of the multiple configuration +files Ion uses and as a perhaps more understandable introduction to the +general layout of the configuration files, a walk-through of the main +configuration file \file{ion.lua} is provided in section +\ref{sec:walkthrough}. +How keys and mouse action are bound to functions is described in detail +in \ref{sec:bindings} and in section \ref{sec:winprops} winprops are +explained. For a reference on exported functions, see section +\ref{sec:exports}. + +\section{The configuration files} +\label{sec:conffiles} + +Ion3, to which document applies, stores its stock configuration files in +\file{/usr/local/etc/ion3/} unless you, the OS package maintainer or +whoever installed the package on the system has modified the variables +\code{PREFIX}\index{PREFIX@\code{PREFIX}} or +\code{ETCDIR}\index{ETCDIR@\code{ETCDIR}} in +\file{system.mk}\index{system.mk@\file{system.mk}} before compiling Ion. +In the first case you probably know where to find the files and in +the other case the system administrator or the OS package maintainer +should have provided documentation to point to the correct location. +If these instructions are no help in locating the correct directory, +the command \code{locate cfg_ion.lua} might help provided \code{updatedb} +has been run recently. + +User configuration files go in \file{\~{}/.ion3/}. +Ion always searches the user configuration file directory before the stock +configuration file directory for files. Therefore, if you want to change +some setting, it is advised against that you modify the stock configuration +files in-place as subsequent installs of Ion will restore the stock +configuration files. Instead you should always make a copy of the stock +file in \file{\~{}/.ion3/} and modify this file. When searching +for a file, if no extension or path component is given, compiled \file{.lc} +files are attempted before \file{.lua} files. + +All the configuration files are named \file{cfg\_*.lua} with the ''\file{*}'' +part varying. The configuration file for each module \file{mod\_modname} is +\file{cfg\_modname.lua}, with \file{modname} varying by the module in +question. The following table summarises these and other configuration +files: + +\begin{tabularx}{\linewidth}{ + p{\widthof{cfg-bindings.lua}}% + X} + \hline + File & Description \\ + \hline + \file{cfg\_ion.lua} & + The main configuration file \\ + % + \file{cfg\_ioncore.lua} & + Configuration file for Ion's core library. + Most of the bindings and menus are configured here. Bindings that are + specific to some module are configured in the module's configuration + file. For details, see section \ref{sec:bindings}. \\ + % + \file{cfg\_kludges.lua} & + Settings to get some applications behave more nicely have been + collected here. See section \ref{sec:winprops}. \\ + % + \file{cfg\_tiling.lua} + \file{cfg\_query.lua} + \file{cfg\_menu.lua} + \file{cfg\_dock.lua} + \file{cfg\_statusbar.lua} + \dots & Configuration files for different modules. \\ +\end{tabularx} + +Additionally, there's the file \file{look.lua} that configures the +drawing engine, but it is covered in chapter \ref{chap:gr}. + +\section{A walk through \file{cfg\_ion.lua}} +\label{sec:walkthrough} + +As already mentioned \file{cfg\_ion.lua} is Ion's main configuration +file. Some basic 'feel' settings are usually configured there and +the necessary modules and other configuration files configuring some +more specific aspects of Ion are loaded there. In this section we +take a walk through the stock \file{cfg\_ion.lua}. +Notice that most of the settings are commented-out (\code{--} is a +line comment in Lua) in the actual file, as they're the defaults +nevertheless. + +The first thing one in the file is to set +\begin{verbatim} +META="Mod1+" +ALTMETA="" +\end{verbatim} +These settings cause most of Ion's key bindings to use \key{Mod1} as the +modifier key. If \code{ALTMETA} is set, it is used as modifier for the keys +that don't normally use a modifier. for details on modifiers and key +binding setup in general see section \ref{sec:bindings}. + +Next we do some basic feel configuration: + +\begin{verbatim} +ioncore.set{ + dblclick_delay=250, + kbresize_delay=1500, +} +\end{verbatim} + +These two will set the delay between button presses in a double click, and +the timeout to quit resize mode in milliseconds. + +\begin{verbatim} +ioncore.set{ + opaque_resize=true, + warp=true +} +\end{verbatim} + +The first of these two settings enables opaque resize mode: in move/resize +move frames and other objects mirror you actions immediately. If opaque +resize is disabled, a XOR rubber band is shown during the mode instead. +This will, unfortunately, cause Ion to also grab the X server and has some +side effects. + +Next we load the configuration for Ion's core, and some kludges: + +\begin{verbatim} +dopath("cfg_ioncore") +dopath("cfg_kludges") +\end{verbatim} + +Most bindings and menus are defined in \file{cfg\_ioncore.lua}. +Details on making such definitions follow in sections \ref{sec:bindings} +and \ref{sec:menus}, respectively. +some kludges or ''winprops'' to make some applications behave better +under Ion are colledted in \file{cfg\_kludges.lua}; see section +\ref{sec:winprops} for details. In addition to these, this file +lists quite a few statements of the form +\begin{verbatim} +ioncore.defshortening("[^:]+: (.*)(<[0-9]+>)", "$1$2$|$1$<...$2") +\end{verbatim} +These are used to configure how Ion attempts to shorten window titles +when they do not fit in a Tab. The first argument is a POSIX regular +expression that is used to match against the title and the next is +a rule to construct a new title of a match occurs. This particular +rule is used to shorten e.g. 'Foo: barbaz<3>' to 'barba{\ldots}<3>'; for +details see the function reference entry for \fnref{ioncore.defshortening}. + +To actually be able to do something besides display windows in full screen +mode, we must next load some modules: + +\begin{verbatim} +dopath("cfg_modules") +--dopath("mod_query") +--dopath("mod_menu") +--dopath("mod_tiling") +--dopath("mod_statusbar") +--dopath("mod_dock") +--dopath("mod_sp") +\end{verbatim} + +We actually load there another file listing the default selection of +modules. If you only want to load additional modules, just uncomment +the corresponding line. If you want to disable loading some modules, +comment out the the line loading \file{cfg\_modules}, and uncomment +the lines for the modules you want, or add more. + + +\input{conf-bindings.tex} + +\input{conf-menus.tex} + +\input{conf-winprops.tex} diff --git a/confintro.tex b/confintro.tex new file mode 100644 index 0000000..9331614 --- /dev/null +++ b/confintro.tex @@ -0,0 +1,52 @@ + +\chapter{Introduction} + +This document is an ''advanced user'' manual for Ion, the X11 window manager, +and version 3 specifically. It is an attempt attempt at documenting what is +in Ion's configuration files, how to configure Ion by simple modifications +to these files and how to write more complex extensions in Lua, the +lightweight configuration and scripting language used by Ion. + +Readers unfamiliar with Lua is advised to first glance at the Lua manual at + +\centerurl{http://www.lua.org/docs.html} + +and perhaps some tutorial pages at the lua-users wiki: + +\centerurl{http://lua-users.org/wiki/LuaTutorial} + +Back in this document, first in chapter \ref{chap:prelim} some key +concepts and relations are explained. These include the module system +and Ion's object and class hierarchies. While it might not at first +occur that knowing such things would be necessary to \emph{configure} +a program, this material is essential because of the object-oriented +nature of most of Ion's scripting interface. + +The new user, fed up with the default key bindings and eager to just +quickly configure Ion to his liking may question the reasons for +exposing the ''heavy'' internal OO structure in the scripting and +configuration interface. I'm not the one to blame him for that. +Sure it would be faster to configure Ion to everyone's liking +if a simpler binding configuration interface was provided. Such an +interface would, however, also be far more limited and make writing +extensions more complicated and the advantages from using a real +scripting language would be partly lost. One more advantage from +a rich scripting and configuration interface is that it allows +implementing scripts to read alternate configuration file formats, +ones that could be, for example, modified by external configuration tools. + +In chapter \ref{chap:config} the very basic Ion configuration know-how +is provided. All the different configuration files and their locations +are explained and instructions are given to allow the reader to +configure bindings and so-called ''winprops''. Chapter \ref{chap:gr} +explains the notion of drawing engines and graphical styles and how to +write new looks for Ion and more advanced aspects of Ion's scripting +interface are documented in chapter \ref{chap:tricks} (a work in +progress). + +Finally, most of the functions provided by Ion's scripting interface +are listed and documented in the Function reference in chapter +\ref{sec:exports}. At the end of the document is an alphabetical +listing of all these functions. + + diff --git a/cstyle.tex b/cstyle.tex new file mode 100644 index 0000000..328a7c3 --- /dev/null +++ b/cstyle.tex @@ -0,0 +1,118 @@ +\section{C coding style} + +If you want to submit patches to Ion, you MUST follow my coding +style, even if you think it is the root of all evil. We don't want +the code to be an incomprehensible mess of styles and I have better +things to do than fix other people's style to match mine. The style +should be obvious by studying the source, but here's a list of some +things to take note of. + +\subsection{Whitespace} + +\begin{itemize} + \item Indentations of 4 with \emph{tab size=4}. + + \item No extra spaces between operators, delimiters etc. except + \begin{itemize} + \item around logical and, or (\code{&&}, \code{||}) + \item around the conditional \code{a ? b : c} + \item after commas and semicolons + \end{itemize} + In my opinion this helps pointing out arithmetic or other + expressions within logical expressions or parameter lists. + + \item All kinds of labels are out-tended to the level of the higher + level block. For example: + +\begin{verbatim} +void foo() +{ +again: + switch(asdf){ + case 1: + ... + break; + default: + ... + break; + } +} +\end{verbatim} +\end{itemize} + +\subsection{Braces} + +\begin{itemize} +\item Opening brace is at the end of the line, except in function + bodies, where it is at the beginning of the line following + the definition. + +\item Never put the body of a control statement on the same line + with the statement (e.g. \verb!if(foo){ bar() }!). + +For example, the block +\begin{verbatim} +void foo(int a, int b) +{ + if(a==b && c+d==e){ + ... + } +} +\end{verbatim} + +has correct style while the block + +\begin{verbatim} +void foo(int a,int b) { + if (a == b && c + d == e) { + ... + } +} +\end{verbatim} + +does not. + + \item The \code{else} keyword follows immediately after the closing brace of + previous \code{if}, if any. (This might change so I don't care if you put + it on the next line.) + + \item I have used the convention that control statement bodies containing + a single statement do not need braces around the block if, in case of + the \code{if} all the blocks in \code{if ... else if ... else} + contain just one statement. If you want to, just use braces in every + case. +\end{itemize} + +\subsection{Names} + +\begin{itemize} + \item Function and variable names only have lower case letters. Type + names are in mixed case while constants and macros (\code{#define}s) + are in upper case letters. +\end{itemize} + +\subsection{Miscellaneous} + +\begin{itemize} + \item In the definition of a pointer variable, the asterisk is attached + to the variable name: \code{char *s;}. (One could claim this an + exception to the second rule.) + + \item You might optionally want to use Jed's foldings to group blocks + of related code in a file to keep it organized: + +\begin{verbatim} +/*{{{ Many related functions */ + +void code() +{ + ... +} + +... + +/*}}}*/ +\end{verbatim} +\end{itemize} + +I think that's mostly it. Study the source when in doubt. diff --git a/de.tex b/de.tex new file mode 100644 index 0000000..6c8c2b4 --- /dev/null +++ b/de.tex @@ -0,0 +1,388 @@ + +\chapter{Graphical styles} +\label{chap:gr} + +This chapter first gives in section \ref{sec:engines} a general outline +of how drawing engines are used, of style specifications and then +in section \ref{sec:defaultde} describes how to specify styles +for the default drawing engine. + +\section{Drawing engines, style specifications and sub-styles} +\label{sec:engines} +\index{style}\index{drawing engine} + +Ion's drawing routines are abstracted into so-called drawing engine +modules that can, again depending on the system, be dynamically +loaded as needed. The drawing engine modules provide ''brushes'' +that objects can use to draw some high-level primitives such +as borders and text boxes (in addition to simple text and rectangle +drawing) on their windows and configure e.g. the shape and +background of the window. While the drawing engines therefore +do not directly implement looks for each possible object (that +would hardly be maintainable), different brush styles can be +used to give a distinctive look to different objects and engines +could interpret some styles as special cases. Style specifications +are strings of the form + +\begin{verbatim} +element1-element2-...-elementn +\end{verbatim} + +An example of such a style specification is \code{tab-frame}; +see the table in subsection \ref{sec:styles} for more styles. + +When an object asks for a brush of certain style, the selected +drawing engine will attempt to find the closest match to this +specification. The styles/brushes defined by the drawing engines +may have asterisks (\verb!*!) as some of the elements indicating +a match to anything. Exact matches are preferred to asterisk +matches and longer matches to shorter. For example, let a brush +for style \code{foo-bar-baz} be queried, then the following +brushes are in order of preference: + +\begin{verbatim} +foo-bar-baz +foo-*-baz +foo-bar +* +foo-baz -- Doesn't match, not selected! +\end{verbatim} + +Some of the drawing primitives allow extra attributes to be +specified, also in the form +\begin{verbatim} +attr1-attr2-...-attrn +\end{verbatim} +These extra attributes are called \emph{substyles}\index{substyle} +and allow, for example, the state of the object to be indicated +by different colour sets while keeping the interface at an +abstract level and the drawing engine completely ignorant +of the semantics -- only the writer of the drawing engine +configuration file has to know them. However the drawing +engine can again interpret known substyles as special cases +and the default engine indeed does so with frame tab +tag and drag states.) + + +\subsection{Known styles and substyles} +\label{sec:styles} + +\subsubsection{Frames} + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Style name & Description} +\code{frame} & Style for frames. + Substyles: \code{active}, \code{inactive}. \\ +\code{frame-tiled} & A more specific style for tiled frames. + Substyles as for \code{frame}. \\ +\code{frame-tiled-alt} & An alternative style for tiled frames. + Often used to disable the tab-bar. \\ +\code{frame-floating} & A more specific style for floating + frames. \\ +\code{frame-transient} & A more specific style for frames + containing transient windows. \\ +\end{tabularx} + +\subsubsection{Tabs and menu entries} + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Style name & Description} +\code{tab} & Style for frames' tabs and menu entries. + Substyles: combinations of the form \code{a-s} where + \code{a} is one of \code{active}\nobreak/\code{inactive} and + \code{s} is one of \code{selected}\nobreak/\code{unselected} \\ +\code{tab-frame} & A more specific style for frames' tabs. + Substyles: combinations of the form \code{a-s-t-d-u} where + \code{a} and \code{s} are as above and + \code{t} is one of \code{tagged}\nobreak/\code{not_tagged}, + \code{d} is one of \code{dragged}\nobreak/\code{not_dragged} and + \code{u} is one of \code{activity}\nobreak/\code{no_activity}. \\ +\code{tab-frame-tiled}, & \\ +\code{tab-frame-tiled-alt}, & \\ +\code{tab-frame-floating}, & \\ +\code{tab-frame-transient} & More specific styles for frames in the + different modes. \\ +\code{tab-menuentry} & A more specific style for entries in \type{WMenu}s. \\ +\code{tab-menuentry-bigmenu} & An alternate style for entries in \type{WMenu}s. \\ +\end{tabularx} + +\subsubsection{The rest} + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Style name & Description} +\code{input} & A style for \type{WInput}s. \\ +\code{input-edln} & A more specific style for \type{WEdln}s. + Substyles: \code{selection} for selected text and + \code{cursor} for the cursor indicating current editing point. \\ +\code{input-message} & A more specific style for \type{WMessage}s. \\ +\code{input-menu} & A more specific style for \type{WMenu}s. \\ +\code{input-menu-bigmenu} & An alternate style for \type{WMenu}s. \\ +\code{moveres_display} & The box displaying position/size when + moving or resizing frames. \\ +\code{dock} & The dock. \\ +\end{tabularx} + + +\section{Defining styles for the default drawing engine} +\label{sec:defaultde} + +Drawing engine style files are usually named +\file{look\_foo.lua} where \file{foo} is the name of the +style. The file that Ion loads on startup or when +\fnref{gr.read_config} is called, however, is \file{look.lua} +and should usually be symlinked to or a copy of of some +\file{look\_foo.lua}. + +\subsection{The structure of the configuration files} + +The first thing to do in a stylefile is to choose the drawing +engine, possibly loading the module as well. This is done +with the following chunk of code. + +\begin{verbatim} +if not gr.select_engine("de") then + return +end +\end{verbatim} + +The \fnref{gr.select_engine} function sees if the engine +given as argument is registered (the default drawing engine is +simply called ''de''). If the engine could not be found, it +tries to load a module of the same name. If the engine still +is not registered, \fnref{gr.select_engine} returns \code{false} +and in this case we also exit the style setup script. +If the engine was found, \fnref{gr.select_engine} sees that +further requests for brushes are forwarded to that engine +and returns \code{true}. + +Before defining new styles it may be a good idea to clear old +styles from memory so if the old configuration defines more +specific styles than the new, the old styles don't override +those specified by the new configuration. That can be done by +calling + +\begin{verbatim} +de.reset() +\end{verbatim} + +After this the new styles can be defined with \fnref{de.defstyle} +as explained in the next subsection. Finally, after the styles have +been defined we must ask objects on the screen to look up new brushes +to reflect the changes in configuration. This is done with + +\begin{verbatim} +gr.refresh() +\end{verbatim} + +\subsection{Defining the styles} + +Styles for the default drawing engine are defined with the +function \fnref{de.defstyle}. It has two arguments the first being +a style specification as explained in previous sections and the second +a table whose fields describe the style: + +\begin{verbatim} +de.defstyle("some-style", { + attribute = value, + ... +}) +\end{verbatim} + +The supported attributes are described in tables below. The different +border elements and styles referred to there are explained in Figure +\ref{fig:borders}. + +\begin{figure} +\begin{htmlonly} +\docode % Kludge to make latex2html interpret contents instead of + % creating an image. +\end{htmlonly} +\begin{verbatim} +Elevated: Inlaid: Ridge: Groove: + hhhhhhhhhhhs ............ hhhhhhhhhhhs sssssssssssh + h..........s .sssssssssh. h..........s s..........h + h. .s .s h. h.sssssssh.s s.hhhhhhhs.h + h. .s .s h. h.s h.s s.h s.h + h. .s .s h. h.shhhhhhh.s s.hsssssss.h + h..........s .shhhhhhhhh. h..........s s..........h + hsssssssssss ............ hsssssssssss shhhhhhhhhhh + +h = highlight, s = shadow, . = padding +\end{verbatim} +\caption{Sketch of different border styles and elements} +\label{fig:borders} +\end{figure} + +\subsubsection{Colours} + +Each of these fields a string of the form that can be +passed to \code{XAllocNamedColor}. Valid strings are e.g. +hexadecimal RGB specifications of the form +\code{#RRGGBB} and colour names as specified +in \file{/usr/X11R6/lib/X11/rgb.txt} (exact path varying). + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Field & Description} +\var{highlight_colour} & + Colour for the ''highlight'' part of a border. \\ +\var{shadow_colour} & + Colour for the ''highlight'' part of a border. \\ +\var{foreground_colour} & + Colour for the normal drawing operations, e.g. text. \\ +\var{background_colour} & + Window background colour (unless transparency is enabled) and + background colour boxes. \\ +\var{padding_colour} & + Colour for the ''padding'' part of a border border. Set to + \var{background_colour} if unset. \\ +\end{tabularx} + + +\subsubsection{Borders and widths} + +All other fields below except \var{border_style} are non-negative integers +indicating a number of pixels. + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Field & Description} +\var{border_style} & A string indicating the style of border; one of + elevated/inlaid/ridge/groove as seen in the + above sketch. \\ +\var{highlight_pixels} & + Width of the highlight part of the border in pixels. \\ +\var{shadow_pixels} & + Width of the shadow part of the border in pixels. \\ +\var{padding_pixels} & + Width of the padding part of the border in pixels. \\ +\var{spacing} & + Space to be left between all kinds of boxes. \\ +\end{tabularx} + + +\subsubsection{Text} + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Field & Description} +\var{font} & Font to be used in text-drawing operations; standard X font + name. \\ +\var{text_align} & How text is to be aligned in text boxes/tabs; one of + the strings left\nobreak/right\nobreak/center. \\ +\end{tabularx} + + +\subsubsection{Miscellaneous} + + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Field & Description} +\var{transparent_background} & Should windows' that use this style + background be transparent? true/false. \\ +\var{based_on} & The name of a previously defined style that this + style should be based on. \\ +\end{tabularx} + + +\subsubsection{Substyles} + +As discussed in previous sections, styles may have substyles to e.g. +indicate different states of the object being drawn. The ''de'' engine +limits what can be configured in substyles to the set of colours in the +first table above, but also specifically interprets for the main style +\code{tab-frame} the substyles \code{*-*-tagged} and \code{*-*-*-dragged} +by, respectively, drawing a right angle shape at the top right corner +of a tab and by shading the tab with a stipple pattern. Also for +menus the substyles \code{*-*-submenu} are handled as a special case. + +Substyles are defined with the function \fnref{de.substyle} within the +table defining the main style. The parameters to this function are +similar to those of \fnref{de.defstyle}. + +\begin{verbatim} +de.defstyle("some-style", { + ... + de.substyle("some-substyle", { + ... + }), + ... +}) +\end{verbatim} + + +\subsection{An example} + +The following shortened segment from \file{look\_cleanviolet.lua} +should help to clarify the matters discussed in the previous +subsection. + +\begin{verbatim} +de.defstyle("*", { + -- Gray background + highlight_colour = "#eeeeee", + shadow_colour = "#eeeeee", + background_colour = "#aaaaaa", + foreground_colour = "#000000", + + shadow_pixels = 1, + highlight_pixels = 1, + padding_pixels = 1, + spacing = 0, + border_style = "elevated", + + font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*", + text_align = "center", +}) + +de.defstyle("tab-frame", { + based_on = "*", + + de.substyle("active-selected", { + -- Violet tab + highlight_colour = "#aaaacc", + shadow_colour = "#aaaacc", + background_colour = "#666699", + foreground_colour = "#eeeeee", + }), + + -- More substyles would follow ... +}) +\end{verbatim} + + +\section{Miscellaneous settings} + +The following style fields are independent of the drawing engine used, +but are related to objects' styles and therefore configured in the drawing +engine configuration file. + +\subsection{Extra fields for style \code{frame}} + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Field & Description} +\code{bar} & Controls the style of the tab-bar. Possible values + are the strings \code{"none"}, \code{"inside"}, \code{"outside"} + and \code{"shaped"}, with the last providing the PWM-style + tab-bars for floating frames. \\ +\code{floatframe_tab_min_w} & Minimum tab width in pixels for + the shaped style, given that this number times number of tabs + doesn't exceed frame width. \\ +\code{floatframe_bar_max_w_q} & Maximum tab-bar width quotient of + frame width for the shaped styles. A number in the + interval $(0, 1]$. +\end{tabularx} + +\subsection{Extra fields for style \code{dock}} + +\begin{tabularx}{\linewidth}{lX} +\tabhead{Field & Description} +\code{outline_style} & How borders are drawn: + \code{"none"} -- no border, + \code{"all"} -- border around whole dock, + \code{"each"} -- border around each dockapp. \\ +\code{tile_size} & A table with entries \code{width} and \code{height}, + indicating the width and height of tiles in pixels. +\end{tabularx} + + +Hopefully that's enough to get you started in writing new style +configuration files for Ion. When in doubt, study the existing +style configuration files. diff --git a/designnotes.tex b/designnotes.tex new file mode 100644 index 0000000..4bb6485 --- /dev/null +++ b/designnotes.tex @@ -0,0 +1,54 @@ +\section{Miscellaneous design notes} + +\subsection{Destroying \type{WObj}:s} + +To keep Ion's code as simple as possible yet safe, there are restrictions +when the \type{WObj} +\code{destroy_obj}\index{destroy-obj@\code{destroy_obj}} +function that calls watches, the deinit routine and frees memory may +be called directly. In all other cases the +\code{defer_destroy}\index{defer-destroy@\code{defer_destroy}} +function should be used to defer the call of \code{destroy_obj} until +Ioncore returns to its main event loop. + +Calling the \code{destroy_obj} function directly is allowed in the +following cases: +\begin{itemize} + \item In the deinit handler for another object. Usually managed objects + are destroyed this way. + \item The object was created during the current call to the function + that wants to get rid of the object. This is the case, for example, + when the function created a frame to manage some other object but for + some reason failed to reparent the object to this frame. + \item In a deferred action handler set with + \code{defer_action}\index{defer-action@\code{defer_action}}. + Like deferred destroys, other deferred actions are called when + Ioncore has returned to the main loop. + \item You are absolute sure that C code outside your code has no + references to the object. +\end{itemize} + +If there are no serious side effects from deferring destroying the +object or you're unsure whether it is safe to destroy the object +immediately, use \code{defer_destroy}. + +\subsection{The types \code{char*} and \code{const char*} as function + parameters and return values} + +The following rules should apply to using strings as return values and +parameters to functions. + +\begin{tabularx}{\linewidth}{lXX} + \tabhead{Type & Return value & Parameter} + \code{const char*} & The string is owned by the called function + and the caller is only quaranteed short-term read access to the + string. & + The called function may only read the string during its execution. + For further reference a copy must be made. \\ + \code{char*} & The string is the caller's responsibility and it + \emph{must} free it when no longer needed. & + The called function may modify the string but the ''owner'' of + the string is case-dependant. \\ +\end{tabularx} + + diff --git a/exact-version b/exact-version new file mode 100644 index 0000000..0413a6b --- /dev/null +++ b/exact-version @@ -0,0 +1,5 @@ + +Context: + +[TAG ion-doc-3ds-20061223 +Tuomo Valkonen **20061223150012] diff --git a/fnref.tex b/fnref.tex new file mode 100644 index 0000000..c270a5a --- /dev/null +++ b/fnref.tex @@ -0,0 +1,38 @@ +\chapter{Function reference} +\label{sec:exports} + +\section{Functions defined in \file{ioncore}} +\label{sec:ioncoreref} +\input{ioncore-fns.tex} + +\section{Functions defined in \file{mod\_tiling}} +\label{sec:tilingref} +\input{mod_tiling-fns.tex} + +%\section{Functions defined in \file{mod\_panews}} +%\label{sec:panewsref} +%\input{mod_panews-fns.tex} + +\section{Functions defined in \file{mod\_query}} +\label{sec:queryref} +\input{mod_query-fns.tex} + +\section{Functions defined in \file{mod\_menu}} +\label{sec:menuref} +\input{mod_menu-fns.tex} + +\section{Functions defined in \file{mod\_dock}} +\label{sec:dockref} +\input{mod_dock-fns.tex} + +\section{Functions defined in \file{mod\_sp}} +\label{sec:spref} +\input{mod_sp-fns.tex} + +\section{Functions defined in \file{de}} +\label{sec:deref} +\input{de-fns.tex} + +\section{Hooks} +\label{sec:hookref} +\input{hookref} diff --git a/fullhierarchy.tex b/fullhierarchy.tex new file mode 100644 index 0000000..d5d5a39 --- /dev/null +++ b/fullhierarchy.tex @@ -0,0 +1,43 @@ +\chapter{Full class hierarchy visible to Lua-side} +\label{app:fullhierarchy} + +%\begin{figure} +%\begin{htmlonly} +%\docode % latex2html kludge +%\end{htmlonly} +{\small +\begin{verbatim} + Obj + |-->WHook + |-->WTimer + |-->WMoveresMode + |-->WMgmtMode (mod_mgmtmode) + |-->WRegion + | |-->WClientWin + | |-->WWindow + | | |-->WRootWin + | | |-->WMPlex + | | | |-->WScreen + | | | |-->WFrame + | | |-->WInfoWin + | | | |-->WStatusBar (mod_statusbar) + | | |-->WMenu (mod_menu) + | | |-->WInput (mod_query) + | | |-->WEdln (mod_query) + | | |-->WMessage (mod_query) + | |-->WGroup + | | |-->WGroupWS + | | |-->WGroupCW + | |-->WTiling (mod_tiling) + |-->WSplit (mod_tiling) + |-->WSplitInner (mod_tiling) + | |-->WSplitSplit (mod_tiling) + | |-->WSplitFloat (mod_tiling) + |-->WSplitRegion (mod_tiling) + |-->WSplitST (mod_tiling) +\end{verbatim} +} +%\caption{Full Ioncore and most common modules' class hierarchy +% visible to Lua side.} +%\label{fig:fullclasshierarchy} +%\end{figure} diff --git a/gpl.tex b/gpl.tex new file mode 100644 index 0000000..d4de1de --- /dev/null +++ b/gpl.tex @@ -0,0 +1,416 @@ +\xchapter{The GNU General Public License} + +\begin{center} +{\parindent 0in + +Version 2, June 1991 + +Copyright \copyright\ 1989, 1991 Free Software Foundation, Inc. + +\bigskip + +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +\bigskip + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +} +\end{center} + +\begin{center} +{\bf\large Preamble} +\end{center} + + +The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free software---to +make sure the software is free for all its users. This General Public +License applies to most of the Free Software Foundation's software and to +any other program whose authors commit to using it. (Some other Free +Software Foundation software is covered by the GNU Library General Public +License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for this service +if you wish), that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free programs; +and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And +you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If +the software is modified by someone else and passed on, we want its +recipients to know that what they have is not the original, so that any +problems introduced by others will not reflect on the original authors' +reputations. + +Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent must +be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +\begin{center} +{\Large \sc Terms and Conditions For Copying, Distribution and + Modification} +\end{center} + + +%\renewcommand{\theenumi}{\alpha{enumi}} +\begin{enumerate} + +\addtocounter{enumi}{-1} + +\item + +This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the +terms of this General Public License. The ``Program'', below, refers to +any such program or work, and a ``work based on the Program'' means either +the Program or any derivative work under copyright law: that is to say, a +work containing the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. (Hereinafter, +translation is included without limitation in the term ``modification''.) +Each licensee is addressed as ``you''. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +\item You may copy and distribute verbatim copies of the Program's source + code as you receive it, in any medium, provided that you conspicuously + and appropriately publish on each copy an appropriate copyright notice + and disclaimer of warranty; keep intact all the notices that refer to + this License and to the absence of any warranty; and give any other + recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +\item + +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +\begin{enumerate} + +\item + +You must cause the modified files to carry prominent notices stating that +you changed the files and the date of any change. + +\item + +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +\item +If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +\end{enumerate} + + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +\item +You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +\begin{enumerate} + +\item + +Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +\item + +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +\item + +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +\end{enumerate} + + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +\item +You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +\item +You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +\item +Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +\item +If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +\item +If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +\item +The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and ``any +later version'', you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +\item +If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +\begin{center} +{\Large\sc +No Warranty +} +\end{center} + +\item +{\sc Because the program is licensed free of charge, there is no warranty +for the program, to the extent permitted by applicable law. Except when +otherwise stated in writing the copyright holders and/or other parties +provide the program ``as is'' without warranty of any kind, either expressed +or implied, including, but not limited to, the implied warranties of +merchantability and fitness for a particular purpose. The entire risk as +to the quality and performance of the program is with you. Should the +program prove defective, you assume the cost of all necessary servicing, +repair or correction.} + +\item +{\sc In no event unless required by applicable law or agreed to in writing +will any copyright holder, or any other party who may modify and/or +redistribute the program as permitted above, be liable to you for damages, +including any general, special, incidental or consequential damages arising +out of the use or inability to use the program (including but not limited +to loss of data or data being rendered inaccurate or losses sustained by +you or third parties or a failure of the program to operate with any other +programs), even if such holder or other party has been advised of the +possibility of such damages.} + +\end{enumerate} + + +\begin{center} +{\Large\sc End of Terms and Conditions} +\end{center} + + +\pagebreak[2] + +\xsectionstar{Appendix: How to Apply These Terms to Your New Programs} + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest to + attach them to the start of each source file to most effectively convey + the exclusion of warranty; and each file should have at least the + ``copyright'' line and a pointer to where the full notice is found. + +\begin{quote} +one line to give the program's name and a brief idea of what it does. \\ +Copyright (C) yyyy name of author \\ + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +\end{quote} + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +\begin{quote} +Gnomovision version 69, Copyright (C) yyyy name of author \\ +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. \\ +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. +\end{quote} + + +The hypothetical commands {\tt show w} and {\tt show c} should show the +appropriate parts of the General Public License. Of course, the commands +you use may be called something other than {\tt show w} and {\tt show c}; +they could even be mouse-clicks or menu items---whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the program, if +necessary. Here is a sample; alter the names: + +\begin{quote} +Yoyodyne, Inc., hereby disclaims all copyright interest in the program \\ +`Gnomovision' (which makes passes at compilers) written by James Hacker. \\ + +signature of Ty Coon, 1 April 1989 \\ +Ty Coon, President of Vice +\end{quote} + + +This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications +with the library. If this is what you want to do, use the GNU Library +General Public License instead of this License. diff --git a/hookref.tex b/hookref.tex new file mode 100644 index 0000000..f4f2a9e --- /dev/null +++ b/hookref.tex @@ -0,0 +1,241 @@ + +\begin{function} + \index{clientwin-do-manage-alt@\code{clientwin_do_manage_alt}} + \hookname{clientwin_do_manage_alt} + \hookparams{(WClientWin, table)} + \begin{funcdesc} + Called when we want to manage a new client window. + The table argument contains the following fields: + + \begin{tabularx}{\linewidth}{llX} + \tabhead{Field & Type & Description} + \var{switchto} & bool & Do we want to switch to the client window. \\ + \var{jumpto} & bool & Do we want to jump to the client window. \\ + \var{userpos} & bool & Geometry set by user. \\ + \var{dockapp} & bool & Client window is a dockapp. \\ + \var{maprq} & bool & Map request (and not initialisation scan). \\ + \var{gravity} & number & Window gravity. \\ + \var{geom} & table & Requested geometry; \var{x}, \var{y}, \var{w}, \var{h}.\\ + \var{tfor} & WClientWin & Transient for window. + \end{tabularx} + + This hook is not called in protected mode and can be used for + arbitrary placement policies (deciding in which workspace a new + \type{WClientWin} should go). In this case, you can call +\begin{verbatim} +reg:attach(cwin) +\end{verbatim} + where \var{reg} is the region where the window should go, and + \var{cwin} is the first argument of the function added to the + hook. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{clientwin-mapped-hook@\code{clientwin_mapped_hook}} + \hookname{clientwin_mapped_hook} + \hookparams{WClientWin} + \begin{funcdesc} + Called when we have started to manage a client window. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{clientwin-unmapped-hook@\code{clientwin_unmapped_hook}} + \hookname{clientwin_unmapped_hook} + \hookparams{number} + \begin{funcdesc} + Called when we no longer manage a client window. The parameter + is the X ID of the window; see \fnref{WClientWin.xid}. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{frame-managed-changed-hook@\code{frame_managed_changed_hook}} + \hookname{frame_managed_changed_hook} + \hookparams{table} + \begin{funcdesc} + Called when there are changes in the objects managed by a frame + or their order. The table parameter has the following fields: + + \begin{tabularx}{\linewidth}{llX} + \tabhead{Field & Type & Description} + \var{reg} & WFrame & The frame in question \\ + \var{mode} & string & \var{"switchonly"}, \var{"reorder"}, + \var{"add"} or \var{"remove"} \\ + \var{sw} & bool & Switch occured \\ + \var{sub} & WRegion & The managed region (primarily) affected \\ + \end{tabularx} + \end{funcdesc} +\end{function} + + +\begin{function} + \index{ioncore-sigchld-hook@\code{ioncore_sigchld_hook}} + \hookname{ioncore_sigchld_hook} + \hookparams{integer} + \begin{funcdesc} + Called when a child process has exited. The parameter + is the PID of the process. + \end{funcdesc} +\end{function} + +\begin{function} + \index{ioncore-deinit-hook@\code{ioncore_deinit_hook}} + \hookname{ioncore_deinit_hook} + \hookparams{()} + \begin{funcdesc} + Called when Ion is deinitialising and about to quit. + \end{funcdesc} +\end{function} + +%ioncore_handle_event_alt -- not available to lua side + +\begin{function} + \index{ioncore-post-layout-setup-hook@\code{ioncore_post_layout_setup_hook}} + \hookname{ioncore_post_layout_setup_hook} + \hookparams{()} + \begin{funcdesc} + Called when Ion has done all initialisation and is almost ready to + enter the mainloop, except no windows are yet being managed. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{ioncore-snapshot-hook@\code{ioncore_snapshot_hook}} + \hookname{ioncore_snapshot_hook} + \hookparams{()} + \begin{funcdesc} + Called to signal scripts and modules to save their state (if any). + \end{funcdesc} +\end{function} + + +\begin{function} + \index{tiling-placement-alt@\code{tiling_placement_alt}} + \hookname{tiling_placement_alt} + \hookparams{table} + \begin{funcdesc} + Called when a client window is about to be managed by a \type{WTiling} + to allow for alternative placement policies. The table has the + following fields: + \begin{tabularx}{\linewidth}{llX} + \tabhead{Field & Type & Description} + \var{tiling} & \type{WTiling} & The tiling \\ + \var{reg} & \type{WRegion} & The region (always a WClientWin at + the moment) to be placed \\ + \var{mp} & \type{table} & This table contains the same fields as + the parameter of \fnref{clientwin_do_manage_alt} \\ + \var{res_frame} & \type{WFrame} & A succesfull handler should + return the target frame here. \\ + \end{tabularx} + This hook is just for placing within a given workspace after the + workspace has been decided by the default workspace selection + policy. It is called in protected mode. For arbitrary placement + policies, \fnref{clientwin_do_manage_alt} should be used; it + isn't called in protected mode, + \end{funcdesc} +\end{function} + + +%\begin{function} +% \index{panews-init-layout-alt@\code{panews_init_layout_alt}} +% \hookname{panews_init_layout_alt} +% \hookparams{table} +% \begin{funcdesc} +% Called to initialise panews layout. The table parameter has +% initially a single field \var{ws} pointing to the workspace, +% but the succesfull handler should set the field \var{layout} +% to a proper layout (as those saved in the layout savefiles). +% \end{funcdesc} +%\end{function} + + +\begin{function} + \index{panews-make-placement-alt@\code{panews_make_placement_alt}} + \hookname{panews_make_placement_alt} + \hookparams{table} + \begin{funcdesc} + Called to make a placement on panews. The parameter table has + the following fields: + + \begin{tabularx}{\linewidth}{llX} + \tabhead{Field & Type & Description} + \var{ws} & \type{WPaneWS} & The workspace \\ + \var{frame} & \type{WFrame} & A frame initially allocated for the + region to be placed \\ + \var{reg} & \type{WRegion} & The region to be placed \\ + \var{specifier} & \type{WRegion} & For drag\&drop on handling empty areas\\ + \end{tabularx} + + The handler should set some of these fields on success: + + \begin{tabularx}{\linewidth}{llX} + \tabhead{Field & Type & Description} + \var{res_node} & \type{WSplit} & Target split \\ + \var{res_config} & \type{WFrame} & New configuration for it, unless + \type{WSplitRegion} \\ + \var{res_w} & integer & New width for target split (optional) \\ + \var{res_h} & integer & New height for target split (optional) \\ + \end{tabularx} + \end{funcdesc} +\end{function} + + +\begin{function} + \index{region-activated-hook@\code{region_activated_hook}} + \hookname{region_activated_hook} + \hookparams{WRegion} + \begin{funcdesc} + Signalled when a region or one of its children has received the focus. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{region-activity-hook@\code{region_activity_hook}} + \hookname{region_activity_hook} + \hookparams{WRegion} + \begin{funcdesc} + This hook is triggered when the activity flag of the parameter + region has been changed. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{region-do-warp-alt@\code{region_do_warp_alt}} + \hookname{region_do_warp_alt} + \hookparams{WRegion} + \begin{funcdesc} + This alt-hook exist to allow for alternative pointer warping + implementations. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{region-inactivated-hook@\code{region_inactivated_hook}} + \hookname{region_inactivated_hook} + \hookparams{WRegion} + \begin{funcdesc} + Signalled when the focus has moved from the parameter region or + one of its children to a non-child region of the parameter region. + \end{funcdesc} +\end{function} + + +\begin{function} + \index{screen-managed-changed-hook@\code{screen_managed_changed_hook}} + \hookname{screen_managed_changed_hook} + \hookparams{table} + \begin{funcdesc} + Called when there are changes in the objects managed by a screen + or their order. The table parameter is similar to that of + \fnref{frame_managed_changed_hook}. + \end{funcdesc} +\end{function} diff --git a/ionconf.dvi.gz b/ionconf.dvi.gz new file mode 100644 index 0000000..905ef66 Binary files /dev/null and b/ionconf.dvi.gz differ diff --git a/ionconf.out b/ionconf.out new file mode 100644 index 0000000..060a02d --- /dev/null +++ b/ionconf.out @@ -0,0 +1,82 @@ +\BOOKMARK [0][-]{chapter.1}{ Introduction}{} +\BOOKMARK [0][-]{chapter.2}{ Preliminaries: Key concepts and relations}{} +\BOOKMARK [1][-]{section.2.1}{ Modules}{chapter.2} +\BOOKMARK [1][-]{section.2.2}{ Class and object hierarchies}{chapter.2} +\BOOKMARK [2][-]{subsection.2.2.1}{ Class hierarchy}{section.2.2} +\BOOKMARK [2][-]{subsection.2.2.2}{ Object hierarchies: WRegion parents and managers}{section.2.2} +\BOOKMARK [2][-]{subsection.2.2.3}{ Summary}{section.2.2} +\BOOKMARK [0][-]{chapter.3}{ Basic configuration}{} +\BOOKMARK [1][-]{section.3.1}{ The configuration files}{chapter.3} +\BOOKMARK [1][-]{section.3.2}{ A walk through cfg\137ion.lua}{chapter.3} +\BOOKMARK [1][-]{section.3.3}{ Keys and rodents}{chapter.3} +\BOOKMARK [2][-]{subsection.3.3.1}{ Binding handlers and special variables}{section.3.3} +\BOOKMARK [2][-]{subsection.3.3.2}{ Guards}{section.3.3} +\BOOKMARK [2][-]{subsection.3.3.3}{ Defining the bindings}{section.3.3} +\BOOKMARK [2][-]{subsection.3.3.4}{ Examples}{section.3.3} +\BOOKMARK [2][-]{subsection.3.3.5}{ Key specifications}{section.3.3} +\BOOKMARK [2][-]{subsection.3.3.6}{ Button specifications}{section.3.3} +\BOOKMARK [2][-]{subsection.3.3.7}{ A further note on the default binding configuration}{section.3.3} +\BOOKMARK [1][-]{section.3.4}{ Menus}{chapter.3} +\BOOKMARK [2][-]{subsection.3.4.1}{ Defining menus}{section.3.4} +\BOOKMARK [2][-]{subsection.3.4.2}{ Special menus}{section.3.4} +\BOOKMARK [2][-]{subsection.3.4.3}{ Defining context menus}{section.3.4} +\BOOKMARK [2][-]{subsection.3.4.4}{ Displaying menus}{section.3.4} +\BOOKMARK [1][-]{section.3.5}{ Winprops}{chapter.3} +\BOOKMARK [2][-]{subsection.3.5.1}{ Classes, roles and instances}{section.3.5} +\BOOKMARK [2][-]{subsection.3.5.2}{ Finding window identification}{section.3.5} +\BOOKMARK [2][-]{subsection.3.5.3}{ Some common examples}{section.3.5} +\BOOKMARK [0][-]{chapter.4}{ Graphical styles}{} +\BOOKMARK [1][-]{section.4.1}{ Drawing engines, style specifications and sub-styles}{chapter.4} +\BOOKMARK [2][-]{subsection.4.1.1}{ Known styles and substyles}{section.4.1} +\BOOKMARK [1][-]{section.4.2}{ Defining styles for the default drawing engine}{chapter.4} +\BOOKMARK [2][-]{subsection.4.2.1}{ The structure of the configuration files}{section.4.2} +\BOOKMARK [2][-]{subsection.4.2.2}{ Defining the styles}{section.4.2} +\BOOKMARK [2][-]{subsection.4.2.3}{ An example}{section.4.2} +\BOOKMARK [1][-]{section.4.3}{ Miscellaneous settings}{chapter.4} +\BOOKMARK [2][-]{lstlisting.4.-385}{ Extra fields for style !frame!}{section.4.3} +\BOOKMARK [2][-]{lstlisting.4.-407}{ Extra fields for style !dock!}{section.4.3} +\BOOKMARK [0][-]{chapter.5}{ Scripting}{} +\BOOKMARK [1][-]{section.5.1}{ Hooks}{chapter.5} +\BOOKMARK [1][-]{section.5.2}{ Referring to regions}{chapter.5} +\BOOKMARK [2][-]{subsection.5.2.1}{ Direct object references}{section.5.2} +\BOOKMARK [2][-]{subsection.5.2.2}{ Name-based lookups}{section.5.2} +\BOOKMARK [1][-]{section.5.3}{ Alternative winprop selection criteria}{chapter.5} +\BOOKMARK [1][-]{lstlisting.5.-448}{ Writing !ion-statusd! monitors}{chapter.5} +\BOOKMARK [0][-]{chapter.6}{ Function reference}{} +\BOOKMARK [1][-]{section.6.1}{ Functions defined in ioncore}{chapter.6} +\BOOKMARK [2][-]{subsection.6.1.1}{ WClientWin functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.2}{ WFrame functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.3}{ WGroup functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.4}{ WGroupCW functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.5}{ WGroupWS functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.6}{ WInfoWin functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.7}{ WMPlex functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.8}{ WMoveresMode functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.9}{ WRegion functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.10}{ WRootWin functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.11}{ WScreen functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.12}{ WWindow functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.13}{ global functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.14}{ gr functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.15}{ string functions}{section.6.1} +\BOOKMARK [2][-]{subsection.6.1.16}{ table functions}{section.6.1} +\BOOKMARK [1][-]{section.6.2}{ Functions defined in mod\137tiling}{chapter.6} +\BOOKMARK [2][-]{subsection.6.2.1}{ WSplit functions}{section.6.2} +\BOOKMARK [2][-]{subsection.6.2.2}{ WSplitInner functions}{section.6.2} +\BOOKMARK [2][-]{subsection.6.2.3}{ WSplitRegion functions}{section.6.2} +\BOOKMARK [2][-]{subsection.6.2.4}{ WSplitSplit functions}{section.6.2} +\BOOKMARK [2][-]{subsection.6.2.5}{ WTiling functions}{section.6.2} +\BOOKMARK [1][-]{section.6.3}{ Functions defined in mod\137query}{chapter.6} +\BOOKMARK [2][-]{subsection.6.3.1}{ WComplProxy functions}{section.6.3} +\BOOKMARK [2][-]{subsection.6.3.2}{ WEdln functions}{section.6.3} +\BOOKMARK [2][-]{subsection.6.3.3}{ WInput functions}{section.6.3} +\BOOKMARK [1][-]{section.6.4}{ Functions defined in mod\137menu}{chapter.6} +\BOOKMARK [2][-]{subsection.6.4.1}{ WMenu functions}{section.6.4} +\BOOKMARK [1][-]{section.6.5}{ Functions defined in mod\137dock}{chapter.6} +\BOOKMARK [2][-]{subsection.6.5.1}{ WDock functions}{section.6.5} +\BOOKMARK [1][-]{section.6.6}{ Functions defined in mod\137sp}{chapter.6} +\BOOKMARK [1][-]{section.6.7}{ Functions defined in de}{chapter.6} +\BOOKMARK [1][-]{section.6.8}{ Hooks}{chapter.6} +\BOOKMARK [0][-]{appendix.A}{ The GNU General Public License}{} +\BOOKMARK [0][-]{appendix.B}{ Full class hierarchy visible to Lua-side}{} +\BOOKMARK [0][-]{section*.17}{Index}{} diff --git a/ionconf.ps.gz b/ionconf.ps.gz new file mode 100644 index 0000000..055828e Binary files /dev/null and b/ionconf.ps.gz differ diff --git a/ionconf.tex b/ionconf.tex new file mode 100644 index 0000000..9dd71c8 --- /dev/null +++ b/ionconf.tex @@ -0,0 +1,73 @@ +\documentclass[english,a4paper,11pt,oldtoc,mctitle]{rapport3} +\input{macros} + +% For including some files from articles +\newcommand{\xchapter}[1]{\chapter{#1}} +\newcommand{\xsection}[1]{\section{#1}} +\newcommand{\xsectionstar}[1]{\section*{#1}} +\newcommand{\xsubsection}[1]{\subsection{#1}} + + +\title{Configuring and extending Ion3 with Lua} +\author{Tuomo Valkonen \\ tuomov at iki.fi} +\date{2006-12-23} + +\makeindex + + +\begin{document} + +\maketitle + +Configuring and extending Ion3 with Lua\\ +Copyright \copyright\ 2003--2005 Tuomo Valkonen. + +This document is free; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This document is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +chapter entitled ''GNU General Public License'' for more details. + +\tableofcontents + +\input{confintro} + +\input{prelim} + +\input{conf} + +\input{de} + +\input{tricks} + +\input{fnref} + +\appendix + +\input{gpl} + +\input{fullhierarchy} + +\chapter*{List of functions} +\markboth{\MakeUppercase{List of functions}}% + {\MakeUppercase{List of functions}}% + +%begin{latexonly} +\makeatletter +\def\fnlisti#1{\@dottedtocline{1}{0em}{1.5em}{\lstinline!#1!}{\pageref{fn:#1}}} +{\parskip\z@\input{fnlist}} +\makeatother +%end{latexonly} + +\begin{htmlonly} +\newcommand{\fnlisti}[1]{\fnref{#1}\\} +\input{fnlist} +\end{htmlonly} + +\printindex + +\end{document} diff --git a/ionconf/WARNINGS b/ionconf/WARNINGS new file mode 100644 index 0000000..726c0ef --- /dev/null +++ b/ionconf/WARNINGS @@ -0,0 +1,8 @@ +No implementation found for style `hyperref' +No implementation found for style `ae' +No implementation found for style `url' +No implementation found for style `tocbibind' +No implementation found for style `geometry' +No implementation found for style `calc' + +Substitution of arg to newlabelxx delayed. diff --git a/ionconf/contents.png b/ionconf/contents.png new file mode 100644 index 0000000..0c752c6 Binary files /dev/null and b/ionconf/contents.png differ diff --git a/ionconf/images.aux b/ionconf/images.aux new file mode 100644 index 0000000..3b687b9 --- /dev/null +++ b/ionconf/images.aux @@ -0,0 +1,19 @@ +\relax +\ifx\hyper@anchor\@undefined +\global \let \oldcontentsline\contentsline +\gdef \contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global \let \oldnewlabel\newlabel +\gdef \newlabel#1#2{\newlabelxx{#1}#2} +\gdef \newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\let \contentsline\oldcontentsline +\let \newlabel\oldnewlabel} +\else +\global \let \hyper@last\relax +\fi + +\select@language{english} +\@writefile{toc}{\select@language{english}} +\@writefile{lof}{\select@language{english}} +\@writefile{lot}{\select@language{english}} +\@ifundefined{unitindent}{\newdimen\unitindent\let \@indentset\relax }{} +\global \unitindent=38.41783pt\relax\@indentset\relax diff --git a/ionconf/images.idx b/ionconf/images.idx new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/images.log b/ionconf/images.log new file mode 100644 index 0000000..952589a --- /dev/null +++ b/ionconf/images.log @@ -0,0 +1,396 @@ +This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=latex 2006.11.18) 23 DEC 2006 17:03 +entering extended mode +**./images.tex +(./images.tex +LaTeX2e <2003/12/01> +Babel and hyphenation patterns for american, french, german, ngerman, b +ahasa, basque, bulgarian, catalan, croatian, czech, danish, dutch, esperanto, e +stonian, finnish, greek, icelandic, irish, italian, latin, magyar, norsk, polis +h, portuges, romanian, russian, serbian, slovak, slovene, spanish, swedish, tur +kish, ukrainian, nohyphenation, loaded. + +(/usr/share/texmf-tetex/tex/latex/ntgclass/rapport3.cls +Document Class: rapport3 2004/06/07 v2.1a NTG LaTeX document class +(/usr/share/texmf-tetex/tex/latex/ntgclass/ntg11.clo +File: ntg11.clo 2004/06/07 v2.1a NTG LaTeX file (size option) +) +\unitindent=\dimen102 +\othermargin=\dimen103 +\c@part=\count79 +\c@chapter=\count80 +\c@section=\count81 +\c@subsection=\count82 +\c@subsubsection=\count83 +\c@paragraph=\count84 +\c@subparagraph=\count85 +\c@figure=\count86 +\c@table=\count87 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +LaTeX Info: Redefining \em on input line 826. +\bibindent=\dimen104 +) (/usr/share/texmf-tetex/tex/latex/base/ifthen.sty +Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) +) (/usr/share/texmf-tetex/tex/generic/babel/babel.sty +Package: babel 2004/11/20 v3.8d The Babel package +(/usr/share/texmf-tetex/tex/generic/babel/english.ldf +Language: english 2004/06/14 v3.3o English support from the babel system +(/usr/share/texmf-tetex/tex/generic/babel/babel.def +File: babel.def 2004/11/20 v3.8d Babel common definitions +\babel@savecnt=\count88 +\U@D=\dimen105 +) +\l@british = a dialect from \language\l@english +\l@UKenglish = a dialect from \language\l@english +\l@canadian = a dialect from \language\l@american +\l@australian = a dialect from \language\l@british +\l@newzealand = a dialect from \language\l@british +)) (/usr/share/texmf-tetex/tex/latex/base/inputenc.sty +Package: inputenc 2004/02/05 v1.0d Input encoding file +(/usr/share/texmf-tetex/tex/latex/base/latin1.def +File: latin1.def 2004/02/05 v1.0d Input encoding file +)) (/usr/share/texmf-tetex/tex/latex/hyperref/hyperref.sty +Package: hyperref 2003/11/30 v6.74m Hypertext links for LaTeX +(/usr/share/texmf-tetex/tex/latex/graphics/keyval.sty +Package: keyval 1999/03/16 v1.13 key=value parser (DPC) +\KV@toks@=\toks14 +) +\@linkdim=\dimen106 +\Hy@linkcounter=\count89 +\Hy@pagecounter=\count90 +(/usr/share/texmf-tetex/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2003/11/30 v6.74m Hyperref: PDFDocEncoding definition (HO) +) (/usr/share/texmf-tetex/tex/latex/hyperref/hyperref.cfg +File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive and teTeX +) +Package hyperref Info: Hyper figures OFF on input line 1880. +Package hyperref Info: Link nesting OFF on input line 1885. +Package hyperref Info: Hyper index ON on input line 1888. +Package hyperref Info: Plain pages ON on input line 1893. +Package hyperref Info: Backreferencing OFF on input line 1900. +Implicit mode ON; LaTeX internals redefined +Package hyperref Info: Bookmarks ON on input line 2004. +(/usr/share/texmf/tex/latex/latex2html/url.sty +Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file + names +) +LaTeX Info: Redefining \url on input line 2143. +\Fld@menulength=\count91 +\Field@Width=\dimen107 +\Fld@charsize=\dimen108 +\Choice@toks=\toks15 +\Field@toks=\toks16 +Package hyperref Info: Hyper figures OFF on input line 2618. +Package hyperref Info: Link nesting OFF on input line 2623. +Package hyperref Info: Hyper index ON on input line 2626. +Package hyperref Info: backreferencing OFF on input line 2633. +Package hyperref Info: Link coloring OFF on input line 2638. +\c@Item=\count92 +\c@Hfootnote=\count93 +) +*hyperref using driver hdvipdfm* +(/usr/share/texmf-tetex/tex/latex/hyperref/hdvipdfm.def +File: hdvipdfm.def 2003/11/30 v6.74m Hyperref driver for dvipdfm +\pdfm@box=\box26 +\Fld@listcount=\count94 +\@outlinefile=\write3 +) (/usr/share/texmf-tetex/tex/latex/ae/ae.sty +Package: ae 2001/02/12 1.3 Almost European Computer Modern +(/usr/share/texmf-tetex/tex/latex/base/fontenc.sty +Package: fontenc 2004/02/22 v1.99f Standard LaTeX package +(/usr/share/texmf-tetex/tex/latex/base/t1enc.def +File: t1enc.def 2004/02/22 v1.99f Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding T1 on input line 43. +) +LaTeX Font Info: Try loading font information for T1+aer on input line 100. +(/usr/share/texmf-tetex/tex/latex/ae/t1aer.fd +File: t1aer.fd 1997/11/16 Font definitions for T1/aer. +))) (/usr/share/texmf/tex/latex/html/html.sty +Package: html 1999/07/19 v1.38 hypertext commands for latex2html (nd, hws, rrm) + +\c@lpart=\count95 +\c@lchapter=\count96 +\c@lsection=\count97 +\c@lsubsection=\count98 +\c@lsubsubsection=\count99 +\c@lparagraph=\count100 +\c@lsubparagraph=\count101 +\c@lsubsubparagraph=\count102 +\ptrfile=\write4 +) (/usr/share/texmf-tetex/tex/latex/base/makeidx.sty +Package: makeidx 2000/03/29 v1.0m Standard LaTeX package +) (/usr/share/texmf-tetex/tex/latex/tools/tabularx.sty +Package: tabularx 1999/01/07 v2.07 `tabularx' package (DPC) +(/usr/share/texmf-tetex/tex/latex/tools/array.sty +Package: array 2003/12/17 v2.4a Tabular extension package (FMi) +\col@sep=\dimen109 +\extrarowheight=\dimen110 +\NC@list=\toks17 +\extratabsurround=\skip43 +\backup@length=\skip44 +) +\TX@col@width=\dimen111 +\TX@old@table=\dimen112 +\TX@old@col=\dimen113 +\TX@target=\dimen114 +\TX@delta=\dimen115 +\TX@cols=\count103 +\TX@ftn=\toks18 +) (/usr/share/texmf-tetex/tex/latex/base/textcomp.sty +Package: textcomp 2004/02/22 v1.99f Standard LaTeX package +Package textcomp Info: Sub-encoding information: +(textcomp) 5 = only ISO-Adobe without \textcurrency +(textcomp) 4 = 5 + \texteuro +(textcomp) 3 = 4 + \textohm +(textcomp) 2 = 3 + \textestimated + \textcurrency +(textcomp) 1 = TS1 - \textcircled - \t +(textcomp) 0 = TS1 (full) +(textcomp) Font families with sub-encoding setting implement +(textcomp) only a restricted character set as indicated. +(textcomp) Family '?' is the default used for unknown fonts. +(textcomp) See the documentation for details. +Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 71. +(/usr/share/texmf-tetex/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +) +LaTeX Info: Redefining \oldstylenums on input line 266. +Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 281. +Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 282. +Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 283. +Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 284. +Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 285. +Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 286. +Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 287. +Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 288. +Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 289. +Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 290. +Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 291. +Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 292. +Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 293. +Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 294. +Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 295. +Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 296. +Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 297. +Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 298. +Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 299. +Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 300. +Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 301. +Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 302. +Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 303. +Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 304. + +Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 305. +Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 306. +Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 307. +Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 308. +Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 309. +Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 310. +Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 311. +Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 312. +Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 313. +Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 314. +Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 315. +Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 316. +Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 317. +Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 318. +Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 319. +Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 320. +Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 321. +Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 322. +Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 323. +Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 324. +Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 325. +Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 326. +) (/usr/share/texmf-tetex/tex/latex/tocbibind/tocbibind.sty +Package: tocbibind 2003/03/13 v1.5g extra ToC listings + +Package tocbibind Note: The document has chapter divisions. + + +Package tocbibind Note: Using chapter style headings, unless overridden. + +) (/usr/share/texmf-tetex/tex/latex/tools/enumerate.sty +Package: enumerate 1999/03/05 v3.00 enumerate extensions (DPC) +\@enLab=\toks19 +) (/usr/share/texmf-tetex/tex/latex/geometry/geometry.sty +Package: geometry 2002/07/08 v3.2 Page Geometry +\Gm@cnth=\count104 +\Gm@cntv=\count105 +\c@Gm@tempcnt=\count106 +\Gm@bindingoffset=\dimen116 +\Gm@wd@mp=\dimen117 +\Gm@odd@mp=\dimen118 +\Gm@even@mp=\dimen119 +\Gm@dimlist=\toks20 +(/usr/share/texmf-tetex/tex/latex/geometry/geometry.cfg)) (/usr/share/texmf-tet +ex/tex/latex/tools/calc.sty +Package: calc 1998/07/07 v4.1b Infix arithmetic (KKT,FJ) +\calc@Acount=\count107 +\calc@Bcount=\count108 +\calc@Adimen=\dimen120 +\calc@Bdimen=\dimen121 +\calc@Askip=\skip45 +\calc@Bskip=\skip46 +LaTeX Info: Redefining \setlength on input line 59. +LaTeX Info: Redefining \addtolength on input line 60. +\calc@denominator=\count109 +) +\@indexfile=\write5 +\openout5 = `images.idx'. + +Writing index file images.idx +(/usr/share/texmf-tetex/tex/latex/graphics/color.sty +Package: color 1999/02/16 v1.0i Standard LaTeX Color (DPC) +(/usr/share/texmf-tetex/tex/latex/graphics/color.cfg +File: color.cfg 2005/02/03 v1.3 color configuration of teTeX/TeXLive +) +Package color Info: Driver file: dvips.def on input line 125. +(/usr/share/texmf-tetex/tex/latex/graphics/dvips.def +File: dvips.def 1999/02/16 v3.0i Driver-dependant file (DPC,SPQR) +) (/usr/share/texmf-tetex/tex/latex/graphics/dvipsnam.def +File: dvipsnam.def 1999/02/16 v3.0i Driver-dependant file (DPC,SPQR) +)) +\sizebox=\box27 +\lthtmlwrite=\write6 +(./images.aux) +\openout1 = `images.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 198. +LaTeX Font Info: ... okay on input line 198. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 198. +LaTeX Font Info: ... okay on input line 198. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 198. +LaTeX Font Info: ... okay on input line 198. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 198. +LaTeX Font Info: ... okay on input line 198. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 198. +LaTeX Font Info: ... okay on input line 198. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 198. +LaTeX Font Info: ... okay on input line 198. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 198. +LaTeX Font Info: ... okay on input line 198. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 198. +LaTeX Font Info: Try loading font information for TS1+cmr on input line 198. + +(/usr/share/texmf-tetex/tex/latex/base/ts1cmr.fd +File: ts1cmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: ... okay on input line 198. +Package hyperref Info: Link coloring OFF on input line 198. +(/usr/share/texmf-tetex/tex/latex/hyperref/nameref.sty +Package: nameref 2003/12/03 v2.21 Cross-referencing by name of section +\c@section@level=\count110 +) +LaTeX Info: Redefining \ref on input line 198. +LaTeX Info: Redefining \pageref on input line 198. +\openout3 = `images.out'. + +-------------------- Geometry parameters +paper: a4paper +landscape: -- +twocolumn: -- +twoside: -- +asymmetric: -- +h-parts: 89.62709pt, 0.7\paperwidth , 89.6271pt (default) +v-parts: 101.40665pt, 0.7\paperheight , 152.11pt (default) +hmarginratio: 1:1 +vmarginratio: 2:3 +lines: -- +heightrounded: -- +bindingoffset: 0.0pt +truedimen: -- +includehead: -- +includefoot: -- +includemp: -- +driver: +-------------------- Page layout dimensions and switches +\paperwidth 597.50787pt +\paperheight 845.04684pt +\textwidth 349.0pt +\textheight 650.66685pt +\oddsidemargin 17.3571pt +\evensidemargin 17.3571pt +\topmargin 0.0pt +\headheight 0.0pt +\headsep 0.0pt +\footskip 0.0pt +\marginparwidth 71.0pt +\marginparsep 10.0pt +\columnsep 10.0pt +\skip\footins 10.0pt plus 4.0pt minus 2.0pt +\hoffset 0.0pt +\voffset 0.0pt +\mag 1000 + +(1in=72.27pt, 1cm=28.45pt) +----------------------- + +latex2htmlLength hsize=349.0pt + +latex2htmlLength vsize=650.66685pt + +latex2htmlLength hoffset=0.0pt + +latex2htmlLength voffset=0.0pt + +latex2htmlLength topmargin=0.0pt + +latex2htmlLength topskip=0.00003pt + +latex2htmlLength headheight=0.0pt + +latex2htmlLength headsep=0.0pt + +latex2htmlLength parskip=6.8pt plus 1.36008pt minus 1.36008pt + +latex2htmlLength oddsidemargin=17.3571pt + +latex2htmlLength evensidemargin=17.3571pt + +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 235. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 235. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 235. +l2hSize :tex2html_wrap_inline1028:7.0626pt::0.0pt::7.1201pt. +[1 + + + +] +l2hSize :tex2html_wrap_inline1032:7.48248pt::0.0pt::48.86426pt. +[2 + + +] +l2hSize :tex2html_wrap_inline1981:8.7125pt::8.7125pt::23.6642pt. +[3 + + +] +l2hSize :tex2html_wrap_inline6076:7.5626pt::7.5626pt::14.53923pt. +[4 + + +] +l2hSize :tex2html_wrap_inline6080:7.5626pt::7.5626pt::14.53923pt. +[5 + + +] +l2hSize :tex2html_wrap_inline9064:8.7125pt::8.7125pt::86.9574pt. +[6 + + +] (./images.aux) ) +Here is how much of TeX's memory you used: + 4428 strings out of 94501 + 62627 string characters out of 1175793 + 121207 words of memory out of 1000000 + 7572 multiletter control sequences out of 10000+50000 + 7874 words of font info for 24 fonts, out of 500000 for 2000 + 580 hyphenation exceptions out of 8191 + 28i,5n,21p,200b,182s stack positions out of 1500i,500n,5000p,200000b,5000s + +Output written on images.dvi (6 pages, 3608 bytes). diff --git a/ionconf/images.out b/ionconf/images.out new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/images.pl b/ionconf/images.pl new file mode 100644 index 0000000..6d0ccb4 --- /dev/null +++ b/ionconf/images.pl @@ -0,0 +1,6 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate images original text with physical files. + + +1; + diff --git a/ionconf/images.tex b/ionconf/images.tex new file mode 100644 index 0000000..d950261 --- /dev/null +++ b/ionconf/images.tex @@ -0,0 +1,371 @@ +\batchmode +\documentclass[english,a4paper,11pt,oldtoc,mctitle]{rapport3} +\RequirePackage{ifthen} + + +\usepackage{babel} +\usepackage[latin1]{inputenc} +\usepackage[dvipdfm]{hyperref} +\usepackage{ae} +\usepackage{url} +\usepackage{html} +\usepackage{makeidx} +\usepackage{tabularx} +\usepackage{textcomp} +\usepackage[nottoc]{tocbibind} +\usepackage{enumerate} +\usepackage[a4paper]{geometry} +\usepackage{calc} + + +\urlstyle{rm}% +\providecommand{\centerurl}[1]{\begin{center}\url{#1}\end{center}} + +% +\providecommand{\note}[1]{\color{red}**#1**}% +\providecommand{\file}[1]{\emph{#1}}% +\providecommand{\type}[1]{#1}% +\providecommand{\spec}[1]{#1}% +\providecommand{\indextype}[1]{\index{#1@#1}} + +% +\providecommand{\key}[1]{\textbf{#1}}% +\providecommand{\code}[1]{\texttt{#1}}% +\providecommand{\var}[1]{\texttt{#1}}% +\providecommand{\command}[1]{\texttt{#1}} + +% +\providecommand{\hyperlabel}[1]{\label{#1}}% +\providecommand{\fnref}[1]{\htmlref{\texttt{#1}}{fn:#1}}% +\providecommand{\fnrefx}[2]{\htmlref{\texttt{#2}}{fn:#1.#2}}% +\providecommand{\myhref}[2]{\htmlref{#2}{#1}} + +% +\providecommand{\tabhead}[1]{\hline #1 \\\hline} + + + +% +\newenvironment{function}{ + \begin{description} +}{ + \end{description} +} + +% +\providecommand{\synopsis}[1]{ + \item[Synopsis:] \texttt{#1} +}% +\providecommand{\funcname}[1]{ + \item[Function:] \texttt{#1} +}% +\providecommand{\hookname}[1]{ + \item[Hook name:] \label{#1}\texttt{#1} +}% +\providecommand{\hookparams}[1]{ + \item[Parameters:] \texttt{#1} +} + +% +\newenvironment{funcdesc}{ + \item[Description:] +}{} + + + +% +\providecommand{\xchapter}[1]{\chapter{#1}}% +\providecommand{\xsection}[1]{\section{#1}}% +\providecommand{\xsectionstar}[1]{\section*{#1}}% +\providecommand{\xsubsection}[1]{\subsection{#1}} + + +\title{Configuring and extending Ion3 with Lua} +\author{Tuomo Valkonen \\tuomov at iki.fi} +\date{2006-12-23} + + +\makeindex + + + + +\usepackage[dvips]{color} + + +\pagecolor[gray]{.7} + +\usepackage[latin1]{inputenc} + + + +\makeatletter + +\makeatletter +\count@=\the\catcode`\_ \catcode`\_=8 +\newenvironment{tex2html_wrap}{}{}% +\catcode`\<=12\catcode`\_=\count@ +\newcommand{\providedcommand}[1]{\expandafter\providecommand\csname #1\endcsname}% +\newcommand{\renewedcommand}[1]{\expandafter\providecommand\csname #1\endcsname{}% + \expandafter\renewcommand\csname #1\endcsname}% +\newcommand{\newedenvironment}[1]{\newenvironment{#1}{}{}\renewenvironment{#1}}% +\let\newedcommand\renewedcommand +\let\renewedenvironment\newedenvironment +\makeatother +\let\mathon=$ +\let\mathoff=$ +\ifx\AtBeginDocument\undefined \newcommand{\AtBeginDocument}[1]{}\fi +\newbox\sizebox +\setlength{\hoffset}{0pt}\setlength{\voffset}{0pt} +\addtolength{\textheight}{\footskip}\setlength{\footskip}{0pt} +\addtolength{\textheight}{\topmargin}\setlength{\topmargin}{0pt} +\addtolength{\textheight}{\headheight}\setlength{\headheight}{0pt} +\addtolength{\textheight}{\headsep}\setlength{\headsep}{0pt} +\setlength{\textwidth}{349pt} +\newwrite\lthtmlwrite +\makeatletter +\let\realnormalsize=\normalsize +\global\topskip=2sp +\def\preveqno{}\let\real@float=\@float \let\realend@float=\end@float +\def\@float{\let\@savefreelist\@freelist\real@float} +\def\liih@math{\ifmmode$\else\bad@math\fi} +\def\end@float{\realend@float\global\let\@freelist\@savefreelist} +\let\real@dbflt=\@dbflt \let\end@dblfloat=\end@float +\let\@largefloatcheck=\relax +\let\if@boxedmulticols=\iftrue +\def\@dbflt{\let\@savefreelist\@freelist\real@dbflt} +\def\adjustnormalsize{\def\normalsize{\mathsurround=0pt \realnormalsize + \parindent=0pt\abovedisplayskip=0pt\belowdisplayskip=0pt}% + \def\phantompar{\csname par\endcsname}\normalsize}% +\def\lthtmltypeout#1{{\let\protect\string \immediate\write\lthtmlwrite{#1}}}% +\newcommand\lthtmlhboxmathA{\adjustnormalsize\setbox\sizebox=\hbox\bgroup\kern.05em }% +\newcommand\lthtmlhboxmathB{\adjustnormalsize\setbox\sizebox=\hbox to\hsize\bgroup\hfill }% +\newcommand\lthtmlvboxmathA{\adjustnormalsize\setbox\sizebox=\vbox\bgroup % + \let\ifinner=\iffalse \let\)\liih@math }% +\newcommand\lthtmlboxmathZ{\@next\next\@currlist{}{\def\next{\voidb@x}}% + \expandafter\box\next\egroup}% +\newcommand\lthtmlmathtype[1]{\gdef\lthtmlmathenv{#1}}% +\newcommand\lthtmllogmath{\dimen0\ht\sizebox \advance\dimen0\dp\sizebox + \ifdim\dimen0>.95\vsize + \lthtmltypeout{% +*** image for \lthtmlmathenv\space is too tall at \the\dimen0, reducing to .95 vsize ***}% + \ht\sizebox.95\vsize \dp\sizebox\z@ \fi + \lthtmltypeout{l2hSize % +:\lthtmlmathenv:\the\ht\sizebox::\the\dp\sizebox::\the\wd\sizebox.\preveqno}}% +\newcommand\lthtmlfigureA[1]{\let\@savefreelist\@freelist + \lthtmlmathtype{#1}\lthtmlvboxmathA}% +\newcommand\lthtmlpictureA{\bgroup\catcode`\_=8 \lthtmlpictureB}% +\newcommand\lthtmlpictureB[1]{\lthtmlmathtype{#1}\egroup + \let\@savefreelist\@freelist \lthtmlhboxmathB}% +\newcommand\lthtmlpictureZ[1]{\hfill\lthtmlfigureZ}% +\newcommand\lthtmlfigureZ{\lthtmlboxmathZ\lthtmllogmath\copy\sizebox + \global\let\@freelist\@savefreelist}% +\newcommand\lthtmldisplayA{\bgroup\catcode`\_=8 \lthtmldisplayAi}% +\newcommand\lthtmldisplayAi[1]{\lthtmlmathtype{#1}\egroup\lthtmlvboxmathA}% +\newcommand\lthtmldisplayB[1]{\edef\preveqno{(\theequation)}% + \lthtmldisplayA{#1}\let\@eqnnum\relax}% +\newcommand\lthtmldisplayZ{\lthtmlboxmathZ\lthtmllogmath\lthtmlsetmath}% +\newcommand\lthtmlinlinemathA{\bgroup\catcode`\_=8 \lthtmlinlinemathB} +\newcommand\lthtmlinlinemathB[1]{\lthtmlmathtype{#1}\egroup\lthtmlhboxmathA + \vrule height1.5ex width0pt }% +\newcommand\lthtmlinlineA{\bgroup\catcode`\_=8 \lthtmlinlineB}% +\newcommand\lthtmlinlineB[1]{\lthtmlmathtype{#1}\egroup\lthtmlhboxmathA}% +\newcommand\lthtmlinlineZ{\egroup\expandafter\ifdim\dp\sizebox>0pt % + \expandafter\centerinlinemath\fi\lthtmllogmath\lthtmlsetinline} +\newcommand\lthtmlinlinemathZ{\egroup\expandafter\ifdim\dp\sizebox>0pt % + \expandafter\centerinlinemath\fi\lthtmllogmath\lthtmlsetmath} +\newcommand\lthtmlindisplaymathZ{\egroup % + \centerinlinemath\lthtmllogmath\lthtmlsetmath} +\def\lthtmlsetinline{\hbox{\vrule width.1em \vtop{\vbox{% + \kern.1em\copy\sizebox}\ifdim\dp\sizebox>0pt\kern.1em\else\kern.3pt\fi + \ifdim\hsize>\wd\sizebox \hrule depth1pt\fi}}} +\def\lthtmlsetmath{\hbox{\vrule width.1em\kern-.05em\vtop{\vbox{% + \kern.1em\kern0.8 pt\hbox{\hglue.17em\copy\sizebox\hglue0.8 pt}}\kern.3pt% + \ifdim\dp\sizebox>0pt\kern.1em\fi \kern0.8 pt% + \ifdim\hsize>\wd\sizebox \hrule depth1pt\fi}}} +\def\centerinlinemath{% + \dimen1=\ifdim\ht\sizebox<\dp\sizebox \dp\sizebox\else\ht\sizebox\fi + \advance\dimen1by.5pt \vrule width0pt height\dimen1 depth\dimen1 + \dp\sizebox=\dimen1\ht\sizebox=\dimen1\relax} + +\def\lthtmlcheckvsize{\ifdim\ht\sizebox<\vsize + \ifdim\wd\sizebox<\hsize\expandafter\hfill\fi \expandafter\vfill + \else\expandafter\vss\fi}% +\providecommand{\selectlanguage}[1]{}% +\makeatletter \tracingstats = 1 + + +\begin{document} +\pagestyle{empty}\thispagestyle{empty}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength hsize=\the\hsize}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength vsize=\the\vsize}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength hoffset=\the\hoffset}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength voffset=\the\voffset}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength topmargin=\the\topmargin}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength topskip=\the\topskip}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength headheight=\the\headheight}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength headsep=\the\headsep}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength parskip=\the\parskip}\lthtmltypeout{}% +\lthtmltypeout{latex2htmlLength oddsidemargin=\the\oddsidemargin}\lthtmltypeout{}% +\makeatletter +\if@twoside\lthtmltypeout{latex2htmlLength evensidemargin=\the\evensidemargin}% +\else\lthtmltypeout{latex2htmlLength evensidemargin=\the\oddsidemargin}\fi% +\lthtmltypeout{}% +\makeatother +\setcounter{page}{1} +\onecolumn + +% !!! IMAGES START HERE !!! + +\stepcounter{chapter} +\stepcounter{chapter} +\stepcounter{section} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{subsection} +\stepcounter{chapter} +\stepcounter{section} +\stepcounter{section} +\stepcounter{section} +{\newpage\clearpage +\lthtmlinlinemathA{tex2html_wrap_inline1028}% +$n$% +\lthtmlinlinemathZ +\lthtmlcheckvsize\clearpage} + +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +{\newpage\clearpage +\lthtmlinlinemathA{tex2html_wrap_inline1032}% +$N=1{\ldots} 5$% +\lthtmlinlinemathZ +\lthtmlcheckvsize\clearpage} + +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{section} + + +\newedenvironment{winprop}[2]{ + + \begin{description} +% + \item[Winprop:] \texttt{#1} (#2) + \item[Description:] +} +{ + + \end{description} +}% + +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{chapter} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{subsubsection} +\stepcounter{subsection} +\stepcounter{section} +\stepcounter{subsection} +{\newpage\clearpage +\lthtmlinlinemathA{tex2html_wrap_inline1981}% +$(0, 1]$% +\lthtmlinlinemathZ +\lthtmlcheckvsize\clearpage} + +\stepcounter{subsection} +\stepcounter{chapter} +\stepcounter{section} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{section} +\stepcounter{section} +\stepcounter{chapter} +\stepcounter{section} +{\newpage\clearpage +\lthtmlinlinemathA{tex2html_wrap_inline6076}% +$-1$% +\lthtmlinlinemathZ +\lthtmlcheckvsize\clearpage} + +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +{\newpage\clearpage +\lthtmlinlinemathA{tex2html_wrap_inline6080}% +$-2$% +\lthtmlinlinemathZ +\lthtmlcheckvsize\clearpage} + +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{subsection} +\stepcounter{section} +\stepcounter{subsection} +\stepcounter{section} +\stepcounter{subsection} +{\newpage\clearpage +\lthtmlinlinemathA{tex2html_wrap_inline9064}% +$\{t,m,b\}\times\{t,c,b\}$% +\lthtmlinlinemathZ +\lthtmlcheckvsize\clearpage} + +\stepcounter{section} +\stepcounter{section} +\stepcounter{section} +\appendix +\stepcounter{chapter} +\addtocounter{enumi}{-1} +\stepcounter{chapter} + +% +\providecommand{\fnlisti}[1]{\htmlref{\texttt{#1}}{fn:#1}\\}% + + +\end{document} diff --git a/ionconf/img1.png b/ionconf/img1.png new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/img2.png b/ionconf/img2.png new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/img3.png b/ionconf/img3.png new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/img4.png b/ionconf/img4.png new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/img5.png b/ionconf/img5.png new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/img6.png b/ionconf/img6.png new file mode 100644 index 0000000..e69de29 diff --git a/ionconf/index.html b/ionconf/index.html new file mode 100644 index 0000000..7a0a20d --- /dev/null +++ b/ionconf/index.html @@ -0,0 +1,341 @@ + + + + + +Configuring and extending Ion3 with Lua + + + + + + + + + + + + + + + + + + + +

+

Configuring and extending Ion3 with Lua

+
+ +

Tuomo Valkonen

+

tuomov at iki.fi

+

2006-12-23

+
+ +

+Configuring and extending Ion3 with Lua +
+Copyright © 2003-2005 Tuomo Valkonen. + +

+This document is free; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +

+This document is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +chapter entitled ''GNU General Public License'' for more details. + +

+


+ + + + + +

+ + + diff --git a/ionconf/index.png b/ionconf/index.png new file mode 100644 index 0000000..698f09c Binary files /dev/null and b/ionconf/index.png differ diff --git a/ionconf/internals.pl b/ionconf/internals.pl new file mode 100644 index 0000000..d2d476e --- /dev/null +++ b/ionconf/internals.pl @@ -0,0 +1,1306 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate internals original text with physical files. + + +$key = q/sec:queryref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.version/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_nth/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.select_engine/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_window_property/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.context/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_exec/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_first/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.insstr/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.quote_next/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_renameworkspace/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.is_shaded/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_activity/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.farthest/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.create_ws/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.finish/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bskip_word/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.mark/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_prev/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.unsplit_at/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.dec_index/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.current/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:hookref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:config/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.kpress/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_mapped/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.is_fullscreen/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_prev_screen/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.transpose_words/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:ioncoreref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defbindings/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.p_resize/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WComplProxy.set_completions/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.shutdown/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getbindings/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:styles/; +$ref_files{$key} = "$dir".q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.get_stdisp/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defmenu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_get_winprop_fn/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:borders/; +$ref_files{$key} = "$dir".q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.navi_next/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.reset/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_get/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_script/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WScreen.id/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_mode/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.resize/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_nth/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.mode/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.warn_traced/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_next/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:modules/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.tl/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.mkbottom/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defctxmenu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_selection/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.scrollup/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_name_exact/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_nth/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.prev_completion/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.exec_on/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.menuentry/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.forward/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.menu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.set/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_sp.set_shown/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.find_screen_id/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:bindings/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInfoWin.set_text/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.snapshot/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_do_warp_alt/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.resign/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_unmapped_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.write_savefile/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/panews_make_placement_alt/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:exports/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:hooks/; +$ref_files{$key} = "$dir".q|node6.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.xid/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.activity_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.get_ident/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:classhierarchy/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_sp.set_shown_on/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.set_floating/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.history_prev/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:binddef/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_to_eol/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_editfile/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.read_config/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_at/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.p_tabdrag/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.screen_of/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_next/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.bottom/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_search/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.node_of/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRootWin.current_scr/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.navi_first/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_to_bol/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.load_module/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menuref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menudisp/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.maximize_vert/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitInner.current/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.attach/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_tagged/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/app:fullhierarchy/; +$ref_files{$key} = "$dir".q|node9.html|; +$noresave{$key} = "$nosave"; + +$key = q/frame_managed_changed_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:tricks/; +$ref_files{$key} = "$dir".q|node6.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_savefile/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_push/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.get/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_clientwin/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.restart/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_set_text_property/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:winprops/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.parent/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getctxmenu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_inactivated_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.maximize_horiz/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.p_move/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:objects/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WScreen.set_managed_offset/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.set/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_dir_for/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.point/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_prev/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_next/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:engines/; +$ref_files{$key} = "$dir".q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.pmenu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_dock.set_floating_shown_on/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_ssh/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_atom_name/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_workspace/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.typeahead_clear/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.copy/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.rqgeom/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.tags_first/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.set_mark/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/screen_managed_changed_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_count/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:managership/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_menu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.move/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.get/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.flip_at/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_region/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defshortening/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.refresh_stylelist/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.show_about_ion/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.inc_index/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_delete_property/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqclose/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_activity/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_runfile/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.set_context/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.show_tree/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.contents/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.exec/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.region_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_current/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.message/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.compile_cmd/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:deref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bol/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.submenu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach_tagged/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.br/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.managed_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:string.shell_safe/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_restart/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.managed_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.set/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.backspace/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.defstyle/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroupWS.attach_framed/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:dockref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.set_floating_at/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.warn/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.current/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqclose_propagate/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.clear_mark/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/tiling_placement_alt/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.warn/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.begin_kbresize/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:classesrolesinstances/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_tagged/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.next_completion/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_hidden/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.cancel/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.nudge/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_nth_screen/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_mapped_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.set_fullscreen/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.paste/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.xid/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.name/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_text_property/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_attachclient/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.append/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mclick/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_index/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_clear/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.p_switch_tab/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_intern_atom/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.finish/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_gotoclient/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_deinit_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.geom/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_previous/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.find_manager/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_paths/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:walkthrough/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_numbers/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.cancel/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.submap/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_active/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bkill_word/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach_new/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.attach/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mdblclick/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.flip/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_top/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_activity_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.progname/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.popen_completions/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defwinprop/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.popen_bgread/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mdrag/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.kill/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.transpose/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_snapshot_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.clear_tags/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.map/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.dir/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_shaded/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_stdisp/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.manager/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_change_property/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.cancel/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.parent/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.finish/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.back/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.TR/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menus/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_renameframe/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.geom/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.kpress_wait/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_do_manage_alt/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rootwin_of/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.transpose_at/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_sigchld_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.match_winprop_name/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.nextto/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.get/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.substyle/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.copy/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.is_histcompl/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getmenu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.is_i18n/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.refresh/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqorder/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.grabmenu/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitRegion.reg/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.size_hints/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.delete/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getwinprop/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.tagged_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.request_selection/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_man/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.cut/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.goto/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_next_screen/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_paths/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:conffiles/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.clientwin_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.aboutmsg/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:prelim/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.managed_list/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:parentship/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.read_savefile/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.restart_other/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_activity/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqgeom/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.scrolldown/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_activated_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_table/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:defaultde/; +$ref_files{$key} = "$dir".q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mpress/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:tilingref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.detach/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_name/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.join/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.activity_first/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:spref/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.is_hidden/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.get/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_yesno/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.history_next/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.eol/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.defcmd/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.bdoc/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.chdir_for/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_lua/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:export/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:gr/; +$ref_files{$key} = "$dir".q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.set/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_word/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.defstyle_rootwin/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_post_layout_setup_hook/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.icat/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_line/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.resize/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_shutdown/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.get_index/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.skip_word/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.complete/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.attach_new/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.transpose_chars/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_tree/; +$ref_files{$key} = "$dir".q|node7.html|; +$noresave{$key} = "$nosave"; + +1; + diff --git a/ionconf/ionconf.css b/ionconf/ionconf.css new file mode 100644 index 0000000..f0cd026 --- /dev/null +++ b/ionconf/ionconf.css @@ -0,0 +1,38 @@ +/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ +.MATH { font-family: "Century Schoolbook", serif; } +.MATH I { font-family: "Century Schoolbook", serif; font-style: italic } +.BOLDMATH { font-family: "Century Schoolbook", serif; font-weight: bold } + +/* implement both fixed-size and relative sizes */ +SMALL.XTINY { font-size : xx-small } +SMALL.TINY { font-size : x-small } +SMALL.SCRIPTSIZE { font-size : smaller } +SMALL.FOOTNOTESIZE { font-size : small } +SMALL.SMALL { } +BIG.LARGE { } +BIG.XLARGE { font-size : large } +BIG.XXLARGE { font-size : x-large } +BIG.HUGE { font-size : larger } +BIG.XHUGE { font-size : xx-large } + +/* heading styles */ +H1 { } +H2 { } +H3 { } +H4 { } +H5 { } + +/* mathematics styles */ +DIV.displaymath { } /* math displays */ +TD.eqno { } /* equation-number cells */ + + +/* document-specific styles come next */ +DIV.navigation { } +DIV.center { } +SPAN.sc { } +DIV.quote { } +PRE.preform { } +SPAN.textit { font-style: italic } +SPAN.arabic { } +SPAN.textbf { font-weight: bold } diff --git a/ionconf/ionconf.html b/ionconf/ionconf.html new file mode 100644 index 0000000..7a0a20d --- /dev/null +++ b/ionconf/ionconf.html @@ -0,0 +1,341 @@ + + + + + +Configuring and extending Ion3 with Lua + + + + + + + + + + + + + + + + + + + +

+

Configuring and extending Ion3 with Lua

+
+ +

Tuomo Valkonen

+

tuomov at iki.fi

+

2006-12-23

+
+ +

+Configuring and extending Ion3 with Lua +
+Copyright © 2003-2005 Tuomo Valkonen. + +

+This document is free; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +

+This document is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +chapter entitled ''GNU General Public License'' for more details. + +

+


+ + + + + +

+ + + diff --git a/ionconf/labels.pl b/ionconf/labels.pl new file mode 100644 index 0000000..cbfa297 --- /dev/null +++ b/ionconf/labels.pl @@ -0,0 +1,2613 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate labels original text with physical files. + + +$key = q/sec:queryref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.version/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_nth/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.select_engine/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_window_property/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.context/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_exec/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_first/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.insstr/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.quote_next/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_renameworkspace/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.is_shaded/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_activity/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.farthest/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.create_ws/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.finish/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bskip_word/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.mark/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_prev/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.unsplit_at/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.dec_index/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.current/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:hookref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:config/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.kpress/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_mapped/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.is_fullscreen/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_prev_screen/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.transpose_words/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:ioncoreref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defbindings/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.p_resize/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WComplProxy.set_completions/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.shutdown/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getbindings/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:styles/; +$external_labels{$key} = "$URL/" . q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.get_stdisp/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defmenu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_get_winprop_fn/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:borders/; +$external_labels{$key} = "$URL/" . q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.navi_next/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.reset/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_get/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_script/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WScreen.id/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_mode/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.resize/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_nth/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.mode/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.warn_traced/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_next/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:modules/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.tl/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.mkbottom/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defctxmenu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_selection/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.scrollup/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_name_exact/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_nth/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.prev_completion/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.exec_on/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.menuentry/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.forward/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.menu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.set/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_sp.set_shown/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.find_screen_id/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:bindings/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInfoWin.set_text/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.snapshot/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_do_warp_alt/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.resign/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_unmapped_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.write_savefile/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/panews_make_placement_alt/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:exports/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:hooks/; +$external_labels{$key} = "$URL/" . q|node6.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.xid/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.activity_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.get_ident/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:classhierarchy/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_sp.set_shown_on/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.set_floating/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.history_prev/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:binddef/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_to_eol/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_editfile/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.read_config/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_at/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.p_tabdrag/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.screen_of/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_next/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.bottom/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_search/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.node_of/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRootWin.current_scr/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.navi_first/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_to_bol/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.load_module/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menuref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menudisp/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.maximize_vert/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitInner.current/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.attach/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_tagged/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/app:fullhierarchy/; +$external_labels{$key} = "$URL/" . q|node9.html|; +$noresave{$key} = "$nosave"; + +$key = q/frame_managed_changed_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:tricks/; +$external_labels{$key} = "$URL/" . q|node6.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_savefile/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_push/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.get/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_clientwin/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.restart/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_set_text_property/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:winprops/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.parent/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getctxmenu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_inactivated_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.maximize_horiz/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.p_move/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:objects/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WScreen.set_managed_offset/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.set/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_dir_for/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.point/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_prev/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_next/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:engines/; +$external_labels{$key} = "$URL/" . q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.pmenu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_dock.set_floating_shown_on/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_ssh/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_atom_name/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_workspace/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.typeahead_clear/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.copy/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.rqgeom/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.tags_first/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.set_mark/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/screen_managed_changed_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_count/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:managership/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_menu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.move/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.get/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.flip_at/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_region/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defshortening/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.refresh_stylelist/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.show_about_ion/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.inc_index/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_delete_property/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqclose/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_activity/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_runfile/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.set_context/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.show_tree/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.contents/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.exec/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.region_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_current/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.message/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.compile_cmd/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:deref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bol/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.submenu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach_tagged/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.br/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.managed_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:string.shell_safe/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_restart/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.managed_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.set/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.backspace/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.defstyle/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroupWS.attach_framed/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:dockref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.set_floating_at/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.warn/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.current/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqclose_propagate/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.clear_mark/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/tiling_placement_alt/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.warn/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.begin_kbresize/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:classesrolesinstances/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_tagged/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.next_completion/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_hidden/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.cancel/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.nudge/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_nth_screen/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_mapped_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.set_fullscreen/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.paste/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.xid/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.name/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_text_property/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_attachclient/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.append/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mclick/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_index/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_clear/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.p_switch_tab/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_intern_atom/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.finish/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_gotoclient/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_deinit_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.geom/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_previous/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.find_manager/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_paths/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:walkthrough/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_numbers/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.cancel/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.submap/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_active/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bkill_word/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach_new/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.attach/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mdblclick/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.flip/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_top/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_activity_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.progname/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.popen_completions/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defwinprop/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.popen_bgread/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mdrag/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.kill/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.transpose/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_snapshot_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.clear_tags/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.map/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.dir/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_shaded/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_stdisp/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.manager/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_change_property/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.cancel/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.parent/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.finish/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.back/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.TR/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menus/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_renameframe/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.geom/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.kpress_wait/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_do_manage_alt/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rootwin_of/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.transpose_at/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_sigchld_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.match_winprop_name/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.nextto/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.get/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.substyle/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.copy/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.is_histcompl/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getmenu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.is_i18n/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.refresh/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqorder/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.grabmenu/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitRegion.reg/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.size_hints/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.delete/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getwinprop/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.tagged_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.request_selection/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_man/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.cut/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.goto/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_next_screen/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_paths/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:conffiles/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.clientwin_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.aboutmsg/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:prelim/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.managed_list/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:parentship/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.read_savefile/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.restart_other/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_activity/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqgeom/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.scrolldown/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/region_activated_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_table/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:defaultde/; +$external_labels{$key} = "$URL/" . q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mpress/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:tilingref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.detach/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_name/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.join/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.activity_first/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:spref/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.is_hidden/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.get/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_yesno/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.history_next/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.eol/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.defcmd/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.bdoc/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.chdir_for/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_lua/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:export/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/chap:gr/; +$external_labels{$key} = "$URL/" . q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.set/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_word/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.defstyle_rootwin/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_post_layout_setup_hook/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.icat/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_line/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.resize/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_shutdown/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.get_index/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.skip_word/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.complete/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.attach_new/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.transpose_chars/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_tree/; +$external_labels{$key} = "$URL/" . q|node7.html|; +$noresave{$key} = "$nosave"; + +1; + + +# LaTeX2HTML 2002-2-1 (1.71) +# labels from external_latex_labels array. + + +$key = q/sec:queryref/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.version/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_nth/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.select_engine/; +$external_latex_labels{$key} = q|6.1.14|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_window_property/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.context/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_exec/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_first/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.insstr/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.quote_next/; +$external_latex_labels{$key} = q|6.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_renameworkspace/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.is_shaded/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_list/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_activity/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.farthest/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.create_ws/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.finish/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bskip_word/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.mark/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_prev/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.unsplit_at/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.dec_index/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.current/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:hookref/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/chap:config/; +$external_latex_labels{$key} = q|3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.kpress/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_mapped/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.is_fullscreen/; +$external_latex_labels{$key} = q|6.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_prev_screen/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.transpose_words/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/sec:ioncoreref/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defbindings/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.p_resize/; +$external_latex_labels{$key} = q|6.1.12|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WComplProxy.set_completions/; +$external_latex_labels{$key} = q|6.3.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.shutdown/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getbindings/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/sec:styles/; +$external_latex_labels{$key} = q|4.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.get_stdisp/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defmenu/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_get_winprop_fn/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fig:borders/; +$external_latex_labels{$key} = q|4.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.navi_next/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.reset/; +$external_latex_labels{$key} = q|6.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_get/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_script/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WScreen.id/; +$external_latex_labels{$key} = q|6.1.11|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_mode/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.resize/; +$external_latex_labels{$key} = q|6.1.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_nth/; +$external_latex_labels{$key} = q|6.4.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.mode/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.warn_traced/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_next/; +$external_latex_labels{$key} = q|6.4.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:modules/; +$external_latex_labels{$key} = q|2.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.tl/; +$external_latex_labels{$key} = q|6.2.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.mkbottom/; +$external_latex_labels{$key} = q|6.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defctxmenu/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_selection/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.scrollup/; +$external_latex_labels{$key} = q|6.3.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_name_exact/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_nth/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.prev_completion/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.exec_on/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.menuentry/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.forward/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.menu/; +$external_latex_labels{$key} = q|6.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.set/; +$external_latex_labels{$key} = q|6.5.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_sp.set_shown/; +$external_latex_labels{$key} = q|6.6|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.find_screen_id/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:bindings/; +$external_latex_labels{$key} = q|3.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInfoWin.set_text/; +$external_latex_labels{$key} = q|6.1.6|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.snapshot/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/region_do_warp_alt/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.resign/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_unmapped_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.write_savefile/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/panews_make_placement_alt/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/sec:exports/; +$external_latex_labels{$key} = q|6|; +$noresave{$key} = "$nosave"; + +$key = q/sec:hooks/; +$external_latex_labels{$key} = q|5.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.xid/; +$external_latex_labels{$key} = q|6.1.12|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.activity_list/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.get_ident/; +$external_latex_labels{$key} = q|6.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fig:classhierarchy/; +$external_latex_labels{$key} = q|2.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_sp.set_shown_on/; +$external_latex_labels{$key} = q|6.6|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.set_floating/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.history_prev/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/sec:binddef/; +$external_latex_labels{$key} = q|3.3.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_to_eol/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_editfile/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.read_config/; +$external_latex_labels{$key} = q|6.1.14|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_at/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.p_tabdrag/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.screen_of/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.switch_next/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.bottom/; +$external_latex_labels{$key} = q|6.1.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_search/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.node_of/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRootWin.current_scr/; +$external_latex_labels{$key} = q|6.1.10|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.navi_first/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_to_bol/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.load_module/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menuref/; +$external_latex_labels{$key} = q|6.4|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menudisp/; +$external_latex_labels{$key} = q|3.4.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.maximize_vert/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitInner.current/; +$external_latex_labels{$key} = q|6.2.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.attach/; +$external_latex_labels{$key} = q|6.5.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_tagged/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/app:fullhierarchy/; +$external_latex_labels{$key} = q|B|; +$noresave{$key} = "$nosave"; + +$key = q/frame_managed_changed_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/chap:tricks/; +$external_latex_labels{$key} = q|5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_savefile/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_push/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.get/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_clientwin/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.restart/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_set_text_property/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:winprops/; +$external_latex_labels{$key} = q|3.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.parent/; +$external_latex_labels{$key} = q|6.2.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getctxmenu/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/region_inactivated_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.maximize_horiz/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WWindow.p_move/; +$external_latex_labels{$key} = q|6.1.12|; +$noresave{$key} = "$nosave"; + +$key = q/sec:objects/; +$external_latex_labels{$key} = q|2.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WScreen.set_managed_offset/; +$external_latex_labels{$key} = q|6.1.11|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.set/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_dir_for/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.point/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.select_prev/; +$external_latex_labels{$key} = q|6.4.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_next/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:engines/; +$external_latex_labels{$key} = q|4.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.pmenu/; +$external_latex_labels{$key} = q|6.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_dock.set_floating_shown_on/; +$external_latex_labels{$key} = q|6.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_ssh/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_atom_name/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_workspace/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.typeahead_clear/; +$external_latex_labels{$key} = q|6.4.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.copy/; +$external_latex_labels{$key} = q|6.1.16|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.rqgeom/; +$external_latex_labels{$key} = q|6.2.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.tags_first/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.set_mark/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/screen_managed_changed_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_count/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fig:managership/; +$external_latex_labels{$key} = q|2.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_menu/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.move/; +$external_latex_labels{$key} = q|6.1.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.get/; +$external_latex_labels{$key} = q|6.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.flip_at/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.lookup_region/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defshortening/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.refresh_stylelist/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.show_about_ion/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.inc_index/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_delete_property/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqclose/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_activity/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_runfile/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.set_context/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.show_tree/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.contents/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.exec/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.region_list/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.mx_current/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.message/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.compile_cmd/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:deref/; +$external_latex_labels{$key} = q|6.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bol/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.submenu/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach_tagged/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.br/; +$external_latex_labels{$key} = q|6.2.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.managed_list/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:string.shell_safe/; +$external_latex_labels{$key} = q|6.1.15|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_restart/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.managed_list/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.set/; +$external_latex_labels{$key} = q|6.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.backspace/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.defstyle/; +$external_latex_labels{$key} = q|6.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroupWS.attach_framed/; +$external_latex_labels{$key} = q|6.1.5|; +$noresave{$key} = "$nosave"; + +$key = q/sec:dockref/; +$external_latex_labels{$key} = q|6.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.set_floating_at/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.warn/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.current/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqclose_propagate/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.clear_mark/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/tiling_placement_alt/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.warn/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.begin_kbresize/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/sec:classesrolesinstances/; +$external_latex_labels{$key} = q|3.5.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_tagged/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.next_completion/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_hidden/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.cancel/; +$external_latex_labels{$key} = q|6.4.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.nudge/; +$external_latex_labels{$key} = q|6.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_nth_screen/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_mapped_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.set_fullscreen/; +$external_latex_labels{$key} = q|6.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.paste/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.xid/; +$external_latex_labels{$key} = q|6.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.name/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_get_text_property/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_attachclient/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.append/; +$external_latex_labels{$key} = q|6.1.16|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mclick/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_index/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_clear/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.p_switch_tab/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_intern_atom/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.finish/; +$external_latex_labels{$key} = q|6.1.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_gotoclient/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_deinit_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.geom/; +$external_latex_labels{$key} = q|6.2.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_previous/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.find_manager/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.get_paths/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:walkthrough/; +$external_latex_labels{$key} = q|3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_numbers/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMoveresMode.cancel/; +$external_latex_labels{$key} = q|6.1.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.submap/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_active/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.bkill_word/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.attach_new/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.attach/; +$external_latex_labels{$key} = q|6.1.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mdblclick/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.flip/; +$external_latex_labels{$key} = q|6.2.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_top/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/region_activity_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.progname/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.popen_completions/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.defwinprop/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.popen_bgread/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mdrag/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WClientWin.kill/; +$external_latex_labels{$key} = q|6.1.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplit.transpose/; +$external_latex_labels{$key} = q|6.2.1|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_snapshot_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.clear_tags/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.map/; +$external_latex_labels{$key} = q|6.1.16|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitSplit.dir/; +$external_latex_labels{$key} = q|6.2.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WFrame.set_shaded/; +$external_latex_labels{$key} = q|6.1.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.set_stdisp/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.manager/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.x_change_property/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.cancel/; +$external_latex_labels{$key} = q|6.3.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.parent/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMenu.finish/; +$external_latex_labels{$key} = q|6.4.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.back/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.TR/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:menus/; +$external_latex_labels{$key} = q|3.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_renameframe/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.geom/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.kpress_wait/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/clientwin_do_manage_alt/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rootwin_of/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.transpose_at/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_sigchld_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.match_winprop_name/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.nextto/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.get/; +$external_latex_labels{$key} = q|6.5.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.substyle/; +$external_latex_labels{$key} = q|6.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.copy/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.is_histcompl/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getmenu/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.is_i18n/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:gr.refresh/; +$external_latex_labels{$key} = q|6.1.14|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqorder/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.grabmenu/; +$external_latex_labels{$key} = q|6.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WSplitRegion.reg/; +$external_latex_labels{$key} = q|6.2.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.size_hints/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.delete/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.getwinprop/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.tagged_list/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.request_selection/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_man/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.cut/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.goto/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.goto_next_screen/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set_paths/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:conffiles/; +$external_latex_labels{$key} = q|3.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.clientwin_list/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.aboutmsg/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/chap:prelim/; +$external_latex_labels{$key} = q|2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.managed_list/; +$external_latex_labels{$key} = q|6.1.3|; +$noresave{$key} = "$nosave"; + +$key = q/fig:parentship/; +$external_latex_labels{$key} = q|2.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.read_savefile/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.restart_other/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.is_activity/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.rqgeom/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WInput.scrolldown/; +$external_latex_labels{$key} = q|6.3.3|; +$noresave{$key} = "$nosave"; + +$key = q/region_activated_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.history_table/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/sec:defaultde/; +$external_latex_labels{$key} = q|4.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.set/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.mpress/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:tilingref/; +$external_latex_labels{$key} = q|6.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_tiling.detach/; +$external_latex_labels{$key} = q|6.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WRegion.set_name/; +$external_latex_labels{$key} = q|6.1.9|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.join/; +$external_latex_labels{$key} = q|6.1.16|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.activity_first/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:spref/; +$external_latex_labels{$key} = q|6.6|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.is_hidden/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.get/; +$external_latex_labels{$key} = q|6.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_yesno/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.history_next/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.eol/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.defcmd/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.bdoc/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:ioncore.chdir_for/; +$external_latex_labels{$key} = q|6.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_lua/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:export/; +$external_latex_labels{$key} = q|6.1.13|; +$noresave{$key} = "$nosave"; + +$key = q/chap:gr/; +$external_latex_labels{$key} = q|4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_menu.set/; +$external_latex_labels{$key} = q|6.4|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_word/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:de.defstyle_rootwin/; +$external_latex_labels{$key} = q|6.7|; +$noresave{$key} = "$nosave"; + +$key = q/ioncore_post_layout_setup_hook/; +$external_latex_labels{$key} = q|6.8|; +$noresave{$key} = "$nosave"; + +$key = q/fn:table.icat/; +$external_latex_labels{$key} = q|6.1.16|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.kill_line/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WDock.resize/; +$external_latex_labels{$key} = q|6.5.1|; +$noresave{$key} = "$nosave"; + +$key = q/fn:mod_query.query_shutdown/; +$external_latex_labels{$key} = q|6.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WMPlex.get_index/; +$external_latex_labels{$key} = q|6.1.7|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.skip_word/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.complete/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WGroup.attach_new/; +$external_latex_labels{$key} = q|6.1.3|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WEdln.transpose_chars/; +$external_latex_labels{$key} = q|6.3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fn:WTiling.split_tree/; +$external_latex_labels{$key} = q|6.2.5|; +$noresave{$key} = "$nosave"; + +1; + diff --git a/ionconf/next.png b/ionconf/next.png new file mode 100644 index 0000000..1628652 Binary files /dev/null and b/ionconf/next.png differ diff --git a/ionconf/next_g.png b/ionconf/next_g.png new file mode 100644 index 0000000..9d3f591 Binary files /dev/null and b/ionconf/next_g.png differ diff --git a/ionconf/node1.html b/ionconf/node1.html new file mode 100644 index 0000000..ee25b4d --- /dev/null +++ b/ionconf/node1.html @@ -0,0 +1,276 @@ + + + + + +Contents + + + + + + + + + + + + + + + + + + + + + +
+ +

+Contents +

+ + + + +

+ +

+


+ + + diff --git a/ionconf/node10.html b/ionconf/node10.html new file mode 100644 index 0000000..f33c3b7 --- /dev/null +++ b/ionconf/node10.html @@ -0,0 +1,377 @@ + + + + + +List of functions + + + + + + + + + + + + + + + + + + + + + + +

+List of functions +

+ +

+ +de.defstyle +
de.defstyle_rootwin +
de.reset +
de.substyle +
export +
gr.read_config +
gr.refresh +
gr.select_engine +
ioncore.aboutmsg +
ioncore.activity_first +
ioncore.activity_list +
ioncore.bdoc +
ioncore.chdir_for +
ioncore.clear_tags +
ioncore.clientwin_list +
ioncore.compile_cmd +
ioncore.create_ws +
ioncore.current +
ioncore.defbindings +
ioncore.defctxmenu +
ioncore.defmenu +
ioncore.defshortening +
ioncore.defwinprop +
ioncore.exec +
ioncore.exec_on +
ioncore.find_manager +
ioncore.find_screen_id +
ioncore.get +
ioncore.getbindings +
ioncore.getctxmenu +
ioncore.get_dir_for +
ioncore.getmenu +
ioncore.get_paths +
ioncore.get_savefile +
ioncore.getwinprop +
ioncore.goto_activity +
ioncore.goto_first +
ioncore.goto_next +
ioncore.goto_next_screen +
ioncore.goto_nth_screen +
ioncore.goto_previous +
ioncore.goto_prev_screen +
ioncore.is_i18n +
ioncore.kpress +
ioncore.kpress_wait +
ioncore.load_module +
ioncore.lookup_clientwin +
ioncore.lookup_region +
ioncore.lookup_script +
ioncore.match_winprop_name +
ioncore.mclick +
ioncore.mdblclick +
ioncore.mdrag +
ioncore.menuentry +
ioncore.mpress +
ioncore.navi_first +
ioncore.navi_next +
ioncore.popen_bgread +
ioncore.progname +
ioncore.read_savefile +
ioncore.refresh_stylelist +
ioncore.region_list +
ioncore.request_selection +
ioncore.resign +
ioncore.restart +
ioncore.restart_other +
ioncore.set +
ioncore.set_get_winprop_fn +
ioncore.set_paths +
ioncore.set_selection +
ioncore.shutdown +
ioncore.snapshot +
ioncore.submap +
ioncore.submenu +
ioncore.tagged_list +
ioncore.tags_first +
ioncore.TR +
ioncore.version +
ioncore.warn +
ioncore.warn_traced +
ioncore.write_savefile +
ioncore.x_change_property +
ioncore.x_delete_property +
ioncore.x_get_atom_name +
ioncore.x_get_text_property +
ioncore.x_get_window_property +
ioncore.x_intern_atom +
ioncore.x_set_text_property +
mod_dock.set_floating_shown_on +
mod_menu.get +
mod_menu.grabmenu +
mod_menu.menu +
mod_menu.pmenu +
mod_menu.set +
mod_query.defcmd +
mod_query.get +
mod_query.history_clear +
mod_query.history_get +
mod_query.history_push +
mod_query.history_search +
mod_query.history_table +
mod_query.message +
mod_query.popen_completions +
mod_query.query +
mod_query.query_attachclient +
mod_query.query_editfile +
mod_query.query_exec +
mod_query.query_gotoclient +
mod_query.query_lua +
mod_query.query_man +
mod_query.query_menu +
mod_query.query_renameframe +
mod_query.query_renameworkspace +
mod_query.query_restart +
mod_query.query_runfile +
mod_query.query_shutdown +
mod_query.query_ssh +
mod_query.query_workspace +
mod_query.query_yesno +
mod_query.set +
mod_query.show_about_ion +
mod_query.show_tree +
mod_query.warn +
mod_sp.set_shown +
mod_sp.set_shown_on +
mod_tiling.detach +
mod_tiling.get +
mod_tiling.mkbottom +
mod_tiling.set +
string.shell_safe +
table.append +
table.copy +
table.icat +
table.join +
table.map +
WClientWin.get_ident +
WClientWin.is_fullscreen +
WClientWin.kill +
WClientWin.nudge +
WClientWin.quote_next +
WClientWin.set_fullscreen +
WClientWin.xid +
WComplProxy.set_completions +
WDock.attach +
WDock.get +
WDock.resize +
WDock.set +
WEdln.back +
WEdln.backspace +
WEdln.bkill_word +
WEdln.bol +
WEdln.bskip_word +
WEdln.clear_mark +
WEdln.complete +
WEdln.contents +
WEdln.context +
WEdln.copy +
WEdln.cut +
WEdln.delete +
WEdln.eol +
WEdln.finish +
WEdln.forward +
WEdln.history_next +
WEdln.history_prev +
WEdln.insstr +
WEdln.is_histcompl +
WEdln.kill_line +
WEdln.kill_to_bol +
WEdln.kill_to_eol +
WEdln.kill_word +
WEdln.mark +
WEdln.next_completion +
WEdln.paste +
WEdln.point +
WEdln.prev_completion +
WEdln.set_context +
WEdln.set_mark +
WEdln.skip_word +
WEdln.transpose_chars +
WEdln.transpose_words +
WFrame.is_shaded +
WFrame.maximize_horiz +
WFrame.maximize_vert +
WFrame.mode +
WFrame.p_switch_tab +
WFrame.p_tabdrag +
WFrame.set_mode +
WFrame.set_numbers +
WFrame.set_shaded +
WGroup.attach +
WGroup.attach_new +
WGroup.bottom +
WGroup.managed_list +
WGroupWS.attach_framed +
WInfoWin.set_text +
WInput.cancel +
WInput.scrolldown +
WInput.scrollup +
WMenu.cancel +
WMenu.finish +
WMenu.select_next +
WMenu.select_nth +
WMenu.select_prev +
WMenu.typeahead_clear +
WMoveresMode.cancel +
WMoveresMode.finish +
WMoveresMode.move +
WMoveresMode.resize +
WMPlex.attach +
WMPlex.attach_new +
WMPlex.attach_tagged +
WMPlex.dec_index +
WMPlex.get_index +
WMPlex.get_stdisp +
WMPlex.inc_index +
WMPlex.is_hidden +
WMPlex.managed_list +
WMPlex.mx_count +
WMPlex.mx_current +
WMPlex.mx_list +
WMPlex.mx_nth +
WMPlex.set_hidden +
WMPlex.set_index +
WMPlex.set_stdisp +
WMPlex.switch_next +
WMPlex.switch_nth +
WMPlex.switch_prev +
WRegion.begin_kbresize +
WRegion.current +
WRegion.geom +
WRegion.goto +
WRegion.is_active +
WRegion.is_activity +
WRegion.is_mapped +
WRegion.is_tagged +
WRegion.manager +
WRegion.name +
WRegion.parent +
WRegion.rootwin_of +
WRegion.rqclose +
WRegion.rqclose_propagate +
WRegion.rqgeom +
WRegion.rqorder +
WRegion.screen_of +
WRegion.set_activity +
WRegion.set_name +
WRegion.set_name_exact +
WRegion.set_tagged +
WRegion.size_hints +
WRootWin.current_scr +
WScreen.id +
WScreen.set_managed_offset +
WSplit.geom +
WSplitInner.current +
WSplit.parent +
WSplitRegion.reg +
WSplit.rqgeom +
WSplitSplit.br +
WSplitSplit.dir +
WSplitSplit.flip +
WSplitSplit.tl +
WSplit.transpose +
WTiling.farthest +
WTiling.flip_at +
WTiling.managed_list +
WTiling.nextto +
WTiling.node_of +
WTiling.set_floating +
WTiling.set_floating_at +
WTiling.split +
WTiling.split_at +
WTiling.split_top +
WTiling.split_tree +
WTiling.transpose_at +
WTiling.unsplit_at +
WWindow.p_move +
WWindow.p_resize +
WWindow.xid +
+

+ + + + diff --git a/ionconf/node11.html b/ionconf/node11.html new file mode 100644 index 0000000..2c12ab2 --- /dev/null +++ b/ionconf/node11.html @@ -0,0 +1,1091 @@ + + + + + +Index + + + + + + + + + + + + + + + + + + + + + +
+ +

+Index +


+
aboutmsg + : 6.1 +
acrobatic + : 3.5 +
activity_first + : 6.1 +
activity_list + : 6.1 +
Alt + : 3.3.5 +
AnyModifier + : 3.3.5 +
append + : 6.1.16 +
aspect + : 3.5 +
attach + : 6.1.3 + | 6.1.7 + | 6.5.1 +
attach_framed + : 6.1.5 +
attach_new + : 6.1.3 + | 6.1.7 +
attach_tagged + : 6.1.7 +
back + : 6.3.2 +
backspace + : 6.3.2 +
bdoc + : 6.1 +
begin_kbresize + : 6.1.9 +
bkill_word + : 6.3.2 +
bol + : 6.3.2 +
bottom + : 6.1.3 +
br + : 6.2.4 +
bskip_word + : 6.3.2 +
Button-n + : 3.3.6 +
cancel + : 6.1.8 + | 6.3.3 + | 6.4.1 +
chdir_for + : 6.1 +
class
+
winprop : 3.5.1 +
+
clear_mark + : 6.3.2 +
clear_tags + : 6.1 +
clientwin_do_manage_alt + : 6.8 +
clientwin_list + : 6.1 +
clientwin_mapped_hook + : 6.8 +
clientwin_unmapped_hook + : 6.8 +
compile_cmd + : 6.1 +
complete + : 6.3.2 +
contents + : 6.3.2 +
context + : 6.3.2 +
Control + : 3.3.5 +
copy + : 6.1.16 + | 6.3.2 +
create_ws + : 6.1 +
current + : 6.1 + | 6.1.9 + | 6.2.2 +
current_scr + : 6.1.10 +
cut + : 6.3.2 +
de
+
defstyle : 6.7 +
defstyle_rootwin : 6.7 +
reset : 6.7 +
substyle : 6.7 +
+
dec_index + : 6.1.7 +
defbindings + : 6.1 +
defcmd + : 6.3 +
defctxmenu + : 6.1 +
defmenu + : 3.4.1 + | 6.1 +
defshortening + : 6.1 +
defstyle + : 6.7 +
defstyle_rootwin + : 6.7 +
defwinprop + : 6.1 +
delete + : 6.3.2 +
detach + : 6.2 +
dir + : 6.2.4 +
drawing engine + : 4.1 +
eol + : 6.3.2 +
ETCDIR + : 3.1 +
exec + : 6.1 +
exec_on + : 6.1 +
export + : 6.1.13 +
farthest + : 6.2.5 +
find_manager + : 6.1 +
find_screen_id + : 6.1 +
finish + : 6.1.8 + | 6.3.2 + | 6.4.1 +
flip + : 6.2.4 +
flip_at + : 6.2.5 +
float + : 3.5 +
forward + : 6.3.2 +
frame_managed_changed_hook + : 6.8 +
fullscreen + : 3.5 +
geom + : 6.1.9 + | 6.2.1 +
get + : 6.1 + | 6.2 + | 6.3 + | 6.4 + | 6.5.1 +
get_dir_for + : 6.1 +
get_ident + : 6.1.1 +
get_index + : 6.1.7 +
get_paths + : 6.1 +
get_savefile + : 6.1 +
get_stdisp + : 6.1.7 +
getbindings + : 6.1 +
getctxmenu + : 6.1 +
getmenu + : 6.1 +
getwinprop + : 6.1 +
goto + : 6.1.9 +
goto_activity + : 6.1 +
goto_first + : 6.1 +
goto_next + : 6.1 +
goto_next_screen + : 6.1 +
goto_nth_screen + : 6.1 +
goto_prev_screen + : 6.1 +
goto_previous + : 6.1 +
gr
+
read_config : 6.1.14 +
refresh : 6.1.14 +
select_engine : 6.1.14 +
+
grabmenu + : 6.4 +
history_clear + : 6.3 +
history_get + : 6.3 +
history_next + : 6.3.2 +
history_prev + : 6.3.2 +
history_push + : 6.3 +
history_search + : 6.3 +
history_table + : 6.3 +
icat + : 6.1.16 +
id + : 6.1.11 +
ignore_cfgrq + : 3.5 +
ignore_net_active_window + : 3.5 +
ignore_resizeinc + : 3.5 +
inc_index + : 6.1.7 +
insstr + : 6.3.2 +
instance
+
winprop : 3.5.1 +
+
ioncore
+
aboutmsg : 6.1 +
activity_first : 6.1 +
activity_list : 6.1 +
bdoc : 6.1 +
chdir_for : 6.1 +
clear_tags : 6.1 +
clientwin_list : 6.1 +
compile_cmd : 6.1 +
create_ws : 6.1 +
current : 6.1 +
defbindings : 6.1 +
defctxmenu : 6.1 +
defmenu : 6.1 +
defshortening : 6.1 +
defwinprop : 6.1 +
exec : 6.1 +
exec_on : 6.1 +
find_manager : 6.1 +
find_screen_id : 6.1 +
get : 6.1 +
get_dir_for : 6.1 +
get_paths : 6.1 +
get_savefile : 6.1 +
getbindings : 6.1 +
getctxmenu : 6.1 +
getmenu : 6.1 +
getwinprop : 6.1 +
goto_activity : 6.1 +
goto_first : 6.1 +
goto_next : 6.1 +
goto_next_screen : 6.1 +
goto_nth_screen : 6.1 +
goto_prev_screen : 6.1 +
goto_previous : 6.1 +
is_i18n : 6.1 +
kpress : 6.1 +
kpress_wait : 6.1 +
load_module : 6.1 +
lookup_clientwin : 6.1 +
lookup_region : 6.1 +
lookup_script : 6.1 +
match_winprop_name : 6.1 +
mclick : 6.1 +
mdblclick : 6.1 +
mdrag : 6.1 +
menuentry : 6.1 +
mpress : 6.1 +
navi_first : 6.1 +
navi_next : 6.1 +
popen_bgread : 6.1 +
progname : 6.1 +
read_savefile : 6.1 +
refresh_stylelist : 6.1 +
region_list : 6.1 +
request_selection : 6.1 +
resign : 6.1 +
restart : 6.1 +
restart_other : 6.1 +
set : 6.1 +
set_get_winprop_fn : 6.1 +
set_paths : 6.1 +
set_selection : 6.1 +
shutdown : 6.1 +
snapshot : 6.1 +
submap : 6.1 +
submenu : 6.1 +
tagged_list : 6.1 +
tags_first : 6.1 +
TR : 6.1 +
version : 6.1 +
warn : 6.1 +
warn_traced : 6.1 +
write_savefile : 6.1 +
x_change_property : 6.1 +
x_delete_property : 6.1 +
x_get_atom_name : 6.1 +
x_get_text_property : 6.1 +
x_get_window_property : 6.1 +
x_intern_atom : 6.1 +
x_set_text_property : 6.1 +
+
ioncore_deinit_hook + : 6.8 +
ioncore_post_layout_setup_hook + : 6.8 +
ioncore_sigchld_hook + : 6.8 +
ioncore_snapshot_hook + : 6.8 +
is_active + : 6.1.9 +
is_activity + : 6.1.9 +
is_fullscreen + : 6.1.1 +
is_hidden + : 6.1.7 +
is_histcompl + : 6.3.2 +
is_i18n + : 6.1 +
is_mapped + : 6.1.9 +
is_shaded + : 6.1.2 +
is_tagged + : 6.1.9 +
join + : 6.1.16 +
jumpto + : 3.5 +
keysymdef.h + : 3.3.5 +
kill + : 6.1.1 +
kill_line + : 6.3.2 +
kill_to_bol + : 6.3.2 +
kill_to_eol + : 6.3.2 +
kill_word + : 6.3.2 +
kpress + : 6.1 +
kpress_wait + : 6.1 +
load_module + : 6.1 +
Lock + : 3.3.5 +
lookup_clientwin + : 6.1 +
lookup_region + : 6.1 +
lookup_script + : 6.1 +
managed_list + : 6.1.3 + | 6.1.7 + | 6.2.5 +
manager + : 2.2.2.1 + | 6.1.9 +
map + : 6.1.16 +
mark + : 6.3.2 +
match_winprop_name + : 6.1 +
max_size + : 3.5 +
maximize_horiz + : 6.1.2 +
maximize_vert + : 6.1.2 +
mclick + : 6.1 +
mdblclick + : 6.1 +
mdrag + : 6.1 +
menu + : 6.4 +
menuentry + : 3.4.1 + | 6.1 +
menus + : 3.4.1 +
message + : 6.3 +
min_size + : 3.5 +
mkbottom + : 6.2 +
mod_dock
+
set_floating_shown_on : 6.5 +
+
mod_menu
+
get : 6.4 +
grabmenu : 6.4 +
menu : 6.4 +
pmenu : 6.4 +
set : 6.4 +
+
mod_query
+
defcmd : 6.3 +
get : 6.3 +
history_clear : 6.3 +
history_get : 6.3 +
history_push : 6.3 +
history_search : 6.3 +
history_table : 6.3 +
message : 6.3 +
popen_completions : 6.3 +
query : 6.3 +
query_attachclient : 6.3 +
query_editfile : 6.3 +
query_exec : 6.3 +
query_gotoclient : 6.3 +
query_lua : 6.3 +
query_man : 6.3 +
query_menu : 6.3 +
query_renameframe : 6.3 +
query_renameworkspace : 6.3 +
query_restart : 6.3 +
query_runfile : 6.3 +
query_shutdown : 6.3 +
query_ssh : 6.3 +
query_workspace : 6.3 +
query_yesno : 6.3 +
set : 6.3 +
show_about_ion : 6.3 +
show_tree : 6.3 +
warn : 6.3 +
+
mod_sp
+
set_shown : 6.6 +
set_shown_on : 6.6 +
+
mod_tiling
+
detach : 6.2 +
get : 6.2 +
mkbottom : 6.2 +
set : 6.2 +
+
mode + : 6.1.2 +
ModN + : 3.3.5 +
move + : 6.1.8 +
mpress + : 6.1 +
mx_count + : 6.1.7 +
mx_current + : 6.1.7 +
mx_list + : 6.1.7 +
mx_nth + : 6.1.7 +
name + : 6.1.9 +
navi_first + : 6.1 +
navi_next + : 6.1 +
next_completion + : 6.3.2 +
nextto + : 6.2.5 +
node_of + : 6.2.5 +
nudge + : 6.1.1 +
NumLock + : 3.3.5 +
Obj + : 2.2.1 +
oneshot + : 3.5 +
p_move + : 6.1.12 +
p_resize + : 6.1.12 +
p_switch_tab + : 6.1.2 +
p_tabdrag + : 6.1.2 +
panews_make_placement_alt + : 6.8 +
parent + : 2.2.2.1 + | 6.1.9 + | 6.2.1 +
paste + : 6.3.2 +
pmenu + : 6.4 +
point + : 6.3.2 +
popen_bgread + : 6.1 +
popen_completions + : 6.3 +
PREFIX + : 3.1 +
prev_completion + : 6.3.2 +
progname + : 6.1 +
query + : 6.3 +
query_attachclient + : 6.3 +
query_editfile + : 6.3 +
query_exec + : 6.3 +
query_gotoclient + : 6.3 +
query_lua + : 6.3 +
query_man + : 6.3 +
query_menu + : 6.3 +
query_renameframe + : 6.3 +
query_renameworkspace + : 6.3 +
query_restart + : 6.3 +
query_runfile + : 6.3 +
query_shutdown + : 6.3 +
query_ssh + : 6.3 +
query_workspace + : 6.3 +
query_yesno + : 6.3 +
quote_next + : 6.1.1 +
read_config + : 6.1.14 +
read_savefile + : 6.1 +
refresh + : 6.1.14 +
refresh_stylelist + : 6.1 +
reg + : 6.2.3 +
region_activated_hook + : 6.8 +
region_activity_hook + : 6.8 +
region_do_warp_alt + : 6.8 +
region_inactivated_hook + : 6.8 +
region_list + : 6.1 +
request_selection + : 6.1 +
reset + : 6.7 +
resign + : 6.1 +
resize + : 6.1.8 + | 6.5.1 +
restart + : 6.1 +
restart_other + : 6.1 +
role
+
winprop : 3.5.1 +
+
root window + : 2.2.1 +
rootwin_of + : 6.1.9 +
rqclose + : 6.1.9 +
rqclose_propagate + : 6.1.9 +
rqgeom + : 6.1.9 + | 6.2.1 +
rqorder + : 6.1.9 +
screen
+
physical : 2.2.1 +
X : 2.2.1 +
+
screen_managed_changed_hook + : 6.8 +
screen_of + : 6.1.9 +
scrolldown + : 6.3.3 +
ScrollLock + : 3.3.5 +
scrollup + : 6.3.3 +
select_engine + : 6.1.14 +
select_next + : 6.4.1 +
select_nth + : 6.4.1 +
select_prev + : 6.4.1 +
set + : 6.1 + | 6.2 + | 6.3 + | 6.4 + | 6.5.1 +
set_activity + : 6.1.9 +
set_completions + : 6.3.1 +
set_context + : 6.3.2 +
set_floating + : 6.2.5 +
set_floating_at + : 6.2.5 +
set_floating_shown_on + : 6.5 +
set_fullscreen + : 6.1.1 +
set_get_winprop_fn + : 6.1 +
set_hidden + : 6.1.7 +
set_index + : 6.1.7 +
set_managed_offset + : 6.1.11 +
set_mark + : 6.3.2 +
set_mode + : 6.1.2 +
set_name + : 6.1.9 +
set_name_exact + : 6.1.9 +
set_numbers + : 6.1.2 +
set_paths + : 6.1 +
set_selection + : 6.1 +
set_shaded + : 6.1.2 +
set_shown + : 6.6 +
set_shown_on + : 6.6 +
set_stdisp + : 6.1.7 +
set_tagged + : 6.1.9 +
set_text + : 6.1.6 +
shell_safe + : 6.1.15 +
Shift + : 3.3.5 +
show_about_ion + : 6.3 +
show_tree + : 6.3 +
shutdown + : 6.1 +
size_hints + : 6.1.9 +
skip_word + : 6.3.2 +
snapshot + : 6.1 +
split + : 6.2.5 +
split_at + : 6.2.5 +
split_top + : 6.2.5 +
split_tree + : 6.2.5 +
string
+
shell_safe : 6.1.15 +
+
style + : 4.1 +
submap + : 6.1 +
submenu + : 3.4.1 + | 6.1 +
substyle + : 4.1 + | 6.7 +
switch_next + : 6.1.7 +
switch_nth + : 6.1.7 +
switch_prev + : 6.1.7 +
switchto + : 3.5 +
system.mk + : 3.1 +
table
+
append : 6.1.16 +
copy : 6.1.16 +
icat : 6.1.16 +
join : 6.1.16 +
map : 6.1.16 +
+
tagged_list + : 6.1 +
tags_first + : 6.1 +
target + : 3.5 +
tiling_placement_alt + : 6.8 +
tl + : 6.2.4 +
TR + : 6.1 +
transient + : 3.5.2 +
transient_mode + : 3.5 +
transients_at_top + : 3.5 +
transparent + : 3.5 +
transpose + : 6.2.1 +
transpose_at + : 6.2.5 +
transpose_chars + : 6.3.2 +
transpose_words + : 6.3.2 +
typeahead_clear + : 6.4.1 +
unsplit_at + : 6.2.5 +
version + : 6.1 +
warn + : 6.1 + | 6.3 +
warn_traced + : 6.1 +
WClientWin + : 2.2.1 +
+
get_ident : 6.1.1 +
is_fullscreen : 6.1.1 +
kill : 6.1.1 +
nudge : 6.1.1 +
quote_next : 6.1.1 +
set_fullscreen : 6.1.1 +
xid : 6.1.1 +
+
WComplProxy
+
set_completions : 6.3.1 +
+
WDock
+
attach : 6.5.1 +
get : 6.5.1 +
resize : 6.5.1 +
set : 6.5.1 +
+
WEdln + : 2.2.1 +
+
back : 6.3.2 +
backspace : 6.3.2 +
bkill_word : 6.3.2 +
bol : 6.3.2 +
bskip_word : 6.3.2 +
clear_mark : 6.3.2 +
complete : 6.3.2 +
contents : 6.3.2 +
context : 6.3.2 +
copy : 6.3.2 +
cut : 6.3.2 +
delete : 6.3.2 +
eol : 6.3.2 +
finish : 6.3.2 +
forward : 6.3.2 +
history_next : 6.3.2 +
history_prev : 6.3.2 +
insstr : 6.3.2 +
is_histcompl : 6.3.2 +
kill_line : 6.3.2 +
kill_to_bol : 6.3.2 +
kill_to_eol : 6.3.2 +
kill_word : 6.3.2 +
mark : 6.3.2 +
next_completion : 6.3.2 +
paste : 6.3.2 +
point : 6.3.2 +
prev_completion : 6.3.2 +
set_context : 6.3.2 +
set_mark : 6.3.2 +
skip_word : 6.3.2 +
transpose_chars : 6.3.2 +
transpose_words : 6.3.2 +
+
WFrame + : 2.2.1 +
+
is_shaded : 6.1.2 +
maximize_horiz : 6.1.2 +
maximize_vert : 6.1.2 +
mode : 6.1.2 +
p_switch_tab : 6.1.2 +
p_tabdrag : 6.1.2 +
set_mode : 6.1.2 +
set_numbers : 6.1.2 +
set_shaded : 6.1.2 +
+
WGroup + : 2.2.1 +
+
attach : 6.1.3 +
attach_new : 6.1.3 +
bottom : 6.1.3 +
managed_list : 6.1.3 +
+
WGroupCW + : 2.2.1 +
WGroupWS + : 2.2.1 +
+
attach_framed : 6.1.5 +
+
WInfoWin
+
set_text : 6.1.6 +
+
Winprops + : 3.5 +
WInput + : 2.2.1 +
+
cancel : 6.3.3 +
scrolldown : 6.3.3 +
scrollup : 6.3.3 +
+
WMenu
+
cancel : 6.4.1 +
finish : 6.4.1 +
select_next : 6.4.1 +
select_nth : 6.4.1 +
select_prev : 6.4.1 +
typeahead_clear : 6.4.1 +
+
WMessage + : 2.2.1 +
WMoveresMode
+
cancel : 6.1.8 +
finish : 6.1.8 +
move : 6.1.8 +
resize : 6.1.8 +
+
WMPlex
+
attach : 6.1.7 +
attach_new : 6.1.7 +
attach_tagged : 6.1.7 +
dec_index : 6.1.7 +
get_index : 6.1.7 +
get_stdisp : 6.1.7 +
inc_index : 6.1.7 +
is_hidden : 6.1.7 +
managed_list : 6.1.7 +
mx_count : 6.1.7 +
mx_current : 6.1.7 +
mx_list : 6.1.7 +
mx_nth : 6.1.7 +
set_hidden : 6.1.7 +
set_index : 6.1.7 +
set_stdisp : 6.1.7 +
switch_next : 6.1.7 +
switch_nth : 6.1.7 +
switch_prev : 6.1.7 +
+
WRegion + : 2.2.1 +
+
begin_kbresize : 6.1.9 +
current : 6.1.9 +
geom : 6.1.9 +
goto : 6.1.9 +
is_active : 6.1.9 +
is_activity : 6.1.9 +
is_mapped : 6.1.9 +
is_tagged : 6.1.9 +
manager : 6.1.9 +
name : 6.1.9 +
parent : 6.1.9 +
rootwin_of : 6.1.9 +
rqclose : 6.1.9 +
rqclose_propagate : 6.1.9 +
rqgeom : 6.1.9 +
rqorder : 6.1.9 +
screen_of : 6.1.9 +
set_activity : 6.1.9 +
set_name : 6.1.9 +
set_name_exact : 6.1.9 +
set_tagged : 6.1.9 +
size_hints : 6.1.9 +
+
write_savefile + : 6.1 +
WRootWin + : 2.2.1 +
+
current_scr : 6.1.10 +
+
WScreen + : 2.2.1 +
+
id : 6.1.11 +
set_managed_offset : 6.1.11 +
+
WSplit + : 2.2.1 +
+
geom : 6.2.1 +
parent : 6.2.1 +
rqgeom : 6.2.1 +
transpose : 6.2.1 +
+
WSplitInner
+
current : 6.2.2 +
+
WSplitRegion
+
reg : 6.2.3 +
+
WSplitSplit
+
br : 6.2.4 +
dir : 6.2.4 +
flip : 6.2.4 +
tl : 6.2.4 +
+
WTiling + : 2.2.1 +
+
farthest : 6.2.5 +
flip_at : 6.2.5 +
managed_list : 6.2.5 +
nextto : 6.2.5 +
node_of : 6.2.5 +
set_floating : 6.2.5 +
set_floating_at : 6.2.5 +
split : 6.2.5 +
split_at : 6.2.5 +
split_top : 6.2.5 +
split_tree : 6.2.5 +
transpose_at : 6.2.5 +
unsplit_at : 6.2.5 +
+
WWindow + : 2.2.1 +
+
p_move : 6.1.12 +
p_resize : 6.1.12 +
xid : 6.1.12 +
+
x_change_property + : 6.1 +
x_delete_property + : 6.1 +
x_get_atom_name + : 6.1 +
x_get_text_property + : 6.1 +
x_get_window_property + : 6.1 +
x_intern_atom + : 6.1 +
x_set_text_property + : 6.1 +
xid + : 6.1.1 + | 6.1.12 +
Xinerama + : 2.2.1 +
xmodmap + : 3.3.5 +
xprop + : 3.5.2 + +
+ +

+


+ + + diff --git a/ionconf/node12.html b/ionconf/node12.html new file mode 100644 index 0000000..90201d6 --- /dev/null +++ b/ionconf/node12.html @@ -0,0 +1,77 @@ + + + + + +About this document ... + + + + + + + + + + + + + + + + + + + + +

+About this document ... +

+ Configuring and extending Ion3 with Lua

+This document was generated using the +LaTeX2HTML translator Version 2002-2-1 (1.71) +

+Copyright © 1993, 1994, 1995, 1996, +Nikos Drakos, +Computer Based Learning Unit, University of Leeds. +
+Copyright © 1997, 1998, 1999, +Ross Moore, +Mathematics Department, Macquarie University, Sydney. +

+The command line arguments were:
+ latex2html -show_section_numbers -short_index -local_icons -noaddress -up_url http://iki.fi/tuomov/ion/ -up_title 'Ion homepage' -nofootnode -split 3 ionconf +

+The translation was initiated by tuomov on 2006-12-23 +


+ + + diff --git a/ionconf/node2.html b/ionconf/node2.html new file mode 100644 index 0000000..9d85352 --- /dev/null +++ b/ionconf/node2.html @@ -0,0 +1,163 @@ + + + + + +1. Introduction + + + + + + + + + + + + + + + + + + + + + + +

+1. Introduction +

+ +

+This document is an ''advanced user'' manual for Ion, the X11 window manager, +and version 3 specifically. It is an attempt attempt at documenting what is +in Ion's configuration files, how to configure Ion by simple modifications +to these files and how to write more complex extensions in Lua, the +lightweight configuration and scripting language used by Ion. + +

+Readers unfamiliar with Lua is advised to first glance at the Lua manual at + +

+

+ +

+and perhaps some tutorial pages at the lua-users wiki: + +

+

+ +

+Back in this document, first in chapter 2 some key +concepts and relations are explained. These include the module system +and Ion's object and class hierarchies. While it might not at first +occur that knowing such things would be necessary to configure +a program, this material is essential because of the object-oriented +nature of most of Ion's scripting interface. + +

+The new user, fed up with the default key bindings and eager to just +quickly configure Ion to his liking may question the reasons for +exposing the ''heavy'' internal OO structure in the scripting and +configuration interface. I'm not the one to blame him for that. +Sure it would be faster to configure Ion to everyone's liking +if a simpler binding configuration interface was provided. Such an +interface would, however, also be far more limited and make writing +extensions more complicated and the advantages from using a real +scripting language would be partly lost. One more advantage from +a rich scripting and configuration interface is that it allows +implementing scripts to read alternate configuration file formats, +ones that could be, for example, modified by external configuration tools. + +

+In chapter 3 the very basic Ion configuration know-how +is provided. All the different configuration files and their locations +are explained and instructions are given to allow the reader to +configure bindings and so-called ''winprops''. Chapter 4 +explains the notion of drawing engines and graphical styles and how to +write new looks for Ion and more advanced aspects of Ion's scripting +interface are documented in chapter 5 (a work in +progress). + +

+Finally, most of the functions provided by Ion's scripting interface +are listed and documented in the Function reference in chapter +6. At the end of the document is an alphabetical +listing of all these functions. + +

+ +

+ +

+ + + + diff --git a/ionconf/node3.html b/ionconf/node3.html new file mode 100644 index 0000000..f3dbd29 --- /dev/null +++ b/ionconf/node3.html @@ -0,0 +1,543 @@ + + + + + +2. Preliminaries: Key concepts and relations + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+ +
+2. Preliminaries: Key concepts and relations +

+ +

+The purpose of this chapter to explain some of key concepts and +relations you need to understand before reading the following +chapters. These include modules explained in section 2.1 +and the Ion class and object hierarchies, section 2.2. + +

+ +

+ +
+2.1 Modules +

+ +

+Ion has been designed so that the 'ion' executable only implements some +basic services on top of which very different kinds of window managers +could be build by loading the appropriate 'modules'. On modern system +these modules are simply dynamically loaded .so libraries. On +more primitive systems, or if you want to squeeze total size of the +executable and libraries, the modules can optionally be statically +linked to the main binary, but must nevertheless be loaded with the +dopath function. Modules may also include Lua code. + +

+If no modules are loaded, all client windows appear in full screen mode. +To get better window management support, one or more workspace modules +should be loaded. Currently Ion provides the following modules: + +

+

+
mod_tiling
+
Tilings for workspaces of the original tiled + Ion kind. + +
+
mod_query
+
Queries (for starting programs and so on) + and message boxes. + +
+
mod_menu
+
Support for menus, both pull-down and + keyboard-operated in-frame menus. + +
+
mod_statusbar
+
Module that implements a statusbar that + can be adaptively embedded in each workspace's layout. + +
+
mod_dock
+
Module for docking Window Maker dockapps. + The dock can both float and be embedded as the statusbar. + +
+
mod_sp
+
This module implements a scratchpad frame that can + be toggled on/off everywhere. Think of the 'console' in some + first-person shooters. + +
+
mod_mgmtmode
+
Support module for implementing ''management + modes'' with a XOR-frame similar to move/resize mode around selected + region. + +
+
mod_sm
+
Session management support module. + Loaded automatically when needed! +
+
+ +

+So-called drawing engines are also implemented as a modules, +but they are not discussed here; see chapter 4. + +

+The stock configuration for the 'ion3' executable loads all of the modules +mentioned above except mod_dock and filemod_mgmtmode. +The stock configuration for the 'pwm3' executable (which differs from the +'ion3' executable in a few configuration details, such as Xinerama usage) +loads another set of modules. + +

+ +

+ +

+ +
+2.2 Class and object hierarchies +

+ +

+While Ion does not not have a truly object-oriented design +2.1, +things that appear on the computer screen are, however, quite +naturally expressed as such ''objects''. Therefore Ion implements +a rather primitive OO system for these screen objects and some +other things. + +

+It is essential for the module writer to learn this object +system, but also people who write their own binding configuration files +necessarily come into contact with the class and object hierarchies +- you need to know which binding setup routines apply where, +and what functions can be used as handlers in which bindings. +It is the purpose of this section to attempt to explain these +hierarchies. If you do not wish the read the full section, at least +read the summary at the end of it, so that you understand the very +basic relations. + +

+For simplicity we consider only the essential-for-basic-configuration +Ioncore, mod_tiling and mod_query classes. +See Appendix B for the full class hierachy visible +to Lua side. + +

+ +

+2.2.1 Class hierarchy +

+ +

+One of the most important principles of object-oriented design methodology +is inheritance; roughly how classes (objects are instances of classes) +extend on others' features. Inheritance gives rise to class hierarchy. +In the case of single-inheritance this hierarchy can be expressed as a +tree where the class at the root is inherited by all others below it +and so on. Figure 2.1 lists out the Ion class +hierarchy and below we explain what features of Ion the classes +implement. + +

+ +

+ + + +
Figure 2.1: +Partial Ioncore, mod_tiling and mod_query + class hierarchy.
+    Obj
+     |-->WRegion
+     |    |-->WClientWin
+     |    |-->WWindow
+     |    |    |-->WRootWin
+     |    |    |-->WMPlex
+     |    |    |    |-->WScreen
+     |    |    |    |-->WFrame
+     |    |    |-->WInput (mod_query)
+     |    |         |-->WEdln (mod_query)
+     |    |         |-->WMessage (mod_query)
+     |    |-->WGroup
+     |    |    |-->WGroupWS
+     |    |    |-->WGroupCW
+     |    |-->WTiling (mod_tiling)
+     |-->WSplit (mod_tiling)
+
+
+ +

+The core classes: + +

+

+
Obj
+
+ Is the base of Ion's object system. + +

+

+
WRegion
+
+ is the base class for everything corresponding to something on the + screen. Each object of type WRegion has a size and position + relative to the parent WRegion. While a big part of Ion + operates on these instead of more specialised classes, WRegion + is a ''virtual'' base class in that there are no objects of ''pure'' + type WRegion; all concrete regions are objects of some class + that inherits WRegion. + +

+

+
WClientWin
+
is a class for + client window objects, the objects that window managers are + supposed to manage. + +

+

+
WWindow
+
is the base class for all + internal objects having an X window associated to them + (WClientWins also have X windows associated to them). + +

+

+
WRootWin
+
is the class for + root windows of X screens. + Note that an ''X screen'' or root window is not necessarily a + single physical screen as a root window + may be split over multiple screens when multi-head extensions + such as Xinerama are used. (Actually there + can be only one WRootWin when Xinerama is used.) + +

+

+
WMPlex
+
is a base class for all regions that''multiplex'' + other regions. This means that of the regions managed by the multiplexer, + only one can be displayed at a time. Classes that inhereit WMPlex + include screens and frames. + +

+

+
WScreen
+
is the class for objects + corresponding to physical screens. Screens may share a root + window when Xinerama multihead extensions are used as explained + above. + +

+

+
WFrame
+
is the class for frames. + While most Ion's objects have no graphical presentation, frames basically + add to WMPlexes the decorations around client windows + (borders, tabs). + +

+

+
WGroup
+
is the base class for groups. + Particular types of groups are workspaces + (WGroupWS) + and groups of client windows + (WGroupCW). +
+
+ +

+Classes implemented by the mod_tiling module: + +

+

+
WTiling
+
is the class for tilings + of frames. + +
+
WSplit
+
(or, more specifically, classes + that inherit it) encode the WTiling tree structure. +
+
+ +

+Classes implemented by the mod_query module: + +

+

+
WInput
+
is a virtual base class for the + two classes below. + +
+
WEdln
+
is the class for the ''queries'', + the text inputs that usually appear at bottoms of frames and sometimes + screens. Queries are the functional equivalent of ''mini buffers'' in + many text editors. + +
+
WMessage
+
implements the boxes for + warning and other messages that Ion may wish to display to the user. + These also usually appear at bottoms of frames. +
+
+ +

+There are also some other ''proxy'' classes that do not refer +to objects on the screen. The only important one of these for +basic configuration is WMoveresMode that is used for +binding callbacks in the move and resize mode. + +

+ +

+2.2.2 Object hierarchies: WRegion parents and managers +

+ +

+ +

+2.2.2.1 Parent-child relations +

+Each object of type WRegion has a parent and possibly a manager +associated to it. The parent for an object is always a +WWindow and for WRegion with an X window (WClientWin, +WWindow) the parent WWindow is given by the same relation of +the X windows. For other WRegions the relation is not as clear. +There is generally very few restrictions other than the above on the +parent--child relation but the most common is as described in +Figure 2.2. + +

+ +

+ + + +
Figure 2.2: +Most common parent-child relations
+    WRootWins
+     |-->WScreens
+          |-->WGroupWSs
+          |-->WTilings
+          |-->WClientWins in full screen mode
+          |-->WFrames
+               |-->WGroupCWs
+               |-->WClientWins
+               |-->WFrames for transients
+               |-->a possible WEdln or WMessage
+
+
+ +

+WRegions have very little control over their children as a parent. +The manager WRegion has much more control over its +managed WRegions. Managers, for example, handle resize requests, +focusing and displaying of the managed regions. Indeed the manager--managed +relationship gives a better picture of the logical ordering of objects on +the screen. Again, there are generally few limits, but the most common +hierarchy is given in Figure 2.3. Note that sometimes +the parent and manager are the same object and not all objects may have +a manager (e.g. the dock in the dock module at the time of writing this) +but all have a parent-a screen if not anything else. + +

+ +

+2.2.2.2 Manager-managed relations +

+ +

+ +

+ + + +
Figure 2.3: +Most common manager-managed relations
+    WRootWins
+     |-->WScreens
+          |-->WGroupCWs for full screen WClientWins
+          |    |-->WClientWins
+          |    |-->WFrames for transients (dialogs)
+          |         |--> WClientWin
+          |-->WGroupWSs for workspaces
+          |    |-->WTiling
+          |    |    |-->possibly a WEdln, WMessage or WMenu
+          |    |    |-->WFrames
+          |    |         |-->WGroupCWs (with contents as above)
+          |    |-->WFrames for floating content
+          |-->WFrames for sticky stuff, such as the scratchpad
+
+
+ +

+Note that a workspace can manage another workspace. This can be +achieved with the attach_new function, and allows you to nest +workspaces as deep as you want. + +

+ +

+2.2.3 Summary +

+ +

+In the standard setup, keeping queries, messages and menus out of +consideration: + +

+ +

    +
  • The top-level objects that matter are screens and they correspond + to physical screens. The class for screens is WScreen. +
  • +
  • Screens contain (multiplex) groups (WGroup) and other + objects, such as WFrames. Some of these are mutually exclusive + to be viewed at a time. +
  • +
  • Groups of the specific kind WGroupWS often contain a + WTiling tiling for tiling frames (WFrame), but + groups may also directly contain floating frames. +
  • +
  • Frames are the objects with decorations such as tabs and borders. + Frames contain (multiplex) among others (groups of) client windows, + to each of which corresponds a tab in the frame's decoration. Only + one client window (or other object) can be shown at a time in each + frame. The class for client windows is WClientWin. +
  • +
+ +

+


Footnotes

+
+
... design2.1
+
the author doesn't like such artificial designs + +
+
+ + + + + diff --git a/ionconf/node4.html b/ionconf/node4.html new file mode 100644 index 0000000..60acef3 --- /dev/null +++ b/ionconf/node4.html @@ -0,0 +1,1369 @@ + + + + + +3. Basic configuration + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+ +
+3. Basic configuration +

+ +

+This chapter should help your configure Ion to your liking. As the your +probably already know, Ion uses Lua as a configuration and extension +language. If you're new to it, you might first want to read some Lua +documentation as already suggested and pointed to in the Introduction +before continuing with this chapter. + +

+Section 3.1 is an overview of the multiple configuration +files Ion uses and as a perhaps more understandable introduction to the +general layout of the configuration files, a walk-through of the main +configuration file ion.lua is provided in section +3.2. +How keys and mouse action are bound to functions is described in detail +in 3.3 and in section 3.5 winprops are +explained. For a reference on exported functions, see section +6. + +

+ +

+ +
+3.1 The configuration files +

+ +

+Ion3, to which document applies, stores its stock configuration files in +/usr/local/etc/ion3/ unless you, the OS package maintainer or +whoever installed the package on the system has modified the variables +PREFIX or +ETCDIR in +system.mk before compiling Ion. +In the first case you probably know where to find the files and in +the other case the system administrator or the OS package maintainer +should have provided documentation to point to the correct location. +If these instructions are no help in locating the correct directory, +the command locate cfg_ion.lua might help provided updatedb +has been run recently. + +

+User configuration files go in ~/.ion3/. +Ion always searches the user configuration file directory before the stock +configuration file directory for files. Therefore, if you want to change +some setting, it is advised against that you modify the stock configuration +files in-place as subsequent installs of Ion will restore the stock +configuration files. Instead you should always make a copy of the stock +file in ~/.ion3/ and modify this file. When searching +for a file, if no extension or path component is given, compiled .lc +files are attempted before .lua files. + +

+All the configuration files are named cfg_*.lua with the ''*'' +part varying. The configuration file for each module mod_modname is +cfg_modname.lua, with modname varying by the module in +question. The following table summarises these and other configuration +files: + +

+ + + + + + + + + + + + + + + + +
FileDescription
cfg_ion.luaThe main configuration file
cfg_ioncore.luaConfiguration file for Ion's core library. + Most of the bindings and menus are configured here. Bindings that are + specific to some module are configured in the module's configuration + file. For details, see section 3.3.
cfg_kludges.luaSettings to get some applications behave more nicely have been + collected here. See section 3.5.
cfg_tiling.lua + cfg_query.lua + cfg_menu.lua + cfg_dock.lua + cfg_statusbar.lua + ...Configuration files for different modules.
+ +

+Additionally, there's the file look.lua that configures the +drawing engine, but it is covered in chapter 4. + +

+ +

+ +
+3.2 A walk through cfg_ion.lua +

+ +

+As already mentioned cfg_ion.lua is Ion's main configuration +file. Some basic 'feel' settings are usually configured there and +the necessary modules and other configuration files configuring some +more specific aspects of Ion are loaded there. In this section we +take a walk through the stock cfg_ion.lua. +Notice that most of the settings are commented-out (- is a +line comment in Lua) in the actual file, as they're the defaults +nevertheless. + +

+The first thing one in the file is to set +

+META="Mod1+"
+ALTMETA=""
+
+These settings cause most of Ion's key bindings to use Mod1 as the +modifier key. If ALTMETA is set, it is used as modifier for the keys +that don't normally use a modifier. for details on modifiers and key +binding setup in general see section 3.3. + +

+Next we do some basic feel configuration: + +

+

+ioncore.set{
+    dblclick_delay=250,
+    kbresize_delay=1500,
+}
+
+ +

+These two will set the delay between button presses in a double click, and +the timeout to quit resize mode in milliseconds. + +

+

+ioncore.set{
+    opaque_resize=true,
+    warp=true
+}
+
+ +

+The first of these two settings enables opaque resize mode: in move/resize +move frames and other objects mirror you actions immediately. If opaque +resize is disabled, a XOR rubber band is shown during the mode instead. +This will, unfortunately, cause Ion to also grab the X server and has some +side effects. + +

+Next we load the configuration for Ion's core, and some kludges: + +

+

+dopath("cfg_ioncore")
+dopath("cfg_kludges")
+
+ +

+Most bindings and menus are defined in cfg_ioncore.lua. +Details on making such definitions follow in sections 3.3 +and 3.4, respectively. +some kludges or ''winprops'' to make some applications behave better +under Ion are colledted in cfg_kludges.lua; see section +3.5 for details. In addition to these, this file +lists quite a few statements of the form +

+ioncore.defshortening("[^:]+: (.*)(<[0-9]+>)", "$1$2$|$1$<...$2")
+
+These are used to configure how Ion attempts to shorten window titles +when they do not fit in a Tab. The first argument is a POSIX regular +expression that is used to match against the title and the next is +a rule to construct a new title of a match occurs. This particular +rule is used to shorten e.g. 'Foo: barbaz<3>' to 'barba...<3>'; for +details see the function reference entry for ioncore.defshortening. + +

+To actually be able to do something besides display windows in full screen +mode, we must next load some modules: + +

+

+dopath("cfg_modules")
+--dopath("mod_query")
+--dopath("mod_menu")
+--dopath("mod_tiling")
+--dopath("mod_statusbar")
+--dopath("mod_dock")
+--dopath("mod_sp")
+
+ +

+We actually load there another file listing the default selection of +modules. If you only want to load additional modules, just uncomment +the corresponding line. If you want to disable loading some modules, +comment out the the line loading cfg_modules, and uncomment +the lines for the modules you want, or add more. + +

+ +

+ +
+3.3 Keys and rodents +

+ +

+In the stock configuration file setup, most key and mouse bindings are set +from the file cfg_ioncore.lua while module-specific bindings +are set from the modules' main configuration files (cfg_modname.lua). +This, however, does not have to be so as long as the module has been +loaded prior to defining any module-specific bindings. + +

+Bindings are defined by calling the function +defbindings with the ''context'' of the +bindings and the a table of new bindings to make. The context is simply +string indicating one of the classes of regions (or modes such as +WMoveresMode) introduced in section 2.2, and fully +listed in appendix B, although not all define +a binding map. For example, the following skeleton would be used to +define new bindings for all frames: + +

+

+defbindings("WFrame", {
+    -- List of bindings to make goes here.
+})
+
+ +

+There has been some confusion among users about the need to define the +''context'' for each binding, so let me try to explain this design +decision here. The thing is that if there was a just a simple 'bind this +key to this action' method without knowledge of the context, some +limitations would have to be made on the available actions and writing +custom handlers would be more complicated. In addition one may want to +bind the same function to different key for different types of objects. +Indeed, the workspace and frame tab switching functions are the same both +classes being based on WMPlex, and in the stock configuration the +switch to :th workspaces is bound to Mod1+n while the switch to +:th tab is bound to the sequence Mod1+k n. + +

+Currently known ''contexts'' include: +WScreen, +WMPlex, +WMPlex.toplevel, +WFrame, +WFrame.toplevel, +WFrame.floating, +WFrame.tiled, +WFrame.transient, +WMoveresMode, +WGroup, +WGroupCW, +WGroupWS, +WClientWin, +WTiling, and +WStatusBar. +Most of these should be self-explanatory, corresponding to objects +of class with the same name. The ones with .toplevel suffix +refer to screens and ''toplevel'' frames, i.e. frames that are +not used for transient windows. Likewise .transient refers +to frames in transient mode, and .tiled and .floating +to frames in, respectively, tiled and floating modes. + +

+The following subsections describe how to construct elements of the +binding table. Note that defbindings adds +the the newly defined bindings to the previous bindings of the context, +overriding duplicates. To unbind an event, set the handler parameter +to nil for each of the functions to be described in the following +subsections. + +

+Also note that when multiple objects want to handle a binding, the +innermost (when the root window is considered the outermost) active object +in the parent-child hierarchy (see Figure 2.2) of objects +gets to handle the action. + +

+ +

+3.3.1 Binding handlers and special variables +

+ +

+Unlike in Ion2, in Ion3 binding handlers are not normally passed as +''anonymous functions'', although this is still possible. The preferred +method now is to pass the code of the handler as a string. Two special +variables are available in this code. These are + +

+ + + + + + + + + + + + + +
VariableDescription
_ (underscore)Reference to the object on which the + binding was triggered. The object is of the same class as the the + context of the defbindings call + defining the binding.
_subUsually, the currently active managed object of the + object referred to by _, but sometimes (e.g. mouse actions + on tabs of frames) something else relevant to the action triggering + the binding.
_chldObject corresponding to the currently active child window of the + object referred to by _.
+ +

+For example, supposing '_' is a WFrame, the following +handler should move the active window to the right, if possible: + +

+

+"_:inc_index(_sub)"
+
+ +

+ +

+3.3.2 Guards +

+ +

+To suppress error messages, each binding handler may also be accompanied +by a ''guard'' expression that blocks the handler from being called when +the guard condition is not met. Currently the following guard expressions +are supported (for both _sub and _chld): + +

+ + + + + + + + + + +
GuardDescription
"_sub:non-nil"The _sub parameter must be set.
"_sub:SomeClass"The _sub parameter must be member + of class SomeClass.
+ +

+ +

+ +
+3.3.3 Defining the bindings +

+ +

+The descriptions of the individual bindings in the binding table argument +to defbindings should be constructed with the following +functions. + +

+Key presses: + +

    +
  • kpress(keyspec, handler [, guard]), +
  • +
  • kpress_wait(keyspec, handler [, guard]) and +
  • +
  • submap(keyspec, { ... more key bindings ... }). +
  • +
+Mouse actions: + +
    +
  • mclick(buttonspec, handler [, guard]), +
  • +
  • mdblclick(buttonspec, handler [, guard]), +
  • +
  • mpress(buttonspec, handler [, guard]) and +
  • +
  • mdrag(buttonspec, handler [, guard]). +
  • +
+ +

+The actions that most of these functions correspond to should be clear +and as explained in the reference, kpress_wait is simply +kpress with a flag set instructing Ioncore wait for all +modifiers to be released before processing any further actions. +This is to stop one from accidentally calling e.g. +WRegion.rqclose multiple times in a row. The submap +function is used to define submaps or ''prefix maps''. The second +argument to this function is table listing the key press actions +(kpress) in the submap + +

+The parameters keyspec and buttonspec are explained below +in detail. The parameter handler is the handler for the binding, +and the optional parameter guard its guard. These should normally +be strings as explained above. + +

+ +

+3.3.4 Examples +

+ +

+For example, to just bind the key Mod1+1 to switch to the first +workspace and Mod1+Right to the next workspace, you would make the +following call +

+defbindings("WScreen", {
+    kpress("Mod1+Right", "_:switch_next()"),
+    kpress("Mod1+1", "_:switch_nth(1)"),
+})
+
+ +

+Note that _:switch_nth(1) is the same as calling +WMPlex.switch_next(_, 1) as WScreen inherits +WMPlex and this is where the function is actually defined. + +

+Similarly to the above example, to bind the key sequence Mod1+k n +switch to the next managed object within a frame, and Mod1+k 1 to the +first, you would issue the following call: +

+defbindings("WFrame", {
+    submap("Mod1+K", {
+        kpress("Right", "_:switch_next()"),
+        kpress("1", "_:switch_nth(1)"),
+   }),
+})
+
+ +

+ +

+3.3.5 Key specifications +

+ +

+As seen above, the functions that create key binding specifications require +a keyspec argument. This argument should be a string containing the +name of a key as listed in the X header file keysymdef.h3.1 without the XK_ prefix. + +Most of the key names are quite intuitive while some are not. For example, +the Enter key on the main part of the keyboard has the less common +name Return while the one the numpad is called KP_Enter. + +

+The keyspec string may optionally have multiple ''modifier'' names +followed by a plus sign (+) as a prefix. X defines the following +modifiers: +

+Shift, Control, Mod1 to Mod5, +AnyModifier and Lock. + + + + + + +
+ +

+X allows binding all of these modifiers to almost any key and while this +list of modifiers does not explicitly list keys such as +Alt that are common on modern keyboards, such +keys are bound to one of the ModN. On systems running XFree86 +Alt is usually Mod1. On Suns Mod1 is the diamond key +and Alt something else. One of the ''flying window'' keys on so +called Windows-keyboards is probably mapped to Mod3 if you have +such a key. Use the program xmodmap +to find out what exactly is bound where. + +

+Ion defaults to AnyModifier in submaps. This can sometimes lead to +unwanted effects when the same key is used with and without explicitly +specified modifiers in nested regions. For this reason, Ion recognises +NoModifier as a special modifier that can be used to reset this +default. + +

+Ion ignores the Lock modifier and any ModN () +bound to NumLock or +ScrollLock +by default because such3.2 locking keys may otherwise +cause confusion. + +

+ +

+3.3.6 Button specifications +

+ +

+Button specifications are similar to key definitions but now +instead of specifying modifiers and a key, you specify modifiers +and one of the button names Button1 to +Button5. Additionally the +specification may end with an optional area name following an @-sign. +Only frames currently support areas, and the supported values in this +case are +"border", "tab", "empty_tab", "client" and +nil (for the whole frame). + +

+For example, the following code binds dragging a tab with the first +button pressed to initiate tab drag&drop handling: + +

+

+defbindings("WFrame", {
+    mdrag("Button1@tab", "_:p_tabdrag()"),
+})
+
+ +

+ +

+3.3.7 A further note on the default binding configuration +

+ +

+The default binding configuration contains references to the variables +META and ALTMETA instead of directly using the default +values of "Mod1+" and "" (nothing). As explained in +section 3.2, the definitions of these variables +appear in cfg_ion.lua. This way you can easily change the the +modifiers used by all bindings in the default configuration without +changing the whole binding configuration. Quite a few people prefer +to use the Windows keys as modifiers because many applications already +use Alt. Nevertheless, Mod1 is the default as a key bound +to it is available virtually everywhere. + +

+ +

+ +
+3.4 Menus +

+ +

+ +

+3.4.1 Defining menus +

+ +

+ + + + +In the stock configuration file setup, menus are defined in the file +cfg_menus.lua as previously mentioned. The mod_menu module +must be loaded for one to be able to define menus, and this is done with +the function defmenu provided by it. + +

+Here's an example of the definition of a rather simple menu with a submenu: + +

+

+defmenu("exitmenu", {
+    menuentry("Restart", "ioncore.restart()"),
+    menuentry("Exit", "ioncore.shutdown()"),
+})
+
+defmenu("mainmenu", {
+    menuentry("Lock screen", "ioncore.exec('xlock')"),
+    menuentry("Help", "mod_query.query_man(_)"),
+    submenu("Exit", "exitmenu"),
+})
+
+ +

+The menuentry function is used to create an entry in the +menu with a title and an entry handler to be called when the menu entry +is activated. The parameters to the handler are similar to those of binding +handlers, and usually the same as those of the binding that opened the menu. + +

+The submenu function is used to insert a submenu at that +point in the menu. (One could as well just pass a table with the menu +entries, but it is not encouraged.) + +

+ +

+3.4.2 Special menus +

+ +

+The menu module predefines the following special menus. These can be used +just like the menus defined as above. + +

+ + + + + + + + + + + + + + + + +
Menu nameDescription
windowlistList of all client windows. Activating an entry jumps to that window.
workspacelistList of all workspaces. Activating an entry jumps to that workspaces.
stylemenuList of available look_*.lua style files. Activating an entry + loads that style and ask to save the selection.
ctxmenuContext menu for given object.
+ +

+ +

+3.4.3 Defining context menus +

+ +

+The ''ctxmenu'' is a special menu that is assembled from a defined context +menu for the object for which the menu was opened for, but also includes +the context menus for the manager objects as submenus. + +

+Context menus for a given region class are defined with the +defctxmenu function. This is other ways similar to +defmenu, but the first argument instead being the name +of the menu, the name of the region class to define context menu for. +For example, here's part of the stock WFrame context menu +definition: + +

+

+defctxmenu("WFrame", {
+    menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),
+    menuentry("Kill",  "WClientWin.kill(_sub)", "_sub:WClientWin"),
+})
+
+ +

+Some of the same ''modes'' as were available for some bindings +may also be used: WFrame.tiled, WFrame.floating, +and WFrame.transient. + +

+ +

+ +
+3.4.4 Displaying menus +

+ +

+The following functions may be used to display menus from binding +handlers (and elsewhere): + +

+ + + + + + + + + + + + + + + + +
FunctionDescription
mod_menu.menuKeyboard (or mouse) operated menus that open in the bottom-left corner + of a screen or frame.
mod_menu.bigmenuSame as previous, but uses another graphical style.
mod_menu.pmenuMouse-operated drop-down menus. This function can only be called from a + mouse press or drag handler.
mod_menu.grabmenuA special version of mod_menu.menu that grabs the keyboard + and is scrolled with a given key until all modifiers have been released, + after which the selected entry is activated. This function is meant to + be used for implementing, for example, Win***s-style Alt-Tab + handling.3.3
+ +

+The grabmenu function takes the extra key parameter, but +aside from that each of these functions takes three arguments, which when +called from a binding handler, should be the parameters to the handler, and +the name of the menu. For example, the following snippet of of code binds +the both ways to open a context menu for a frame: + +

+

+defbindings("WFrame", {
+    kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),
+    mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),
+})
+
+ +

+ +

+ +
+3.5 Winprops +

+ +

+The so-called ''winprops'' can be used to change how +specific windows are handled and to set up some kludges to deal with +badly behaving applications. They are defined by calling the function +defwinprop with a table containing the properties to set and the +necessary information to identify a window. The currently supported +winprops are listed below, and the subsequent subsections explain the +usual method of identifying windows, and how to obtain this information. + +

+ +

+ +

+
Winprop:
+
acrobatic (boolean) + +
+
Description:
+
+ Set this to true for Acrobat Reader. It has an annoying + habit of trying to manage its dialogs instead of setting them as + transients and letting the window manager do its job, causing + Ion and acrobat go a window-switching loop when a dialog is + opened. + +
+
+ +

+ +

+
Winprop:
+
aspect (table) + +
+
Description:
+
+ The table should contain the entries w and h that + override application-supplied aspect ratio hint. + +
+
+ +

+ +

+
Winprop:
+
float (boolean) + +
+
Description:
+
+ Set this to open the window in a floating frame, when + in a group. + +
+
+ +

+ +

+
Winprop:
+
fullscreen (boolean) + +
+
Description:
+
+ Should the window be initially in full screen mode? + +
+
+ +

+ +

+
Winprop:
+
ignore_cfgrq (boolean) + +
+
Description:
+
+ Should configure requests on the window be ignored? + Only has effect on floating windows. + +
+
+ +

+ +

+
Winprop:
+
ignore_net_active_window (boolean) + +
+
Description:
+
+ Ignore extended WM hints _NET_ACTIVE_WINDOW request. + +
+
+ +

+ +

+
Winprop:
+
ignore_resizeinc (boolean) + +
+
Description:
+
+ Should application supplied size increments be ignored? + +
+
+ +

+ +

+
Winprop:
+
jumpto (boolean) + +
+
Description:
+
+ Should a newly created client window always be made + active, even if the allocated frame isn't. + +
+
+ +

+ +

+
Winprop:
+
max_size (table) + +
+
Description:
+
+ The table should contain the entries w and h that + override application-supplied maximum size hint. + +
+
+ +

+ +

+
Winprop:
+
min_size (table) + +
+
Description:
+
+ Similar to max_size but for the minimum size hint. + +
+
+ +

+ +

+
Winprop:
+
oneshot (boolean) + +
+
Description:
+
+ Discard this winprop after first use. + +
+
+ +

+ +

+
Winprop:
+
switchto (boolean) + +
+
Description:
+
+ Should a newly mapped client window be switched to within + its frame. + +
+
+ +

+ +

+
Winprop:
+
target (string) + +
+
Description:
+
+ The name of an object (workspace, frame) that should manage + windows of this type. + +
+
+ +

+ +

+
Winprop:
+
transient_mode (string) + +
+
Description:
+
+ "normal": No change in behaviour. "current": The window + should be thought of as a transient for the current active + client window (if any) even if it is not marked as a + transient by the application. "off": The window should be + handled as a normal window even if it is marked as a + transient by the application. + +
+
+ +

+ +

+
Winprop:
+
transients_at_top (boolean) + +
+
Description:
+
+ When transients are managed by the client window itself (as it + is the case on tiled workspaces), should the transients be + placed at the top of the window instead of bottom? + +
+
+ +

+ +

+
Winprop:
+
transparent (boolean) + +
+
Description:
+
+ Should frames be made transparent when this window is selected? +
+ +
+
+ +

+ +

+ +
+3.5.1 Classes, roles and instances +

+ +

+The identification information in the winprop specification is usually the +class, +role, +instance and +name +of the window. The name field is a Lua-style regular expression +matched against the window's title and the rest are strings that must +exactly match the corresponding window information. It is not necessary +to specify all of these fields. + +

+Ion looks for a matching winprop in the order listed by the following +table. An 'E' indicates that the field must be set in the winprop +and it must match the window's corresponding property exactly or, in +case of name, the regular expression must match the window +title. An asterisk '*' indicates that a winprop where the field is +not specified (or is itself an asterisk in case of the first three +fields) is tried. + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
classroleinstancename
EEEE
EEE*
EE*E
EE**
E*EE
E*E*
E**E
   etc.
+
+ +

+If there are multiple winprops with other identification information +the same but different name, the longest match is chosen. + +

+ +

+3.5.2 Finding window identification +

+ +

+The 'Window info' context menu entry (Mod1+M or Button3 on a tab) +can be used to list the identification information required to set winprops +for a window and all the transient windows managed within it. + +

+ +Another way to get the identification information is to use xprop. +Simply run To get class and instance, simply run xprop WM_CLASS +and click on the particular window of interest. The class is the latter of +the strings while the instance is the former. To get the role - few +windows have this property - use the command xprop WM_ROLE. +This method, however, will not work on transients. + +

+ +So-called ''transient windows'' are usually short-lived dialogs (although +some programs abuse this property) that have a parent window that they are +''transient for''. On tiled workspaces Ion displays these windows +simulatenously with the parent window at the bottom of the same frame. +Unfortunately xprop is stupid and can't cope with this situation, +returning the parent window's properties when the transient is clicked on. +For this reason you'll have to do a little extra work to get the properties +for that window.3.4 +

+Finally, it should be mentioned that too many authors these days +''forget'' to set this vital identification to anything meaningful: +everything except name is the same for all of the programs's +windows, for example. + +

+ +

+3.5.3 Some common examples +

+ +

+ +

+3.5.3.1 Acrobat Reader +

+ +

+The following is absolutely necessary for Acrobat reader: + +

+

+defwinprop{
+    class = "AcroRead",
+    instance = "documentShell",
+    acrobatic = true,
+}
+
+ +

+ +

+3.5.3.2 Fixing a Mozilla Firebird transient +

+ +

+Mozilla Firebird (0.7) incorrectly does not set the WM_TRANSIENT_FOR +property for the dialog that is used to ask the action to take for a file. +It, however, sets the the property point to the main window for the save +dialog. This can be annoying and confusing, as the first dialog is not +closed before the second is displayed. + +

+We'd like the first dialog to be transient to the main window. The closest +we can get to that is to consider it transient to the current window (if +there's one). Unfortunately Firebird does not set any meaningful classes, +instances or roles for the windows, so we'll have to rely on an ugly title +match. + +

+

+defwinprop{
+    class = "MozillaFirebird-bin",
+    name = "Opening .*",
+    transient_mode = "current",
+}
+
+ +

+ +

+3.5.3.3 Forcing newly created windows in named frames +

+ +

+The following winprop should place xterm started with command-line parameter +-name sysmon and running a system monitoring program in a +particular frame: +

+defwinprop{
+    class = "XTerm",
+    instance = "sysmon",
+    target = "sysmonframe",
+}
+
+ +

+For this example to work, we have to somehow create a frame named +sysmonframe. One way to do this is to make the following +call in the Mod1+F3 Lua code query: + +

+

+mod_query.query_renameframe(_)
+
+ +

+Recall that _ points to the multiplexer (frame or screen) in which +the query was opened. Running this code should open a new query prefilled +with the current name of the frame. In our example we would change the +name to sysmonframe, but we could just as well have used the +default name formed from the frame's class name and an instance number. + +

+ +

+


Footnotes

+
+
...keysymdef.h3.1
+
This file can usually be found in the directory +/usr/X11R6/include/X11/. + +
+
... such3.2
+
Completely useless keys that should be +gotten rid of in the author's opinion. + +
+
... handling.3.3
+
See the wcirculate.lua script in the Ion + scripts repository http://iki.fi/tuomov/repos/ion-scripts-3/. + +
+
... window.3.4
+
There's a patch to xprop to +fix this, but nothing seems to be happening with respect to including it in +XFree86. + +
+
+ + + + + diff --git a/ionconf/node5.html b/ionconf/node5.html new file mode 100644 index 0000000..b6951d4 --- /dev/null +++ b/ionconf/node5.html @@ -0,0 +1,720 @@ + + + + + +4. Graphical styles + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+ +
+4. Graphical styles +

+ +

+This chapter first gives in section 4.1 a general outline +of how drawing engines are used, of style specifications and then +in section 4.2 describes how to specify styles +for the default drawing engine. + +

+ +

+ +
+4.1 Drawing engines, style specifications and sub-styles +

+ +

+Ion's drawing routines are abstracted into so-called drawing engine +modules that can, again depending on the system, be dynamically +loaded as needed. The drawing engine modules provide ''brushes'' +that objects can use to draw some high-level primitives such +as borders and text boxes (in addition to simple text and rectangle +drawing) on their windows and configure e.g. the shape and +background of the window. While the drawing engines therefore +do not directly implement looks for each possible object (that +would hardly be maintainable), different brush styles can be +used to give a distinctive look to different objects and engines +could interpret some styles as special cases. Style specifications +are strings of the form + +

+

+element1-element2-...-elementn
+
+ +

+An example of such a style specification is tab-frame; +see the table in subsection 4.1.1 for more styles. + +

+When an object asks for a brush of certain style, the selected +drawing engine will attempt to find the closest match to this +specification. The styles/brushes defined by the drawing engines +may have asterisks (*) as some of the elements indicating +a match to anything. Exact matches are preferred to asterisk +matches and longer matches to shorter. For example, let a brush +for style foo-bar-baz be queried, then the following +brushes are in order of preference: + +

+

+foo-bar-baz
+foo-*-baz
+foo-bar
+*
+foo-baz   -- Doesn't match, not selected!
+
+ +

+Some of the drawing primitives allow extra attributes to be +specified, also in the form +

+attr1-attr2-...-attrn
+
+These extra attributes are called substyles +and allow, for example, the state of the object to be indicated +by different colour sets while keeping the interface at an +abstract level and the drawing engine completely ignorant +of the semantics - only the writer of the drawing engine +configuration file has to know them. However the drawing +engine can again interpret known substyles as special cases +and the default engine indeed does so with frame tab +tag and drag states.) + +

+ +

+ +
+4.1.1 Known styles and substyles +

+ +

+ +

+4.1.1.1 Frames +

+ +

+ + + + + + + + + + + + + + + + + + + +
Style nameDescription
frameStyle for frames. + Substyles: active, inactive.
frame-tiledA more specific style for tiled frames. + Substyles as for frame.
frame-tiled-altAn alternative style for tiled frames. + Often used to disable the tab-bar.
frame-floatingA more specific style for floating + frames.
frame-transientA more specific style for frames + containing transient windows.
+ +

+ +

+4.1.1.2 Tabs and menu entries +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Style nameDescription
tabStyle for frames' tabs and menu entries. + Substyles: combinations of the form a-s where + a is one of active/inactive and + s is one of selected/unselected
tab-frameA more specific style for frames' tabs. + Substyles: combinations of the form a-s-t-d-u where + a and s are as above and + t is one of tagged/not_tagged, + d is one of dragged/not_dragged and + u is one of activity/no_activity.
tab-frame-tiled, 
tab-frame-tiled-alt, 
tab-frame-floating, 
tab-frame-transientMore specific styles for frames in the + different modes.
tab-menuentryA more specific style for entries in WMenus.
tab-menuentry-bigmenuAn alternate style for entries in WMenus.
+ +

+ +

+4.1.1.3 The rest +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Style nameDescription
inputA style for WInputs.
input-edlnA more specific style for WEdlns. + Substyles: selection for selected text and + cursor for the cursor indicating current editing point.
input-messageA more specific style for WMessages.
input-menuA more specific style for WMenus.
input-menu-bigmenuAn alternate style for WMenus.
moveres_displayThe box displaying position/size when + moving or resizing frames.
dockThe dock.
+ +

+ +

+ +
+4.2 Defining styles for the default drawing engine +

+ +

+Drawing engine style files are usually named +look_foo.lua where foo is the name of the +style. The file that Ion loads on startup or when +gr.read_config is called, however, is look.lua +and should usually be symlinked to or a copy of of some +look_foo.lua. + +

+ +

+4.2.1 The structure of the configuration files +

+ +

+The first thing to do in a stylefile is to choose the drawing +engine, possibly loading the module as well. This is done +with the following chunk of code. + +

+

+if not gr.select_engine("de") then 
+    return 
+end
+
+ +

+The gr.select_engine function sees if the engine +given as argument is registered (the default drawing engine is +simply called ''de''). If the engine could not be found, it +tries to load a module of the same name. If the engine still +is not registered, gr.select_engine returns false +and in this case we also exit the style setup script. +If the engine was found, gr.select_engine sees that +further requests for brushes are forwarded to that engine +and returns true. + +

+Before defining new styles it may be a good idea to clear old +styles from memory so if the old configuration defines more +specific styles than the new, the old styles don't override +those specified by the new configuration. That can be done by +calling + +

+

+de.reset()
+
+ +

+After this the new styles can be defined with de.defstyle +as explained in the next subsection. Finally, after the styles have +been defined we must ask objects on the screen to look up new brushes +to reflect the changes in configuration. This is done with + +

+

+gr.refresh()
+
+ +

+ +

+4.2.2 Defining the styles +

+ +

+Styles for the default drawing engine are defined with the +function de.defstyle. It has two arguments the first being +a style specification as explained in previous sections and the second +a table whose fields describe the style: + +

+

+de.defstyle("some-style", {
+    attribute = value,
+    ...
+})
+
+ +

+The supported attributes are described in tables below. The different +border elements and styles referred to there are explained in Figure +4.1. + +

+ +

+ + + +
Figure 4.1: +Sketch of different border styles and elements
+Elevated:        Inlaid:         Ridge:            Groove:        
+  hhhhhhhhhhhs     ............	   hhhhhhhhhhhs      sssssssssssh
+  h..........s     .sssssssssh.	   h..........s      s..........h
+  h.        .s     .s        h.	   h.sssssssh.s      s.hhhhhhhs.h
+  h.        .s     .s        h.	   h.s      h.s      s.h      s.h
+  h.        .s     .s        h.	   h.shhhhhhh.s      s.hsssssss.h
+  h..........s     .shhhhhhhhh.	   h..........s      s..........h
+  hsssssssssss     ............	   hsssssssssss      shhhhhhhhhhh
+
+h = highlight, s = shadow, . = padding
+
+
+ +

+ +

+4.2.2.1 Colours +

+ +

+Each of these fields a string of the form that can be +passed to XAllocNamedColor. Valid strings are e.g. +hexadecimal RGB specifications of the form +#RRGGBB and colour names as specified +in /usr/X11R6/lib/X11/rgb.txt (exact path varying). + +

+ + + + + + + + + + + + + + + + + + + +
FieldDescription
highlight_colourColour for the ''highlight'' part of a border.
shadow_colourColour for the ''highlight'' part of a border.
foreground_colourColour for the normal drawing operations, e.g. text.
background_colourWindow background colour (unless transparency is enabled) and + background colour boxes.
padding_colourColour for the ''padding'' part of a border border. Set to + background_colour if unset.
+ +

+ +

+4.2.2.2 Borders and widths +

+ +

+All other fields below except border_style are non-negative integers +indicating a number of pixels. + +

+ + + + + + + + + + + + + + + + + + + +
FieldDescription
border_styleA string indicating the style of border; one of + elevated/inlaid/ridge/groove as seen in the + above sketch.
highlight_pixelsWidth of the highlight part of the border in pixels.
shadow_pixelsWidth of the shadow part of the border in pixels.
padding_pixelsWidth of the padding part of the border in pixels.
spacingSpace to be left between all kinds of boxes.
+ +

+ +

+4.2.2.3 Text +

+ +

+ + + + + + + + + + +
FieldDescription
fontFont to be used in text-drawing operations; standard X font + name.
text_alignHow text is to be aligned in text boxes/tabs; one of + the strings left/right/center.
+ +

+ +

+4.2.2.4 Miscellaneous +

+ +

+ + + + + + + + + + +
FieldDescription
transparent_backgroundShould windows' that use this style + background be transparent? true/false.
based_onThe name of a previously defined style that this + style should be based on.
+ +

+ +

+4.2.2.5 Substyles +

+ +

+As discussed in previous sections, styles may have substyles to e.g. +indicate different states of the object being drawn. The ''de'' engine +limits what can be configured in substyles to the set of colours in the +first table above, but also specifically interprets for the main style +tab-frame the substyles *-*-tagged and *-*-*-dragged +by, respectively, drawing a right angle shape at the top right corner +of a tab and by shading the tab with a stipple pattern. Also for +menus the substyles *-*-submenu are handled as a special case. + +

+Substyles are defined with the function de.substyle within the +table defining the main style. The parameters to this function are +similar to those of de.defstyle. + +

+

+de.defstyle("some-style", {
+   ...
+   de.substyle("some-substyle", {
+      ...
+   }),
+   ...
+})
+
+ +

+ +

+4.2.3 An example +

+ +

+The following shortened segment from look_cleanviolet.lua +should help to clarify the matters discussed in the previous +subsection. + +

+

+de.defstyle("*", {
+    -- Gray background
+    highlight_colour = "#eeeeee",
+    shadow_colour = "#eeeeee",
+    background_colour = "#aaaaaa",
+    foreground_colour = "#000000",
+    
+    shadow_pixels = 1,
+    highlight_pixels = 1,
+    padding_pixels = 1,
+    spacing = 0,
+    border_style = "elevated",
+    
+    font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",
+    text_align = "center",
+})
+
+de.defstyle("tab-frame", {
+    based_on = "*",
+    
+    de.substyle("active-selected", {
+        -- Violet tab
+        highlight_colour = "#aaaacc",
+        shadow_colour = "#aaaacc",
+        background_colour = "#666699",
+        foreground_colour = "#eeeeee",
+    }),
+
+    --  More substyles would follow ...
+})
+
+ +

+ +

+4.3 Miscellaneous settings +

+ +

+The following style fields are independent of the drawing engine used, +but are related to objects' styles and therefore configured in the drawing +engine configuration file. + +

+ +

+4.3.1 Extra fields for style frame +

+ +

+ + + + + + + + + + + + + +
FieldDescription
barControls the style of the tab-bar. Possible values + are the strings "none", "inside", "outside" + and "shaped", with the last providing the PWM-style + tab-bars for floating frames.
floatframe_tab_min_wMinimum tab width in pixels for + the shaped style, given that this number times number of tabs + doesn't exceed frame width.
floatframe_bar_max_w_qMaximum tab-bar width quotient of + frame width for the shaped styles. A number in the + interval .
+ +

+ +

+4.3.2 Extra fields for style dock +

+ +

+ + + + + + + + + + +
FieldDescription
outline_styleHow borders are drawn: + "none" - no border, + "all" - border around whole dock, + "each" - border around each dockapp.
tile_sizeA table with entries width and height, + indicating the width and height of tiles in pixels.
+ +

+Hopefully that's enough to get you started in writing new style +configuration files for Ion. When in doubt, study the existing +style configuration files. + +

+ +

+ + + + diff --git a/ionconf/node6.html b/ionconf/node6.html new file mode 100644 index 0000000..b1bbe8b --- /dev/null +++ b/ionconf/node6.html @@ -0,0 +1,351 @@ + + + + + +5. Scripting + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+ +
+5. Scripting +

+ +

+This chapter documents some additional features of the Ion configuration +and scripting interface that can be used for more advanced scripting than +the basic configuration exlained in chapter 3. + +

+ +

+ +
+5.1 Hooks +

+ +

+Hooks are lists of functions to be called when a certain event occurs. +There are two types of them; normal and ''alternative'' hooks. Normal +hooks do not return anything, but alt-hooks should return a boolean +indicating whether it handled its assigned task succesfully. In the case +that true is returned, remaining handlers are not called. + +

+Hook handlers are registered by first finding the hook +with ioncore.get_hook and then calling WHook.add +on the (succesfull) result with the handler as parameter. Similarly +handlers are unregistered with WHook.remove. For example: + +

+

+ioncore.get_hook("ioncore_snapshot_hook"):add(
+    function() print("Snapshot hook called.") end
+)
+
+ +

+In this example the hook handler has no parameters, but many hook +handlers do. The types of parameters for each hook are listed in +the hook reference, section 6.8. + +

+Note that many of the hooks are called in ''protected mode'' and can not +use any functions that modify Ion's internal state. TODO: More detailed +documentation when this is final. + +

+ +

+5.2 Referring to regions +

+ +

+ +

+5.2.1 Direct object references +

+ +

+All Ion objects are passed to Lua scriptss as 'userdatas', and you may +safely store such object references for future use. The C-side object +may be destroyed while Lua still refers to the object. All exported +functions gracefully fail in such a case, but if you need to explicitly +test that the C-side object still exists, use obj_exists. + +

+As an example, the following short piece of code implements +bookmarking: + +

+

+local bookmarks={}
+
+-- Set bookmark bm point to the region reg
+function set_bookmark(bm, reg)
+    bookmarks[bm]=reg
+end
+
+-- Go to bookmark bm
+function goto_bookmark(bm)
+    if bookmarks[bm] then
+        -- We could check that bookmarks[bm] still exists, if we
+        -- wanted to avoid an error message.
+        bookmarks[bm]:goto()
+    end
+end
+
+ +

+ +

+5.2.2 Name-based lookups +

+ +

+If you want to a single non-WClientWin region with an exact known +name, use ioncore.lookup_region. If you want a list of all regions, +use ioncore.region_list. Both functions accept an optional argument +that can be used to specify that the returned region(s) must be of a more +specific type. Client windows live in a different namespace and for them +you should use the equivalent functions ioncore.lookup_clientwin +and ioncore.clientwin_list. + +

+To get the name of an object, use WRegion.name. Please be +aware, that the names of client windows reflect their titles and +are subject to changes. To change the name of a non-client window +region, use WRegion.set_name. + +

+ +

+5.3 Alternative winprop selection criteria +

+ +

+It is possible to write more complex winprop selection routines than +those described in section 3.5. To match a particular +winprop using whatever way you want to, just set the match +field of the winprop to a function that receives the client window +as its sole parameter, and that returns true if the winprop +matches, and false otherwise. + +

+The class, instance and role properties can be obtained with +WClientWin.get_ident, and the title with WRegion.name. +If you want to match against (almost) arbitrary window properties, +have a look at the documentation for the following functions, and +their standard Xlib counterparts: ioncore.x_intern_atom +(XInternAtom), ioncore.x_get_window_property (XGetWindowProperty), +and ioncore.x_get_text_property (XGetTextProperty). + +

+ +

+ +

+5.4 Writing ion-statusd monitors +

+ +

+All statusbar meters that do not monitor the internal state of Ion should +go in the separate ion-statusd program. + +

+Whenever the user requests a meter %foo or %foo_bar to be +inserted in a statusbar, mod_statusbar asks ion-statusd to +load statusd_foo.lua on its search path (same as that for Ion-side +scripts). This script should then supply all meters with the initial part +'foo'. + +

+To provide this value, the script should simply call statusd.inform +with the name of the meter and the value as a string. +Additionally the script should provide a 'template' for the meter to +facilitate expected width calculation by mod_statusbar, and +may provide a 'hint' for colour-coding the value. The interpretation +of hints depends on the graphical style in use, and currently the +stock styles support the normal, important and +critical hints. + +

+In our example of the 'foo monitor', at script init we might broadcast +the template as follows: + +

+

+statusd.inform("foo_template", "000")
+
+ +

+To inform mod_statusbar of the actual value of the meter and +indicate that the value is critical if above 100, we might write the +following function: + +

+

+local function inform_foo(foo)
+    statusd.inform("foo", tostring(foo))
+    if foo>100 then
+        statusd.inform("foo_hint", "critical")
+    else
+        statusd.inform("foo_hint", "normal")
+    end
+end
+
+ +

+To periodically update the value of the meter, we must use timers. +First we must create one: + +

+

+local foo_timer=statusd.create_timer()
+
+ +

+Then we write a function to be called whenever the timer expires. +This function must also restart the timer. + +

+

+local function update_foo()
+    local foo= ... measure foo somehow ...
+    inform_foo(foo)
+    foo_timer:set(settings.update_interval, update_foo)
+end
+
+ +

+Finally, at the end of our script we want to do the initial +measurement, and set up timer for further measurements: + +

+

+update_foo()
+
+ +

+If our scripts supports configurable parameters, the following code +(at the beginning of the script) will allow them to be configured in +cfg_statusbar.lua and passed to the status daemon and our script: + +

+

+local defaults={
+    update_interval=10*1000, -- 10 seconds
+}
+                
+local settings=table.join(statusd.get_config("foo"), defaults)
+
+ +

+ +

+ + + + diff --git a/ionconf/node7.html b/ionconf/node7.html new file mode 100644 index 0000000..5a3e390 --- /dev/null +++ b/ionconf/node7.html @@ -0,0 +1,6232 @@ + + + + + +6. Function reference + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+ +
+6. Function reference +

+ +

+ +

+ +
+6.1 Functions defined in ioncore +

+ +
+
+ + +
+
Synopsis:
+
ioncore.TR(s, ...) + +
+
Description:
+
gettext+string.format + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.bdoc(text) + +
+
Description:
+
Used to enter documentation among bindings so that other programs + can read it. Does nothing. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.chdir_for(reg, dir) + +
+
Description:
+
Change default working directory for new programs started in reg. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.compile_cmd(cmd, guard) + +
+
Description:
+
Compile string cmd into a bindable function. Within cmd, the + variable ''_'' (underscore) can be used to refer to the object + that was selecting for the bound action and chosen to handle it. + The variable ''_sub'' refers to a ''currently active'' sub-object + of _, or a sub-object where the action loading to the binding + being called actually occured. + +

+The string guard maybe set to pose limits on _sub. Currently + supported guards are _sub:non-nil and _sub:WFoobar, where + WFoobar is a class. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.create_ws(scr, tmpl, no_default) + +
+
Description:
+
Create new workspace on screen scr. The table tmpl + may be used to override parts of default_ws_params, + and no_default may be set to true to complete ignore it. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.defbindings(context, bindings) + +
+
Description:
+
Define bindings for context context. Here binding is + a table composed of entries created with ioncore.kpress, + etc.; see section 3.3 for details. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.defctxmenu(ctx, ...) + +
+
Description:
+
Define context menu for context ctx, tab being a table + of menu entries. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.defmenu(name, tab) + +
+
Description:
+
Define a new menu with name being the menu's name and tab + being a table of menu entries. If tab.append is set, the entries + are appended to previously-defined ones, if possible. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.defwinprop(list) + +
+
Description:
+
Define a winprop. For more information, see section 3.5. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.exec_on(reg, cmd, merr_internal) + +
+
Description:
+
Run cmd with the environment variable DISPLAY set to point to the + root window of the X screen reg is on. If cmd is prefixed + by a colon (:), the following command is executed in an xterm + (or other terminal emulator) with the help of the ion-runinxterm + script. If the command is prefixed by two colons, ion-runinxterm + will ask you to press enter after the command is finished, even if it + returns succesfully. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.read_savefile(string basename) + +
+
Description:
+
Read a savefile. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string ioncore.get_savefile(string basename) + +
+
Description:
+
Get a file name to save (session) data in. The string basename + should contain no path or extension components. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string ioncore.lookup_script(string file, string sp) + +
+
Description:
+
Lookup script file. If try_in_dir is set, it is tried + before the standard search path. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool ioncore.write_savefile(string basename, table tab) + +
+
Description:
+
Write tab in file with basename basename in the + session directory. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.find_manager(obj, t) + +
+
Description:
+
Find an object with type name t managing obj or one of + its managers. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.get_dir_for(reg) + +
+
Description:
+
Get default working directory for new programs started in reg. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.getbindings(maybe_context) + +
+
Description:
+
Get a table of all bindings. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.getctxmenu(name) + +
+
Description:
+
Returns a context menu defined with ioncore.defctxmenu. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.getmenu(name) + +
+
Description:
+
Returns a menu defined with ioncore.defmenu. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.getwinprop(cwin) + +
+
Description:
+
Find winprop table for cwin. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string ioncore.aboutmsg() + +
+
Description:
+
Returns an about message (version, author, copyright notice). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.activity_first() + +
+
Description:
+
Return first regio non activity list. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.activity_list() + +
+
Description:
+
Return list of regions with activity/urgency bit set. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.clear_tags() + +
+
Description:
+
Untag all regions. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.clientwin_list() + +
+
Description:
+
Return a list of all client windows. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.current() + +
+
Description:
+
Returns the currently focused region, if any. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool ioncore.defshortening(string rx, string rule, bool always) + +
+
Description:
+
Add a rule describing how too long titles should be shortened to fit in tabs. + The regular expression rx (POSIX, not Lua!) is used to match titles + and when rx matches, rule is attempted to use as a replacement + for title. If always is set, the rule is used even if no shortening + is necessary. + +

+Similarly to sed's 's' command, rule may contain characters that are + inserted in the resulting string and specials as follows: + +

+ + + + + + + + + + + + + + + + + + + +
SpecialDescription
$0Place the original string here.
$1 to $9Insert n:th capture here (as usual,captures are surrounded + by parentheses in the regex).
$|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.
$<Remove characters on the left of this marker to shorten the + string.
$>Remove characters on the right of this marker to shorten the + string. Only the first $< or $> within an alternative + shortening is used.
+ +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer ioncore.exec(string cmd) + +
+
Description:
+
Run cmd with the environment variable DISPLAY set to point to the + X display the WM is running on. No specific screen is set unlike with + WRootWin.exec_on. The PID of the (shell executing the) new + process is returned. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WScreen ioncore.find_screen_id(integer id) + +
+
Description:
+
Find the screen with numerical id id. If Xinerama is + not present, id corresponds to X screen numbers. Otherwise + the ids are some arbitrary ordering of Xinerama rootwins. + If id is , the screen with the highest id is returned. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.get() + +
+
Description:
+
Get ioncore basic settings. For details see ioncore.set. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.get_paths(table tab) + +
+
Description:
+
Get important directories (userdir, sessiondir, searchpath). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool ioncore.goto_activity() + +
+
Description:
+
Go to first region on activity list. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.goto_first(WRegion reg, string dirstr, table param) + +
+
Description:
+
Go to first region within reg in direction dirstr + (up/down/left/right/beg/end/any). For information on param, + see ioncore.navi_next. Additionally this function supports + the boolean nofront field, for not bringing the object to + front. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.goto_next(WRegion reg, string dirstr, table param) + +
+
Description:
+
Go to region next from reg in direction dirstr + (up/down/left/right/next/prev/any). For information on param, + see ioncore.navi_next. Additionally this function supports + the boolean nofront field, for not bringing the object to + front. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WScreen ioncore.goto_next_screen() + +
+
Description:
+
Switch focus to the next screen and return it. + +

+Note that this function is asynchronous; the screen will not + actually have received the focus when this function returns. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
WScreen ioncore.goto_nth_screen(integer id) + +
+
Description:
+
Switch focus to the screen with id id and return it. + +

+Note that this function is asynchronous; the screen will not + actually have received the focus when this function returns. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
WScreen ioncore.goto_prev_screen() + +
+
Description:
+
Switch focus to the previous screen and return it. + +

+Note that this function is asynchronous; the screen will not + actually have received the focus when this function returns. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.goto_previous() + +
+
Description:
+
Go to and return to a previously active region (if any). + +

+Note that this function is asynchronous; the region will not + actually have received the focus when this function returns. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool ioncore.is_i18n() + +
+
Description:
+
Is Ion supporting locale-specifically multibyte-encoded strings? + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool ioncore.load_module(string modname) + +
+
Description:
+
Attempt to load a C-side module. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WClientWin ioncore.lookup_clientwin(string name) + +
+
Description:
+
Attempt to find a client window with name name. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.lookup_region(string name, string typenam) + +
+
Description:
+
Attempt to find a non-client window region with name name and type + inheriting typenam. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.navi_first(WRegion reg, string dirstr, table param) + +
+
Description:
+
Find first region within reg in direction dirstr + (up/down/left/right/beg/end/any). For information on param, + see ioncore.navi_next. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.navi_next(WRegion reg, string dirstr, table param) + +
+
Description:
+
Find region next from reg in direction dirstr + (up/down/left/right/next/prev/any). The table param may + contain the boolean field nowrap, instructing not to wrap + around, and the WRegions no_ascend and no_descend, + and functions ascend_filter and descend_filter from + WRegions (to, from), used to decide when to descend + or ascend into another region. (TODO: more detailed explanation.) + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer ioncore.popen_bgread(string cmd, function h, function errh) + +
+
Description:
+
Run cmd with a read pipe connected to its stdout. + When data is received through the pipe, handler is called + with that data. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string ioncore.progname() + +
+
Description:
+
Returns the name of program using Ioncore. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.region_list(string typenam) + +
+
Description:
+
Find all non-client window regions inheriting typenam. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.request_selection(function fn) + +
+
Description:
+
Request (string) selection. The function fn will be called + with the selection when and if it is received. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.resign() + +
+
Description:
+
Causes the window manager to simply exit without saving + state/session. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.restart() + +
+
Description:
+
Restart, saving session first. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.restart_other(string cmd) + +
+
Description:
+
Attempt to restart another window manager cmd. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.set(table tab) + +
+
Description:
+
Set ioncore basic settings. The table tab may contain the + following fields. + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
opaque_resize(boolean) Controls whether interactive move and + resize operations simply draw a rubberband during + the operation (false) or immediately affect the + object in question at every step (true).
warp(boolean) Should focusing operations move the + pointer to the object to be focused?
switchto(boolean) Should a managing WMPlex switch + to a newly mapped client window?
screen_notify(boolean) Should notification tooltips be displayed + for hidden workspaces with activity?
frame_default_index(string) Specifies where to add new regions + on the mutually exclusive list of a frame. One of + ''last'', ''next'' (for after current), ''next-act'' + (for after current and anything with activity right + after it).
dblclick_delay(integer) Delay between clicks of a double click.
kbresize_delay(integer) Delay in milliseconds for ending keyboard + resize mode after inactivity.
kbresize_t_max(integer) Controls keyboard resize acceleration. + See description below for details.
kbresize_t_min(integer) See below.
kbresize_step(floating point) See below.
kbresize_maxacc(floating point) See below.
framed_transients(boolean) Put transients in nested frames.
float_placement_method(string) How to place floating frames. + One of ''udlr'' (up-down, then left-right), + ''lrud'' (left-right, then up-down) or ''random''.
default_ws_params(table) Default workspace layout; the + attach/creation parameters for a WGroup.
+ +

+When a keyboard resize function is called, and at most kbresize_t_max + milliseconds has passed from a previous call, acceleration factor is reset + to 1.0. Otherwise, if at least kbresize_t_min milliseconds have + passed from the from previous acceleration update or reset the squere root + of the acceleration factor is incremented by kbresize_step. The + maximum acceleration factor (pixels/call modulo size hints) is given by + kbresize_maxacc. The default values are (200, 50, 30, 100). + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.set_get_winprop_fn(function fn) + +
+
Description:
+
Set function used to look up winprops. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool ioncore.set_paths(table tab) + +
+
Description:
+
Set important directories (sessiondir, searchpath). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.set_selection(string p) + +
+
Description:
+
Set primary selection and cutbuffer0 to p. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.shutdown() + +
+
Description:
+
End session saving it first. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.snapshot() + +
+
Description:
+
Save session. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.tagged_list() + +
+
Description:
+
Returns a list of tagged regions. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion ioncore.tags_first() + +
+
Description:
+
Returns first tagged object. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string ioncore.version() + +
+
Description:
+
Returns Ioncore version string. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.warn(string str) + +
+
Description:
+
Issue a warning. How the message is displayed depends on the current + warning handler. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.warn_traced(string str) + +
+
Description:
+
Similar to ioncore.warn, but also print Lua stack trace. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.x_change_property(integer win, integer atom, integer atom_type, integer format, string mode, table tab) + +
+
Description:
+
Modify a window property. The mode is one of + "replace", "prepend" or "append", and format + is either 8, 16 or 32. Also see ioncore.x_get_window_property + and the XChangeProperty(3) manual page. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.x_delete_property(integer win, integer atom) + +
+
Description:
+
Delete a window property. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string ioncore.x_get_atom_name(integer atom) + +
+
Description:
+
Get the name of an atom. See XGetAtomName(3) manual page for + details. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.x_get_text_property(integer win, integer atom) + +
+
Description:
+
Get a text property for a window (STRING, COMPOUND_TEXT, + or UTF8_STRING property converted). The fields in the returned + table (starting from 1) are the null-separated parts of the property. + See the XGetTextProperty(3) manual page for more information. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table ioncore.x_get_window_property(integer win, integer atom, integer atom_type, integer n32expected, bool more) + +
+
Description:
+
Get a property atom of type atom_type for window win. + The n32expected parameter indicates the expected number of 32bit + words, and more indicates whether all or just this amount of data + should be fetched. Each 8, 16 or 32bit element of the property, as + deciphered from atom_type is a field in the returned table. + See XGetWindowProperty(3) manual page for more information. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer ioncore.x_intern_atom(string name, bool only_if_exists) + +
+
Description:
+
Create a new atom. See XInternAtom(3) manual page for details. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void ioncore.x_set_text_property(integer win, integer atom, table tab) + +
+
Description:
+
Set a text property for a window. The fields of tab starting from + 1 should be the different null-separated parts of the property. + See the XSetTextProperty(3) manual page for more information. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.kpress(keyspec, cmd, guard) + +
+
Description:
+
Creates a binding description table for the action of pressing a key given + by keyspec (with possible modifiers) to the function func. + For more information on bindings, see section 3.3. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.kpress_wait(keyspec, cmd, guard) + +
+
Description:
+
This is similar to kpress but after calling cmd, + Ioncore waits for all modifiers to be released before processing + any further actions. + For more information on bindings, see section 3.3. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.match_winprop_name(prop, cwin) + +
+
Description:
+
The basic name-based winprop matching criteria. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.mclick(buttonspec, cmd, guard) + +
+
Description:
+
Creates a binding description table for the action of clicking a mouse + button while possible modifier keys are pressed, + both given by buttonspec, to the function func. + For more information, see section 3.3. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.mdblclick(buttonspec, cmd, guard) + +
+
Description:
+
Similar to mclick but for double-click. + Also see section 3.3. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.mdrag(buttonspec, cmd, guard) + +
+
Description:
+
Creates a binding description table for the action of moving the mouse + (or other pointing device) while the button given by buttonspec + is held pressed and the modifiers given by buttonspec were pressed + when the button was initially pressed. + Also see section 3.3. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.menuentry(name, cmd, guard) + +
+
Description:
+
Use this function to define normal menu entries. The string name + is the string shown in the visual representation of menu, and the + parameter cmd and guard are similar to those of + ioncore.defbindings. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.mpress(buttonspec, cmd, guard) + +
+
Description:
+
Similar to mclick but for just pressing the mouse button. + Also see section 3.3. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.refresh_stylelist() + +
+
Description:
+
Refresh list of known style files. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.submap(kcb_, list) + +
+
Description:
+
Returns a function that creates a submap binding description table. + When the key press action keyspec occurs, Ioncore will wait for + a further key presse and act according to the submap. + For details, see section 3.3. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
ioncore.submenu(name, sub_or_name, options) + +
+
Description:
+
Use this function to define menu entries for submenus. The parameter + sub_or_name is either a table of menu entries or the name + of an already defined menu. The initial menu entry to highlight can be + specified by options.initial as either an integer starting from 1, + or a function that returns such a number. Another option supported is + options.noautoexpand that will cause mod_query.query_menu + to not automatically expand this submenu. + +
+
+ +

+ +

+6.1.1 WClientWin functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
table WClientWin.get_ident(WClientWin cwin) + +
+
Description:
+
Returns a table containing the properties WM_CLASS (table entries + instance and class) and WM_WINDOW_ROLE (role) + properties for cwin. If a property is not set, the corresponding + field(s) are unset in the table. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WClientWin.is_fullscreen(WClientWin cwin) + +
+
Description:
+
Is cwin in full screen mode? + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WClientWin.kill(WClientWin cwin) + +
+
Description:
+
Attempt to kill (with XKillWindow) the client that owns the X + window correspoding to cwin. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WClientWin.nudge(WClientWin cwin) + +
+
Description:
+
Attempts to fix window size problems with non-ICCCM compliant + programs. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WClientWin.quote_next(WClientWin cwin) + +
+
Description:
+
Send next key press directly to cwin. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WClientWin.set_fullscreen(WClientWin cwin, string how) + +
+
Description:
+
Set client window cwin full screen state according to the + parameter how (set/unset/toggle). Resulting state is returned, + which may not be what was requested. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
double WClientWin.xid(WClientWin cwin) + +
+
Description:
+
Return the X window id for the client window. + +
+
+ +

+ +

+6.1.2 WFrame functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
bool WFrame.is_shaded(WFrame frame) + +
+
Description:
+
Is frame shaded? + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WFrame.maximize_horiz(WFrame frame) + +
+
Description:
+
Attempt to toggle horizontal maximisation of frame. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WFrame.maximize_vert(WFrame frame) + +
+
Description:
+
Attempt to toggle vertical maximisation of frame. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string WFrame.mode(WFrame frame) + +
+
Description:
+
Get frame mode. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WFrame.p_switch_tab(WFrame frame) + +
+
Description:
+
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. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WFrame.p_tabdrag(WFrame frame) + +
+
Description:
+
Start dragging the tab that the user pressed on with the pointing device. + This function should only be used by binding it to mpress or + mdrag action with area ''tab''. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WFrame.set_mode(WFrame frame, string modestr) + +
+
Description:
+
Set frame mode. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WFrame.set_numbers(WFrame frame, string how) + +
+
Description:
+
Control whether tabs show numbers (set/unset/toggle). + Resulting state is returned, which may not be what was + requested. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WFrame.set_shaded(WFrame frame, string how) + +
+
Description:
+
Set shading state according to the parameter how + (set/unset/toggle). Resulting state is returned, which may not be + what was requested. + +
+
+ +

+ +

+6.1.3 WGroup functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WGroup.attach(WGroup ws, WRegion reg, table param) + +
+
Description:
+
Attach and reparent existing region reg to ws. + The table param may contain the fields index and + switchto that are interpreted as for WMPlex.attach_new. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WGroup.attach_new(WGroup ws, table param) + +
+
Description:
+
Create a new region to be managed by ws. At least the following + fields in param are understood: + +

+ + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
typeClass name (a string) of the object to be created. Mandatory.
nameName of the object to be created (a string). Optional.
switchtoShould the region be switched to (boolean)? Optional.
levelStacking level; default is 1.
modalMake object modal; ignored if level is set.
sizepolicySize policy.
+ +

+In addition parameters to the region to be created are passed in this + same table. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WGroup.bottom(WGroup ws) + +
+
Description:
+
Returns the 'bottom' of ws. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WGroup.managed_list(WGroup ws) + +
+
Description:
+
Returns a list of regions managed by the workspace (frames, mostly). + +
+
+ +

+ +

+6.1.4 WGroupCW functions +

+ +

+ +

+6.1.5 WGroupWS functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
bool WGroupWS.attach_framed(WGroupWS ws, WRegion reg, table t) + +
+
Description:
+
Attach region reg on ws. + At least the following fields in t are supported: + +

+ + + + + + + + + + +
FieldDescription
switchtoShould the region be switched to (boolean)? Optional.
geomGeometry; x and y, if set, indicates top-left of + the frame to be created while width and height, if set, indicate + the size of the client window within that frame. Optional.
+ +

+
+ +

+ +

+6.1.6 WInfoWin functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
void WInfoWin.set_text(WInfoWin p, string str) + +
+
Description:
+
Set contents of the info window. + +
+
+ +

+ +

+6.1.7 WMPlex functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WMPlex.attach(WMPlex mplex, WRegion reg, table param) + +
+
Description:
+
Attach and reparent existing region reg to mplex. + The table param may contain the fields index and + switchto that are interpreted as for WMPlex.attach_new. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WMPlex.attach_new(WMPlex mplex, table param) + +
+
Description:
+
Create a new region to be managed by mplex. At least the following + fields in param are understood (all but type are optional). + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
type(string) Class name (a string) of the object to be created.
name(string) Name of the object to be created (a string).
switchto(boolean) Should the region be switched to (boolean)?
unnumbered(boolean) Do not put on the numbered mutually + exclusive list.
index(integer) Index on this list, same as for + WMPlex.set_index.
level(integer) Stacking level.
modal(boolean) Shortcut for modal stacking level.
hidden(boolean) Attach hidden, if not prevented + by e.g. the mutually exclusive list being empty. + This option overrides switchto.
sizepolicy(integer) Size policy. + (TODO: document them somewhere.)
geom(table) Geometry specification.
+ +

+In addition parameters to the region to be created are passed in this + same table. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMPlex.attach_tagged(WMPlex mplex) + +
+
Description:
+
Attach all tagged regions to mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMPlex.dec_index(WMPlex mplex, WRegion r) + +
+
Description:
+
Move r ''right'' within objects managed by mplex on list 1. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer WMPlex.get_index(WMPlex mplex, WRegion reg) + +
+
Description:
+
Get index of reg within the multiplexer on list 1. The first region + managed by mplex has index zero. If reg is not managed by + mplex, -1 is returned. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WMPlex.get_stdisp(WMPlex mplex) + +
+
Description:
+
Get status display information. See WMPlex.get_stdisp for + information on the fields. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMPlex.inc_index(WMPlex mplex, WRegion r) + +
+
Description:
+
Move r ''right'' within objects managed by mplex on list 1. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WMPlex.is_hidden(WMPlex mplex, WRegion reg) + +
+
Description:
+
Is reg on within mplex and hidden? + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WMPlex.managed_list(WMPlex mplex) + +
+
Description:
+
Returns a list of all regions managed by mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer WMPlex.mx_count(WMPlex mplex) + +
+
Description:
+
Returns the number of objects on the mutually exclusive list of mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WMPlex.mx_current(WMPlex mplex) + +
+
Description:
+
Returns the managed object currently active within the mutually exclusive + list of mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WMPlex.mx_list(WMPlex mplex) + +
+
Description:
+
Returns a list of regions on the numbered/mutually exclusive list of + mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WMPlex.mx_nth(WMPlex mplex, integer n) + +
+
Description:
+
Returns the n:th object managed by mplex on the + l:th layer. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WMPlex.set_hidden(WMPlex mplex, WRegion reg, string how) + +
+
Description:
+
Set the visibility of the region reg on mplex + as specified with the parameter how (set/unset/toggle). + The resulting state is returned. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMPlex.set_index(WMPlex mplex, WRegion reg, integer index) + +
+
Description:
+
Set index of reg within the multiplexer to index within + the mutually exclusive list. Special values for index are: + + + + + + + +
After WMPlex.mx_current.
Last.
+ +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WMPlex.set_stdisp(WMPlex mplex, table t) + +
+
Description:
+
Set/create status display for mplex. Table is a standard + description of the object to be created (as passed to e.g. + WMPlex.attach_new). In addition, the following fields are + recognised: + +

+ + + + + + + + + + +
FieldDescription
posThe corner of the screen to place the status display + in. One of tl, tr, bl or br.
actionIf this field is set to keep, corner + and orientation are changed for the existing + status display. If this field is set to remove, + the existing status display is removed. If this + field is not set or is set to replace, a + new status display is created and the old, if any, + removed.
+ +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMPlex.switch_next(WMPlex mplex) + +
+
Description:
+
Have mplex display next (wrt. currently selected) object managed + by it. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMPlex.switch_nth(WMPlex mplex, integer n) + +
+
Description:
+
Have mplex display the n:th object managed by it. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMPlex.switch_prev(WMPlex mplex) + +
+
Description:
+
Have mplex display previous (wrt. currently selected) object + managed by it. + +
+
+ +

+ +

+6.1.8 WMoveresMode functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
void WMoveresMode.cancel(WMoveresMode mode) + +
+
Description:
+
Return from move/resize cancelling changes if opaque + move/resize has not been enabled. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMoveresMode.finish(WMoveresMode mode) + +
+
Description:
+
Return from move/resize mode and apply changes unless opaque + move/resize is enabled. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMoveresMode.move(WMoveresMode mode, integer horizmul, integer vertmul) + +
+
Description:
+
Move resize mode target one step: + +

+ + + + + + + + + + + + + +
horizmul/vertmuleffect
-1Move left/up
0No effect
1Move right/down
+ +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMoveresMode.resize(WMoveresMode mode, integer left, integer right, integer top, integer bottom) + +
+
Description:
+
Shrink or grow resize mode target one step in each direction. + Acceptable values for the parameters left, right, top + and bottom are as follows: -1: shrink along, + 0: do not change, 1: grow along corresponding border. + +
+
+ +

+ +

+6.1.9 WRegion functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
WMoveresMode WRegion.begin_kbresize(WRegion reg) + +
+
Description:
+
Enter move/resize mode for reg. The bindings set with + ioncore.set_bindings for WMoveresMode are used in + this mode. Of the functions exported by the Ion C core, only + WMoveresMode.resize, WMoveresMode.move, + WMoveresMode.cancel and WMoveresMode.end are + allowed to be called while in this mode. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WRegion.current(WRegion mgr) + +
+
Description:
+
Return the object, if any, that is considered ''currently active'' + within the objects managed by mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WRegion.geom(WRegion reg) + +
+
Description:
+
Returns the geometry of reg within its parent; a table with fields + x, y, w and h. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.goto(WRegion reg) + +
+
Description:
+
Attempt to display reg, save region activity status and then + warp to (or simply set focus to if warping is disabled) reg. + +

+Note that this function is asynchronous; the region will not + actually have received the focus when this function returns. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.is_active(WRegion reg) + +
+
Description:
+
Is reg active/does it or one of it's children of focus? + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.is_activity(WRegion reg) + +
+
Description:
+
Is activity notification set on reg. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.is_mapped(WRegion reg) + +
+
Description:
+
Is reg visible/is it and all it's ancestors mapped? + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.is_tagged(WRegion reg) + +
+
Description:
+
Is reg tagged? + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WRegion.manager(WRegion reg) + +
+
Description:
+
Returns the region that manages reg. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string WRegion.name(WRegion reg) + +
+
Description:
+
Returns the name for reg. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WWindow WRegion.parent(WRegion reg) + +
+
Description:
+
Returns the parent region of reg. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRootWin WRegion.rootwin_of(WRegion reg) + +
+
Description:
+
Returns the root window reg is on. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.rqclose(WRegion reg, bool relocate) + +
+
Description:
+
Attempt to close/destroy reg. 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 WM_DELETE protocol (see also + WClientWin.kill). If the operation is likely to succeed, + true is returned, otherwise false. In most cases the + region will not have been actually destroyed when this function returns. + If relocate is not set, and reg manages other regions, it + will not be closed. Otherwise the managed regions will be attempted + to be relocated. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WRegion.rqclose_propagate(WRegion reg, WRegion maybe_sub) + +
+
Description:
+
Recursively attempt to close a region or one of the regions managed by + it. If sub is set, it will be used as the managed region, otherwise + WRegion.current(reg). The object to be closed is + returned or NULL if nothing can be closed. Also see notes for + WRegion.rqclose. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WRegion.rqgeom(WRegion reg, table g) + +
+
Description:
+
Attempt to resize and/or move reg. The table g is a usual + geometry specification (fields x, y, w and h), + but may contain missing fields, in which case, reg's manager may + attempt to leave that attribute unchanged. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.rqorder(WRegion reg, string ord) + +
+
Description:
+
Request ordering. Currently supported values for ord + are 'front' and 'back'. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WScreen WRegion.screen_of(WRegion reg) + +
+
Description:
+
Returns the screen reg is on. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.set_activity(WRegion reg, string how) + +
+
Description:
+
Set activity flag of reg. The how parameter most be + one of (set/unset/toggle). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.set_name(WRegion reg, string p) + +
+
Description:
+
Set the name of reg to p. If the name is already in use, + an instance number suffix <n> will be attempted. If p has + such a suffix, it will be modified, otherwise such a suffix will be + added. Setting p to nil will cause current name to be removed. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.set_name_exact(WRegion reg, string p) + +
+
Description:
+
Similar to WRegion.set_name except if the name is already in use, + other instance numbers will not be attempted. The string p should + not contain a <n> suffix or this function will fail. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WRegion.set_tagged(WRegion reg, string how) + +
+
Description:
+
Change tagging state of reg as defined by how + (set/unset/toggle). Resulting state is returned. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WRegion.size_hints(WRegion reg) + +
+
Description:
+
Returns size hints for reg. The returned table always contains the + fields min_?, base_? and sometimes the fields max_?, + base_? and inc_?, where ?=w, h. + +
+
+ +

+ +

+6.1.10 WRootWin functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
WScreen WRootWin.current_scr(WRootWin rootwin) + +
+
Description:
+
Returns previously active screen on root window rootwin. + +
+
+ +

+ +

+6.1.11 WScreen functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
integer WScreen.id(WScreen scr) + +
+
Description:
+
Return the numerical id for screen scr. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WScreen.set_managed_offset(WScreen scr, table offset) + +
+
Description:
+
Set offset of objects managed by the screen from actual screen geometry. + The table offset should contain the entries x, y, + w and h indicating offsets of that component of screen + geometry. + +
+
+ +

+ +

+6.1.12 WWindow functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
void WWindow.p_move(WWindow wwin) + +
+
Description:
+
Start moving wwin with the mouse or other pointing device. + This function should only be used by binding it to mpress or + mdrag action. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WWindow.p_resize(WWindow wwin) + +
+
Description:
+
Start resizing wwin with the mouse or other pointing device. + This function should only be used by binding it to mpress or + mdrag action. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
double WWindow.xid(WWindow wwin) + +
+
Description:
+
Return the X window id for wwin. + +
+
+ +

+ +

+6.1.13 global functions +

+ +

+ +

+
+ +
+
Synopsis:
+
export(lib, ...) + +
+
Description:
+
Export a list of functions from lib into global namespace. + +
+
+ +

+ +

+6.1.14 gr functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
void gr.read_config() + +
+
Description:
+
Read drawing engine configuration file draw.lua. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void gr.refresh() + +
+
Description:
+
Refresh objects' brushes to update them to use newly loaded style. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool gr.select_engine(string engine) + +
+
Description:
+
Future requests for ''brushes'' are to be forwarded to the drawing engine + engine. 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 gr.read_config. + +
+
+ +

+ +

+6.1.15 string functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
string.shell_safe(str) + +
+
Description:
+
Make str shell-safe. + +
+
+ +

+ +

+6.1.16 table functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
table.append(t1, t2) + +
+
Description:
+
Add entries that do not exist in t1 from t2 to t1. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table.copy(t, deep) + +
+
Description:
+
Make copy of table. If deep is unset, shallow one-level + copy is made, otherwise a deep copy is made. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table.icat(t1, t2) + +
+
Description:
+
Insert all positive integer entries from t2 into t1. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table.join(t1, t2) + +
+
Description:
+
Create a table containing all entries from t1 and those from + t2 that are missing from t1. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table.map(f, t) + +
+
Description:
+
Map all entries of t by f. + +
+
+ +

+ +

+ +
+6.2 Functions defined in mod_tiling +

+ +
+
+ + +
+
Synopsis:
+
bool mod_tiling.detach(WRegion reg) + +
+
Description:
+
Detach reg, i.e. make it managed by its nearest ancestor + WGroup, framed if reg is not itself WFrame. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table mod_tiling.get() + +
+
Description:
+
Get parameters. For details see mod_tiling.set. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool mod_tiling.mkbottom(WRegion reg) + +
+
Description:
+
Create a new WTiling 'bottom' for the group of reg, + consisting of reg. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void mod_tiling.set(table tab) + +
+
Description:
+
Set parameters. Currently only raise_delay (in milliseconds) + is supported. + +
+
+ +

+ +

+6.2.1 WSplit functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
table WSplit.geom(WSplit split) + +
+
Description:
+
Returns the area of workspace used by the regions under split. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WSplitInner WSplit.parent(WSplit split) + +
+
Description:
+
Return parent split for split. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WSplit.rqgeom(WSplit node, table g) + +
+
Description:
+
Attempt to resize and/or move the split tree starting at node. + Behaviour and the g parameter are as for WRegion.rqgeom + operating on node (if it were a WRegion). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WSplit.transpose(WSplit node) + +
+
Description:
+
Transpose contents of node. + +
+
+ +

+ +

+6.2.2 WSplitInner functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
WSplit WSplitInner.current(WSplitInner node) + +
+
Description:
+
Returns the most previously active child node of split. + +
+
+ +

+ +

+6.2.3 WSplitRegion functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WSplitRegion.reg(WSplitRegion node) + +
+
Description:
+
Returns the region contained in node. + +
+
+ +

+ +

+6.2.4 WSplitSplit functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
WSplit WSplitSplit.br(WSplitSplit split) + +
+
Description:
+
Returns the bottom or right child node of split depending + on the direction of the split. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string WSplitSplit.dir(WSplitSplit split) + +
+
Description:
+
Returns the direction of split; either ''vertical'' or + ''horizontal''. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WSplitSplit.flip(WSplitSplit split) + +
+
Description:
+
Flip contents of node. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WSplit WSplitSplit.tl(WSplitSplit split) + +
+
Description:
+
Returns the top or left child node of split depending + on the direction of the split. + +
+
+ +

+ +

+6.2.5 WTiling functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
bool WTiling.flip_at(WTiling ws, WRegion reg) + +
+
Description:
+
Flip ws at reg or root if nil. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WTiling.transpose_at(WTiling ws, WRegion reg) + +
+
Description:
+
Transpose ws at reg or root if nil. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WTiling.farthest(WTiling ws, string dirstr, bool any) + +
+
Description:
+
Return the most previously active region on ws with no + other regions next to it in direction dirstr + (left/right/up/down). If any is not set, the status + display is not considered. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WTiling.managed_list(WTiling ws) + +
+
Description:
+
Returns a list of regions managed by the workspace (frames, mostly). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WRegion WTiling.nextto(WTiling ws, WRegion reg, string dirstr, bool any) + +
+
Description:
+
Return the most previously active region next to reg in + direction dirstr (left/right/up/down). The region reg + must be managed by ws. If any is not set, the status display + is not considered. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WSplitRegion WTiling.node_of(WTiling ws, WRegion reg) + +
+
Description:
+
For region reg managed by ws return the WSplit + a leaf of which reg is. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WTiling.set_floating_at(WTiling ws, WRegion reg, string how, string dirstr) + +
+
Description:
+
Toggle floating of the sides of a split containin reg as indicated + by the parameters how (set/unset/toggle) and dirstr + (left/right/up/down/any). The new status is returned (and false + also on error). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WSplitSplit WTiling.set_floating(WTiling ws, WSplitSplit split, string how) + +
+
Description:
+
Toggle floating of a split's sides at split as indicated by the + parameter how (set/unset/toggle). A split of the appropriate is + returned, if there was a change. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WFrame WTiling.split(WTiling ws, WSplit node, string dirstr) + +
+
Description:
+
Create a new frame on ws above/below/left of/right of + node as indicated by dirstr. If dirstr is + prefixed with ''floating:'' a floating split is created. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WFrame WTiling.split_at(WTiling ws, WFrame frame, string dirstr, bool attach_current) + +
+
Description:
+
Split frame creating a new frame to direction dirstr + (one of ''left'', ''right'', ''top'' or ''bottom'') of frame. + If attach_current is set, the region currently displayed in + frame, if any, is moved to thenew frame. + If dirstr is prefixed with ''floating:'' a floating split is + created. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WFrame WTiling.split_top(WTiling ws, string dirstr) + +
+
Description:
+
Same as WTiling.split at the root of the split tree. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WSplit WTiling.split_tree(WTiling ws) + +
+
Description:
+
Returns the root of the split tree. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WTiling.unsplit_at(WTiling ws, WFrame frame) + +
+
Description:
+
Try to relocate regions managed by frame to another frame + and, if possible, destroy the frame. + +
+
+ +

+ +

+ +
+6.3 Functions defined in mod_query +

+ +
+
+ + +
+
Synopsis:
+
mod_query.defcmd(cmd, fn) + +
+
Description:
+
Define a command override for the query_exec query. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table mod_query.get() + +
+
Description:
+
Get module configuration. For more information see + mod_query.set. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void mod_query.history_clear() + +
+
Description:
+
Clear line editor history. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string mod_query.history_get(integer n) + +
+
Description:
+
Get entry at index n in line editor history, 0 being the latest. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool mod_query.history_push(string str) + +
+
Description:
+
Push an entry into line editor history. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer mod_query.history_search(string s, integer from, bool bwd) + +
+
Description:
+
Try to find matching history entry. Returns -1 if none was + found. The parameter from specifies where to start + searching from, and bwd causes backward search from + that point. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table mod_query.history_table() + +
+
Description:
+
Return table of history entries. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
WMessage mod_query.message(WMPlex mplex, string p) + +
+
Description:
+
Display a message in the mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void mod_query.set(table tab) + +
+
Description:
+
Set module configuration. The following are supported: + +

+ + + + + + + + + + +
FieldDescription
autoshowcompl(boolean) Is auto-show-completions enabled? + (default: true).
autoshowcompl_delay(integer) auto-show-completions delay + in milliseconds (default: 250).
+ +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
WMessage mod_query.warn(WMPlex mplex, string p) + +
+
Description:
+
Display an error message box in the multiplexer mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.popen_completions(cp, cmd, fn, reshnd) + +
+
Description:
+
This function can be used to read completions from an external source. + The parameter cp is the completion proxy to be used, + and the string cmd the shell command to be executed. To its stdout, + the command should on the first line write the common_beg + parameter of WComplProxy.set_completions (which fn maybe used + to override) and a single actual completion on each of the successive lines. + The function reshnd may be used to override a result table + building routine. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query(mplex, prompt, initvalue, handler, completor, + context) + +
+
Description:
+
Low-level query routine. mplex is the WMPlex to display + the query in, prompt the prompt string, and initvalue + the initial contents of the query box. handler is a function + that receives (mplex, result string) as parameter when the + query has been succesfully completed, completor the completor + routine which receives a (cp, str, point) as parameters. + The parameter str is the string to be completed and point + cursor's location within it. Completions should be eventually, + possibly asynchronously, set with WComplProxy.set_completions + on cp. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_attachclient(mplex) + +
+
Description:
+
This query asks for the name of a client window and switches + focus to the one entered. It uses the completion function + ioncore.complete_clientwin. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_editfile(mplex, script, prompt) + +
+
Description:
+
Asks for a file to be edited. This script uses + run-mailcap -mode=edit by default, but you may provide an + alternative script to use. The default prompt is "Edit file:" (translated). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_exec(mplex) + +
+
Description:
+
This function asks for a command to execute with /bin/sh. + If the command is prefixed with a colon (':'), the command will + be run in an XTerm (or other terminal emulator) using the script + ion-runinxterm. Two colons ('::') will ask you to press + enter after the command has finished. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_gotoclient(mplex) + +
+
Description:
+
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 ioncore.complete_clientwin. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_lua(mplex) + +
+
Description:
+
This query asks for Lua code to execute. It sets the variable '_' + in the local environment of the string to point to the mplex where the + query was created. It also sets the table arg in the local + environment to {_, _:current()}. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_man(mplex, prog) + +
+
Description:
+
This query asks for a manual page to display. By default it runs the + man command in an xterm using ion-runinxterm, + but it is possible to pass another program as the prog argument. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_menu(mplex, themenu, prompt) + +
+
Description:
+
This query can be used to create a query of a defined menu. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_renameframe(frame) + +
+
Description:
+
This function asks for a name new for the frame where the query + was created. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_renameworkspace(mplex) + +
+
Description:
+
This function asks for a name new for the workspace on which the + query resides. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_restart(mplex) + +
+
Description:
+
This query asks whether the user wants restart Ioncore. + If the answer is 'y', 'Y' or 'yes', so will happen. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_runfile(mplex, script, prompt) + +
+
Description:
+
Asks for a file to be viewed. This script uses + run-mailcap -action=view by default, but you may provide an + alternative script to use. The default prompt is "View file:" (translated). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_shutdown(mplex) + +
+
Description:
+
This query asks whether the user wants to exit Ion (no session manager) + or close the session (running under a session manager that supports such + requests). If the answer is 'y', 'Y' or 'yes', so will happen. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_ssh(mplex, ssh) + +
+
Description:
+
This query asks for a host to connect to with SSH. + Hosts to tab-complete are read from ~/.ssh/known_hosts. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_workspace(mplex) + +
+
Description:
+
This query asks for the name of a workspace. If a workspace + (an object inheriting WGroupWS) 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. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.query_yesno(mplex, prompt, handler) + +
+
Description:
+
This function query will display a query with prompt prompt in + mplex and if the user answers affirmately, call handler + with mplex as parameter. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.show_about_ion(mplex) + +
+
Description:
+
Display an "About Ion" message in mplex. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_query.show_tree(mplex, reg, max_depth) + +
+
Description:
+
Show information about a region tree + +
+
+ +

+ +

+6.3.1 WComplProxy functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
bool WComplProxy.set_completions(WComplProxy proxy, table compls) + +
+
Description:
+
Set completion list of the WEdln that proxy refers to to + compls, if it is still waiting for this completion run. The + numerical indexes of compls list the found completions. If the + entry common_beg (common_end) exists, it gives an extra + common prefix (suffix) of all found completions. + +
+
+ +

+ +

+6.3.2 WEdln functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.back(WEdln wedln) + +
+
Description:
+
Move backward one character. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.backspace(WEdln wedln) + +
+
Description:
+
Delete previous character. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.bkill_word(WEdln wedln) + +
+
Description:
+
Starting from the previous characters, delete possible whitespace and + preceding alphanumeric characters until previous non-alphanumeric character. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.bol(WEdln wedln) + +
+
Description:
+
Go to the beginning of line. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.bskip_word(WEdln wedln) + +
+
Description:
+
Go to to beginning of current sequence of alphanumeric characters + followed by whitespace. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.clear_mark(WEdln wedln) + +
+
Description:
+
Clear mark. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.complete(WEdln wedln, string cycle, string mode) + +
+
Description:
+
Call completion handler with the text between the beginning of line and + current cursor position, or select next/previous completion from list if in + auto-show-completions mode and cycle is set to ``next'' or ``prev'', + respectively. The mode may be ``history'' or ``normal''. If it is + not set, the previous mode is used. Normally next entry is not cycled to + despite the setting of cycle if mode switch occurs. To override + this, use ``next-always'' and ``prev-always'' for cycle. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string WEdln.contents(WEdln wedln) + +
+
Description:
+
Get line editor contents. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
string WEdln.context(WEdln wedln) + +
+
Description:
+
Get history context for wedln. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.copy(WEdln wedln) + +
+
Description:
+
Copy text between mark and current cursor position to clipboard. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.cut(WEdln wedln) + +
+
Description:
+
Copy text between mark and current cursor position to clipboard + and then delete that sequence. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.delete(WEdln wedln) + +
+
Description:
+
Delete current character. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.eol(WEdln wedln) + +
+
Description:
+
Go to the end of line. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.finish(WEdln wedln) + +
+
Description:
+
Close wedln and call any handlers. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.forward(WEdln wedln) + +
+
Description:
+
Move forward one character. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.history_next(WEdln wedln, bool match) + +
+
Description:
+
Replace line editor contents with next entry in history if one exists. + If match is true, the initial part of the history entry + must match the current line from beginning to point. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.history_prev(WEdln wedln, bool match) + +
+
Description:
+
Replace line editor contents with previous in history if one exists. + If match is true, the initial part of the history entry + must match the current line from beginning to point. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.insstr(WEdln wedln, string str) + +
+
Description:
+
Input str in wedln at current editing point. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WEdln.is_histcompl(WEdln wedln) + +
+
Description:
+
Get history completion mode. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.kill_line(WEdln wedln) + +
+
Description:
+
Delete the whole line. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.kill_to_bol(WEdln wedln) + +
+
Description:
+
Delete all characters from previous to beginning of line. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.kill_to_eol(WEdln wedln) + +
+
Description:
+
Delete all characters from current to end of line. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.kill_word(WEdln wedln) + +
+
Description:
+
Starting from the current point, delete possible whitespace and + following alphanumeric characters until next non-alphanumeric character. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer WEdln.mark(WEdln wedln) + +
+
Description:
+
Get current mark (start of selection) for wedln. + Return value of -1 indicates that there is no mark, and + 0 is the beginning of the line. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WEdln.next_completion(WEdln wedln) + +
+
Description:
+
Select next completion. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.paste(WEdln wedln) + +
+
Description:
+
Request selection from application holding such. + +

+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. + +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
integer WEdln.point(WEdln wedln) + +
+
Description:
+
Get current editing point. + Beginning of the edited line is point 0. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool WEdln.prev_completion(WEdln wedln) + +
+
Description:
+
Select previous completion. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.set_context(WEdln wedln, string context) + +
+
Description:
+
Set history context for wedln. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.set_mark(WEdln wedln) + +
+
Description:
+
Set mark to current cursor position. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.skip_word(WEdln wedln) + +
+
Description:
+
Go to to end of current sequence of whitespace followed by alphanumeric + characters.. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.transpose_chars(WEdln wedln) + +
+
Description:
+
Transpose characters. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WEdln.transpose_words(WEdln wedln) + +
+
Description:
+
Transpose words. + +
+
+ +

+ +

+6.3.3 WInput functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
void WInput.cancel(WInput input) + +
+
Description:
+
Close input not calling any possible finish handlers. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WInput.scrolldown(WInput input) + +
+
Description:
+
Scroll input input text contents down. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WInput.scrollup(WInput input) + +
+
Description:
+
Scroll input input text contents up. + +
+
+ +

+ +

+ +
+6.4 Functions defined in mod_menu +

+ +
+
+ + +
+
Synopsis:
+
mod_menu.grabmenu(mplex, sub, menu_or_name, param) + +
+
Description:
+
This function is similar to mod_menu.menu, but input + is grabbed and the key used to active the menu can be used to + cycle through menu entries. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_menu.menu(mplex, sub, menu_or_name, param) + +
+
Description:
+
Display a menu in the lower-left corner of mplex. + The variable menu_or_name is either the name of a menu + defined with mod_menu.defmenu or directly a table similar + to ones passesd to this function. When this function is + called from a binding handler, sub should be set to + the second argument of to the binding handler (_sub) + so that the menu handler will get the same parameters as the + binding handler. Extra options can be passed in the table + param. The initial entry can be specified as the field + initial as an integer starting from 1. Menus can be made + to use a bigger style by setting the field big to true. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table mod_menu.get() + +
+
Description:
+
Get module basic settings. For details, see mod_menu.set. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void mod_menu.set(table tab) + +
+
Description:
+
Set module basic settings. The parameter table may contain the + following fields: + +

+ + + + + + + + + + +
FieldDescription
scroll_amountNumber of pixels to scroll at a time + pointer-controlled menus when one extends + beyond a border of the screen and the pointer + touches that border.
scroll_delayTime between such scrolling events in + milliseconds.
+ +

+
+ +

+ +

+
+ + +
+
Synopsis:
+
mod_menu.pmenu(win, sub, menu_or_name) + +
+
Description:
+
This function displays a drop-down menu and should only + be called from a mouse press handler. The parameters are + similar to those of mod_menu.menu. + +
+
+ +

+ +

+6.4.1 WMenu functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
void WMenu.cancel(WMenu menu) + +
+
Description:
+
Close menu not calling any possible finish handlers. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMenu.finish(WMenu menu) + +
+
Description:
+
If selected entry is a submenu, display that. + Otherwise destroy the menu and call handler for selected entry. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMenu.select_next(WMenu menu) + +
+
Description:
+
Select next entry in menu. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMenu.select_nth(WMenu menu, integer n) + +
+
Description:
+
Select n:th entry in menu. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMenu.select_prev(WMenu menu) + +
+
Description:
+
Select previous entry in menu. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WMenu.typeahead_clear(WMenu menu) + +
+
Description:
+
Clear typeahead buffer. + +
+
+ +

+ +

+ +
+6.5 Functions defined in mod_dock +

+ +
+
+ + +
+
Synopsis:
+
void mod_dock.set_floating_shown_on(WMPlex mplex, string how) + +
+
Description:
+
Toggle floating docks on mplex. + +
+
+ +

+ +

+6.5.1 WDock functions +

+ +

+ +

+
+ + +
+
Synopsis:
+
bool WDock.attach(WDock dock, WRegion reg) + +
+
Description:
+
Attach reg to dock. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table WDock.get(WDock dock) + +
+
Description:
+
Get dock's configuration table. See WDock.set for a + description of the table. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WDock.resize(WDock dock) + +
+
Description:
+
Resizes and refreshes dock. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void WDock.set(WDock dock, table conftab) + +
+
Description:
+
Configure dock. conftab is a table of key/value pairs: + +

+ + + + + + + + + + + + + + + + + + + + + +
KeyValuesDescription
namestringName of dock
posstring in +Dock position. + Can only be used in floating mode.
growup/down/left/rightGrowth direction where new dockapps are added. Also + sets orientation for dock when working as WMPlex status + display (see WMPlex.set_stdisp).
is_autoboolShould dock automatically manage new dockapps?
+ +

+Any parameters not explicitly set in conftab will be left unchanged. + +

+
+ +

+ +

+ +
+6.6 Functions defined in mod_sp +

+ +
+
+ + +
+
Synopsis:
+
bool mod_sp.set_shown(WFrame sp, string how) + +
+
Description:
+
Toggle displayed status of sp. + The parameter how is one of (set/unset/toggle). + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool mod_sp.set_shown_on(WMPlex mplex, string how) + +
+
Description:
+
Change displayed status of some scratchpad on mplex if one is + found. The parameter how is one of (set/unset/toggle). + +
+
+ +

+ +

+ +
+6.7 Functions defined in de +

+ +
+
+ + +
+
Synopsis:
+
bool de.defstyle(string name, table tab) + +
+
Description:
+
Define a style. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
bool de.defstyle_rootwin(WRootWin rootwin, string name, table tab) + +
+
Description:
+
Define a style for the root window rootwin. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
void de.reset() + +
+
Description:
+
Clear all styles from drawing engine memory. + +
+
+ +

+ +

+
+ + +
+
Synopsis:
+
table de.substyle(string pattern, table tab) + +
+
Description:
+
Define a substyle. + +
+
+ +

+ +

+ +
+6.8 Hooks +

+ +

+ +

+
+ +
+
Hook name:
+
clientwin_do_manage_alt + +
+
Parameters:
+
(WClientWin, table) + +
+
Description:
+
Called when we want to manage a new client window. + The table argument contains the following fields: + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
switchtoboolDo we want to switch to the client window.
jumptoboolDo we want to jump to the client window.
userposboolGeometry set by user.
dockappboolClient window is a dockapp.
maprqboolMap request (and not initialisation scan).
gravitynumberWindow gravity.
geomtableRequested geometry; x, y, w, h.
tforWClientWinTransient for window.
+ +

+This hook is not called in protected mode and can be used for + arbitrary placement policies (deciding in which workspace a new + WClientWin should go). In this case, you can call +

+reg:attach(cwin)
+
+ where reg is the region where the window should go, and + cwin is the first argument of the function added to the + hook. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
clientwin_mapped_hook + +
+
Parameters:
+
WClientWin + +
+
Description:
+
Called when we have started to manage a client window. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
clientwin_unmapped_hook + +
+
Parameters:
+
number + +
+
Description:
+
Called when we no longer manage a client window. The parameter + is the X ID of the window; see WClientWin.xid. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
frame_managed_changed_hook + +
+
Parameters:
+
table + +
+
Description:
+
Called when there are changes in the objects managed by a frame + or their order. The table parameter has the following fields: + +

+ + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
regWFrameThe frame in question
modestring"switchonly", "reorder", + "add" or "remove"
swboolSwitch occured
subWRegionThe managed region (primarily) affected
+ +

+
+ +

+ +

+
+ +
+
Hook name:
+
ioncore_sigchld_hook + +
+
Parameters:
+
integer + +
+
Description:
+
Called when a child process has exited. The parameter + is the PID of the process. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
ioncore_deinit_hook + +
+
Parameters:
+
() + +
+
Description:
+
Called when Ion is deinitialising and about to quit. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
ioncore_post_layout_setup_hook + +
+
Parameters:
+
() + +
+
Description:
+
Called when Ion has done all initialisation and is almost ready to + enter the mainloop, except no windows are yet being managed. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
ioncore_snapshot_hook + +
+
Parameters:
+
() + +
+
Description:
+
Called to signal scripts and modules to save their state (if any). + +
+
+ +

+ +

+
+ +
+
Hook name:
+
tiling_placement_alt + +
+
Parameters:
+
table + +
+
Description:
+
Called when a client window is about to be managed by a WTiling + to allow for alternative placement policies. The table has the + following fields: + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
tilingWTilingThe tiling
regWRegionThe region (always a WClientWin at + the moment) to be placed
mptableThis table contains the same fields as + the parameter of clientwin_do_manage_alt
res_frameWFrameA succesfull handler should + return the target frame here.
+ This hook is just for placing within a given workspace after the + workspace has been decided by the default workspace selection + policy. It is called in protected mode. For arbitrary placement + policies, clientwin_do_manage_alt should be used; it + isn't called in protected mode, + +
+
+ +

+ +

+
+ +
+
Hook name:
+
panews_make_placement_alt + +
+
Parameters:
+
table + +
+
Description:
+
Called to make a placement on panews. The parameter table has + the following fields: + +

+ + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wsWPaneWSThe workspace
frameWFrameA frame initially allocated for the + region to be placed
regWRegionThe region to be placed
specifierWRegionFor drag&drop on handling empty areas
+ +

+The handler should set some of these fields on success: + +

+ + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
res_nodeWSplitTarget split
res_configWFrameNew configuration for it, unless + WSplitRegion
res_wintegerNew width for target split (optional)
res_hintegerNew height for target split (optional)
+ +

+
+ +

+ +

+
+ +
+
Hook name:
+
region_activated_hook + +
+
Parameters:
+
WRegion + +
+
Description:
+
Signalled when a region or one of its children has received the focus. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
region_activity_hook + +
+
Parameters:
+
WRegion + +
+
Description:
+
This hook is triggered when the activity flag of the parameter + region has been changed. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
region_do_warp_alt + +
+
Parameters:
+
WRegion + +
+
Description:
+
This alt-hook exist to allow for alternative pointer warping + implementations. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
region_inactivated_hook + +
+
Parameters:
+
WRegion + +
+
Description:
+
Signalled when the focus has moved from the parameter region or + one of its children to a non-child region of the parameter region. + +
+
+ +

+ +

+
+ +
+
Hook name:
+
screen_managed_changed_hook + +
+
Parameters:
+
table + +
+
Description:
+
Called when there are changes in the objects managed by a screen + or their order. The table parameter is similar to that of + frame_managed_changed_hook. + +
+
+ +

+ +

+ +

+ + + + diff --git a/ionconf/node8.html b/ionconf/node8.html new file mode 100644 index 0000000..7b79bc0 --- /dev/null +++ b/ionconf/node8.html @@ -0,0 +1,597 @@ + + + + + +A. The GNU General Public License + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+A. The GNU General Public License +

+ +

+

+
+

+

Version 2, June 1991 +
+

+

Copyright © 1989, 1991 Free Software Foundation, Inc. +
+

+

+

+
+

+

+

59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +
+

+

+

+
+

+

+

Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + +
+ +

+

+Preamble + +
+ +

+The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free software--to +make sure the software is free for all its users. This General Public +License applies to most of the Free Software Foundation's software and to +any other program whose authors commit to using it. (Some other Free +Software Foundation software is covered by the GNU Library General Public +License instead.) You can apply it to your programs, too. + +

+When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for this service +if you wish), that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free programs; +and that you know you can do these things. + +

+To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +

+For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And +you must show them these terms so they know their rights. + +

+We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +

+Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If +the software is modified by someone else and passed on, we want its +recipients to know that what they have is not the original, so that any +problems introduced by others will not reflect on the original authors' +reputations. + +

+Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent must +be licensed for everyone's free use or not licensed at all. + +

+The precise terms and conditions for copying, distribution and +modification follow. + +

+

+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND + MODIFICATION + +
+ +

+ +

    +
  1. +This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the +terms of this General Public License. The ``Program'', below, refers to +any such program or work, and a ``work based on the Program'' means either +the Program or any derivative work under copyright law: that is to say, a +work containing the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. (Hereinafter, +translation is included without limitation in the term ``modification''.) +Each licensee is addressed as ``you''. + +

    +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +

    +

  2. +
  3. You may copy and distribute verbatim copies of the Program's source + code as you receive it, in any medium, provided that you conspicuously + and appropriately publish on each copy an appropriate copyright notice + and disclaimer of warranty; keep intact all the notices that refer to + this License and to the absence of any warranty; and give any other + recipients of the Program a copy of this License along with the Program. + +

    +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +

    +

  4. +
  5. +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +

    + +

      +
    1. +You must cause the modified files to carry prominent notices stating that +you changed the files and the date of any change. + +

      +

    2. +
    3. +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +

      +

    4. +
    5. If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +

      +

    6. +
    + +

    +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +

    +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +

    +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +

    +

  6. +
  7. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +

    + +

      +
    1. +Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +

      +

    2. +
    3. +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +

      +

    4. +
    5. +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +

      +

    6. +
    + +

    +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +

    +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +

    +

  8. +
  9. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +

    +

  10. +
  11. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +

    +

  12. +
  13. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +

    +

  14. +
  15. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +

    +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +

    +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +

    +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +

    +

  16. +
  17. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +

    +

  18. +
  19. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +

    +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and ``any +later version'', you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +

    +

  20. +
  21. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +

    +

    + +NO WARRANTY + + +
    + +

    +

  22. +
  23. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +

    +

  24. +
  25. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +

    +

  26. +
+ +

+

+END OF TERMS AND CONDITIONS + +
+ +

+ +

+ +

+Appendix: How to Apply These Terms to Your New Programs +

+ +

+If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +

+To do so, attach the following notices to the program. It is safest to + attach them to the start of each source file to most effectively convey + the exclusion of warranty; and each file should have at least the + ``copyright'' line and a pointer to where the full notice is found. + +

+

+one line to give the program's name and a brief idea of what it does. +
+Copyright (C) yyyy name of author +
+

+

This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. +
+

+

This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +
+

+

You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +
+ +

+Also add information on how to contact you by electronic and paper mail. + +

+If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +

+

+Gnomovision version 69, Copyright (C) yyyy name of author +
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +
+This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +
+ +

+The hypothetical commands show w and show c should show the +appropriate parts of the General Public License. Of course, the commands +you use may be called something other than show w and show c; +they could even be mouse-clicks or menu items--whatever suits your +program. + +

+You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the program, if +necessary. Here is a sample; alter the names: + +

+

+Yoyodyne, Inc., hereby disclaims all copyright interest in the program +
`Gnomovision' (which makes passes at compilers) written by James Hacker. +
+

+

signature of Ty Coon, 1 April 1989 +
+Ty Coon, President of Vice + +
+ +

+This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications +with the library. If this is what you want to do, use the GNU Library +General Public License instead of this License. + +

+ +

+ + + + diff --git a/ionconf/node9.html b/ionconf/node9.html new file mode 100644 index 0000000..69a5aff --- /dev/null +++ b/ionconf/node9.html @@ -0,0 +1,103 @@ + + + + + +B. Full class hierarchy visible to Lua-side + + + + + + + + + + + + + + + + + + + + + + +

+ +
+B. Full class hierarchy visible to Lua-side +

+ +

+

+    Obj
+     |-->WHook
+     |-->WTimer
+     |-->WMoveresMode
+     |-->WMgmtMode (mod_mgmtmode)
+     |-->WRegion
+     |    |-->WClientWin
+     |    |-->WWindow
+     |    |    |-->WRootWin
+     |    |    |-->WMPlex
+     |    |    |    |-->WScreen
+     |    |    |    |-->WFrame
+     |    |    |-->WInfoWin
+     |    |    |    |-->WStatusBar (mod_statusbar)
+     |    |    |-->WMenu (mod_menu)
+     |    |    |-->WInput (mod_query)
+     |    |         |-->WEdln (mod_query)
+     |    |         |-->WMessage (mod_query)
+     |    |-->WGroup
+     |    |    |-->WGroupWS
+     |    |    |-->WGroupCW
+     |    |-->WTiling (mod_tiling)
+     |-->WSplit (mod_tiling)
+          |-->WSplitInner (mod_tiling)
+          |    |-->WSplitSplit (mod_tiling)
+          |         |-->WSplitFloat (mod_tiling)
+          |-->WSplitRegion (mod_tiling)
+               |-->WSplitST (mod_tiling)
+
+ +

+


+ + + diff --git a/ionconf/prev.png b/ionconf/prev.png new file mode 100644 index 0000000..e60b8b4 Binary files /dev/null and b/ionconf/prev.png differ diff --git a/ionconf/prev_g.png b/ionconf/prev_g.png new file mode 100644 index 0000000..476d956 Binary files /dev/null and b/ionconf/prev_g.png differ diff --git a/ionconf/up.png b/ionconf/up.png new file mode 100644 index 0000000..3937e16 Binary files /dev/null and b/ionconf/up.png differ diff --git a/ionnotes.dvi.gz b/ionnotes.dvi.gz new file mode 100644 index 0000000..2922df5 Binary files /dev/null and b/ionnotes.dvi.gz differ diff --git a/ionnotes.out b/ionnotes.out new file mode 100644 index 0000000..f29e5e3 --- /dev/null +++ b/ionnotes.out @@ -0,0 +1,22 @@ +\BOOKMARK [1][-]{section.1}{ Class and object hierarchies}{} +\BOOKMARK [2][-]{subsection.1.1}{ Class hierarchy}{section.1} +\BOOKMARK [2][-]{subsection.1.2}{ Object hierarchies: WRegion parents and managers}{section.1} +\BOOKMARK [3][-]{subsubsection.1.2.1}{ Parent--child relations}{subsection.1.2} +\BOOKMARK [3][-]{subsubsection.1.2.2}{ Manager--managed relations}{subsection.1.2} +\BOOKMARK [2][-]{subsection.1.3}{ Summary}{section.1} +\BOOKMARK [1][-]{section.2}{ Object system implementation}{} +\BOOKMARK [1][-]{section.3}{ The Lua interface}{} +\BOOKMARK [2][-]{subsection.3.1}{ Supported types}{section.3} +\BOOKMARK [2][-]{subsection.3.2}{ Exporting functions}{section.3} +\BOOKMARK [2][-]{subsection.3.3}{ Calling Lua functions and code}{section.3} +\BOOKMARK [2][-]{subsection.3.4}{ Miscellaneous notes}{section.3} +\BOOKMARK [1][-]{section.4}{ Miscellaneous design notes}{} +\BOOKMARK [2][-]{subsection.4.1}{ Destroying WObj:s}{section.4} +\BOOKMARK [2][-]{lstlisting.-36}{ The types !char*! and !const char*! as function parameters and return values}{section.4} +\BOOKMARK [1][-]{section.5}{ C coding style}{} +\BOOKMARK [2][-]{subsection.5.1}{ Whitespace}{section.5} +\BOOKMARK [2][-]{subsection.5.2}{ Braces}{section.5} +\BOOKMARK [2][-]{subsection.5.3}{ Names}{section.5} +\BOOKMARK [2][-]{subsection.5.4}{ Miscellaneous}{section.5} +\BOOKMARK [1][-]{section.A}{ The GNU General Public License}{} +\BOOKMARK [1][-]{section*.4}{Index}{} diff --git a/ionnotes.ps.gz b/ionnotes.ps.gz new file mode 100644 index 0000000..d432ffb Binary files /dev/null and b/ionnotes.ps.gz differ diff --git a/ionnotes.tex b/ionnotes.tex new file mode 100644 index 0000000..d8c10f3 --- /dev/null +++ b/ionnotes.tex @@ -0,0 +1,60 @@ +\documentclass[english,a4paper,11pt,oldtoc,mctitle]{artikel3} +\input{macros} + +% For including some files from reports +\newcommand{\xchapter}[1]{\section{#1}} +\newcommand{\xsection}[1]{\subsection{#1}} +\newcommand{\xsectionstar}[1]{\subsection*{#1}} +\newcommand{\xsubsection}[1]{\subsubsection{#1}} + + +\title{Ion: Notes for the module and patch writer} +\author{Tuomo Valkonen \\ tuomov at iki.fi} +%%DATE + +\makeindex + + +\begin{document} + +\maketitle + +Ion: Notes for the module and patch writer\\ +Copyright \copyright\ 2003--2004 Tuomo Valkonen. + +This document is free; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This document is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +section entitled ''GNU General Public License'' for more details. + +\bigskip + +\begin{abstract} + This document is an unorganized collection of notes for + those who want to write modules or patches to Ion. +\end{abstract} + +\tableofcontents + +\input{objects} + +\input{objectsimpl} + +\input{luaif} + +\input{designnotes} + +\input{cstyle} + +\appendix + +\input{gpl} + +\printindex + +\end{document} diff --git a/ionnotes/WARNINGS b/ionnotes/WARNINGS new file mode 100644 index 0000000..726c0ef --- /dev/null +++ b/ionnotes/WARNINGS @@ -0,0 +1,8 @@ +No implementation found for style `hyperref' +No implementation found for style `ae' +No implementation found for style `url' +No implementation found for style `tocbibind' +No implementation found for style `geometry' +No implementation found for style `calc' + +Substitution of arg to newlabelxx delayed. diff --git a/ionnotes/contents.png b/ionnotes/contents.png new file mode 100644 index 0000000..0c752c6 Binary files /dev/null and b/ionnotes/contents.png differ diff --git a/ionnotes/crossref.png b/ionnotes/crossref.png new file mode 100644 index 0000000..7dd2ddd Binary files /dev/null and b/ionnotes/crossref.png differ diff --git a/ionnotes/index.html b/ionnotes/index.html new file mode 100644 index 0000000..27c31f2 --- /dev/null +++ b/ionnotes/index.html @@ -0,0 +1,172 @@ + + + + + +Ion: Notes for the module and patch writer + + + + + + + + + + + + + + + + + + + +

+

Ion: Notes for the module and patch writer

+
+ +

Tuomo Valkonen

+

tuomov at iki.fi

+
+ +

+Ion: Notes for the module and patch writer +
+Copyright © 2003-2004 Tuomo Valkonen. + +

+This document is free; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +

+This document is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +section entitled ''GNU General Public License'' for more details. + +

+ +

+
+ +

+ +

Abstract:

+
+ This document is an unorganized collection of notes for + those who want to write modules or patches to Ion. +
+

+ +

+


+ + + + + +

+ + + diff --git a/ionnotes/index.png b/ionnotes/index.png new file mode 100644 index 0000000..698f09c Binary files /dev/null and b/ionnotes/index.png differ diff --git a/ionnotes/internals.pl b/ionnotes/internals.pl new file mode 100644 index 0000000..89e33bb --- /dev/null +++ b/ionnotes/internals.pl @@ -0,0 +1,34 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate internals original text with physical files. + + +$key = q/sec:objects/; +$ref_files{$key} = "$dir".q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:parentship/; +$ref_files{$key} = "$dir".q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:supptypes/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:calling/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:managership/; +$ref_files{$key} = "$dir".q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:exporting/; +$ref_files{$key} = "$dir".q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:classhierarchy/; +$ref_files{$key} = "$dir".q|node2.html|; +$noresave{$key} = "$nosave"; + +1; + diff --git a/ionnotes/ionnotes.css b/ionnotes/ionnotes.css new file mode 100644 index 0000000..d22be91 --- /dev/null +++ b/ionnotes/ionnotes.css @@ -0,0 +1,37 @@ +/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ +.MATH { font-family: "Century Schoolbook", serif; } +.MATH I { font-family: "Century Schoolbook", serif; font-style: italic } +.BOLDMATH { font-family: "Century Schoolbook", serif; font-weight: bold } + +/* implement both fixed-size and relative sizes */ +SMALL.XTINY { font-size : xx-small } +SMALL.TINY { font-size : x-small } +SMALL.SCRIPTSIZE { font-size : smaller } +SMALL.FOOTNOTESIZE { font-size : small } +SMALL.SMALL { } +BIG.LARGE { } +BIG.XLARGE { font-size : large } +BIG.XXLARGE { font-size : x-large } +BIG.HUGE { font-size : larger } +BIG.XHUGE { font-size : xx-large } + +/* heading styles */ +H1 { } +H2 { } +H3 { } +H4 { } +H5 { } + +/* mathematics styles */ +DIV.displaymath { } /* math displays */ +TD.eqno { } /* equation-number cells */ + + +/* document-specific styles come next */ +DIV.navigation { } +DIV.center { } +SPAN.sc { } +DIV.quote { } +PRE.preform { } +SPAN.textit { font-style: italic } +SPAN.arabic { } diff --git a/ionnotes/ionnotes.html b/ionnotes/ionnotes.html new file mode 100644 index 0000000..27c31f2 --- /dev/null +++ b/ionnotes/ionnotes.html @@ -0,0 +1,172 @@ + + + + + +Ion: Notes for the module and patch writer + + + + + + + + + + + + + + + + + + + +

+

Ion: Notes for the module and patch writer

+
+ +

Tuomo Valkonen

+

tuomov at iki.fi

+
+ +

+Ion: Notes for the module and patch writer +
+Copyright © 2003-2004 Tuomo Valkonen. + +

+This document is free; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +

+This document is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +section entitled ''GNU General Public License'' for more details. + +

+ +

+
+ +

+ +

Abstract:

+
+ This document is an unorganized collection of notes for + those who want to write modules or patches to Ion. +
+

+ +

+


+ + + + + +

+ + + diff --git a/ionnotes/labels.pl b/ionnotes/labels.pl new file mode 100644 index 0000000..2c1867a --- /dev/null +++ b/ionnotes/labels.pl @@ -0,0 +1,69 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate labels original text with physical files. + + +$key = q/sec:objects/; +$external_labels{$key} = "$URL/" . q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:parentship/; +$external_labels{$key} = "$URL/" . q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:supptypes/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:calling/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:managership/; +$external_labels{$key} = "$URL/" . q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/sec:exporting/; +$external_labels{$key} = "$URL/" . q|node4.html|; +$noresave{$key} = "$nosave"; + +$key = q/fig:classhierarchy/; +$external_labels{$key} = "$URL/" . q|node2.html|; +$noresave{$key} = "$nosave"; + +1; + + +# LaTeX2HTML 2002-2-1 (1.71) +# labels from external_latex_labels array. + + +$key = q/sec:objects/; +$external_latex_labels{$key} = q|1|; +$noresave{$key} = "$nosave"; + +$key = q/fig:parentship/; +$external_latex_labels{$key} = q|2|; +$noresave{$key} = "$nosave"; + +$key = q/sec:supptypes/; +$external_latex_labels{$key} = q|3.1|; +$noresave{$key} = "$nosave"; + +$key = q/sec:calling/; +$external_latex_labels{$key} = q|3.3|; +$noresave{$key} = "$nosave"; + +$key = q/fig:managership/; +$external_latex_labels{$key} = q|3|; +$noresave{$key} = "$nosave"; + +$key = q/sec:exporting/; +$external_latex_labels{$key} = q|3.2|; +$noresave{$key} = "$nosave"; + +$key = q/fig:classhierarchy/; +$external_latex_labels{$key} = q|1|; +$noresave{$key} = "$nosave"; + +1; + diff --git a/ionnotes/next.png b/ionnotes/next.png new file mode 100644 index 0000000..1628652 Binary files /dev/null and b/ionnotes/next.png differ diff --git a/ionnotes/next_g.png b/ionnotes/next_g.png new file mode 100644 index 0000000..9d3f591 Binary files /dev/null and b/ionnotes/next_g.png differ diff --git a/ionnotes/node1.html b/ionnotes/node1.html new file mode 100644 index 0000000..b174939 --- /dev/null +++ b/ionnotes/node1.html @@ -0,0 +1,123 @@ + + + + + +Contents + + + + + + + + + + + + + + + + + + + + + +
+ +

+Contents +

+ + + + +

+ +

+


+ + + diff --git a/ionnotes/node2.html b/ionnotes/node2.html new file mode 100644 index 0000000..e25fd2d --- /dev/null +++ b/ionnotes/node2.html @@ -0,0 +1,444 @@ + + + + + +1 Class and object hierarchies + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+ +
+1 Class and object hierarchies +

+ +

+While Ion does not not have a truly object-oriented design +1, +things that appear on the computer screen are, however, quite +naturally expressed as such ''objects''. Therefore Ion implements +a rather primitive OO system for these screen objects and some +other things. + +

+It is essential for the module writer to learn this object +system, but also people who write their own binding configuration files +necessarily come into contact with the class and object hierarchies +- you need to know which binding setup routines apply where, +and what functions can be used as handlers in which bindings. +It is the purpose of this section to attempt to explain these +hierarchies. If you do not wish the read the full section, at least +read the summary at the end of it, so that you understand the very +basic relations. + +

+For simplicity we consider only the essential-for-basic-configuration +Ioncore, mod_tiling and mod_query classes. +See Appendix [*] for the full class hierachy visible +to Lua side. + +

+ +

+1.1 Class hierarchy +

+ +

+One of the most important principles of object-oriented design methodology +is inheritance; roughly how classes (objects are instances of classes) +extend on others' features. Inheritance gives rise to class hierarchy. +In the case of single-inheritance this hierarchy can be expressed as a +tree where the class at the root is inherited by all others below it +and so on. Figure 1 lists out the Ion class +hierarchy and below we explain what features of Ion the classes +implement. + +

+ +

+ + + +
Figure 1: +Partial Ioncore, mod_tiling and mod_query + class hierarchy.
+    Obj
+     |-->WRegion
+     |    |-->WClientWin
+     |    |-->WWindow
+     |    |    |-->WRootWin
+     |    |    |-->WMPlex
+     |    |    |    |-->WScreen
+     |    |    |    |-->WFrame
+     |    |    |-->WInput (mod_query)
+     |    |         |-->WEdln (mod_query)
+     |    |         |-->WMessage (mod_query)
+     |    |-->WGroup
+     |    |    |-->WGroupWS
+     |    |    |-->WGroupCW
+     |    |-->WTiling (mod_tiling)
+     |-->WSplit (mod_tiling)
+
+
+ +

+The core classes: + +

+

+
Obj
+
+ Is the base of Ion's object system. + +

+

+
WRegion
+
+ is the base class for everything corresponding to something on the + screen. Each object of type WRegion has a size and position + relative to the parent WRegion. While a big part of Ion + operates on these instead of more specialised classes, WRegion + is a ''virtual'' base class in that there are no objects of ''pure'' + type WRegion; all concrete regions are objects of some class + that inherits WRegion. + +

+

+
WClientWin
+
is a class for + client window objects, the objects that window managers are + supposed to manage. + +

+

+
WWindow
+
is the base class for all + internal objects having an X window associated to them + (WClientWins also have X windows associated to them). + +

+

+
WRootWin
+
is the class for + root windows of X screens. + Note that an ''X screen'' or root window is not necessarily a + single physical screen as a root window + may be split over multiple screens when multi-head extensions + such as Xinerama are used. (Actually there + can be only one WRootWin when Xinerama is used.) + +

+

+
WMPlex
+
is a base class for all regions that''multiplex'' + other regions. This means that of the regions managed by the multiplexer, + only one can be displayed at a time. Classes that inhereit WMPlex + include screens and frames. + +

+

+
WScreen
+
is the class for objects + corresponding to physical screens. Screens may share a root + window when Xinerama multihead extensions are used as explained + above. + +

+

+
WFrame
+
is the class for frames. + While most Ion's objects have no graphical presentation, frames basically + add to WMPlexes the decorations around client windows + (borders, tabs). + +

+

+
WGroup
+
is the base class for groups. + Particular types of groups are workspaces + (WGroupWS) + and groups of client windows + (WGroupCW). +
+
+ +

+Classes implemented by the mod_tiling module: + +

+

+
WTiling
+
is the class for tilings + of frames. + +
+
WSplit
+
(or, more specifically, classes + that inherit it) encode the WTiling tree structure. +
+
+ +

+Classes implemented by the mod_query module: + +

+

+
WInput
+
is a virtual base class for the + two classes below. + +
+
WEdln
+
is the class for the ''queries'', + the text inputs that usually appear at bottoms of frames and sometimes + screens. Queries are the functional equivalent of ''mini buffers'' in + many text editors. + +
+
WMessage
+
implements the boxes for + warning and other messages that Ion may wish to display to the user. + These also usually appear at bottoms of frames. +
+
+ +

+There are also some other ''proxy'' classes that do not refer +to objects on the screen. The only important one of these for +basic configuration is WMoveresMode that is used for +binding callbacks in the move and resize mode. + +

+ +

+1.2 Object hierarchies: WRegion parents and managers +

+ +

+ +

+1.2.1 Parent-child relations +

+Each object of type WRegion has a parent and possibly a manager +associated to it. The parent for an object is always a +WWindow and for WRegion with an X window (WClientWin, +WWindow) the parent WWindow is given by the same relation of +the X windows. For other WRegions the relation is not as clear. +There is generally very few restrictions other than the above on the +parent--child relation but the most common is as described in +Figure 2. + +

+ +

+ + + +
Figure 2: +Most common parent-child relations
+    WRootWins
+     |-->WScreens
+          |-->WGroupWSs
+          |-->WTilings
+          |-->WClientWins in full screen mode
+          |-->WFrames
+               |-->WGroupCWs
+               |-->WClientWins
+               |-->WFrames for transients
+               |-->a possible WEdln or WMessage
+
+
+ +

+WRegions have very little control over their children as a parent. +The manager WRegion has much more control over its +managed WRegions. Managers, for example, handle resize requests, +focusing and displaying of the managed regions. Indeed the manager--managed +relationship gives a better picture of the logical ordering of objects on +the screen. Again, there are generally few limits, but the most common +hierarchy is given in Figure 3. Note that sometimes +the parent and manager are the same object and not all objects may have +a manager (e.g. the dock in the dock module at the time of writing this) +but all have a parent-a screen if not anything else. + +

+ +

+1.2.2 Manager-managed relations +

+ +

+ +

+ + + +
Figure 3: +Most common manager-managed relations
+    WRootWins
+     |-->WScreens
+          |-->WGroupCWs for full screen WClientWins
+          |    |-->WClientWins
+          |    |-->WFrames for transients (dialogs)
+          |         |--> WClientWin
+          |-->WGroupWSs for workspaces
+          |    |-->WTiling
+          |    |    |-->possibly a WEdln, WMessage or WMenu
+          |    |    |-->WFrames
+          |    |         |-->WGroupCWs (with contents as above)
+          |    |-->WFrames for floating content
+          |-->WFrames for sticky stuff, such as the scratchpad
+
+
+ +

+Note that a workspace can manage another workspace. This can be +achieved with the attach_new function, and allows you to nest +workspaces as deep as you want. + +

+ +

+1.3 Summary +

+ +

+In the standard setup, keeping queries, messages and menus out of +consideration: + +

+ +

    +
  • The top-level objects that matter are screens and they correspond + to physical screens. The class for screens is WScreen. +
  • +
  • Screens contain (multiplex) groups (WGroup) and other + objects, such as WFrames. Some of these are mutually exclusive + to be viewed at a time. +
  • +
  • Groups of the specific kind WGroupWS often contain a + WTiling tiling for tiling frames (WFrame), but + groups may also directly contain floating frames. +
  • +
  • Frames are the objects with decorations such as tabs and borders. + Frames contain (multiplex) among others (groups of) client windows, + to each of which corresponds a tab in the frame's decoration. Only + one client window (or other object) can be shown at a time in each + frame. The class for client windows is WClientWin. +
  • +
+ +

+


Footnotes

+
+
... design1
+
the author doesn't like such artificial designs + +
+
+ + + + + diff --git a/ionnotes/node3.html b/ionnotes/node3.html new file mode 100644 index 0000000..4f17c4e --- /dev/null +++ b/ionnotes/node3.html @@ -0,0 +1,121 @@ + + + + + +2 Object system implementation + + + + + + + + + + + + + + + + + + + + + + +

+2 Object system implementation +

+ +

+First, to get things clear, what are considered objects here are C +structures containing a properly initialized +structure defined in ioncore/obj.h as the first element (or the +first element of the structure which is the first element and so on which +gives rise to inheritance). The WObj structure contains a pointer +to a WObjDescr class type info structure and +a list of so called ''watches''. The WObjDescr structure simply +lists the class name, a table of dynamic functions and a pointer to +deinitialisation function (or ''destructor''). + +

+Ion does not do any reference counting, garbage collecting or other +fancy things related to automatic safe freeing of objects with its +simplistic object system. Instead special watches (the WWatch + structure) may be used to create safe references to +objects that might be destroyed during the time the specific pointer is +needed. When an object is destroyed, its list of watches is processed, +setting the pointers in the watches to NULL and the watch handlers for +each watch are called. + +

+ +

+ +

+ + + + diff --git a/ionnotes/node4.html b/ionnotes/node4.html new file mode 100644 index 0000000..037e8bc --- /dev/null +++ b/ionnotes/node4.html @@ -0,0 +1,310 @@ + + + + + +3 The Lua interface + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+3 The Lua interface +

+ +

+This section finally describes the implementation details and how modules +should us the Lua interface. First, in section 3.1 +we look at types supported by the interface, how objects are passed to Lua +code and how Lua tables should be accessed from Ion and modules. In section +3.2 the methods for exporting functions and how they +are called from Lua are explained and in section 3.3 the +method for calling Lua functions is explained. + +

+ +

+ +
+3.1 Supported types +

+ +

+The following types are supported in passing parameters between the +C side of Ion and Lua: + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Identifier + characterC typeDescription
iintInteger
schar*String
Sconst char*Constant string
ddouble 
bbool 
tExtlTabReference to Lua table
fExltFnReference to Lua function.
oAny WObj* 
+ +

+The difference between identifiers 's' and 'S' is that constant +strings as return values are not free'd by the level 1 call handler +(see below) after passing to Lua (lua_pushstring always makes a +copy) unlike normal strings. String parameters are always assumed to be +the property of the caller and thus implicitly const. + +

+Likewise, if a reference to 't' or 'f' is wished to be stored +beyond the lifetime of a function receiving such as an argument, a new +reference should be created with extl_ref_table/fn. +References can be free'd with +extl_unref_table/fn. References gotten as return values with +the extl_table_get (how these work should be self-explanatory!) +functions are property of the caller and should be unreferenced with the +above-mentioned functions when no longer needed. +The functions extl_fn/table_none() +return the equivalent of NULL. + +

+WObjs are passed to Lua code with WWatch userdatas pointing to +them so the objects can be safely deleted although Lua code might still be +referencing them. (This is why SWIG or tolua would not have helped in +creating the interface: extra wrappers for each function would still +have been needed to nicely integrate into Ion's object system. Even in +the case that Ion was written in C++ this would be so unless extra bloat +adding pointer-like objects were used everywhere instead of pointers.) +It may be sometimes necessary check in Lua code that a value known to +be an Ion WObj is of certain type. This can be accomplished with +obj_is(obj, "typename"). obj_typename(obj) returns type +name for a WObj. + +

+ +

+ +
+3.2 Exporting functions +

+ +

+Exported functions (those available to the extension language) are +defined by placing EXTL_EXPORT before the function implementation +in the C source. The script mkexports.pl is then used to automatically +generate exports.c from the source files if +MAKE_EXPORTS=modulename +is specified in the Makefile. All pointers with type beginning with a 'W' +are assumed to be pointers to something inheriting WObj. In +addition to a table of exported functions and second level call handlers +for these, exports.c will contain two functions +module_register_exports() and +module_unregister_exports() that should then be called in module +initialisation and deinitialisation code. + +

+You've seen the terms level 1 and 2 call handler mentioned above. + +The Lua support code uses two so called call handlers to convert and check +the types of parameters passed from Lua to C and back to Lua. The first +one of these call handlers is the same for all exported functions and +indeed lua sees all exported as the same C function (the L1 call handler) +but with different upvalues passing a structure describing the actual +function and the second level call handler. The L1 call handler checks +that the parameters received from Lua match a template given as a string +of the identifier characters defined above. If everything checks out ok, +the parameters are then put in an array of C unions that can contain +anyof these known types and the L2 call handler is called. + +

+The L2 call handler (which is automatically generated by the mkexports.pl +script) for each exported function checks that the passed WObjs +are of the more refined type required by the function and then calls the +actual function. While the WObj checking could be done in the L1 handler +too, the L2 call handlers are needed because we may not know how the target +platform passes each parameter type to the called function. Thefore we +must let the C compiler generate the code to convert from a simple and +known enough parameter passing method (the unions) to the actual +parameter passing method. When the called function returns everything +is done in reverse order for return values (only one return value is +supported by the generated L2 call handlers). + +

+ +

+ +
+3.3 Calling Lua functions and code +

+ +

+The functions +extl_call, +extl_call_named, +extl_dofile and +extl_dostring +call a referenced function (ExtlFn), named function, execute a +string and a file, respectively. The rest of the parameters for all these +functions are similar. The 'spec' argument is a string of identifier +characters (see above) describing the parameters to be passed. These +parameters follow after 'rspec'. For dofile and dostring these parameters +are passed in the global table arg (same as used for program command +lien parameters) and for functions as you might expect. The parameter +'rspec' is a similar description of return values. Pointers to variables +that should be set to the return values follow after the input values. +The return value of all these functions tells if the call and parameter +passing succeeded or not. + +

+Sometimes it is necessary to block calls to all but a limited set of +Ion functions. This can be accomplished with +extl_set_safelist. +The parameter to this function is a NULL-terminated array of strings +and the return value is a similar old safelist. +The call extl_set_safelist(NULL) removes any safelist and allows +calls to all exported functions. + +

+ +

+3.4 Miscellaneous notes +

+ +

+Configuration files should be read as before with the function +read_config_for +except that the list of known options is no longer present. + +

+Winprops are now stored in Lua tables and can contain arbitrary +properties. The 'proptab' entry in each WClientWin is a reference +to a winprop table or extl_table_none() if such does not exist +and properties may be read with the extl_table_gets functions. +(It is perfectly legal to pass extl_table_none() references to +extl_table_get*.) + +

+ +

+ + + + diff --git a/ionnotes/node5.html b/ionnotes/node5.html new file mode 100644 index 0000000..51c46f8 --- /dev/null +++ b/ionnotes/node5.html @@ -0,0 +1,188 @@ + + + + + +4 Miscellaneous design notes + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+4 Miscellaneous design notes +

+ +

+ +

+4.1 Destroying WObj:s +

+ +

+To keep Ion's code as simple as possible yet safe, there are restrictions +when the WObj +destroy_obj +function that calls watches, the deinit routine and frees memory may +be called directly. In all other cases the +defer_destroy +function should be used to defer the call of destroy_obj until +Ioncore returns to its main event loop. + +

+Calling the destroy_obj function directly is allowed in the +following cases: + +

    +
  • In the deinit handler for another object. Usually managed objects + are destroyed this way. +
  • +
  • The object was created during the current call to the function + that wants to get rid of the object. This is the case, for example, + when the function created a frame to manage some other object but for + some reason failed to reparent the object to this frame. +
  • +
  • In a deferred action handler set with + defer_action. + Like deferred destroys, other deferred actions are called when + Ioncore has returned to the main loop. +
  • +
  • You are absolute sure that C code outside your code has no + references to the object. +
  • +
+ +

+If there are no serious side effects from deferring destroying the +object or you're unsure whether it is safe to destroy the object +immediately, use defer_destroy. + +

+ +

+4.2 The types char* and const char* as function + parameters and return values +

+ +

+The following rules should apply to using strings as return values and +parameters to functions. + +

+ + + + + + + + + + + + + +
TypeReturn valueParameter
const char*The string is owned by the called function + and the caller is only quaranteed short-term read access to the + string.The called function may only read the string during its execution. + For further reference a copy must be made.
char*The string is the caller's responsibility and it + must free it when no longer needed.The called function may modify the string but the ''owner'' of + the string is case-dependant.
+ +

+ +

+ +

+ + + + diff --git a/ionnotes/node6.html b/ionnotes/node6.html new file mode 100644 index 0000000..8c20249 --- /dev/null +++ b/ionnotes/node6.html @@ -0,0 +1,285 @@ + + + + + +5 C coding style + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+5 C coding style +

+ +

+If you want to submit patches to Ion, you MUST follow my coding +style, even if you think it is the root of all evil. We don't want +the code to be an incomprehensible mess of styles and I have better +things to do than fix other people's style to match mine. The style +should be obvious by studying the source, but here's a list of some +things to take note of. + +

+ +

+5.1 Whitespace +

+ +

+ +

    +
  • Indentations of 4 with tab size=4. + +

    +

  • +
  • No extra spaces between operators, delimiters etc. except + +
      +
    • around logical and, or (&&, ||) +
    • +
    • around the conditional a ? b : c +
    • +
    • after commas and semicolons + +
    • +
    + In my opinion this helps pointing out arithmetic or other + expressions within logical expressions or parameter lists. + +

    +

  • +
  • All kinds of labels are out-tended to the level of the higher + level block. For example: + +

    +

        
    +void foo()
    +{
    +again:
    +    switch(asdf){
    +    case 1:
    +        ...
    +        break;
    +    default:
    +        ...
    +        break;
    +    }
    +}
    +
    +
  • +
+ +

+ +

+5.2 Braces +

+ +

+ +

    +
  • Opening brace is at the end of the line, except in function + bodies, where it is at the beginning of the line following + the definition. + +

    +

  • +
  • Never put the body of a control statement on the same line + with the statement (e.g. if(foo){ bar() }). + +

    +For example, the block +

        
    +void foo(int a, int b)
    +{
    +    if(a==b && c+d==e){
    +        ...
    +    }
    +}
    +
    + +

    +has correct style while the block + +

    +

       
    +void foo(int a,int b) {
    +    if (a == b && c + d == e) {
    +        ...
    +    }
    +}
    +
    + +

    +does not. + +

    +

  • +
  • The else keyword follows immediately after the closing brace of + previous if, if any. (This might change so I don't care if you put + it on the next line.) + +

    +

  • +
  • I have used the convention that control statement bodies containing + a single statement do not need braces around the block if, in case of + the if all the blocks in if ... else if ... else + contain just one statement. If you want to, just use braces in every + case. +
  • +
+ +

+ +

+5.3 Names +

+ +

+ +

    +
  • Function and variable names only have lower case letters. Type + names are in mixed case while constants and macros (#defines) + are in upper case letters. +
  • +
+ +

+ +

+5.4 Miscellaneous +

+ +

+ +

    +
  • In the definition of a pointer variable, the asterisk is attached + to the variable name: char *s;. (One could claim this an + exception to the second rule.) + +

    +

  • +
  • You might optionally want to use Jed's foldings to group blocks + of related code in a file to keep it organized: + +

    +

        
    +/*{{{ Many related functions */
    +	
    +void code()
    +{
    +    ...	
    +}
    +
    +...
    +
    +/*}}}*/
    +
    +
  • +
+ +

+I think that's mostly it. Study the source when in doubt. + +

+ +

+ +

+ + + + diff --git a/ionnotes/node7.html b/ionnotes/node7.html new file mode 100644 index 0000000..7e36403 --- /dev/null +++ b/ionnotes/node7.html @@ -0,0 +1,597 @@ + + + + + +A. The GNU General Public License + + + + + + + + + + + + + + + + + + + + + + +Subsections + + + +
+ +

+A. The GNU General Public License +

+ +

+

+
+

+

Version 2, June 1991 +
+

+

Copyright © 1989, 1991 Free Software Foundation, Inc. +
+

+

+

+
+

+

+

59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +
+

+

+

+
+

+

+

Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + +
+ +

+

+Preamble + +
+ +

+The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free software--to +make sure the software is free for all its users. This General Public +License applies to most of the Free Software Foundation's software and to +any other program whose authors commit to using it. (Some other Free +Software Foundation software is covered by the GNU Library General Public +License instead.) You can apply it to your programs, too. + +

+When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for this service +if you wish), that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free programs; +and that you know you can do these things. + +

+To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +

+For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And +you must show them these terms so they know their rights. + +

+We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +

+Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If +the software is modified by someone else and passed on, we want its +recipients to know that what they have is not the original, so that any +problems introduced by others will not reflect on the original authors' +reputations. + +

+Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent must +be licensed for everyone's free use or not licensed at all. + +

+The precise terms and conditions for copying, distribution and +modification follow. + +

+

+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND + MODIFICATION + +
+ +

+ +

    +
  1. +This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the +terms of this General Public License. The ``Program'', below, refers to +any such program or work, and a ``work based on the Program'' means either +the Program or any derivative work under copyright law: that is to say, a +work containing the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. (Hereinafter, +translation is included without limitation in the term ``modification''.) +Each licensee is addressed as ``you''. + +

    +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +

    +

  2. +
  3. You may copy and distribute verbatim copies of the Program's source + code as you receive it, in any medium, provided that you conspicuously + and appropriately publish on each copy an appropriate copyright notice + and disclaimer of warranty; keep intact all the notices that refer to + this License and to the absence of any warranty; and give any other + recipients of the Program a copy of this License along with the Program. + +

    +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +

    +

  4. +
  5. +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +

    + +

      +
    1. +You must cause the modified files to carry prominent notices stating that +you changed the files and the date of any change. + +

      +

    2. +
    3. +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +

      +

    4. +
    5. If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +

      +

    6. +
    + +

    +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +

    +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +

    +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +

    +

  6. +
  7. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +

    + +

      +
    1. +Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +

      +

    2. +
    3. +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +

      +

    4. +
    5. +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +

      +

    6. +
    + +

    +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +

    +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +

    +

  8. +
  9. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +

    +

  10. +
  11. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +

    +

  12. +
  13. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +

    +

  14. +
  15. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +

    +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +

    +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +

    +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +

    +

  16. +
  17. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +

    +

  18. +
  19. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +

    +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and ``any +later version'', you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +

    +

  20. +
  21. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +

    +

    + +NO WARRANTY + + +
    + +

    +

  22. +
  23. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +

    +

  24. +
  25. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +

    +

  26. +
+ +

+

+END OF TERMS AND CONDITIONS + +
+ +

+ +

+ +

+Appendix: How to Apply These Terms to Your New Programs +

+ +

+If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +

+To do so, attach the following notices to the program. It is safest to + attach them to the start of each source file to most effectively convey + the exclusion of warranty; and each file should have at least the + ``copyright'' line and a pointer to where the full notice is found. + +

+

+one line to give the program's name and a brief idea of what it does. +
+Copyright (C) yyyy name of author +
+

+

This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. +
+

+

This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +
+

+

You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +
+ +

+Also add information on how to contact you by electronic and paper mail. + +

+If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +

+

+Gnomovision version 69, Copyright (C) yyyy name of author +
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +
+This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +
+ +

+The hypothetical commands show w and show c should show the +appropriate parts of the General Public License. Of course, the commands +you use may be called something other than show w and show c; +they could even be mouse-clicks or menu items--whatever suits your +program. + +

+You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the program, if +necessary. Here is a sample; alter the names: + +

+

+Yoyodyne, Inc., hereby disclaims all copyright interest in the program +
`Gnomovision' (which makes passes at compilers) written by James Hacker. +
+

+

signature of Ty Coon, 1 April 1989 +
+Ty Coon, President of Vice + +
+ +

+This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications +with the library. If this is what you want to do, use the GNU Library +General Public License instead of this License. + +

+ +

+ + + + diff --git a/ionnotes/node8.html b/ionnotes/node8.html new file mode 100644 index 0000000..0ec574a --- /dev/null +++ b/ionnotes/node8.html @@ -0,0 +1,139 @@ + + + + + +Index + + + + + + + + + + + + + + + + + + + + + +
+ +

+Index +


+
call handler + : 3.2 +
defer_action + : 4.1 +
defer_destroy + : 4.1 +
destroy_obj + : 4.1 +
extl_call + : 3.3 +
extl_call_named + : 3.3 +
extl_dofile + : 3.3 +
extl_dostring + : 3.3 +
extl_set_safelist + : 3.3 +
ExtlFn + : 3.1 +
ExtlTab + : 3.1 +
manager + : 1.2.1 +
Obj + : 1.1 +
parent + : 1.2.1 +
read_config_for + : 3.4 +
root window + : 1.1 +
screen
+
physical : 1.1 +
X : 1.1 +
+
WClientWin + : 1.1 +
WEdln + : 1.1 +
WFrame + : 1.1 +
WGroup + : 1.1 +
WGroupCW + : 1.1 +
WGroupWS + : 1.1 +
WInput + : 1.1 +
WMessage + : 1.1 +
WObj + : 2 +
WObjDescr + : 2 +
WRegion + : 1.1 +
WRootWin + : 1.1 +
WScreen + : 1.1 +
WSplit + : 1.1 +
WTiling + : 1.1 +
WWatch + : 2 +
WWindow + : 1.1 +
Xinerama + : 1.1 + +
+ +

+


+ + + diff --git a/ionnotes/node9.html b/ionnotes/node9.html new file mode 100644 index 0000000..a4ce07f --- /dev/null +++ b/ionnotes/node9.html @@ -0,0 +1,77 @@ + + + + + +About this document ... + + + + + + + + + + + + + + + + + + + + +

+About this document ... +

+ Ion: Notes for the module and patch writer

+This document was generated using the +LaTeX2HTML translator Version 2002-2-1 (1.71) +

+Copyright © 1993, 1994, 1995, 1996, +Nikos Drakos, +Computer Based Learning Unit, University of Leeds. +
+Copyright © 1997, 1998, 1999, +Ross Moore, +Mathematics Department, Macquarie University, Sydney. +

+The command line arguments were:
+ latex2html -show_section_numbers -short_index -local_icons -noaddress -up_url http://iki.fi/tuomov/ion/ -up_title 'Ion homepage' -nofootnode -split 4 ionnotes +

+The translation was initiated by tuomov on 2006-12-23 +


+ + + diff --git a/ionnotes/prev.png b/ionnotes/prev.png new file mode 100644 index 0000000..e60b8b4 Binary files /dev/null and b/ionnotes/prev.png differ diff --git a/ionnotes/prev_g.png b/ionnotes/prev_g.png new file mode 100644 index 0000000..476d956 Binary files /dev/null and b/ionnotes/prev_g.png differ diff --git a/ionnotes/up.png b/ionnotes/up.png new file mode 100644 index 0000000..3937e16 Binary files /dev/null and b/ionnotes/up.png differ diff --git a/luaif.tex b/luaif.tex new file mode 100644 index 0000000..76789a7 --- /dev/null +++ b/luaif.tex @@ -0,0 +1,148 @@ + +\section{The Lua interface} + +This section finally describes the implementation details and how modules +should us the Lua interface. First, in section \ref{sec:supptypes} +we look at types supported by the interface, how objects are passed to Lua +code and how Lua tables should be accessed from Ion and modules. In section +\ref{sec:exporting} the methods for exporting functions and how they +are called from Lua are explained and in section \ref{sec:calling} the +method for calling Lua functions is explained. + +\subsection{Supported types} +\label{sec:supptypes} + +The following types are supported in passing parameters between the +C side of Ion and Lua: + +\begin{tabular}{rll} +\hline + Identifier + character & C type & Description\\ +\hline + \spec{i} & \type{int} & Integer\\ + \spec{s} & \type{char*} & String\\ + \spec{S} & \type{const char*} & Constant string\\ + \spec{d} & \type{double} &\\ + \spec{b} & \type{bool} &\\ + \spec{t} & \type{ExtlTab}\indextype{ExtlTab} & + Reference to Lua table\\ + \spec{f} & \type{ExltFn}\indextype{ExtlFn} & + Reference to Lua function.\\ + \spec{o} & Any \type{WObj*} &\\ +\end{tabular} + +The difference between identifiers '\spec{s}' and '\spec{S}' is that constant +strings as return values are not free'd by the level 1 call handler +(see below) after passing to Lua (\code{lua_pushstring} always makes a +copy) unlike normal strings. String parameters are always assumed to be +the property of the caller and thus implicitly const. + +Likewise, if a reference to '\spec{t}' or '\spec{f}' is wished to be stored +beyond the lifetime of a function receiving such as an argument, a new +reference should be created with \code{extl_ref_table}/\code{fn}. +References can be free'd with +\code{extl_unref_table}/\code{fn}. References gotten as return values with +the \code{extl_table_get} (how these work should be self-explanatory!) +functions are property of the caller and should be unreferenced with the +above-mentioned functions when no longer needed. +The functions \code{extl_fn}/\code{table_none()} +return the equivalent of NULL. + +\type{WObj}s are passed to Lua code with WWatch userdatas pointing to +them so the objects can be safely deleted although Lua code might still be +referencing them. (This is why SWIG or tolua would not have helped in +creating the interface: extra wrappers for each function would still +have been needed to nicely integrate into Ion's object system. Even in +the case that Ion was written in C++ this would be so unless extra bloat +adding pointer-like objects were used everywhere instead of pointers.) +It may be sometimes necessary check in Lua code that a value known to +be an Ion \type{WObj} is of certain type. This can be accomplished with +\code{obj_is(obj, "typename")}. \code{obj_typename(obj)} returns type +name for a \type{WObj}. + + +\subsection{Exporting functions} +\label{sec:exporting} + +Exported functions (those available to the extension language) are +defined by placing \code{EXTL_EXPORT} before the function implementation +in the C source. The script mkexports.pl is then used to automatically +generate \file{exports.c} from the source files if +\code{MAKE_EXPORTS=modulename} +is specified in the Makefile. All pointers with type beginning with a 'W' +are assumed to be pointers to something inheriting \type{WObj}. In +addition to a table of exported functions and second level call handlers +for these, \file{exports.c} will contain two functions +\code{module_register_exports()} and +\code{module_unregister_exports()} that should then be called in module +initialisation and deinitialisation code. + +You've seen the terms level 1 and 2 call handler mentioned above. +\index{call handler} +The Lua support code uses two so called call handlers to convert and check +the types of parameters passed from Lua to C and back to Lua. The first +one of these call handlers is the same for all exported functions and +indeed lua sees all exported as the same C function (the L1 call handler) +but with different upvalues passing a structure describing the actual +function and the second level call handler. The L1 call handler checks +that the parameters received from Lua match a template given as a string +of the identifier characters defined above. If everything checks out ok, +the parameters are then put in an array of C unions that can contain +anyof these known types and the L2 call handler is called. + +The L2 call handler (which is automatically generated by the mkexports.pl +script) for each exported function checks that the passed \type{WObj}s +are of the more refined type required by the function and then calls the +actual function. While the WObj checking could be done in the L1 handler +too, the L2 call handlers are needed because we may not know how the target +platform passes each parameter type to the called function. Thefore we +must let the C compiler generate the code to convert from a simple and +known enough parameter passing method (the unions) to the actual +parameter passing method. When the called function returns everything +is done in reverse order for return values (only one return value is +supported by the generated L2 call handlers). + + +\subsection{Calling Lua functions and code} +\label{sec:calling} + +The functions +\code{extl_call}\index{extl-call@\code{extl_call}}, +\code{extl_call_named}\index{extl-call-named@\code{extl_call_named}}, +\code{extl_dofile}\index{extl-dofile@\code{extl_dofile}} and +\code{extl_dostring}\index{extl-dostring@\code{extl_dostring}} +call a referenced function (\type{ExtlFn}), named function, execute a +string and a file, respectively. The rest of the parameters for all these +functions are similar. The 'spec' argument is a string of identifier +characters (see above) describing the parameters to be passed. These +parameters follow after 'rspec'. For dofile and dostring these parameters +are passed in the global table arg (same as used for program command +lien parameters) and for functions as you might expect. The parameter +'rspec' is a similar description of return values. Pointers to variables +that should be set to the return values follow after the input values. +The return value of all these functions tells if the call and parameter +passing succeeded or not. + +Sometimes it is necessary to block calls to all but a limited set of +Ion functions. This can be accomplished with +\code{extl_set_safelist}\index{extl-set-safelist@\code{extl_set_safelist}}. +The parameter to this function is a NULL-terminated array of strings +and the return value is a similar old safelist. +The call \code{extl_set_safelist(NULL)} removes any safelist and allows +calls to all exported functions. + + +\subsection{Miscellaneous notes} + +Configuration files should be read as before with the function +\code{read_config_for}\index{read-config-for@\code{read_config_for}} +except that the list of known options is no longer present. + +Winprops are now stored in Lua tables and can contain arbitrary +properties. The 'proptab' entry in each \type{WClientWin} is a reference +to a winprop table or \code{extl_table_none()} if such does not exist +and properties may be read with the \code{extl_table_gets} functions. +(It is perfectly legal to pass \code{extl_table_none()} references to +\code{extl_table_get*}.) + diff --git a/macros.tex b/macros.tex new file mode 100644 index 0000000..0e172d3 --- /dev/null +++ b/macros.tex @@ -0,0 +1,151 @@ +\usepackage{babel} +\usepackage[latin1]{inputenc} +\usepackage[dvipdfm]{hyperref} +\usepackage{ae} +\usepackage{url} +\usepackage{html} +%\usepackage{graphicx} +%\usepackage{color} +\usepackage{makeidx} +\usepackage{tabularx} +\usepackage{textcomp} +\usepackage[nottoc]{tocbibind} +\usepackage{enumerate} % GNU FDL needs this +\usepackage[a4paper]{geometry} +\usepackage{calc} + +% URL settings +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\urlstyle{rm} +\newcommand{\centerurl}[1]{\begin{center}\url{#1}\end{center}} + +% listings package +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%begin{latexonly} +\usepackage{listings} + +\lstset{ + extendedchars=true, + breaklines=true, + basicstyle=\tt, + alsoletter={",}, + alsoother={\_}, +} +%end{latexonly} + +% Some markup +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\note}[1]{\color{red}**#1**} +\newcommand{\file}[1]{\emph{#1}} +\newcommand{\type}[1]{#1} +\newcommand{\spec}[1]{#1} +\newcommand{\indextype}[1]{\index{#1@\type{#1}}} + +%begin{latexonly} +\newcommand{\key}[1]{\mbox{\textbf{#1}}} +\newcommand{\code}[1]{\lstinline!#1!} +\newcommand{\var}[1]{\lstinline!#1!} +\newcommand{\command}[1]{\lstinline!#1!} + +\newcommand{\hyperlabel}[1]{\hypertarget{#1}{}\label{#1}} +\newcommand{\fnrefx}[2]{\hyperlink{fn:#1.#2}{\code{#2}}} +\newcommand{\fnref}[1]{\hyperlink{fn:#1}{\code{#1}}} +\newcommand{\myhref}[2]{\hyperlink{#1}{#2}} + +%end{latexonly} +\begin{htmlonly} + +\newcommand{\key}[1]{\textbf{#1}} +\newcommand{\code}[1]{\texttt{#1}} +\newcommand{\var}[1]{\texttt{#1}} +\newcommand{\command}[1]{\texttt{#1}} + +\newcommand{\hyperlabel}[1]{\label{#1}} +\newcommand{\fnref}[1]{\htmlref{\texttt{#1}}{fn:#1}} +\newcommand{\fnrefx}[2]{\htmlref{\texttt{#2}}{fn:#1.#2}} +\newcommand{\myhref}[2]{\htmlref{#2}{#1}} + +\end{htmlonly} + +\newcommand{\tabhead}[1]{\hline #1 \\ \hline} + +% function tables +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%begin{latexonly} + +\newcommand{\funclistlabel}[1]{#1\hfill} +\newenvironment{function}{ + \pagebreak[3] + \begin{list}{}{ + \settowidth{\labelwidth}{Description:} + \setlength{\leftmargin}{\labelwidth} + \addtolength{\leftmargin}{0.5em} + \setlength{\labelsep}{0.5em} + \setlength{\itemsep}{0pt} + \setlength\parsep{0pt} + \setlength\topsep{0pt} + %\setlength{\itemsep}{-\parskip} + %\addtolength{\itemsep}{\lineskip} + \let\makelabel\funclistlabel + } +}{ + \end{list} +} + +%end{latexonly} +\begin{htmlonly} + +\newenvironment{function}{ + \begin{description} +}{ + \end{description} +} + +\end{htmlonly} + + +\newcommand{\synopsis}[1]{ + \item[Synopsis:] \code{#1} +} +\newcommand{\funcname}[1]{ + \item[Function:] \code{#1} +} +\newcommand{\hookname}[1]{ + \item[Hook name:] \hyperlabel{#1}\code{#1} +} +\newcommand{\hookparams}[1]{ + \item[Parameters:] \code{#1} +} +\newenvironment{funcdesc}{ + \item[Description:] +}{} + + +% While rapport3/artikel3 are otherwise nice classes, +% itemize looks awful. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%begin{latexonly} +\makeatletter +\renewenvironment{itemize}{% + \ifnum \@itemdepth >3 + \@toodeep + \else + \advance\@itemdepth \@ne + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + \list{\csname\@itemitem\endcsname}% + {% + \if@revlabel + \def\makelabel##1{\hskip .5\unitindent{\hfil ##1}}\else + %^^^^^^^^^ Changed + \def\makelabel##1{\hfil ##1} + %^^^^^^^^^ Changed + \fi + }% + \fi} + {\global\@ignoretrue \endlist} +\makeatletter +%end{latexonly} diff --git a/objects.tex b/objects.tex new file mode 100644 index 0000000..e751eab --- /dev/null +++ b/objects.tex @@ -0,0 +1,246 @@ + +\section{Class and object hierarchies} +\label{sec:objects} + +While Ion does not not have a truly object-oriented design +\footnote{the author doesn't like such artificial designs}, +things that appear on the computer screen are, however, quite +naturally expressed as such ''objects''. Therefore Ion implements +a rather primitive OO system for these screen objects and some +other things. + +It is essential for the module writer to learn this object +system, but also people who write their own binding configuration files +necessarily come into contact with the class and object hierarchies +-- you need to know which binding setup routines apply where, +and what functions can be used as handlers in which bindings. +It is the purpose of this section to attempt to explain these +hierarchies. If you do not wish the read the full section, at least +read the summary at the end of it, so that you understand the very +basic relations. + +For simplicity we consider only the essential-for-basic-configuration +Ioncore, \file{mod\_tiling} and \file{mod\_query} classes. +See Appendix \ref{app:fullhierarchy} for the full class hierachy visible +to Lua side. + +\subsection{Class hierarchy} + +One of the most important principles of object-oriented design methodology +is inheritance; roughly how classes (objects are instances of classes) +extend on others' features. Inheritance gives rise to class hierarchy. +In the case of single-inheritance this hierarchy can be expressed as a +tree where the class at the root is inherited by all others below it +and so on. Figure \ref{fig:classhierarchy} lists out the Ion class +hierarchy and below we explain what features of Ion the classes +implement. + +\begin{figure} +\begin{htmlonly} +\docode % latex2html kludge +\end{htmlonly} +\begin{verbatim} + Obj + |-->WRegion + | |-->WClientWin + | |-->WWindow + | | |-->WRootWin + | | |-->WMPlex + | | | |-->WScreen + | | | |-->WFrame + | | |-->WInput (mod_query) + | | |-->WEdln (mod_query) + | | |-->WMessage (mod_query) + | |-->WGroup + | | |-->WGroupWS + | | |-->WGroupCW + | |-->WTiling (mod_tiling) + |-->WSplit (mod_tiling) +\end{verbatim} +\caption{Partial Ioncore, \file{mod\_tiling} and \file{mod\_query} + class hierarchy.} +\label{fig:classhierarchy} +\end{figure} + +The core classes: + +\begin{description} + \item[\type{Obj}]\indextype{Obj} + Is the base of Ion's object system. + + \item[\type{WRegion}]\indextype{WRegion} + is the base class for everything corresponding to something on the + screen. Each object of type \type{WRegion} has a size and position + relative to the parent \type{WRegion}. While a big part of Ion + operates on these instead of more specialised classes, \type{WRegion} + is a ''virtual'' base class in that there are no objects of ''pure'' + type \type{WRegion}; all concrete regions are objects of some class + that inherits \type{WRegion}. + + \item[\type{WClientWin}]\indextype{WClientWin} is a class for + client window objects, the objects that window managers are + supposed to manage. + + \item[\type{WWindow}]\indextype{WWindow} is the base class for all + internal objects having an X window associated to them + (\type{WClientWins} also have X windows associated to them). + + \item[\type{WRootWin}]\indextype{WRootWin} is the class for + root windows\index{root window} of X screens\index{screen!X}. + Note that an ''X screen'' or root window is not necessarily a + single physical screen\index{screen!physical} as a root window + may be split over multiple screens when multi-head extensions + such as Xinerama\index{Xinerama} are used. (Actually there + can be only one \type{WRootWin} when Xinerama is used.) + + \item[\type{WMPlex}] is a base class for all regions that''multiplex'' + other regions. This means that of the regions managed by the multiplexer, + only one can be displayed at a time. Classes that inhereit \type{WMPlex} + include screens and frames. + + \item[\type{WScreen}]\indextype{WScreen} is the class for objects + corresponding to physical screens. Screens may share a root + window when Xinerama multihead extensions are used as explained + above. + + \item[\type{WFrame}]\indextype{WFrame} is the class for frames. + While most Ion's objects have no graphical presentation, frames basically + add to \type{WMPlex}es the decorations around client windows + (borders, tabs). + + \item[\type{WGroup}]\indextype{WGroup} is the base class for groups. + Particular types of groups are workspaces + (\type{WGroupWS}\indextype{WGroupWS}) + and groups of client windows + (\type{WGroupCW}\indextype{WGroupCW}). +\end{description} + + +Classes implemented by the \file{mod\_tiling} module: + +\begin{description} + \item[\type{WTiling}]\indextype{WTiling} is the class for tilings + of frames. + \item[\type{WSplit}]\indextype{WSplit} (or, more specifically, classes + that inherit it) encode the \type{WTiling} tree structure. +\end{description} + + +Classes implemented by the \file{mod\_query} module: + +\begin{description} + \item[\type{WInput}]\indextype{WInput} is a virtual base class for the + two classes below. + \item[\type{WEdln}]\indextype{WEdln} is the class for the ''queries'', + the text inputs that usually appear at bottoms of frames and sometimes + screens. Queries are the functional equivalent of ''mini buffers'' in + many text editors. + \item[\type{WMessage}]\indextype{WMessage} implements the boxes for + warning and other messages that Ion may wish to display to the user. + These also usually appear at bottoms of frames. +\end{description} + +There are also some other ''proxy'' classes that do not refer +to objects on the screen. The only important one of these for +basic configuration is \type{WMoveresMode} that is used for +binding callbacks in the move and resize mode. + + +\subsection{Object hierarchies: \type{WRegion} parents and managers} + +\subsubsection{Parent--child relations} +Each object of type \type{WRegion} has a parent and possibly a manager +associated to it. The parent\index{parent} for an object is always a +\type{WWindow} and for \type{WRegion} with an X window (\type{WClientWin}, +\type{WWindow}) the parent \type{WWindow} is given by the same relation of +the X windows. For other \type{WRegion}s the relation is not as clear. +There is generally very few restrictions other than the above on the +parent---child relation but the most common is as described in +Figure \ref{fig:parentship}. + +\begin{figure} +\begin{htmlonly} +\docode % latex2html kludge +\end{htmlonly} +\begin{verbatim} + WRootWins + |-->WScreens + |-->WGroupWSs + |-->WTilings + |-->WClientWins in full screen mode + |-->WFrames + |-->WGroupCWs + |-->WClientWins + |-->WFrames for transients + |-->a possible WEdln or WMessage +\end{verbatim} +\caption{Most common parent--child relations} +\label{fig:parentship} +\end{figure} + +\type{WRegion}s have very little control over their children as a parent. +The manager\index{manager} \type{WRegion} has much more control over its +managed \type{WRegion}s. Managers, for example, handle resize requests, +focusing and displaying of the managed regions. Indeed the manager---managed +relationship gives a better picture of the logical ordering of objects on +the screen. Again, there are generally few limits, but the most common +hierarchy is given in Figure \ref{fig:managership}. Note that sometimes +the parent and manager are the same object and not all objects may have +a manager (e.g. the dock in the dock module at the time of writing this) +but all have a parent--a screen if not anything else. + +\subsubsection{Manager--managed relations} + +\begin{figure} +\begin{htmlonly} +\docode % latex2html kludge +\end{htmlonly} +\begin{verbatim} + WRootWins + |-->WScreens + |-->WGroupCWs for full screen WClientWins + | |-->WClientWins + | |-->WFrames for transients (dialogs) + | |--> WClientWin + |-->WGroupWSs for workspaces + | |-->WTiling + | | |-->possibly a WEdln, WMessage or WMenu + | | |-->WFrames + | | |-->WGroupCWs (with contents as above) + | |-->WFrames for floating content + |-->WFrames for sticky stuff, such as the scratchpad +\end{verbatim} +\caption{Most common manager--managed relations} +\label{fig:managership} +\end{figure} + +Note that a workspace can manage another workspace. This can be +achieved with the \fnref{attach_new} function, and allows you to nest +workspaces as deep as you want. + +%Note how the \type{WClientWin}s managed by \type{WFloatFrame}s don't have +%transients managed by them. This is because WFloatWSs choose to handle +%transients differently (transients are put in separate frames like normal +%windows). + +\subsection{Summary} + +In the standard setup, keeping queries, messages and menus out of +consideration: + +\begin{itemize} + \item The top-level objects that matter are screens and they correspond + to physical screens. The class for screens is \type{WScreen}. + \item Screens contain (multiplex) groups (\type{WGroup}) and other + objects, such as \type{WFrames}. Some of these are mutually exclusive + to be viewed at a time. + \item Groups of the specific kind \type{WGroupWS} often contain a + \type{WTiling} tiling for tiling frames (\type{WFrame}), but + groups may also directly contain floating frames. + \item Frames are the objects with decorations such as tabs and borders. + Frames contain (multiplex) among others (groups of) client windows, + to each of which corresponds a tab in the frame's decoration. Only + one client window (or other object) can be shown at a time in each + frame. The class for client windows is \type{WClientWin}. +\end{itemize} + diff --git a/objectsimpl.tex b/objectsimpl.tex new file mode 100644 index 0000000..ccc440d --- /dev/null +++ b/objectsimpl.tex @@ -0,0 +1,20 @@ +\section{Object system implementation} + +First, to get things clear, what are considered objects here are C +structures containing a properly initialized \type\indextype{WObj} +structure defined in \file{ioncore/obj.h} as the first element (or the +first element of the structure which is the first element and so on which +gives rise to inheritance). The \type{WObj} structure contains a pointer +to a \type{WObjDescr}\indextype{WObjDescr} class type info structure and +a list of so called ''watches''. The \type{WObjDescr} structure simply +lists the class name, a table of dynamic functions and a pointer to +deinitialisation function (or ''destructor''). + +Ion does not do any reference counting, garbage collecting or other +fancy things related to automatic safe freeing of objects with its +simplistic object system. Instead special watches (the \type{WWatch} +\indextype{WWatch} structure) may be used to create safe references to +objects that might be destroyed during the time the specific pointer is +needed. When an object is destroyed, its list of watches is processed, +setting the pointers in the watches to NULL and the watch handlers for +each watch are called. diff --git a/predist.sh b/predist.sh new file mode 100644 index 0000000..31e7405 --- /dev/null +++ b/predist.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +## +## Versioning +## + +pwd=`pwd` +dir=`basename "$pwd"` + +release=`echo "$dir"|sed 's/^.\+-\([^-]\+-[0-9]\+\)$/\1/p; d'` + +if test "$release" == ""; then + echo "Invalid package name $dir." + exit 1 +fi + +## +## Ion path +## + +if test "$ION_PATH" = ""; then + ION_PATH="../ion-${release}" +fi + +## +## Build +## + +set -e + +d=`echo $release|sed 's/[^-]\+-\(....\)\(..\)\(..\)/\1-\2-\3/'` + +perl -p -i -e "s/%%DATE/\\\\date{$d}/" ionconf.tex +sed "s:^TOPDIR=.*:TOPDIR=${ION_PATH}:" Makefile > Makefile.tmp +make -f Makefile.tmp all +make -f Makefile.tmp all-ps +make -f Makefile.tmp clean +rm Makefile.tmp +gzip *.dvi *.ps diff --git a/prelim.tex b/prelim.tex new file mode 100644 index 0000000..c5db5f8 --- /dev/null +++ b/prelim.tex @@ -0,0 +1,58 @@ + +\chapter{Preliminaries: Key concepts and relations} +\label{chap:prelim} + +The purpose of this chapter to explain some of key concepts and +relations you need to understand before reading the following +chapters. These include modules explained in section \ref{sec:modules} +and the Ion class and object hierarchies, section \ref{sec:objects}. + + +\section{Modules} +\label{sec:modules} + +Ion has been designed so that the 'ion' executable only implements some +basic services on top of which very different kinds of window managers +could be build by loading the appropriate 'modules'. On modern system +these modules are simply dynamically loaded \file{.so} libraries. On +more primitive systems, or if you want to squeeze total size of the +executable and libraries, the modules can optionally be statically +linked to the main binary, but must nevertheless be loaded with the +\fnref{dopath} function. Modules may also include Lua code. + +If no modules are loaded, all client windows appear in full screen mode. +To get better window management support, one or more workspace modules +should be loaded. Currently Ion provides the following modules: + +\begin{description} + \item[\file{mod\_tiling}] Tilings for workspaces of the original tiled + Ion kind. + \item[\file{mod\_query}] Queries (for starting programs and so on) + and message boxes. + \item[\file{mod\_menu}] Support for menus, both pull-down and + keyboard-operated in-frame menus. + \item[\file{mod\_statusbar}] Module that implements a statusbar that + can be adaptively embedded in each workspace's layout. + \item[\file{mod\_dock}] Module for docking Window Maker dockapps. + The dock can both float and be embedded as the statusbar. + \item[\file{mod\_sp}] This module implements a scratchpad frame that can + be toggled on/off everywhere. Think of the 'console' in some + first-person shooters. + \item[\file{mod\_mgmtmode}] Support module for implementing ''management + modes'' with a XOR-frame similar to move/resize mode around selected + region. + \item[\file{mod\_sm}] Session management support module. + \emph{Loaded automatically when needed!} +\end{description} + +So-called drawing engines are also implemented as a modules, +but they are not discussed here; see chapter \ref{chap:gr}. + +The stock configuration for the 'ion3' executable loads all of the modules +mentioned above except \file{mod\_dock} and file{mod\_mgmtmode}. +The stock configuration for the 'pwm3' executable (which differs from the +'ion3' executable in a few configuration details, such as Xinerama usage) +loads another set of modules. + + +\input{objects} diff --git a/rapport3.perl b/rapport3.perl new file mode 100644 index 0000000..77b2cbd --- /dev/null +++ b/rapport3.perl @@ -0,0 +1,38 @@ +# rapport3.perl by Tuomo Valkonen, , 2003-05-10 +# +# Implementation of the documentclass for latex2html. Just make some +# sectioning commands saner and load report. +# + +package main; + +# +# Sections should start at H2 instead of the insane default H1. +# + +%standard_section_headings = + ('part' , 'H1' , 'chapter' , 'H1', 'section', 'H2', 'subsection', 'H3' + , 'subsubsection', 'H4', 'paragraph', 'H4', 'subparagraph', 'H5'); + +&generate_sectioning_subs; + +%section_headings = + ('partstar' , 'H1' , 'chapterstar' , 'H1', 'sectionstar', 'H2' + , 'subsectionstar', 'H3', 'subsubsectionstar', 'H4', 'paragraphstar' + , 'H4', 'subparagraphstar', 'H5', %section_headings); + +# +# These should be chapters in a report +# + +%section_headings = + ('tableofcontents', 'H1', 'listoffigures', 'H1', 'listoftables', 'H1' + , 'bibliography', 'H1', 'textohtmlindex', 'H1' + , %standard_section_headings + , %section_headings); + + +&do_require_package("report"); + +1; + diff --git a/statusd.tex b/statusd.tex new file mode 100644 index 0000000..e1fe6b2 --- /dev/null +++ b/statusd.tex @@ -0,0 +1,81 @@ + +\section{Writing \command{ion-statusd} monitors} + +All statusbar meters that do not monitor the internal state of Ion should +go in the separate \command{ion-statusd} program. + +Whenever the user requests a meter \code{\%foo} or \code{\%foo_bar} to be +inserted in a statusbar, \file{mod\_statusbar} asks \command{ion-statusd} to +load \fnref{statusd_foo.lua} on its search path (same as that for Ion-side +scripts). This script should then supply all meters with the initial part +'\code{foo}'. + +To provide this value, the script should simply call \code{statusd.inform} +with the name of the meter and the value as a string. +Additionally the script should provide a 'template' for the meter to +facilitate expected width calculation by \file{mod\_statusbar}, and +may provide a 'hint' for colour-coding the value. The interpretation +of hints depends on the graphical style in use, and currently the +stock styles support the \code{normal}, \code{important} and +\code{critical} hints. + + +In our example of the 'foo monitor', at script init we might broadcast +the template as follows: + +\begin{verbatim} +statusd.inform("foo_template", "000") +\end{verbatim} + +To inform \file{mod\_statusbar} of the actual value of the meter and +indicate that the value is critical if above 100, we might write the +following function: + +\begin{verbatim} +local function inform_foo(foo) + statusd.inform("foo", tostring(foo)) + if foo>100 then + statusd.inform("foo_hint", "critical") + else + statusd.inform("foo_hint", "normal") + end +end +\end{verbatim} + +To periodically update the value of the meter, we must use timers. +First we must create one: + +\begin{verbatim} +local foo_timer=statusd.create_timer() +\end{verbatim} + +Then we write a function to be called whenever the timer expires. +This function must also restart the timer. + +\begin{verbatim} +local function update_foo() + local foo= ... measure foo somehow ... + inform_foo(foo) + foo_timer:set(settings.update_interval, update_foo) +end +\end{verbatim} + +Finally, at the end of our script we want to do the initial +measurement, and set up timer for further measurements: + +\begin{verbatim} +update_foo() +\end{verbatim} + + +If our scripts supports configurable parameters, the following code +(at the beginning of the script) will allow them to be configured in +\file{cfg\_statusbar.lua} and passed to the status daemon and our script: + +\begin{verbatim} +local defaults={ + update_interval=10*1000, -- 10 seconds +} + +local settings=table.join(statusd.get_config("foo"), defaults) +\end{verbatim} diff --git a/tricks.tex b/tricks.tex new file mode 100644 index 0000000..69fe945 --- /dev/null +++ b/tricks.tex @@ -0,0 +1,104 @@ + +\chapter{Scripting} +\label{chap:tricks} + +This chapter documents some additional features of the Ion configuration +and scripting interface that can be used for more advanced scripting than +the basic configuration exlained in chapter \ref{chap:config}. + +\section{Hooks} +\label{sec:hooks} + +Hooks are lists of functions to be called when a certain event occurs. +There are two types of them; normal and ''alternative'' hooks. Normal +hooks do not return anything, but alt-hooks should return a boolean +indicating whether it handled its assigned task succesfully. In the case +that \var{true} is returned, remaining handlers are not called. + +Hook handlers are registered by first finding the hook +with \fnref{ioncore.get_hook} and then calling \fnref{WHook.add} +on the (succesfull) result with the handler as parameter. Similarly +handlers are unregistered with \fnref{WHook.remove}. For example: + +\begin{verbatim} +ioncore.get_hook("ioncore_snapshot_hook"):add( + function() print("Snapshot hook called.") end +) +\end{verbatim} + +In this example the hook handler has no parameters, but many hook +handlers do. The types of parameters for each hook are listed in +the hook reference, section \ref{sec:hookref}. + + +Note that many of the hooks are called in ''protected mode'' and can not +use any functions that modify Ion's internal state. TODO: More detailed +documentation when this is final. + +\section{Referring to regions} + +\subsection{Direct object references} + +All Ion objects are passed to Lua scriptss as 'userdatas', and you may +safely store such object references for future use. The C-side object +may be destroyed while Lua still refers to the object. All exported +functions gracefully fail in such a case, but if you need to explicitly +test that the C-side object still exists, use \fnref{obj_exists}. + +As an example, the following short piece of code implements +bookmarking: + +\begin{verbatim} +local bookmarks={} + +-- Set bookmark bm point to the region reg +function set_bookmark(bm, reg) + bookmarks[bm]=reg +end + +-- Go to bookmark bm +function goto_bookmark(bm) + if bookmarks[bm] then + -- We could check that bookmarks[bm] still exists, if we + -- wanted to avoid an error message. + bookmarks[bm]:goto() + end +end +\end{verbatim} + +\subsection{Name-based lookups} + +If you want to a single non-\type{WClientWin} region with an exact known +name, use \fnref{ioncore.lookup_region}. If you want a list of all regions, +use \fnref{ioncore.region_list}. Both functions accept an optional argument +that can be used to specify that the returned region(s) must be of a more +specific type. Client windows live in a different namespace and for them +you should use the equivalent functions \fnref{ioncore.lookup_clientwin} +and \fnref{ioncore.clientwin_list}. + +To get the name of an object, use \fnref{WRegion.name}. Please be +aware, that the names of client windows reflect their titles and +are subject to changes. To change the name of a non-client window +region, use \fnref{WRegion.set_name}. + + +\section{Alternative winprop selection criteria} + +It is possible to write more complex winprop selection routines than +those described in section \ref{sec:winprops}. To match a particular +winprop using whatever way you want to, just set the \var{match} +field of the winprop to a function that receives the client window +as its sole parameter, and that returns \code{true} if the winprop +matches, and \code{false} otherwise. + +The class, instance and role properties can be obtained with +\fnref{WClientWin.get_ident}, and the title with \fnref{WRegion.name}. +If you want to match against (almost) arbitrary window properties, +have a look at the documentation for the following functions, and +their standard Xlib counterparts: \fnref{ioncore.x_intern_atom} +(XInternAtom), \fnref{ioncore.x_get_window_property} (XGetWindowProperty), +and \fnref{ioncore.x_get_text_property} (XGetTextProperty). + + +\input{statusd} +