From: Ben Hutchings Date: Sun, 2 Nov 2008 12:15:41 +0000 (+0000) Subject: [svn-upgrade] Integrating new upstream version, ion3 (20071109) X-Git-Tag: 20071109 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=commitdiff_plain;h=a6561c9679cd701b0d50c3cfd44e4664f7df2b2f [svn-upgrade] Integrating new upstream version, ion3 (20071109) --- diff --git a/ChangeLog b/ChangeLog index 3d13196..e73da79 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,84 @@ +2007-11-09 14:47 UTC Tuomo Valkonen + tagged ion-3rc-20071109 + +2007-11-09 14:47 UTC Tuomo Valkonen + * Release notes + +2007-11-09 14:44 UTC Tuomo Valkonen + * Added "forget" parameter to ioncore.detach and improved doc. + +2007-11-08 18:17 UTC Tuomo Valkonen + * Removed redundant is_fullscreen. + +2007-11-06 07:48 UTC Tuomo Valkonen + * Some cleanup to better separate ion-statusd from mod_statusbar + and allow for better statusd as an add-on. + +2007-11-05 17:27 UTC Tuomo Valkonen + * Improved stdisp placement in non-tiled groups. + +2007-11-05 17:27 UTC Tuomo Valkonen + * Stretch size policies support gravity (for alignment after size hints). + +2007-11-05 17:07 UTC Tuomo Valkonen + * Improved split resize behaviour + +2007-11-04 17:58 UTC Tuomo Valkonen + * Initial focus fixes for modal stacking levels. + +2007-11-04 12:14 UTC Tuomo Valkonen + * attach_framed wasn't supporting typical group attach parameters. + +2007-11-03 23:40 UTC Tuomo Valkonen + * I knew it! Recent focus code changes broke something. + (Modal stacking levels within groups.) + +2007-11-03 23:21 UTC Tuomo Valkonen + * Oops, copy-paste. + +2007-11-01 17:11 UTC Tuomo Valkonen + * Changed disposeroot policy for WGroupCW. + Last managed region disposed always disposes the group (if possible). + +2007-11-01 17:09 UTC Tuomo Valkonen + * Oops, some of the rescue code hacks broke other things.. + (Shouldn't try to rescue whole WGroupCWs without further info.) + +2007-10-27 12:44 UTC Tuomo Valkonen + * Further rescue code hacks. + +2007-11-01 14:21 UTC Tuomo Valkonen + * query_exec completor uses mplex working directory. + +2007-11-01 14:10 UTC Tuomo Valkonen + * Added 'wd' parameter to popen_bgread. + (As the last one. It's a bit ugly that the order of parameters isn't similar + to exec_on, but I'm not going to start breaking the Lua-side API at RC stage.) + +2007-10-27 12:38 UTC Tuomo Valkonen + * Suppressed dead object warnings from tab number script. + +2007-10-26 14:10 UTC Tuomo Valkonen + * Changes in WMPlex placeholder ordering. + - Attaching now moves the attach-pholder after the new mx-region. + - Rescue pholder is placed at the end of the list. + +2007-10-26 14:06 UTC Tuomo Valkonen + * Support for rescue code pholder attach flags and masks. + +2007-10-19 16:24 UTC Tuomo Valkonen + * Fixed doc. comment + +2007-10-15 15:48 UTC Tuomo Valkonen + * Cleaned up non-existent function from headers. + +2007-10-15 15:47 UTC Tuomo Valkonen + * Do not optimise away region_managed_prepare_focus call. + Tiling internal focus tracking can become confused if this is done. + +2007-10-15 05:57 UTC Tuomo Valkonen + * Removed redundant restack in tiling code + 2007-09-27 16:22 UTC Tuomo Valkonen tagged ion-3rc-20070927 diff --git a/RELNOTES b/RELNOTES index b9bcfca..0d09d47 100644 --- a/RELNOTES +++ b/RELNOTES @@ -1,4 +1,16 @@ +ion-3rc-20071109 +---------------- + +It seems people are a bit slow, or only scaring them with a final +release makes them report issues. So, still no stable release but +a candidate, with many minor fixes and improvements wrt. important +omissions. The most important changes are better behaviour of the +unsplit operation, better handling of main window being closed +before a transient, and use of the workspace's working directory +for run query file name completion. + + ion-3rc-20070927 ---------------- diff --git a/doc/ChangeLog b/doc/ChangeLog deleted file mode 100644 index bf16748..0000000 --- a/doc/ChangeLog +++ /dev/null @@ -1,820 +0,0 @@ -2007-09-27 16:23 UTC Tuomo Valkonen - tagged ion-doc-3rc-20070927 - -2007-09-11 07:40 UTC Tuomo Valkonen - * Notes on config file modification - -2007-09-02 13:41 UTC Tuomo Valkonen - tagged ion-doc-3rc-20070902 - -2007-07-14 21:59 UTC Tuomo Valkonen - * Removed obsolete TODO note - -2007-07-14 20:34 UTC Tuomo Valkonen - * Documented orientation winprop - -2007-07-08 09:38 UTC Tuomo Valkonen - tagged ion-doc-3rc-20070708 - -2007-06-08 16:58 UTC Tuomo Valkonen - tagged ion-doc-3rc-20070608 - -2007-05-06 14:40 UTC Tuomo Valkonen - tagged ion-doc-3rc-20070506 - -2007-05-06 14:25 UTC Tuomo Valkonen - * mod_mgmtmode removal - -2007-05-06 13:09 UTC Tuomo Valkonen - * Removed obsolete example - -2007-05-04 21:46 UTC Tuomo Valkonen - * Fixes and updates to binding docs - -2007-05-04 16:13 UTC Tuomo Valkonen - * Documen the submap leave/enter stuff - -2007-04-26 22:44 UTC Tuomo Valkonen - * Improved string marking - -2007-04-26 22:28 UTC Tuomo Valkonen - * Drawing stuff doc improvements - -2007-04-22 18:14 UTC Tuomo Valkonen - * Document is_dockapp - -2007-04-22 12:29 UTC Tuomo Valkonen - * Winprop doc. improvements/fixes - -2007-04-22 00:16 UTC Tuomo Valkonen - * Minor fixes and improvements - -2007-04-20 16:36 UTC Tuomo Valkonen - * Document is_transient - -2007-04-15 12:33 UTC Tuomo Valkonen - * Updates to implementation notes - -2007-04-08 12:38 UTC Tuomo Valkonen - * Removed quotation abuse - -2007-04-08 12:37 UTC Tuomo Valkonen - * Size policy documentation - -2007-04-08 11:53 UTC Tuomo Valkonen - * Quote changes - -2007-04-08 11:49 UTC Tuomo Valkonen - * Fixed typos etc. - -2007-04-08 11:34 UTC Tuomo Valkonen - * Intro improvements - -2007-04-06 11:27 UTC Tuomo Valkonen - * Systray stuff improvs - -2007-04-06 11:23 UTC Tuomo Valkonen - * Year changed.. - -2007-04-06 11:17 UTC Tuomo Valkonen - * Function reference building improvements - -2007-04-05 16:32 UTC Tuomo Valkonen - * Bah, stupid latex2html - -2007-04-05 16:27 UTC Tuomo Valkonen - * mod_statusbar documentation - -2007-04-05 15:21 UTC Tuomo Valkonen - * Oops, mod_statusbar.lua was missing from sources - -2007-03-20 11:27 UTC Tuomo Valkonen - * Fixes - -2007-03-18 20:09 UTC Tuomo Valkonen - tagged ion-doc-3ds-20070318 - -2007-03-17 19:08 UTC Tuomo Valkonen - * cfg_ion.lua walkthrough updates - -2007-03-17 11:13 UTC Tuomo Valkonen - * border_sides doc - -2007-02-25 19:48 UTC Tuomo Valkonen - * Note on "userpos" winprop. - -2007-02-20 02:47 UTC Tuomo Valkonen - * Winprop doc updates - -2007-02-20 02:27 UTC Tuomo Valkonen - * Removed outdated winprop - -2007-02-19 16:09 UTC Tuomo Valkonen - * Updated manager-managed figure - -2007-02-03 17:32 UTC Tuomo Valkonen - * Oops, still missing some statusbar stuff - -2007-02-03 17:30 UTC Tuomo Valkonen - * Minor fixes - -2007-02-03 15:04 UTC Tuomo Valkonen - tagged ion-doc-3ds-20070203 - -2007-02-03 15:00 UTC Tuomo Valkonen - * Style configuration documentation updates - -2007-02-02 21:38 UTC Tuomo Valkonen - * Statusbar stuff was missing - -2007-01-30 18:29 UTC Tuomo Valkonen - * Documented new_group - -2007-01-26 18:16 UTC Tuomo Valkonen - * Hook reference updates - -2007-01-18 07:54 UTC Tuomo Valkonen - * Updates - -2007-01-17 19:28 UTC Tuomo Valkonen - * Updated class hierarchies - -2007-01-13 18:43 UTC Tuomo Valkonen - * Update - -2007-01-13 16:12 UTC Tuomo Valkonen - * Updated hook documentation - -2007-01-03 19:12 UTC Tuomo Valkonen - * Document focuslist and focuslist_ menus - -2007-01-03 15:31 UTC Tuomo Valkonen - * Added missing clientwin_property_change_hook documentation - -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/doc/LICENSE b/doc/LICENSE deleted file mode 100644 index d60c31a..0000000 --- a/doc/LICENSE +++ /dev/null @@ -1,340 +0,0 @@ - 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/doc/Makefile b/doc/Makefile deleted file mode 100644 index ca10058..0000000 --- a/doc/Makefile +++ /dev/null @@ -1,123 +0,0 @@ -# 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.exports mod_tiling.exports \ - mod_query.exports de.exports mod_menu.exports \ - mod_dock.exports mod_sp.exports mod_statusbar.exports - -# 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 -###################################### - -include $(TOPDIR)/libmainloop/rx.mk - -$(TOPDIR)/%/exports.tex: - $(MAKE) -C $$(dirname $@) _exports_doc - -%.exports: $(TOPDIR)/%/exports.tex - cp $< $@ - -# Function list -###################################### - -fnlist.tex: $(FNTEXES) - grep hyperlabel $+ | \ - sed 's/.*fn:\([^}]*\).*/\\fnlisti{\1}/;'|sort -d -f \ - > $@ diff --git a/doc/README b/doc/README deleted file mode 100644 index 604bf85..0000000 --- a/doc/README +++ /dev/null @@ -1,23 +0,0 @@ - -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/doc/artikel3.perl b/doc/artikel3.perl deleted file mode 100644 index 110f32c..0000000 --- a/doc/artikel3.perl +++ /dev/null @@ -1,12 +0,0 @@ -# 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/doc/conf-bindings.tex b/doc/conf-bindings.tex deleted file mode 100644 index efec6a4..0000000 --- a/doc/conf-bindings.tex +++ /dev/null @@ -1,275 +0,0 @@ -\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: -\codestr{WScreen}, -\codestr{WMPlex}, -\codestr{WMPlex.toplevel}, -\codestr{WFrame}, -\codestr{WFrame.toplevel}, -\codestr{WFrame.floating}, -\codestr{WFrame.tiled}, -\codestr{WFrame.transient}, -\codestr{WMoveresMode}, -\codestr{WGroup}, -\codestr{WGroupCW}, -\codestr{WGroupWS}, -\codestr{WClientWin}, -\codestr{WTiling}, and -\codestr{WStatusBar}. -Most of these should be self-explanatory, corresponding to objects -of class with the same name. The ones with \codestr{.toplevel} suffix -refer to screens and ``toplevel'' frames, i.e. frames that are -not used for transient windows. Likewise \codestr{.transient} refers -to frames in transient mode, and \codestr{.tiled} and \codestr{.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 following -special variables are available in this code. - -\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{_}. This should seldom be needed. -\end{tabularx} - -For example, supposing \code{_} (underscore) 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} - \codestr{\_sub:non-nil} & The \code{_sub} parameter must be set. \\ - \codestr{\_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 \fnrefx{ioncore}{kpress}, and - \fnrefx{ioncore}{kpress_wait}\code{(keyspec, handler [, guard])}. - \item \fnrefx{ioncore}{submap}\code{(keyspec, \{ ... more key bindings ... \})}. - \item \fnrefx{ioncore}{submap_enter}, and - \fnrefx{ioncore}{submap_wait}\code{(handler [, guard])}. -\end{itemize} -Mouse actions: -\begin{itemize} - \item \fnrefx{ioncore}{mclick}, - \fnrefx{ioncore}{mdblclick}, - \fnrefx{ioncore}{mpress}, and - \fnrefx{ioncore}{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, \fnrefx{ioncore}{kpress_wait} is simply -\fnrefx{ioncore}{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 -\fnrefx{ioncore}{submap} function is used to define submaps or -``prefix maps''. The second argument to this function is table listing -the key press actions (\fnrefx{ioncore}{kpress}) in the submap. -The \fnrefx{ioncore}{submap_enter} handler is called when the submap -is entered, in which this handler is defined. Likewise, the -\fnrefx{ioncore}{submap_wait} handler is called when all modifiers -have been released while waiting for further key presses 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: - -\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}} - -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 -\codestr{border}, \codestr{tab}, \codestr{empty\_tab}, \codestr{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 \codestr{Mod1+} and \codestr{} (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/doc/conf-menus.tex b/doc/conf-menus.tex deleted file mode 100644 index 531f63a..0000000 --- a/doc/conf-menus.tex +++ /dev/null @@ -1,122 +0,0 @@ -\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} - \codestr{windowlist} & - List of all client windows. Activating an entry jumps to that window. \\ - \codestr{workspacelist} & - List of all workspaces. Activating an entry jumps to that workspaces. \\ - \codestr{focuslist} & - List of client windows with recent activity in them, followed by - previously focused client windows. \\ - \codestr{focuslist\_} & - List of previously focused client windows. \\ - \codestr{stylemenu} & - List of available \file{look\_*.lua} style files. Activating an entry - loads that style and ask to save the selection. \\ - \codestr{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: \codestr{WFrame.tiled}, \codestr{WFrame.floating}, -and \codestr{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. \\ -\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/doc/conf-statusbar.tex b/doc/conf-statusbar.tex deleted file mode 100644 index 2475552..0000000 --- a/doc/conf-statusbar.tex +++ /dev/null @@ -1,124 +0,0 @@ -\section{The statusbar} -\label{sec:statusbar} - -The \file{mod\_statusbar} module provides a statusbar that adapts to -layouts of tilings, using only the minimal space needed. Ion only -supports one adaptive ``status display'' object per screen, so this -statusbar is mutually exclusive with the embedded mode of \file{mod\_dock} -docks. - -The statusbar is configured in \file{cfg\_statusbar.lua}. Typically, -the configuration consists of two steps: creating a statusbar with -\fnref{mod\_statusbar.create}, and then launching the separate -\command{ion-statusd} status daemon process with -\fnref{mod_statusbar.launch_statusd}. This latter phase is done -automatically, if it was not done by the configuration file, but -the configuration file may pass extra parameters to \command{ion-statusd} -monitors. (See Section \ref{sec:statusd} for more information on -writing \command{ion-statusd} monitors.) - -A typical \file{cfg\_statusbar.lua} configuration might look as follows: - - -\begin{verbatim} --- Create a statusbar -mod_statusbar.create{ - screen = 0, -- First screen, - pos = 'bl', -- bottom left corner - systray = true, -- Swallow systray windows - - -- The template - template = "[ %date || load:% %>load || mail:% %>mail_new/%>mail_total ]" - .. " %filler%systray", -} - --- Launch ion-statusd. -mod_statusbar.launch_statusd{ - -- Date meter - date={ - -- ISO-8601 date format with additional abbreviated day name - date_format='%a %Y-%m-%d %H:%M', - }, -} -\end{verbatim} - - -\subsection{The template} - -The template specifies what is shown on the statusbar; for information -on the other options to \fnref{mod_statusbar.create}, see the reference. -Strings of the form \codestr{\%spec} tokens specially interpreter by -the statusbar; the rest appears verbatim. The \code{spec} typically -consists of the name of the value/meter to display (beginning with a latin -alphabet), but may be preceded by an alignment specifier and a number -specifying the minimum width. The alignment specifiers are: \codestr{>} -for right, \codestr{<} for left, and \codestr{|} for centring. Additionally, -space following \codestr{\%} (that is, the string \codestr{\% }), adds -``stretchable space'' at that point. The special string \codestr{\%filler} -may be used to flush the rest of the template to the right end of -the statusbar. - -The stretchable space works as follows: \file{mod\_statusbar} remembers -the widest string (in terms of graphical presentation) that it has -seen for each meter, unless the width has been otherwise constrained. -If there is stretchable space in the template, it tries to make the -meter always take this much space, by stretching any space found in -the direction indicated by the alignment specifier: the opposite -direction for left or right alignment, and both for centring. - -\subsection{The systray} - -The special \codestr{\%systray} and \codestr{\%systray\_*} -(\codestr{*} varying) monitors indicate where to place system tray -windows. There may be multiple of these. KDE-protocol system tray -icons are placed in \codestr{\%systray} automatically, unless disabled -with the \var{systray} option. Otherwise the \var{statusbar} winprop may -be used to place any window in any particular \codestr{\%systray\_*}. - -\subsection{Monitors} - -The part before the first -underscore of each monitor name, describes the script/plugin/module -that provides the meter, and any configuration should be passed -in the a corresponding sub-table \fnref{mod_statusbar.launch_statusd}. -Ion comes with date, load and mail (for plain old mbox) -\command{ion-statusd} monitor scripts. More may be obtained from -the scripts repository \cite{scripts}. These included scripts -provide the following monitors and their options - -\subsubsection{Date} - -Options: \var{date_format}: The date format in as seen above, -in the usual \code{strftime} format. \code{formats}: table of -formats for additional date monitors, the key being the name -of the monitor (without the \codestr{date\_} prefix). - -Monitors: \codestr{date} and other user-specified ones with the -\codestr{date\_} prefix. - - -\subsubsection{Load} - -Options: \var{update_interval}: Update interval in milliseconds -(default 10s). \var{important_threshold}: Threshold above which -the load is marked as important (default 1.5), so that the -drawing engine may be suitably hinted. \var{critical_threshold}: -Threshold above which the load is marked as critical (default 4.0). - - -Monitors: \codestr{load} (for all three values), -\codestr{load\_1min}, \codestr{load\_5min} and \codestr{load\_15min}. - - -\subsubsection{Mail} - -Options: \var{update_interval}: Update interval in milliseconds -(default 1min). \var{mbox}: mbox-format mailbox location -(default \verb!$MAIL!). -\var{files}: list of additional mailboxes, the key giving the -name of the monitor. - -Monitors: \codestr{mail\_new}, \codestr{mail\_unread}, -\codestr{mail\_total}, and corresponding -\codestr{mail\_*\_new}, \codestr{mail\_*\_unread}, and \codestr{mail\_*\_total} -for the additional mailboxes (\codestr{*} varying). diff --git a/doc/conf-winprops.tex b/doc/conf-winprops.tex deleted file mode 100644 index db70e5f..0000000 --- a/doc/conf-winprops.tex +++ /dev/null @@ -1,288 +0,0 @@ -\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}{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}{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}{new_group}{string} - \index{new-group@\var{new_group}} - If the region specified by \code{target} winprop does not exist - (or that winprop is not set), create a new workspace using the - previously stored layout (see \fnref{ioncore.deflayout}) named by - this property. After creating the workspace, \code{target} is - attempted to be found again. (If that still fails, the newly - created workspace is still asked to manage the client window.) -\end{winprop} - - -\begin{winprop}{oneshot}{boolean} - \index{oneshot@\var{oneshot}} - Discard this winprop after first use. -\end{winprop} - - -\begin{winprop}{orientation}{string} - \index{orientation@\var{orientation}} - The orientation of the window: one of \codestr{vertical} or - \codestr{horizontal}. This is only useful when using the - window as a status display. -\end{winprop} - - -\begin{winprop}{statusbar}{string} - \index{statusbar@\var{statusbar}} - Put the window in the statusbar, in the named tray component, - (The default tray component is called simply \codestr{systray}, - and others you give names to in your custom template, always - prefixed by \codestr{systray\_}. -\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. See also \code{new_group}. -\end{winprop} - - -\begin{winprop}{transient_mode}{string} - \index{transient-mode@\var{transient_mode}} - \codestr{normal}: No change in behaviour. \codestr{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. \codestr{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}{transparent}{boolean} - \index{transparent@\var{transparent}} - Should frames be made transparent when this window is selected? \\ -\end{winprop} - - -\subsection{Sizehint winprops} - -Additionally, the winprops -\code{max_size}\index{max-size@\var{max_size}}, -\code{min_size}\index{min-size@\var{min_size}}, -\code{aspect}\index{aspect@\var{aspect}}, -\code{resizeinc}\index{aspect@\var{resizeinc}}, -and -\code{ignore_max_size}\index{ignore-max-size@\var{ignore_max_size}}, -\code{ignore_min_size}\index{ignore-min-size@\var{ignore_min_size}}, -\code{ignore_aspect}\index{ignore-aspect@\var{ignore_aspect}}, -\code{ignore_resizeinc}\index{ignore-aspect@\var{ignore_resizeinc}}, -may be used to override application-supplied size hints. The four -first ones are tables with the fields \var{w} and \var{h}, indicating -the width and height size hints in pixels, and the latter ignore -winprop is a boolean. - -Finally, the boolean -\code{userpos}\index{userpos@\var{userpos}} option may be used to -override the \code{USPosition} flag of the size hints. Normally, -when this flag is set, Ion tries to respect the supplied window -position more than when it is not set. Obviously, this makes sense -only for floating windows. - - -\subsection{Classes, roles and instances} -\label{sec:classesrolesinstances} - -The identification information supported are -\var{class}\index{class@\var{class}!winprop}, -\var{role}\index{role@\var{role}!winprop}, -\var{instance}\index{instance@\var{instance}!winprop}, -\var{name}\index{name@\var{name}!winprop}, -\var{is_transient}\index{is-transient@\var{is_transient}!winprop}, and -\var{is_dockapp}\index{is-dockapp@\var{is_dockapp}!winprop}. -It is not necessary to specify all of these fields. -The first three are strings, and must exactly match the -corresponding information obtained from the window's properties. -The \var{name} field is a Lua-style regular expression matched against -the window's title. The \var{is_transient} field is a boolean that can -be used to include or exclude transients only, while the \var{is_dockapp} -field is set by Ion for the dock windows of Window Maker dockapp protocol -dockapps. Usually this is the only information available for these -\emph{icon} windows. - -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} & other} - 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 matching winprops with the same -\var{class}, \var{role} and \var{instance}, but other information -different, the most recently defined one is used. - - -\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 -simultaneously 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 program's -windows, for example. Some other programs only set this information -after the window has been mapped, i.e. the window manager has been -told to start managing it, which is obviously too late. -Gtk applications in particular are often guilty on both counts. - - -\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{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 -\codestr{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 \codestr{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/doc/conf.tex b/doc/conf.tex deleted file mode 100644 index 6ec99ec..0000000 --- a/doc/conf.tex +++ /dev/null @@ -1,198 +0,0 @@ - -\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{cfg\_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. Finally, the statusbar is explained in \ref{sec:statusbar}. -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. For sake of maintainability -of your customised configuration, it is recommended against copying all of -the files there. Only copy those files you actually need to modify. Most -simple customisations, such as changes in a few bindings, are best done -entirely within \file{cfg\_ion.lua}. - -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. Configuration files can also be compiled into \file{.lc} files, -and these are attempted by the configuration file search routines before -\file{.lua} files. - -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\_layouts.lua} & - Some workspace layouts are defined here. \\ - % - \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 (\verb!--! is a -line comment in Lua) in the actual file, as they're the defaults -nevertheless. - -The first thing done 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. Note that these two are Lua -variables used in the configuration files only, and not Ion settings. -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. - -There are some other options as well; see the documentation -for \fnref{ioncore.set} for details. - -As a next step, in the actual \file{cfg\_ion.lua} file, we load -\file{cfg\_defaults.lua}. However, it is merely a convenience file for -doing exactly what we will going through below, and what is commented -out in the actual file. If you do not want to load what -\file{cfg\_defaults.lua} loads, just comment out the corresponding -line, and uncomment the lines for the files that you want: - -\begin{verbatim} ---dopath("cfg_defaults") -dopath("cfg_ioncore") -dopath("cfg_kludges") -dopath("cfg_layouts") -\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 collected 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}. -Finally, \file{cfg\_layouts.lua} defines some workspace layouts, available -through the \key{F9} workspace creation query. - -To actually be able to do something besides display windows in full screen -mode, we must next load some modules: - -\begin{verbatim} -dopath("mod_query") -dopath("mod_menu") -dopath("mod_tiling") -dopath("mod_statusbar") ---dopath("mod_dock") -dopath("mod_sp") -\end{verbatim} - - -\input{conf-bindings.tex} - -\input{conf-menus.tex} - -\input{conf-winprops.tex} - -\input{conf-statusbar.tex} - - diff --git a/doc/confintro.tex b/doc/confintro.tex deleted file mode 100644 index a04af82..0000000 --- a/doc/confintro.tex +++ /dev/null @@ -1,50 +0,0 @@ - -\chapter{Introduction} - -This document is an ``advanced user'' manual for the X11 window manager -Ion, version 3. It is an attempt at documenting things that go into 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 might first want to first glance at some -Lua documentation at - -\begin{center} - \url{http://www.lua.org/docs.html}, or \\ - \url{http://lua-users.org/wiki/LuaTutorial}, -\end{center} - -although this should not be strictly necessary for basic modifications -of configuration files for anyone with at least some familiarity with -programming languages. - -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 (or ``region'') and class hierarchies. While it may -not be necessary to study the latter for basic copy-paste modifications -of configuration files -- for that you should not really need this -manual either -- it is, however, essential to for more extensive -customisation, due to the semi-object-oriented nature of most of -Ion's scripting interface. Knowing the different object types also -helps dealing with the different binding ``contexts'' (see -Section \ref{sec:bindings}) that to some extent mirror these classes. - -The new user, fed up with the default key bindings and eager to -just quickly configure Ion to his liking, may therefore just want -to skip to Chapter \ref{chap:config}, and attempt to work from therefore. -That chapter provides the very basic Ion configuration know-how -is provided: all the different configuration files and their locations -are explained, instructions are given to allow the reader to -configure bindings and so-called ``winprops'', and the statusbar -templates are also explained. - -Next, Chapter \ref{chap:gr} explains the notion of drawing engines -and graphical styles and how to write new looks for Ion. More advanced -aspects of Ion's scripting interface are documented in Chapter -\ref{chap:tricks}. -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 an alphabetical -listing of all these functions may be found. - diff --git a/doc/cstyle.tex b/doc/cstyle.tex deleted file mode 100644 index e7f5917..0000000 --- a/doc/cstyle.tex +++ /dev/null @@ -1,118 +0,0 @@ -\section{C coding style} - -If you want to submit patches to Ion, you \textbf{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 spaces. - - \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/doc/de.tex b/doc/de.tex deleted file mode 100644 index 93402a7..0000000 --- a/doc/de.tex +++ /dev/null @@ -1,421 +0,0 @@ - -\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. Some additional settings and -user attributes are explained in Sections \ref{sec:grmisc}. - - -\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 \codestr{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 (\codestr{*}) 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 \codestr{foo-bar-baz} be queried, then the following -brushes are in order of preference: - -\begin{verbatim} -foo-bar-baz -foo-*-baz -foo-bar -* -\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} -\codestr{frame} & Style for frames. - Substyle attributes: \codestr{active}/\codestr{inactive} - (mutually exclusive) and - \codestr{quasiactive}/\codestr{not\_quasiactive}. - A frame is ``quasiactive'' when an active region - has a back-link to it, such as a detached window. \\ -\codestr{frame-tiled} & A more specific style for tiled frames. - Substyle attributes as for \codestr{frame}. \\ -\codestr{frame-tiled-alt} & An alternative style for tiled frames. - Often used to disable the tab-bar. \\ -\codestr{frame-floating} & A more specific style for floating - frames. \\ -\codestr{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} -\codestr{tab} & Style for frames' tabs and menu entries. - Substyle attributes: - \codestr{active}/\codestr{inactive} and - \codestr{selected}/\codestr{unselected} \\ -\codestr{tab-frame} & A more specific style for frames' tabs. - Additional substyle attributes include: - \codestr{tagged}/\codestr{not\_tagged}, - \codestr{dragged}/\codestr{not\_dragged}, - \codestr{activity}/\codestr{no\_activity}, - \codestr{quasiactive}/\codestr{not\_quasiactive}. \\ -\codestr{tab-frame-tiled}, & \\ -\codestr{tab-frame-tiled-alt}, & \\ -\codestr{tab-frame-floating}, & \\ -\codestr{tab-frame-transient} & More specific styles for frames in the - different modes. \\ -\codestr{tab-menuentry} & A more specific style for entries in \type{WMenu}s. - Additional substyle attributes include \codestr{submenu} and - occasionally also \codestr{activity} is used.\\ -\codestr{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} -\codestr{input} & A style for \type{WInput}s. \\ -\codestr{input-edln} & A more specific style for \type{WEdln}s. - Substyle attributes: \codestr{selection} for selected text and - \codestr{cursor} for the cursor indicating current editing point. \\ -\codestr{input-message} & A more specific style for \type{WMessage}s. \\ -\codestr{input-menu} & A more specific style for \type{WMenu}s. \\ -\codestr{input-menu-bigmenu} & An alternate style for \type{WMenu}s. \\ -\codestr{moveres\_display} & The box displaying position/size when - moving or resizing frames. \\ -\codestr{stdisp} & Any status display. \\ -\codestr{stdisp-dock} & The dock. \\ -\codestr{stdisp-statusbar} & The statusbar. Substyles include: - the name of any monitor/meter (such as \codestr{date}), and - the supplied hint. Typical hints are: \codestr{normal}, - \codestr{important}, and \codestr{critical}. \\ -\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 style file 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 \codestr{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 \codestr{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 ``shadow'' 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 - \codestr{elevated}/\codestr{inlaid}/\codestr{ridge}/\codestr{groove} - as seen in the above sketch. \\ -\var{border_sides} & A string indicating which sides of the border - to draw: \codestr{all}/\codestr{tb}/\codestr{lr} for all, - top and bottom, and left and right. To control between - left/right and top/bottom, use the pixel options below. \\ -\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 \codestr{left}/\codestr{right}/\codestr{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 -\codestr{tab-frame} the substyles \codestr{*-*-tagged} and \codestr{*-*-*-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 \codestr{*-*-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} -\label{sec:grmisc} - - -\subsection{Frame user attributes} - -The function \fnref{WFrame.set_grattr} may be used to give frames -(and their tabs) arbitrary extra attributes to be passed to the -drawing engine. Hence, by configuring such substyles in the style -configuration files, and turning on the attribute when needed, -scripts may display visual cues related to the frame. There is -also one extra attribute specially interpreted by the default -drawing engine: the \codestr{numbered} attribute, which causes -numbers to be displayed on the tabs. - - -\subsection{Extra fields for style \codestr{frame}} - -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. - -\begin{tabularx}{\linewidth}{lX} -\tabhead{Field & Description} -\code{bar} & Controls the style of the tab-bar. Possible values - are the strings \codestr{none}, \codestr{inside}, \codestr{outside} - and \codestr{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 \codestr{dock}} - -\begin{tabularx}{\linewidth}{lX} -\tabhead{Field & Description} -\code{outline_style} & How borders are drawn: - \codestr{none} -- no border, - \codestr{all} -- border around whole dock, - \codestr{each} -- border around each dockapp. \\ -\code{tile_size} & A table with entries \codestr{width} and \codestr{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/doc/designnotes.tex b/doc/designnotes.tex deleted file mode 100644 index e22ed89..0000000 --- a/doc/designnotes.tex +++ /dev/null @@ -1,54 +0,0 @@ -\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{mainloop_defer_destroy}% -\index{mainloop-defer-destroy@\code{mainloop_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{mainloop_defer_action}% - \index{mainloop-defer-action@\code{mainloop_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{mainloop_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/doc/exact-version b/doc/exact-version deleted file mode 100644 index b4bfe8c..0000000 --- a/doc/exact-version +++ /dev/null @@ -1,5 +0,0 @@ - -Context: - -[TAG ion-doc-3rc-20070927 -Tuomo Valkonen **20070927162337] diff --git a/doc/fnref.tex b/doc/fnref.tex deleted file mode 100644 index 7c6e45a..0000000 --- a/doc/fnref.tex +++ /dev/null @@ -1,46 +0,0 @@ -\chapter{Function reference} -\label{sec:exports} - -\section{Functions defined in \file{ioncore}} -\label{sec:ioncoreref} -\input{ioncore.exports} - -\section{Functions defined in \file{mod\_tiling}} -\label{sec:tilingref} -\input{mod_tiling.exports} - -%\section{Functions defined in \file{mod\_panews}} -%\label{sec:panewsref} -%\input{mod_panews.exports} - -\section{Functions defined in \file{mod\_query}} -\label{sec:queryref} -\input{mod_query.exports} - -\section{Functions defined in \file{mod\_menu}} -\label{sec:menuref} -\input{mod_menu.exports} - -\section{Functions defined in \file{mod\_dock}} -\label{sec:dockref} -\input{mod_dock.exports} - -\section{Functions defined in \file{mod\_sp}} -\label{sec:spref} -\input{mod_sp.exports} - -\section{Functions defined in \file{mod\_statusbar}} -\label{sec:statusbarref} -\input{mod_statusbar.exports} - -\section{Functions defined in \file{de}} -\label{sec:deref} -\input{de.exports} - -\section{Hooks} -\label{sec:hookref} -\input{hookref} - -\section{Miscellaneous} -\label{sec:miscref} -\input{miscref} diff --git a/doc/fullhierarchy.tex b/doc/fullhierarchy.tex deleted file mode 100644 index 51a0e84..0000000 --- a/doc/fullhierarchy.tex +++ /dev/null @@ -1,42 +0,0 @@ -\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 - |-->WRegion - | |-->WClientWin - | |-->WWindow - | | |-->WMPlex - | | | |-->WFrame - | | | |-->WScreen - | | | |->WRootWin - | | |-->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/doc/gpl.tex b/doc/gpl.tex deleted file mode 100644 index d4de1de..0000000 --- a/doc/gpl.tex +++ /dev/null @@ -1,416 +0,0 @@ -\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/doc/hookref.tex b/doc/hookref.tex deleted file mode 100644 index 5e0c05f..0000000 --- a/doc/hookref.tex +++ /dev/null @@ -1,220 +0,0 @@ - -\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 dock-app. \\ - \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-property-change-hook@\code{clientwin_property_change_hook}} - \hookname{clientwin_property_change_hook} - \hookparams{(WClientWin, integer)} - \begin{funcdesc} - Called when the property identified by the parameter atom id - (integer) has changed on 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 & \codestr{switchonly}, \codestr{reorder}, - \codestr{add} or \codestr{remove} \\ - \var{sw} & bool & Switch occurred \\ - \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 main-loop, 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{ioncore-submap-ungrab-hook@\code{ioncore_submap_ungrab_hook}} - \hookname{ioncore_submap_ungrab_hook} - \hookparams{()} - \begin{funcdesc} - This hook is used to signal whenever Ion leaves the submap grab mode. - \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 successful 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{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{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} - - -\begin{function} - \index{region-notify-hook@\code{region_notify_hook}} - \hookname{region_notify_hook} - \hookparams{(WRegion, string)} - \begin{funcdesc} - Signalled when something (minor) has changed in relation to - the first parameter region. The string argument gives the - change: - - \begin{tabularx}{\linewidth}{lX} - \tabhead{String & Description} - \code{deinit} & The region is about to be deinitialised. \\ - \code{activated} & The region has received focus. \\ - \code{inactivated} & The region has lost focus. \\ - \code{activity} & There's been activity in the region itself. \\ - \code{sub_activity} & There's been activity in some sub-region. \\ - \code{name} & The name of the region has changed. \\ - \code{unset_manager} & The region no longer has a manager. \\ - \code{set_manager} & The region now has a manager. \\ - \code{tag} & Tagging state has changed. \\ - \code{pseudoactivated} & The region has become pseudo-active - (see below). \\ - \code{pseudoinactivated} & The region is no longer pseudo-active. \\ - \end{tabularx} - - A region is pseudo-active, when a) it is itself not active (does - not not have the focus, and may not even have a window that could - have it), but b) some region managed by it is active. - \end{funcdesc} -\end{function} - - diff --git a/doc/ionconf.dvi.gz b/doc/ionconf.dvi.gz deleted file mode 100644 index 4c8973b..0000000 Binary files a/doc/ionconf.dvi.gz and /dev/null differ diff --git a/doc/ionconf.out b/doc/ionconf.out deleted file mode 100644 index a8fb3c0..0000000 --- a/doc/ionconf.out +++ /dev/null @@ -1,95 +0,0 @@ -\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}{ Sizehint winprops}{section.3.5} -\BOOKMARK [2][-]{subsection.3.5.2}{ Classes, roles and instances}{section.3.5} -\BOOKMARK [2][-]{subsection.3.5.3}{ Finding window identification}{section.3.5} -\BOOKMARK [2][-]{subsection.3.5.4}{ Some common examples}{section.3.5} -\BOOKMARK [1][-]{section.3.6}{ The statusbar}{chapter.3} -\BOOKMARK [2][-]{subsection.3.6.1}{ The template}{section.3.6} -\BOOKMARK [2][-]{subsection.3.6.2}{ The systray}{section.3.6} -\BOOKMARK [2][-]{subsection.3.6.3}{ Monitors}{section.3.6} -\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][-]{subsection.4.3.1}{ Frame user attributes}{section.4.3} -\BOOKMARK [2][-]{subsection.4.3.2}{ Extra fields for style `frame'}{section.4.3} -\BOOKMARK [2][-]{subsection.4.3.3}{ 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.-267}{ 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}{ WHook functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.7}{ WInfoWin functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.8}{ WMPlex functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.9}{ WMoveresMode functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.10}{ WRegion functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.11}{ WRootWin functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.12}{ WScreen functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.13}{ WTimer functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.14}{ WWindow functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.15}{ global functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.16}{ gr functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.17}{ string functions}{section.6.1} -\BOOKMARK [2][-]{subsection.6.1.18}{ 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 mod\137statusbar}{chapter.6} -\BOOKMARK [2][-]{subsection.6.7.1}{ WStatusBar functions}{section.6.7} -\BOOKMARK [1][-]{section.6.8}{ Functions defined in de}{chapter.6} -\BOOKMARK [1][-]{section.6.9}{ Hooks}{chapter.6} -\BOOKMARK [1][-]{section.6.10}{ Miscellaneous}{chapter.6} -\BOOKMARK [2][-]{subsection.6.10.1}{ Size policies}{section.6.10} -\BOOKMARK [0][-]{appendix.A}{ The GNU General Public License}{} -\BOOKMARK [0][-]{appendix.B}{ Full class hierarchy visible to Lua-side}{} -\BOOKMARK [0][-]{section*.19}{Index}{} -\BOOKMARK [0][-]{section*.21}{Bibliography}{} diff --git a/doc/ionconf.ps.gz b/doc/ionconf.ps.gz deleted file mode 100644 index ae751c6..0000000 Binary files a/doc/ionconf.ps.gz and /dev/null differ diff --git a/doc/ionconf.tex b/doc/ionconf.tex deleted file mode 100644 index aa4aaa6..0000000 --- a/doc/ionconf.tex +++ /dev/null @@ -1,78 +0,0 @@ -\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{2007-09-27} - -\makeindex - - -\begin{document} - -\maketitle - -Configuring and extending Ion3 with Lua\\ -Copyright \copyright\ 2003--2007 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 - -\begin{thebibliography}{9} - \bibitem{scripts} The Ion 3 scripts repository, - \url{http://iki.fi/tuomov/repos/ion-scripts-3/}. -\end{thebibliography} - -\end{document} diff --git a/doc/ionconf/WARNINGS b/doc/ionconf/WARNINGS deleted file mode 100644 index 726c0ef..0000000 --- a/doc/ionconf/WARNINGS +++ /dev/null @@ -1,8 +0,0 @@ -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/doc/ionconf/contents.png b/doc/ionconf/contents.png deleted file mode 100644 index 0c752c6..0000000 Binary files a/doc/ionconf/contents.png and /dev/null differ diff --git a/doc/ionconf/images.aux b/doc/ionconf/images.aux deleted file mode 100644 index 3b687b9..0000000 --- a/doc/ionconf/images.aux +++ /dev/null @@ -1,19 +0,0 @@ -\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/doc/ionconf/images.idx b/doc/ionconf/images.idx deleted file mode 100644 index e69de29..0000000 diff --git a/doc/ionconf/images.log b/doc/ionconf/images.log deleted file mode 100644 index 7dcd34b..0000000 --- a/doc/ionconf/images.log +++ /dev/null @@ -1,396 +0,0 @@ -This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=latex 2007.4.8) 27 SEP 2007 19:26 -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_inline1059:7.0626pt::0.0pt::7.1201pt. -[1 - - - -] -l2hSize :tex2html_wrap_inline1063:7.48248pt::0.0pt::48.86426pt. -[2 - - -] -l2hSize :tex2html_wrap_inline2263:8.7125pt::8.7125pt::23.6642pt. -[3 - - -] -l2hSize :tex2html_wrap_inline5540:7.5626pt::7.5626pt::14.53923pt. -[4 - - -] -l2hSize :tex2html_wrap_inline5542:7.5626pt::7.5626pt::14.53923pt. -[5 - - -] -l2hSize :tex2html_wrap_inline7792:8.7125pt::8.7125pt::86.9574pt. -[6 - - -] (./images.aux) ) -Here is how much of TeX's memory you used: - 4467 strings out of 94501 - 63452 string characters out of 1175795 - 123529 words of memory out of 1000000 - 7611 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/doc/ionconf/images.out b/doc/ionconf/images.out deleted file mode 100644 index e69de29..0000000 diff --git a/doc/ionconf/images.pl b/doc/ionconf/images.pl deleted file mode 100644 index d6e7651..0000000 --- a/doc/ionconf/images.pl +++ /dev/null @@ -1,42 +0,0 @@ -# LaTeX2HTML 2002-2-1 (1.71) -# Associate images original text with physical files. - - -$key = q/-1;MSF=1.6;LFS=11;AAT/; -$cached_env_img{$key} = q|$-1$|; - -$key = q/(0,1];MSF=1.6;LFS=11;AAT/; -$cached_env_img{$key} = q|$(0, 1]$|; - -$key = q/N=1{ldots}5;MSF=1.6;LFS=11;AAT/; -$cached_env_img{$key} = q|$N=1{\ldots} 5$|; - -$key = q/-2;MSF=1.6;LFS=11;AAT/; -$cached_env_img{$key} = q|$-2$|; - -$key = q/n;MSF=1.6;LFS=11;AAT/; -$cached_env_img{$key} = q|$n$|; - -$key = q/{t,m,b}times{t,c,b};MSF=1.6;LFS=11;AAT/; -$cached_env_img{$key} = q|$\{t,m,b\}\times\{t,c,b\}$|; - -1; - diff --git a/doc/ionconf/images.tex b/doc/ionconf/images.tex deleted file mode 100644 index ebd32e5..0000000 --- a/doc/ionconf/images.tex +++ /dev/null @@ -1,385 +0,0 @@ -\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{tt} - -% -\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{\codestr}[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{2007-09-27} - - -\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_inline1059}% -$n$% -\lthtmlinlinemathZ -\lthtmlcheckvsize\clearpage} - -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -{\newpage\clearpage -\lthtmlinlinemathA{tex2html_wrap_inline1063}% -$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{subsection} -\stepcounter{subsubsection} -\stepcounter{subsubsection} -\stepcounter{section} -\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} -\stepcounter{subsection} -{\newpage\clearpage -\lthtmlinlinemathA{tex2html_wrap_inline2263}% -$(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} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -\stepcounter{subsection} -{\newpage\clearpage -\lthtmlinlinemathA{tex2html_wrap_inline5540}% -$-1$% -\lthtmlinlinemathZ -\lthtmlcheckvsize\clearpage} - -{\newpage\clearpage -\lthtmlinlinemathA{tex2html_wrap_inline5542}% -$-2$% -\lthtmlinlinemathZ -\lthtmlcheckvsize\clearpage} - -\stepcounter{subsection} -\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_inline7792}% -$\{t,m,b\}\times\{t,c,b\}$% -\lthtmlinlinemathZ -\lthtmlcheckvsize\clearpage} - -\stepcounter{section} -\stepcounter{section} -\stepcounter{subsection} -\stepcounter{section} -\stepcounter{section} -\stepcounter{section} -\stepcounter{subsection} -\appendix -\stepcounter{chapter} -\addtocounter{enumi}{-1} -\stepcounter{chapter} - -% -\providecommand{\fnlisti}[1]{\htmlref{\texttt{#1}}{fn:#1}\\}% - - -\end{document} diff --git a/doc/ionconf/img1.png b/doc/ionconf/img1.png deleted file mode 100644 index ef6ac05..0000000 Binary files a/doc/ionconf/img1.png and /dev/null differ diff --git a/doc/ionconf/img2.png b/doc/ionconf/img2.png deleted file mode 100644 index fbbef0c..0000000 Binary files a/doc/ionconf/img2.png and /dev/null differ diff --git a/doc/ionconf/img3.png b/doc/ionconf/img3.png deleted file mode 100644 index 4f60c17..0000000 Binary files a/doc/ionconf/img3.png and /dev/null differ diff --git a/doc/ionconf/img4.png b/doc/ionconf/img4.png deleted file mode 100644 index 17e520f..0000000 Binary files a/doc/ionconf/img4.png and /dev/null differ diff --git a/doc/ionconf/img5.png b/doc/ionconf/img5.png deleted file mode 100644 index eab0084..0000000 Binary files a/doc/ionconf/img5.png and /dev/null differ diff --git a/doc/ionconf/img6.png b/doc/ionconf/img6.png deleted file mode 100644 index c7c8364..0000000 Binary files a/doc/ionconf/img6.png and /dev/null differ diff --git a/doc/ionconf/index.html b/doc/ionconf/index.html deleted file mode 100644 index 0ea44a0..0000000 --- a/doc/ionconf/index.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - -Configuring and extending Ion3 with Lua - - - - - - - - - - - - - - - - - - - -

-

Configuring and extending Ion3 with Lua

-
- -

Tuomo Valkonen

-

tuomov at iki.fi

-

2007-09-27

-
- -

-Configuring and extending Ion3 with Lua -
-Copyright © 2003-2007 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/doc/ionconf/index.png b/doc/ionconf/index.png deleted file mode 100644 index 698f09c..0000000 Binary files a/doc/ionconf/index.png and /dev/null differ diff --git a/doc/ionconf/internals.pl b/doc/ionconf/internals.pl deleted file mode 100644 index e2b61be..0000000 --- a/doc/ionconf/internals.pl +++ /dev/null @@ -1,1462 +0,0 @@ -# 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:WHook.add/; -$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:ioncore.get_hook/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tabnum.clear/; -$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:WClientWin.quote_next/; -$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: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/sec:sizepolicies/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTimer.set/; -$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:ioncore.submap_enter/; -$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:WTiling.farthest/; -$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:ioncore.goto_prev_screen/; -$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/sec:ioncoreref/; -$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/fn:mod_statusbar.statusbars/; -$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:mod_statusbar.launch_statusd/; -$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:WTimer.reset/; -$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/sec:statusbar/; -$ref_files{$key} = "$dir".q|node4.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:ioncore.create_timer/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTiling.managed_i/; -$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:ioncore.defctxmenu/; -$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:WSplitSplit.tl/; -$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:WMPlex.switch_nth/; -$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: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:WFrame.set_grattr/; -$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/fn:ioncore.tabnum.show/; -$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/fn:mod_statusbar.inform/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_i/; -$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/sec:statusbarref/; -$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/cite_scripts/; -$ref_files{$key} = "$dir".q|node12.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.clientwin_i/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_clear/; -$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:ioncore.unsqueeze/; -$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:WRegion.groupleader_of/; -$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:mod_query.get/; -$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: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:ioncore.getctxmenu/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WSplit.parent/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMoveresMode.rqgeom/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.get_template_table/; -$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:ioncore.region_i/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.is_fullscreen/; -$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:ioncore.get_dir_for/; -$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:WEdln.point/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.defer/; -$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:WGroup.managed_i/; -$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:WMPlex.managed_i/; -$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:WHook.listed/; -$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: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:mod_tiling.untile/; -$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:WSplitSplit.br/; -$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:string.shell_safe/; -$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/region_notify_hook/; -$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/fn:ioncore.focushistory_i/; -$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:ioncore.deflayout/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_attach/; -$ref_files{$key} = "$dir".q|node7.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:WMoveresMode.geom/; -$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:WEdln.paste/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.detach/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/sec:miscref/; -$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/clientwin_property_change_hook/; -$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:WStatusBar.update/; -$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.match_winprop_dflt/; -$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/fn:ioncore.tagged_first/; -$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:mod_statusbar.update/; -$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:mod_statusbar.create/; -$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:WTiling.split_top/; -$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: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.popen_bgread/; -$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:WStatusBar.set_systray/; -$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:WSplit.transpose/; -$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:ioncore.submap_wait/; -$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:WSplitSplit.dir/; -$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:WMPlex.set_stdisp/; -$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:WStatusBar.is_systray/; -$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:WRegion.parent/; -$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:WEdln.back/; -$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: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/fn:WTiling.transpose_at/; -$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:WMPlex.mx_i/; -$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/ioncore_sigchld_hook/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.set_template_table/; -$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:WHook.remove/; -$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.aboutmsg/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/sec:grmisc/; -$ref_files{$key} = "$dir".q|node5.html|; -$noresave{$key} = "$nosave"; - -$key = q/chap:prelim/; -$ref_files{$key} = "$dir".q|node3.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.getlayout/; -$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:WStatusBar.set_template/; -$ref_files{$key} = "$dir".q|node7.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/sec:statusd/; -$ref_files{$key} = "$dir".q|node6.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/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.activity_i/; -$ref_files{$key} = "$dir".q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.set_fullscreen/; -$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:WTimer.is_set/; -$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:WRegion.get_configuration/; -$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:WGroup.set_bottom/; -$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/ioncore_submap_ungrab_hook/; -$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.complete/; -$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/doc/ionconf/ionconf.css b/doc/ionconf/ionconf.css deleted file mode 100644 index 86d99dc..0000000 --- a/doc/ionconf/ionconf.css +++ /dev/null @@ -1,39 +0,0 @@ -/* 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.flushleft { } -DIV.center { } -SPAN.sc { } -DIV.quote { } -PRE.preform { } -SPAN.textit { font-style: italic } -SPAN.arabic { } -SPAN.textbf { font-weight: bold } diff --git a/doc/ionconf/ionconf.html b/doc/ionconf/ionconf.html deleted file mode 100644 index 0ea44a0..0000000 --- a/doc/ionconf/ionconf.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - -Configuring and extending Ion3 with Lua - - - - - - - - - - - - - - - - - - - -

-

Configuring and extending Ion3 with Lua

-
- -

Tuomo Valkonen

-

tuomov at iki.fi

-

2007-09-27

-
- -

-Configuring and extending Ion3 with Lua -
-Copyright © 2003-2007 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/doc/ionconf/labels.pl b/doc/ionconf/labels.pl deleted file mode 100644 index 54a83c4..0000000 --- a/doc/ionconf/labels.pl +++ /dev/null @@ -1,2921 +0,0 @@ -# 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:WHook.add/; -$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:ioncore.get_hook/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tabnum.clear/; -$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:WClientWin.quote_next/; -$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: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/sec:sizepolicies/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTimer.set/; -$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:ioncore.submap_enter/; -$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:WTiling.farthest/; -$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:ioncore.goto_prev_screen/; -$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/sec:ioncoreref/; -$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/fn:mod_statusbar.statusbars/; -$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:mod_statusbar.launch_statusd/; -$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:WTimer.reset/; -$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/sec:statusbar/; -$external_labels{$key} = "$URL/" . q|node4.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:ioncore.create_timer/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTiling.managed_i/; -$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:ioncore.defctxmenu/; -$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:WSplitSplit.tl/; -$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:WMPlex.switch_nth/; -$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: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:WFrame.set_grattr/; -$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/fn:ioncore.tabnum.show/; -$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/fn:mod_statusbar.inform/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_i/; -$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/sec:statusbarref/; -$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/cite_scripts/; -$external_labels{$key} = "$URL/" . q|node12.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.clientwin_i/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_clear/; -$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:ioncore.unsqueeze/; -$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:WRegion.groupleader_of/; -$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:mod_query.get/; -$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: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:ioncore.getctxmenu/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WSplit.parent/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMoveresMode.rqgeom/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.get_template_table/; -$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:ioncore.region_i/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.is_fullscreen/; -$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:ioncore.get_dir_for/; -$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:WEdln.point/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.defer/; -$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:WGroup.managed_i/; -$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:WMPlex.managed_i/; -$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:WHook.listed/; -$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: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:mod_tiling.untile/; -$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:WSplitSplit.br/; -$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:string.shell_safe/; -$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/region_notify_hook/; -$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/fn:ioncore.focushistory_i/; -$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:ioncore.deflayout/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_attach/; -$external_labels{$key} = "$URL/" . q|node7.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:WMoveresMode.geom/; -$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:WEdln.paste/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.detach/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/sec:miscref/; -$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/clientwin_property_change_hook/; -$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:WStatusBar.update/; -$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.match_winprop_dflt/; -$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/fn:ioncore.tagged_first/; -$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:mod_statusbar.update/; -$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:mod_statusbar.create/; -$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:WTiling.split_top/; -$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: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.popen_bgread/; -$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:WStatusBar.set_systray/; -$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:WSplit.transpose/; -$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:ioncore.submap_wait/; -$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:WSplitSplit.dir/; -$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:WMPlex.set_stdisp/; -$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:WStatusBar.is_systray/; -$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:WRegion.parent/; -$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:WEdln.back/; -$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: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/fn:WTiling.transpose_at/; -$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:WMPlex.mx_i/; -$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/ioncore_sigchld_hook/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.set_template_table/; -$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:WHook.remove/; -$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.aboutmsg/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/sec:grmisc/; -$external_labels{$key} = "$URL/" . q|node5.html|; -$noresave{$key} = "$nosave"; - -$key = q/chap:prelim/; -$external_labels{$key} = "$URL/" . q|node3.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.getlayout/; -$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:WStatusBar.set_template/; -$external_labels{$key} = "$URL/" . q|node7.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/sec:statusd/; -$external_labels{$key} = "$URL/" . q|node6.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/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.activity_i/; -$external_labels{$key} = "$URL/" . q|node7.html|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.set_fullscreen/; -$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:WTimer.is_set/; -$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:WRegion.get_configuration/; -$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:WGroup.set_bottom/; -$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/ioncore_submap_ungrab_hook/; -$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.complete/; -$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.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:gr.select_engine/; -$external_latex_labels{$key} = q|6.1.16|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WHook.add/; -$external_latex_labels{$key} = q|6.1.6|; -$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:ioncore.get_hook/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tabnum.clear/; -$external_latex_labels{$key} = q|6.1|; -$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:WClientWin.quote_next/; -$external_latex_labels{$key} = q|6.1.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WEdln.insstr/; -$external_latex_labels{$key} = q|6.3.2|; -$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/sec:sizepolicies/; -$external_latex_labels{$key} = q|6.10.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTimer.set/; -$external_latex_labels{$key} = q|6.1.13|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.goto_activity/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.submap_enter/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.create_ws/; -$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: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.8|; -$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.8|; -$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.9|; -$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:ioncore.goto_prev_screen/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.is_mapped/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/sec:ioncoreref/; -$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/fn:mod_statusbar.statusbars/; -$external_latex_labels{$key} = q|6.7|; -$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.14|; -$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:mod_statusbar.launch_statusd/; -$external_latex_labels{$key} = q|6.7|; -$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.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.defmenu/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTimer.reset/; -$external_latex_labels{$key} = q|6.1.13|; -$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.8|; -$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.12|; -$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.9|; -$noresave{$key} = "$nosave"; - -$key = q/sec:statusbar/; -$external_latex_labels{$key} = q|3.6|; -$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:ioncore.create_timer/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTiling.managed_i/; -$external_latex_labels{$key} = q|6.2.5|; -$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:ioncore.defctxmenu/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_tiling.mkbottom/; -$external_latex_labels{$key} = q|6.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WSplitSplit.tl/; -$external_latex_labels{$key} = q|6.2.4|; -$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:WMPlex.switch_nth/; -$external_latex_labels{$key} = q|6.1.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.set_name_exact/; -$external_latex_labels{$key} = q|6.1.10|; -$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:WFrame.set_grattr/; -$external_latex_labels{$key} = q|6.1.2|; -$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.7|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.snapshot/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tabnum.show/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/region_do_warp_alt/; -$external_latex_labels{$key} = q|6.9|; -$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.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.write_savefile/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_statusbar.inform/; -$external_latex_labels{$key} = q|6.7|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_i/; -$external_latex_labels{$key} = q|6.1|; -$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.14|; -$noresave{$key} = "$nosave"; - -$key = q/sec:statusbarref/; -$external_latex_labels{$key} = q|6.7|; -$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.16|; -$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:ioncore.clientwin_i/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_clear/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.screen_of/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMPlex.switch_next/; -$external_latex_labels{$key} = q|6.1.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.bottom/; -$external_latex_labels{$key} = q|6.1.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.unsqueeze/; -$external_latex_labels{$key} = q|6.1|; -$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.11|; -$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.10|; -$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.9|; -$noresave{$key} = "$nosave"; - -$key = q/chap:tricks/; -$external_latex_labels{$key} = q|5|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.groupleader_of/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.get_savefile/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.lookup_clientwin/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_query.get/; -$external_latex_labels{$key} = q|6.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_query.history_push/; -$external_latex_labels{$key} = q|6.3|; -$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:ioncore.getctxmenu/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WSplit.parent/; -$external_latex_labels{$key} = q|6.2.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMoveresMode.rqgeom/; -$external_latex_labels{$key} = q|6.1.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.get_template_table/; -$external_latex_labels{$key} = q|6.7.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WFrame.maximize_horiz/; -$external_latex_labels{$key} = q|6.1.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.region_i/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.is_fullscreen/; -$external_latex_labels{$key} = q|6.1.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WWindow.p_move/; -$external_latex_labels{$key} = q|6.1.14|; -$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.12|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.get_dir_for/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_query.set/; -$external_latex_labels{$key} = q|6.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WEdln.point/; -$external_latex_labels{$key} = q|6.3.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.defer/; -$external_latex_labels{$key} = q|6.1|; -$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:WGroup.managed_i/; -$external_latex_labels{$key} = q|6.1.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.18|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WSplit.rqgeom/; -$external_latex_labels{$key} = q|6.2.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMPlex.managed_i/; -$external_latex_labels{$key} = q|6.1.8|; -$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.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMPlex.mx_count/; -$external_latex_labels{$key} = q|6.1.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMPlex.attach/; -$external_latex_labels{$key} = q|6.1.8|; -$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.9|; -$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:WHook.listed/; -$external_latex_labels{$key} = q|6.1.6|; -$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.8|; -$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.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.set_activity/; -$external_latex_labels{$key} = q|6.1.10|; -$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:WMPlex.mx_current/; -$external_latex_labels{$key} = q|6.1.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_query.message/; -$external_latex_labels{$key} = q|6.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_tiling.untile/; -$external_latex_labels{$key} = q|6.2|; -$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.8|; -$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:WSplitSplit.br/; -$external_latex_labels{$key} = q|6.2.4|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_query.query_restart/; -$external_latex_labels{$key} = q|6.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:string.shell_safe/; -$external_latex_labels{$key} = q|6.1.17|; -$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.8|; -$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.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.rqclose_propagate/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/region_notify_hook/; -$external_latex_labels{$key} = q|6.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WEdln.clear_mark/; -$external_latex_labels{$key} = q|6.3.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.focushistory_i/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/tiling_placement_alt/; -$external_latex_labels{$key} = q|6.9|; -$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.10|; -$noresave{$key} = "$nosave"; - -$key = q/sec:classesrolesinstances/; -$external_latex_labels{$key} = q|3.5.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.deflayout/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.tagged_attach/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.is_tagged/; -$external_latex_labels{$key} = q|6.1.10|; -$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.8|; -$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:WMoveresMode.geom/; -$external_latex_labels{$key} = q|6.1.9|; -$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.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WEdln.paste/; -$external_latex_labels{$key} = q|6.3.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.detach/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/sec:miscref/; -$external_latex_labels{$key} = q|6.10|; -$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.10|; -$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/clientwin_property_change_hook/; -$external_latex_labels{$key} = q|6.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:table.append/; -$external_latex_labels{$key} = q|6.1.18|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.mclick/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.update/; -$external_latex_labels{$key} = q|6.7.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMPlex.set_index/; -$external_latex_labels{$key} = q|6.1.8|; -$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.9|; -$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.9|; -$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.match_winprop_dflt/; -$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/fn:ioncore.tagged_first/; -$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:mod_statusbar.update/; -$external_latex_labels{$key} = q|6.7|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMoveresMode.cancel/; -$external_latex_labels{$key} = q|6.1.9|; -$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.10|; -$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.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:mod_statusbar.create/; -$external_latex_labels{$key} = q|6.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/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.popen_bgread/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.defwinprop/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.set_systray/; -$external_latex_labels{$key} = q|6.7.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.mdrag/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WSplit.transpose/; -$external_latex_labels{$key} = q|6.2.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WClientWin.kill/; -$external_latex_labels{$key} = q|6.1.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.submap_wait/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/ioncore_snapshot_hook/; -$external_latex_labels{$key} = q|6.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WSplitSplit.dir/; -$external_latex_labels{$key} = q|6.2.4|; -$noresave{$key} = "$nosave"; - -$key = q/fn:table.map/; -$external_latex_labels{$key} = q|6.1.18|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMPlex.set_stdisp/; -$external_latex_labels{$key} = q|6.1.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WFrame.set_shaded/; -$external_latex_labels{$key} = q|6.1.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.is_systray/; -$external_latex_labels{$key} = q|6.7.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.manager/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.x_change_property/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.parent/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WInput.cancel/; -$external_latex_labels{$key} = q|6.3.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WEdln.back/; -$external_latex_labels{$key} = q|6.3.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMenu.finish/; -$external_latex_labels{$key} = q|6.4.1|; -$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.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.kpress_wait/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WTiling.transpose_at/; -$external_latex_labels{$key} = q|6.2.5|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.rootwin_of/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WMPlex.mx_i/; -$external_latex_labels{$key} = q|6.1.8|; -$noresave{$key} = "$nosave"; - -$key = q/clientwin_do_manage_alt/; -$external_latex_labels{$key} = q|6.9|; -$noresave{$key} = "$nosave"; - -$key = q/ioncore_sigchld_hook/; -$external_latex_labels{$key} = q|6.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.set_template_table/; -$external_latex_labels{$key} = q|6.7.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.8|; -$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.16|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.rqorder/; -$external_latex_labels{$key} = q|6.1.10|; -$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.10|; -$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:WHook.remove/; -$external_latex_labels{$key} = q|6.1.6|; -$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.10|; -$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.aboutmsg/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/sec:grmisc/; -$external_latex_labels{$key} = q|4.3|; -$noresave{$key} = "$nosave"; - -$key = q/chap:prelim/; -$external_latex_labels{$key} = q|2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:ioncore.getlayout/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fig:parentship/; -$external_latex_labels{$key} = q|2.2|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WStatusBar.set_template/; -$external_latex_labels{$key} = q|6.7.1|; -$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.10|; -$noresave{$key} = "$nosave"; - -$key = q/sec:statusd/; -$external_latex_labels{$key} = q|5.4|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.rqgeom/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WInput.scrolldown/; -$external_latex_labels{$key} = q|6.3.3|; -$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.activity_i/; -$external_latex_labels{$key} = q|6.1|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.set_fullscreen/; -$external_latex_labels{$key} = q|6.1.3|; -$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:WTimer.is_set/; -$external_latex_labels{$key} = q|6.1.13|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.set_name/; -$external_latex_labels{$key} = q|6.1.10|; -$noresave{$key} = "$nosave"; - -$key = q/fn:table.join/; -$external_latex_labels{$key} = q|6.1.18|; -$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.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WRegion.get_configuration/; -$external_latex_labels{$key} = q|6.1.10|; -$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:WGroup.set_bottom/; -$external_latex_labels{$key} = q|6.1.3|; -$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.15|; -$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.8|; -$noresave{$key} = "$nosave"; - -$key = q/ioncore_post_layout_setup_hook/; -$external_latex_labels{$key} = q|6.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:table.icat/; -$external_latex_labels{$key} = q|6.1.18|; -$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.8|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WEdln.skip_word/; -$external_latex_labels{$key} = q|6.3.2|; -$noresave{$key} = "$nosave"; - -$key = q/ioncore_submap_ungrab_hook/; -$external_latex_labels{$key} = q|6.9|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WGroup.attach_new/; -$external_latex_labels{$key} = q|6.1.3|; -$noresave{$key} = "$nosave"; - -$key = q/fn:WEdln.complete/; -$external_latex_labels{$key} = q|6.3.2|; -$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/doc/ionconf/next.png b/doc/ionconf/next.png deleted file mode 100644 index 1628652..0000000 Binary files a/doc/ionconf/next.png and /dev/null differ diff --git a/doc/ionconf/next_g.png b/doc/ionconf/next_g.png deleted file mode 100644 index 9d3f591..0000000 Binary files a/doc/ionconf/next_g.png and /dev/null differ diff --git a/doc/ionconf/node1.html b/doc/ionconf/node1.html deleted file mode 100644 index 8027def..0000000 --- a/doc/ionconf/node1.html +++ /dev/null @@ -1,308 +0,0 @@ - - - - - -Contents - - - - - - - - - - - - - - - - - - - - - -
- -

-Contents -

- - - - -

- -

-


- - - diff --git a/doc/ionconf/node10.html b/doc/ionconf/node10.html deleted file mode 100644 index d15711c..0000000 --- a/doc/ionconf/node10.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - - -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_i -
ioncore.bdoc -
ioncore.chdir_for -
ioncore.clientwin_i -
ioncore.compile_cmd -
ioncore.create_timer -
ioncore.create_ws -
ioncore.current -
ioncore.defbindings -
ioncore.defctxmenu -
ioncore.defer -
ioncore.deflayout -
ioncore.defmenu -
ioncore.defshortening -
ioncore.defwinprop -
ioncore.detach -
ioncore.exec -
ioncore.exec_on -
ioncore.find_manager -
ioncore.find_screen_id -
ioncore.focushistory_i -
ioncore.get -
ioncore.getbindings -
ioncore.getctxmenu -
ioncore.get_dir_for -
ioncore.get_hook -
ioncore.getlayout -
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_dflt -
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_i -
ioncore.request_selection -
ioncore.resign -
ioncore.restart -
ioncore.restart_other -
ioncore.set -
ioncore.set_paths -
ioncore.set_selection -
ioncore.shutdown -
ioncore.snapshot -
ioncore.submap -
ioncore.submap_enter -
ioncore.submap_wait -
ioncore.submenu -
ioncore.tabnum.clear -
ioncore.tabnum.show -
ioncore.tagged_attach -
ioncore.tagged_clear -
ioncore.tagged_first -
ioncore.tagged_i -
ioncore.TR -
ioncore.unsqueeze -
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_statusbar.create -
mod_statusbar.inform -
mod_statusbar.launch_statusd -
mod_statusbar.statusbars -
mod_statusbar.update -
mod_tiling.get -
mod_tiling.mkbottom -
mod_tiling.set -
mod_tiling.untile -
string.shell_safe -
table.append -
table.copy -
table.icat -
table.join -
table.map -
WClientWin.get_ident -
WClientWin.kill -
WClientWin.nudge -
WClientWin.quote_next -
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_grattr -
WFrame.set_mode -
WFrame.set_shaded -
WGroup.attach -
WGroup.attach_new -
WGroup.bottom -
WGroup.is_fullscreen -
WGroup.managed_i -
WGroup.set_bottom -
WGroup.set_fullscreen -
WGroupWS.attach_framed -
WHook.add -
WHook.listed -
WHook.remove -
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.geom -
WMoveresMode.move -
WMoveresMode.resize -
WMoveresMode.rqgeom -
WMPlex.attach -
WMPlex.attach_new -
WMPlex.dec_index -
WMPlex.get_index -
WMPlex.get_stdisp -
WMPlex.inc_index -
WMPlex.is_hidden -
WMPlex.managed_i -
WMPlex.mx_count -
WMPlex.mx_current -
WMPlex.mx_i -
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.get_configuration -
WRegion.goto -
WRegion.groupleader_of -
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 -
WStatusBar.get_template_table -
WStatusBar.is_systray -
WStatusBar.set_systray -
WStatusBar.set_template -
WStatusBar.set_template_table -
WStatusBar.update -
WTiling.farthest -
WTiling.flip_at -
WTiling.managed_i -
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 -
WTimer.is_set -
WTimer.reset -
WTimer.set -
WWindow.p_move -
WWindow.p_resize -
WWindow.xid -
-

- - - - diff --git a/doc/ionconf/node11.html b/doc/ionconf/node11.html deleted file mode 100644 index edf9325..0000000 --- a/doc/ionconf/node11.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - -Index - - - - - - - - - - - - - - - - - - - - - -
- -

-Index -


-
acrobatic - : 3.5 -
Alt - : 3.3.5 -
AnyModifier - : 3.3.5 -
resizeinc - : 3.5.1 - | 3.5.1 -
Button-n - : 3.3.6 -
class
-
winprop : 3.5.2 -
-
clientwin_do_manage_alt - : 6.9 -
clientwin_mapped_hook - : 6.9 -
clientwin_property_change_hook - : 6.9 -
clientwin_unmapped_hook - : 6.9 -
Control - : 3.3.5 -
defmenu - : 3.4.1 -
drawing engine - : 4.1 -
ETCDIR - : 3.1 -
float - : 3.5 -
frame_managed_changed_hook - : 6.9 -
fullscreen - : 3.5 -
ignore_resizeinc - : 3.5.1 - | 3.5.1 -
ignore_cfgrq - : 3.5 -
ignore_max_size - : 3.5.1 -
ignore_min_size - : 3.5.1 -
ignore_net_active_window - : 3.5 -
instance
-
winprop : 3.5.2 -
-
ioncore_deinit_hook - : 6.9 -
ioncore_post_layout_setup_hook - : 6.9 -
ioncore_sigchld_hook - : 6.9 -
ioncore_snapshot_hook - : 6.9 -
ioncore_submap_ungrab_hook - : 6.9 -
is_dockapp
-
winprop : 3.5.2 -
-
is_transient
-
winprop : 3.5.2 -
-
jumpto - : 3.5 -
keysymdef.h - : 3.3.5 -
Lock - : 3.3.5 -
manager - : 2.2.2.1 -
max_size - : 3.5.1 -
menuentry - : 3.4.1 -
menus - : 3.4.1 -
min_size - : 3.5.1 -
ModN - : 3.3.5 -
name
-
winprop : 3.5.2 -
-
new_group - : 3.5 -
NumLock - : 3.3.5 -
Obj - : 2.2.1 -
oneshot - : 3.5 -
orientation - : 3.5 -
parent - : 2.2.2.1 -
PREFIX - : 3.1 -
region_do_warp_alt - : 6.9 -
region_notify_hook - : 6.9 -
role
-
winprop : 3.5.2 -
-
root window - : 2.2.1 -
screen
-
physical : 2.2.1 -
X : 2.2.1 -
-
screen_managed_changed_hook - : 6.9 -
ScrollLock - : 3.3.5 -
Shift - : 3.3.5 -
statusbar - : 3.5 -
style - : 4.1 -
submenu - : 3.4.1 -
substyle - : 4.1 -
switchto - : 3.5 -
system.mk - : 3.1 -
target - : 3.5 -
tiling_placement_alt - : 6.9 -
transient - : 3.5.3 -
transient_mode - : 3.5 -
transparent - : 3.5 -
userpos - : 3.5.1 -
WClientWin - : 2.2.1 -
WEdln - : 2.2.1 -
WFrame - : 2.2.1 -
WGroup - : 2.2.1 -
WGroupCW - : 2.2.1 -
WGroupWS - : 2.2.1 -
Winprops - : 3.5 -
WInput - : 2.2.1 -
WMessage - : 2.2.1 -
WRegion - : 2.2.1 -
WRootWin - : 2.2.1 -
WScreen - : 2.2.1 -
WSplit - : 2.2.1 -
WTiling - : 2.2.1 -
WWindow - : 2.2.1 -
Xinerama - : 2.2.1 -
xmodmap - : 3.3.5 -
xprop - : 3.5.3 - -
- -

-


- - - diff --git a/doc/ionconf/node12.html b/doc/ionconf/node12.html deleted file mode 100644 index a2daa50..0000000 --- a/doc/ionconf/node12.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -Bibliography - - - - - - - - - - - - - - - - - - - - - - -

-Bibliography -

1 -
The Ion 3 scripts repository, - http://iki.fi/tuomov/repos/ion-scripts-3/. -
- -

-


- - - diff --git a/doc/ionconf/node13.html b/doc/ionconf/node13.html deleted file mode 100644 index 907b1b9..0000000 --- a/doc/ionconf/node13.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -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 2007-09-27 -


- - - diff --git a/doc/ionconf/node2.html b/doc/ionconf/node2.html deleted file mode 100644 index a824fd2..0000000 --- a/doc/ionconf/node2.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - -1. Introduction - - - - - - - - - - - - - - - - - - - - - - -

-1. Introduction -

- -

-This document is an ``advanced user'' manual for the X11 window manager -Ion, version 3. It is an attempt at documenting things that go into 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 might first want to first glance at some -Lua documentation at - -

-

- -

-although this should not be strictly necessary for basic modifications -of configuration files for anyone with at least some familiarity with -programming languages. - -

-Back in this document, first in chapter 2 some key -concepts and relations are explained. These include the module system, -and Ion's object (or ``region'') and class hierarchies. While it may -not be necessary to study the latter for basic copy-paste modifications -of configuration files - for that you should not really need this -manual either - it is, however, essential to for more extensive -customisation, due to the semi-object-oriented nature of most of -Ion's scripting interface. Knowing the different object types also -helps dealing with the different binding ``contexts'' (see -Section 3.3) that to some extent mirror these classes. - -

-The new user, fed up with the default key bindings and eager to -just quickly configure Ion to his liking, may therefore just want -to skip to Chapter 3, and attempt to work from therefore. -That chapter provides the very basic Ion configuration know-how -is provided: all the different configuration files and their locations -are explained, instructions are given to allow the reader to -configure bindings and so-called ``winprops'', and the statusbar -templates are also explained. - -

-Next, Chapter 4 explains the notion of drawing engines -and graphical styles and how to write new looks for Ion. More advanced -aspects of Ion's scripting interface are documented in Chapter -5. -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 an alphabetical -listing of all these functions may be found. - -

- -

- - - - diff --git a/doc/ionconf/node3.html b/doc/ionconf/node3.html deleted file mode 100644 index cfe57dd..0000000 --- a/doc/ionconf/node3.html +++ /dev/null @@ -1,537 +0,0 @@ - - - - - -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 dock-apps. - 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_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. -The stock configuration for the pwm3 executable (which differs -from the ion3 executable in a few configuration details) -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 hierarchy 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
-     |    |    |-->WMPlex
-     |    |    |    |-->WFrame
-     |    |    |    |-->WScreen
-     |    |    |         |-->WRootWin
-     |    |    |-->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). - -

-

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

-

-
WScreen
-
is an instance of WMPlex - for screens. - -

-

-
WRootWin
-
is the class for - root windows of X screens. - It is an instance of WScreen. - 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 ugly hacks such as - Xinerama are used. (Actually there can be only - one root window when Xinerama is used.) - -

-

-
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
-          |    |    |-->WFrames
-          |    |    |    |-->WGroupCWs (with contents as above)
-          |    |    |-->possibly a WStatusBar or WDock
-          |    |-->WFrames for floating content
-          |    |-->possibly a WEdln, WMessage or WMenu
-          |    |-->possibly a WStatusBar or WDock (if no tiling)
-          |-->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/doc/ionconf/node4.html b/doc/ionconf/node4.html deleted file mode 100644 index 3980bc4..0000000 --- a/doc/ionconf/node4.html +++ /dev/null @@ -1,1568 +0,0 @@ - - - - - -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 cfg_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. Finally, the statusbar is explained in 3.6. -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. For sake of maintainability -of your customised configuration, it is recommended against copying all of -the files there. Only copy those files you actually need to modify. Most -simple customisations, such as changes in a few bindings, are best done -entirely within cfg_ion.lua. - -

-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. Configuration files can also be compiled into .lc files, -and these are attempted by the configuration file search routines before -.lua files. - -

-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_layouts.luaSome workspace layouts are defined here.
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 done 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. Note that these two are Lua -variables used in the configuration files only, and not Ion settings. -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. - -

-There are some other options as well; see the documentation -for ioncore.set for details. - -

-As a next step, in the actual cfg_ion.lua file, we load -cfg_defaults.lua. However, it is merely a convenience file for -doing exactly what we will going through below, and what is commented -out in the actual file. If you do not want to load what -cfg_defaults.lua loads, just comment out the corresponding -line, and uncomment the lines for the files that you want: - -

-

---dopath("cfg_defaults")
-dopath("cfg_ioncore")
-dopath("cfg_kludges")
-dopath("cfg_layouts")
-
- -

-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 collected 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. -Finally, cfg_layouts.lua defines some workspace layouts, available -through the F9 workspace creation query. - -

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

-

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

- -

- -
-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 $n$:th workspaces is bound to Mod1+n while the switch to -$n$: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 following -special variables are available in this code. - -

- - - - - - - - - - - - - -
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 _. This should seldom be needed.
- -

-For example, supposing _ (underscore) 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: - -

-Mouse actions: - - - -

-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 submap_enter handler is called when the submap -is entered, in which this handler is defined. Likewise, the -submap_wait handler is called when all modifiers -have been released while waiting for further key presses 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 ($N=1{\ldots} 5$) -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
`windowlist'List of all client windows. Activating an entry jumps to that window.
`workspacelist'List of all workspaces. Activating an entry jumps to that workspaces.
`focuslist'List of client windows with recent activity in them, followed by - previously focused client windows.
`focuslist_'List of previously focused client windows.
`stylemenu'List of available look_*.lua style files. Activating an entry - loads that style and ask to save the selection.
`ctxmenu'Context 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.
- -

-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:
-
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:
-
jumpto (boolean) - -
-
Description:
-
- Should a newly created client window always be made - active, even if the allocated frame isn't. - -
-
- -

- -

-
Winprop:
-
new_group (string) - -
-
Description:
-
- If the region specified by target winprop does not exist - (or that winprop is not set), create a new workspace using the - previously stored layout (see ioncore.deflayout) named by - this property. After creating the workspace, target is - attempted to be found again. (If that still fails, the newly - created workspace is still asked to manage the client window.) - -
-
- -

- -

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

- -

-
Winprop:
-
orientation (string) - -
-
Description:
-
- The orientation of the window: one of `vertical' or - `horizontal'. This is only useful when using the - window as a status display. - -
-
- -

- -

-
Winprop:
-
statusbar (string) - -
-
Description:
-
- Put the window in the statusbar, in the named tray component, - (The default tray component is called simply `systray', - and others you give names to in your custom template, always - prefixed by `systray_'. - -
-
- -

- -

-
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. See also new_group. - -
-
- -

- -

-
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:
-
transparent (boolean) - -
-
Description:
-
- Should frames be made transparent when this window is selected? -
- -
-
- -

- -

-3.5.1 Sizehint winprops -

- -

-Additionally, the winprops -max_size, -min_size, -aspect, -resizeinc, -and -ignore_max_size, -ignore_min_size, -ignore_aspect, -ignore_resizeinc, -may be used to override application-supplied size hints. The four -first ones are tables with the fields w and h, indicating -the width and height size hints in pixels, and the latter ignore -winprop is a boolean. - -

-Finally, the boolean -userpos option may be used to -override the USPosition flag of the size hints. Normally, -when this flag is set, Ion tries to respect the supplied window -position more than when it is not set. Obviously, this makes sense -only for floating windows. - -

- -

- -
-3.5.2 Classes, roles and instances -

- -

-The identification information supported are -class, -role, -instance, -name, -is_transient, and -is_dockapp. -It is not necessary to specify all of these fields. -The first three are strings, and must exactly match the -corresponding information obtained from the window's properties. -The name field is a Lua-style regular expression matched against -the window's title. The is_transient field is a boolean that can -be used to include or exclude transients only, while the is_dockapp -field is set by Ion for the dock windows of Window Maker dockapp protocol -dockapps. Usually this is the only information available for these -icon windows. - -

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

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
classroleinstanceother
EEEE
EEE*
EE*E
EE**
E*EE
E*E*
E**E
   etc.
-
- -

-If there are multiple matching winprops with the same -class, role and instance, but other information -different, the most recently defined one is used. - -

- -

-3.5.3 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 -simultaneously 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.3 -

-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 program's -windows, for example. Some other programs only set this information -after the window has been mapped, i.e. the window manager has been -told to start managing it, which is obviously too late. -Gtk applications in particular are often guilty on both counts. - -

- -

-3.5.4 Some common examples -

- -

- -

-3.5.4.1 Acrobat Reader -

- -

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

-

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

- -

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

- -

- -
-3.6 The statusbar -

- -

-The mod_statusbar module provides a statusbar that adapts to -layouts of tilings, using only the minimal space needed. Ion only -supports one adaptive ``status display'' object per screen, so this -statusbar is mutually exclusive with the embedded mode of mod_dock -docks. - -

-The statusbar is configured in cfg_statusbar.lua. Typically, -the configuration consists of two steps: creating a statusbar with -mod_statusbar.create, and then launching the separate -ion-statusd status daemon process with -mod_statusbar.launch_statusd. This latter phase is done -automatically, if it was not done by the configuration file, but -the configuration file may pass extra parameters to ion-statusd -monitors. (See Section 5.4 for more information on -writing ion-statusd monitors.) - -

-A typical cfg_statusbar.lua configuration might look as follows: - -

-

--- Create a statusbar
-mod_statusbar.create{
-    screen = 0,     -- First screen, 
-    pos = 'bl',     -- bottom left corner
-    systray = true, -- Swallow systray windows
-
-    -- The template
-    template = "[ %date || load:% %>load || mail:% %>mail_new/%>mail_total ]"
-               .. " %filler%systray",
-}
-
--- Launch ion-statusd. 
-mod_statusbar.launch_statusd{
-    -- Date meter
-    date={
-        -- ISO-8601 date format with additional abbreviated day name
-        date_format='%a %Y-%m-%d %H:%M',
-    },      
-}
-
- -

- -

-3.6.1 The template -

- -

-The template specifies what is shown on the statusbar; for information -on the other options to mod_statusbar.create, see the reference. -Strings of the form `%spec' tokens specially interpreter by -the statusbar; the rest appears verbatim. The spec typically -consists of the name of the value/meter to display (beginning with a latin -alphabet), but may be preceded by an alignment specifier and a number -specifying the minimum width. The alignment specifiers are: `>' -for right, `<' for left, and `|' for centring. Additionally, -space following `%' (that is, the string `% '), adds -``stretchable space'' at that point. The special string `%filler' -may be used to flush the rest of the template to the right end of -the statusbar. - -

-The stretchable space works as follows: mod_statusbar remembers -the widest string (in terms of graphical presentation) that it has -seen for each meter, unless the width has been otherwise constrained. -If there is stretchable space in the template, it tries to make the -meter always take this much space, by stretching any space found in -the direction indicated by the alignment specifier: the opposite -direction for left or right alignment, and both for centring. - -

- -

-3.6.2 The systray -

- -

-The special `%systray' and `%systray_*' -(`*' varying) monitors indicate where to place system tray -windows. There may be multiple of these. KDE-protocol system tray -icons are placed in `%systray' automatically, unless disabled -with the systray option. Otherwise the statusbar winprop may -be used to place any window in any particular `%systray_*'. - -

- -

-3.6.3 Monitors -

- -

-The part before the first -underscore of each monitor name, describes the script/plugin/module -that provides the meter, and any configuration should be passed -in the a corresponding sub-table mod_statusbar.launch_statusd. -Ion comes with date, load and mail (for plain old mbox) -ion-statusd monitor scripts. More may be obtained from -the scripts repository [1]. These included scripts -provide the following monitors and their options - -

- -

-3.6.3.1 Date -

- -

-Options: date_format: The date format in as seen above, -in the usual strftime format. formats: table of -formats for additional date monitors, the key being the name -of the monitor (without the `date_' prefix). - -

-Monitors: `date' and other user-specified ones with the -`date_' prefix. - -

- -

-3.6.3.2 Load -

- -

-Options: update_interval: Update interval in milliseconds -(default 10s). important_threshold: Threshold above which -the load is marked as important (default 1.5), so that the -drawing engine may be suitably hinted. critical_threshold: -Threshold above which the load is marked as critical (default 4.0). - -

-Monitors: `load' (for all three values), -`load_1min', `load_5min' and `load_15min'. - -

- -

-3.6.3.3 Mail -

- -

-Options: update_interval: Update interval in milliseconds -(default 1min). mbox: mbox-format mailbox location -(default $MAIL). -files: list of additional mailboxes, the key giving the -name of the monitor. - -

-Monitors: `mail_new', `mail_unread', -`mail_total', and corresponding -`mail_*_new', `mail_*_unread', and `mail_*_total' -for the additional mailboxes (`*' varying). - -

- -

-


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. - -
-
... window.3.3
-
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/doc/ionconf/node5.html b/doc/ionconf/node5.html deleted file mode 100644 index 2db991c..0000000 --- a/doc/ionconf/node5.html +++ /dev/null @@ -1,764 +0,0 @@ - - - - - -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. Some additional settings and -user attributes are explained in Sections 4.3. - -

- -

- -
-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
-*
-
- -

-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
`frame'Style for frames. - Substyle attributes: `active'/`inactive' - (mutually exclusive) and - `quasiactive'/`not_quasiactive'. - A frame is ``quasiactive'' when an active region - has a back-link to it, such as a detached window.
`frame-tiled'A more specific style for tiled frames. - Substyle attributes as for `frame'.
`frame-tiled-alt'An alternative style for tiled frames. - Often used to disable the tab-bar.
`frame-floating'A more specific style for floating - frames.
`frame-transient'A more specific style for frames - containing transient windows.
- -

- -

-4.1.1.2 Tabs and menu entries -

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Style nameDescription
`tab'Style for frames' tabs and menu entries. - Substyle attributes: - `active'/`inactive' and - `selected'/`unselected'
`tab-frame'A more specific style for frames' tabs. - Additional substyle attributes include: - `tagged'/`not_tagged', - `dragged'/`not_dragged', - `activity'/`no_activity', - `quasiactive'/`not_quasiactive'.
`tab-frame-tiled', 
`tab-frame-tiled-alt', 
`tab-frame-floating', 
`tab-frame-transient'More specific styles for frames in the - different modes.
`tab-menuentry'A more specific style for entries in WMenus. - Additional substyle attributes include `submenu' and - occasionally also `activity' is used.
`tab-menuentry-bigmenu'An alternate style for entries in WMenus.
- -

- -

-4.1.1.3 The rest -

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Style nameDescription
`input'A style for WInputs.
`input-edln'A more specific style for WEdlns. - Substyle attributes: `selection' for selected text and - `cursor' for the cursor indicating current editing point.
`input-message'A more specific style for WMessages.
`input-menu'A more specific style for WMenus.
`input-menu-bigmenu'An alternate style for WMenus.
`moveres_display'The box displaying position/size when - moving or resizing frames.
`stdisp'Any status display.
`stdisp-dock'The dock.
`stdisp-statusbar'The statusbar. Substyles include: - the name of any monitor/meter (such as `date'), and - the supplied hint. Typical hints are: `normal', - `important', and `critical'.
- -

- -

- -
-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 style file 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 ``shadow'' 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.
border_sidesA string indicating which sides of the border - to draw: `all'/`tb'/`lr' for all, - top and bottom, and left and right. To control between - left/right and top/bottom, use the pixel options below.
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 -

- -

- -

-4.3.1 Frame user attributes -

- -

-The function WFrame.set_grattr may be used to give frames -(and their tabs) arbitrary extra attributes to be passed to the -drawing engine. Hence, by configuring such substyles in the style -configuration files, and turning on the attribute when needed, -scripts may display visual cues related to the frame. There is -also one extra attribute specially interpreted by the default -drawing engine: the `numbered' attribute, which causes -numbers to be displayed on the tabs. - -

- -

-4.3.2 Extra fields for style `frame' -

- -

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

- - - - - - - - - - - - - -
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 $(0, 1]$.
- -

- -

-4.3.3 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/doc/ionconf/node6.html b/doc/ionconf/node6.html deleted file mode 100644 index 7baa979..0000000 --- a/doc/ionconf/node6.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - -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 explained 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 successfully. 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 (successful) 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.9. - -

-Note that many of the hooks are called in ``protected mode'' and can not -use any functions that modify Ion's internal state. - -

- -

-5.2 Referring to regions -

- -

- -

-5.2.1 Direct object references -

- -

-All Ion objects are passed to Lua scripts 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 initialisation 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/doc/ionconf/node7.html b/doc/ionconf/node7.html deleted file mode 100644 index 4a3e772..0000000 --- a/doc/ionconf/node7.html +++ /dev/null @@ -1,6392 +0,0 @@ - - - - - -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:
-
WTimer ioncore.create_timer() - -
-
Description:
-
Create a new timer. - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.create_ws(scr, tmpl, layout) - -
-
Description:
-
Create new workspace on screen scr. The table tmpl - may be used to override parts of the layout named with layout. - If no layout is given, "default" is used. - -
-
- -

- -

-
-
-
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.deflayout(name, tab) - -
-
Description:
-
Define a new workspace layout with name name, and - attach/creation parameters given in tab. The layout - "empty" may not be defined. - -
-
- -

- -

-
-
-
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.getlayout(name, all) - -
-
Description:
-
Get named layout (or all of the latter parameter is set, - but this is for internal use only). - -
-
- -

- -

-
-
-
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:
-
Returns first region on activity list. - -
-
- -

- -

-
-
-
Synopsis:
-
bool ioncore.activity_i(function iterfn) - -
-
Description:
-
Iterate over activity list until iterfn returns false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
Synopsis:
-
bool ioncore.clientwin_i(function fn) - -
-
Description:
-
Iterate over client windows until iterfn returns false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
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:
-
bool ioncore.detach(WRegion reg, string how) - -
-
Description:
-
Detach or reattach reg, depending on whether how - is `set', `unset' or `toggle'. (Detaching - means making reg managed by its nearest ancestor WGroup, - framed if reg is not itself WFrame. Reattaching means - making it managed where it used to be managed, if a return-placeholder - exists.) - If reg is the `bottom' of some group, the whole group is - detached. If reg is a WWindow, it is put into a - frame. - -
-
- -

- -

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

- -

-
-
-
Synopsis:
-
bool ioncore.focushistory_i(function iterfn) - -
-
Description:
-
Iterate over focus history until iterfn returns false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
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 (the fields userdir, - sessiondir, searchpath in the returned table). - -
-
- -

- -

-
-
-
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. - 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. - 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. - 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', or `any'). The table param - may contain the boolean field nowrap, instructing not to wrap - around, and the WRegions no_ascend and no_descend, - and boolean functions ascend_filter and descend_filter - on WRegion pairs (to, from), are used to decide when - to descend or ascend into another region. - -
-
- -

- -

-
-
-
Synopsis:
-
integer ioncore.popen_bgread(string cmd, function h, function errh) - -
-
Description:
-
Run cmd with a read pipe connected to its stdout and stderr. - When data is received through one of these pipes, h or errh - is called with that data. When the pipe is closed, the handler is called - with nil argument. The PID of the new process is returned, or - -1 on error. - -
-
- -

- -

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

- -

-
-
-
Synopsis:
-
bool ioncore.region_i(function fn, string typenam) - -
-
Description:
-
Iterate over all non-client window regions with (inherited) class - typenam until iterfn returns false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
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), - or `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'.
mousefocus(string) Mouse focus mode: - `disable' or `sloppy'.
unsqueeze(boolean) Auto-unsqueeze transients/menus/queries/etc.
autoraise(boolean) Autoraise regions in groups on goto.
- -

-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:
-
bool ioncore.set_paths(table tab) - -
-
Description:
-
Set important directories (the fields sessiondir, searchpath - of tab). - -
-
- -

- -

-
-
-
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:
-
void ioncore.tagged_clear() - -
-
Description:
-
Untag all regions. - -
-
- -

- -

-
-
-
Synopsis:
-
WRegion ioncore.tagged_first(bool untag) - -
-
Description:
-
Returns first tagged object, untagging it as well if untag is set. - -
-
- -

- -

-
-
-
Synopsis:
-
bool ioncore.tagged_i(function iterfn) - -
-
Description:
-
Iterate over tagged regions until iterfn returns false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
Synopsis:
-
void ioncore.unsqueeze(WRegion reg, bool override) - -
-
Description:
-
Try to detach reg if it fits poorly in its - current location. This function does not do anything, - unless override is set or the unsqueeze option - of ioncore.set is set. - -
-
- -

- -

-
-
-
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. 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 cmd. - The guard controls when the binding can be called. - For more informationp see Section 3.3. - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.kpress_wait(keyspec, cmd, guard) - -
-
Description:
-
This is similar to ioncore.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:
-
bool ioncore.defer(function fn) - -
-
Description:
-
Defer execution of fn until the main loop. - -
-
- -

- -

-
-
-
Synopsis:
-
WHook ioncore.get_hook(string name) - -
-
Description:
-
Find named hook name. - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.match_winprop_dflt(prop, cwin, id) - -
-
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 cmd. - For more information, see Section 3.3. - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.mdblclick(buttonspec, cmd, guard) - -
-
Description:
-
Similar to ioncore.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_or_opts) - -
-
Description:
-
Use this function to define normal menu entries. The string name - is the string shown in the visual representation of menu. The - parameter cmd and guard_or_opts (when string) are similar - to those of ioncore.defbindings. If guard_or_opts is - a table, it may contains the guard field, and the priority - field, for controlling positioning of entries in context menus. - (The default priority is 1 for most entries, and -1 for auto-generated - submenus.) - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.mpress(buttonspec, cmd, guard) - -
-
Description:
-
Similar to ioncore.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(keyspec, 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.submap_enter(cmd, guard) - -
-
Description:
-
Submap enter event for bindings. - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.submap_wait(cmd, guard) - -
-
Description:
-
Submap modifier release event for bindings. - -
-
- -

- -

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

- -

-
-
-
Synopsis:
-
ioncore.tabnum.clear() - -
-
Description:
-
Clear all tab numbers set by ioncore.tabnum.show. - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.tabnum.show(frame, delay) - -
-
Description:
-
Show tab numbers on frame, clearing them when submap - grab is released the next time. If delay is given, in - milliseconds, the numbers are not actually displayed until this - time has passed. - -
-
- -

- -

-
-
-
Synopsis:
-
ioncore.tagged_attach(reg, param) - -
-
Description:
-
Attach tagged regions to reg. The method of attach - depends on the types of attached regions and whether reg - implements attach_framed and attach. If param - is not set, the default of {switchto=true} is used. - The function returns true if all tagged regions were - succesfully attached, and false otherwisse. - -
-
- -

- -

-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:
-
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:
-
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_grattr(WFrame frame, string attr, string how) - -
-
Description:
-
Set extra drawing engine attributes for the frame. - The parameter attr is the attribute, and how is - one of `set', `unset', or `toggle'. - -
-
- -

- -

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

- -

-
-
-
Synopsis:
-
bool WFrame.set_shaded(WFrame frame, string how) - -
-
Description:
-
Set shading state according to the parameter how - (`set', `unset', or `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
type(string) Class of the object to be created. Mandatory.
name(string) Name of the object to be created.
switchto(boolean) Should the region be switched to?
level(integer) Stacking level; default is 1.
modal(boolean) Make object modal; ignored if level is set.
sizepolicy(string) Size policy; see Section 6.10.1.
bottom(boolean) Mark the attached region as the - ``bottom'' of ws.
- -

-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:
-
bool WGroup.is_fullscreen(WGroup grp) - -
-
Description:
-
Is reg in full screen mode? - -
-
- -

- -

-
-
-
Synopsis:
-
bool WGroup.managed_i(WGroup ws, function iterfn) - -
-
Description:
-
Iterate over managed regions of ws until iterfn returns - false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
Synopsis:
-
bool WGroup.set_bottom(WGroup ws, WRegion reg) - -
-
Description:
-
Sets the `bottom' of ws. The region reg must already - be managed by ws, unless nil. - -
-
- -

- -

-
-
-
Synopsis:
-
bool WGroup.set_fullscreen(WGroup grp, string how) - -
-
Description:
-
Set client window reg full screen state according to the - parameter how (one of `set', `unset', or - `toggle'). Resulting state is returned, which may not be - what was requested. - -
-
- -

- -

-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 WHook functions -

- -

- -

-
-
-
Synopsis:
-
bool WHook.add(WHook hk, function efn) - -
-
Description:
-
Add efn to the list of functions to be called when the - hook hk is triggered. - -
-
- -

- -

-
-
-
Synopsis:
-
bool WHook.listed(WHook hk, function efn) - -
-
Description:
-
Is fn hooked to hook hk? - -
-
- -

- -

-
-
-
Synopsis:
-
bool WHook.remove(WHook hk, function efn) - -
-
Description:
-
Remove efn from the list of functions to be called when the - hook hk is triggered. - -
-
- -

- -

-6.1.7 WInfoWin functions -

- -

- -

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

- -

-6.1.8 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.
passive(boolean) Skip in certain focusing operations.
pseudomodal(boolean) The attached region is ``pseudomodal'' - if the stacking level dictates it to be modal. - This means that the region may be hidden to display - regions with lesser stacking levels.
sizepolicy(string) Size policy; see Section 6.10.1.
geom(table) Geometry specification.
- -

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

-
- -

- -

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

- -

-
-
-
Synopsis:
-
integer WMPlex.get_index(WMPlex mplex, WRegion reg) - -
-
Description:
-
Get index of reg on the mutually exclusive list of mplex. - The indices begin from zero.. If reg is not on the list, - -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:
-
bool WMPlex.managed_i(WMPlex mplex, function iterfn) - -
-
Description:
-
Iterate over managed regions of mplex until iterfn returns - false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
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:
-
bool WMPlex.mx_i(WMPlex mplex, function iterfn) - -
-
Description:
-
Iterate over numbered/mutually exclusive region list of mplex - until iterfn returns false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
Synopsis:
-
WRegion WMPlex.mx_nth(WMPlex mplex, integer n) - -
-
Description:
-
Returns the n:th object on the mutually exclusive - list of mplex. - -
-
- -

- -

-
-
-
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 - (one of `set', `unset', or `toggle'). - The resulting state is returned. - -
-
- -

- -

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

- -

-
-
-
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
pos(string) The corner of the screen to place the status - display in: one of `tl', `tr', `bl' - or `br'.
fullsize(boolean) Waste all available space.
action(string) If this field is set to `keep', - pos and fullsize 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.9 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:
-
table WMoveresMode.geom(WMoveresMode mode) - -
-
Description:
-
Returns current geometry. - -
-
- -

- -

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

- -

-
-
-
Synopsis:
-
table WMoveresMode.rqgeom(WMoveresMode mode, table g) - -
-
Description:
-
Request exact geometry in move/resize mode. For details on parameters, - see WRegion.rqgeom. - -
-
- -

- -

-6.1.10 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:
-
table WRegion.get_configuration(WRegion reg, bool clientwins) - -
-
Description:
-
Get configuration tree. If clientwins is unset, client windows - are filtered out. - -
-
- -

- -

-
-
-
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:
-
WRegion WRegion.groupleader_of(WRegion reg) - -
-
Description:
-
Returns the group of reg, if reg is its bottom, - and reg itself otherwise. - -
-
- -

- -

-
-
-
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:
-
void 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). The region will not be destroyed when - this function returns. To find out if and when it is destroyed, - use the `deinit' notification. 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. For further details, 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 must be - one of `set', `unset' or `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 - (one of `set', `unset', or `toggle'). - The 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.11 WRootWin functions -

- -

- -

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

- -

-6.1.12 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.13 WTimer functions -

- -

- -

-
-
-
Synopsis:
-
bool WTimer.is_set(WTimer timer) - -
-
Description:
-
Is timer set? - -
-
- -

- -

-
-
-
Synopsis:
-
void WTimer.reset(WTimer timer) - -
-
Description:
-
Reset timer. - -
-
- -

- -

-
-
-
Synopsis:
-
void WTimer.set(WTimer timer, integer msecs, function fn) - -
-
Description:
-
Set timer to call fn in msecs milliseconds. - -
-
- -

- -

-6.1.14 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.15 global functions -

- -

- -

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

- -

-6.1.16 gr functions -

- -

- -

-
-
-
Synopsis:
-
void gr.read_config() - -
-
Description:
-
Read drawing engine configuration file look.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.17 string functions -

- -

- -

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

- -

-6.1.18 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:
-
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. - -
-
- -

- -

-
-
-
Synopsis:
-
bool mod_tiling.untile(WTiling tiling) - -
-
Description:
-
If tiling is managed by some group, float the frames in - the tiling in that group, and dispose of tiling. - -
-
- -

- -

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

- -

-
-
-
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', or `down'). - If any is not set, the status display is not considered. - -
-
- -

- -

-
-
-
Synopsis:
-
bool WTiling.managed_i(WTiling ws, function iterfn) - -
-
Description:
-
Iterate over managed regions of ws until iterfn returns - false. - The function itself returns true if it reaches the end of list - without this happening. - -
-
- -

- -

-
-
-
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', - or `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', or - `toggle') and dirstr (`left', `right', - `up', or `down'). 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', or `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, or `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:
-
void WTiling.unsplit_at(WTiling ws, WRegion reg) - -
-
Description:
-
Try to relocate regions managed by reg to another frame - and, if possible, destroy it. - -
-
- -

- -

- -
-6.3 Functions defined in mod_query -

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

- -

-
-
-
Synopsis:
-
mod_query.message(mplex, str) - -
-
Description:
-
Display a message in mplex. - -
-
- -

- -

-
-
-
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, bool exact) - -
-
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. If exact is not set, s only required - to be a prefix of the match. - -
-
- -

- -

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

- -

-
-
-
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).
caseicompl(boolean) Turn some completions case-insensitive - (default: false).
- -

-
- -

- -

-
-
-
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 attaches - it to the frame the query was opened in. 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 switches - focus to the one entered. 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, sub, 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, ws) - -
-
Description:
-
This function asks for a name new for the workspace ws, - or the one on which mplex resides, if it is not set. - If mplex is not set, one is looked for. - -
-
- -

- -

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

- -

-
-
-
Synopsis:
-
mod_query.warn(mplex, str) - -
-
Description:
-
Display an error message box in the multiplexer mplex. - -
-
- -

- -

-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 -$\{t,m,b\}\times\{t,c,b\}$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', or `toggle'. - The resulting status is returned. - -
-
- -

- -

-
-
-
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', or `toggle'. - The resulting status is returned. - -
-
- -

- -

- -
-6.7 Functions defined in mod_statusbar -

- -
-
-
-
Synopsis:
-
mod_statusbar.create(param) - -
-
Description:
-
Create a statusbar. The possible parameters in the - table param are: - -

- - - - - - - - - - - - - - - - - - - - - - - - - -
VariableTypeDescription
templatestringThe template; see - Section 3.6.
posstringPosition: `tl', `tr', - `bl' or `br' - (for the obvious combinations of - top/left/bottom/right).
screenintegerScreen number to create the statusbar on.
fullsizebooleanIf set, the statusbar will waste - space instead of adapting to layout.
systrayboolaenSwallow (KDE protocol) systray icons.
- -

-
- -

- -

-
-
-
Synopsis:
-
mod_statusbar.inform(name, value) - -
-
Description:
-
Inform of a value. - -
-
- -

- -

-
-
-
Synopsis:
-
mod_statusbar.launch_statusd(cfg) - -
-
Description:
-
Load modules and launch ion-statusd with configuration - table cfg. The options for each ion-statusd monitor - script should be contained in the corresponding sub-table of cfg. - -
-
- -

- -

-
-
-
Synopsis:
-
table mod_statusbar.statusbars() - -
-
Description:
-
Returns a list of all statusbars. - -
-
- -

- -

-
-
-
Synopsis:
-
mod_statusbar.update(update_templates) - -
-
Description:
-
Update statusbar contents. To be called after series - of mod_statusbar.inform calls. - -
-
- -

- -

-6.7.1 WStatusBar functions -

- -

- -

-
-
-
Synopsis:
-
table WStatusBar.get_template_table(WStatusBar sb) - -
-
Description:
-
Get statusbar template as table. - -
-
- -

- -

-
-
-
Synopsis:
-
bool WStatusBar.is_systray(WStatusBar sb) - -
-
Description:
-
Is sb used as a systray? - -
-
- -

- -

-
-
-
Synopsis:
-
bool WStatusBar.set_systray(WStatusBar sb, string how) - -
-
Description:
-
Enable or disable use of sb as systray. - The parameter how can be one of - `set', `unset', or `toggle'. - Resulting state is returned. - -
-
- -

- -

-
-
-
Synopsis:
-
void WStatusBar.set_template(WStatusBar sb, string tmpl) - -
-
Description:
-
Set statusbar template. - -
-
- -

- -

-
-
-
Synopsis:
-
void WStatusBar.set_template_table(WStatusBar sb, table t) - -
-
Description:
-
Set statusbar template as table. - -
-
- -

- -

-
-
-
Synopsis:
-
void WStatusBar.update(WStatusBar sb, table t) - -
-
Description:
-
Set statusbar template. - -
-
- -

- -

- -
-6.8 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.9 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 dock-app.
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_property_change_hook - -
-
Parameters:
-
(WClientWin, integer) - -
-
Description:
-
Called when the property identified by the parameter atom id - (integer) has changed on 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 occurred
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 main-loop, 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:
-
ioncore_submap_ungrab_hook - -
-
Parameters:
-
() - -
-
Description:
-
This hook is used to signal whenever Ion leaves the submap grab mode. - -
-
- -

- -

-
- -
-
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 successful 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:
-
region_do_warp_alt - -
-
Parameters:
-
WRegion - -
-
Description:
-
This alt-hook exist to allow for alternative pointer warping - implementations. - -
-
- -

- -

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

- -

-
- -
-
Hook name:
-
region_notify_hook - -
-
Parameters:
-
(WRegion, string) - -
-
Description:
-
Signalled when something (minor) has changed in relation to - the first parameter region. The string argument gives the - change: - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
StringDescription
deinitThe region is about to be deinitialised.
activatedThe region has received focus.
inactivatedThe region has lost focus.
activityThere's been activity in the region itself.
sub_activityThere's been activity in some sub-region.
nameThe name of the region has changed.
unset_managerThe region no longer has a manager.
set_managerThe region now has a manager.
tagTagging state has changed.
pseudoactivatedThe region has become pseudo-active - (see below).
pseudoinactivatedThe region is no longer pseudo-active.
- -

-A region is pseudo-active, when a) it is itself not active (does - not not have the focus, and may not even have a window that could - have it), but b) some region managed by it is active. - -

-
- -

- -

- -

- -
-6.10 Miscellaneous -

- -

- -

- -
-6.10.1 Size policies -

- -

-Some functions accept a sizepolicy parameter. The possible -values are: - -

-

-`default', -`full', -`full_bounds', -`free', -`free_glue', -`northwest', -`north', -`northeast', -`west', -`center', -`east', -`southwest', -`south', -`southeast', -`stretch_top', -`stretch_bottom', -`stretch_left', -`stretch_right', -`free_glue_northwest', -`free_glue_north', -`free_glue_northeast', -`free_glue_west', -`free_glue_center', -`free_glue_east', -`free_glue_southwest', -`free_glue_south', and -`free_glue_southeast'. - -
- -

-The ``free'' policies allow the managed -object to be moved around, whereas the other versions do not. -The ``glue'' policies glue the object to some border, while allowing -it to be moved away from it by user action, but not automatically. -The ``stretch'' policies stretch the object along the given border, -while the coordinate-based policies simply place the object along -that border. - -

- -

- -

- - - - diff --git a/doc/ionconf/node8.html b/doc/ionconf/node8.html deleted file mode 100644 index 33cb380..0000000 --- a/doc/ionconf/node8.html +++ /dev/null @@ -1,597 +0,0 @@ - - - - - -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/doc/ionconf/node9.html b/doc/ionconf/node9.html deleted file mode 100644 index 0b16372..0000000 --- a/doc/ionconf/node9.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - -B. Full class hierarchy visible to Lua-side - - - - - - - - - - - - - - - - - - - - - - -

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

- -

-

-    Obj
-     |-->WHook
-     |-->WTimer
-     |-->WMoveresMode
-     |-->WRegion
-     |    |-->WClientWin
-     |    |-->WWindow
-     |    |    |-->WMPlex
-     |    |    |    |-->WFrame
-     |    |    |    |-->WScreen
-     |    |    |         |->WRootWin
-     |    |    |-->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/doc/ionconf/prev.png b/doc/ionconf/prev.png deleted file mode 100644 index e60b8b4..0000000 Binary files a/doc/ionconf/prev.png and /dev/null differ diff --git a/doc/ionconf/prev_g.png b/doc/ionconf/prev_g.png deleted file mode 100644 index 476d956..0000000 Binary files a/doc/ionconf/prev_g.png and /dev/null differ diff --git a/doc/ionconf/up.png b/doc/ionconf/up.png deleted file mode 100644 index 3937e16..0000000 Binary files a/doc/ionconf/up.png and /dev/null differ diff --git a/doc/ionnotes.dvi.gz b/doc/ionnotes.dvi.gz deleted file mode 100644 index d23f951..0000000 Binary files a/doc/ionnotes.dvi.gz and /dev/null differ diff --git a/doc/ionnotes.out b/doc/ionnotes.out deleted file mode 100644 index f29e5e3..0000000 --- a/doc/ionnotes.out +++ /dev/null @@ -1,22 +0,0 @@ -\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/doc/ionnotes.ps.gz b/doc/ionnotes.ps.gz deleted file mode 100644 index 2fb8ef8..0000000 Binary files a/doc/ionnotes.ps.gz and /dev/null differ diff --git a/doc/ionnotes.tex b/doc/ionnotes.tex deleted file mode 100644 index c8f779d..0000000 --- a/doc/ionnotes.tex +++ /dev/null @@ -1,60 +0,0 @@ -\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/doc/ionnotes/WARNINGS b/doc/ionnotes/WARNINGS deleted file mode 100644 index 726c0ef..0000000 --- a/doc/ionnotes/WARNINGS +++ /dev/null @@ -1,8 +0,0 @@ -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/doc/ionnotes/contents.png b/doc/ionnotes/contents.png deleted file mode 100644 index 0c752c6..0000000 Binary files a/doc/ionnotes/contents.png and /dev/null differ diff --git a/doc/ionnotes/crossref.png b/doc/ionnotes/crossref.png deleted file mode 100644 index 7dd2ddd..0000000 Binary files a/doc/ionnotes/crossref.png and /dev/null differ diff --git a/doc/ionnotes/index.html b/doc/ionnotes/index.html deleted file mode 100644 index 9ebfb0d..0000000 --- a/doc/ionnotes/index.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - -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/doc/ionnotes/index.png b/doc/ionnotes/index.png deleted file mode 100644 index 698f09c..0000000 Binary files a/doc/ionnotes/index.png and /dev/null differ diff --git a/doc/ionnotes/internals.pl b/doc/ionnotes/internals.pl deleted file mode 100644 index 89e33bb..0000000 --- a/doc/ionnotes/internals.pl +++ /dev/null @@ -1,34 +0,0 @@ -# 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/doc/ionnotes/ionnotes.css b/doc/ionnotes/ionnotes.css deleted file mode 100644 index f0cd026..0000000 --- a/doc/ionnotes/ionnotes.css +++ /dev/null @@ -1,38 +0,0 @@ -/* 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/doc/ionnotes/ionnotes.html b/doc/ionnotes/ionnotes.html deleted file mode 100644 index 9ebfb0d..0000000 --- a/doc/ionnotes/ionnotes.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - -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/doc/ionnotes/labels.pl b/doc/ionnotes/labels.pl deleted file mode 100644 index 2c1867a..0000000 --- a/doc/ionnotes/labels.pl +++ /dev/null @@ -1,69 +0,0 @@ -# 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/doc/ionnotes/next.png b/doc/ionnotes/next.png deleted file mode 100644 index 1628652..0000000 Binary files a/doc/ionnotes/next.png and /dev/null differ diff --git a/doc/ionnotes/next_g.png b/doc/ionnotes/next_g.png deleted file mode 100644 index 9d3f591..0000000 Binary files a/doc/ionnotes/next_g.png and /dev/null differ diff --git a/doc/ionnotes/node1.html b/doc/ionnotes/node1.html deleted file mode 100644 index b174939..0000000 --- a/doc/ionnotes/node1.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -Contents - - - - - - - - - - - - - - - - - - - - - -
- -

-Contents -

- - - - -

- -

-


- - - diff --git a/doc/ionnotes/node2.html b/doc/ionnotes/node2.html deleted file mode 100644 index 4996b37..0000000 --- a/doc/ionnotes/node2.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - -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 hierarchy 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
-     |    |    |-->WMPlex
-     |    |    |    |-->WFrame
-     |    |    |    |-->WScreen
-     |    |    |         |-->WRootWin
-     |    |    |-->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). - -

-

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

-

-
WScreen
-
is an instance of WMPlex - for screens. - -

-

-
WRootWin
-
is the class for - root windows of X screens. - It is an instance of WScreen. - 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 ugly hacks such as - Xinerama are used. (Actually there can be only - one root window when Xinerama is used.) - -

-

-
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
-          |    |    |-->WFrames
-          |    |    |    |-->WGroupCWs (with contents as above)
-          |    |    |-->possibly a WStatusBar or WDock
-          |    |-->WFrames for floating content
-          |    |-->possibly a WEdln, WMessage or WMenu
-          |    |-->possibly a WStatusBar or WDock (if no tiling)
-          |-->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/doc/ionnotes/node3.html b/doc/ionnotes/node3.html deleted file mode 100644 index 63c9852..0000000 --- a/doc/ionnotes/node3.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - -2 Object system implementation - - - - - - - - - - - - - - - - - - - - - - -

-2 Object system implementation -

- -

-First, to get things clear, what are considered objects here are C -structures containing a properly initialised -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/doc/ionnotes/node4.html b/doc/ionnotes/node4.html deleted file mode 100644 index 41c8521..0000000 --- a/doc/ionnotes/node4.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -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/doc/ionnotes/node5.html b/doc/ionnotes/node5.html deleted file mode 100644 index 45b1c29..0000000 --- a/doc/ionnotes/node5.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - -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 mainloop_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 mainloop_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 mainloop_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/doc/ionnotes/node6.html b/doc/ionnotes/node6.html deleted file mode 100644 index 61cff1a..0000000 --- a/doc/ionnotes/node6.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - -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 spaces. - -

    -

  • -
  • 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/doc/ionnotes/node7.html b/doc/ionnotes/node7.html deleted file mode 100644 index 7e36403..0000000 --- a/doc/ionnotes/node7.html +++ /dev/null @@ -1,597 +0,0 @@ - - - - - -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/doc/ionnotes/node8.html b/doc/ionnotes/node8.html deleted file mode 100644 index d14a7c0..0000000 --- a/doc/ionnotes/node8.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - -Index - - - - - - - - - - - - - - - - - - - - - -
- -

-Index -


-
call handler - : 3.2 -
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 -
mainloop_defer_action - : 4.1 -
mainloop_defer_destroy - : 4.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/doc/ionnotes/node9.html b/doc/ionnotes/node9.html deleted file mode 100644 index b3c05af..0000000 --- a/doc/ionnotes/node9.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -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 2007-09-27 -


- - - diff --git a/doc/ionnotes/prev.png b/doc/ionnotes/prev.png deleted file mode 100644 index e60b8b4..0000000 Binary files a/doc/ionnotes/prev.png and /dev/null differ diff --git a/doc/ionnotes/prev_g.png b/doc/ionnotes/prev_g.png deleted file mode 100644 index 476d956..0000000 Binary files a/doc/ionnotes/prev_g.png and /dev/null differ diff --git a/doc/ionnotes/up.png b/doc/ionnotes/up.png deleted file mode 100644 index 3937e16..0000000 Binary files a/doc/ionnotes/up.png and /dev/null differ diff --git a/doc/luaif.tex b/doc/luaif.tex deleted file mode 100644 index 76789a7..0000000 --- a/doc/luaif.tex +++ /dev/null @@ -1,148 +0,0 @@ - -\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/doc/macros.tex b/doc/macros.tex deleted file mode 100644 index 134aeed..0000000 --- a/doc/macros.tex +++ /dev/null @@ -1,152 +0,0 @@ -\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{tt} - -% 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{\codestr}[1]{`\texttt{#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{\codestr}[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/doc/miscref.tex b/doc/miscref.tex deleted file mode 100644 index 44b0818..0000000 --- a/doc/miscref.tex +++ /dev/null @@ -1,44 +0,0 @@ - -\subsection{Size policies} -\label{sec:sizepolicies} - -Some functions accept a \var{sizepolicy} parameter. The possible -values are: - -\begin{flushleft} -\codestr{default}, -\codestr{full}, -\codestr{full\_bounds}, -\codestr{free}, -\codestr{free\_glue}, -\codestr{northwest}, -\codestr{north}, -\codestr{northeast}, -\codestr{west}, -\codestr{center}, -\codestr{east}, -\codestr{southwest}, -\codestr{south}, -\codestr{southeast}, -\codestr{stretch\_top}, -\codestr{stretch\_bottom}, -\codestr{stretch\_left}, -\codestr{stretch\_right}, -\codestr{free\_glue\_northwest}, -\codestr{free\_glue\_north}, -\codestr{free\_glue\_northeast}, -\codestr{free\_glue\_west}, -\codestr{free\_glue\_center}, -\codestr{free\_glue\_east}, -\codestr{free\_glue\_southwest}, -\codestr{free\_glue\_south}, and -\codestr{free\_glue\_southeast}. -\end{flushleft} - -The ``free'' policies allow the managed -object to be moved around, whereas the other versions do not. -The ``glue'' policies glue the object to some border, while allowing -it to be moved away from it by user action, but not automatically. -The ``stretch'' policies stretch the object along the given border, -while the coordinate-based policies simply place the object along -that border. diff --git a/doc/objects.tex b/doc/objects.tex deleted file mode 100644 index b9de147..0000000 --- a/doc/objects.tex +++ /dev/null @@ -1,246 +0,0 @@ - -\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 hierarchy 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 - | | |-->WMPlex - | | | |-->WFrame - | | | |-->WScreen - | | | |-->WRootWin - | | |-->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{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. - - \item[\type{WScreen}]\indextype{WScreen} is an instance of \type{WMPlex} - for screens. - - \item[\type{WRootWin}]\indextype{WRootWin} is the class for - root windows\index{root window} of X screens\index{screen!X}. - It is an instance of \type{WScreen}. - 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 ugly hacks such as - Xinerama\index{Xinerama} are used. (Actually there can be only - one root window when Xinerama is used.) - - \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 - | | |-->WFrames - | | | |-->WGroupCWs (with contents as above) - | | |-->possibly a WStatusBar or WDock - | |-->WFrames for floating content - | |-->possibly a WEdln, WMessage or WMenu - | |-->possibly a WStatusBar or WDock (if no tiling) - |-->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/doc/objectsimpl.tex b/doc/objectsimpl.tex deleted file mode 100644 index a224aa5..0000000 --- a/doc/objectsimpl.tex +++ /dev/null @@ -1,20 +0,0 @@ -\section{Object system implementation} - -First, to get things clear, what are considered objects here are C -structures containing a properly initialised \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/doc/predist.sh b/doc/predist.sh deleted file mode 100644 index 31e7405..0000000 --- a/doc/predist.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/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/doc/prelim.tex b/doc/prelim.tex deleted file mode 100644 index 8a0a6c3..0000000 --- a/doc/prelim.tex +++ /dev/null @@ -1,55 +0,0 @@ - -\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 dock-apps. - 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\_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 \file{ion3} executable loads all of the -modules mentioned above except \file{mod\_dock}. -The stock configuration for the \file{pwm3} executable (which differs -from the \file{ion3} executable in a few configuration details) -loads another set of modules. - - -\input{objects} diff --git a/doc/rapport3.perl b/doc/rapport3.perl deleted file mode 100644 index 77b2cbd..0000000 --- a/doc/rapport3.perl +++ /dev/null @@ -1,38 +0,0 @@ -# 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/doc/statusd.tex b/doc/statusd.tex deleted file mode 100644 index 82e70eb..0000000 --- a/doc/statusd.tex +++ /dev/null @@ -1,82 +0,0 @@ - -\section{Writing \command{ion-statusd} monitors} -\label{sec:statusd} - -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 \codestr{\%foo} or \codestr{\%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 -\codestr{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 \codestr{normal}, \codestr{important} and -\codestr{critical} hints. - - -In our example of the 'foo monitor', at script initialisation 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/doc/tricks.tex b/doc/tricks.tex deleted file mode 100644 index b999688..0000000 --- a/doc/tricks.tex +++ /dev/null @@ -1,103 +0,0 @@ - -\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 explained 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 successfully. 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 (successful) 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. - - -\section{Referring to regions} - -\subsection{Direct object references} - -All Ion objects are passed to Lua scripts 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} - diff --git a/exact-version b/exact-version index 6b0ce6a..7d9d056 100644 --- a/exact-version +++ b/exact-version @@ -1,5 +1,5 @@ Context: -[TAG ion-3rc-20070927 -Tuomo Valkonen **20070927162233] +[TAG ion-3rc-20071109 +Tuomo Valkonen **20071109144719] diff --git a/ioncore/detach.c b/ioncore/detach.c index 72c7406..2d24fee 100644 --- a/ioncore/detach.c +++ b/ioncore/detach.c @@ -145,7 +145,6 @@ static WGroup *find_group(WRegion *reg, uint *level) bool ioncore_detach(WRegion *reg, int sp) { - WPHolder *ph=region_get_return(reg); WFrameMode mode; WGroup *grp; bool set, nset; @@ -183,15 +182,17 @@ bool ioncore_detach(WRegion *reg, int sp) /*EXTL_DOC - * Detach or reattach \var{reg}, depending on whether \var{how} - * is \codestr{set}, \codestr{unset} or \codestr{toggle}. (Detaching - * means making \var{reg} managed by its nearest ancestor \type{WGroup}, - * framed if \var{reg} is not itself \type{WFrame}. Reattaching means - * making it managed where it used to be managed, if a return-placeholder - * exists.) - * If \var{reg} is the `bottom' of some group, the whole group is - * detached. If \var{reg} is a \type{WWindow}, it is put into a - * frame. + * Detach or reattach \var{reg} or any group it is the leader of + * (see \fnref{WRegion.groupleader_of}), depending on whether \var{how} + * is \codestr{set}, \codestr{unset} or \codestr{toggle}. If this + * region is not a window, it is put into a frame. + * + * Detaching a region means having it managed by its nearest ancestor + * \type{WGroup}. Reattaching means having it managed where it used + * to be managed, if a ``return placeholder'' exists. + * + * Additionally, setting \var{how} to \codestr{forget}, can be used to + * clear this return placeholder of the group leader of \var{reg}. */ EXTL_EXPORT_AS(ioncore, detach) bool ioncore_detach_extl(WRegion *reg, const char *how) @@ -199,6 +200,11 @@ bool ioncore_detach_extl(WRegion *reg, const char *how) if(how==NULL) how="set"; + if(strcmp(how, "forget")==0){ + region_unset_return(region_groupleader_of(reg)); + return FALSE; + } + return ioncore_detach(reg, libtu_string_to_setparam(how)); } diff --git a/ioncore/exec.c b/ioncore/exec.c index 97f33b3..32771a0 100644 --- a/ioncore/exec.c +++ b/ioncore/exec.c @@ -123,7 +123,8 @@ int ioncore_exec(const char *cmd) /*EXTL_DOC - * Run \var{cmd} with a read pipe connected to its stdout and stderr. + * Run \var{cmd} in directory \var{wd} with a read pipe connected to its + * stdout and stderr. * When data is received through one of these pipes, \var{h} or \var{errh} * is called with that data. When the pipe is closed, the handler is called * with \code{nil} argument. The PID of the new process is returned, or @@ -131,12 +132,13 @@ int ioncore_exec(const char *cmd) */ EXTL_SAFE EXTL_EXPORT -int ioncore_popen_bgread(const char *cmd, ExtlFn h, ExtlFn errh) +int ioncore_popen_bgread(const char *cmd, ExtlFn h, ExtlFn errh, + const char *wd) { WExecP p; p.target=NULL; - p.wd=NULL; + p.wd=wd; p.cmd=cmd; return mainloop_popen_bgread(cmd, setup_exec, (void*)&p, h, errh); diff --git a/ioncore/exec.h b/ioncore/exec.h index 2661b50..e5802fc 100644 --- a/ioncore/exec.h +++ b/ioncore/exec.h @@ -35,7 +35,8 @@ DECLSTRUCT(WExecP){ extern bool ioncore_exec(const char *cmd); extern int ioncore_do_exec_on(WRegion *reg, const char *cmd, const char *wd, ExtlFn errh); -extern bool ioncore_popen_bgread(const char *cmd, ExtlFn h, ExtlFn errh); +extern bool ioncore_popen_bgread(const char *cmd, ExtlFn h, ExtlFn errh, + const char *wd); extern void ioncore_setup_environ(const WExecP *p); extern void ioncore_setup_display(int xscr); diff --git a/ioncore/fullscreen.c b/ioncore/fullscreen.c index 12de118..5279747 100644 --- a/ioncore/fullscreen.c +++ b/ioncore/fullscreen.c @@ -167,16 +167,5 @@ bool group_set_fullscreen_extl(WGroup *grp, const char *how) } -/*EXTL_DOC - * Is \var{reg} in full screen mode? - */ -EXTL_SAFE -EXTL_EXPORT_MEMBER -bool group_is_fullscreen(WGroup *grp) -{ - return REGION_IS_FULLSCREEN(grp); -} - - /*}}}*/ diff --git a/ioncore/group-cw.c b/ioncore/group-cw.c index d0f1506..5a2a32d 100644 --- a/ioncore/group-cw.c +++ b/ioncore/group-cw.c @@ -116,6 +116,23 @@ WPHolder *groupcw_prepare_manage_transient(WGroupCW *cwg, } +static WRegion *groupcw_managed_disposeroot(WGroupCW *ws, WRegion *reg) +{ + WGroupIterTmp tmp; + WStacking *st; + WRegion *tmpr; + + FOR_ALL_NODES_IN_GROUP(&ws->grp, st, tmp){ + if(st!=ws->grp.managed_stdisp && st->reg!=reg){ + return reg; + } + } + + tmpr=region_disposeroot((WRegion*)ws); + return (tmpr!=NULL ? tmpr : reg); +} + + /*}}}*/ @@ -277,6 +294,9 @@ static DynFunTab groupcw_dynfuntab[]={ {(DynFun*)region_prepare_manage_transient, (DynFun*)groupcw_prepare_manage_transient}, + + {(DynFun*)region_managed_disposeroot, + (DynFun*)groupcw_managed_disposeroot}, {(DynFun*)region_displayname, (DynFun*)groupcw_displayname}, diff --git a/ioncore/group-ws.c b/ioncore/group-ws.c index 647cef0..3fd8cb7 100644 --- a/ioncore/group-ws.c +++ b/ioncore/group-ws.c @@ -120,44 +120,26 @@ EXTL_EXPORT_AS(WGroupWS, attach_framed) bool groupws_attach_framed_extl(WGroupWS *ws, WRegion *reg, ExtlTab t) { WGroupAttachParams ap=GROUPATTACHPARAMS_INIT; - WFramedParam fp=FRAMEDPARAM_INIT; - ExtlTab gt; + WFramedParam frp=FRAMEDPARAM_INIT; if(reg==NULL) return FALSE; - fp.gravity=ForgetGravity; - - if(extl_table_is_bool_set(t, "switchto")){ - ap.switchto_set=TRUE; - ap.switchto=TRUE; - } + group_get_attach_params(&ws->grp, t, &ap); - if(extl_table_gets_t(t, "geom", >)){ - int pos=0, size=0; - - fp.inner_geom.x=0; - fp.inner_geom.y=0; - - if(extl_table_gets_i(gt, "x", &(ap.geom.x))) - pos++; - if(extl_table_gets_i(gt, "y", &(ap.geom.y))) - pos++; - - if(extl_table_gets_i(gt, "w", &(ap.geom.w))) - size++; - if(extl_table_gets_i(gt, "h", &(ap.geom.h))) - size++; - - fp.inner_geom.w=maxof(fp.inner_geom.w, 1); - fp.inner_geom.h=maxof(fp.inner_geom.h, 1); + /* Sensible size is given in framedparams */ + if(ap.geom_set){ + ap.geom_set=0; + ap.geom_weak_set=1; + ap.geom_weak=0; - fp.inner_geom_gravity_set=(size==2 && pos==2); - - extl_unref_table(gt); + frp.inner_geom_gravity_set=1; + frp.inner_geom=ap.geom; + frp.gravity=NorthWestGravity; + extl_table_gets_i(t, "gravity", &frp.gravity); } - return groupws_attach_framed(ws, &ap, &fp, reg); + return groupws_attach_framed(ws, &ap, &frp, reg); } @@ -295,6 +277,33 @@ WPHolder *groupws_get_rescue_pholder_for(WGroupWS *ws, } +static bool group_empty_for_bottom_stdisp(WGroup *ws) +{ + WGroupIterTmp tmp; + WStacking *st; + + FOR_ALL_NODES_IN_GROUP(ws, st, tmp){ + if(st!=ws->bottom && st!=ws->managed_stdisp) + return FALSE; + } + + return TRUE; +} + + +static WRegion *groupws_managed_disposeroot(WGroupWS *ws, WRegion *reg) +{ + if(group_bottom(&ws->grp)==reg){ + if(group_empty_for_bottom_stdisp(&ws->grp)){ + WRegion *tmpr=region_disposeroot((WRegion*)ws); + return (tmpr!=NULL ? tmpr : reg); + } + } + + return reg; +} + + /*}}}*/ @@ -348,6 +357,9 @@ static DynFunTab groupws_dynfuntab[]={ {(DynFun*)region_prepare_manage_transient, (DynFun*)groupws_prepare_manage_transient}, + + {(DynFun*)region_managed_disposeroot, + (DynFun*)groupws_managed_disposeroot}, {(DynFun*)region_handle_drop, (DynFun*)groupws_handle_drop}, diff --git a/ioncore/group.c b/ioncore/group.c index ffe6c86..e39b202 100644 --- a/ioncore/group.c +++ b/ioncore/group.c @@ -234,26 +234,9 @@ static WStacking *find_to_focus(WGroup *ws, WStacking *st, bool group_only) } -static bool group_refocus_(WGroup *ws, WStacking *st) -{ - if(st!=ws->current_managed && st->reg!=NULL){ - if(region_may_control_focus((WRegion*)ws)) - region_set_focus(st->reg); - else - ws->current_managed=st; - return TRUE; - } - - return FALSE; -} - - static void group_do_set_focus(WGroup *ws, bool warp) { - WStacking *st=ws->current_managed; - - if(st==NULL || st->reg==NULL) - st=find_to_focus(ws, NULL, TRUE); + WStacking *st=find_to_focus(ws, ws->current_managed, FALSE); if(st!=NULL && st->reg!=NULL) region_do_set_focus(st->reg, warp); @@ -441,31 +424,6 @@ bool group_rescue_clientwins(WGroup *ws, WRescueInfo *info) } -static bool group_empty_for_bottom_stdisp(WGroup *ws) -{ - WGroupIterTmp tmp; - WStacking *st; - - FOR_ALL_NODES_IN_GROUP(ws, st, tmp){ - if(st!=ws->bottom && st!=ws->managed_stdisp) - return FALSE; - } - - return TRUE; -} - - -static WRegion *group_managed_disposeroot(WGroup *ws, WRegion *reg) -{ - if(group_bottom(ws)==reg){ - if(group_empty_for_bottom_stdisp(ws)) - return region_disposeroot((WRegion*)ws); - } - - return reg; -} - - /*}}}*/ @@ -605,6 +563,14 @@ static void geom_group_to_parent(WGroup *ws, const WRectangle *g, } +static int group_must_focus(WGroup *ws, WStacking *st) +{ + WStacking *stacking=group_get_stacking(ws); + + return (stacking!=NULL && stacking_must_focus(stacking, st)); +} + + bool group_do_attach_final(WGroup *ws, WRegion *reg, const WGroupAttachParams *param) @@ -687,15 +653,15 @@ bool group_do_attach_final(WGroup *ws, group_do_set_bottom(ws, st); /* Focus */ - sw=(param->switchto_set ? param->switchto : ioncore_g.switchto_new); + sw=((param->switchto_set ? param->switchto : ioncore_g.switchto_new) + ? st==find_to_focus(ws, st, FALSE) + : group_must_focus(ws, st)); - if(sw || st->level>=STACKING_LEVEL_MODAL1){ - WStacking *stf=find_to_focus(ws, st, FALSE); - - if(stf==st){ - /* Ok, the new region can be focused */ - group_refocus_(ws, stf); - } + if(sw){ + if(region_may_control_focus((WRegion*)ws)) + region_set_focus(st->reg); + else + ws->current_managed=st; } return TRUE; @@ -733,9 +699,11 @@ WRegion *group_do_attach(WGroup *ws, } -static void get_params(WGroup *ws, ExtlTab tab, WGroupAttachParams *par) +void group_get_attach_params(WGroup *ws, ExtlTab tab, + WGroupAttachParams *par) { int tmp; + bool tmpb; char *tmps; ExtlTab g; @@ -753,7 +721,7 @@ static void get_params(WGroup *ws, ExtlTab tab, WGroupAttachParams *par) if(extl_table_gets_i(tab, "level", &tmp)){ if(tmp>=0){ - par->level_set=STACKING_LEVEL_NORMAL; + par->level_set=1; par->level=tmp; } } @@ -763,9 +731,11 @@ static void get_params(WGroup *ws, ExtlTab tab, WGroupAttachParams *par) par->level_set=1; } - if(extl_table_is_bool_set(tab, "switchto")) - par->switchto=1; - + if(extl_table_gets_b(tab, "switchto", &tmpb)){ + par->switchto=(tmpb!=0); + par->switchto_set=1; + } + if(extl_table_gets_i(tab, "sizepolicy", &tmp)){ par->szplcy_set=1; par->szplcy=tmp; @@ -810,7 +780,7 @@ WRegion *group_attach(WGroup *ws, WRegion *reg, ExtlTab param) if(reg==NULL) return NULL; - get_params(ws, param, &par); + group_get_attach_params(ws, param, &par); data.type=REGION_ATTACH_REPARENT; data.u.reg=reg; @@ -844,7 +814,7 @@ WRegion *group_attach_new(WGroup *ws, ExtlTab param) WGroupAttachParams par=GROUPATTACHPARAMS_INIT; WRegionAttachData data; - get_params(ws, param, &par); + group_get_attach_params(ws, param, &par); data.type=REGION_ATTACH_LOAD; data.u.tab=param; @@ -862,29 +832,34 @@ WRegion *group_attach_new(WGroup *ws, ExtlTab param) static int stdisp_szplcy(const WMPlexSTDispInfo *di, WRegion *stdisp) { int pos=di->pos; + int policy=0, gravity=0; if(di->fullsize){ if(region_orientation(stdisp)==REGION_ORIENTATION_VERTICAL){ if(pos==MPLEX_STDISP_TL || pos==MPLEX_STDISP_BL) - return SIZEPOLICY_STRETCH_LEFT; + policy=SIZEPOLICY_STRETCH_LEFT; else - return SIZEPOLICY_STRETCH_RIGHT; + policy=SIZEPOLICY_STRETCH_RIGHT; }else{ if(pos==MPLEX_STDISP_TL || pos==MPLEX_STDISP_TR) - return SIZEPOLICY_STRETCH_TOP; + policy=SIZEPOLICY_STRETCH_TOP; else - return SIZEPOLICY_STRETCH_BOTTOM; + policy=SIZEPOLICY_STRETCH_BOTTOM; } }else{ - if(pos==MPLEX_STDISP_TL) - return SIZEPOLICY_GRAVITY_NORTHWEST; - else if(pos==MPLEX_STDISP_BL) - return SIZEPOLICY_GRAVITY_SOUTHWEST; - else if(pos==MPLEX_STDISP_TR) - return SIZEPOLICY_GRAVITY_NORTHEAST; - else /*if(pos=MPLEX_STDISP_BR)*/ - return SIZEPOLICY_GRAVITY_SOUTHEAST; + policy=SIZEPOLICY_GRAVITY; } + + if(pos==MPLEX_STDISP_TL) + gravity=SIZEPOLICY_VERT_TOP|SIZEPOLICY_HORIZ_LEFT; + else if(pos==MPLEX_STDISP_BL) + gravity=SIZEPOLICY_VERT_BOTTOM|SIZEPOLICY_HORIZ_LEFT; + else if(pos==MPLEX_STDISP_TR) + gravity=SIZEPOLICY_VERT_TOP|SIZEPOLICY_HORIZ_RIGHT; + else /*if(pos=MPLEX_STDISP_BR)*/ + gravity=SIZEPOLICY_VERT_BOTTOM|SIZEPOLICY_HORIZ_RIGHT; + + return (policy|gravity); } @@ -1382,9 +1357,6 @@ static DynFunTab group_dynfuntab[]={ {(DynFun*)region_get_configuration, (DynFun*)group_get_configuration}, - {(DynFun*)region_managed_disposeroot, - (DynFun*)group_managed_disposeroot}, - {(DynFun*)region_current, (DynFun*)group_current}, diff --git a/ioncore/group.h b/ioncore/group.h index f9e9647..1966ba2 100644 --- a/ioncore/group.h +++ b/ioncore/group.h @@ -72,6 +72,9 @@ DYNFUN WStacking *group_do_add_managed(WGroup *ws, WRegion *reg, extern WStacking *group_do_add_managed_default(WGroup *ws, WRegion *reg, int level, WSizePolicy szplcy); +extern void group_get_attach_params(WGroup *ws, ExtlTab tab, + WGroupAttachParams *par); + extern WRegion *group_do_attach(WGroup *ws, WGroupAttachParams *param, WRegionAttachData *data); diff --git a/ioncore/ioncore_tabnum.lua b/ioncore/ioncore_tabnum.lua index e9161b8..551dfaf 100644 --- a/ioncore/ioncore_tabnum.lua +++ b/ioncore/ioncore_tabnum.lua @@ -11,8 +11,12 @@ ioncore.tabnum={} local framestate={} local function do_show(frame) - frame:set_grattr('numbered', 'set') - framestate[frame]='set' + if obj_exists(frame) then + frame:set_grattr('numbered', 'set') + framestate[frame]='set' + else + framestate[frame]=nil + end end --DOC @@ -38,7 +42,9 @@ function ioncore.tabnum.clear() for f, s in pairs(st) do if s=='set' then - f:set_grattr('numbered', 'unset') + if obj_exists(f) then + f:set_grattr('numbered', 'unset') + end elseif obj_is(s, "WTimer") then s:reset() end diff --git a/ioncore/manage.c b/ioncore/manage.c index bcc8a53..69b7711 100644 --- a/ioncore/manage.c +++ b/ioncore/manage.c @@ -319,6 +319,7 @@ DECLSTRUCT(WRescueInfo){ WRegion *get_rescue; bool failed_get; bool test; + int flags; }; @@ -338,6 +339,43 @@ bool region_rescue_child_clientwins(WRegion *reg, WRescueInfo *info) } +/* Bah, unsplitissä oikestaan pitäisi tehä non-deep rescue */ + +bool region_do_rescue_this(WRegion *tosave_, WRescueInfo *info, int ph_flags) +{ + WClientWin *cwin=OBJ_CAST(tosave_, WClientWin); + WRegion *tosave=NULL; + + if(cwin!=NULL){ + if(cwin->flags&CLIENTWIN_UNMAP_RQ) + return TRUE; + tosave=(WRegion*)cwin; + }else if(info->flags®ION_RESCUE_NODEEP){ + tosave=tosave_; + }else{ + /* Try to rescue whole groups. */ + /*tosave=(WRegion*)OBJ_CAST(tosave_, WGroupCW);*/ + } + + if(tosave==NULL){ + return region_rescue_clientwins(tosave_, info); + }else if(info->test){ + return FALSE; + }else{ + int phf=(info->flags®ION_RESCUE_PHFLAGS_OK ? ph_flags : 0); + + if(info->ph==NULL){ + info->ph=region_get_rescue_pholder(info->get_rescue); + if(info->ph==NULL){ + info->failed_get=TRUE; + return FALSE; + } + } + return pholder_attach(info->ph, phf, tosave); + } +} + + bool region_rescue_some_clientwins(WRegion *reg, WRescueInfo *info, WRegionIterator *iter, void *st) { @@ -351,32 +389,14 @@ bool region_rescue_some_clientwins(WRegion *reg, WRescueInfo *info, while(TRUE){ WRegion *tosave=iter(st); - WClientWin *cwin; if(tosave==NULL) break; - - cwin=OBJ_CAST(tosave, WClientWin); - - if(cwin==NULL){ - if(!region_rescue_clientwins(tosave, info)){ - fails++; - if(info->failed_get) - break; - } - }else if(info->test){ + + if(!region_do_rescue_this(tosave, info, 0)){ fails++; - break; - }else if(!(cwin->flags&CLIENTWIN_UNMAP_RQ)){ - if(info->ph==NULL){ - info->ph=region_get_rescue_pholder(info->get_rescue); - if(info->ph==NULL){ - info->failed_get=TRUE; - break; - } - } - if(!pholder_attach(info->ph, 0, (WRegion*)cwin)) - fails++; + if(info->failed_get) + break; } } @@ -394,19 +414,20 @@ bool region_rescue_clientwins(WRegion *reg, WRescueInfo *info) } -bool region_rescue(WRegion *reg, WPHolder *ph_param) +bool region_rescue(WRegion *reg, WPHolder *ph, int flags) { WRescueInfo info; bool ret; - info.ph=ph_param; + info.ph=ph; + info.flags=flags; info.test=FALSE; info.get_rescue=reg; info.failed_get=FALSE; ret=region_rescue_clientwins(reg, &info); - if(info.ph!=ph_param) + if(info.ph!=ph) destroy_obj((Obj*)info.ph); return ret; @@ -418,6 +439,7 @@ bool region_rescue_needed(WRegion *reg) WRescueInfo info; info.ph=NULL; + info.flags=0; info.test=TRUE; info.get_rescue=reg; info.failed_get=FALSE; diff --git a/ioncore/manage.h b/ioncore/manage.h index d0faed2..dbe09ac 100644 --- a/ioncore/manage.h +++ b/ioncore/manage.h @@ -98,15 +98,19 @@ extern WPHolder *region_prepare_manage_transient_default(WRegion *reg, /* Rescue */ +#define REGION_RESCUE_PHFLAGS_OK 0x01 +#define REGION_RESCUE_NODEEP 0x02 + INTRSTRUCT(WRescueInfo); /* if ph is given, it is used, otherwise one is looked for when needed */ -extern bool region_rescue(WRegion *reg, WPHolder *ph); +extern bool region_rescue(WRegion *reg, WPHolder *ph, int flags); extern bool region_rescue_needed(WRegion *reg); extern bool region_rescue_clientwins(WRegion *reg, WRescueInfo *info); extern bool region_rescue_child_clientwins(WRegion *reg, WRescueInfo *info); extern bool region_rescue_some_clientwins(WRegion *reg, WRescueInfo *info, WRegionIterator *iter, void *st); +extern bool region_do_rescue_this(WRegion *tosave, WRescueInfo *info, int ph_flags); #endif /* ION_IONCORE_MANAGE_H */ diff --git a/ioncore/mplex.c b/ioncore/mplex.c index a9ea894..da1bd49 100644 --- a/ioncore/mplex.c +++ b/ioncore/mplex.c @@ -855,7 +855,7 @@ bool mplex_do_prepare_focus(WMPlex *mplex, WStacking *node, PtrList *hidelist=NULL; PtrList **hidelistp=(ew ? NULL : &hidelist); WStacking *foc; - bool within=FALSE; + /*bool within=FALSE;*/ if(sub==NULL && node==NULL) return FALSE; @@ -867,7 +867,7 @@ bool mplex_do_prepare_focus(WMPlex *mplex, WStacking *node, if(!region_prepare_focus((WRegion*)mplex, flags, res)) return FALSE; - foc=mplex_do_to_focus_on(mplex, node, sub, hidelistp, &within); + foc=mplex_do_to_focus_on(mplex, node, sub, hidelistp, NULL /*&within*/); if(foc!=NULL){ while(hidelist!=NULL){ @@ -886,7 +886,7 @@ bool mplex_do_prepare_focus(WMPlex *mplex, WStacking *node, res->reg=foc->reg; res->flags=flags; - return within; + return (foc==sub || (sub==NULL && foc==node)); }else{ return FALSE; } @@ -1169,7 +1169,6 @@ bool mplex_managed_rqorder(WMPlex *mplex, WRegion *reg, WRegionOrder order) static bool mplex_stack(WMPlex *mplex, WStacking *st) { WStacking *tmp=NULL; - Window bottom=None, top=None; WStacking **stackingp=mplex_get_stackingp(mplex); if(stackingp==NULL) @@ -1232,7 +1231,7 @@ bool mplex_do_attach_final(WMPlex *mplex, WRegion *reg, WMPlexPHolder *ph) sw=(!hidden && (param->flags&MPLEX_ATTACH_SWITCHTO || (param->flags&MPLEX_ATTACH_UNNUMBERED - ? modal + ? FALSE : (mplex_current_node(mplex)==NULL)))); hidden=(hidden || (!sw && !(param->flags&MPLEX_ATTACH_UNNUMBERED))); @@ -1270,14 +1269,19 @@ bool mplex_do_attach_final(WMPlex *mplex, WRegion *reg, WMPlexPHolder *ph) node->pseudomodal=(param->flags&MPLEX_ATTACH_PSEUDOMODAL ? 1 : 0); if(lnode!=NULL){ + WMPlexPHolder *ph2, *phn, *php; + llist_link_after(&(mplex->mx_list), (ph!=NULL ? ph->after : NULL), lnode); mplex->mx_count++; - /* Move following placeholders after new node */ - while(ph->next!=NULL) - mplexpholder_move(ph->next, mplex, NULL, lnode); + + /* Move placeholders after new node */ + for(php=NULL, ph2=ph; ph2!=NULL; php=ph2, ph2=phn){ + phn=ph2->next; + mplexpholder_move(ph2, mplex, php, lnode); + } } LINK_ITEM(mplex->mgd, node, mgr_next, mgr_prev); @@ -1307,9 +1311,20 @@ bool mplex_do_attach_final(WMPlex *mplex, WRegion *reg, WMPlexPHolder *ph) mplex_do_node_display(mplex, node, FALSE); else region_unmap(reg); - - if(sw && mcf) - mplex_refocus(mplex, node, FALSE); + + if(mcf){ + if(sw){ + mplex_refocus(mplex, node, FALSE); + }else if(!hidden && + (level>=STACKING_LEVEL_MODAL1 || OBJ_IS(reg, WGroup))){ + /* New modal regions may require focusing, so try to + * give focus back to currently active object. + * (There seems to be some problem with uncontained + * client windows still..) + */ + mplex_refocus(mplex, NULL, FALSE); + } + } if(lnode!=NULL) mplex_managed_changed(mplex, MPLEX_CHANGE_ADD, sw, reg); @@ -1666,7 +1681,20 @@ bool mplex_rescue_clientwins(WMPlex *mplex, WRescueInfo *info) { bool ret1, ret2; WMPlexIterTmp tmp; + WLListIterTmp ltmp; + WLListNode *lnode, *was_current=mplex->mx_current; + /* First all mx stuff to move them nicely to another mplex (when that + * is the case), switching to the current region in the target if + * allowed by ph_flags_mask region_rescue. + */ + FOR_ALL_NODES_ON_LLIST(lnode, mplex->mx_list, ltmp){ + int sw=(lnode==was_current ? PHOLDER_ATTACH_SWITCHTO : 0); + region_do_rescue_this(lnode->st->reg, info, sw); + } + + /* Then the rest (possibly retrying failed mx stuff). + */ mplex_iter_init(&tmp, mplex); ret1=region_rescue_some_clientwins((WRegion*)mplex, info, (WRegionIterator*)mplex_iter, diff --git a/ioncore/mplexpholder.c b/ioncore/mplexpholder.c index c3a57ce..8bb7ddb 100644 --- a/ioncore/mplexpholder.c +++ b/ioncore/mplexpholder.c @@ -15,6 +15,7 @@ #include "mplexpholder.h" #include "llist.h" #include "framedpholder.h" +#include "basicpholder.h" static void mplex_watch_handler(Watch *watch, Obj *mplex); @@ -102,7 +103,18 @@ static void mplex_watch_handler(Watch *watch, Obj *mplex) } -static WMPlexAttachParams dummy_param={0, 0, {0, 0, 0, 0}, 0, 0}; +static void mplex_get_attach_params(WMPlex *mplex, WStacking *st, + WMPlexAttachParams *param) +{ + param->flags=(MPLEX_ATTACH_SIZEPOLICY| + MPLEX_ATTACH_GEOM| + MPLEX_ATTACH_LEVEL| + (st->hidden ? MPLEX_ATTACH_HIDDEN : 0)| + (st->lnode==NULL ? MPLEX_ATTACH_UNNUMBERED : 0)); + param->szplcy=st->szplcy; + param->geom=REGION_GEOM(st->reg); + param->level=st->level; +} bool mplexpholder_init(WMPlexPHolder *ph, WMPlex *mplex, WStacking *st, @@ -122,25 +134,20 @@ bool mplexpholder_init(WMPlexPHolder *ph, WMPlex *mplex, WStacking *st, return FALSE; } - if(param==NULL) - param=&dummy_param; - if(st!=NULL){ - if(st->lnode!=NULL) + mplex_get_attach_params(mplex, st, &ph->param); + + if(st->lnode!=NULL){ mplexpholder_do_link(ph, mplex, LIST_LAST(st->lnode->phs, next, prev), st->lnode); - else - ph->param.flags|=MPLEX_ATTACH_UNNUMBERED; - - ph->param.flags|=(MPLEX_ATTACH_SIZEPOLICY| - MPLEX_ATTACH_GEOM| - MPLEX_ATTACH_LEVEL| - (st->hidden ? MPLEX_ATTACH_HIDDEN : 0)); - ph->param.szplcy=st->szplcy; - ph->param.geom=REGION_GEOM(st->reg); - ph->param.level=st->level; + } }else{ + static WMPlexAttachParams dummy_param={0, 0, {0, 0, 0, 0}, 0, 0}; + + if(param==NULL) + param=&dummy_param; + ph->param=*param; if(!(param->flags&MPLEX_ATTACH_UNNUMBERED)){ @@ -437,11 +444,51 @@ WMPlexPHolder *mplex_managed_get_pholder(WMPlex *mplex, WRegion *mgd) } -WMPlexPHolder *mplex_get_rescue_pholder_for(WMPlex *mplex, WRegion *mgd) +/*}}}*/ + + +/*{{ Rescue */ + + +WRegion *mplex_rescue_attach(WMPlex *mplex, int flags, WRegionAttachData *data) { + WMPlexAttachParams param; + + param.flags=0; + + /* Improved attach parametrisation hack for WMPlex source */ + if(data->type==REGION_ATTACH_REPARENT){ + WRegion *reg=data->u.reg; + WMPlex *src_mplex=REGION_MANAGER_CHK(reg, WMPlex); + if(src_mplex!=NULL){ + WStacking *st=ioncore_find_stacking(reg); + if(st!=NULL) + mplex_get_attach_params(src_mplex, st, ¶m); + } + } + + param.flags|=(MPLEX_ATTACH_INDEX| + (flags&PHOLDER_ATTACH_SWITCHTO ? MPLEX_ATTACH_SWITCHTO : 0)); + param.index=LLIST_INDEX_LAST; + + return mplex_do_attach(mplex, ¶m, data); +} + + +WPHolder *mplex_get_rescue_pholder_for(WMPlex *mplex, WRegion *mgd) +{ +#if 0 WStacking *st=mplex_find_stacking(mplex, mgd); + WMPlexAttachParams param; + + param.flags=MPLEX_ATTACH_INDEX; + param.index=LLIST_INDEX_LAST; - return create_mplexpholder(mplex, st, NULL); + return create_mplexpholder(mplex, st, ¶m); +#else + return (WPHolder*)create_basicpholder((WRegion*)mplex, + (WBasicPHolderHandler*)mplex_rescue_attach); +#endif } diff --git a/ioncore/mplexpholder.h b/ioncore/mplexpholder.h index 7528f6d..a017641 100644 --- a/ioncore/mplexpholder.h +++ b/ioncore/mplexpholder.h @@ -60,7 +60,7 @@ extern void mplex_move_phs_before(WMPlex *mplex, WLListNode *node); extern WMPlexPHolder *mplex_managed_get_pholder(WMPlex *mplex, WRegion *mgd); -extern WMPlexPHolder *mplex_get_rescue_pholder_for(WMPlex *mplex, - WRegion *mgd); +extern WPHolder *mplex_get_rescue_pholder_for(WMPlex *mplex, + WRegion *mgd); #endif /* ION_IONCORE_MPLEXPHOLDER_H */ diff --git a/ioncore/region.c b/ioncore/region.c index aaec0f0..2a8e9fe 100644 --- a/ioncore/region.c +++ b/ioncore/region.c @@ -283,7 +283,9 @@ bool region_prepare_focus(WRegion *reg, int flags, WPrepareFocusResult *res) { - if(!REGION_IS_ACTIVE(reg) || !REGION_IS_MAPPED(reg)){ + if(TRUE /* !REGION_IS_ACTIVE(reg) || + !REGION_IS_MAPPED(reg) || + ioncore_g.focus_next!=NULL*/){ WRegion *mgr=REGION_MANAGER(reg); WRegion *par=REGION_PARENT_REG(reg); @@ -494,7 +496,7 @@ bool region_dispose_(WRegion *reg, bool not_simple) WPHolder *ph=NULL; if(rescue){ - if(!region_rescue(reg, NULL)){ + if(!region_rescue(reg, NULL, 0)){ warn(TR("Failed to rescue some client windows - not closing.")); return FALSE; } diff --git a/ioncore/sizepolicy.c b/ioncore/sizepolicy.c index a99b7a3..e2cb4de 100644 --- a/ioncore/sizepolicy.c +++ b/ioncore/sizepolicy.c @@ -198,6 +198,18 @@ static void sizepolicy_free_snap(WSizePolicy *szplcy, WRegion *reg, } +static WSizePolicy org(WSizePolicy base, WSizePolicy g) +{ + if((base&SIZEPOLICY_VERT_MASK)==0) + base|=g&SIZEPOLICY_VERT_MASK; + + if((base&SIZEPOLICY_HORIZ_MASK)==0) + base|=g&SIZEPOLICY_HORIZ_MASK; + + return base; +} + + void sizepolicy(WSizePolicy *szplcy, WRegion *reg, const WRectangle *rq_geom, int rq_flags, WFitParams *fp) @@ -231,27 +243,27 @@ void sizepolicy(WSizePolicy *szplcy, WRegion *reg, break; case SIZEPOLICY_STRETCH_LEFT: - gravity_stretch_policy(SIZEPOLICY_HORIZ_LEFT|SIZEPOLICY_VERT_CENTER, + gravity_stretch_policy(org(*szplcy, SIZEPOLICY_HORIZ_LEFT|SIZEPOLICY_VERT_CENTER), reg, &tmp, fp, FALSE, TRUE); break; case SIZEPOLICY_STRETCH_RIGHT: - gravity_stretch_policy(SIZEPOLICY_HORIZ_RIGHT|SIZEPOLICY_VERT_CENTER, + gravity_stretch_policy(org(*szplcy, SIZEPOLICY_HORIZ_RIGHT|SIZEPOLICY_VERT_CENTER), reg, &tmp, fp, FALSE, TRUE); break; case SIZEPOLICY_STRETCH_TOP: - gravity_stretch_policy(SIZEPOLICY_VERT_TOP|SIZEPOLICY_HORIZ_CENTER, + gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_TOP|SIZEPOLICY_HORIZ_CENTER), reg, &tmp, fp, TRUE, FALSE); break; case SIZEPOLICY_STRETCH_BOTTOM: - gravity_stretch_policy(SIZEPOLICY_VERT_BOTTOM|SIZEPOLICY_HORIZ_CENTER, + gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_BOTTOM|SIZEPOLICY_HORIZ_CENTER), reg, &tmp, fp, TRUE, FALSE); break; case SIZEPOLICY_FULL_EXACT: - gravity_stretch_policy(SIZEPOLICY_VERT_CENTER|SIZEPOLICY_HORIZ_CENTER, + gravity_stretch_policy(org(*szplcy, SIZEPOLICY_VERT_CENTER|SIZEPOLICY_HORIZ_CENTER), reg, &tmp, fp, TRUE, TRUE); break; diff --git a/ioncore/stacking.c b/ioncore/stacking.c index c96c538..296e054 100644 --- a/ioncore/stacking.c +++ b/ioncore/stacking.c @@ -596,6 +596,12 @@ static bool mapped_filt(WStacking *st, void *unused) } +static bool mapped_filt_neq(WStacking *st, void *st_neq) +{ + return (st!=(WStacking*)st_neq && mapped_filt(st, NULL)); +} + + static bool mgr_filt(WStacking *st, void *mgr_) { return (st->reg!=NULL && REGION_MANAGER(st->reg)==(WRegion*)mgr_); @@ -622,5 +628,16 @@ uint stacking_min_level_mapped(WStacking *stacking) } +bool stacking_must_focus(WStacking *stacking, WStacking *st) +{ + WStacking *stf=stacking_find_to_focus(stacking, NULL, + mapped_filt_neq, NULL, st); + + return (stf==NULL || + (st->level>stf->level && + st->level>=STACKING_LEVEL_MODAL1)); +} + + /*}}}*/ diff --git a/ioncore/stacking.h b/ioncore/stacking.h index e325269..c08484e 100644 --- a/ioncore/stacking.h +++ b/ioncore/stacking.h @@ -98,6 +98,7 @@ uint stacking_min_level(WStacking *stacking, uint stacking_min_level_mapped(WStacking *stacking); +bool stacking_must_focus(WStacking *stacking, WStacking *st); WStacking *ioncore_find_stacking(WRegion *reg); void stacking_unassoc(WStacking *stacking); diff --git a/mod_query/mod_query.lua b/mod_query/mod_query.lua index f6e9e1e..15b03c2 100644 --- a/mod_query/mod_query.lua +++ b/mod_query/mod_query.lua @@ -238,13 +238,14 @@ mod_query.COLLECT_THRESHOLD=2000 --DOC -- This function can be used to read completions from an external source. -- The parameter \var{cp} is the completion proxy to be used, --- and the string \var{cmd} the shell command to be executed. To its stdout, --- the command should on the first line write the \var{common_beg} +-- and the string \var{cmd} the shell command to be executed, in the directory +-- \var{wd}. +-- To its stdout, the command should on the first line write the \var{common_beg} -- parameter of \fnref{WComplProxy.set_completions} (which \var{fn} maybe used -- to override) and a single actual completion on each of the successive lines. -- The function \var{reshnd} may be used to override a result table -- building routine. -function mod_query.popen_completions(cp, cmd, fn, reshnd) +function mod_query.popen_completions(cp, cmd, fn, reshnd, wd) local pst={cp=cp, maybe_stalled=0} @@ -317,7 +318,7 @@ function mod_query.popen_completions(cp, cmd, fn, reshnd) if not found_clean then pipes[rcv]=pst - ioncore.popen_bgread(cmd, coroutine.wrap(rcv)) + ioncore.popen_bgread(cmd, coroutine.wrap(rcv), nil, wd) end end @@ -746,7 +747,7 @@ local function find_point(strs, point) end -function mod_query.exec_completor(wedln, str, point) +function mod_query.exec_completor_(wd, wedln, str, point) local parts=break_cmdline(str) local complidx=find_point(parts, point+1) @@ -804,11 +805,16 @@ function mod_query.exec_completor(wedln, str, point) if ic then mod_query.popen_completions(wedln, ic..wp..string.shell_safe(s_compl), - set_fn, filter_fn) + set_fn, filter_fn, wd) end end +function mod_query.exec_completor(...) + mod_query.exec_completor_(nil, ...) +end + + local cmd_overrides={} @@ -838,9 +844,12 @@ end -- \file{ion-runinxterm}. Two colons ('::') will ask you to press -- enter after the command has finished. function mod_query.query_exec(mplex) - mod_query.query(mplex, TR("Run:"), nil, mod_query.exec_handler, - mod_query.exec_completor, - "run") + local function compl(...) + local wd=ioncore.get_dir_for(mplex) + mod_query.exec_completor_(wd, ...) + end + mod_query.query(mplex, TR("Run:"), nil, mod_query.exec_handler, + compl, "run") end diff --git a/mod_statusbar/Makefile b/mod_statusbar/Makefile index 6a0102e..b94da9e 100644 --- a/mod_statusbar/Makefile +++ b/mod_statusbar/Makefile @@ -11,10 +11,7 @@ include $(TOPDIR)/build/system-inc.mk INCLUDES += $(X11_INCLUDES) $(LIBTU_INCLUDES) $(LIBEXTL_INCLUDES) -I.. CFLAGS += $(XOPEN_SOURCE) $(C99_SOURCE) -SOURCES = main.c statusbar.c draw.c - -SUBDIRS = ion-statusd -INSTALL_SUBDIRS = $(SUBDIRS) +SOURCES = main.c statusbar.c draw.c statusd-launch.c MAKE_EXPORTS = mod_statusbar diff --git a/mod_statusbar/ion-statusd/Makefile b/mod_statusbar/ion-statusd/Makefile deleted file mode 100644 index 1ed1ac9..0000000 --- a/mod_statusbar/ion-statusd/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -## -## Ion-statusd Makefile -## - -# System-specific configuration is in system.mk -TOPDIR=../.. -include $(TOPDIR)/build/system-inc.mk - -###################################### - -INCLUDES += $(LIBMAINLOOP_INCLUDES) $(LIBEXTL_INCLUDES) $(LIBTU_INCLUDES) -LIBS += $(LIBMAINLOOP_LIBS) $(LIBEXTL_LIBS) $(LIBTU_LIBS) $(LUA_LIBS) $(DL_LIBS) -lm -CFLAGS += $(XOPEN_SOURCE) $(C99_SOURCE) - -DEFINES += -DETCDIR=\"$(ETCDIR)\" -DSHAREDIR=\"$(SHAREDIR)\" \ - -DEXTRABINDIR=\"$(EXTRABINDIR)\" -DMODULEDIR=\"$(MODULEDIR)\" \ - -DLCDIR=\"$(LCDIR)\" -DLOCALEDIR=\"$(LOCALEDIR)\" - -SOURCES = ion-statusd.c exec.c extlrx.c - -TARGETS = ion-statusd - -LUA_SOURCES = statusd_date.lua statusd_mail.lua statusd_load.lua - -MAKE_EXPORTS = statusd - -include $(TOPDIR)/libmainloop/rx.mk - -###################################### - -include $(TOPDIR)/build/rules.mk - -###################################### - -ion-statusd: $(OBJS) $(EXT_OBJS) - $(CC) $(LINKOPTS) $(OBJS) $(EXT_OBJS) $(LDFLAGS) -o $@ - -_install: lc_install - $(INSTALLDIR) $(EXTRABINDIR) - $(INSTALL) -s -m $(BIN_MODE) ion-statusd $(EXTRABINDIR) diff --git a/mod_statusbar/ion-statusd/exec.c b/mod_statusbar/ion-statusd/exec.c deleted file mode 100644 index a42c0dc..0000000 --- a/mod_statusbar/ion-statusd/exec.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ion/mod_statusbar/ion-statusd/exec.c - * - * Copyright (c) Tuomo Valkonen 2005-2006. - * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - */ - - -#include -#include - - -/*EXTL_DOC - * Run \var{cmd} in the background. - */ -EXTL_SAFE -EXTL_EXPORT -int statusd_exec(const char *cmd) -{ - return mainloop_spawn(cmd); -} - - -/*EXTL_DOC - * Run \var{cmd} with a read pipe connected to its stdout. - * When data is received through the pipe, \var{h} is called - * with that data. - */ -EXTL_SAFE -EXTL_EXPORT -int statusd_popen_bgread(const char *cmd, ExtlFn h, ExtlFn errh) -{ - return mainloop_popen_bgread(cmd, NULL, NULL, h, errh); -} - diff --git a/mod_statusbar/ion-statusd/extlrx.c b/mod_statusbar/ion-statusd/extlrx.c deleted file mode 100644 index 9b6ac58..0000000 --- a/mod_statusbar/ion-statusd/extlrx.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * ion/mod_statusbar/ion-statusd/extlrx.c - * - * Copyright (c) Tuomo Valkonen 2004-2006. - * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - */ - -#include -#include -#include - - -/*{{{ libtu */ - - -/*EXTL_DOC - * Issue a warning. How the message is displayed depends on the current - * warning handler. - */ -EXTL_EXPORT -void statusd_warn(const char *str) -{ - warn("%s", str); -} - - -EXTL_EXPORT -const char *statusd_gettext(const char *s) -{ - if(s==NULL) - return NULL; - else - return TR(s); -} - - -/*}}}*/ - diff --git a/mod_statusbar/ion-statusd/ion-statusd.c b/mod_statusbar/ion-statusd/ion-statusd.c deleted file mode 100644 index c44aca3..0000000 --- a/mod_statusbar/ion-statusd/ion-statusd.c +++ /dev/null @@ -1,311 +0,0 @@ -/* - * ion/mod_statusbar/ion-statusd/ion-statusd.c - * - * Copyright (c) Tuomo Valkonen 2004-2006. - * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef CF_NO_LOCALE -#include -#endif - -#include "../../version.h" - - -static OptParserOpt ion_opts[]={ - /*{OPT_ID('d'), "display", OPT_ARG, "host:dpy.scr", - DUMMY_TR("X display to use")},*/ - - {'c', "conffile", OPT_ARG, "config_file", - DUMMY_TR("Configuration file")}, - - {'s', "searchdir", OPT_ARG, "dir", - DUMMY_TR("Add directory to search path")}, - - /*{OPT_ID('s'), "session", OPT_ARG, "session_name", - DUMMY_TR("Name of session (affects savefiles)")},*/ - - {'h', "help", 0, NULL, - DUMMY_TR("Show this help")}, - - {'V', "version", 0, NULL, - DUMMY_TR("Show program version")}, - - {OPT_ID('a'), "about", 0, NULL, - DUMMY_TR("Show about text")}, - - {'q', "quiet", 0, NULL, - DUMMY_TR("Quiet mode")}, - - {'m', "meter", OPT_ARG, "meter_module", - DUMMY_TR("Load a meter module")}, - - END_OPTPARSEROPTS -}; - - -static const char statusd_copy[]= - "Ion-statusd " ION_VERSION ", copyright (c) Tuomo Valkonen 2004-2005."; - - -static const char statusd_license[]=DUMMY_TR( - "This program is free software; you can redistribute it and/or\n" - "modify it under the terms of the GNU Lesser General Public\n" - "License as published by the Free Software Foundation; either\n" - "version 2.1 of the License, or (at your option) any later version.\n" - "\n" - "This program is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" - "Lesser General Public License for more details.\n"); - - -/* new_informs=TRUE because we should always print period when - * initialisation is done. - */ -static bool new_informs=TRUE; -static ExtlTab configtab; - -static void help() -{ - int i; - printf(TR("Usage: %s [options]\n\n"), libtu_progname()); - for(i=0; ion_opts[i].descr!=NULL; i++) - ion_opts[i].descr=TR(ion_opts[i].descr); - optparser_printhelp(OPTP_MIDLONG, ion_opts); - printf("\n"); -} - - -static void flush_informs() -{ - if(new_informs){ - printf(".\n"); - fflush(stdout); - new_informs=FALSE; - } -} - - -static void mainloop() -{ - sigset_t trapset; - - sigemptyset(&trapset); - sigaddset(&trapset, SIGALRM); - sigaddset(&trapset, SIGCHLD); - mainloop_trap_signals(&trapset); - - while(1){ - int kill_sig=mainloop_check_signals(); - if(kill_sig!=0 && kill_sig!=SIGUSR1){ - if(kill_sig==SIGTERM) - exit(EXIT_FAILURE); - else - kill(getpid(), kill_sig); - } - - mainloop_execute_deferred(); - - flush_informs(); - - mainloop_select(); - } -} - - -extern bool statusd_register_exports(); -extern void statusd_unregister_exports(); - - -static void stdout_closed(int fd, void *data) -{ - exit(EXIT_SUCCESS); -} - - -int main(int argc, char*argv[]) -{ - const char *mod=NULL; - char *mod2=NULL; - int loaded=0; - int opt; - bool quiet=FALSE; - -#ifndef CF_NO_LOCALE - if(setlocale(LC_ALL, "")==NULL) - warn("setlocale() call failed."); -#endif - - configtab=extl_table_none(); - - libtu_init(argv[0]); - extl_init(); - - if(!statusd_register_exports()) - return EXIT_FAILURE; - - extl_add_searchdir(EXTRABINDIR); - extl_add_searchdir(MODULEDIR); - extl_add_searchdir(ETCDIR); - extl_add_searchdir(SHAREDIR); - extl_add_searchdir(LCDIR); - extl_set_userdirs("ion3"); - - optparser_init(argc, argv, OPTP_MIDLONG, ion_opts); - - extl_read_config("ioncore_luaext", NULL, TRUE); - - while((opt=optparser_get_opt())){ - switch(opt){ - /*case OPT_ID('d'): - display=optparser_get_arg(); - break;*/ - case 's': - extl_add_searchdir(optparser_get_arg()); - break; - /*case OPT_ID('s'): - extl_set_sessiondir(optparser_get_arg()); - break;*/ - case 'h': - help(); - return EXIT_SUCCESS; - case 'V': - printf("%s\n", ION_VERSION); - return EXIT_SUCCESS; - case OPT_ID('a'): - printf("%s\n\n%s", statusd_copy, TR(statusd_license)); - return EXIT_SUCCESS; - case 'c': - { - ExtlTab t; - const char *f=optparser_get_arg(); - if(extl_read_savefile(f, &t)){ - extl_unref_table(configtab); - configtab=t; - }else{ - warn(TR("Unable to load configuration file %s"), f); - } - } - break; - case 'q': - quiet=TRUE; - break; - case 'm': - mod=optparser_get_arg(); - if(strchr(mod, '/')==NULL && strchr(mod, '.')==NULL){ - mod2=scat("statusd_", mod); - if(mod2==NULL) - return EXIT_FAILURE; - mod=mod2; - } - if(extl_read_config(mod, NULL, !quiet)) - loaded++; - if(mod2!=NULL) - free(mod2); - break; - default: - warn(TR("Invalid command line.")); - help(); - return EXIT_FAILURE; - } - } - - if(loaded==0 && !quiet){ - warn(TR("No meters loaded.")); - return EXIT_FAILURE; - } - - mainloop(); - - return EXIT_SUCCESS; -} - - -/*EXTL_DOC - * Inform that meter \var{name} has value \var{value}. - */ -EXTL_EXPORT -void statusd_inform(const char *name, const char *value) -{ - printf("%s: %s\n", name, value); - new_informs=TRUE; -} - - -/*EXTL_DOC - * Get configuration table for module \var{name} - */ -EXTL_EXPORT -ExtlTab statusd_get_config(const char *name) -{ - if(name==NULL){ - return extl_ref_table(configtab); - }else{ - ExtlTab t; - if(extl_table_gets_t(configtab, name, &t)) - return t; - else - return extl_create_table(); - } -} - - -/*EXTL_DOC - * Get last file modification time. - */ -EXTL_EXPORT -double statusd_last_modified(const char *fname) -{ - struct stat st; - - if(fname==NULL) - return (double)(-1); - - if(stat(fname, &st)!=0){ - /*warn_err_obj(fname);*/ - return (double)(-1); - } - - return (double)(st.st_mtime>st.st_ctime ? st.st_mtime : st.st_ctime); -} - - -EXTL_EXPORT -ExtlTab statusd_getloadavg() -{ - ExtlTab t=extl_create_table(); - double l[3]; - int n; - - n=getloadavg(l, 3); - - if(n>=1) - extl_table_sets_d(t, "1min", l[0]); - if(n>=2) - extl_table_sets_d(t, "5min", l[1]); - if(n>=3) - extl_table_sets_d(t, "15min", l[2]); - - return t; -} - diff --git a/mod_statusbar/ion-statusd/statusd_date.lua b/mod_statusbar/ion-statusd/statusd_date.lua deleted file mode 100644 index ea36258..0000000 --- a/mod_statusbar/ion-statusd/statusd_date.lua +++ /dev/null @@ -1,41 +0,0 @@ --- --- ion/mod_statusbar/ion-statusd/statusd_date.lua --- --- Copyright (c) Tuomo Valkonen 2004-2006. --- --- Ion is free software; you can redistribute it and/or modify it under --- the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- - - -local timer - -local defaults={ - date_format='%a %Y-%m-%d %H:%M', - formats={}, -} - -local settings=table.join(statusd.get_config('date'), defaults) - -local function update() - local tm=os.time() - statusd.inform('date', os.date(settings.date_format, tm)) - for k, f in pairs(settings.formats) do - statusd.inform('date_'..k, os.date(f, tm)) - end - return tm -end - -local function timer_handler(tmr) - local tm=update() - - local t=os.date('*t', tm) - local d=(60-t.sec)*1000 - - timer:set(d, timer_handler) -end - -timer=statusd.create_timer() -timer_handler(timer) diff --git a/mod_statusbar/ion-statusd/statusd_load.lua b/mod_statusbar/ion-statusd/statusd_load.lua deleted file mode 100644 index 88162af..0000000 --- a/mod_statusbar/ion-statusd/statusd_load.lua +++ /dev/null @@ -1,70 +0,0 @@ --- --- ion/mod_statusbar/ion-statusd/statusd_load.lua --- --- Copyright (c) Tuomo Valkonen 2004-2006. --- --- Ion is free software; you can redistribute it and/or modify it under --- the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- - --- --- We should really use getloadavg(3) instead and move the meter to --- Ion side to get properly up-to-date loads. But until such an export --- is made, and we use potentially blocking files and external programs, --- this meter must be in ion-statusd. --- - -local defaults={ - update_interval=10*1000, - load_hint="1min", - important_threshold=1.5, - critical_threshold=4.0 -} - -local settings=table.join(statusd.get_config("load"), defaults) - -local load_timer - -local function get_hint(v) - local i="normal" - if v then - if v>settings.critical_threshold then - i="critical" - elseif v>settings.important_threshold then - i="important" - end - end - return i -end - -local function fmt(l) - if not l then - return "?" - else - return string.format("%0.2f", l) - end -end - -local function update_load() - local lds = statusd.getloadavg() - f1, f5, f15 = fmt(lds["1min"]), fmt(lds["5min"]), fmt(lds["15min"]) - statusd.inform("load", f1..", "..f5..", "..f15) - statusd.inform("load_hint", get_hint(lds[settings.load_hint])) - statusd.inform("load_1min", f1) - statusd.inform("load_1min_hint", get_hint(lds["1min"])) - statusd.inform("load_5min", f5) - statusd.inform("load_5min_hint", get_hint(lds["5min"])) - statusd.inform("load_15min", f15) - statusd.inform("load_15min_hint", get_hint(lds["15min"])) - load_timer:set(settings.update_interval, update_load) -end - --- Init ---statusd.inform("load_template", "0.00, 0.00, 0.00"); - -load_timer=statusd.create_timer() -update_load() - - diff --git a/mod_statusbar/ion-statusd/statusd_mail.lua b/mod_statusbar/ion-statusd/statusd_mail.lua deleted file mode 100644 index 71cfea9..0000000 --- a/mod_statusbar/ion-statusd/statusd_mail.lua +++ /dev/null @@ -1,156 +0,0 @@ --- --- ion/mod_statusbar/ion-statusd/statusd_mail.lua --- --- Copyright (c) Tuomo Valkonen 2004-2006. --- --- Ion is free software; you can redistribute it and/or modify it under --- the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- - --- The keyword for this monitor -local mon = "mail" - -local defaults={ - update_interval=10*1000, - retry_interval=60*10*1000, - mbox = os.getenv("MAIL"), - files = {} -} - -local settings=table.join(statusd.get_config(mon), defaults) - -local function TR(s, ...) - return string.format(statusd.gettext(s), unpack(arg)) -end - -local function check_spool() - if not settings.mbox then - statusd.warn(TR("MAIL environment variable not set ".. - "and no spool given.")) - end -end - -if not settings.files["spool"] then - check_spool() - settings.files["spool"] = settings.mbox -elseif not(settings.files["spool"] == mbox) then - statusd.warn(TR("%s.mbox does not match %s.files['spool']; using %s.mbox", - mon, mon, mon)) - check_spool() - settings.files["spool"] = settings.mbox -end - -local function calcmail(fname) - local f, err=io.open(fname, 'r') - local total, read, old=0, 0, 0 - local had_blank=true - local in_headers=false - local had_status=false - - if not f then - statusd.warn(err) - return - end - - for l in f:lines() do - if had_blank and string.find(l, '^From ') then - total=total+1 - had_status=false - in_headers=true - had_blank=false - else - had_blank=false - if l=="" then - if in_headers then - in_headers=false - end - had_blank=true - elseif in_headers and not had_status then - local st, en, stat=string.find(l, '^Status:(.*)') - if stat then - had_status=true - if string.find(l, 'R') then - read=read+1 - end - if string.find(l, 'O') then - old=old+1 - end - end - end - end - end - - f:close() - - return total, total-read, total-old -end - - -local mail_timer -local mail_timestamps = {} -function init_timestamps () - for key, val in pairs(settings.files) do - mail_timestamps[key]=-2.0 - end -end -init_timestamps() - -local function update_mail() - local failed - for key, mbox in pairs(settings.files) do - if not mbox then - error(TR(key.." not set")) - end - - local old_tm=mail_timestamps[key] - mail_timestamps[key]=statusd.last_modified(mbox) - - if mail_timestamps[key]>old_tm then - local mail_total, mail_unread, mail_new=calcmail(mbox) - if failed == nil then - failed = not mail_total - else - failed = failed and (not mail_total) - end - - if key == "spool" then - meter=mon - else - meter=mon.."_"..key - end - if mail_total then - statusd.inform(meter.."_new", tostring(mail_new)) - statusd.inform(meter.."_unread", tostring(mail_unread)) - statusd.inform(meter.."_total", tostring(mail_total)) - - if mail_new>0 then - statusd.inform(meter.."_new_hint", "important") - else - statusd.inform(meter.."_new_hint", "normal") - end - - if mail_unread>0 then - statusd.inform(meter.."_unread_hint", "important") - else - statusd.inform(meter.."_unread_hint", "normal") - end - end - end - end - - if failed then - statusd.warn(TR("Disabling mail monitor for %d seconds.", - settings.retry_interval/1000)) - init_timestamps() - mail_timer:set(settings.retry_interval, update_mail) - return - end - - mail_timer:set(settings.update_interval, update_mail) -end - -mail_timer=statusd.create_timer() -update_mail() - diff --git a/mod_statusbar/main.c b/mod_statusbar/main.c index 2e84bf3..4f95e2d 100644 --- a/mod_statusbar/main.c +++ b/mod_statusbar/main.c @@ -6,17 +6,8 @@ * See the included file LICENSE for details. */ -#include -#include -#include -#include -#include - #include #include -#include -#include -#include #include #include #include @@ -26,9 +17,6 @@ #include "exports.h" -#define CF_STATUSD_TIMEOUT_SEC 3 - - /*{{{ Module information */ @@ -49,164 +37,6 @@ WBindmap *mod_statusbar_statusbar_bindmap=NULL; /*}}}*/ -/*{{{ Statusd launch helper */ - - -#define BL 1024 - - -static bool process_pipe(int fd, ExtlFn fn, - bool *doneseen, bool *eagain) -{ - char buf[BL]; - int n; - bool fnret; - - *eagain=FALSE; - - n=read(fd, buf, BL-1); - - if(n<0){ - if(errno==EAGAIN || errno==EINTR){ - *eagain=(errno==EAGAIN); - return TRUE; - } - warn_err_obj(TR("reading a pipe")); - return FALSE; - }else if(n>0){ - buf[n]='\0'; - *doneseen=FALSE; - return extl_call(fn, "s", "b", &buf, doneseen); - } - - return FALSE; -} - - -#define USEC 1000000 - - -static bool wait_statusd_init(int outfd, int errfd, ExtlFn dh, ExtlFn eh) -{ - fd_set rfds; - struct timeval tv, endtime, now; - int nfds=maxof(outfd, errfd); - int retval; - bool dummy, doneseen, eagain=FALSE; - - if(mainloop_gettime(&endtime)!=0){ - warn_err(); - return FALSE; - } - - now=endtime; - endtime.tv_sec+=CF_STATUSD_TIMEOUT_SEC; - - while(1){ - FD_ZERO(&rfds); - - /* Calculate remaining time */ - if(now.tv_sec>endtime.tv_sec){ - goto timeout; - }else if(now.tv_sec==endtime.tv_sec){ - if(now.tv_usec>=endtime.tv_usec) - goto timeout; - tv.tv_sec=0; - tv.tv_usec=endtime.tv_usec-now.tv_usec; - }else{ - tv.tv_usec=USEC+endtime.tv_usec-now.tv_usec; - tv.tv_sec=-1+endtime.tv_sec-now.tv_sec; - /* Kernel lameness tuner: */ - tv.tv_sec+=tv.tv_usec/USEC; - tv.tv_usec%=USEC; - } - - FD_SET(outfd, &rfds); - FD_SET(errfd, &rfds); - - retval=select(nfds+1, &rfds, NULL, NULL, &tv); - if(retval>0){ - if(FD_ISSET(errfd, &rfds)){ - if(!process_pipe(errfd, eh, &dummy, &eagain)) - return FALSE; - } - if(FD_ISSET(outfd, &rfds)){ - if(!process_pipe(outfd, dh, &doneseen, &eagain)) - return FALSE; - if(doneseen){ - /* Read rest of errors. */ - bool ok; - do{ - ok=process_pipe(errfd, eh, &dummy, &eagain); - }while(ok && !eagain); - return TRUE; - } - } - }else if(retval==0){ - goto timeout; - } - - if(mainloop_gettime(&now)!=0){ - warn_err(); - return FALSE; - } - } - - return TRUE; - -timeout: - /* Just complain to stderr, not startup error log, and do not fail. - * The system might just be a bit slow. We can continue, but without - * initial values for the meters, geometry adjustments may be necessary - * when we finally get that information. - */ - ioncore_warn_nolog(TR("ion-statusd timed out.")); - return TRUE; -} - - -EXTL_EXPORT -int mod_statusbar__launch_statusd(const char *cmd, - ExtlFn initdatahandler, - ExtlFn initerrhandler, - ExtlFn datahandler, - ExtlFn errhandler) -{ - pid_t pid; - int outfd=-1, errfd=-1; - - if(cmd==NULL) - return -1; - - pid=mainloop_do_spawn(cmd, NULL, NULL, - NULL, &outfd, &errfd); - - if(pid<0) - return -1; - - if(!wait_statusd_init(outfd, errfd, initdatahandler, initerrhandler)) - goto err; - - if(!mainloop_register_input_fd_extlfn(outfd, datahandler)) - goto err; - - if(!mainloop_register_input_fd_extlfn(errfd, errhandler)) - goto err2; - - return pid; - -err2: - mainloop_unregister_input_fd(outfd); -err: - close(outfd); - close(errfd); - return -1; -} - - -/*}}}*/ - - /*{{{ Systray */ diff --git a/mod_statusbar/mod_statusbar.lua b/mod_statusbar/mod_statusbar.lua index 1eec051..b2bcbe7 100644 --- a/mod_statusbar/mod_statusbar.lua +++ b/mod_statusbar/mod_statusbar.lua @@ -191,7 +191,7 @@ function mod_statusbar.rcv_statusd(str) end -local function get_modules() +function mod_statusbar.get_modules() local mods={} local specials={["filler"]=true, ["systray"]=true} @@ -233,8 +233,6 @@ function mod_statusbar.rcv_statusd_err(str) end end -local tried_to_launch=false - --DOC -- Load modules and launch \file{ion-statusd} with configuration -- table \var{cfg}. The options for each \file{ion-statusd} monitor @@ -244,9 +242,11 @@ function mod_statusbar.launch_statusd(cfg) return end - tried_to_launch=true + -- Launch tried, don't do it automatically after reading + -- configuration. + mod_statusbar.no_autolaunch=true - local mods=get_modules() + local mods=mod_statusbar.get_modules() -- Load modules for m in pairs(mods) do @@ -354,6 +354,6 @@ package.loaded["mod_statusbar"]=true dopath('cfg_statusbar', true) -- Launch statusd if the user didn't launch it. -if not tried_to_launch then +if not mod_statusbar.no_autolaunch then mod_statusbar.launch_statusd() end diff --git a/mod_statusbar/statusd-launch.c b/mod_statusbar/statusd-launch.c new file mode 100644 index 0000000..c07fa2f --- /dev/null +++ b/mod_statusbar/statusd-launch.c @@ -0,0 +1,179 @@ +/* + * ion/mod_statusbar/statusd-launch.c + * + * Copyright (c) Tuomo Valkonen 1999-2007. + * + * See the included file LICENSE for details. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "statusbar.h" + + +#define CF_STATUSD_TIMEOUT_SEC 3 + +#define BL 1024 + +#define USEC 1000000 + + +static bool process_pipe(int fd, ExtlFn fn, + bool *doneseen, bool *eagain) +{ + char buf[BL]; + int n; + bool fnret; + + *eagain=FALSE; + + n=read(fd, buf, BL-1); + + if(n<0){ + if(errno==EAGAIN || errno==EINTR){ + *eagain=(errno==EAGAIN); + return TRUE; + } + warn_err_obj(TR("reading a pipe")); + return FALSE; + }else if(n>0){ + buf[n]='\0'; + *doneseen=FALSE; + return extl_call(fn, "s", "b", &buf, doneseen); + } + + return FALSE; +} + + +static bool wait_statusd_init(int outfd, int errfd, ExtlFn dh, ExtlFn eh) +{ + fd_set rfds; + struct timeval tv, endtime, now; + int nfds=maxof(outfd, errfd); + int retval; + bool dummy, doneseen, eagain=FALSE; + + if(mainloop_gettime(&endtime)!=0){ + warn_err(); + return FALSE; + } + + now=endtime; + endtime.tv_sec+=CF_STATUSD_TIMEOUT_SEC; + + while(1){ + FD_ZERO(&rfds); + + /* Calculate remaining time */ + if(now.tv_sec>endtime.tv_sec){ + goto timeout; + }else if(now.tv_sec==endtime.tv_sec){ + if(now.tv_usec>=endtime.tv_usec) + goto timeout; + tv.tv_sec=0; + tv.tv_usec=endtime.tv_usec-now.tv_usec; + }else{ + tv.tv_usec=USEC+endtime.tv_usec-now.tv_usec; + tv.tv_sec=-1+endtime.tv_sec-now.tv_sec; + /* Kernel lameness tuner: */ + tv.tv_sec+=tv.tv_usec/USEC; + tv.tv_usec%=USEC; + } + + FD_SET(outfd, &rfds); + FD_SET(errfd, &rfds); + + retval=select(nfds+1, &rfds, NULL, NULL, &tv); + if(retval>0){ + if(FD_ISSET(errfd, &rfds)){ + if(!process_pipe(errfd, eh, &dummy, &eagain)) + return FALSE; + } + if(FD_ISSET(outfd, &rfds)){ + if(!process_pipe(outfd, dh, &doneseen, &eagain)) + return FALSE; + if(doneseen){ + /* Read rest of errors. */ + bool ok; + do{ + ok=process_pipe(errfd, eh, &dummy, &eagain); + }while(ok && !eagain); + return TRUE; + } + } + }else if(retval==0){ + goto timeout; + } + + if(mainloop_gettime(&now)!=0){ + warn_err(); + return FALSE; + } + } + + return TRUE; + +timeout: + /* Just complain to stderr, not startup error log, and do not fail. + * The system might just be a bit slow. We can continue, but without + * initial values for the meters, geometry adjustments may be necessary + * when we finally get that information. + */ + ioncore_warn_nolog(TR("ion-statusd timed out.")); + return TRUE; +} + + +EXTL_EXPORT +int mod_statusbar__launch_statusd(const char *cmd, + ExtlFn initdatahandler, + ExtlFn initerrhandler, + ExtlFn datahandler, + ExtlFn errhandler) +{ + pid_t pid; + int outfd=-1, errfd=-1; + + if(cmd==NULL) + return -1; + + pid=mainloop_do_spawn(cmd, NULL, NULL, + NULL, &outfd, &errfd); + + if(pid<0) + return -1; + + if(!wait_statusd_init(outfd, errfd, initdatahandler, initerrhandler)) + goto err; + + if(!mainloop_register_input_fd_extlfn(outfd, datahandler)) + goto err; + + if(!mainloop_register_input_fd_extlfn(errfd, errhandler)) + goto err2; + + return pid; + +err2: + mainloop_unregister_input_fd(outfd); +err: + close(outfd); + close(errfd); + return -1; +} + diff --git a/mod_tiling/placement.h b/mod_tiling/placement.h index f9d9338..9279cb7 100644 --- a/mod_tiling/placement.h +++ b/mod_tiling/placement.h @@ -24,9 +24,7 @@ typedef struct{ WFrame *res_frame; } WTilingPlacementParams; -/* Handlers of this hook should take (WClientWin*, WTiling*, WManageParams*) - * as parameter. - */ +/* Handlers of this hook should take WTilingPlacementParams* as parameter. */ extern WHook *tiling_placement_alt; extern WPHolder *tiling_prepare_manage(WTiling *ws, const WClientWin *cwin, diff --git a/mod_tiling/split.c b/mod_tiling/split.c index 568a2d1..c0a20b8 100644 --- a/mod_tiling/split.c +++ b/mod_tiling/split.c @@ -1234,13 +1234,23 @@ static void splitsplit_remove(WSplitSplit *node, WSplit *child, static int nstdisp=0; WSplitInner *parent; WSplit *other; + int hprimn=PRIMN_ANY, vprimn=PRIMN_ANY; assert(node->tl==child || node->br==child); - if(node->tl==child) + if(node->tl==child){ other=node->br; - else + if(node->dir==SPLIT_VERTICAL) + vprimn=PRIMN_TL; + else + hprimn=PRIMN_TL; + }else{ other=node->tl; + if(node->dir==SPLIT_VERTICAL) + vprimn=PRIMN_BR; + else + hprimn=PRIMN_BR; + } assert(other!=NULL); @@ -1262,7 +1272,7 @@ static void splitsplit_remove(WSplitSplit *node, WSplit *child, splittree_changeroot((WSplit*)node, other); if(reclaim_space) - split_resize(other, &(((WSplit*)node)->geom), PRIMN_ANY, PRIMN_ANY); + split_resize(other, &(((WSplit*)node)->geom), hprimn, vprimn); child->parent=NULL; diff --git a/mod_tiling/tiling.c b/mod_tiling/tiling.c index e3d706d..e933dc7 100644 --- a/mod_tiling/tiling.c +++ b/mod_tiling/tiling.c @@ -993,10 +993,6 @@ static WFrame *tiling_do_split(WTiling *ws, WSplit *node, destroy_obj((Obj*)newframe); return NULL; } - - /* Restack */ - if(ws->split_tree!=NULL) - split_restack(ws->split_tree, ws->dummywin, Above); return newframe; } @@ -1086,7 +1082,7 @@ void tiling_unsplit_at(WTiling *ws, WRegion *reg) ph=region_get_rescue_pholder_for((WRegion*)ws, reg); if(ph!=NULL){ - region_rescue(reg, ph); + region_rescue(reg, ph, REGION_RESCUE_NODEEP|REGION_RESCUE_PHFLAGS_OK); destroy_obj((Obj*)ph); } diff --git a/mod_tiling/tiling.h b/mod_tiling/tiling.h index 26737ab..990dd55 100644 --- a/mod_tiling/tiling.h +++ b/mod_tiling/tiling.h @@ -85,7 +85,6 @@ extern void tiling_managed_rqgeom(WTiling *ws, WRegion *reg, const WRQGeomParams *rq, WRectangle *geomret); extern void tiling_managed_remove(WTiling *ws, WRegion *reg); -extern void tiling_managed_activated(WTiling *ws, WRegion *reg); extern bool tiling_rescue_clientwins(WTiling *ws, WRescueInfo *ph); extern WPHolder *tiling_get_rescue_pholder_for(WTiling *ws, WRegion *mgd); extern void tiling_do_set_focus(WTiling *ws, bool warp); diff --git a/utils/Makefile b/utils/Makefile index 2c58b50..34a35c4 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/build/system-inc.mk ###################################### -SUBDIRS=ion-completefile +SUBDIRS=ion-completefile ion-statusd INSTALL_SUBDIRS=$(SUBDIRS) SHELLSCRIPTS = ion-runinxterm ion-completeman diff --git a/utils/ion-statusd/Makefile b/utils/ion-statusd/Makefile new file mode 100644 index 0000000..1ed1ac9 --- /dev/null +++ b/utils/ion-statusd/Makefile @@ -0,0 +1,40 @@ +## +## Ion-statusd Makefile +## + +# System-specific configuration is in system.mk +TOPDIR=../.. +include $(TOPDIR)/build/system-inc.mk + +###################################### + +INCLUDES += $(LIBMAINLOOP_INCLUDES) $(LIBEXTL_INCLUDES) $(LIBTU_INCLUDES) +LIBS += $(LIBMAINLOOP_LIBS) $(LIBEXTL_LIBS) $(LIBTU_LIBS) $(LUA_LIBS) $(DL_LIBS) -lm +CFLAGS += $(XOPEN_SOURCE) $(C99_SOURCE) + +DEFINES += -DETCDIR=\"$(ETCDIR)\" -DSHAREDIR=\"$(SHAREDIR)\" \ + -DEXTRABINDIR=\"$(EXTRABINDIR)\" -DMODULEDIR=\"$(MODULEDIR)\" \ + -DLCDIR=\"$(LCDIR)\" -DLOCALEDIR=\"$(LOCALEDIR)\" + +SOURCES = ion-statusd.c exec.c extlrx.c + +TARGETS = ion-statusd + +LUA_SOURCES = statusd_date.lua statusd_mail.lua statusd_load.lua + +MAKE_EXPORTS = statusd + +include $(TOPDIR)/libmainloop/rx.mk + +###################################### + +include $(TOPDIR)/build/rules.mk + +###################################### + +ion-statusd: $(OBJS) $(EXT_OBJS) + $(CC) $(LINKOPTS) $(OBJS) $(EXT_OBJS) $(LDFLAGS) -o $@ + +_install: lc_install + $(INSTALLDIR) $(EXTRABINDIR) + $(INSTALL) -s -m $(BIN_MODE) ion-statusd $(EXTRABINDIR) diff --git a/utils/ion-statusd/exec.c b/utils/ion-statusd/exec.c new file mode 100644 index 0000000..9ccc2d9 --- /dev/null +++ b/utils/ion-statusd/exec.c @@ -0,0 +1,39 @@ +/* + * ion/utils/ion-statusd/exec.c + * + * Copyright (c) Tuomo Valkonen 2005-2006. + * + * Ion is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + */ + + +#include +#include + + +/*EXTL_DOC + * Run \var{cmd} in the background. + */ +EXTL_SAFE +EXTL_EXPORT +int statusd_exec(const char *cmd) +{ + return mainloop_spawn(cmd); +} + + +/*EXTL_DOC + * Run \var{cmd} with a read pipe connected to its stdout. + * When data is received through the pipe, \var{h} is called + * with that data. + */ +EXTL_SAFE +EXTL_EXPORT +int statusd_popen_bgread(const char *cmd, ExtlFn h, ExtlFn errh) +{ + return mainloop_popen_bgread(cmd, NULL, NULL, h, errh); +} + diff --git a/utils/ion-statusd/extlrx.c b/utils/ion-statusd/extlrx.c new file mode 100644 index 0000000..4c13e33 --- /dev/null +++ b/utils/ion-statusd/extlrx.c @@ -0,0 +1,42 @@ +/* + * ion/utils/ion-statusd/extlrx.c + * + * Copyright (c) Tuomo Valkonen 2004-2006. + * + * Ion is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include + + +/*{{{ libtu */ + + +/*EXTL_DOC + * Issue a warning. How the message is displayed depends on the current + * warning handler. + */ +EXTL_EXPORT +void statusd_warn(const char *str) +{ + warn("%s", str); +} + + +EXTL_EXPORT +const char *statusd_gettext(const char *s) +{ + if(s==NULL) + return NULL; + else + return TR(s); +} + + +/*}}}*/ + diff --git a/utils/ion-statusd/ion-statusd.c b/utils/ion-statusd/ion-statusd.c new file mode 100644 index 0000000..da9e432 --- /dev/null +++ b/utils/ion-statusd/ion-statusd.c @@ -0,0 +1,311 @@ +/* + * ion/utils/ion-statusd/ion-statusd.c + * + * Copyright (c) Tuomo Valkonen 2004-2006. + * + * Ion is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef CF_NO_LOCALE +#include +#endif + +#include "../../version.h" + + +static OptParserOpt ion_opts[]={ + /*{OPT_ID('d'), "display", OPT_ARG, "host:dpy.scr", + DUMMY_TR("X display to use")},*/ + + {'c', "conffile", OPT_ARG, "config_file", + DUMMY_TR("Configuration file")}, + + {'s', "searchdir", OPT_ARG, "dir", + DUMMY_TR("Add directory to search path")}, + + /*{OPT_ID('s'), "session", OPT_ARG, "session_name", + DUMMY_TR("Name of session (affects savefiles)")},*/ + + {'h', "help", 0, NULL, + DUMMY_TR("Show this help")}, + + {'V', "version", 0, NULL, + DUMMY_TR("Show program version")}, + + {OPT_ID('a'), "about", 0, NULL, + DUMMY_TR("Show about text")}, + + {'q', "quiet", 0, NULL, + DUMMY_TR("Quiet mode")}, + + {'m', "meter", OPT_ARG, "meter_module", + DUMMY_TR("Load a meter module")}, + + END_OPTPARSEROPTS +}; + + +static const char statusd_copy[]= + "Ion-statusd " ION_VERSION ", copyright (c) Tuomo Valkonen 2004-2005."; + + +static const char statusd_license[]=DUMMY_TR( + "This program is free software; you can redistribute it and/or\n" + "modify it under the terms of the GNU Lesser General Public\n" + "License as published by the Free Software Foundation; either\n" + "version 2.1 of the License, or (at your option) any later version.\n" + "\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" + "Lesser General Public License for more details.\n"); + + +/* new_informs=TRUE because we should always print period when + * initialisation is done. + */ +static bool new_informs=TRUE; +static ExtlTab configtab; + +static void help() +{ + int i; + printf(TR("Usage: %s [options]\n\n"), libtu_progname()); + for(i=0; ion_opts[i].descr!=NULL; i++) + ion_opts[i].descr=TR(ion_opts[i].descr); + optparser_printhelp(OPTP_MIDLONG, ion_opts); + printf("\n"); +} + + +static void flush_informs() +{ + if(new_informs){ + printf(".\n"); + fflush(stdout); + new_informs=FALSE; + } +} + + +static void mainloop() +{ + sigset_t trapset; + + sigemptyset(&trapset); + sigaddset(&trapset, SIGALRM); + sigaddset(&trapset, SIGCHLD); + mainloop_trap_signals(&trapset); + + while(1){ + int kill_sig=mainloop_check_signals(); + if(kill_sig!=0 && kill_sig!=SIGUSR1){ + if(kill_sig==SIGTERM) + exit(EXIT_FAILURE); + else + kill(getpid(), kill_sig); + } + + mainloop_execute_deferred(); + + flush_informs(); + + mainloop_select(); + } +} + + +extern bool statusd_register_exports(); +extern void statusd_unregister_exports(); + + +static void stdout_closed(int fd, void *data) +{ + exit(EXIT_SUCCESS); +} + + +int main(int argc, char*argv[]) +{ + const char *mod=NULL; + char *mod2=NULL; + int loaded=0; + int opt; + bool quiet=FALSE; + +#ifndef CF_NO_LOCALE + if(setlocale(LC_ALL, "")==NULL) + warn("setlocale() call failed."); +#endif + + configtab=extl_table_none(); + + libtu_init(argv[0]); + extl_init(); + + if(!statusd_register_exports()) + return EXIT_FAILURE; + + extl_add_searchdir(EXTRABINDIR); + extl_add_searchdir(MODULEDIR); + extl_add_searchdir(ETCDIR); + extl_add_searchdir(SHAREDIR); + extl_add_searchdir(LCDIR); + extl_set_userdirs("ion3"); + + optparser_init(argc, argv, OPTP_MIDLONG, ion_opts); + + extl_read_config("ioncore_luaext", NULL, TRUE); + + while((opt=optparser_get_opt())){ + switch(opt){ + /*case OPT_ID('d'): + display=optparser_get_arg(); + break;*/ + case 's': + extl_add_searchdir(optparser_get_arg()); + break; + /*case OPT_ID('s'): + extl_set_sessiondir(optparser_get_arg()); + break;*/ + case 'h': + help(); + return EXIT_SUCCESS; + case 'V': + printf("%s\n", ION_VERSION); + return EXIT_SUCCESS; + case OPT_ID('a'): + printf("%s\n\n%s", statusd_copy, TR(statusd_license)); + return EXIT_SUCCESS; + case 'c': + { + ExtlTab t; + const char *f=optparser_get_arg(); + if(extl_read_savefile(f, &t)){ + extl_unref_table(configtab); + configtab=t; + }else{ + warn(TR("Unable to load configuration file %s"), f); + } + } + break; + case 'q': + quiet=TRUE; + break; + case 'm': + mod=optparser_get_arg(); + if(strchr(mod, '/')==NULL && strchr(mod, '.')==NULL){ + mod2=scat("statusd_", mod); + if(mod2==NULL) + return EXIT_FAILURE; + mod=mod2; + } + if(extl_read_config(mod, NULL, !quiet)) + loaded++; + if(mod2!=NULL) + free(mod2); + break; + default: + warn(TR("Invalid command line.")); + help(); + return EXIT_FAILURE; + } + } + + if(loaded==0 && !quiet){ + warn(TR("No meters loaded.")); + return EXIT_FAILURE; + } + + mainloop(); + + return EXIT_SUCCESS; +} + + +/*EXTL_DOC + * Inform that meter \var{name} has value \var{value}. + */ +EXTL_EXPORT +void statusd_inform(const char *name, const char *value) +{ + printf("%s: %s\n", name, value); + new_informs=TRUE; +} + + +/*EXTL_DOC + * Get configuration table for module \var{name} + */ +EXTL_EXPORT +ExtlTab statusd_get_config(const char *name) +{ + if(name==NULL){ + return extl_ref_table(configtab); + }else{ + ExtlTab t; + if(extl_table_gets_t(configtab, name, &t)) + return t; + else + return extl_create_table(); + } +} + + +/*EXTL_DOC + * Get last file modification time. + */ +EXTL_EXPORT +double statusd_last_modified(const char *fname) +{ + struct stat st; + + if(fname==NULL) + return (double)(-1); + + if(stat(fname, &st)!=0){ + /*warn_err_obj(fname);*/ + return (double)(-1); + } + + return (double)(st.st_mtime>st.st_ctime ? st.st_mtime : st.st_ctime); +} + + +EXTL_EXPORT +ExtlTab statusd_getloadavg() +{ + ExtlTab t=extl_create_table(); + double l[3]; + int n; + + n=getloadavg(l, 3); + + if(n>=1) + extl_table_sets_d(t, "1min", l[0]); + if(n>=2) + extl_table_sets_d(t, "5min", l[1]); + if(n>=3) + extl_table_sets_d(t, "15min", l[2]); + + return t; +} + diff --git a/utils/ion-statusd/statusd_date.lua b/utils/ion-statusd/statusd_date.lua new file mode 100644 index 0000000..ea36258 --- /dev/null +++ b/utils/ion-statusd/statusd_date.lua @@ -0,0 +1,41 @@ +-- +-- ion/mod_statusbar/ion-statusd/statusd_date.lua +-- +-- Copyright (c) Tuomo Valkonen 2004-2006. +-- +-- Ion is free software; you can redistribute it and/or modify it under +-- the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- + + +local timer + +local defaults={ + date_format='%a %Y-%m-%d %H:%M', + formats={}, +} + +local settings=table.join(statusd.get_config('date'), defaults) + +local function update() + local tm=os.time() + statusd.inform('date', os.date(settings.date_format, tm)) + for k, f in pairs(settings.formats) do + statusd.inform('date_'..k, os.date(f, tm)) + end + return tm +end + +local function timer_handler(tmr) + local tm=update() + + local t=os.date('*t', tm) + local d=(60-t.sec)*1000 + + timer:set(d, timer_handler) +end + +timer=statusd.create_timer() +timer_handler(timer) diff --git a/utils/ion-statusd/statusd_load.lua b/utils/ion-statusd/statusd_load.lua new file mode 100644 index 0000000..88162af --- /dev/null +++ b/utils/ion-statusd/statusd_load.lua @@ -0,0 +1,70 @@ +-- +-- ion/mod_statusbar/ion-statusd/statusd_load.lua +-- +-- Copyright (c) Tuomo Valkonen 2004-2006. +-- +-- Ion is free software; you can redistribute it and/or modify it under +-- the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- + +-- +-- We should really use getloadavg(3) instead and move the meter to +-- Ion side to get properly up-to-date loads. But until such an export +-- is made, and we use potentially blocking files and external programs, +-- this meter must be in ion-statusd. +-- + +local defaults={ + update_interval=10*1000, + load_hint="1min", + important_threshold=1.5, + critical_threshold=4.0 +} + +local settings=table.join(statusd.get_config("load"), defaults) + +local load_timer + +local function get_hint(v) + local i="normal" + if v then + if v>settings.critical_threshold then + i="critical" + elseif v>settings.important_threshold then + i="important" + end + end + return i +end + +local function fmt(l) + if not l then + return "?" + else + return string.format("%0.2f", l) + end +end + +local function update_load() + local lds = statusd.getloadavg() + f1, f5, f15 = fmt(lds["1min"]), fmt(lds["5min"]), fmt(lds["15min"]) + statusd.inform("load", f1..", "..f5..", "..f15) + statusd.inform("load_hint", get_hint(lds[settings.load_hint])) + statusd.inform("load_1min", f1) + statusd.inform("load_1min_hint", get_hint(lds["1min"])) + statusd.inform("load_5min", f5) + statusd.inform("load_5min_hint", get_hint(lds["5min"])) + statusd.inform("load_15min", f15) + statusd.inform("load_15min_hint", get_hint(lds["15min"])) + load_timer:set(settings.update_interval, update_load) +end + +-- Init +--statusd.inform("load_template", "0.00, 0.00, 0.00"); + +load_timer=statusd.create_timer() +update_load() + + diff --git a/utils/ion-statusd/statusd_mail.lua b/utils/ion-statusd/statusd_mail.lua new file mode 100644 index 0000000..71cfea9 --- /dev/null +++ b/utils/ion-statusd/statusd_mail.lua @@ -0,0 +1,156 @@ +-- +-- ion/mod_statusbar/ion-statusd/statusd_mail.lua +-- +-- Copyright (c) Tuomo Valkonen 2004-2006. +-- +-- Ion is free software; you can redistribute it and/or modify it under +-- the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- + +-- The keyword for this monitor +local mon = "mail" + +local defaults={ + update_interval=10*1000, + retry_interval=60*10*1000, + mbox = os.getenv("MAIL"), + files = {} +} + +local settings=table.join(statusd.get_config(mon), defaults) + +local function TR(s, ...) + return string.format(statusd.gettext(s), unpack(arg)) +end + +local function check_spool() + if not settings.mbox then + statusd.warn(TR("MAIL environment variable not set ".. + "and no spool given.")) + end +end + +if not settings.files["spool"] then + check_spool() + settings.files["spool"] = settings.mbox +elseif not(settings.files["spool"] == mbox) then + statusd.warn(TR("%s.mbox does not match %s.files['spool']; using %s.mbox", + mon, mon, mon)) + check_spool() + settings.files["spool"] = settings.mbox +end + +local function calcmail(fname) + local f, err=io.open(fname, 'r') + local total, read, old=0, 0, 0 + local had_blank=true + local in_headers=false + local had_status=false + + if not f then + statusd.warn(err) + return + end + + for l in f:lines() do + if had_blank and string.find(l, '^From ') then + total=total+1 + had_status=false + in_headers=true + had_blank=false + else + had_blank=false + if l=="" then + if in_headers then + in_headers=false + end + had_blank=true + elseif in_headers and not had_status then + local st, en, stat=string.find(l, '^Status:(.*)') + if stat then + had_status=true + if string.find(l, 'R') then + read=read+1 + end + if string.find(l, 'O') then + old=old+1 + end + end + end + end + end + + f:close() + + return total, total-read, total-old +end + + +local mail_timer +local mail_timestamps = {} +function init_timestamps () + for key, val in pairs(settings.files) do + mail_timestamps[key]=-2.0 + end +end +init_timestamps() + +local function update_mail() + local failed + for key, mbox in pairs(settings.files) do + if not mbox then + error(TR(key.." not set")) + end + + local old_tm=mail_timestamps[key] + mail_timestamps[key]=statusd.last_modified(mbox) + + if mail_timestamps[key]>old_tm then + local mail_total, mail_unread, mail_new=calcmail(mbox) + if failed == nil then + failed = not mail_total + else + failed = failed and (not mail_total) + end + + if key == "spool" then + meter=mon + else + meter=mon.."_"..key + end + if mail_total then + statusd.inform(meter.."_new", tostring(mail_new)) + statusd.inform(meter.."_unread", tostring(mail_unread)) + statusd.inform(meter.."_total", tostring(mail_total)) + + if mail_new>0 then + statusd.inform(meter.."_new_hint", "important") + else + statusd.inform(meter.."_new_hint", "normal") + end + + if mail_unread>0 then + statusd.inform(meter.."_unread_hint", "important") + else + statusd.inform(meter.."_unread_hint", "normal") + end + end + end + end + + if failed then + statusd.warn(TR("Disabling mail monitor for %d seconds.", + settings.retry_interval/1000)) + init_timestamps() + mail_timer:set(settings.retry_interval, update_mail) + return + end + + mail_timer:set(settings.update_interval, update_mail) +end + +mail_timer=statusd.create_timer() +update_mail() + diff --git a/version.h b/version.h index 920ba19..17f05f8 100644 --- a/version.h +++ b/version.h @@ -1,2 +1,2 @@ -#define ION_VERSION "3rc-20070927" +#define ION_VERSION "3rc-20071109" #define ION_API_VERSION "3"