]> git.decadent.org.uk Git - ion3.git/commitdiff
[svn-upgrade] Integrating new upstream version, ion3 (20070203) 20070203
authorBen Hutchings <ben@decadent.org.uk>
Sat, 24 Mar 2007 19:04:35 +0000 (19:04 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Sat, 24 Mar 2007 19:04:35 +0000 (19:04 +0000)
323 files changed:
ChangeLog
README
RELNOTES
TODO.riot
build/ac/configure.ac
config.h
de/brush.c
de/brush.h
de/colour.c
de/colour.h
de/draw.c
de/font.c
de/font.h
de/fontset.h
de/init.c
de/init.h
de/private.h
de/style.c
de/style.h
doc/ChangeLog
doc/Makefile
doc/conf-menus.tex
doc/conf-winprops.tex
doc/de.tex
doc/exact-version
doc/fullhierarchy.tex
doc/hookref.tex
doc/ionconf.dvi.gz
doc/ionconf.out
doc/ionconf.ps.gz
doc/ionconf.tex
doc/ionconf/images.log
doc/ionconf/images.tex
doc/ionconf/index.html
doc/ionconf/internals.pl
doc/ionconf/ionconf.html
doc/ionconf/labels.pl
doc/ionconf/node10.html
doc/ionconf/node11.html
doc/ionconf/node12.html
doc/ionconf/node3.html
doc/ionconf/node4.html
doc/ionconf/node5.html
doc/ionconf/node6.html
doc/ionconf/node7.html
doc/ionconf/node9.html
doc/ionnotes.dvi.gz
doc/ionnotes.ps.gz
doc/ionnotes/node2.html
doc/ionnotes/node3.html
doc/ionnotes/node4.html
doc/ionnotes/node5.html
doc/ionnotes/node8.html
doc/ionnotes/node9.html
doc/objects.tex
etc/Makefile
etc/cfg_ion.lua
etc/cfg_ioncore.lua
etc/cfg_layouts.lua [new file with mode: 0644]
etc/cfg_modules.lua
etc/cfg_panews.lua [deleted file]
etc/cfg_tiling.lua
etc/look_brownsteel.lua
etc/look_clean.lua
etc/look_cleanios.lua
etc/look_cleanviolet.lua
etc/look_dusky.lua
etc/look_greyviolet.lua
etc/look_ios.lua
etc/look_simpleblue.lua
etc/lookcommon_clean.lua
etc/lookcommon_emboss.lua
exact-version
ion/Makefile
ion/ion.c
ioncore/Makefile
ioncore/activity.c
ioncore/activity.h
ioncore/attach.c
ioncore/attach.h
ioncore/basicpholder.c
ioncore/basicpholder.h
ioncore/binding.c
ioncore/binding.h
ioncore/bindmaps.c
ioncore/bindmaps.h
ioncore/classes.h
ioncore/clientwin.c
ioncore/clientwin.h
ioncore/colormap.c
ioncore/colormap.h
ioncore/common.h
ioncore/conf-bindings.c
ioncore/conf-bindings.h
ioncore/conf.c
ioncore/conf.h
ioncore/cursor.c
ioncore/cursor.h
ioncore/detach.c [new file with mode: 0644]
ioncore/detach.h [new file with mode: 0644]
ioncore/dummywc.h
ioncore/event.c
ioncore/event.h
ioncore/eventh.c
ioncore/eventh.h
ioncore/exec.c
ioncore/exec.h
ioncore/extlconv.c
ioncore/extlconv.h
ioncore/extlrx.c
ioncore/float-placement.c
ioncore/float-placement.h
ioncore/focus.c
ioncore/focus.h
ioncore/frame-draw.c
ioncore/frame-draw.h
ioncore/frame-pointer.c
ioncore/frame-pointer.h
ioncore/frame.c
ioncore/frame.h
ioncore/framedpholder.c
ioncore/framedpholder.h
ioncore/framep.h
ioncore/fullscreen.c
ioncore/fullscreen.h
ioncore/global.h
ioncore/gr-util.h [new file with mode: 0644]
ioncore/gr.c
ioncore/gr.h
ioncore/group-cw.c
ioncore/group-cw.h
ioncore/group-ws.c
ioncore/group-ws.h
ioncore/group.c
ioncore/group.h
ioncore/groupedpholder.c
ioncore/groupedpholder.h
ioncore/grouppholder.c
ioncore/grouppholder.h
ioncore/infowin.c
ioncore/infowin.h
ioncore/ioncore.c
ioncore/ioncore.h
ioncore/ioncore_bindings.lua
ioncore/ioncore_efbb.lua
ioncore/ioncore_ext.lua
ioncore/ioncore_luaext.lua
ioncore/ioncore_menudb.lua
ioncore/ioncore_misc.lua
ioncore/ioncore_wd.lua
ioncore/ioncore_winprops.lua
ioncore/kbresize.c
ioncore/kbresize.h
ioncore/key.c
ioncore/key.h
ioncore/llist.c
ioncore/llist.h
ioncore/manage.c
ioncore/manage.h
ioncore/modules.c
ioncore/modules.h
ioncore/mplex.c
ioncore/mplex.h
ioncore/mplexpholder.c
ioncore/mplexpholder.h
ioncore/mwmhints.c
ioncore/mwmhints.h
ioncore/names.c
ioncore/names.h
ioncore/navi.c
ioncore/navi.h
ioncore/netwm.c
ioncore/netwm.h
ioncore/pholder.c
ioncore/pholder.h
ioncore/pointer.c
ioncore/pointer.h
ioncore/presize.c
ioncore/presize.h
ioncore/property.c
ioncore/property.h
ioncore/rectangle.c
ioncore/rectangle.h
ioncore/regbind.c
ioncore/regbind.h
ioncore/reginfo.c
ioncore/reginfo.h
ioncore/region-iter.h
ioncore/region.c
ioncore/region.h
ioncore/resize.c
ioncore/resize.h
ioncore/return.c [new file with mode: 0644]
ioncore/return.h [new file with mode: 0644]
ioncore/rootwin.c
ioncore/rootwin.h
ioncore/saveload.c
ioncore/saveload.h
ioncore/screen.c
ioncore/screen.h
ioncore/selection.c
ioncore/selection.h
ioncore/sizehint.c
ioncore/sizehint.h
ioncore/sizepolicy.c
ioncore/sizepolicy.h
ioncore/stacking.c
ioncore/stacking.h
ioncore/strings.c
ioncore/strings.h
ioncore/tags.c
ioncore/tags.h
ioncore/window.c
ioncore/window.h
ioncore/xic.c
ioncore/xic.h
ioncore/xwindow.c
ioncore/xwindow.h
libmainloop/defer.c
libmainloop/defer.h
libmainloop/exec.c
libmainloop/exec.h
libmainloop/hooks.c
libmainloop/hooks.h
libmainloop/signal.c
libmainloop/signal.h
libtu/README
libtu/exact-version
libtu/np-conv.h [deleted file]
libtu/numparser2.h [deleted file]
libtu/stringstore.c
libtu/stringstore.h
man/ion3.cs.in
man/ion3.de.in
man/ion3.fi.in
man/ion3.in
man/pwm3.cs.in
man/pwm3.de.in
man/pwm3.fi.in
man/pwm3.in
mod_dock/dock.c
mod_menu/grabmenu.c
mod_menu/main.c
mod_menu/main.h
mod_menu/menu.c
mod_menu/menu.h
mod_menu/mkmenu.c
mod_menu/mkmenu.h
mod_menu/mod_menu.lua
mod_mgmtmode/main.c
mod_mgmtmode/main.h
mod_mgmtmode/mgmtmode.c
mod_mgmtmode/mgmtmode.h
mod_panews/Makefile [deleted file]
mod_panews/main.c [deleted file]
mod_panews/main.h [deleted file]
mod_panews/mod_panews.lua [deleted file]
mod_panews/panews.c [deleted file]
mod_panews/panews.h [deleted file]
mod_panews/placement.c [deleted file]
mod_panews/placement.h [deleted file]
mod_panews/splitext.c [deleted file]
mod_panews/splitext.h [deleted file]
mod_panews/unusedwin.c [deleted file]
mod_panews/unusedwin.h [deleted file]
mod_query/complete.c
mod_query/complete.h
mod_query/edln.c
mod_query/edln.h
mod_query/fwarn.c
mod_query/fwarn.h
mod_query/history.c
mod_query/history.h
mod_query/input.c
mod_query/input.h
mod_query/inputp.h
mod_query/listing.c
mod_query/listing.h
mod_query/main.c
mod_query/main.h
mod_query/mod_query.lua
mod_query/mod_query_chdir.lua
mod_query/query.c
mod_query/query.h
mod_query/wedln-wrappers.c
mod_query/wedln.c
mod_query/wedln.h
mod_query/wmessage.c
mod_query/wmessage.h
mod_sm/sm.c
mod_sm/sm_matchwin.c
mod_sm/sm_matchwin.h
mod_sm/sm_session.c
mod_sm/sm_session.h
mod_sp/main.c
mod_sp/main.h
mod_statusbar/draw.c
mod_statusbar/draw.h
mod_statusbar/main.c
mod_statusbar/main.h
mod_statusbar/mod_statusbar.lua
mod_statusbar/statusbar.c
mod_statusbar/statusbar.h
mod_tiling/main.c
mod_tiling/main.h
mod_tiling/ops.c
mod_tiling/panehandle.c
mod_tiling/panehandle.h
mod_tiling/placement.c
mod_tiling/placement.h
mod_tiling/split-stdisp.c
mod_tiling/split-stdisp.h
mod_tiling/split.c
mod_tiling/split.h
mod_tiling/splitfloat.c
mod_tiling/splitfloat.h
mod_tiling/tiling.c
mod_tiling/tiling.h
pwm/Makefile
pwm/cfg_pwm.lua
pwm/pwm.c
system.mk
version.h

index 43a323ea45e17165a377f03536dab3577786e94f..d9666411131e8e493296f0e155bce05d3b499ca5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,388 @@
+2007-02-03 14:50 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  tagged ion-3ds-20070203
+
+2007-02-03 14:50 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * RELNOTES update
+
+2007-02-03 11:09 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Updates to some styles
+
+2007-02-03 11:08 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Include spacing in border width for the "ridge" and "inlaid" border styles.
+
+2007-02-03 06:05 UTC  Etan Reisner <deryni@gmail.com>
+  * Make the docs match the #defines.
+
+2007-02-01 20:25 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Different selected/unselected-activity substyles for tab-frame too.
+
+2007-02-01 20:14 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * `WMPlex.attach_new` can now be passed parameters by `ioncore.deflayout` 
+  definitions (unless a particular parameter is masked in certain use cases,
+  such as `switchto`). 
+
+2007-02-01 18:26 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Minor GrStyleSpec init/copy optimisation
+
+2007-01-31 19:04 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Fixes in lookcommon_clean  usage
+
+2007-01-31 17:58 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Defined activity attribute for menu entries in the "clean" styles.
+  (The usual red for unselected, a bit lighter for selected entries.)
+
+2007-01-31 17:57 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Set the "activity" attribute on relevant entries in the "focuslist" menu.
+
+2007-01-31 17:56 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added support for arbitrary (drawing engine) attributes for menu entries.
+
+2007-01-30 20:53 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Minor improvements to groupws_prepare_manage
+
+2007-01-30 20:53 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Oops, layout loading changes dislocated transient mgmt. code.
+
+2007-01-30 18:30 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Renamed the `subs` element of WMPlex configuration to `managed`
+  for consistency. The old name is still supported on load.
+
+2007-01-30 18:24 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added `new_group` winprop.
+  It should be the name of the layout of a new group/workspace to create,
+  if the the `target` winprop fails. The latter is tried again after
+  creating the new group.
+
+2007-01-30 08:48 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * More and fixed release notes
+
+2007-01-30 00:27 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Minor optimisation
+
+2007-01-29 16:49 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Improved layout and winprop communication between C/Lua.
+  ioncore.deflayout and ioncore.getlayout replace mod_query.layouts
+  and ioncore.set{default_ws_params = ...}
+
+2007-01-28 10:03 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Fixes to new drawing engine attribute scoring:
+    - Since each item occurs on the attribute list only once, with a score,
+      the a star ("*") on the source list should be used scored by its score
+      there, instead of one. (Possibly also other items' scores should be
+      multiplied by the source list score?)
+    - The "activity" substyle needs some stars in it to give it a higher 
+      score over other rather specific possibilities without "no_activity"
+      to block their use.
+
+2007-01-27 17:33 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Oops, wrong address..
+
+2007-01-27 17:00 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * attach_tagged behaviour restoration.
+
+2007-01-27 16:44 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Updates to man page references to binding contexts.
+  NOTE: Some of the translations apparently are totally
+  out-dated. Please update.
+
+2007-01-27 13:09 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added option for case-insensitive completion.
+  mod_query.set{caseicompl=true} will cause some completions (such as
+  window and workspace names) to be case-insensitive.
+
+2007-01-27 13:08 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Oops, mod_query.get wasn't marked EXTL_SAFE
+
+2007-01-27 12:51 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * mod_query(.lua) clean-up and completion improvements
+
+2007-01-26 19:51 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Statusbar meter name is now passed as attribute to the drawing engine.
+  It is therefore possible to give different meters different colours,
+  with de.substyle("metername", { ... }) in the appropriate style
+  definition ("stdisp", "stdisp-statusbar").
+
+2007-01-26 19:01 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Completion code fixes
+
+2007-01-26 11:12 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * README  update
+
+2007-01-25 22:07 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Check for NULL in get_hook
+
+2007-01-25 04:24 UTC  Etan Reisner <deryni@gmail.com>
+  * The name given to the workspace query should be used. I'm assuming this was a typo/braino of some sort.
+
+2007-01-24 19:06 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Menu updates
+
+2007-01-24 19:03 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Improvements to query_renameworkspace
+
+2007-01-24 18:53 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added cfg_layouts.lua with layout definitions
+
+2007-01-24 18:42 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added layout query for new workspace to mod_query.query_workspace.
+  The table returned by the function mod_query.layouts can be used to 
+  configure additional layouts.
+
+2007-01-24 09:16 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * The "<empty frame>" text apparently wasn't i18nised, residing in config.h.
+
+2007-01-23 17:00 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added region_dispose for chain-destruction of regions.
+  It also handles goto to return placeholder target if the to-be destroyed
+  region could control the focus. This also fixes recent regression wrt. 
+  return from full screen mode.
+
+2007-01-23 07:09 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Marked WFrame.mode "safe"
+
+2007-01-26 18:08 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added quasiactivity hint to the "clean" styles (+improved activity colour).
+  Frame padding is drawn in red when frame frame is quasiactive. Stylistically
+  it's far from ideal, but that seems to be the best place for the hint
+  without major improvements to the drawing engine. The "emboss" styles still
+  need to get this added, but they also demand other work, being largely
+  bitrotted.
+
+2007-01-26 17:58 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Drawing engine API and attribute handling changes.
+  An attribute string is no longer passed to every drawing function,
+  but instead the attributes must be allocated from libtu's "stringstore",
+  and then set on the brush. The attributes are also no longer matched
+  linearly, but by simple containment, with the linear specification strings
+  in the style files (and gr_get_brush also still), however still modifying
+  the score a match gives. These changes should make it easier to add 
+  additional attributes.
+
+2007-01-26 17:46 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Fixed leak in mod_query_history_push_
+
+2007-01-22 20:32 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Ugly pointer focus hack for messy floats:
+  If a window that does not have the focus, or if the focus is being 
+  changed elsewhere, is unmapped (or destroyed), contains the pointer,
+  then try to set the focus again to prevent focus from changing to
+  a window under this unampped window. (However, if the unampped window 
+  has the focus, and no change elsewhere is known, current focus policy 
+  dictates that the focus should fall to the underlying window.)
+
+2007-01-21 13:25 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * RELNOTES conflict resolution
+
+2007-01-21 13:06 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Fixes
+
+2007-01-21 13:05 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Frame quasiactivation tracking
+
+2007-01-21 12:39 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Pseudoactivity state maintenance hack
+
+2007-01-18 20:14 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Navi-code updates
+
+2007-01-17 20:49 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Comment updates
+
+2007-01-20 20:07 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Removed 'detail' from notify_change parameters
+  (And reordered call in unset_manager.)
+
+2007-01-18 08:00 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Year changed...
+  (The one nice thing about CVS was that you could automate this
+  numbering. Perhaps a record check script could make you update 
+  the dates manually as you change the files...)
+
+2007-01-17 18:18 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Further simplifications/dead code removal.
+  (Made possible by removal of Xinerama #ifdef hacks.)
+
+2007-01-17 18:11 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Removed the bitrotted Xinerama code altogether.
+  I am unlikely to waste time fixing it. However, the abstract support still
+  remains (enhanced), and someone who cares about it, will just have to write
+  a separate module to set up a special layout for the root window (now a
+  WScreen and WMPlex) with new WScreens for each Xinerama screen, and set
+  the screen ID of the root window to less than zero for the layout loading
+  code.
+
+2007-01-17 18:11 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Loading hack
+
+2007-01-17 17:54 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Made WRootWin inherit WScreen.
+  This removes some ugly hacks, and simplifies things a lot for the usual
+  case of a single screen, or that of normal X multihead. This completes
+  the bitrot of Xinerama-specific code, although abstract support for
+  various (nested) screen configurations remains (and infact there's
+  now the abstract possibility of both single-screen and multi-screen
+  workspaces/windows).
+
+2007-01-17 16:06 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Group focus policy changes
+
+2007-01-16 15:49 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Statusbar size hint tuning
+
+2007-01-14 00:30 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Fixes wrt. FRAME_MODE_UNKNOWN (e.g. scratchpad).
+
+2007-01-14 15:39 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Removed fake activication messages for non-windows.
+
+2007-01-13 23:27 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Toplevel bindmap usage tuning
+
+2007-01-13 20:58 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Do not use Watches in return storage.
+  Instead clean up things in region_deinit. The pointer to the region in the
+  watch is reset before calling the watch handler, so node in the search tree
+  is never found, the watch/pointer being the key.
+
+2007-01-13 20:45 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Changes in padding/spacing usage in frames.
+  (See RELNOTES.)
+
+2007-01-13 20:27 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Do not draw spacing after last textbox
+
+2007-01-13 18:54 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Oops, forgot this...
+
+2007-01-13 18:32 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Use libtu stringstore for the notification mechanism
+  (Testing against allocated StringIds is more efficient than strcmp.)
+
+2007-01-13 16:02 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Removed region_managed_(in)activated hooks and functions.
+   - region_notify_change and the corresponding region_notify_hook do the job.
+
+2007-01-12 14:37 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * README fixes/improvements
+
+2007-01-10 18:22 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * doc
+
+2007-01-10 18:18 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Fixed WMPlex.attach_tagged to switch to the first attached region
+
+2007-01-10 18:15 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Moved mod_tiling.detach as ioncore.detach.
+  (It has nothing to do with tilings, after all.)
+
+2007-01-10 18:09 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Use previous placeholder on entering FS mode, if there's one
+
+2007-01-10 18:03 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Detach tuning
+
+2007-01-10 17:30 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Use original stacking level and sizepolicy for unframed detachs
+
+2007-01-10 17:24 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Removed unused modal flag
+  (The information is in the stacking level.)
+
+2007-01-10 07:48 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Updated configuration file doc. comments
+
+2007-01-10 01:06 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Removed traces of WPaneWS.
+  It won't be found in Ion3: there aren't separate workspace classes 
+  anymore, after all. Instead, so-called "trays" may be added. Or maybe
+  not. Who knows.
+
+2007-01-10 00:31 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Query history tuning
+
+2007-01-09 22:23 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added placeholder staleness checks
+
+2007-01-09 21:44 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Placeholder and detach improvements:
+  - No need for special handling of transients in configs anymore: 
+    framing of non-WWindow regions on detach is automatic now, and
+    an auto-destroyed frame creates a recreation WFramedPHolder for
+    its remaining WMPlexPHolders, so that the container frame can
+    be recreated on attach.
+  - Consequently, multiple fullscreened windows from a floating frame
+    are now returned back to the same frame, even if the original
+    frame was emptied (and thus destroyed) in the meanwhile.
+
+2007-01-08 20:12 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Typo fix (+ minor related policy changes)
+
+2007-01-06 18:56 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added mode to WFramedParam
+
+2007-01-04 22:13 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Moved set/is_fullscreen from WClientWin to WGroup
+   - Simplifies the binding (and the config needs to be updated!)
+
+2007-01-03 17:48 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Some renames for consistency
+
+2007-01-03 17:38 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Support obtaining current key in submaps as well
+
+2007-01-03 17:26 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Mod1+K K opens a grabmenu with the "focustlist" menu
+   - Cyclable with Mod1+K
+
+2007-01-03 17:25 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added focuslist menu 
+   - First lists ioncore.activity_i results and then ioncore.focushistory_i
+
+2007-01-03 16:53 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Changed *_list exports into *_i iterators
+
+2007-01-03 16:42 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Oops (and been there for a while, stupid GCC)
+
+2007-01-03 15:51 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Remove managers from focus list when child is pushed on it
+
+2006-12-28 20:29 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Detach binding/menu tuning
+
+2006-12-28 20:26 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added / to characters substituted in query menus
+
+2006-12-28 20:25 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Fixed menu append
+
+2006-12-28 20:13 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Detach is toggleable now (using return placeholder list)
+
+2006-12-28 19:40 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Full screen code rearrangements
+
+2006-12-27 14:48 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Minor tuning
+
+2006-12-27 14:35 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Use return storage for return from full screen mode
+
+2006-12-26 20:25 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Don't snow info window for activity on active screen
+
+2006-12-26 17:40 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * More functions for return storage
+
+2006-12-26 17:37 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Use watches in return storage
+
+2006-12-26 17:12 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added basic "return" placeholder storage
+
+2006-12-26 16:53 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Removed unused variable/string
+
 2006-12-23 14:59 UTC  Tuomo Valkonen <tuomov@iki.fi>
   tagged ion-3ds-20061223
 
diff --git a/README b/README
index 62684eeaeeb413e5db9fe1288425d4e1d47dabe9..0769ba68a7d82e098f0aaae412151148f6ee69d4 100644 (file)
--- a/README
+++ b/README
@@ -2,7 +2,7 @@
 Ion
 ===
 
-Copyright (c) Tuomo Valkonen 1999-2006.
+Copyright (c) Tuomo Valkonen 1999-2007.
 
 tuomov at iki.fi
 
@@ -18,16 +18,16 @@ Building and installing
     * Lua 5.1 (see <http://www.lua.org/>). 
 
 2. a) Edit `system.mk` to suit your system. Most GNU/Linux users should
-      need very little modifications to `system.mk`.
+      need very few changes.
 
    b) Alternatively, go to the directory `build/ac`, run `autoreconf`
-      and then `./configure`. Switch back to the top directory afterwards.
-      See `build/ac/README.autoconf` for details on parameters, especially 
-      if you are using the Debian Lua packages. If you try this method and 
-      it fails for some reason, please make sure `build/ac/system-ac.mk` 
-      does not exist before falling back to alternative a). Also in such
-      a case, find someone else to complain to; I (tuomov) will have 
-      nothing to do with autoconf.
+      and then `./configure`. Switch back to the top lvel directory 
+      afterwards. See `build/ac/README.autoconf` for details on parameters, 
+      especially if you are using the Debian Lua packages. If you try 
+      this method and it fails for some reason, please make sure 
+      `build/ac/system-ac.mk` does not exist before falling back to
+      alternative a). Also in such a case, find someone else to complain
+      to: I (tuomov) will have nothing to do with autoconf.
 
 3. If you want to build some extra modules now or do not want to build
    some of the standard modules, edit `modulelist.mk`.
@@ -65,7 +65,7 @@ Some optional installation steps
    a program to view a file based on its guessed MIME type. Unless you are
    using Debian, most likely you don't have it, but any other similar 
    program (or just plain old text editor) will do as well - just the bindings
-   in `cfg_bindings.lua`. Of course, if you don't want to use the feature at 
+   in `cfg_ioncore.lua`. Of course, if you don't want to use the feature at 
    this time or never, you may simply skip this step. If you want to use 
    `run-mailcap`, it can be found from the following address, as a source 
    tarball as well:
@@ -93,7 +93,7 @@ Some optional installation steps
    
    If the `MANPATH` environment variable is not set on your system and it
     does not have the `manpath` command (or it does not print anything 
-   sensible), you may also want to set the `ION_MC_MANPATH` environment
+   sensible), you may also want to set the `ION_MANPATH` environment
    variable to the list of paths where the system stores manual pages.
 
 
index 589ab54cf2043c188f171600f7ce99e070facb65..0834cfa59f5c067cfd5aac6e0adf81469da63ca5 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -1,4 +1,33 @@
 
+ion-3ds-20070203
+----------------
+
+  * There's been changes in padding/spacing usage in styles. Frames
+    now surround stuff inside borders not with `spacing` pixels, but
+    with `padding_pixels. Spacing is only used to space things within
+    the borders (all the tabs and the client window from each other).
+    Consequently, custom styles may need to be updated to reflect this,
+    by increasing the padding, possibly also altering/removing colour 
+    (to set it to background colour). 
+
+  * The use of drawing engine attributes has also changed, and strict
+    ordering of them in the styles is no longer necessary. Additionally,
+    much more attributes are supported, including the name of every
+    statusbar meter.
+
+  * Xinerama support is gone. In addition to being problematic as such,
+    it had bit-rotted, and I will not waste time fixing it.
+
+  * `ioncore.set` no longer supports the `default_ws_params` parameter
+    for configuring the default layout. It is replaced by
+    `ioncore.deflayout("default", { ... })`, which allows configuring
+    other layouts as well, known by `mod_query.query_workspace` (F9).
+    Some default layouts are configured in `cfg_layout.lua`.
+
+  * It is now possible to automatically create new workspaces for
+    windows with the `new_group` winprop.
+
+
 ion-3ds-20061223
 ----------------
 
index efe689f1f06f3910bd09981dacd771bb0dfdecbd..009833bba23962b2f1fb5c49ba399db37113cf29 100644 (file)
--- a/TODO.riot
+++ b/TODO.riot
@@ -127,32 +127,6 @@ In-Reply-To: <riot.20060323181034.36@riot.invalid>
 
 A general solution to transients, queries and menus in tiny frames.
 
-From background-static Thu Mar 23 17:40:08 EET 2006
-Message-Id: <riot.20060323174008.8@riot.invalid>
-Date: Thu Mar 23 17:40:08 EET 2006
-Status: RO
-X-Riot-Version: 1ds-yyyymmdd
-From: Riot
-X-Riot-Edited: Thu Mar 23 17:40:10 EET 2006
-Content-Type: text/plain; charset=utf-8
-Subject: PaneWS
-In-Reply-To: <riot.20060323181034.36@riot.invalid>
-
-PaneWS
-
-From background-static Thu Mar 23 17:40:13 EET 2006
-Message-Id: <riot.20060323174013.9@riot.invalid>
-Date: Thu Mar 23 17:40:13 EET 2006
-Status: RO
-X-Riot-Version: 1ds-yyyymmdd
-From: Riot
-X-Riot-Edited: Thu Mar 23 17:40:13 EET 2006
-Content-Type: text/plain; charset=utf-8
-Subject: Lots of fine-tuning
-In-Reply-To: <riot.20060323174008.8@riot.invalid>
-
-Lots of fine-tuning
-
 From background-static Thu Mar 23 17:50:02 EET 2006
 Message-Id: <riot.20060323175002.4@riot.invalid>
 Date: Thu Mar 23 17:50:02 EET 2006
@@ -167,6 +141,19 @@ In-Reply-To: <riot.20060323181034.36@riot.invalid>
 Pane handles should allow resizing with the rodent.
 (You know, those things on the sides of floating splits.)
 
+From background-static Wed Jan 10 03:06:06 EET 2007
+Message-Id: <riot.20070110030606.1@riot.invalid>
+Date: Wed Jan 10 03:06:06 EET 2007
+Status: RO
+X-Riot-Version: 1ds-20060502
+From: Riot
+X-Riot-Edited: Wed Jan 10 03:06:06 EET 2007
+Content-Type: text/plain; charset=utf-8
+Subject: Trays?
+In-Reply-To: <riot.20060323181034.36@riot.invalid>
+
+Trays?
+
 From background-static Thu Mar 23 18:09:58 EET 2006
 Message-Id: <riot.20060323180958.35@riot.invalid>
 Date: Thu Mar 23 18:09:58 EET 2006
index c65e7cbb76950a89afce4cd7a5ca95086aa35d01..277cc961992439c0d44a83fb3df25944884ef0d2 100644 (file)
@@ -3,7 +3,7 @@ dnl Please report bugs in this autoconf script Tom Payne <ion@tompayne.org>
 dnl $Header: /home/twp/cvsroot/twp/ion/ion-devel-autoconf/configure.ac,v 1.16 2004/01/14 11:32:19 twp Exp $
 
 AC_INIT([Ion Window Manager],
-        [3ds-20061223],
+        [3ds-20070203],
         [nobody@nowhere.invalid],
         [ion3])
 AC_PREREQ([2.58])
index 23935b72387aa5bc296addf2d20265394e4507d5..f9d713146be8fec1ca95e013de72a67174be2992 100644 (file)
--- a/config.h
+++ b/config.h
@@ -1,7 +1,7 @@
 /*
  * config.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2002
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -41,9 +41,6 @@
 #define CF_CURSOR_DRAG XC_cross
 #define CF_CURSOR_WAITKEY XC_icon
 
-#define CF_STR_EMPTY "<empty frame>"
-#define CF_STR_EMPTY_LEN 13
-
 #define CF_STDISP_MIN_SZ 8
 
 #endif /* ION_CONFIG_H */
index a0576a6b139145800cbb6b52dd87ab6dae1d92ed..fbaaa610f6e7f54a6d302b4d386024028df1c40d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/brush.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 /*{{{ Brush creation and releasing */
 
 
+static GrStyleSpec tabframe_spec=GR_STYLESPEC_INIT;
+static GrStyleSpec tabinfo_spec=GR_STYLESPEC_INIT;
+static GrStyleSpec tabmenuentry_spec=GR_STYLESPEC_INIT;
+
+
 bool debrush_init(DEBrush *brush, Window win,
-                  const char *stylename, DEStyle *style)
+                  const GrStyleSpec *spec, DEStyle *style)
 {
+    GrStyleSpec tmp;
+    
     brush->d=style;
     brush->extras_fn=NULL;
     brush->indicator_w=0;
     brush->win=win;
     brush->clip_set=FALSE;
     
+    gr_stylespec_init(&brush->current_attr);
+    
     style->usecount++;
 
     if(!grbrush_init(&(brush->grbrush))){
@@ -45,11 +54,15 @@ bool debrush_init(DEBrush *brush, Window win,
         return FALSE;
     }
     
-    if(MATCHES("tab-frame", stylename) || MATCHES("tab-info", stylename)){
+    ENSURE_INITSPEC(tabframe_spec, "tab-frame");
+    ENSURE_INITSPEC(tabinfo_spec, "tab-info");
+    ENSURE_INITSPEC(tabmenuentry_spec, "tab-menuentry");
+    
+    if(MATCHES(tabframe_spec, spec) || MATCHES(tabinfo_spec, spec)){
         brush->extras_fn=debrush_tab_extras;
         if(!style->tabbrush_data_ok)
             destyle_create_tab_gcs(style);
-    }else if(MATCHES("tab-menuentry", stylename)){
+    }else if(MATCHES(tabmenuentry_spec, spec)){
         brush->extras_fn=debrush_menuentry_extras;
         brush->indicator_w=grbrush_get_text_width((GrBrush*)brush, 
                                                   DE_SUB_IND, 
@@ -60,22 +73,32 @@ bool debrush_init(DEBrush *brush, Window win,
 }
 
 
-DEBrush *create_debrush(Window win, const char *stylename, DEStyle *style)
+DEBrush *create_debrush(Window win, const GrStyleSpec *spec, DEStyle *style)
 {
-    CREATEOBJ_IMPL(DEBrush, debrush, (p, win, stylename, style));
+    CREATEOBJ_IMPL(DEBrush, debrush, (p, win, spec, style));
 }
 
 
 static DEBrush *do_get_brush(Window win, WRootWin *rootwin, 
                              const char *stylename, bool slave)
 {
-    DEStyle *style=de_get_style(rootwin, stylename);
+    DEStyle *style;
     DEBrush *brush;
+    GrStyleSpec spec;
     
-    if(style==NULL)
+    if(!gr_stylespec_load(&spec, stylename))
         return NULL;
     
-    brush=create_debrush(win, stylename, style);
+    style=de_get_style(rootwin, &spec);
+    
+    if(style==NULL){
+        gr_stylespec_unalloc(&spec);
+        return NULL;
+    }
+    
+    brush=create_debrush(win, &spec, style);
+
+    gr_stylespec_unalloc(&spec);
     
     /* Set background colour */
     if(brush!=NULL && !slave){
@@ -104,6 +127,7 @@ void debrush_deinit(DEBrush *brush)
 {
     destyle_unref(brush->d);
     brush->d=NULL;
+    gr_stylespec_unalloc(&brush->current_attr);
     grbrush_deinit(&(brush->grbrush));
 }
 
@@ -117,6 +141,40 @@ void debrush_release(DEBrush *brush)
 /*}}}*/
 
 
+/*{{{ Attributes */
+
+
+void debrush_init_attr(DEBrush *brush, const GrStyleSpec *spec)
+{
+    gr_stylespec_unalloc(&brush->current_attr);
+
+    if(spec!=NULL)
+        gr_stylespec_append(&brush->current_attr, spec);
+}
+
+    
+void debrush_set_attr(DEBrush *brush, GrAttr attr)
+{
+    gr_stylespec_set(&brush->current_attr, attr);
+}
+
+
+void debrush_unset_attr(DEBrush *brush, GrAttr attr)
+{
+    gr_stylespec_unset(&brush->current_attr, attr);
+}
+
+
+GrStyleSpec *debrush_get_current_attr(DEBrush *brush)
+{
+    return &brush->current_attr;
+}
+
+
+/*}}}*/
+
+
+
 /*{{{ Border widths and extra information */
 
 
@@ -124,17 +182,18 @@ void debrush_get_border_widths(DEBrush *brush, GrBorderWidths *bdw)
 {
     DEStyle *style=brush->d;
     DEBorder *bd=&(style->border);
-    uint tmp;
+    uint tmp=0, spc=style->spacing;
     
     switch(bd->style){
     case DEBORDER_RIDGE:
+        tmp=spc;
     case DEBORDER_GROOVE:
-        tmp=bd->sh+bd->hl+bd->pad;
+        tmp+=bd->sh+bd->hl+bd->pad;
         bdw->top=tmp; bdw->bottom=tmp; bdw->left=tmp; bdw->right=tmp;
         break;
     case DEBORDER_INLAID:
-        tmp=bd->sh+bd->pad; bdw->top=tmp; bdw->left=tmp;
-        tmp=bd->hl+bd->pad; bdw->bottom=tmp; bdw->right=tmp;
+        tmp=bd->sh+bd->pad+spc; bdw->top=tmp; bdw->left=tmp;
+        tmp=bd->hl+bd->pad+spc; bdw->bottom=tmp; bdw->right=tmp;
         break;
     case DEBORDER_ELEVATED:
     default:
@@ -190,6 +249,9 @@ static DynFunTab debrush_dynfuntab[]={
     {(DynFun*)grbrush_get_slave, (DynFun*)debrush_get_slave},
     {grbrush_begin, debrush_begin},
     {grbrush_end, debrush_end},
+    {grbrush_init_attr, debrush_init_attr},
+    {grbrush_set_attr, debrush_set_attr},
+    {grbrush_unset_attr, debrush_unset_attr},
     END_DYNFUNTAB
 };
 
index a1a6b3fd7de2be784b28976f658992f61a6fc431..d9a040a50f80b970c1d3838c15492f0835f3c478 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/brush.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -25,10 +25,12 @@ INTRCLASS(DEBrush);
 
 
 typedef void DEBrushExtrasFn(DEBrush *brush, 
-                             const WRectangle *g, DEColourGroup *cg,
+                             const WRectangle *g, 
+                             DEColourGroup *cg,
                              GrBorderWidths *bdw,
                              GrFontExtents *fnte,
-                             const char *a1, const char *a2,
+                             const GrStyleSpec *a1,
+                             const GrStyleSpec *a2,
                              bool pre);
 
 DECLCLASS(DEBrush){
@@ -38,15 +40,17 @@ DECLCLASS(DEBrush){
     int indicator_w;
     Window win;
     bool clip_set;
+    
+    GrStyleSpec current_attr;
 };
 
 extern DEBrush *de_get_brush(Window win, WRootWin *rootwin,
                              const char *style);
 
 extern DEBrush *create_debrush(Window win, 
-                               const char *stylename, DEStyle *style);
+                               const GrStyleSpec *spec, DEStyle *style);
 extern bool debrush_init(DEBrush *brush, Window win,
-                         const char *stylename, DEStyle *style);
+                         const GrStyleSpec *spec, DEStyle *style);
 extern void debrush_deinit(DEBrush *brush);
 
 extern DEBrush *debrush_get_slave(DEBrush *brush, WRootWin *rootwin, 
@@ -56,18 +60,24 @@ extern void debrush_release(DEBrush *brush);
 
 
 extern DEColourGroup *debrush_get_colour_group2(DEBrush *brush, 
-                                                const char *attr_p1,
-                                                const char *attr_p2);
+                                                const GrStyleSpec *a1,
+                                                const GrStyleSpec *a2);
 
 extern DEColourGroup *debrush_get_colour_group(DEBrush *brush, 
-                                               const char *attr);
+                                               const GrStyleSpec *attr);
 
+extern DEColourGroup *debrush_get_current_colour_group(DEBrush *brush);
 
 /* Begin/end */
 
 extern void debrush_begin(DEBrush *brush, const WRectangle *geom, int flags);
 extern void debrush_end(DEBrush *brush);
 
+extern void debrush_init_attr(DEBrush *brush, const GrStyleSpec *spec);
+extern void debrush_set_attr(DEBrush *brush, GrAttr attr);
+extern void debrush_unset_attr(DEBrush *brush, GrAttr attr);
+extern GrStyleSpec *debrush_get_current_attr(DEBrush *brush);
+
 /* Information */
 
 extern void debrush_get_border_widths(DEBrush *brush, GrBorderWidths *bdw);
@@ -77,18 +87,16 @@ extern bool debrush_get_extra(DEBrush *brush, const char *key, char type,
 /* Borders & boxes */
 
 extern void debrush_draw_border(DEBrush *brush, 
-                                const WRectangle *geom,
-                                const char *attrib);
+                                const WRectangle *geom);
 extern void debrush_draw_borderline(DEBrush *brush, const WRectangle *geom,
-                                    const char *attrib, GrBorderLine line);
+                                    GrBorderLine line);
 
 extern void debrush_draw_textbox(DEBrush *brush, const WRectangle *geom,
-                                 const char *text, const char *attr,
-                                 bool needfill);
+                                 const char *text, bool needfill);
 
 extern void debrush_draw_textboxes(DEBrush *brush, const WRectangle *geom, 
                                    int n, const GrTextElem *elem, 
-                                   bool needfill, const char *common_attrib);
+                                   bool needfill);
 
 extern DEBrushExtrasFn debrush_tab_extras;
 extern DEBrushExtrasFn debrush_menuentry_extras;
@@ -100,8 +108,7 @@ extern void debrush_set_window_shape(DEBrush *brush, bool rough,
 
 extern void debrush_enable_transparency(DEBrush *brush, GrTransparency mode);
 
-extern void debrush_fill_area(DEBrush *brush, const WRectangle *geom, 
-                              const char *attr);
+extern void debrush_fill_area(DEBrush *brush, const WRectangle *geom);
 extern void debrush_clear_area(DEBrush *brush, const WRectangle *geom);
 
 
index c3797c35f3cb302a93c2070ca094dcc93140a394..5693d81a94948ff570238d3de6f228cc4e98e733 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/colour.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -56,10 +56,7 @@ void de_free_colour_group(WRootWin *rootwin, DEColourGroup *cg)
     
     XFreeColors(ioncore_g.dpy, rootwin->default_cmap, pixels, 5, 0);
     
-    if(cg->spec!=NULL){
-        free(cg->spec);
-        cg->spec=NULL;
-    }
+    gr_stylespec_unalloc(&cg->spec);
 }
 
 
index 8886b9783fba49a579fbe660ec3b8e1841812c67..06d865407e8fcb38611d8927502a517c96cca4c8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/colour.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -24,7 +24,7 @@ typedef unsigned long DEColour;
 
 
 DECLSTRUCT(DEColourGroup){
-    char *spec;
+    GrStyleSpec spec;
     DEColour bg, hl, sh, fg, pad;
 };
 
index aae2dae629d30bb0109aaf67fead4c58b5dc7f64..552e48f990bd00dc9b2eb79a27168a4e76fc6b62 100644 (file)
--- a/de/draw.c
+++ b/de/draw.c
@@ -1,7 +1,7 @@
 /*
  * ion/de/draw.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 
 
 static DEColourGroup *destyle_get_colour_group2(DEStyle *style,
-                                                const char *attr_p1,
-                                                const char *attr_p2)
+                                                const GrStyleSpec *a1,
+                                                const GrStyleSpec *a2)
 {
     int i, score, maxscore=0;
     DEColourGroup *maxg=&(style->cgrp);
     
     while(style!=NULL){
         for(i=0; i<style->n_extra_cgrps; i++){
-            score=gr_stylespec_score2(style->extra_cgrps[i].spec,
-                                      attr_p1, attr_p2);
+            score=gr_stylespec_score2(&style->extra_cgrps[i].spec, a1, a2);
+            
             if(score>maxscore){
                 maxg=&(style->extra_cgrps[i]);
                 maxscore=score;
@@ -49,19 +49,25 @@ static DEColourGroup *destyle_get_colour_group2(DEStyle *style,
 
 
 DEColourGroup *debrush_get_colour_group2(DEBrush *brush, 
-                                         const char *attr_p1,
-                                         const char *attr_p2)
+                                         const GrStyleSpec *a1,
+                                         const GrStyleSpec *a2)
 {
-    return destyle_get_colour_group2(brush->d, attr_p1, attr_p2);
+    return destyle_get_colour_group2(brush->d, a1, a2);
 }
 
 
-DEColourGroup *debrush_get_colour_group(DEBrush *brush, const char *attr)
+DEColourGroup *debrush_get_colour_group(DEBrush *brush, const GrStyleSpec *attr)
 {
     return destyle_get_colour_group2(brush->d, attr, NULL);
 }
 
 
+DEColourGroup *debrush_get_current_colour_group(DEBrush *brush)
+{
+    return debrush_get_colour_group(brush, debrush_get_current_attr(brush));
+}
+
+
 /*}}}*/
 
 
@@ -160,11 +166,12 @@ void debrush_do_draw_border(DEBrush *brush, WRectangle geom,
 }
 
 
+
+    
 void debrush_draw_border(DEBrush *brush, 
-                         const WRectangle *geom,
-                         const char *attrib)
+                         const WRectangle *geom)
 {
-    DEColourGroup *cg=debrush_get_colour_group(brush, attrib);
+    DEColourGroup *cg=debrush_get_current_colour_group(brush);
     if(cg!=NULL)
         debrush_do_draw_border(brush, *geom, cg);
 }
@@ -223,9 +230,9 @@ void debrush_do_draw_borderline(DEBrush *brush, WRectangle geom,
 
 
 void debrush_draw_borderline(DEBrush *brush, const WRectangle *geom,
-                             const char *attrib, GrBorderLine line)
+                             GrBorderLine line)
 {
-    DEColourGroup *cg=debrush_get_colour_group(brush, attrib);
+    DEColourGroup *cg=debrush_get_current_colour_group(brush);
     if(cg!=NULL)
         debrush_do_draw_borderline(brush, *geom, cg, line);
 }
@@ -251,10 +258,16 @@ static void copy_masked(DEBrush *brush, Drawable src, Drawable dst,
 }
 
 
+static GrStyleSpec dragged_spec=GR_STYLESPEC_INIT;
+static GrStyleSpec tagged_spec=GR_STYLESPEC_INIT;
+static GrStyleSpec submenu_spec=GR_STYLESPEC_INIT;
+
+
 void debrush_tab_extras(DEBrush *brush, const WRectangle *g, 
                         DEColourGroup *cg, GrBorderWidths *bdw,
                         GrFontExtents *fnte,
-                        const char *a1, const char *a2,
+                        const GrStyleSpec *a1, 
+                        const GrStyleSpec *a2,
                         bool pre)
 {
     DEStyle *d=brush->d;
@@ -263,9 +276,12 @@ void debrush_tab_extras(DEBrush *brush, const WRectangle *g,
      * with shared GC:s.
      */
     static bool swapped=FALSE;
+
+    ENSURE_INITSPEC(dragged_spec, "dragged");
+    ENSURE_INITSPEC(tagged_spec, "tagged");
     
     if(pre){
-        if(!MATCHES2("*-*-*-dragged", a1, a2))
+        if(!MATCHES2(dragged_spec, a1, a2))
             return;
         
         tmp=d->normal_gc;
@@ -276,7 +292,7 @@ void debrush_tab_extras(DEBrush *brush, const WRectangle *g,
         return;
     }
     
-    if(MATCHES2("*-*-tagged", a1, a2)){
+    if(MATCHES2(tagged_spec, a1, a2)){
         XSetForeground(ioncore_g.dpy, d->copy_gc, cg->fg);
             
         copy_masked(brush, d->tag_pixmap, brush->win, 0, 0,
@@ -298,10 +314,13 @@ void debrush_tab_extras(DEBrush *brush, const WRectangle *g,
 }
 
 
-void debrush_menuentry_extras(DEBrush *brush, const WRectangle *g, 
-                              DEColourGroup *cg, GrBorderWidths *bdw,
+void debrush_menuentry_extras(DEBrush *brush, 
+                              const WRectangle *g, 
+                              DEColourGroup *cg, 
+                              GrBorderWidths *bdw,
                               GrFontExtents *fnte,
-                              const char *a1, const char *a2, 
+                              const GrStyleSpec *a1, 
+                              const GrStyleSpec *a2, 
                               bool pre)
 {
     int tx, ty;
@@ -309,7 +328,9 @@ void debrush_menuentry_extras(DEBrush *brush, const WRectangle *g,
     if(pre)
         return;
     
-    if(!MATCHES2("*-*-submenu", a1, a2))
+    ENSURE_INITSPEC(submenu_spec, "submenu");
+    
+    if(!MATCHES2(submenu_spec, a1, a2))
         return;
         
     ty=(g->y+bdw->top+fnte->baseline
@@ -336,10 +357,13 @@ void debrush_do_draw_box(DEBrush *brush, const WRectangle *geom,
 }
 
 
-static void debrush_do_draw_textbox(DEBrush *brush, const WRectangle *geom, 
-                                    const char *text, DEColourGroup *cg, 
+static void debrush_do_draw_textbox(DEBrush *brush, 
+                                    const WRectangle *geom, 
+                                    const char *text, 
+                                    DEColourGroup *cg, 
                                     bool needfill,
-                                    const char *a1, const char *a2)
+                                    const GrStyleSpec *a1, 
+                                    const GrStyleSpec *a2)
 {
     uint len;
     GrBorderWidths bdw;
@@ -386,10 +410,11 @@ static void debrush_do_draw_textbox(DEBrush *brush, const WRectangle *geom,
 
 
 void debrush_draw_textbox(DEBrush *brush, const WRectangle *geom, 
-                          const char *text, const char *attr, 
-                          bool needfill)
+                          const char *text, bool needfill)
 {
+    GrStyleSpec *attr=debrush_get_current_attr(brush);
     DEColourGroup *cg=debrush_get_colour_group(brush, attr);
+    
     if(cg!=NULL){
         debrush_do_draw_textbox(brush, geom, text, cg, needfill, 
                                 attr, NULL);
@@ -399,24 +424,30 @@ void debrush_draw_textbox(DEBrush *brush, const WRectangle *geom,
 
 void debrush_draw_textboxes(DEBrush *brush, const WRectangle *geom,
                             int n, const GrTextElem *elem, 
-                            bool needfill, const char *common_attrib)
+                            bool needfill)
 {
+    GrStyleSpec *common_attrib;
     WRectangle g=*geom;
     DEColourGroup *cg;
     GrBorderWidths bdw;
     int i;
     
+    common_attrib=debrush_get_current_attr(brush);
+    
     grbrush_get_border_widths(&(brush->grbrush), &bdw);
     
-    for(i=0; i<n; i++){
+    for(i=0; ; i++){
         g.w=bdw.left+elem[i].iw+bdw.right;
-        cg=debrush_get_colour_group2(brush, common_attrib, elem[i].attr);
+        cg=debrush_get_colour_group2(brush, common_attrib, &elem[i].attr);
         
         if(cg!=NULL){
             debrush_do_draw_textbox(brush, &g, elem[i].text, cg, needfill,
-                                    common_attrib, elem[i].attr);
+                                    common_attrib, &elem[i].attr);
         }
         
+        if(i==n-1)
+            break;
+        
         g.x+=g.w;
         if(bdw.spacing>0 && needfill){
             XClearArea(ioncore_g.dpy, brush->win, g.x, g.y,
@@ -490,9 +521,9 @@ void debrush_enable_transparency(DEBrush *brush, GrTransparency mode)
 }
 
 
-void debrush_fill_area(DEBrush *brush, const WRectangle *geom, const char *attr)
+void debrush_fill_area(DEBrush *brush, const WRectangle *geom)
 {
-    DEColourGroup *cg=debrush_get_colour_group(brush, attr);
+    DEColourGroup *cg=debrush_get_current_colour_group(brush);
     GC gc=brush->d->normal_gc;
 
     if(cg==NULL)
@@ -555,9 +586,13 @@ static void debrush_clear_clipping_rectangle(DEBrush *brush)
 
 void debrush_begin(DEBrush *brush, const WRectangle *geom, int flags)
 {
+    
     if(flags&GRBRUSH_AMEND)
         flags|=GRBRUSH_NO_CLEAR_OK;
     
+    if(!(flags&GRBRUSH_KEEP_ATTR))
+        debrush_init_attr(brush, NULL);
+    
     if(!(flags&GRBRUSH_NO_CLEAR_OK))
         debrush_clear_area(brush, geom);
     
index 9d80c1e30f16204e8f333231a7fb167a427e43d7..957cc61671d378bd0439d0ecd15bb5fce60762ae 100644 (file)
--- a/de/font.c
+++ b/de/font.c
@@ -1,7 +1,7 @@
 /*
  * ion/de/font.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -267,10 +267,9 @@ void debrush_do_draw_string(DEBrush *brush, int x, int y,
 
 
 void debrush_draw_string(DEBrush *brush, int x, int y,
-                         const char *str, int len, bool needfill,
-                         const char *attrib)
+                         const char *str, int len, bool needfill)
 {
-    DEColourGroup *cg=debrush_get_colour_group(brush, attrib);
+    DEColourGroup *cg=debrush_get_current_colour_group(brush);
     if(cg!=NULL)
         debrush_do_draw_string(brush, x, y, str, len, needfill, cg);
 }
index d2f5e3b0cf16bbc9acf3c1d91489a12b960c6b6a..7e40121a2c65fca82da316af5085b2f5b1faa78f 100644 (file)
--- a/de/font.h
+++ b/de/font.h
@@ -1,7 +1,7 @@
 /*
  * ion/de/font.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -38,8 +38,7 @@ extern DEFont *de_load_font(const char *fontname);
 extern void de_free_font(DEFont *font);
 
 extern void debrush_draw_string(DEBrush *brush, int x, int y,
-                                const char *str, int len, bool needfill,
-                                const char *attrib);
+                                const char *str, int len, bool needfill);
 extern void debrush_do_draw_string(DEBrush *brush, int x, int y,
                                    const char *str, int len, bool needfill, 
                                    DEColourGroup *colours);
index 256d1d979416b72dbe657671574a8bc573d450af..994c769c0920bbe0cf9bea5210208dcaea25bddf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/fontset.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 3e779b3f9886ff9f2d1472ce36833b10746a2742..ad403236d9ee20cae83bfa52e52a18e2ff1e3e31 100644 (file)
--- a/de/init.c
+++ b/de/init.c
@@ -1,7 +1,7 @@
 /*
  * ion/de/init.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include "exports.h"
 
 
+/*{{{ Style specifications */
+
+
+static bool get_spec(ExtlTab tab, const char *name, GrStyleSpec *spec,
+                     char **pat_ret)
+{
+    char *str;
+    bool res;
+    
+    if(!extl_table_gets_s(tab, name, &str))
+        return FALSE;
+        
+    res=gr_stylespec_load(spec, str);
+    
+    if(pat_ret==NULL)
+        free(str);
+    else
+        *pat_ret=str;
+    
+    return res;
+}
+
+
+/*}}}*/
+
+
 /*{{{ Borders */
 
 
@@ -141,15 +167,18 @@ void de_get_extra_cgrps(WRootWin *rootwin, DEStyle *style, ExtlTab tab)
         return;
 
     for(i=0; i<n-nfailed; i++){
+        GrStyleSpec spec;
+        
         if(!extl_table_geti_t(tab, i+1, &sub))
             goto err;
-        if(!extl_table_gets_s(sub, "substyle_pattern", &name)){
+        
+        if(!get_spec(sub, "substyle_pattern", &spec, NULL)){
             extl_unref_table(sub);
             goto err;
         }
         
-        /*de_init_colour_group(rootwin, style->extra_cgrps+i-nfailed);*/
-        style->extra_cgrps[i-nfailed].spec=name;
+        style->extra_cgrps[i-nfailed].spec=spec;
+        
         de_get_colour_group(rootwin, style->extra_cgrps+i-nfailed, sub, 
                             style);
         
@@ -237,6 +266,8 @@ void de_get_nonfont(WRootWin *rootwin, DEStyle *style, ExtlTab tab)
 }
 
 
+
+
 /*EXTL_DOC
  * Define a style for the root window \var{rootwin}. 
  */
@@ -246,8 +277,9 @@ bool de_defstyle_rootwin(WRootWin *rootwin, const char *name, ExtlTab tab)
     DEStyle *style;
     char *fnt;
     uint n;
+    char *based_on_name;
     DEStyle *based_on=NULL;
-    char *based_on_name=NULL;
+    GrStyleSpec based_on_spec;
 
     if(name==NULL)
         return FALSE;
@@ -257,18 +289,22 @@ bool de_defstyle_rootwin(WRootWin *rootwin, const char *name, ExtlTab tab)
     if(style==NULL)
         return FALSE;
 
-    if(extl_table_gets_s(tab, "based_on", &based_on_name)){
-        based_on=de_get_style(rootwin, based_on_name);
+    if(get_spec(tab, "based_on", &based_on_spec, &based_on_name)){
+        based_on=de_get_style(rootwin, &based_on_spec);
+        
+        gr_stylespec_unalloc(&based_on_spec);
+
         if(based_on==style){
             warn(TR("'based_on' for %s points back to the style itself."),
                  name);
         }else if(based_on==NULL){
-            warn(TR("Unknown base style \"%s\"."), based_on);
+            warn(TR("Unknown base style. \"%s\""), based_on_name);
         }else{
             style->based_on=based_on;
             based_on->usecount++;
             /* Copy simple parameters */
         }
+        
         free(based_on_name);
     }
 
index f3b6f10740d7c8ea394c28de4ba81ef3db1c02e7..c751bb0e9db6ad8f8bd5217062731c9be3fd5d3e 100644 (file)
--- a/de/init.h
+++ b/de/init.h
@@ -1,7 +1,7 @@
 /*
  * ion/de/init.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 39141e6fc2aa4fe239dff33889ea7426172feddd..dde51c4ef26c98d861dcc00ee8638b2b573def4d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/private.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #define DE_SUB_IND " ->"
 #define DE_SUB_IND_LEN 3
 
-#define MATCHES(S, A) (gr_stylespec_score(S, A)>0)
-#define MATCHES2(S, A1, A2) (gr_stylespec_score2(S, A1, A2)>0)
+#define MATCHES(S, A) (gr_stylespec_score(&(S), A)>0)
+#define MATCHES2(S, A1, A2) (gr_stylespec_score2(&(S), A1, A2)>0)
 
+#define ENSURE_INITSPEC(S, NM) \
+    if((S).attrs==NULL) gr_stylespec_load(&(S), NM);
+    
 #endif /* ION_DE_PRIVATE_H */
index cf44e4787f2748dc9decff94e9a5e500ec869b5f..8db97cd5137c19fa779d27c7fcef00864ab57789 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/style.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -119,7 +119,7 @@ void destyle_create_tab_gcs(DEStyle *style)
 static DEStyle *styles=NULL;
 
 
-DEStyle *de_get_style(WRootWin *rootwin, const char *stylename)
+DEStyle *de_get_style(WRootWin *rootwin, const GrStyleSpec *spec)
 {
     DEStyle *style, *maxstyle=NULL;
     int score, maxscore=0;
@@ -127,7 +127,7 @@ DEStyle *de_get_style(WRootWin *rootwin, const char *stylename)
     for(style=styles; style!=NULL; style=style->next){
         if(style->rootwin!=rootwin)
             continue;
-        score=gr_stylespec_score(style->style, stylename);
+        score=gr_stylespec_score(&style->spec, spec);
         if(score>maxscore){
             maxstyle=style;
             maxscore=score;
@@ -160,8 +160,7 @@ void destyle_deinit(DEStyle *style)
     
     UNLINK_ITEM(styles, style, next, prev);
     
-    if(style->style!=NULL)
-        free(style->style);
+    gr_stylespec_unalloc(&style->spec);
     
     if(style->font!=NULL){
         de_free_font(style->font);
@@ -206,8 +205,7 @@ static void dump_style(DEStyle *style)
 
 bool destyle_init(DEStyle *style, WRootWin *rootwin, const char *name)
 {
-    style->style=scopy(name);
-    if(style->style==NULL)
+    if(!gr_stylespec_load(&style->spec, name))
         return FALSE;
     
     style->based_on=NULL;
@@ -228,12 +226,12 @@ bool destyle_init(DEStyle *style, WRootWin *rootwin, const char *name)
     style->textalign=DEALIGN_CENTER;
 
     style->cgrp_alloced=FALSE;
-    style->cgrp.spec=NULL;
     style->cgrp.bg=DE_BLACK(rootwin);
     style->cgrp.pad=DE_BLACK(rootwin);
     style->cgrp.fg=DE_WHITE(rootwin);
     style->cgrp.hl=DE_WHITE(rootwin);
     style->cgrp.sh=DE_WHITE(rootwin);
+    gr_stylespec_init(&style->cgrp.spec);
     
     style->font=NULL;
     
@@ -268,17 +266,18 @@ static DEStyle *do_create_style(WRootWin *rootwin, const char *name)
 DEStyle *de_create_style(WRootWin *rootwin, const char *name)
 {
     DEStyle *oldstyle, *style;
-
+    uint score;
+    
     style=do_create_style(rootwin, name);
     
     if(style==NULL)
         return NULL;
     
     for(oldstyle=styles; oldstyle!=NULL; oldstyle=oldstyle->next){
-        if(oldstyle->rootwin==rootwin && oldstyle->style!=NULL && 
-           strcmp(oldstyle->style, name)==0){
+        if(oldstyle->rootwin!=rootwin)
+            continue;
+        if(gr_stylespec_equals(&oldstyle->spec, &style->spec))
             break;
-        }
     }
     
     if(oldstyle!=NULL && !oldstyle->is_fallback)
@@ -312,8 +311,8 @@ void de_deinit_styles()
     for(style=styles; style!=NULL; style=next){
         next=style->next;
         if(style->usecount>1){
-            warn(TR("Style %s still in use [%d] but the module "
-                    "is being unloaded!"), style->style, style->usecount);
+            warn(TR("Style is still in use [%d] but the module "
+                    "is being unloaded!"), style->usecount);
         }
         dump_style(style);
     }
index f25c44ceedeaf7758a7223a7cda2ed9c562196ed..90dfc07345bae0c619687b0f0909ca7707c8008f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/de/style.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -46,7 +46,7 @@ DECLSTRUCT(DEBorder){
 
 
 DECLSTRUCT(DEStyle){
-    char *style;
+    GrStyleSpec spec;
     int usecount;
     bool is_fallback;
     
@@ -91,7 +91,7 @@ extern void destyle_create_tab_gcs(DEStyle *style);
 extern void de_reset();
 extern void de_deinit_styles();
 
-extern DEStyle *de_get_style(WRootWin *rootwin, const char *name);
+extern DEStyle *de_get_style(WRootWin *rootwin, const GrStyleSpec *spec);
 
 
 #endif /* ION_DE_STYLE_H */
index 5e3a3d1fb8249f2e572c882cce5d7edd74999d82..0756556ab21add3c2e346ea0d27816795b8b8b5a 100644 (file)
@@ -1,3 +1,36 @@
+2007-02-03 15:04 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  tagged ion-doc-3ds-20070203
+
+2007-02-03 15:00 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Style configuration documentation updates
+
+2007-02-02 21:38 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Statusbar stuff was missing
+
+2007-01-30 18:29 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Documented new_group
+
+2007-01-26 18:16 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Hook reference updates
+
+2007-01-18 07:54 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Updates
+
+2007-01-17 19:28 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Updated class hierarchies
+
+2007-01-13 18:43 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Update
+
+2007-01-13 16:12 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Updated hook documentation
+
+2007-01-03 19:12 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Document focuslist and focuslist_ menus
+
+2007-01-03 15:31 UTC  Tuomo Valkonen <tuomov@iki.fi>
+  * Added missing clientwin_property_change_hook documentation
+
 2006-12-23 15:00 UTC  Tuomo Valkonen <tuomov@iki.fi>
   tagged ion-doc-3ds-20061223
 
index bd580cab18a35b4867f266c962fb9502ae1ad658..aa203d8939c946cd6d2803e3f6174d70becd457d 100644 (file)
@@ -17,7 +17,7 @@ DOCS=ionconf ionnotes
 
 FNTEXES=ioncore-fns.tex mod_tiling-fns.tex \
        mod_query-fns.tex de-fns.tex mod_menu-fns.tex \
-       mod_dock-fns.tex mod_sp-fns.tex
+       mod_dock-fns.tex mod_sp-fns.tex mod_statusbar-fns.tex
 
 # Generic rules
 ######################################
@@ -124,6 +124,9 @@ mod_dock-fns.tex: $(TOPDIR)/mod_dock/*.c
 mod_sp-fns.tex: $(TOPDIR)/mod_sp/*.c
        $(MKEXPORTS) -module mod_sp -mkdoc -o $@ $+
 
+mod_statusbar-fns.tex: $(TOPDIR)/mod_statusbar/*.c
+       $(MKEXPORTS) -module mod_statusbar -mkdoc -o $@ $+
+
 de-fns.tex: $(TOPDIR)/de/*.c
        $(MKEXPORTS) -module de -mkdoc -o $@ $+
 
index 3f9ee17dcdb2db5b2ec4d2fc8cad3c6699c76fe1..f47a5a8077c0ce86397e913160807526f6549afb 100644 (file)
@@ -48,6 +48,11 @@ just like the menus defined as above.
     List of all client windows. Activating an entry jumps to that window. \\
     \code{workspacelist} & 
     List of all workspaces. Activating an entry jumps to that workspaces. \\
+    \code{focuslist} & 
+    List of client windows with recent activity in them, followed by 
+    previously focused client windows. \\
+    \code{focuslist_} & 
+    List of previously focused client windows. \\
     \code{stylemenu} &
     List of available \file{look\_*.lua} style files. Activating an entry
     loads that style and ask to save the selection. \\
index 10c1c10fa8b3d4bc4ddf8485b4d9285ebe66c5cb..9a416d3ec0c20bf50db277185d25f23067e2d0c5 100644 (file)
@@ -100,12 +100,32 @@ usual method of identifying windows, and how to obtain this information.
 \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}{statusbar}{string}
+    \index{statusbar@\var{statusbar}}
+    Put the window on the statusbar, in the named tray component,
+    (The default tray component is called simply ``\code{systray}'', 
+    and others you give names to in your custom template, always 
+    prefixed by ``\code{systray_}''.
+\end{winprop}
+
+
 \begin{winprop}{switchto}{boolean}
     \index{switchto@\var{switchto}}
     Should a newly mapped client window be switched to within
@@ -116,7 +136,7 @@ usual method of identifying windows, and how to obtain this information.
 \begin{winprop}{target}{string}
     \index{target@\var{target}}
     The name of an object (workspace, frame) that should manage 
-    windows of this type. 
+    windows of this type. See also \code{new_group}.
 \end{winprop}
 
         
index 6c8c2b4d535a25e6aa46329266b9ead96485f1a1..ceba206bbd189f858b3855d4805051ba646c4926 100644 (file)
@@ -45,7 +45,6 @@ foo-bar-baz
 foo-*-baz
 foo-bar
 *
-foo-baz   -- Doesn't match, not selected!
 \end{verbatim}
 
 Some of the drawing primitives allow extra attributes to be
@@ -72,9 +71,13 @@ tag and drag states.)
 \begin{tabularx}{\linewidth}{lX}
 \tabhead{Style name & Description}
 \code{frame} & Style for frames. 
-       Substyles: \code{active}, \code{inactive}. \\
+       Substyle attributes: \code{active}/\code{inactive} 
+       (mutually exclusive) and
+       \code{quasiactive}\nobreak/\code{not_quasiactive}. 
+       A frame is ``quasiactive'' when an active region
+       has a backlink to it, such as a detached window. \\
 \code{frame-tiled} & A more specific style for tiled frames.
-        Substyles as for \code{frame}. \\
+        Substyle attributes as for \code{frame}. \\
 \code{frame-tiled-alt} & An alternative style for tiled frames.
         Often used to disable the tab-bar. \\
 \code{frame-floating} & A more specific style for floating
@@ -88,22 +91,25 @@ tag and drag states.)
 \begin{tabularx}{\linewidth}{lX}
 \tabhead{Style name & Description}
 \code{tab} & Style for frames' tabs and menu entries. 
-       Substyles: combinations of the form \code{a-s} where
-       \code{a} is one of \code{active}\nobreak/\code{inactive} and
-       \code{s} is one of \code{selected}\nobreak/\code{unselected} \\
+       Substyle attributes:
+       \code{active}\nobreak/\code{inactive} and
+       \code{selected}\nobreak/\code{unselected} \\
 \code{tab-frame} & A more specific style for frames' tabs.
-       Substyles: combinations of the form \code{a-s-t-d-u} where
-       \code{a} and \code{s} are as above and
-       \code{t} is one of \code{tagged}\nobreak/\code{not_tagged},
-       \code{d} is one of \code{dragged}\nobreak/\code{not_dragged} and
-       \code{u} is one of \code{activity}\nobreak/\code{no_activity}. \\
+        Additional substyle attributes include:
+       \code{tagged}\nobreak/\code{not_tagged},
+       \code{dragged}\nobreak/\code{not_dragged},
+       \code{activity}\nobreak/\code{no_activity} and
+       \code{quasiactive}\nobreak/\code{not_quasiactive}. \\
 \code{tab-frame-tiled}, & \\
 \code{tab-frame-tiled-alt}, & \\
 \code{tab-frame-floating}, & \\
 \code{tab-frame-transient} & More specific styles for frames in the
         different modes. \\
-\code{tab-menuentry} & A more specific style for entries in \type{WMenu}s. \\
-\code{tab-menuentry-bigmenu} & An alternate style for entries in \type{WMenu}s. \\
+\code{tab-menuentry} & A more specific style for entries in \type{WMenu}s. 
+        Additional substyle attributes include \code{submenu} and
+        occasionally also \code{activity} is used.\\
+\code{tab-menuentry-bigmenu} & 
+        An alternate style for entries in \type{WMenu}s. \\
 \end{tabularx}
 
 \subsubsection{The rest}
@@ -112,7 +118,7 @@ tag and drag states.)
 \tabhead{Style name & Description}
 \code{input} & A style for \type{WInput}s. \\
 \code{input-edln} & A more specific style for \type{WEdln}s. 
-       Substyles: \code{selection} for selected text and
+       Substyle attributes: \code{selection} for selected text and
        \code{cursor} for the cursor indicating current editing point. \\
 \code{input-message} & A more specific style for \type{WMessage}s. \\
 \code{input-menu} & A more specific style for \type{WMenu}s. \\
@@ -135,7 +141,7 @@ and should usually be symlinked to or a copy of of some
 
 \subsection{The structure of the configuration files}
 
-The first thing to do in a stylefile is to choose the drawing
+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.
 
index 0413a6bbd99faa0b8ebd3dd97d5e03250b600cbe..40b3215f2e26ccb3711cdc3de67267a8e6107f76 100644 (file)
@@ -1,5 +1,5 @@
 
 Context:
 
-[TAG ion-doc-3ds-20061223
-Tuomo Valkonen <tuomov@iki.fi>**20061223150012
+[TAG ion-doc-3ds-20070203
+Tuomo Valkonen <tuomov@iki.fi>**20070203150437
index d5d5a3904536987f0eef229202c0eb1840a202a6..8e1cfa972103590e8fdc08e6a92531b76d4e6325 100644 (file)
      |-->WRegion
      |    |-->WClientWin
      |    |-->WWindow
-     |    |    |-->WRootWin
      |    |    |-->WMPlex
-     |    |    |    |-->WScreen
      |    |    |    |-->WFrame
+     |    |    |    |-->WScreen
+     |    |    |         |->WRootWin
      |    |    |-->WInfoWin
      |    |    |    |-->WStatusBar (mod_statusbar)
      |    |    |-->WMenu (mod_menu)
index f4f2a9e562f40cfaa36f2a776d92100bbbb458c2..4c26562b77c35302a24d23964aad280901cce3fd 100644 (file)
@@ -42,6 +42,17 @@ reg:attach(cwin)
 \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}
@@ -142,71 +153,6 @@ reg:attach(cwin)
 \end{function}
 
 
-%\begin{function}
-%    \index{panews-init-layout-alt@\code{panews_init_layout_alt}}
-%    \hookname{panews_init_layout_alt}
-%    \hookparams{table}
-%    \begin{funcdesc}
-%      Called to initialise panews layout. The table parameter has
-%      initially a single field \var{ws} pointing to the workspace,
-%      but the succesfull handler should set the field \var{layout}
-%      to a proper layout (as those saved in the layout savefiles).
-%    \end{funcdesc}
-%\end{function}
-
-
-\begin{function}
-    \index{panews-make-placement-alt@\code{panews_make_placement_alt}}
-    \hookname{panews_make_placement_alt}
-    \hookparams{table}
-    \begin{funcdesc}
-      Called to make a placement on panews. The parameter table has
-      the following fields:
-      
-      \begin{tabularx}{\linewidth}{llX}
-          \tabhead{Field & Type & Description}
-          \var{ws} & \type{WPaneWS} & The workspace \\
-          \var{frame} & \type{WFrame} & A frame initially allocated for the
-              region to be placed \\
-          \var{reg} & \type{WRegion} & The region to be placed \\
-          \var{specifier} & \type{WRegion} & For drag\&drop on handling empty areas\\
-      \end{tabularx}
-      
-      The handler should set some of these fields on success:
-
-      \begin{tabularx}{\linewidth}{llX}
-          \tabhead{Field & Type & Description}
-          \var{res_node} & \type{WSplit} & Target split \\
-          \var{res_config} & \type{WFrame} &  New configuration for it, unless
-              \type{WSplitRegion} \\
-          \var{res_w} & integer & New width for target split (optional) \\
-          \var{res_h} & integer & New height for target split (optional) \\
-      \end{tabularx}
-    \end{funcdesc}
-\end{function}
-
-
-\begin{function}
-    \index{region-activated-hook@\code{region_activated_hook}}
-    \hookname{region_activated_hook}
-    \hookparams{WRegion}
-    \begin{funcdesc}
-      Signalled when a region or one of its children has received the focus.
-    \end{funcdesc}
-\end{function}
-
-
-\begin{function}
-    \index{region-activity-hook@\code{region_activity_hook}}
-    \hookname{region_activity_hook}
-    \hookparams{WRegion}
-    \begin{funcdesc}
-      This hook is triggered when the activity flag of the parameter 
-      region has been changed.
-    \end{funcdesc}
-\end{function}
-
-
 \begin{function}
     \index{region-do-warp-alt@\code{region_do_warp_alt}}
     \hookname{region_do_warp_alt}
@@ -218,17 +164,6 @@ reg:attach(cwin)
 \end{function}
 
 
-\begin{function}
-    \index{region-inactivated-hook@\code{region_inactivated_hook}}
-    \hookname{region_inactivated_hook}
-    \hookparams{WRegion}
-    \begin{funcdesc}
-      Signalled when the focus has moved from the parameter region or
-      one of its children to a non-child region of the parameter region.
-    \end{funcdesc}
-\end{function}
-
-
 \begin{function}
     \index{screen-managed-changed-hook@\code{screen_managed_changed_hook}}
     \hookname{screen_managed_changed_hook}
@@ -239,3 +174,37 @@ reg:attach(cwin)
       \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 pseudoactive
+                      (see below). \\
+          \code{pseudoinactivated} & The region is no longer pseudoactive. \\
+      \end{tabularx}
+
+      A region is pseudoactive, 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}
+
+
index 905ef666b25cfeb7fbaac77cf9b89c76d8c7697b..7d7c9340cf2735c1e6c3f03973b6a51223566111 100644 (file)
Binary files a/doc/ionconf.dvi.gz and b/doc/ionconf.dvi.gz differ
index 060a02d416a096ad37e7909db18848a7e414f433..2f1b8ec29be35836f5699ed363aa84e7b86a3e60 100644 (file)
 \BOOKMARK [2][-]{subsection.4.2.2}{ Defining the styles}{section.4.2}
 \BOOKMARK [2][-]{subsection.4.2.3}{ An example}{section.4.2}
 \BOOKMARK [1][-]{section.4.3}{ Miscellaneous settings}{chapter.4}
-\BOOKMARK [2][-]{lstlisting.4.-385}{ Extra fields for style !frame!}{section.4.3}
-\BOOKMARK [2][-]{lstlisting.4.-407}{ Extra fields for style !dock!}{section.4.3}
+\BOOKMARK [2][-]{lstlisting.4.-390}{ Extra fields for style !frame!}{section.4.3}
+\BOOKMARK [2][-]{lstlisting.4.-412}{ Extra fields for style !dock!}{section.4.3}
 \BOOKMARK [0][-]{chapter.5}{ Scripting}{}
 \BOOKMARK [1][-]{section.5.1}{ Hooks}{chapter.5}
 \BOOKMARK [1][-]{section.5.2}{ Referring to regions}{chapter.5}
 \BOOKMARK [2][-]{subsection.5.2.1}{ Direct object references}{section.5.2}
 \BOOKMARK [2][-]{subsection.5.2.2}{ Name-based lookups}{section.5.2}
 \BOOKMARK [1][-]{section.5.3}{ Alternative winprop selection criteria}{chapter.5}
-\BOOKMARK [1][-]{lstlisting.5.-448}{ Writing !ion-statusd! monitors}{chapter.5}
+\BOOKMARK [1][-]{lstlisting.5.-453}{ 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}
index 055828e8b9777cfbb8ac05c701d5d71f2a35498a..6103c983afaf4770dc2fec216e7dfa6746cec5ab 100644 (file)
Binary files a/doc/ionconf.ps.gz and b/doc/ionconf.ps.gz differ
index 9dd71c849e074956f6deefb8f1cf10ea578e451d..3f229042d3235c84a4803a3c56a67f3e4515502a 100644 (file)
@@ -10,7 +10,7 @@
 
 \title{Configuring and extending Ion3 with Lua}
 \author{Tuomo Valkonen \\ tuomov at iki.fi}
-\date{2006-12-23}
+\date{2007-02-03}
 
 \makeindex
 
index 952589aafe2e7c80013c04c7248bfb914c65774e..3fec32ad3f25847ad4b069d224c03079e8ded481 100644 (file)
@@ -1,4 +1,4 @@
-This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=latex 2006.11.18)  23 DEC 2006 17:03
+This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=latex 2006.11.18)  3 FEB 2007 17:05
 entering extended mode
 **./images.tex
 (./images.tex
@@ -353,41 +353,41 @@ LaTeX Font Info:    External font `cmex10' loaded for size
 (Font)              <8> on input line 235.
 LaTeX Font Info:    External font `cmex10' loaded for size
 (Font)              <6> on input line 235.
-l2hSize :tex2html_wrap_inline1028:7.0626pt::0.0pt::7.1201pt.
+l2hSize :tex2html_wrap_inline1027:7.0626pt::0.0pt::7.1201pt.
 [1
 
 
 
 ]
-l2hSize :tex2html_wrap_inline1032:7.48248pt::0.0pt::48.86426pt.
+l2hSize :tex2html_wrap_inline1031:7.48248pt::0.0pt::48.86426pt.
 [2
 
 
 ]
-l2hSize :tex2html_wrap_inline1981:8.7125pt::8.7125pt::23.6642pt.
+l2hSize :tex2html_wrap_inline2020:8.7125pt::8.7125pt::23.6642pt.
 [3
 
 
 ]
-l2hSize :tex2html_wrap_inline6076:7.5626pt::7.5626pt::14.53923pt.
+l2hSize :tex2html_wrap_inline6229:7.5626pt::7.5626pt::14.53923pt.
 [4
 
 
 ]
-l2hSize :tex2html_wrap_inline6080:7.5626pt::7.5626pt::14.53923pt.
+l2hSize :tex2html_wrap_inline6231:7.5626pt::7.5626pt::14.53923pt.
 [5
 
 
 ]
-l2hSize :tex2html_wrap_inline9064:8.7125pt::8.7125pt::86.9574pt.
+l2hSize :tex2html_wrap_inline9215:8.7125pt::8.7125pt::86.9574pt.
 [6
 
 
 ] (./images.aux) ) 
 Here is how much of TeX's memory you used:
  4428 strings out of 94501
- 62627 string characters out of 1175793
- 121207 words of memory out of 1000000
+ 62589 string characters out of 1175793
+ 121255 words of memory out of 1000000
  7572 multiletter control sequences out of 10000+50000
  7874 words of font info for 24 fonts, out of 500000 for 2000
  580 hyphenation exceptions out of 8191
index d9502610e93a4c052552a9c8c06d0b5bfe43153a..fa6a16962eeb38af39a68ade5cef671df39de4ab 100644 (file)
@@ -82,7 +82,7 @@
 
 \title{Configuring and extending Ion3 with Lua}
 \author{Tuomo Valkonen \\tuomov at iki.fi}
-\date{2006-12-23}
+\date{2007-02-03}
 
 
 \makeindex
 \stepcounter{section}
 \stepcounter{section}
 {\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline1028}%
+\lthtmlinlinemathA{tex2html_wrap_inline1027}%
 $n$%
 \lthtmlinlinemathZ
 \lthtmlcheckvsize\clearpage}
@@ -242,7 +242,7 @@ $n$%
 \stepcounter{subsection}
 \stepcounter{subsection}
 {\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline1032}%
+\lthtmlinlinemathA{tex2html_wrap_inline1031}%
 $N=1{\ldots} 5$%
 \lthtmlinlinemathZ
 \lthtmlcheckvsize\clearpage}
@@ -293,7 +293,7 @@ $N=1{\ldots} 5$%
 \stepcounter{section}
 \stepcounter{subsection}
 {\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline1981}%
+\lthtmlinlinemathA{tex2html_wrap_inline2020}%
 $(0, 1]$%
 \lthtmlinlinemathZ
 \lthtmlcheckvsize\clearpage}
@@ -308,12 +308,6 @@ $(0, 1]$%
 \stepcounter{section}
 \stepcounter{chapter}
 \stepcounter{section}
-{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline6076}%
-$-1$%
-\lthtmlinlinemathZ
-\lthtmlcheckvsize\clearpage}
-
 \stepcounter{subsection}
 \stepcounter{subsection}
 \stepcounter{subsection}
@@ -322,7 +316,13 @@ $-1$%
 \stepcounter{subsection}
 \stepcounter{subsection}
 {\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline6080}%
+\lthtmlinlinemathA{tex2html_wrap_inline6229}%
+$-1$%
+\lthtmlinlinemathZ
+\lthtmlcheckvsize\clearpage}
+
+{\newpage\clearpage
+\lthtmlinlinemathA{tex2html_wrap_inline6231}%
 $-2$%
 \lthtmlinlinemathZ
 \lthtmlcheckvsize\clearpage}
@@ -351,7 +351,7 @@ $-2$%
 \stepcounter{section}
 \stepcounter{subsection}
 {\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline9064}%
+\lthtmlinlinemathA{tex2html_wrap_inline9215}%
 $\{t,m,b\}\times\{t,c,b\}$%
 \lthtmlinlinemathZ
 \lthtmlcheckvsize\clearpage}
index 7a0a20d6b82baa3d6b4091cb3f24f8d31521fe23..b693be42b8253cabaa865281ae84808356686a4f 100644 (file)
@@ -57,7 +57,7 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 
 <P ALIGN="CENTER"><STRONG>Tuomo Valkonen</STRONG></P>
 <P ALIGN="CENTER"><I>tuomov at iki.fi</I></P>
-<P ALIGN="CENTER"><STRONG>2006-12-23</STRONG></P>
+<P ALIGN="CENTER"><STRONG>2007-02-03</STRONG></P>
 </DIV>
 
 <P>
index d2d476eb1eb120a2719e431e70d63d241728d0a9..28350c3e5b9226d5b0be5a452c8c03cb0172ec1c 100644 (file)
@@ -50,10 +50,6 @@ $key = q/fn:WFrame.is_shaded/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WMPlex.mx_list/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.goto_activity/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -70,11 +66,11 @@ $key = q/fn:WEdln.finish/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.bskip_word/;
+$key = q/fn:WEdln.mark/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.mark/;
+$key = q/fn:WEdln.bskip_word/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -114,10 +110,6 @@ $key = q/fn:WRegion.is_mapped/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WClientWin.is_fullscreen/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.goto_prev_screen/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -138,11 +130,11 @@ $key = q/fn:ioncore.get/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WWindow.p_resize/;
+$key = q/fn:WComplProxy.set_completions/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WComplProxy.set_completions/;
+$key = q/fn:WWindow.p_resize/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -170,10 +162,6 @@ $key = q/fn:ioncore.defmenu/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.set_get_winprop_fn/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fig:borders/;
 $ref_files{$key} = "$dir".q|node5.html|; 
 $noresave{$key} = "$nosave";
@@ -218,6 +206,10 @@ $key = q/fn:ioncore.warn_traced/;
 $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";
@@ -314,7 +306,7 @@ $key = q/fn:ioncore.write_savefile/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/panews_make_placement_alt/;
+$key = q/fn:ioncore.tagged_i/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -330,10 +322,6 @@ $key = q/fn:WWindow.xid/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.activity_list/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WClientWin.get_ident/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -378,6 +366,10 @@ $key = q/fn:WFrame.p_tabdrag/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:ioncore.clientwin_i/;
+$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";
@@ -486,11 +478,11 @@ $key = q/fn:ioncore.getctxmenu/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_inactivated_hook/;
+$key = q/fn:WFrame.maximize_horiz/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WFrame.maximize_horiz/;
+$key = q/fn:ioncore.region_i/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -498,6 +490,10 @@ $key = q/fn:WWindow.p_move/;
 $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/sec:objects/;
 $ref_files{$key} = "$dir".q|node3.html|; 
 $noresave{$key} = "$nosave";
@@ -550,6 +546,10 @@ $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";
@@ -562,7 +562,7 @@ $key = q/fn:WSplit.rqgeom/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.tags_first/;
+$key = q/fn:WMPlex.managed_i/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -654,10 +654,6 @@ $key = q/fn:ioncore.exec/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.region_list/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WMPlex.mx_current/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -690,10 +686,6 @@ $key = q/fn:WSplitSplit.br/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WMPlex.managed_list/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:string.shell_safe/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -702,10 +694,6 @@ $key = q/fn:mod_query.query_restart/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WTiling.managed_list/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:mod_tiling.set/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -742,10 +730,18 @@ $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";
@@ -758,6 +754,10 @@ $key = q/fn:WRegion.begin_kbresize/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:ioncore.deflayout/;
+$ref_files{$key} = "$dir".q|node7.html|; 
+$noresave{$key} = "$nosave";
+
 $key = q/sec:classesrolesinstances/;
 $ref_files{$key} = "$dir".q|node4.html|; 
 $noresave{$key} = "$nosave";
@@ -790,11 +790,11 @@ $key = q/clientwin_mapped_hook/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WClientWin.set_fullscreen/;
+$key = q/fn:WEdln.paste/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.paste/;
+$key = q/fn:ioncore.detach/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -814,6 +814,10 @@ $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";
@@ -866,6 +870,10 @@ $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";
@@ -910,10 +918,6 @@ $key = q/fn:WTiling.split_top/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_activity_hook/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.progname/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1010,19 +1014,19 @@ $key = q/fn:ioncore.kpress_wait/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/clientwin_do_manage_alt/;
+$key = q/fn:WTiling.transpose_at/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WRegion.rootwin_of/;
+$key = q/clientwin_do_manage_alt/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WTiling.transpose_at/;
+$key = q/fn:WMPlex.mx_i/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/ioncore_sigchld_hook/;
+$key = q/fn:WRegion.rootwin_of/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -1030,6 +1034,10 @@ $key = q/fn:ioncore.match_winprop_name/;
 $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:WTiling.nextto/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1086,10 +1094,6 @@ $key = q/fn:ioncore.getwinprop/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.tagged_list/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.request_selection/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1118,10 +1122,6 @@ $key = q/sec:conffiles/;
 $ref_files{$key} = "$dir".q|node4.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.clientwin_list/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.aboutmsg/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1130,7 +1130,7 @@ $key = q/chap:prelim/;
 $ref_files{$key} = "$dir".q|node3.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WGroup.managed_list/;
+$key = q/fn:ioncore.getlayout/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -1158,10 +1158,6 @@ $key = q/fn:WInput.scrolldown/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_activated_hook/;
-$ref_files{$key} = "$dir".q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:mod_query.history_table/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1174,15 +1170,19 @@ $key = q/fn:ioncore.set/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.mpress/;
+$key = q/fn:ioncore.activity_i/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/sec:tilingref/;
+$key = q/fn:WGroup.set_fullscreen/;
 $ref_files{$key} = "$dir".q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:mod_tiling.detach/;
+$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";
 
index 7a0a20d6b82baa3d6b4091cb3f24f8d31521fe23..b693be42b8253cabaa865281ae84808356686a4f 100644 (file)
@@ -57,7 +57,7 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 
 <P ALIGN="CENTER"><STRONG>Tuomo Valkonen</STRONG></P>
 <P ALIGN="CENTER"><I>tuomov at iki.fi</I></P>
-<P ALIGN="CENTER"><STRONG>2006-12-23</STRONG></P>
+<P ALIGN="CENTER"><STRONG>2007-02-03</STRONG></P>
 </DIV>
 
 <P>
index cbfa2977a70fb8ad93d09a2d91ef1bb23b7d6a28..2d6ca3ca12cae0d63b7aa3902f09cabecf8d01b6 100644 (file)
@@ -50,10 +50,6 @@ $key = q/fn:WFrame.is_shaded/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WMPlex.mx_list/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.goto_activity/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -70,11 +66,11 @@ $key = q/fn:WEdln.finish/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.bskip_word/;
+$key = q/fn:WEdln.mark/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.mark/;
+$key = q/fn:WEdln.bskip_word/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -114,10 +110,6 @@ $key = q/fn:WRegion.is_mapped/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WClientWin.is_fullscreen/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.goto_prev_screen/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -138,11 +130,11 @@ $key = q/fn:ioncore.get/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WWindow.p_resize/;
+$key = q/fn:WComplProxy.set_completions/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WComplProxy.set_completions/;
+$key = q/fn:WWindow.p_resize/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -170,10 +162,6 @@ $key = q/fn:ioncore.defmenu/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.set_get_winprop_fn/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fig:borders/;
 $external_labels{$key} = "$URL/" . q|node5.html|; 
 $noresave{$key} = "$nosave";
@@ -218,6 +206,10 @@ $key = q/fn:ioncore.warn_traced/;
 $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";
@@ -314,7 +306,7 @@ $key = q/fn:ioncore.write_savefile/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/panews_make_placement_alt/;
+$key = q/fn:ioncore.tagged_i/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -330,10 +322,6 @@ $key = q/fn:WWindow.xid/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.activity_list/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WClientWin.get_ident/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -378,6 +366,10 @@ $key = q/fn:WFrame.p_tabdrag/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:ioncore.clientwin_i/;
+$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";
@@ -486,11 +478,11 @@ $key = q/fn:ioncore.getctxmenu/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_inactivated_hook/;
+$key = q/fn:WFrame.maximize_horiz/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WFrame.maximize_horiz/;
+$key = q/fn:ioncore.region_i/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -498,6 +490,10 @@ $key = q/fn:WWindow.p_move/;
 $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/sec:objects/;
 $external_labels{$key} = "$URL/" . q|node3.html|; 
 $noresave{$key} = "$nosave";
@@ -550,6 +546,10 @@ $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";
@@ -562,7 +562,7 @@ $key = q/fn:WSplit.rqgeom/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.tags_first/;
+$key = q/fn:WMPlex.managed_i/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -654,10 +654,6 @@ $key = q/fn:ioncore.exec/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.region_list/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WMPlex.mx_current/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -690,10 +686,6 @@ $key = q/fn:WSplitSplit.br/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WMPlex.managed_list/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:string.shell_safe/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -702,10 +694,6 @@ $key = q/fn:mod_query.query_restart/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WTiling.managed_list/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:mod_tiling.set/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -742,10 +730,18 @@ $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";
@@ -758,6 +754,10 @@ $key = q/fn:WRegion.begin_kbresize/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:ioncore.deflayout/;
+$external_labels{$key} = "$URL/" . q|node7.html|; 
+$noresave{$key} = "$nosave";
+
 $key = q/sec:classesrolesinstances/;
 $external_labels{$key} = "$URL/" . q|node4.html|; 
 $noresave{$key} = "$nosave";
@@ -790,11 +790,11 @@ $key = q/clientwin_mapped_hook/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WClientWin.set_fullscreen/;
+$key = q/fn:WEdln.paste/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.paste/;
+$key = q/fn:ioncore.detach/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -814,6 +814,10 @@ $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";
@@ -866,6 +870,10 @@ $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";
@@ -910,10 +918,6 @@ $key = q/fn:WTiling.split_top/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_activity_hook/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.progname/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1010,19 +1014,19 @@ $key = q/fn:ioncore.kpress_wait/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/clientwin_do_manage_alt/;
+$key = q/fn:WTiling.transpose_at/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WRegion.rootwin_of/;
+$key = q/clientwin_do_manage_alt/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WTiling.transpose_at/;
+$key = q/fn:WMPlex.mx_i/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/ioncore_sigchld_hook/;
+$key = q/fn:WRegion.rootwin_of/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -1030,6 +1034,10 @@ $key = q/fn:ioncore.match_winprop_name/;
 $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:WTiling.nextto/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1086,10 +1094,6 @@ $key = q/fn:ioncore.getwinprop/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.tagged_list/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.request_selection/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1118,10 +1122,6 @@ $key = q/sec:conffiles/;
 $external_labels{$key} = "$URL/" . q|node4.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.clientwin_list/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.aboutmsg/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1130,7 +1130,7 @@ $key = q/chap:prelim/;
 $external_labels{$key} = "$URL/" . q|node3.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WGroup.managed_list/;
+$key = q/fn:ioncore.getlayout/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -1158,10 +1158,6 @@ $key = q/fn:WInput.scrolldown/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_activated_hook/;
-$external_labels{$key} = "$URL/" . q|node7.html|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:mod_query.history_table/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
@@ -1174,15 +1170,19 @@ $key = q/fn:ioncore.set/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.mpress/;
+$key = q/fn:ioncore.activity_i/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
-$key = q/sec:tilingref/;
+$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/fn:mod_tiling.detach/;
+$key = q/sec:tilingref/;
 $external_labels{$key} = "$URL/" . q|node7.html|; 
 $noresave{$key} = "$nosave";
 
@@ -1357,10 +1357,6 @@ $key = q/fn:WFrame.is_shaded/;
 $external_latex_labels{$key} = q|6.1.2|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WMPlex.mx_list/;
-$external_latex_labels{$key} = q|6.1.7|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.goto_activity/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
@@ -1377,11 +1373,11 @@ $key = q/fn:WEdln.finish/;
 $external_latex_labels{$key} = q|6.3.2|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.bskip_word/;
+$key = q/fn:WEdln.mark/;
 $external_latex_labels{$key} = q|6.3.2|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WEdln.mark/;
+$key = q/fn:WEdln.bskip_word/;
 $external_latex_labels{$key} = q|6.3.2|; 
 $noresave{$key} = "$nosave";
 
@@ -1421,10 +1417,6 @@ $key = q/fn:WRegion.is_mapped/;
 $external_latex_labels{$key} = q|6.1.9|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WClientWin.is_fullscreen/;
-$external_latex_labels{$key} = q|6.1.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.goto_prev_screen/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
@@ -1445,14 +1437,14 @@ $key = q/fn:ioncore.get/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WWindow.p_resize/;
-$external_latex_labels{$key} = q|6.1.12|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WComplProxy.set_completions/;
 $external_latex_labels{$key} = q|6.3.1|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:WWindow.p_resize/;
+$external_latex_labels{$key} = q|6.1.12|; 
+$noresave{$key} = "$nosave";
+
 $key = q/fn:ioncore.shutdown/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
@@ -1477,10 +1469,6 @@ $key = q/fn:ioncore.defmenu/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.set_get_winprop_fn/;
-$external_latex_labels{$key} = q|6.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fig:borders/;
 $external_latex_labels{$key} = q|4.1|; 
 $noresave{$key} = "$nosave";
@@ -1525,6 +1513,10 @@ $key = q/fn:ioncore.warn_traced/;
 $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";
@@ -1621,8 +1613,8 @@ $key = q/fn:ioncore.write_savefile/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/panews_make_placement_alt/;
-$external_latex_labels{$key} = q|6.8|; 
+$key = q/fn:ioncore.tagged_i/;
+$external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
 $key = q/sec:exports/;
@@ -1637,10 +1629,6 @@ $key = q/fn:WWindow.xid/;
 $external_latex_labels{$key} = q|6.1.12|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.activity_list/;
-$external_latex_labels{$key} = q|6.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WClientWin.get_ident/;
 $external_latex_labels{$key} = q|6.1.1|; 
 $noresave{$key} = "$nosave";
@@ -1685,6 +1673,10 @@ $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:WRegion.screen_of/;
 $external_latex_labels{$key} = q|6.1.9|; 
 $noresave{$key} = "$nosave";
@@ -1793,18 +1785,22 @@ $key = q/fn:ioncore.getctxmenu/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_inactivated_hook/;
-$external_latex_labels{$key} = q|6.8|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WFrame.maximize_horiz/;
 $external_latex_labels{$key} = q|6.1.2|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:ioncore.region_i/;
+$external_latex_labels{$key} = q|6.1|; 
+$noresave{$key} = "$nosave";
+
 $key = q/fn:WWindow.p_move/;
 $external_latex_labels{$key} = q|6.1.12|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:WGroup.is_fullscreen/;
+$external_latex_labels{$key} = q|6.1.3|; 
+$noresave{$key} = "$nosave";
+
 $key = q/sec:objects/;
 $external_latex_labels{$key} = q|2.2|; 
 $noresave{$key} = "$nosave";
@@ -1857,6 +1853,10 @@ $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";
@@ -1869,8 +1869,8 @@ $key = q/fn:WSplit.rqgeom/;
 $external_latex_labels{$key} = q|6.2.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.tags_first/;
-$external_latex_labels{$key} = q|6.1|; 
+$key = q/fn:WMPlex.managed_i/;
+$external_latex_labels{$key} = q|6.1.7|; 
 $noresave{$key} = "$nosave";
 
 $key = q/fn:WEdln.set_mark/;
@@ -1961,10 +1961,6 @@ $key = q/fn:ioncore.exec/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.region_list/;
-$external_latex_labels{$key} = q|6.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WMPlex.mx_current/;
 $external_latex_labels{$key} = q|6.1.7|; 
 $noresave{$key} = "$nosave";
@@ -1997,10 +1993,6 @@ $key = q/fn:WSplitSplit.br/;
 $external_latex_labels{$key} = q|6.2.4|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WMPlex.managed_list/;
-$external_latex_labels{$key} = q|6.1.7|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:string.shell_safe/;
 $external_latex_labels{$key} = q|6.1.15|; 
 $noresave{$key} = "$nosave";
@@ -2009,10 +2001,6 @@ $key = q/fn:mod_query.query_restart/;
 $external_latex_labels{$key} = q|6.3|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WTiling.managed_list/;
-$external_latex_labels{$key} = q|6.2.5|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:mod_tiling.set/;
 $external_latex_labels{$key} = q|6.2|; 
 $noresave{$key} = "$nosave";
@@ -2049,10 +2037,18 @@ $key = q/fn:WRegion.rqclose_propagate/;
 $external_latex_labels{$key} = q|6.1.9|; 
 $noresave{$key} = "$nosave";
 
+$key = q/region_notify_hook/;
+$external_latex_labels{$key} = q|6.8|; 
+$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.8|; 
 $noresave{$key} = "$nosave";
@@ -2065,6 +2061,10 @@ $key = q/fn:WRegion.begin_kbresize/;
 $external_latex_labels{$key} = q|6.1.9|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:ioncore.deflayout/;
+$external_latex_labels{$key} = q|6.1|; 
+$noresave{$key} = "$nosave";
+
 $key = q/sec:classesrolesinstances/;
 $external_latex_labels{$key} = q|3.5.1|; 
 $noresave{$key} = "$nosave";
@@ -2097,14 +2097,14 @@ $key = q/clientwin_mapped_hook/;
 $external_latex_labels{$key} = q|6.8|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WClientWin.set_fullscreen/;
-$external_latex_labels{$key} = q|6.1.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WEdln.paste/;
 $external_latex_labels{$key} = q|6.3.2|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:ioncore.detach/;
+$external_latex_labels{$key} = q|6.1|; 
+$noresave{$key} = "$nosave";
+
 $key = q/fn:WClientWin.xid/;
 $external_latex_labels{$key} = q|6.1.1|; 
 $noresave{$key} = "$nosave";
@@ -2121,6 +2121,10 @@ $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.8|; 
+$noresave{$key} = "$nosave";
+
 $key = q/fn:table.append/;
 $external_latex_labels{$key} = q|6.1.16|; 
 $noresave{$key} = "$nosave";
@@ -2173,6 +2177,10 @@ $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";
@@ -2217,10 +2225,6 @@ $key = q/fn:WTiling.split_top/;
 $external_latex_labels{$key} = q|6.2.5|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_activity_hook/;
-$external_latex_labels{$key} = q|6.8|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.progname/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
@@ -2317,26 +2321,30 @@ $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/clientwin_do_manage_alt/;
 $external_latex_labels{$key} = q|6.8|; 
 $noresave{$key} = "$nosave";
 
+$key = q/fn:WMPlex.mx_i/;
+$external_latex_labels{$key} = q|6.1.7|; 
+$noresave{$key} = "$nosave";
+
 $key = q/fn:WRegion.rootwin_of/;
 $external_latex_labels{$key} = q|6.1.9|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WTiling.transpose_at/;
-$external_latex_labels{$key} = q|6.2.5|; 
+$key = q/fn:ioncore.match_winprop_name/;
+$external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
 $key = q/ioncore_sigchld_hook/;
 $external_latex_labels{$key} = q|6.8|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.match_winprop_name/;
-$external_latex_labels{$key} = q|6.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:WTiling.nextto/;
 $external_latex_labels{$key} = q|6.2.5|; 
 $noresave{$key} = "$nosave";
@@ -2393,10 +2401,6 @@ $key = q/fn:ioncore.getwinprop/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.tagged_list/;
-$external_latex_labels{$key} = q|6.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.request_selection/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
@@ -2425,10 +2429,6 @@ $key = q/sec:conffiles/;
 $external_latex_labels{$key} = q|3.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.clientwin_list/;
-$external_latex_labels{$key} = q|6.1|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:ioncore.aboutmsg/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
@@ -2437,8 +2437,8 @@ $key = q/chap:prelim/;
 $external_latex_labels{$key} = q|2|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:WGroup.managed_list/;
-$external_latex_labels{$key} = q|6.1.3|; 
+$key = q/fn:ioncore.getlayout/;
+$external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
 $key = q/fig:parentship/;
@@ -2465,10 +2465,6 @@ $key = q/fn:WInput.scrolldown/;
 $external_latex_labels{$key} = q|6.3.3|; 
 $noresave{$key} = "$nosave";
 
-$key = q/region_activated_hook/;
-$external_latex_labels{$key} = q|6.8|; 
-$noresave{$key} = "$nosave";
-
 $key = q/fn:mod_query.history_table/;
 $external_latex_labels{$key} = q|6.3|; 
 $noresave{$key} = "$nosave";
@@ -2481,15 +2477,19 @@ $key = q/fn:ioncore.set/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/fn:ioncore.mpress/;
+$key = q/fn:ioncore.activity_i/;
 $external_latex_labels{$key} = q|6.1|; 
 $noresave{$key} = "$nosave";
 
-$key = q/sec:tilingref/;
-$external_latex_labels{$key} = q|6.2|; 
+$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/fn:mod_tiling.detach/;
+$key = q/sec:tilingref/;
 $external_latex_labels{$key} = q|6.2|; 
 $noresave{$key} = "$nosave";
 
index f33c3b7ad1d42d10a5fb7fd7b2d21e45b669acb1..46a988d4e6bc65a5a4595970c37cdcfec5331265 100644 (file)
@@ -74,27 +74,31 @@ List of functions</A>
 <BR><A HREF="node7.html#fn:gr.select_engine"><TT>gr.select_engine</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.aboutmsg"><TT>ioncore.aboutmsg</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.activity_first"><TT>ioncore.activity_first</TT></A>
-<BR><A HREF="node7.html#fn:ioncore.activity_list"><TT>ioncore.activity_list</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.activity_i"><TT>ioncore.activity_i</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.bdoc"><TT>ioncore.bdoc</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.chdir_for"><TT>ioncore.chdir_for</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.clear_tags"><TT>ioncore.clear_tags</TT></A>
-<BR><A HREF="node7.html#fn:ioncore.clientwin_list"><TT>ioncore.clientwin_list</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.clientwin_i"><TT>ioncore.clientwin_i</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.compile_cmd"><TT>ioncore.compile_cmd</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.create_ws"><TT>ioncore.create_ws</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.current"><TT>ioncore.current</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.defbindings"><TT>ioncore.defbindings</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.defctxmenu"><TT>ioncore.defctxmenu</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.deflayout"><TT>ioncore.deflayout</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.defmenu"><TT>ioncore.defmenu</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.defshortening"><TT>ioncore.defshortening</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.defwinprop"><TT>ioncore.defwinprop</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.detach"><TT>ioncore.detach</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.exec"><TT>ioncore.exec</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.exec_on"><TT>ioncore.exec_on</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.find_manager"><TT>ioncore.find_manager</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.find_screen_id"><TT>ioncore.find_screen_id</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.focushistory_i"><TT>ioncore.focushistory_i</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.get"><TT>ioncore.get</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.getbindings"><TT>ioncore.getbindings</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.getctxmenu"><TT>ioncore.getctxmenu</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.get_dir_for"><TT>ioncore.get_dir_for</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.getlayout"><TT>ioncore.getlayout</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.getmenu"><TT>ioncore.getmenu</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.get_paths"><TT>ioncore.get_paths</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.get_savefile"><TT>ioncore.get_savefile</TT></A>
@@ -125,21 +129,20 @@ List of functions</A>
 <BR><A HREF="node7.html#fn:ioncore.progname"><TT>ioncore.progname</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.read_savefile"><TT>ioncore.read_savefile</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.refresh_stylelist"><TT>ioncore.refresh_stylelist</TT></A>
-<BR><A HREF="node7.html#fn:ioncore.region_list"><TT>ioncore.region_list</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.region_i"><TT>ioncore.region_i</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.request_selection"><TT>ioncore.request_selection</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.resign"><TT>ioncore.resign</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.restart"><TT>ioncore.restart</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.restart_other"><TT>ioncore.restart_other</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.set"><TT>ioncore.set</TT></A>
-<BR><A HREF="node7.html#fn:ioncore.set_get_winprop_fn"><TT>ioncore.set_get_winprop_fn</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.set_paths"><TT>ioncore.set_paths</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.set_selection"><TT>ioncore.set_selection</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.shutdown"><TT>ioncore.shutdown</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.snapshot"><TT>ioncore.snapshot</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.submap"><TT>ioncore.submap</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.submenu"><TT>ioncore.submenu</TT></A>
-<BR><A HREF="node7.html#fn:ioncore.tagged_list"><TT>ioncore.tagged_list</TT></A>
-<BR><A HREF="node7.html#fn:ioncore.tags_first"><TT>ioncore.tags_first</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.tagged_first"><TT>ioncore.tagged_first</TT></A>
+<BR><A HREF="node7.html#fn:ioncore.tagged_i"><TT>ioncore.tagged_i</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.TR"><TT>ioncore.TR</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.version"><TT>ioncore.version</TT></A>
 <BR><A HREF="node7.html#fn:ioncore.warn"><TT>ioncore.warn</TT></A>
@@ -189,7 +192,7 @@ List of functions</A>
 <BR><A HREF="node7.html#fn:mod_query.warn"><TT>mod_query.warn</TT></A>
 <BR><A HREF="node7.html#fn:mod_sp.set_shown"><TT>mod_sp.set_shown</TT></A>
 <BR><A HREF="node7.html#fn:mod_sp.set_shown_on"><TT>mod_sp.set_shown_on</TT></A>
-<BR><A HREF="node7.html#fn:mod_tiling.detach"><TT>mod_tiling.detach</TT></A>
+<BR><A HREF="#fn:mod_statusbar.statusbars"><TT>mod_statusbar.statusbars</TT></A>
 <BR><A HREF="node7.html#fn:mod_tiling.get"><TT>mod_tiling.get</TT></A>
 <BR><A HREF="node7.html#fn:mod_tiling.mkbottom"><TT>mod_tiling.mkbottom</TT></A>
 <BR><A HREF="node7.html#fn:mod_tiling.set"><TT>mod_tiling.set</TT></A>
@@ -200,11 +203,9 @@ List of functions</A>
 <BR><A HREF="node7.html#fn:table.join"><TT>table.join</TT></A>
 <BR><A HREF="node7.html#fn:table.map"><TT>table.map</TT></A>
 <BR><A HREF="node7.html#fn:WClientWin.get_ident"><TT>WClientWin.get_ident</TT></A>
-<BR><A HREF="node7.html#fn:WClientWin.is_fullscreen"><TT>WClientWin.is_fullscreen</TT></A>
 <BR><A HREF="node7.html#fn:WClientWin.kill"><TT>WClientWin.kill</TT></A>
 <BR><A HREF="node7.html#fn:WClientWin.nudge"><TT>WClientWin.nudge</TT></A>
 <BR><A HREF="node7.html#fn:WClientWin.quote_next"><TT>WClientWin.quote_next</TT></A>
-<BR><A HREF="node7.html#fn:WClientWin.set_fullscreen"><TT>WClientWin.set_fullscreen</TT></A>
 <BR><A HREF="node7.html#fn:WClientWin.xid"><TT>WClientWin.xid</TT></A>
 <BR><A HREF="node7.html#fn:WComplProxy.set_completions"><TT>WComplProxy.set_completions</TT></A>
 <BR><A HREF="node7.html#fn:WDock.attach"><TT>WDock.attach</TT></A>
@@ -256,7 +257,9 @@ List of functions</A>
 <BR><A HREF="node7.html#fn:WGroup.attach"><TT>WGroup.attach</TT></A>
 <BR><A HREF="node7.html#fn:WGroup.attach_new"><TT>WGroup.attach_new</TT></A>
 <BR><A HREF="node7.html#fn:WGroup.bottom"><TT>WGroup.bottom</TT></A>
-<BR><A HREF="node7.html#fn:WGroup.managed_list"><TT>WGroup.managed_list</TT></A>
+<BR><A HREF="node7.html#fn:WGroup.is_fullscreen"><TT>WGroup.is_fullscreen</TT></A>
+<BR><A HREF="node7.html#fn:WGroup.managed_i"><TT>WGroup.managed_i</TT></A>
+<BR><A HREF="node7.html#fn:WGroup.set_fullscreen"><TT>WGroup.set_fullscreen</TT></A>
 <BR><A HREF="node7.html#fn:WGroupWS.attach_framed"><TT>WGroupWS.attach_framed</TT></A>
 <BR><A HREF="node7.html#fn:WInfoWin.set_text"><TT>WInfoWin.set_text</TT></A>
 <BR><A HREF="node7.html#fn:WInput.cancel"><TT>WInput.cancel</TT></A>
@@ -280,10 +283,10 @@ List of functions</A>
 <BR><A HREF="node7.html#fn:WMPlex.get_stdisp"><TT>WMPlex.get_stdisp</TT></A>
 <BR><A HREF="node7.html#fn:WMPlex.inc_index"><TT>WMPlex.inc_index</TT></A>
 <BR><A HREF="node7.html#fn:WMPlex.is_hidden"><TT>WMPlex.is_hidden</TT></A>
-<BR><A HREF="node7.html#fn:WMPlex.managed_list"><TT>WMPlex.managed_list</TT></A>
+<BR><A HREF="node7.html#fn:WMPlex.managed_i"><TT>WMPlex.managed_i</TT></A>
 <BR><A HREF="node7.html#fn:WMPlex.mx_count"><TT>WMPlex.mx_count</TT></A>
 <BR><A HREF="node7.html#fn:WMPlex.mx_current"><TT>WMPlex.mx_current</TT></A>
-<BR><A HREF="node7.html#fn:WMPlex.mx_list"><TT>WMPlex.mx_list</TT></A>
+<BR><A HREF="node7.html#fn:WMPlex.mx_i"><TT>WMPlex.mx_i</TT></A>
 <BR><A HREF="node7.html#fn:WMPlex.mx_nth"><TT>WMPlex.mx_nth</TT></A>
 <BR><A HREF="node7.html#fn:WMPlex.set_hidden"><TT>WMPlex.set_hidden</TT></A>
 <BR><A HREF="node7.html#fn:WMPlex.set_index"><TT>WMPlex.set_index</TT></A>
@@ -326,9 +329,15 @@ List of functions</A>
 <BR><A HREF="node7.html#fn:WSplitSplit.flip"><TT>WSplitSplit.flip</TT></A>
 <BR><A HREF="node7.html#fn:WSplitSplit.tl"><TT>WSplitSplit.tl</TT></A>
 <BR><A HREF="node7.html#fn:WSplit.transpose"><TT>WSplit.transpose</TT></A>
+<BR><A HREF="#fn:WStatusBar.get_template_table"><TT>WStatusBar.get_template_table</TT></A>
+<BR><A HREF="#fn:WStatusBar.is_systray_extl"><TT>WStatusBar.is_systray_extl</TT></A>
+<BR><A HREF="#fn:WStatusBar.set_systray"><TT>WStatusBar.set_systray</TT></A>
+<BR><A HREF="#fn:WStatusBar.set_template"><TT>WStatusBar.set_template</TT></A>
+<BR><A HREF="#fn:WStatusBar.set_template_table"><TT>WStatusBar.set_template_table</TT></A>
+<BR><A HREF="#fn:WStatusBar.update"><TT>WStatusBar.update</TT></A>
 <BR><A HREF="node7.html#fn:WTiling.farthest"><TT>WTiling.farthest</TT></A>
 <BR><A HREF="node7.html#fn:WTiling.flip_at"><TT>WTiling.flip_at</TT></A>
-<BR><A HREF="node7.html#fn:WTiling.managed_list"><TT>WTiling.managed_list</TT></A>
+<BR><A HREF="node7.html#fn:WTiling.managed_i"><TT>WTiling.managed_i</TT></A>
 <BR><A HREF="node7.html#fn:WTiling.nextto"><TT>WTiling.nextto</TT></A>
 <BR><A HREF="node7.html#fn:WTiling.node_of"><TT>WTiling.node_of</TT></A>
 <BR><A HREF="node7.html#fn:WTiling.set_floating"><TT>WTiling.set_floating</TT></A>
index 2c12ab270a37756910a052e9052402f559850f69..76b04812fdf8030b48c126c2f2a3f48bde1acb35 100644 (file)
@@ -58,1029 +58,1035 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 Index</A>
 </H2><HR><DL>
 <DD><STRONG><TT>aboutmsg</TT></STRONG>
- : <A HREF="node7.html#4229"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4330"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>acrobatic</TT></STRONG>
- : <A HREF="node4.html#1410"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1429"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>activity_first</TT></STRONG>
- : <A HREF="node7.html#4231"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>activity_list</TT></STRONG>
- : <A HREF="node7.html#4233"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4332"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>activity_i</TT></STRONG>
+ : <A HREF="node7.html#4334"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">Alt</SPAN></STRONG>
- : <A HREF="node4.html#865"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#864"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">AnyModifier</SPAN></STRONG>
- : <A HREF="node4.html#863"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#862"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>append</TT></STRONG>
- : <A HREF="node7.html#4520"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+ : <A HREF="node7.html#4623"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
 <DD><STRONG><TT>aspect</TT></STRONG>
- : <A HREF="node4.html#1411"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1430"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>attach</TT></STRONG>
- : <A HREF="node7.html#4384"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
- | <A HREF="node7.html#4400"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
- | <A HREF="node7.html#9001"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4483"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ | <A HREF="node7.html#4503"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ | <A HREF="node7.html#9152"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>attach_framed</TT></STRONG>
- : <A HREF="node7.html#4394"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#4497"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>attach_new</TT></STRONG>
- : <A HREF="node7.html#4386"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
- | <A HREF="node7.html#4402"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4485"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ | <A HREF="node7.html#4505"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>attach_tagged</TT></STRONG>
- : <A HREF="node7.html#4404"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4507"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>back</TT></STRONG>
- : <A HREF="node7.html#7896"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8041"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>backspace</TT></STRONG>
- : <A HREF="node7.html#7898"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8043"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>bdoc</TT></STRONG>
- : <A HREF="node7.html#4191"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4288"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>begin_kbresize</TT></STRONG>
- : <A HREF="node7.html#4448"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4551"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>bkill_word</TT></STRONG>
- : <A HREF="node7.html#7900"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8045"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>bol</TT></STRONG>
- : <A HREF="node7.html#7902"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8047"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>bottom</TT></STRONG>
- : <A HREF="node7.html#4388"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#4487"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>br</TT></STRONG>
- : <A HREF="node7.html#6806"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node7.html#6952"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG><TT>bskip_word</TT></STRONG>
- : <A HREF="node7.html#7904"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8049"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">Button-n</SPAN></STRONG>
- : <A HREF="node4.html#869"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
+ : <A HREF="node4.html#868"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
 <DD><STRONG><TT>cancel</TT></STRONG>
- : <A HREF="node7.html#4439"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
- | <A HREF="node7.html#7963"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
- | <A HREF="node7.html#8789"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4542"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ | <A HREF="node7.html#8108"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ | <A HREF="node7.html#8940"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>chdir_for</TT></STRONG>
- : <A HREF="node7.html#4193"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4290"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>class</TT></STRONG><DL>
-<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1426"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1447"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>clear_mark</TT></STRONG>
- : <A HREF="node7.html#7906"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8051"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>clear_tags</TT></STRONG>
- : <A HREF="node7.html#4235"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4336"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>clientwin_do_manage_alt</TT></STRONG>
- : <A HREF="node7.html#9401"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
-<DD><STRONG><TT>clientwin_list</TT></STRONG>
- : <A HREF="node7.html#4237"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#9529"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+<DD><STRONG><TT>clientwin_i</TT></STRONG>
+ : <A HREF="node7.html#4338"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>clientwin_mapped_hook</TT></STRONG>
- : <A HREF="node7.html#9402"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9530"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+<DD><STRONG><TT>clientwin_property_change_hook</TT></STRONG>
+ : <A HREF="node7.html#9531"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>clientwin_unmapped_hook</TT></STRONG>
- : <A HREF="node7.html#9403"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9532"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>compile_cmd</TT></STRONG>
- : <A HREF="node7.html#4195"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4292"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>complete</TT></STRONG>
- : <A HREF="node7.html#7908"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8053"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>contents</TT></STRONG>
- : <A HREF="node7.html#7910"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8055"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>context</TT></STRONG>
- : <A HREF="node7.html#7912"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8057"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">Control</SPAN></STRONG>
- : <A HREF="node4.html#861"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#860"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>copy</TT></STRONG>
- : <A HREF="node7.html#4522"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
- | <A HREF="node7.html#7914"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4625"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+ | <A HREF="node7.html#8059"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>create_ws</TT></STRONG>
- : <A HREF="node7.html#4197"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4294"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>current</TT></STRONG>
- : <A HREF="node7.html#4239"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#4450"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
- | <A HREF="node7.html#6800"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4340"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#4553"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ | <A HREF="node7.html#6946"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>current_scr</TT></STRONG>
- : <A HREF="node7.html#4493"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">10</SPAN></A>
+ : <A HREF="node7.html#4596"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">10</SPAN></A>
 <DD><STRONG><TT>cut</TT></STRONG>
- : <A HREF="node7.html#7916"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8061"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>de</TT></STRONG><DL>
-<DD><STRONG><TT>defstyle</TT></STRONG> : <A HREF="node7.html#9173"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>defstyle_rootwin</TT></STRONG> : <A HREF="node7.html#9175"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>reset</TT></STRONG> : <A HREF="node7.html#9177"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>substyle</TT></STRONG> : <A HREF="node7.html#9179"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>defstyle</TT></STRONG> : <A HREF="node7.html#9324"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>defstyle_rootwin</TT></STRONG> : <A HREF="node7.html#9326"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>reset</TT></STRONG> : <A HREF="node7.html#9328"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>substyle</TT></STRONG> : <A HREF="node7.html#9330"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 </DL>
 <DD><STRONG><TT>dec_index</TT></STRONG>
- : <A HREF="node7.html#4406"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4509"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>defbindings</TT></STRONG>
- : <A HREF="node7.html#4199"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4296"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>defcmd</TT></STRONG>
- : <A HREF="node7.html#7833"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7978"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>defctxmenu</TT></STRONG>
- : <A HREF="node7.html#4201"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4298"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>deflayout</TT></STRONG>
+ : <A HREF="node7.html#4300"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>defmenu</TT></STRONG>
- : <A HREF="node4.html#1170"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#4203"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node4.html#1171"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#4302"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>defshortening</TT></STRONG>
- : <A HREF="node7.html#4241"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4342"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>defstyle</TT></STRONG>
- : <A HREF="node7.html#9174"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#9325"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>defstyle_rootwin</TT></STRONG>
- : <A HREF="node7.html#9176"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#9327"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>defwinprop</TT></STRONG>
- : <A HREF="node7.html#4205"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4304"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>delete</TT></STRONG>
- : <A HREF="node7.html#7918"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8063"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>detach</TT></STRONG>
- : <A HREF="node7.html#6782"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4344"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>dir</TT></STRONG>
- : <A HREF="node7.html#6808"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node7.html#6954"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG>drawing engine</STRONG>
- : <A HREF="node5.html#1666"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node5.html#1711"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>eol</TT></STRONG>
- : <A HREF="node7.html#7920"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8065"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>ETCDIR</TT></STRONG>
- : <A HREF="node4.html#586"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node4.html#585"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>exec</TT></STRONG>
- : <A HREF="node7.html#4243"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4346"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>exec_on</TT></STRONG>
- : <A HREF="node7.html#4207"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4306"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>export</TT></STRONG>
- : <A HREF="node7.html#4507"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">13</SPAN></A>
+ : <A HREF="node7.html#4610"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">13</SPAN></A>
 <DD><STRONG><TT>farthest</TT></STRONG>
- : <A HREF="node7.html#6819"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6965"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>find_manager</TT></STRONG>
- : <A HREF="node7.html#4217"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4316"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>find_screen_id</TT></STRONG>
- : <A HREF="node7.html#4245"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4348"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>finish</TT></STRONG>
- : <A HREF="node7.html#4441"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
- | <A HREF="node7.html#7922"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
- | <A HREF="node7.html#8791"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4544"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ | <A HREF="node7.html#8067"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ | <A HREF="node7.html#8942"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>flip</TT></STRONG>
- : <A HREF="node7.html#6810"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node7.html#6956"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG><TT>flip_at</TT></STRONG>
- : <A HREF="node7.html#6815"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6961"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>float</TT></STRONG>
- : <A HREF="node4.html#1412"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1431"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>focushistory_i</TT></STRONG>
+ : <A HREF="node7.html#4350"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>forward</TT></STRONG>
- : <A HREF="node7.html#7924"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8069"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>frame_managed_changed_hook</TT></STRONG>
- : <A HREF="node7.html#9404"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9533"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>fullscreen</TT></STRONG>
- : <A HREF="node4.html#1413"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1432"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>geom</TT></STRONG>
- : <A HREF="node7.html#4452"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
- | <A HREF="node7.html#6791"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4555"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ | <A HREF="node7.html#6937"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>get</TT></STRONG>
- : <A HREF="node7.html#4247"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#6784"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
- | <A HREF="node7.html#7835"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
- | <A HREF="node7.html#8782"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
- | <A HREF="node7.html#9003"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4352"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#6930"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ | <A HREF="node7.html#7980"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ | <A HREF="node7.html#8933"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ | <A HREF="node7.html#9154"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>get_dir_for</TT></STRONG>
- : <A HREF="node7.html#4219"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4318"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>get_ident</TT></STRONG>
- : <A HREF="node7.html#4350"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4453"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>get_index</TT></STRONG>
- : <A HREF="node7.html#4408"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4511"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>get_paths</TT></STRONG>
- : <A HREF="node7.html#4249"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4354"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>get_savefile</TT></STRONG>
- : <A HREF="node7.html#4211"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4310"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>get_stdisp</TT></STRONG>
- : <A HREF="node7.html#4410"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4513"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>getbindings</TT></STRONG>
- : <A HREF="node7.html#4221"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4320"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>getctxmenu</TT></STRONG>
- : <A HREF="node7.html#4223"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4322"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>getlayout</TT></STRONG>
+ : <A HREF="node7.html#4324"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>getmenu</TT></STRONG>
- : <A HREF="node7.html#4225"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4326"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>getwinprop</TT></STRONG>
- : <A HREF="node7.html#4227"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4328"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>goto</TT></STRONG>
- : <A HREF="node7.html#4454"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4557"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>goto_activity</TT></STRONG>
- : <A HREF="node7.html#4251"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4356"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>goto_first</TT></STRONG>
- : <A HREF="node7.html#4253"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4358"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>goto_next</TT></STRONG>
- : <A HREF="node7.html#4255"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4360"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>goto_next_screen</TT></STRONG>
- : <A HREF="node7.html#4257"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4362"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>goto_nth_screen</TT></STRONG>
- : <A HREF="node7.html#4259"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4364"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>goto_prev_screen</TT></STRONG>
- : <A HREF="node7.html#4261"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4366"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>goto_previous</TT></STRONG>
- : <A HREF="node7.html#4263"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4368"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>gr</TT></STRONG><DL>
-<DD><STRONG><TT>read_config</TT></STRONG> : <A HREF="node7.html#4509"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
-<DD><STRONG><TT>refresh</TT></STRONG> : <A HREF="node7.html#4511"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
-<DD><STRONG><TT>select_engine</TT></STRONG> : <A HREF="node7.html#4513"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
+<DD><STRONG><TT>read_config</TT></STRONG> : <A HREF="node7.html#4612"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
+<DD><STRONG><TT>refresh</TT></STRONG> : <A HREF="node7.html#4614"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
+<DD><STRONG><TT>select_engine</TT></STRONG> : <A HREF="node7.html#4616"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
 </DL>
 <DD><STRONG><TT>grabmenu</TT></STRONG>
- : <A HREF="node7.html#8778"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node7.html#8929"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG><TT>history_clear</TT></STRONG>
- : <A HREF="node7.html#7837"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7982"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>history_get</TT></STRONG>
- : <A HREF="node7.html#7839"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7984"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>history_next</TT></STRONG>
- : <A HREF="node7.html#7926"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8071"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>history_prev</TT></STRONG>
- : <A HREF="node7.html#7928"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8073"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>history_push</TT></STRONG>
- : <A HREF="node7.html#7841"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7986"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>history_search</TT></STRONG>
- : <A HREF="node7.html#7843"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7988"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>history_table</TT></STRONG>
- : <A HREF="node7.html#7845"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7990"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>icat</TT></STRONG>
- : <A HREF="node7.html#4524"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+ : <A HREF="node7.html#4627"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
 <DD><STRONG><TT>id</TT></STRONG>
- : <A HREF="node7.html#4496"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
+ : <A HREF="node7.html#4599"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
 <DD><STRONG><TT>ignore_cfgrq</TT></STRONG>
- : <A HREF="node4.html#1414"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1433"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>ignore_net_active_window</TT></STRONG>
- : <A HREF="node4.html#1415"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1434"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>ignore_resizeinc</TT></STRONG>
- : <A HREF="node4.html#1416"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1435"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>inc_index</TT></STRONG>
- : <A HREF="node7.html#4412"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4515"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>insstr</TT></STRONG>
- : <A HREF="node7.html#7930"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8075"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>instance</TT></STRONG><DL>
-<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1428"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1449"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>ioncore</TT></STRONG><DL>
-<DD><STRONG><TT>aboutmsg</TT></STRONG> : <A HREF="node7.html#4228"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>activity_first</TT></STRONG> : <A HREF="node7.html#4230"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>activity_list</TT></STRONG> : <A HREF="node7.html#4232"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>bdoc</TT></STRONG> : <A HREF="node7.html#4190"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>chdir_for</TT></STRONG> : <A HREF="node7.html#4192"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>clear_tags</TT></STRONG> : <A HREF="node7.html#4234"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>clientwin_list</TT></STRONG> : <A HREF="node7.html#4236"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>compile_cmd</TT></STRONG> : <A HREF="node7.html#4194"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>create_ws</TT></STRONG> : <A HREF="node7.html#4196"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>current</TT></STRONG> : <A HREF="node7.html#4238"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>defbindings</TT></STRONG> : <A HREF="node7.html#4198"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>defctxmenu</TT></STRONG> : <A HREF="node7.html#4200"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>defmenu</TT></STRONG> : <A HREF="node7.html#4202"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>defshortening</TT></STRONG> : <A HREF="node7.html#4240"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>defwinprop</TT></STRONG> : <A HREF="node7.html#4204"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>exec</TT></STRONG> : <A HREF="node7.html#4242"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>exec_on</TT></STRONG> : <A HREF="node7.html#4206"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>find_manager</TT></STRONG> : <A HREF="node7.html#4216"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>find_screen_id</TT></STRONG> : <A HREF="node7.html#4244"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#4246"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>get_dir_for</TT></STRONG> : <A HREF="node7.html#4218"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>get_paths</TT></STRONG> : <A HREF="node7.html#4248"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>get_savefile</TT></STRONG> : <A HREF="node7.html#4210"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>getbindings</TT></STRONG> : <A HREF="node7.html#4220"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>getctxmenu</TT></STRONG> : <A HREF="node7.html#4222"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>getmenu</TT></STRONG> : <A HREF="node7.html#4224"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>getwinprop</TT></STRONG> : <A HREF="node7.html#4226"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>goto_activity</TT></STRONG> : <A HREF="node7.html#4250"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>goto_first</TT></STRONG> : <A HREF="node7.html#4252"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>goto_next</TT></STRONG> : <A HREF="node7.html#4254"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>goto_next_screen</TT></STRONG> : <A HREF="node7.html#4256"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>goto_nth_screen</TT></STRONG> : <A HREF="node7.html#4258"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>goto_prev_screen</TT></STRONG> : <A HREF="node7.html#4260"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>goto_previous</TT></STRONG> : <A HREF="node7.html#4262"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>is_i18n</TT></STRONG> : <A HREF="node7.html#4264"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>kpress</TT></STRONG> : <A HREF="node7.html#4326"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>kpress_wait</TT></STRONG> : <A HREF="node7.html#4328"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>load_module</TT></STRONG> : <A HREF="node7.html#4266"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>lookup_clientwin</TT></STRONG> : <A HREF="node7.html#4268"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>lookup_region</TT></STRONG> : <A HREF="node7.html#4270"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>lookup_script</TT></STRONG> : <A HREF="node7.html#4212"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>match_winprop_name</TT></STRONG> : <A HREF="node7.html#4330"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>mclick</TT></STRONG> : <A HREF="node7.html#4332"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>mdblclick</TT></STRONG> : <A HREF="node7.html#4334"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>mdrag</TT></STRONG> : <A HREF="node7.html#4336"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>menuentry</TT></STRONG> : <A HREF="node7.html#4338"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>mpress</TT></STRONG> : <A HREF="node7.html#4340"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>navi_first</TT></STRONG> : <A HREF="node7.html#4272"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>navi_next</TT></STRONG> : <A HREF="node7.html#4274"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>popen_bgread</TT></STRONG> : <A HREF="node7.html#4276"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>progname</TT></STRONG> : <A HREF="node7.html#4278"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>read_savefile</TT></STRONG> : <A HREF="node7.html#4208"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>refresh_stylelist</TT></STRONG> : <A HREF="node7.html#4342"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>region_list</TT></STRONG> : <A HREF="node7.html#4280"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>request_selection</TT></STRONG> : <A HREF="node7.html#4282"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>resign</TT></STRONG> : <A HREF="node7.html#4284"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>restart</TT></STRONG> : <A HREF="node7.html#4286"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>restart_other</TT></STRONG> : <A HREF="node7.html#4288"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#4290"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>set_get_winprop_fn</TT></STRONG> : <A HREF="node7.html#4292"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>set_paths</TT></STRONG> : <A HREF="node7.html#4294"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>set_selection</TT></STRONG> : <A HREF="node7.html#4296"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>shutdown</TT></STRONG> : <A HREF="node7.html#4298"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>snapshot</TT></STRONG> : <A HREF="node7.html#4300"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>submap</TT></STRONG> : <A HREF="node7.html#4344"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>submenu</TT></STRONG> : <A HREF="node7.html#4346"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>tagged_list</TT></STRONG> : <A HREF="node7.html#4302"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>tags_first</TT></STRONG> : <A HREF="node7.html#4304"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>TR</TT></STRONG> : <A HREF="node7.html#4188"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>version</TT></STRONG> : <A HREF="node7.html#4306"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>warn</TT></STRONG> : <A HREF="node7.html#4308"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>warn_traced</TT></STRONG> : <A HREF="node7.html#4310"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>write_savefile</TT></STRONG> : <A HREF="node7.html#4214"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>x_change_property</TT></STRONG> : <A HREF="node7.html#4312"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>x_delete_property</TT></STRONG> : <A HREF="node7.html#4314"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>x_get_atom_name</TT></STRONG> : <A HREF="node7.html#4316"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>x_get_text_property</TT></STRONG> : <A HREF="node7.html#4318"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>x_get_window_property</TT></STRONG> : <A HREF="node7.html#4320"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>x_intern_atom</TT></STRONG> : <A HREF="node7.html#4322"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>x_set_text_property</TT></STRONG> : <A HREF="node7.html#4324"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>aboutmsg</TT></STRONG> : <A HREF="node7.html#4329"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>activity_first</TT></STRONG> : <A HREF="node7.html#4331"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>activity_i</TT></STRONG> : <A HREF="node7.html#4333"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>bdoc</TT></STRONG> : <A HREF="node7.html#4287"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>chdir_for</TT></STRONG> : <A HREF="node7.html#4289"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>clear_tags</TT></STRONG> : <A HREF="node7.html#4335"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>clientwin_i</TT></STRONG> : <A HREF="node7.html#4337"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>compile_cmd</TT></STRONG> : <A HREF="node7.html#4291"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>create_ws</TT></STRONG> : <A HREF="node7.html#4293"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>current</TT></STRONG> : <A HREF="node7.html#4339"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>defbindings</TT></STRONG> : <A HREF="node7.html#4295"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>defctxmenu</TT></STRONG> : <A HREF="node7.html#4297"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>deflayout</TT></STRONG> : <A HREF="node7.html#4299"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>defmenu</TT></STRONG> : <A HREF="node7.html#4301"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>defshortening</TT></STRONG> : <A HREF="node7.html#4341"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>defwinprop</TT></STRONG> : <A HREF="node7.html#4303"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>detach</TT></STRONG> : <A HREF="node7.html#4343"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>exec</TT></STRONG> : <A HREF="node7.html#4345"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>exec_on</TT></STRONG> : <A HREF="node7.html#4305"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>find_manager</TT></STRONG> : <A HREF="node7.html#4315"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>find_screen_id</TT></STRONG> : <A HREF="node7.html#4347"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>focushistory_i</TT></STRONG> : <A HREF="node7.html#4349"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#4351"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>get_dir_for</TT></STRONG> : <A HREF="node7.html#4317"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>get_paths</TT></STRONG> : <A HREF="node7.html#4353"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>get_savefile</TT></STRONG> : <A HREF="node7.html#4309"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>getbindings</TT></STRONG> : <A HREF="node7.html#4319"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>getctxmenu</TT></STRONG> : <A HREF="node7.html#4321"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>getlayout</TT></STRONG> : <A HREF="node7.html#4323"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>getmenu</TT></STRONG> : <A HREF="node7.html#4325"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>getwinprop</TT></STRONG> : <A HREF="node7.html#4327"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>goto_activity</TT></STRONG> : <A HREF="node7.html#4355"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>goto_first</TT></STRONG> : <A HREF="node7.html#4357"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>goto_next</TT></STRONG> : <A HREF="node7.html#4359"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>goto_next_screen</TT></STRONG> : <A HREF="node7.html#4361"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>goto_nth_screen</TT></STRONG> : <A HREF="node7.html#4363"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>goto_prev_screen</TT></STRONG> : <A HREF="node7.html#4365"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>goto_previous</TT></STRONG> : <A HREF="node7.html#4367"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>is_i18n</TT></STRONG> : <A HREF="node7.html#4369"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>kpress</TT></STRONG> : <A HREF="node7.html#4429"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>kpress_wait</TT></STRONG> : <A HREF="node7.html#4431"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>load_module</TT></STRONG> : <A HREF="node7.html#4371"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>lookup_clientwin</TT></STRONG> : <A HREF="node7.html#4373"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>lookup_region</TT></STRONG> : <A HREF="node7.html#4375"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>lookup_script</TT></STRONG> : <A HREF="node7.html#4311"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>match_winprop_name</TT></STRONG> : <A HREF="node7.html#4433"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>mclick</TT></STRONG> : <A HREF="node7.html#4435"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>mdblclick</TT></STRONG> : <A HREF="node7.html#4437"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>mdrag</TT></STRONG> : <A HREF="node7.html#4439"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>menuentry</TT></STRONG> : <A HREF="node7.html#4441"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>mpress</TT></STRONG> : <A HREF="node7.html#4443"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>navi_first</TT></STRONG> : <A HREF="node7.html#4377"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>navi_next</TT></STRONG> : <A HREF="node7.html#4379"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>popen_bgread</TT></STRONG> : <A HREF="node7.html#4381"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>progname</TT></STRONG> : <A HREF="node7.html#4383"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>read_savefile</TT></STRONG> : <A HREF="node7.html#4307"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>refresh_stylelist</TT></STRONG> : <A HREF="node7.html#4445"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>region_i</TT></STRONG> : <A HREF="node7.html#4385"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>request_selection</TT></STRONG> : <A HREF="node7.html#4387"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>resign</TT></STRONG> : <A HREF="node7.html#4389"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>restart</TT></STRONG> : <A HREF="node7.html#4391"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>restart_other</TT></STRONG> : <A HREF="node7.html#4393"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#4395"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>set_paths</TT></STRONG> : <A HREF="node7.html#4397"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>set_selection</TT></STRONG> : <A HREF="node7.html#4399"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>shutdown</TT></STRONG> : <A HREF="node7.html#4401"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>snapshot</TT></STRONG> : <A HREF="node7.html#4403"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>submap</TT></STRONG> : <A HREF="node7.html#4447"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>submenu</TT></STRONG> : <A HREF="node7.html#4449"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>tagged_first</TT></STRONG> : <A HREF="node7.html#4405"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>tagged_i</TT></STRONG> : <A HREF="node7.html#4407"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>TR</TT></STRONG> : <A HREF="node7.html#4285"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>version</TT></STRONG> : <A HREF="node7.html#4409"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>warn</TT></STRONG> : <A HREF="node7.html#4411"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>warn_traced</TT></STRONG> : <A HREF="node7.html#4413"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>write_savefile</TT></STRONG> : <A HREF="node7.html#4313"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>x_change_property</TT></STRONG> : <A HREF="node7.html#4415"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>x_delete_property</TT></STRONG> : <A HREF="node7.html#4417"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>x_get_atom_name</TT></STRONG> : <A HREF="node7.html#4419"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>x_get_text_property</TT></STRONG> : <A HREF="node7.html#4421"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>x_get_window_property</TT></STRONG> : <A HREF="node7.html#4423"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>x_intern_atom</TT></STRONG> : <A HREF="node7.html#4425"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>x_set_text_property</TT></STRONG> : <A HREF="node7.html#4427"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>ioncore_deinit_hook</TT></STRONG>
- : <A HREF="node7.html#9406"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9535"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>ioncore_post_layout_setup_hook</TT></STRONG>
- : <A HREF="node7.html#9407"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9536"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>ioncore_sigchld_hook</TT></STRONG>
- : <A HREF="node7.html#9405"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9534"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>ioncore_snapshot_hook</TT></STRONG>
- : <A HREF="node7.html#9408"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9537"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>is_active</TT></STRONG>
- : <A HREF="node7.html#4456"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4559"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>is_activity</TT></STRONG>
- : <A HREF="node7.html#4458"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4561"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>is_fullscreen</TT></STRONG>
- : <A HREF="node7.html#4352"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4489"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>is_hidden</TT></STRONG>
- : <A HREF="node7.html#4414"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4517"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>is_histcompl</TT></STRONG>
- : <A HREF="node7.html#7932"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8077"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>is_i18n</TT></STRONG>
- : <A HREF="node7.html#4265"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4370"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>is_mapped</TT></STRONG>
- : <A HREF="node7.html#4460"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4563"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>is_shaded</TT></STRONG>
- : <A HREF="node7.html#4365"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4464"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>is_tagged</TT></STRONG>
- : <A HREF="node7.html#4462"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4565"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>join</TT></STRONG>
- : <A HREF="node7.html#4526"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+ : <A HREF="node7.html#4629"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
 <DD><STRONG><TT>jumpto</TT></STRONG>
- : <A HREF="node4.html#1417"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1436"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textit">keysymdef.h</SPAN></STRONG>
- : <A HREF="node4.html#859"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#858"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>kill</TT></STRONG>
- : <A HREF="node7.html#4354"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4455"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>kill_line</TT></STRONG>
- : <A HREF="node7.html#7934"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8079"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>kill_to_bol</TT></STRONG>
- : <A HREF="node7.html#7936"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8081"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>kill_to_eol</TT></STRONG>
- : <A HREF="node7.html#7938"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8083"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>kill_word</TT></STRONG>
- : <A HREF="node7.html#7940"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8085"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>kpress</TT></STRONG>
- : <A HREF="node7.html#4327"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4430"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>kpress_wait</TT></STRONG>
- : <A HREF="node7.html#4329"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4432"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>load_module</TT></STRONG>
- : <A HREF="node7.html#4267"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4372"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">Lock</SPAN></STRONG>
- : <A HREF="node4.html#864"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#863"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>lookup_clientwin</TT></STRONG>
- : <A HREF="node7.html#4269"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4374"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>lookup_region</TT></STRONG>
- : <A HREF="node7.html#4271"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4376"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>lookup_script</TT></STRONG>
- : <A HREF="node7.html#4213"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>managed_list</TT></STRONG>
- : <A HREF="node7.html#4390"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
- | <A HREF="node7.html#4416"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
- | <A HREF="node7.html#6821"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#4312"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>managed_i</TT></STRONG>
+ : <A HREF="node7.html#4491"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ | <A HREF="node7.html#4519"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ | <A HREF="node7.html#6967"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>manager</TT></STRONG>
- : <A HREF="node3.html#391"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#4464"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node3.html#390"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#4567"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>map</TT></STRONG>
- : <A HREF="node7.html#4528"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+ : <A HREF="node7.html#4631"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
 <DD><STRONG><TT>mark</TT></STRONG>
- : <A HREF="node7.html#7942"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8087"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>match_winprop_name</TT></STRONG>
- : <A HREF="node7.html#4331"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4434"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>max_size</TT></STRONG>
- : <A HREF="node4.html#1418"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1437"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>maximize_horiz</TT></STRONG>
- : <A HREF="node7.html#4367"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4466"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>maximize_vert</TT></STRONG>
- : <A HREF="node7.html#4369"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4468"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>mclick</TT></STRONG>
- : <A HREF="node7.html#4333"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4436"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>mdblclick</TT></STRONG>
- : <A HREF="node7.html#4335"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4438"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>mdrag</TT></STRONG>
- : <A HREF="node7.html#4337"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4440"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>menu</TT></STRONG>
- : <A HREF="node7.html#8780"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node7.html#8931"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG><TT>menuentry</TT></STRONG>
- : <A HREF="node4.html#1171"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#4339"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node4.html#1172"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#4442"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>menus</STRONG>
- : <A HREF="node4.html#1115"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node4.html#1114"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>message</TT></STRONG>
- : <A HREF="node7.html#7847"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7992"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>min_size</TT></STRONG>
- : <A HREF="node4.html#1419"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1438"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>mkbottom</TT></STRONG>
- : <A HREF="node7.html#6786"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#6932"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>mod_dock</TT></STRONG><DL>
-<DD><STRONG><TT>set_floating_shown_on</TT></STRONG> : <A HREF="node7.html#8997"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>set_floating_shown_on</TT></STRONG> : <A HREF="node7.html#9148"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 </DL>
 <DD><STRONG><TT>mod_menu</TT></STRONG><DL>
-<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#8781"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
-<DD><STRONG><TT>grabmenu</TT></STRONG> : <A HREF="node7.html#8777"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
-<DD><STRONG><TT>menu</TT></STRONG> : <A HREF="node7.html#8779"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
-<DD><STRONG><TT>pmenu</TT></STRONG> : <A HREF="node7.html#8785"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
-<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#8783"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#8932"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>grabmenu</TT></STRONG> : <A HREF="node7.html#8928"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>menu</TT></STRONG> : <A HREF="node7.html#8930"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>pmenu</TT></STRONG> : <A HREF="node7.html#8936"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#8934"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 </DL>
 <DD><STRONG><TT>mod_query</TT></STRONG><DL>
-<DD><STRONG><TT>defcmd</TT></STRONG> : <A HREF="node7.html#7832"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#7834"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>history_clear</TT></STRONG> : <A HREF="node7.html#7836"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>history_get</TT></STRONG> : <A HREF="node7.html#7838"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>history_push</TT></STRONG> : <A HREF="node7.html#7840"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>history_search</TT></STRONG> : <A HREF="node7.html#7842"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>history_table</TT></STRONG> : <A HREF="node7.html#7844"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>message</TT></STRONG> : <A HREF="node7.html#7846"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>popen_completions</TT></STRONG> : <A HREF="node7.html#7852"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query</TT></STRONG> : <A HREF="node7.html#7854"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_attachclient</TT></STRONG> : <A HREF="node7.html#7856"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_editfile</TT></STRONG> : <A HREF="node7.html#7858"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_exec</TT></STRONG> : <A HREF="node7.html#7860"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_gotoclient</TT></STRONG> : <A HREF="node7.html#7862"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_lua</TT></STRONG> : <A HREF="node7.html#7864"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_man</TT></STRONG> : <A HREF="node7.html#7866"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_menu</TT></STRONG> : <A HREF="node7.html#7868"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_renameframe</TT></STRONG> : <A HREF="node7.html#7870"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_renameworkspace</TT></STRONG> : <A HREF="node7.html#7872"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_restart</TT></STRONG> : <A HREF="node7.html#7874"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_runfile</TT></STRONG> : <A HREF="node7.html#7876"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_shutdown</TT></STRONG> : <A HREF="node7.html#7878"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_ssh</TT></STRONG> : <A HREF="node7.html#7880"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_workspace</TT></STRONG> : <A HREF="node7.html#7883"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>query_yesno</TT></STRONG> : <A HREF="node7.html#7885"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#7848"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>show_about_ion</TT></STRONG> : <A HREF="node7.html#7887"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>show_tree</TT></STRONG> : <A HREF="node7.html#7889"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>warn</TT></STRONG> : <A HREF="node7.html#7850"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>defcmd</TT></STRONG> : <A HREF="node7.html#7977"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#7979"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>history_clear</TT></STRONG> : <A HREF="node7.html#7981"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>history_get</TT></STRONG> : <A HREF="node7.html#7983"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>history_push</TT></STRONG> : <A HREF="node7.html#7985"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>history_search</TT></STRONG> : <A HREF="node7.html#7987"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>history_table</TT></STRONG> : <A HREF="node7.html#7989"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>message</TT></STRONG> : <A HREF="node7.html#7991"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>popen_completions</TT></STRONG> : <A HREF="node7.html#7997"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query</TT></STRONG> : <A HREF="node7.html#7999"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_attachclient</TT></STRONG> : <A HREF="node7.html#8001"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_editfile</TT></STRONG> : <A HREF="node7.html#8003"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_exec</TT></STRONG> : <A HREF="node7.html#8005"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_gotoclient</TT></STRONG> : <A HREF="node7.html#8007"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_lua</TT></STRONG> : <A HREF="node7.html#8009"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_man</TT></STRONG> : <A HREF="node7.html#8011"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_menu</TT></STRONG> : <A HREF="node7.html#8013"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_renameframe</TT></STRONG> : <A HREF="node7.html#8015"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_renameworkspace</TT></STRONG> : <A HREF="node7.html#8017"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_restart</TT></STRONG> : <A HREF="node7.html#8019"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_runfile</TT></STRONG> : <A HREF="node7.html#8021"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_shutdown</TT></STRONG> : <A HREF="node7.html#8023"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_ssh</TT></STRONG> : <A HREF="node7.html#8025"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_workspace</TT></STRONG> : <A HREF="node7.html#8028"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>query_yesno</TT></STRONG> : <A HREF="node7.html#8030"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#7993"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>show_about_ion</TT></STRONG> : <A HREF="node7.html#8032"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>show_tree</TT></STRONG> : <A HREF="node7.html#8034"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>warn</TT></STRONG> : <A HREF="node7.html#7995"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 </DL>
 <DD><STRONG><TT>mod_sp</TT></STRONG><DL>
-<DD><STRONG><TT>set_shown</TT></STRONG> : <A HREF="node7.html#9106"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
-<DD><STRONG><TT>set_shown_on</TT></STRONG> : <A HREF="node7.html#9108"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
+<DD><STRONG><TT>set_shown</TT></STRONG> : <A HREF="node7.html#9257"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
+<DD><STRONG><TT>set_shown_on</TT></STRONG> : <A HREF="node7.html#9259"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
 </DL>
 <DD><STRONG><TT>mod_tiling</TT></STRONG><DL>
-<DD><STRONG><TT>detach</TT></STRONG> : <A HREF="node7.html#6781"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#6783"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>mkbottom</TT></STRONG> : <A HREF="node7.html#6785"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#6787"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#6929"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>mkbottom</TT></STRONG> : <A HREF="node7.html#6931"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#6933"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 </DL>
 <DD><STRONG><TT>mode</TT></STRONG>
- : <A HREF="node7.html#4371"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4470"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">ModN</SPAN></STRONG>
- : <A HREF="node4.html#862"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#861"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>move</TT></STRONG>
- : <A HREF="node7.html#4443"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#4546"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>mpress</TT></STRONG>
- : <A HREF="node7.html#4341"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4444"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>mx_count</TT></STRONG>
- : <A HREF="node7.html#4418"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4521"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>mx_current</TT></STRONG>
- : <A HREF="node7.html#4420"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>mx_list</TT></STRONG>
- : <A HREF="node7.html#4422"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4523"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>mx_i</TT></STRONG>
+ : <A HREF="node7.html#4525"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>mx_nth</TT></STRONG>
- : <A HREF="node7.html#4424"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4527"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>name</TT></STRONG>
- : <A HREF="node7.html#4466"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4569"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>navi_first</TT></STRONG>
- : <A HREF="node7.html#4273"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4378"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>navi_next</TT></STRONG>
- : <A HREF="node7.html#4275"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4380"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>new_group</TT></STRONG>
+ : <A HREF="node4.html#1439"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>next_completion</TT></STRONG>
- : <A HREF="node7.html#7944"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8089"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>nextto</TT></STRONG>
- : <A HREF="node7.html#6823"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6969"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>node_of</TT></STRONG>
- : <A HREF="node7.html#6825"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6971"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>nudge</TT></STRONG>
- : <A HREF="node7.html#4356"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4457"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">NumLock</SPAN></STRONG>
- : <A HREF="node4.html#867"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#866"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG>Obj</STRONG>
- : <A HREF="node3.html#419"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#418"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>oneshot</TT></STRONG>
- : <A HREF="node4.html#1420"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1440"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>p_move</TT></STRONG>
- : <A HREF="node7.html#4501"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
+ : <A HREF="node7.html#4604"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
 <DD><STRONG><TT>p_resize</TT></STRONG>
- : <A HREF="node7.html#4503"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
+ : <A HREF="node7.html#4606"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
 <DD><STRONG><TT>p_switch_tab</TT></STRONG>
- : <A HREF="node7.html#4373"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4472"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>p_tabdrag</TT></STRONG>
- : <A HREF="node7.html#4375"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>panews_make_placement_alt</TT></STRONG>
- : <A HREF="node7.html#9410"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#4474"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>parent</TT></STRONG>
- : <A HREF="node3.html#376"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#4468"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
- | <A HREF="node7.html#6793"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#375"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#4571"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ | <A HREF="node7.html#6939"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>paste</TT></STRONG>
- : <A HREF="node7.html#7946"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8091"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>pmenu</TT></STRONG>
- : <A HREF="node7.html#8786"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node7.html#8937"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG><TT>point</TT></STRONG>
- : <A HREF="node7.html#7948"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8093"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>popen_bgread</TT></STRONG>
- : <A HREF="node7.html#4277"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4382"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>popen_completions</TT></STRONG>
- : <A HREF="node7.html#7853"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#7998"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>PREFIX</TT></STRONG>
- : <A HREF="node4.html#585"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node4.html#584"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>prev_completion</TT></STRONG>
- : <A HREF="node7.html#7950"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8095"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>progname</TT></STRONG>
- : <A HREF="node7.html#4279"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4384"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>query</TT></STRONG>
- : <A HREF="node7.html#7855"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8000"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_attachclient</TT></STRONG>
- : <A HREF="node7.html#7857"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8002"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_editfile</TT></STRONG>
- : <A HREF="node7.html#7859"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8004"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_exec</TT></STRONG>
- : <A HREF="node7.html#7861"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8006"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_gotoclient</TT></STRONG>
- : <A HREF="node7.html#7863"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8008"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_lua</TT></STRONG>
- : <A HREF="node7.html#7865"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8010"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_man</TT></STRONG>
- : <A HREF="node7.html#7867"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8012"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_menu</TT></STRONG>
- : <A HREF="node7.html#7869"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8014"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_renameframe</TT></STRONG>
- : <A HREF="node7.html#7871"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8016"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_renameworkspace</TT></STRONG>
- : <A HREF="node7.html#7873"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8018"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_restart</TT></STRONG>
- : <A HREF="node7.html#7875"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8020"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_runfile</TT></STRONG>
- : <A HREF="node7.html#7877"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8022"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_shutdown</TT></STRONG>
- : <A HREF="node7.html#7879"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8024"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_ssh</TT></STRONG>
- : <A HREF="node7.html#7881"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8026"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_workspace</TT></STRONG>
- : <A HREF="node7.html#7884"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8029"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>query_yesno</TT></STRONG>
- : <A HREF="node7.html#7886"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8031"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>quote_next</TT></STRONG>
- : <A HREF="node7.html#4358"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4459"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>read_config</TT></STRONG>
- : <A HREF="node7.html#4510"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
+ : <A HREF="node7.html#4613"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
 <DD><STRONG><TT>read_savefile</TT></STRONG>
- : <A HREF="node7.html#4209"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4308"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>refresh</TT></STRONG>
- : <A HREF="node7.html#4512"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
+ : <A HREF="node7.html#4615"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
 <DD><STRONG><TT>refresh_stylelist</TT></STRONG>
- : <A HREF="node7.html#4343"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4446"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>reg</TT></STRONG>
- : <A HREF="node7.html#6803"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>region_activated_hook</TT></STRONG>
- : <A HREF="node7.html#9411"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
-<DD><STRONG><TT>region_activity_hook</TT></STRONG>
- : <A HREF="node7.html#9412"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#6949"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>region_do_warp_alt</TT></STRONG>
- : <A HREF="node7.html#9413"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
-<DD><STRONG><TT>region_inactivated_hook</TT></STRONG>
- : <A HREF="node7.html#9414"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
-<DD><STRONG><TT>region_list</TT></STRONG>
- : <A HREF="node7.html#4281"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#9539"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+<DD><STRONG><TT>region_i</TT></STRONG>
+ : <A HREF="node7.html#4386"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>region_notify_hook</TT></STRONG>
+ : <A HREF="node7.html#9541"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>request_selection</TT></STRONG>
- : <A HREF="node7.html#4283"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4388"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>reset</TT></STRONG>
- : <A HREF="node7.html#9178"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#9329"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>resign</TT></STRONG>
- : <A HREF="node7.html#4285"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4390"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>resize</TT></STRONG>
- : <A HREF="node7.html#4445"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
- | <A HREF="node7.html#9005"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4548"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ | <A HREF="node7.html#9156"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>restart</TT></STRONG>
- : <A HREF="node7.html#4287"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4392"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>restart_other</TT></STRONG>
- : <A HREF="node7.html#4289"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4394"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>role</TT></STRONG><DL>
-<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1427"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1448"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG>root window</STRONG>
  : <A HREF="node3.html#336"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>rootwin_of</TT></STRONG>
- : <A HREF="node7.html#4470"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4573"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>rqclose</TT></STRONG>
- : <A HREF="node7.html#4472"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4575"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>rqclose_propagate</TT></STRONG>
- : <A HREF="node7.html#4474"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4577"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>rqgeom</TT></STRONG>
- : <A HREF="node7.html#4476"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
- | <A HREF="node7.html#6795"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4579"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ | <A HREF="node7.html#6941"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>rqorder</TT></STRONG>
- : <A HREF="node7.html#4478"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4581"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG>screen</STRONG><DL>
 <DD><STRONG>physical</STRONG> : <A HREF="node3.html#338"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>X</STRONG> : <A HREF="node3.html#337"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>screen_managed_changed_hook</TT></STRONG>
- : <A HREF="node7.html#9415"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9540"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>screen_of</TT></STRONG>
- : <A HREF="node7.html#4480"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4583"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>scrolldown</TT></STRONG>
- : <A HREF="node7.html#7965"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8110"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">ScrollLock</SPAN></STRONG>
- : <A HREF="node4.html#868"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#867"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>scrollup</TT></STRONG>
- : <A HREF="node7.html#7967"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8112"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>select_engine</TT></STRONG>
- : <A HREF="node7.html#4514"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
+ : <A HREF="node7.html#4617"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">14</SPAN></A>
 <DD><STRONG><TT>select_next</TT></STRONG>
- : <A HREF="node7.html#8793"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#8944"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>select_nth</TT></STRONG>
- : <A HREF="node7.html#8795"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#8946"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>select_prev</TT></STRONG>
- : <A HREF="node7.html#8797"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#8948"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>set</TT></STRONG>
- : <A HREF="node7.html#4291"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#6788"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
- | <A HREF="node7.html#7849"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
- | <A HREF="node7.html#8784"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
- | <A HREF="node7.html#9007"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4396"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#6934"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ | <A HREF="node7.html#7994"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ | <A HREF="node7.html#8935"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ | <A HREF="node7.html#9158"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>set_activity</TT></STRONG>
- : <A HREF="node7.html#4482"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4585"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>set_completions</TT></STRONG>
- : <A HREF="node7.html#7893"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#8038"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>set_context</TT></STRONG>
- : <A HREF="node7.html#7952"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8097"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>set_floating</TT></STRONG>
- : <A HREF="node7.html#6829"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6975"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>set_floating_at</TT></STRONG>
- : <A HREF="node7.html#6827"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6973"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>set_floating_shown_on</TT></STRONG>
- : <A HREF="node7.html#8998"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#9149"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>set_fullscreen</TT></STRONG>
- : <A HREF="node7.html#4360"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>set_get_winprop_fn</TT></STRONG>
- : <A HREF="node7.html#4293"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4493"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>set_hidden</TT></STRONG>
- : <A HREF="node7.html#4426"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4529"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>set_index</TT></STRONG>
- : <A HREF="node7.html#4428"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4531"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>set_managed_offset</TT></STRONG>
- : <A HREF="node7.html#4498"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
+ : <A HREF="node7.html#4601"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
 <DD><STRONG><TT>set_mark</TT></STRONG>
- : <A HREF="node7.html#7954"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8099"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>set_mode</TT></STRONG>
- : <A HREF="node7.html#4377"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4476"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>set_name</TT></STRONG>
- : <A HREF="node7.html#4484"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4587"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>set_name_exact</TT></STRONG>
- : <A HREF="node7.html#4486"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4589"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>set_numbers</TT></STRONG>
- : <A HREF="node7.html#4379"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4478"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>set_paths</TT></STRONG>
- : <A HREF="node7.html#4295"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4398"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>set_selection</TT></STRONG>
- : <A HREF="node7.html#4297"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4400"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>set_shaded</TT></STRONG>
- : <A HREF="node7.html#4381"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#4480"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>set_shown</TT></STRONG>
- : <A HREF="node7.html#9107"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
+ : <A HREF="node7.html#9258"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
 <DD><STRONG><TT>set_shown_on</TT></STRONG>
- : <A HREF="node7.html#9109"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
+ : <A HREF="node7.html#9260"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
 <DD><STRONG><TT>set_stdisp</TT></STRONG>
- : <A HREF="node7.html#4430"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4533"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>set_tagged</TT></STRONG>
- : <A HREF="node7.html#4488"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4591"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>set_text</TT></STRONG>
- : <A HREF="node7.html#4397"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
+ : <A HREF="node7.html#4500"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
 <DD><STRONG><TT>shell_safe</TT></STRONG>
- : <A HREF="node7.html#4517"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">15</SPAN></A>
+ : <A HREF="node7.html#4620"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">15</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textbf">Shift</SPAN></STRONG>
- : <A HREF="node4.html#860"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#859"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>show_about_ion</TT></STRONG>
- : <A HREF="node7.html#7888"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8033"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>show_tree</TT></STRONG>
- : <A HREF="node7.html#7890"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#8035"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>shutdown</TT></STRONG>
- : <A HREF="node7.html#4299"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4402"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>size_hints</TT></STRONG>
- : <A HREF="node7.html#4490"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#4593"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 <DD><STRONG><TT>skip_word</TT></STRONG>
- : <A HREF="node7.html#7956"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8101"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>snapshot</TT></STRONG>
- : <A HREF="node7.html#4301"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4404"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>split</TT></STRONG>
- : <A HREF="node7.html#6831"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6977"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>split_at</TT></STRONG>
- : <A HREF="node7.html#6833"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6979"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>split_top</TT></STRONG>
- : <A HREF="node7.html#6835"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6981"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>split_tree</TT></STRONG>
- : <A HREF="node7.html#6837"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6983"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>statusbar</TT></STRONG>
+ : <A HREF="node4.html#1441"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>string</TT></STRONG><DL>
-<DD><STRONG><TT>shell_safe</TT></STRONG> : <A HREF="node7.html#4516"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">15</SPAN></A>
+<DD><STRONG><TT>shell_safe</TT></STRONG> : <A HREF="node7.html#4619"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">15</SPAN></A>
 </DL>
 <DD><STRONG>style</STRONG>
- : <A HREF="node5.html#1665"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node5.html#1710"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>submap</TT></STRONG>
- : <A HREF="node7.html#4345"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4448"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>submenu</TT></STRONG>
- : <A HREF="node4.html#1172"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#4347"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node4.html#1173"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#4450"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>substyle</TT></STRONG>
- : <A HREF="node5.html#1677"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#9180"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node5.html#1722"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#9331"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>switch_next</TT></STRONG>
- : <A HREF="node7.html#4432"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4535"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>switch_nth</TT></STRONG>
- : <A HREF="node7.html#4434"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4537"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>switch_prev</TT></STRONG>
- : <A HREF="node7.html#4436"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+ : <A HREF="node7.html#4539"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 <DD><STRONG><TT>switchto</TT></STRONG>
- : <A HREF="node4.html#1421"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1442"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textit">system.mk</SPAN></STRONG>
- : <A HREF="node4.html#587"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node4.html#586"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>table</TT></STRONG><DL>
-<DD><STRONG><TT>append</TT></STRONG> : <A HREF="node7.html#4519"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
-<DD><STRONG><TT>copy</TT></STRONG> : <A HREF="node7.html#4521"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
-<DD><STRONG><TT>icat</TT></STRONG> : <A HREF="node7.html#4523"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
-<DD><STRONG><TT>join</TT></STRONG> : <A HREF="node7.html#4525"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
-<DD><STRONG><TT>map</TT></STRONG> : <A HREF="node7.html#4527"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+<DD><STRONG><TT>append</TT></STRONG> : <A HREF="node7.html#4622"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+<DD><STRONG><TT>copy</TT></STRONG> : <A HREF="node7.html#4624"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+<DD><STRONG><TT>icat</TT></STRONG> : <A HREF="node7.html#4626"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+<DD><STRONG><TT>join</TT></STRONG> : <A HREF="node7.html#4628"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
+<DD><STRONG><TT>map</TT></STRONG> : <A HREF="node7.html#4630"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">16</SPAN></A>
 </DL>
-<DD><STRONG><TT>tagged_list</TT></STRONG>
- : <A HREF="node7.html#4303"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>tags_first</TT></STRONG>
- : <A HREF="node7.html#4305"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>tagged_first</TT></STRONG>
+ : <A HREF="node7.html#4406"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>tagged_i</TT></STRONG>
+ : <A HREF="node7.html#4408"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>target</TT></STRONG>
- : <A HREF="node4.html#1422"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1443"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>tiling_placement_alt</TT></STRONG>
- : <A HREF="node7.html#9409"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+ : <A HREF="node7.html#9538"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 <DD><STRONG><TT>tl</TT></STRONG>
- : <A HREF="node7.html#6812"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node7.html#6958"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG><TT>TR</TT></STRONG>
- : <A HREF="node7.html#4189"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4286"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>transient</STRONG>
- : <A HREF="node4.html#1387"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node4.html#1406"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>transient_mode</TT></STRONG>
- : <A HREF="node4.html#1423"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1444"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>transients_at_top</TT></STRONG>
- : <A HREF="node4.html#1424"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1445"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>transparent</TT></STRONG>
- : <A HREF="node4.html#1425"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1446"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>transpose</TT></STRONG>
- : <A HREF="node7.html#6797"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#6943"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>transpose_at</TT></STRONG>
- : <A HREF="node7.html#6817"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6963"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>transpose_chars</TT></STRONG>
- : <A HREF="node7.html#7958"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8103"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>transpose_words</TT></STRONG>
- : <A HREF="node7.html#7960"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node7.html#8105"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>typeahead_clear</TT></STRONG>
- : <A HREF="node7.html#8799"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#8950"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>unsplit_at</TT></STRONG>
- : <A HREF="node7.html#6839"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node7.html#6985"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>version</TT></STRONG>
- : <A HREF="node7.html#4307"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4410"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>warn</TT></STRONG>
- : <A HREF="node7.html#4309"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#7851"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node7.html#4412"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#7996"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>warn_traced</TT></STRONG>
- : <A HREF="node7.html#4311"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4414"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>WClientWin</TT></STRONG>
- : <A HREF="node3.html#421"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#420"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>get_ident</TT></STRONG> : <A HREF="node7.html#4349"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>is_fullscreen</TT></STRONG> : <A HREF="node7.html#4351"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>kill</TT></STRONG> : <A HREF="node7.html#4353"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>nudge</TT></STRONG> : <A HREF="node7.html#4355"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>quote_next</TT></STRONG> : <A HREF="node7.html#4357"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>set_fullscreen</TT></STRONG> : <A HREF="node7.html#4359"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>xid</TT></STRONG> : <A HREF="node7.html#4361"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>get_ident</TT></STRONG> : <A HREF="node7.html#4452"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>kill</TT></STRONG> : <A HREF="node7.html#4454"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>nudge</TT></STRONG> : <A HREF="node7.html#4456"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>quote_next</TT></STRONG> : <A HREF="node7.html#4458"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>xid</TT></STRONG> : <A HREF="node7.html#4460"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>WComplProxy</TT></STRONG><DL>
-<DD><STRONG><TT>set_completions</TT></STRONG> : <A HREF="node7.html#7892"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>set_completions</TT></STRONG> : <A HREF="node7.html#8037"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>WDock</TT></STRONG><DL>
-<DD><STRONG><TT>attach</TT></STRONG> : <A HREF="node7.html#9000"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#9002"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>resize</TT></STRONG> : <A HREF="node7.html#9004"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#9006"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>attach</TT></STRONG> : <A HREF="node7.html#9151"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>get</TT></STRONG> : <A HREF="node7.html#9153"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>resize</TT></STRONG> : <A HREF="node7.html#9155"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>set</TT></STRONG> : <A HREF="node7.html#9157"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>WEdln</TT></STRONG>
- : <A HREF="node3.html#434"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#433"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>back</TT></STRONG> : <A HREF="node7.html#7895"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>backspace</TT></STRONG> : <A HREF="node7.html#7897"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>bkill_word</TT></STRONG> : <A HREF="node7.html#7899"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>bol</TT></STRONG> : <A HREF="node7.html#7901"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>bskip_word</TT></STRONG> : <A HREF="node7.html#7903"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>clear_mark</TT></STRONG> : <A HREF="node7.html#7905"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>complete</TT></STRONG> : <A HREF="node7.html#7907"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>contents</TT></STRONG> : <A HREF="node7.html#7909"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>context</TT></STRONG> : <A HREF="node7.html#7911"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>copy</TT></STRONG> : <A HREF="node7.html#7913"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>cut</TT></STRONG> : <A HREF="node7.html#7915"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>delete</TT></STRONG> : <A HREF="node7.html#7917"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>eol</TT></STRONG> : <A HREF="node7.html#7919"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>finish</TT></STRONG> : <A HREF="node7.html#7921"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>forward</TT></STRONG> : <A HREF="node7.html#7923"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>history_next</TT></STRONG> : <A HREF="node7.html#7925"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>history_prev</TT></STRONG> : <A HREF="node7.html#7927"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>insstr</TT></STRONG> : <A HREF="node7.html#7929"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>is_histcompl</TT></STRONG> : <A HREF="node7.html#7931"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>kill_line</TT></STRONG> : <A HREF="node7.html#7933"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>kill_to_bol</TT></STRONG> : <A HREF="node7.html#7935"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>kill_to_eol</TT></STRONG> : <A HREF="node7.html#7937"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>kill_word</TT></STRONG> : <A HREF="node7.html#7939"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>mark</TT></STRONG> : <A HREF="node7.html#7941"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>next_completion</TT></STRONG> : <A HREF="node7.html#7943"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>paste</TT></STRONG> : <A HREF="node7.html#7945"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>point</TT></STRONG> : <A HREF="node7.html#7947"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>prev_completion</TT></STRONG> : <A HREF="node7.html#7949"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>set_context</TT></STRONG> : <A HREF="node7.html#7951"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>set_mark</TT></STRONG> : <A HREF="node7.html#7953"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>skip_word</TT></STRONG> : <A HREF="node7.html#7955"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>transpose_chars</TT></STRONG> : <A HREF="node7.html#7957"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>transpose_words</TT></STRONG> : <A HREF="node7.html#7959"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>back</TT></STRONG> : <A HREF="node7.html#8040"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>backspace</TT></STRONG> : <A HREF="node7.html#8042"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>bkill_word</TT></STRONG> : <A HREF="node7.html#8044"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>bol</TT></STRONG> : <A HREF="node7.html#8046"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>bskip_word</TT></STRONG> : <A HREF="node7.html#8048"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>clear_mark</TT></STRONG> : <A HREF="node7.html#8050"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>complete</TT></STRONG> : <A HREF="node7.html#8052"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>contents</TT></STRONG> : <A HREF="node7.html#8054"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>context</TT></STRONG> : <A HREF="node7.html#8056"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>copy</TT></STRONG> : <A HREF="node7.html#8058"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>cut</TT></STRONG> : <A HREF="node7.html#8060"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>delete</TT></STRONG> : <A HREF="node7.html#8062"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>eol</TT></STRONG> : <A HREF="node7.html#8064"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>finish</TT></STRONG> : <A HREF="node7.html#8066"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>forward</TT></STRONG> : <A HREF="node7.html#8068"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>history_next</TT></STRONG> : <A HREF="node7.html#8070"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>history_prev</TT></STRONG> : <A HREF="node7.html#8072"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>insstr</TT></STRONG> : <A HREF="node7.html#8074"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>is_histcompl</TT></STRONG> : <A HREF="node7.html#8076"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>kill_line</TT></STRONG> : <A HREF="node7.html#8078"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>kill_to_bol</TT></STRONG> : <A HREF="node7.html#8080"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>kill_to_eol</TT></STRONG> : <A HREF="node7.html#8082"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>kill_word</TT></STRONG> : <A HREF="node7.html#8084"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>mark</TT></STRONG> : <A HREF="node7.html#8086"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>next_completion</TT></STRONG> : <A HREF="node7.html#8088"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>paste</TT></STRONG> : <A HREF="node7.html#8090"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>point</TT></STRONG> : <A HREF="node7.html#8092"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>prev_completion</TT></STRONG> : <A HREF="node7.html#8094"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>set_context</TT></STRONG> : <A HREF="node7.html#8096"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>set_mark</TT></STRONG> : <A HREF="node7.html#8098"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>skip_word</TT></STRONG> : <A HREF="node7.html#8100"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>transpose_chars</TT></STRONG> : <A HREF="node7.html#8102"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>transpose_words</TT></STRONG> : <A HREF="node7.html#8104"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 </DL>
 <DD><STRONG><TT>WFrame</TT></STRONG>
- : <A HREF="node3.html#425"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#424"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>is_shaded</TT></STRONG> : <A HREF="node7.html#4364"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>maximize_horiz</TT></STRONG> : <A HREF="node7.html#4366"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>maximize_vert</TT></STRONG> : <A HREF="node7.html#4368"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>mode</TT></STRONG> : <A HREF="node7.html#4370"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>p_switch_tab</TT></STRONG> : <A HREF="node7.html#4372"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>p_tabdrag</TT></STRONG> : <A HREF="node7.html#4374"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>set_mode</TT></STRONG> : <A HREF="node7.html#4376"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>set_numbers</TT></STRONG> : <A HREF="node7.html#4378"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
-<DD><STRONG><TT>set_shaded</TT></STRONG> : <A HREF="node7.html#4380"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>is_shaded</TT></STRONG> : <A HREF="node7.html#4463"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>maximize_horiz</TT></STRONG> : <A HREF="node7.html#4465"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>maximize_vert</TT></STRONG> : <A HREF="node7.html#4467"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>mode</TT></STRONG> : <A HREF="node7.html#4469"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>p_switch_tab</TT></STRONG> : <A HREF="node7.html#4471"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>p_tabdrag</TT></STRONG> : <A HREF="node7.html#4473"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>set_mode</TT></STRONG> : <A HREF="node7.html#4475"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>set_numbers</TT></STRONG> : <A HREF="node7.html#4477"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>set_shaded</TT></STRONG> : <A HREF="node7.html#4479"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 </DL>
 <DD><STRONG><TT>WGroup</TT></STRONG>
- : <A HREF="node3.html#426"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#425"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>attach</TT></STRONG> : <A HREF="node7.html#4383"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>attach_new</TT></STRONG> : <A HREF="node7.html#4385"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>bottom</TT></STRONG> : <A HREF="node7.html#4387"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>managed_list</TT></STRONG> : <A HREF="node7.html#4389"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>attach</TT></STRONG> : <A HREF="node7.html#4482"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>attach_new</TT></STRONG> : <A HREF="node7.html#4484"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>bottom</TT></STRONG> : <A HREF="node7.html#4486"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>is_fullscreen</TT></STRONG> : <A HREF="node7.html#4488"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>managed_i</TT></STRONG> : <A HREF="node7.html#4490"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>set_fullscreen</TT></STRONG> : <A HREF="node7.html#4492"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 </DL>
 <DD><STRONG>WGroupCW</STRONG>
- : <A HREF="node3.html#428"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>WGroupWS</TT></STRONG>
  : <A HREF="node3.html#427"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>WGroupWS</TT></STRONG>
+ : <A HREF="node3.html#426"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>attach_framed</TT></STRONG> : <A HREF="node7.html#4393"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>attach_framed</TT></STRONG> : <A HREF="node7.html#4496"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 </DL>
 <DD><STRONG><TT>WInfoWin</TT></STRONG><DL>
-<DD><STRONG><TT>set_text</TT></STRONG> : <A HREF="node7.html#4396"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
+<DD><STRONG><TT>set_text</TT></STRONG> : <A HREF="node7.html#4499"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">6</SPAN></A>
 </DL>
 <DD><STRONG>Winprops</STRONG>
- : <A HREF="node4.html#1266"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#1269"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG><TT>WInput</TT></STRONG>
- : <A HREF="node3.html#433"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#432"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>cancel</TT></STRONG> : <A HREF="node7.html#7962"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>scrolldown</TT></STRONG> : <A HREF="node7.html#7964"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
-<DD><STRONG><TT>scrollup</TT></STRONG> : <A HREF="node7.html#7966"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>cancel</TT></STRONG> : <A HREF="node7.html#8107"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>scrolldown</TT></STRONG> : <A HREF="node7.html#8109"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>scrollup</TT></STRONG> : <A HREF="node7.html#8111"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 </DL>
 <DD><STRONG><TT>WMenu</TT></STRONG><DL>
-<DD><STRONG><TT>cancel</TT></STRONG> : <A HREF="node7.html#8788"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>finish</TT></STRONG> : <A HREF="node7.html#8790"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>select_next</TT></STRONG> : <A HREF="node7.html#8792"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>select_nth</TT></STRONG> : <A HREF="node7.html#8794"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>select_prev</TT></STRONG> : <A HREF="node7.html#8796"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>typeahead_clear</TT></STRONG> : <A HREF="node7.html#8798"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>cancel</TT></STRONG> : <A HREF="node7.html#8939"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>finish</TT></STRONG> : <A HREF="node7.html#8941"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>select_next</TT></STRONG> : <A HREF="node7.html#8943"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>select_nth</TT></STRONG> : <A HREF="node7.html#8945"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>select_prev</TT></STRONG> : <A HREF="node7.html#8947"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>typeahead_clear</TT></STRONG> : <A HREF="node7.html#8949"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG>WMessage</STRONG>
- : <A HREF="node3.html#435"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#434"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>WMoveresMode</TT></STRONG><DL>
-<DD><STRONG><TT>cancel</TT></STRONG> : <A HREF="node7.html#4438"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
-<DD><STRONG><TT>finish</TT></STRONG> : <A HREF="node7.html#4440"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
-<DD><STRONG><TT>move</TT></STRONG> : <A HREF="node7.html#4442"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
-<DD><STRONG><TT>resize</TT></STRONG> : <A HREF="node7.html#4444"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+<DD><STRONG><TT>cancel</TT></STRONG> : <A HREF="node7.html#4541"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+<DD><STRONG><TT>finish</TT></STRONG> : <A HREF="node7.html#4543"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+<DD><STRONG><TT>move</TT></STRONG> : <A HREF="node7.html#4545"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
+<DD><STRONG><TT>resize</TT></STRONG> : <A HREF="node7.html#4547"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">8</SPAN></A>
 </DL>
 <DD><STRONG><TT>WMPlex</TT></STRONG><DL>
-<DD><STRONG><TT>attach</TT></STRONG> : <A HREF="node7.html#4399"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>attach_new</TT></STRONG> : <A HREF="node7.html#4401"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>attach_tagged</TT></STRONG> : <A HREF="node7.html#4403"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>dec_index</TT></STRONG> : <A HREF="node7.html#4405"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>get_index</TT></STRONG> : <A HREF="node7.html#4407"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>get_stdisp</TT></STRONG> : <A HREF="node7.html#4409"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>inc_index</TT></STRONG> : <A HREF="node7.html#4411"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>is_hidden</TT></STRONG> : <A HREF="node7.html#4413"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>managed_list</TT></STRONG> : <A HREF="node7.html#4415"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>mx_count</TT></STRONG> : <A HREF="node7.html#4417"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>mx_current</TT></STRONG> : <A HREF="node7.html#4419"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>mx_list</TT></STRONG> : <A HREF="node7.html#4421"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>mx_nth</TT></STRONG> : <A HREF="node7.html#4423"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>set_hidden</TT></STRONG> : <A HREF="node7.html#4425"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>set_index</TT></STRONG> : <A HREF="node7.html#4427"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>set_stdisp</TT></STRONG> : <A HREF="node7.html#4429"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>switch_next</TT></STRONG> : <A HREF="node7.html#4431"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>switch_nth</TT></STRONG> : <A HREF="node7.html#4433"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
-<DD><STRONG><TT>switch_prev</TT></STRONG> : <A HREF="node7.html#4435"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>attach</TT></STRONG> : <A HREF="node7.html#4502"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>attach_new</TT></STRONG> : <A HREF="node7.html#4504"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>attach_tagged</TT></STRONG> : <A HREF="node7.html#4506"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>dec_index</TT></STRONG> : <A HREF="node7.html#4508"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>get_index</TT></STRONG> : <A HREF="node7.html#4510"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>get_stdisp</TT></STRONG> : <A HREF="node7.html#4512"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>inc_index</TT></STRONG> : <A HREF="node7.html#4514"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>is_hidden</TT></STRONG> : <A HREF="node7.html#4516"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>managed_i</TT></STRONG> : <A HREF="node7.html#4518"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>mx_count</TT></STRONG> : <A HREF="node7.html#4520"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>mx_current</TT></STRONG> : <A HREF="node7.html#4522"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>mx_i</TT></STRONG> : <A HREF="node7.html#4524"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>mx_nth</TT></STRONG> : <A HREF="node7.html#4526"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>set_hidden</TT></STRONG> : <A HREF="node7.html#4528"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>set_index</TT></STRONG> : <A HREF="node7.html#4530"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>set_stdisp</TT></STRONG> : <A HREF="node7.html#4532"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>switch_next</TT></STRONG> : <A HREF="node7.html#4534"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>switch_nth</TT></STRONG> : <A HREF="node7.html#4536"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
+<DD><STRONG><TT>switch_prev</TT></STRONG> : <A HREF="node7.html#4538"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">7</SPAN></A>
 </DL>
 <DD><STRONG><TT>WRegion</TT></STRONG>
- : <A HREF="node3.html#420"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#419"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>begin_kbresize</TT></STRONG> : <A HREF="node7.html#4447"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>current</TT></STRONG> : <A HREF="node7.html#4449"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>geom</TT></STRONG> : <A HREF="node7.html#4451"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>goto</TT></STRONG> : <A HREF="node7.html#4453"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>is_active</TT></STRONG> : <A HREF="node7.html#4455"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>is_activity</TT></STRONG> : <A HREF="node7.html#4457"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>is_mapped</TT></STRONG> : <A HREF="node7.html#4459"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>is_tagged</TT></STRONG> : <A HREF="node7.html#4461"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>manager</TT></STRONG> : <A HREF="node7.html#4463"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>name</TT></STRONG> : <A HREF="node7.html#4465"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>parent</TT></STRONG> : <A HREF="node7.html#4467"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>rootwin_of</TT></STRONG> : <A HREF="node7.html#4469"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>rqclose</TT></STRONG> : <A HREF="node7.html#4471"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>rqclose_propagate</TT></STRONG> : <A HREF="node7.html#4473"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>rqgeom</TT></STRONG> : <A HREF="node7.html#4475"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>rqorder</TT></STRONG> : <A HREF="node7.html#4477"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>screen_of</TT></STRONG> : <A HREF="node7.html#4479"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>set_activity</TT></STRONG> : <A HREF="node7.html#4481"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>set_name</TT></STRONG> : <A HREF="node7.html#4483"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>set_name_exact</TT></STRONG> : <A HREF="node7.html#4485"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>set_tagged</TT></STRONG> : <A HREF="node7.html#4487"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
-<DD><STRONG><TT>size_hints</TT></STRONG> : <A HREF="node7.html#4489"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>begin_kbresize</TT></STRONG> : <A HREF="node7.html#4550"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>current</TT></STRONG> : <A HREF="node7.html#4552"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>geom</TT></STRONG> : <A HREF="node7.html#4554"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>goto</TT></STRONG> : <A HREF="node7.html#4556"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>is_active</TT></STRONG> : <A HREF="node7.html#4558"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>is_activity</TT></STRONG> : <A HREF="node7.html#4560"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>is_mapped</TT></STRONG> : <A HREF="node7.html#4562"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>is_tagged</TT></STRONG> : <A HREF="node7.html#4564"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>manager</TT></STRONG> : <A HREF="node7.html#4566"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>name</TT></STRONG> : <A HREF="node7.html#4568"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>parent</TT></STRONG> : <A HREF="node7.html#4570"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>rootwin_of</TT></STRONG> : <A HREF="node7.html#4572"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>rqclose</TT></STRONG> : <A HREF="node7.html#4574"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>rqclose_propagate</TT></STRONG> : <A HREF="node7.html#4576"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>rqgeom</TT></STRONG> : <A HREF="node7.html#4578"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>rqorder</TT></STRONG> : <A HREF="node7.html#4580"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>screen_of</TT></STRONG> : <A HREF="node7.html#4582"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>set_activity</TT></STRONG> : <A HREF="node7.html#4584"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>set_name</TT></STRONG> : <A HREF="node7.html#4586"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>set_name_exact</TT></STRONG> : <A HREF="node7.html#4588"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>set_tagged</TT></STRONG> : <A HREF="node7.html#4590"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+<DD><STRONG><TT>size_hints</TT></STRONG> : <A HREF="node7.html#4592"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
 </DL>
 <DD><STRONG><TT>write_savefile</TT></STRONG>
- : <A HREF="node7.html#4215"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4314"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>WRootWin</TT></STRONG>
- : <A HREF="node3.html#423"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#422"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>current_scr</TT></STRONG> : <A HREF="node7.html#4492"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">10</SPAN></A>
+<DD><STRONG><TT>current_scr</TT></STRONG> : <A HREF="node7.html#4595"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">10</SPAN></A>
 </DL>
 <DD><STRONG><TT>WScreen</TT></STRONG>
- : <A HREF="node3.html#424"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#423"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>id</TT></STRONG> : <A HREF="node7.html#4495"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
-<DD><STRONG><TT>set_managed_offset</TT></STRONG> : <A HREF="node7.html#4497"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
+<DD><STRONG><TT>id</TT></STRONG> : <A HREF="node7.html#4598"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
+<DD><STRONG><TT>set_managed_offset</TT></STRONG> : <A HREF="node7.html#4600"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">11</SPAN></A>
 </DL>
 <DD><STRONG><TT>WSplit</TT></STRONG>
- : <A HREF="node3.html#431"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#430"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>geom</TT></STRONG> : <A HREF="node7.html#6790"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>parent</TT></STRONG> : <A HREF="node7.html#6792"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>rqgeom</TT></STRONG> : <A HREF="node7.html#6794"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>transpose</TT></STRONG> : <A HREF="node7.html#6796"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>geom</TT></STRONG> : <A HREF="node7.html#6936"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>parent</TT></STRONG> : <A HREF="node7.html#6938"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>rqgeom</TT></STRONG> : <A HREF="node7.html#6940"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>transpose</TT></STRONG> : <A HREF="node7.html#6942"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG><TT>WSplitInner</TT></STRONG><DL>
-<DD><STRONG><TT>current</TT></STRONG> : <A HREF="node7.html#6799"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+<DD><STRONG><TT>current</TT></STRONG> : <A HREF="node7.html#6945"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 </DL>
 <DD><STRONG><TT>WSplitRegion</TT></STRONG><DL>
-<DD><STRONG><TT>reg</TT></STRONG> : <A HREF="node7.html#6802"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+<DD><STRONG><TT>reg</TT></STRONG> : <A HREF="node7.html#6948"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 </DL>
 <DD><STRONG><TT>WSplitSplit</TT></STRONG><DL>
-<DD><STRONG><TT>br</TT></STRONG> : <A HREF="node7.html#6805"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
-<DD><STRONG><TT>dir</TT></STRONG> : <A HREF="node7.html#6807"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
-<DD><STRONG><TT>flip</TT></STRONG> : <A HREF="node7.html#6809"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
-<DD><STRONG><TT>tl</TT></STRONG> : <A HREF="node7.html#6811"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>br</TT></STRONG> : <A HREF="node7.html#6951"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>dir</TT></STRONG> : <A HREF="node7.html#6953"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>flip</TT></STRONG> : <A HREF="node7.html#6955"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+<DD><STRONG><TT>tl</TT></STRONG> : <A HREF="node7.html#6957"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 </DL>
 <DD><STRONG><TT>WTiling</TT></STRONG>
- : <A HREF="node3.html#430"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#429"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>farthest</TT></STRONG> : <A HREF="node7.html#6818"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>flip_at</TT></STRONG> : <A HREF="node7.html#6814"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>managed_list</TT></STRONG> : <A HREF="node7.html#6820"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>nextto</TT></STRONG> : <A HREF="node7.html#6822"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>node_of</TT></STRONG> : <A HREF="node7.html#6824"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>set_floating</TT></STRONG> : <A HREF="node7.html#6828"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>set_floating_at</TT></STRONG> : <A HREF="node7.html#6826"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>split</TT></STRONG> : <A HREF="node7.html#6830"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>split_at</TT></STRONG> : <A HREF="node7.html#6832"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>split_top</TT></STRONG> : <A HREF="node7.html#6834"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>split_tree</TT></STRONG> : <A HREF="node7.html#6836"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>transpose_at</TT></STRONG> : <A HREF="node7.html#6816"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
-<DD><STRONG><TT>unsplit_at</TT></STRONG> : <A HREF="node7.html#6838"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>farthest</TT></STRONG> : <A HREF="node7.html#6964"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>flip_at</TT></STRONG> : <A HREF="node7.html#6960"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>managed_i</TT></STRONG> : <A HREF="node7.html#6966"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>nextto</TT></STRONG> : <A HREF="node7.html#6968"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>node_of</TT></STRONG> : <A HREF="node7.html#6970"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>set_floating</TT></STRONG> : <A HREF="node7.html#6974"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>set_floating_at</TT></STRONG> : <A HREF="node7.html#6972"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>split</TT></STRONG> : <A HREF="node7.html#6976"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>split_at</TT></STRONG> : <A HREF="node7.html#6978"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>split_top</TT></STRONG> : <A HREF="node7.html#6980"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>split_tree</TT></STRONG> : <A HREF="node7.html#6982"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>transpose_at</TT></STRONG> : <A HREF="node7.html#6962"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+<DD><STRONG><TT>unsplit_at</TT></STRONG> : <A HREF="node7.html#6984"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 </DL>
 <DD><STRONG><TT>WWindow</TT></STRONG>
- : <A HREF="node3.html#422"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node3.html#421"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DL>
-<DD><STRONG><TT>p_move</TT></STRONG> : <A HREF="node7.html#4500"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
-<DD><STRONG><TT>p_resize</TT></STRONG> : <A HREF="node7.html#4502"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
-<DD><STRONG><TT>xid</TT></STRONG> : <A HREF="node7.html#4504"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
+<DD><STRONG><TT>p_move</TT></STRONG> : <A HREF="node7.html#4603"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
+<DD><STRONG><TT>p_resize</TT></STRONG> : <A HREF="node7.html#4605"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
+<DD><STRONG><TT>xid</TT></STRONG> : <A HREF="node7.html#4607"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
 </DL>
 <DD><STRONG><TT>x_change_property</TT></STRONG>
- : <A HREF="node7.html#4313"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4416"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>x_delete_property</TT></STRONG>
- : <A HREF="node7.html#4315"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4418"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>x_get_atom_name</TT></STRONG>
- : <A HREF="node7.html#4317"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4420"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>x_get_text_property</TT></STRONG>
- : <A HREF="node7.html#4319"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4422"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>x_get_window_property</TT></STRONG>
- : <A HREF="node7.html#4321"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4424"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>x_intern_atom</TT></STRONG>
- : <A HREF="node7.html#4323"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4426"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>x_set_text_property</TT></STRONG>
- : <A HREF="node7.html#4325"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node7.html#4428"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>xid</TT></STRONG>
- : <A HREF="node7.html#4362"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
- | <A HREF="node7.html#4505"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
+ : <A HREF="node7.html#4461"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ | <A HREF="node7.html#4608"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">12</SPAN></A>
 <DD><STRONG>Xinerama</STRONG>
  : <A HREF="node3.html#339"><SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><SPAN  CLASS="textit">xmodmap</SPAN></STRONG>
- : <A HREF="node4.html#866"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
+ : <A HREF="node4.html#865"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
 <DD><STRONG>xprop</STRONG>
- : <A HREF="node4.html#1383"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node4.html#1402"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 
 </DL>
 
index 90201d6ddea5dde880c384c1c431db3b6e9fb30d..b55a763a2b4ef95d28bebbefea6480344fd4041c 100644 (file)
@@ -70,7 +70,7 @@ Mathematics Department, Macquarie University, Sydney.
 The command line arguments were: <BR>
  <STRONG>latex2html</STRONG> <TT>-show_section_numbers -short_index -local_icons -noaddress -up_url http://iki.fi/tuomov/ion/ -up_title 'Ion homepage' -nofootnode -split 3 ionconf</TT>
 <P>
-The translation was initiated by tuomov on 2006-12-23
+The translation was initiated by tuomov on 2007-02-03
 <BR><HR>
 
 </BODY>
index f3dbd29a000c973dbb5d34114c5918f2ecbae02d..cc7578a7f485aab9c7fee85a960386465d45794d 100644 (file)
@@ -227,7 +227,7 @@ implement.
 
 <P>
 
-<DIV ALIGN="CENTER"><A NAME="fig:classhierarchy"></A><A NAME="413"></A>
+<DIV ALIGN="CENTER"><A NAME="fig:classhierarchy"></A><A NAME="412"></A>
 <TABLE>
 <CAPTION ALIGN="BOTTOM"><STRONG>Figure 2.1:</STRONG>
 Partial Ioncore, <SPAN  CLASS="textit">mod_tiling</SPAN> and <SPAN  CLASS="textit">mod_query</SPAN> 
@@ -237,10 +237,10 @@ Partial Ioncore, <SPAN  CLASS="textit">mod_tiling</SPAN> and <SPAN  CLASS="texti
      |--&gt;WRegion
      |    |--&gt;WClientWin
      |    |--&gt;WWindow
-     |    |    |--&gt;WRootWin
      |    |    |--&gt;WMPlex
-     |    |    |    |--&gt;WScreen
      |    |    |    |--&gt;WFrame
+     |    |    |    |--&gt;WScreen
+     |    |    |         |--&gt;WRootWin
      |    |    |--&gt;WInput (mod_query)
      |    |         |--&gt;WEdln (mod_query)
      |    |         |--&gt;WMessage (mod_query)
@@ -259,13 +259,13 @@ The core classes:
 <P>
 <DL>
 <DT><STRONG>Obj</STRONG></DT>
-<DD><A NAME="419"></A>
+<DD><A NAME="418"></A>
     Is the base of Ion's object system.
 
 <P>
 </DD>
 <DT><STRONG>WRegion</STRONG></DT>
-<DD><A NAME="420"></A>
+<DD><A NAME="419"></A>
     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 
@@ -277,27 +277,27 @@ The core classes:
 <P>
 </DD>
 <DT><STRONG>WClientWin</STRONG></DT>
-<DD><A NAME="421"></A> is a class for
+<DD><A NAME="420"></A> is a class for
     client window objects, the objects that window managers are
     supposed to manage.
 
 <P>
 </DD>
 <DT><STRONG>WWindow</STRONG></DT>
-<DD><A NAME="422"></A> is the base class for all
+<DD><A NAME="421"></A> is the base class for all
     internal objects having an X window associated to them
     (WClientWins also have X windows associated to them).
 
 <P>
 </DD>
 <DT><STRONG>WRootWin</STRONG></DT>
-<DD><A NAME="423"></A> is the class for
+<DD><A NAME="422"></A> is the class for
     root windows<A NAME="336"></A> of X screens<A NAME="337"></A>.
     Note that an ''X screen'' or root window is not necessarily a
     single  physical screen<A NAME="338"></A> as a root window
-    may be split over multiple screens when multi-head extension
-    such as Xinerama<A NAME="339"></A> are used. (Actually there
-    can be only one WRootWin when Xinerama is used.)
+    may be split over multiple screens when hacks such a
+    Xinerama<A NAME="339"></A> are used. (Actually there can be only 
+    one root window when Xinerama is used.)
 
 <P>
 </DD>
@@ -310,15 +310,14 @@ The core classes:
 <P>
 </DD>
 <DT><STRONG>WScreen</STRONG></DT>
-<DD><A NAME="424"></A> is the class for objects
+<DD><A NAME="423"></A> is the class for objects
     corresponding to physical screens. Screens may share a root
-    window when Xinerama multihead extensions are used as explained
-    above.
+    window when the Xinerama extension is used as explained above.
 
 <P>
 </DD>
 <DT><STRONG>WFrame</STRONG></DT>
-<DD><A NAME="425"></A> is the class for frames.
+<DD><A NAME="424"></A> 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).
@@ -326,11 +325,11 @@ The core classes:
 <P>
 </DD>
 <DT><STRONG>WGroup</STRONG></DT>
-<DD><A NAME="426"></A> is the base class for groups.
+<DD><A NAME="425"></A> is the base class for groups.
     Particular types of groups are workspaces 
-    (WGroupWS<A NAME="427"></A>)
+    (WGroupWS<A NAME="426"></A>)
     and groups of client windows
-    (WGroupCW<A NAME="428"></A>).
+    (WGroupCW<A NAME="427"></A>).
 </DD>
 </DL>
 
@@ -340,12 +339,12 @@ Classes implemented by the <SPAN  CLASS="textit">mod_tiling</SPAN> module:
 <P>
 <DL>
 <DT><STRONG>WTiling</STRONG></DT>
-<DD><A NAME="430"></A> is the class for tilings
+<DD><A NAME="429"></A> is the class for tilings
     of frames.
   
 </DD>
 <DT><STRONG>WSplit</STRONG></DT>
-<DD><A NAME="431"></A> (or, more specifically, classes
+<DD><A NAME="430"></A> (or, more specifically, classes
     that inherit it) encode the WTiling tree structure.
 </DD>
 </DL>
@@ -356,19 +355,19 @@ Classes implemented by the <SPAN  CLASS="textit">mod_query</SPAN> module:
 <P>
 <DL>
 <DT><STRONG>WInput</STRONG></DT>
-<DD><A NAME="433"></A> is a virtual base class for the
+<DD><A NAME="432"></A> is a virtual base class for the
     two classes below.
   
 </DD>
 <DT><STRONG>WEdln</STRONG></DT>
-<DD><A NAME="434"></A> is the class for the ''queries'',
+<DD><A NAME="433"></A> 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.
   
 </DD>
 <DT><STRONG>WMessage</STRONG></DT>
-<DD><A NAME="435"></A> implements the boxes for 
+<DD><A NAME="434"></A> 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.
 </DD>
@@ -392,7 +391,7 @@ binding callbacks in the move and resize mode.
 <SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN> Parent-child relations</A>
 </H4>
 Each object of type WRegion has a parent and possibly a manager
-associated to it. The parent<A NAME="376"></A> for an object is always a 
+associated to it. The parent<A NAME="375"></A> 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.
@@ -402,7 +401,7 @@ Figure <A HREF="#fig:parentship">2.2</A>.
 
 <P>
 
-<DIV ALIGN="CENTER"><A NAME="fig:parentship"></A><A NAME="387"></A>
+<DIV ALIGN="CENTER"><A NAME="fig:parentship"></A><A NAME="386"></A>
 <TABLE>
 <CAPTION ALIGN="BOTTOM"><STRONG>Figure 2.2:</STRONG>
 Most common parent-child relations</CAPTION>
@@ -423,7 +422,7 @@ Most common parent-child relations</CAPTION>
 
 <P>
 WRegions have very little control over their children as a parent.
-The manager<A NAME="391"></A> WRegion has much more control over its
+The manager<A NAME="390"></A> 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
@@ -441,7 +440,7 @@ but all have a parent-a screen if not anything else.
 
 <P>
 
-<DIV ALIGN="CENTER"><A NAME="fig:managership"></A><A NAME="399"></A>
+<DIV ALIGN="CENTER"><A NAME="fig:managership"></A><A NAME="398"></A>
 <TABLE>
 <CAPTION ALIGN="BOTTOM"><STRONG>Figure 2.3:</STRONG>
 Most common manager-managed relations</CAPTION>
index 60acef34ef86df91f2c7e41b94e0d6e4d5204d07..d156abd426bc9cb0516db9e6753a0984443e03db 100644 (file)
@@ -153,9 +153,9 @@ explained. For a reference on exported functions, see section
 Ion3, to which document applies, stores its stock configuration files in
 <SPAN  CLASS="textit">/usr/local/etc/ion3/</SPAN> unless you, the OS package maintainer or 
 whoever  installed the package on the system has modified the variables
-<TT>PREFIX</TT><A NAME="585"></A> or
-<TT>ETCDIR</TT><A NAME="586"></A> in
-<SPAN  CLASS="textit">system.mk</SPAN><A NAME="587"></A> before compiling Ion.
+<TT>PREFIX</TT><A NAME="584"></A> or
+<TT>ETCDIR</TT><A NAME="585"></A> in
+<SPAN  CLASS="textit">system.mk</SPAN><A NAME="586"></A> 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. 
@@ -573,8 +573,8 @@ defbindings("WFrame", {
 As seen above, the functions that create key binding specifications require
 a <TT>keyspec</TT> argument. This argument should be a string containing the
 name of a key as listed in the X header file <SPAN  CLASS="textit">keysymdef.h</SPAN><A NAME="tex2html7"
-  HREF="#foot858"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></SUP></A> without the <TT>XK_</TT> prefix.
-<A NAME="859"></A>
+  HREF="#foot857"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></SUP></A> without the <TT>XK_</TT> prefix.
+<A NAME="858"></A>
 Most of the key names are quite intuitive while some are not. For example,
 the <SPAN  CLASS="textbf">Enter</SPAN> key on the main part of the keyboard has the less common
 name <SPAN  CLASS="textbf">Return</SPAN> while the one the numpad is called <SPAN  CLASS="textbf">KP_Enter</SPAN>.
@@ -586,23 +586,23 @@ modifiers:
 <BLOCKQUOTE>
 <SPAN  CLASS="textbf">Shift</SPAN>, <SPAN  CLASS="textbf">Control</SPAN>, <SPAN  CLASS="textbf">Mod1</SPAN> to <SPAN  CLASS="textbf">Mod5</SPAN>,
 <SPAN  CLASS="textbf">AnyModifier</SPAN> and <SPAN  CLASS="textbf">Lock</SPAN>.
+<A NAME="859"></A>
 <A NAME="860"></A>
 <A NAME="861"></A>
 <A NAME="862"></A>
 <A NAME="863"></A>
-<A NAME="864"></A>
 
 </BLOCKQUOTE>
 
 <P>
 X allows binding all of these modifiers to almost any key and while this
 list of modifiers does not explicitly list keys such as 
-<SPAN  CLASS="textbf">Alt</SPAN><A NAME="865"></A> that are common on modern keyboards, such
+<SPAN  CLASS="textbf">Alt</SPAN><A NAME="864"></A> that are common on modern keyboards, such
 keys are bound to one of the <SPAN  CLASS="textbf">ModN</SPAN>. On systems running XFree86
 <SPAN  CLASS="textbf">Alt</SPAN> is usually <SPAN  CLASS="textbf">Mod1</SPAN>. On Suns <SPAN  CLASS="textbf">Mod1</SPAN> is the diamond key
 and <SPAN  CLASS="textbf">Alt</SPAN> something else. One of the ''flying window'' keys on so
 called Windows-keyboards is probably mapped to <SPAN  CLASS="textbf">Mod3</SPAN> if you have
-such a key. Use the program <SPAN  CLASS="textit">xmodmap</SPAN><A NAME="866"></A>
+such a key. Use the program <SPAN  CLASS="textit">xmodmap</SPAN><A NAME="865"></A>
 to find out what exactly is bound where. 
 
 <P>
@@ -614,10 +614,10 @@ default.
 
 <P>
 Ion ignores the <SPAN  CLASS="textbf">Lock</SPAN> modifier and any <SPAN  CLASS="textbf">ModN</SPAN> (<SPAN CLASS="MATH"></SPAN>)
-bound to <SPAN  CLASS="textbf">NumLock</SPAN><A NAME="867"></A> or
-<SPAN  CLASS="textbf">ScrollLock</SPAN><A NAME="868"></A>
+bound to <SPAN  CLASS="textbf">NumLock</SPAN><A NAME="866"></A> or
+<SPAN  CLASS="textbf">ScrollLock</SPAN><A NAME="867"></A>
 by default because such<A NAME="tex2html8"
-  HREF="#foot837"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></SUP></A> locking keys may otherwise
+  HREF="#foot836"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></SUP></A> locking keys may otherwise
 cause confusion.
 
 <P>
@@ -630,7 +630,7 @@ cause confusion.
 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 <SPAN  CLASS="textbf">Button1</SPAN> to
-<SPAN  CLASS="textbf">Button5</SPAN><A NAME="869"></A>. Additionally the
+<SPAN  CLASS="textbf">Button5</SPAN><A NAME="868"></A>. 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
@@ -681,10 +681,10 @@ to it is available virtually everywhere.
 </H3>
 
 <P>
-<A NAME="1115"></A>
-<A NAME="1170"></A>
+<A NAME="1114"></A>
 <A NAME="1171"></A>
 <A NAME="1172"></A>
+<A NAME="1173"></A>
 In the stock configuration file setup, menus are defined in the file
 <SPAN  CLASS="textit">cfg_menus.lua</SPAN> as previously mentioned. The <SPAN  CLASS="textit">mod_menu</SPAN> module
 must be loaded for one to be able to define menus, and this is done with
@@ -739,6 +739,13 @@ just like the menus defined as above.
 <TR><TD ALIGN="LEFT"><TT>workspacelist</TT></TD>
 <TD ALIGN="LEFT">List of all workspaces. Activating an entry jumps to that workspaces.</TD>
 </TR>
+<TR><TD ALIGN="LEFT"><TT>focuslist</TT></TD>
+<TD ALIGN="LEFT">List of client windows with recent activity in them, followed by 
+    previously focused client windows.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>focuslist_</TT></TD>
+<TD ALIGN="LEFT">List of previously focused client windows.</TD>
+</TR>
 <TR><TD ALIGN="LEFT"><TT>stylemenu</TT></TD>
 <TD ALIGN="LEFT">List of available <SPAN  CLASS="textit">look_*.lua</SPAN> style files. Activating an entry
     loads that style and ask to save the selection.</TD>
@@ -814,7 +821,7 @@ handlers (and elsewhere):
       after which the selected entry is activated. This function is meant to 
       be used for implementing, for example, Win***s-style <SPAN  CLASS="textbf">Alt-Tab</SPAN> 
       handling.<A NAME="tex2html9"
-  HREF="#foot1173"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></SUP></A></TD>
+  HREF="#foot1174"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></SUP></A></TD>
 </TR>
 </TABLE>
 
@@ -842,7 +849,7 @@ defbindings("WFrame", {
 </H2>
 
 <P>
-The so-called ''winprops''<A NAME="1266"></A> can be used to change how
+The so-called ''winprops''<A NAME="1269"></A> 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
 <TT>defwinprop</TT> with a table containing the properties to set and the
@@ -860,7 +867,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1410"></A>
+<DD><A NAME="1429"></A>
     Set this to <TT>true</TT> 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
@@ -878,7 +885,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1411"></A>
+<DD><A NAME="1430"></A>
     The table should contain the entries <TT>w</TT> and <TT>h</TT> that
     override application-supplied aspect ratio hint.
 
@@ -893,7 +900,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1412"></A>
+<DD><A NAME="1431"></A>
     Set this to open the window in a floating frame, when
     in a group.
 
@@ -908,7 +915,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1413"></A>
+<DD><A NAME="1432"></A>
     Should the window be initially in full screen mode?
 
 </DD>
@@ -922,7 +929,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1414"></A>
+<DD><A NAME="1433"></A>
     Should configure requests on the window be ignored?
     Only has effect on floating windows.
 
@@ -937,7 +944,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1415"></A>
+<DD><A NAME="1434"></A>
     Ignore extended WM hints <TT>_NET_ACTIVE_WINDOW</TT> request.
 
 </DD>
@@ -951,7 +958,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1416"></A>
+<DD><A NAME="1435"></A>
     Should application supplied size increments be ignored?
 
 </DD>
@@ -965,7 +972,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1417"></A>
+<DD><A NAME="1436"></A>
     Should a newly created client window always be made
     active, even if the allocated frame isn't.
 
@@ -980,7 +987,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1418"></A>
+<DD><A NAME="1437"></A>
     The table should contain the entries <TT>w</TT> and <TT>h</TT> that
     override application-supplied maximum size hint.
 
@@ -995,12 +1002,31 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1419"></A>
+<DD><A NAME="1438"></A>
     Similar to <TT>max_size</TT> but for the minimum size hint.
 
 </DD>
 </DL>
 
+<P>
+
+  <DL>
+<DT><STRONG>Winprop:</STRONG></DT>
+<DD><TT>new_group</TT> (string)
+      
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD><A NAME="1439"></A>
+    If the region specified by <TT>target</TT> winprop does not exist
+    (or that winprop is not set), create a new workspace using the 
+    previously stored layout (see <A HREF="node7.html#fn:ioncore.deflayout"><TT>ioncore.deflayout</TT></A>) named by
+    this property. After creating the workspace, <TT>target</TT> is 
+    attempted to be found again. (If that still fails, the newly 
+    created workspace is still asked to manage the client window.)
+
+</DD>
+</DL>
+
 <P>
 
   <DL>
@@ -1009,12 +1035,29 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1420"></A>
+<DD><A NAME="1440"></A>
     Discard this winprop after first use.
 
 </DD>
 </DL>
 
+<P>
+
+  <DL>
+<DT><STRONG>Winprop:</STRONG></DT>
+<DD><TT>statusbar</TT> (string)
+      
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD><A NAME="1441"></A>
+    Put the window on the statusbar, in the named tray component,
+    (The default tray component is called simply ``<TT>systray</TT>'', 
+    and others you give names to in your custom template, always 
+    prefixed by ``<TT>systray_</TT>''.
+
+</DD>
+</DL>
+
 <P>
 
   <DL>
@@ -1023,7 +1066,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1421"></A>
+<DD><A NAME="1442"></A>
     Should a newly mapped client window be switched to within
     its frame.
 
@@ -1038,9 +1081,9 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1422"></A>
+<DD><A NAME="1443"></A>
     The name of an object (workspace, frame) that should manage 
-    windows of this type.
+    windows of this type. See also <TT>new_group</TT>.
 
 </DD>
 </DL>
@@ -1053,7 +1096,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1423"></A>
+<DD><A NAME="1444"></A>
     "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
@@ -1072,7 +1115,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1424"></A>
+<DD><A NAME="1445"></A>
     When transients are managed by the client window itself (as it
     is the case on tiled workspaces), should the transients be
     placed at the top of the window instead of bottom?
@@ -1088,7 +1131,7 @@ usual method of identifying windows, and how to obtain this information.
       
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1425"></A>
+<DD><A NAME="1446"></A>
     Should frames be made transparent when this window is selected? 
 <BR>  
   
@@ -1105,9 +1148,9 @@ usual method of identifying windows, and how to obtain this information.
 
 <P>
 The identification information in the winprop specification is usually the
-<TT>class</TT><A NAME="1426"></A>,
-<TT>role</TT><A NAME="1427"></A>,
-<TT>instance</TT><A NAME="1428"></A> and
+<TT>class</TT><A NAME="1447"></A>,
+<TT>role</TT><A NAME="1448"></A>,
+<TT>instance</TT><A NAME="1449"></A> and
 <TT>name</TT>
 of the window. The <TT>name</TT> field is a Lua-style regular expression
 matched against the window's title and the rest are strings that must
@@ -1190,7 +1233,7 @@ can be used to list the identification information required to set winprops
 for a window and all the transient windows managed within it. 
 
 <P>
-<A NAME="1383"></A> 
+<A NAME="1402"></A> 
 Another way to get the identification information is to use <TT>xprop</TT>.
 Simply run To get class and instance, simply run <TT>xprop WM_CLASS</TT>
 and click on the particular window of interest. The class is the latter of
@@ -1199,7 +1242,7 @@ windows have this property - use the command <TT>xprop WM_ROLE</TT>.
 This method, however, will not work on transients. 
 
 <P>
-<A NAME="1387"></A>
+<A NAME="1406"></A>
 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 
@@ -1208,7 +1251,7 @@ Unfortunately <TT>xprop</TT> 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.<A NAME="tex2html11"
-  HREF="#foot1430"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN></SUP></A>
+  HREF="#foot1451"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN></SUP></A>
 <P>
 Finally, it should be mentioned that too many authors these days
 ''forget'' to set this vital identification to anything meaningful:
@@ -1308,26 +1351,26 @@ default name formed from the frame's class name and an instance number.
 <P>
 <BR><HR><H4>Footnotes</H4>
 <DL>
-<DT><A NAME="foot858">...keysymdef.h</A><A
+<DT><A NAME="foot857">...keysymdef.h</A><A
  HREF="node4.html#tex2html7"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></SUP></A></DT>
 <DD>This file can usually be found in the directory
 <SPAN  CLASS="textit">/usr/X11R6/include/X11/</SPAN>.
 
 </DD>
-<DT><A NAME="foot837">... such</A><A
+<DT><A NAME="foot836">... such</A><A
  HREF="node4.html#tex2html8"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></SUP></A></DT>
 <DD>Completely useless keys that should be
 gotten rid of in the author's opinion.
 
 </DD>
-<DT><A NAME="foot1173">... handling.</A><A
+<DT><A NAME="foot1174">... handling.</A><A
  HREF="node4.html#tex2html9"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></SUP></A></DT>
 <DD>See the <SPAN  CLASS="textit">wcirculate.lua</SPAN> script in the Ion 
         scripts repository <TT><A NAME="tex2html10"
   HREF="http://iki.fi/tuomov/repos/ion-scripts-3/">http://iki.fi/tuomov/repos/ion-scripts-3/</A></TT>.
 
 </DD>
-<DT><A NAME="foot1430">... window.</A><A
+<DT><A NAME="foot1451">... window.</A><A
  HREF="node4.html#tex2html11"><SUP><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN></SUP></A></DT>
 <DD>There's a patch to <TT>xprop</TT> to
 fix this, but nothing seems to be happening with respect to including it in 
index b6951d4e9655dddfe91a9ae265942b0ccd9a4128..da15f290ec3e9ac40f8a9b7ca79a322ee6448e8a 100644 (file)
@@ -125,7 +125,7 @@ for the default drawing engine.
 <P>
 
 <H2><A NAME="SECTION00510000000000000000"></A>
-<A NAME="sec:engines"></A><A NAME="1665"></A><A NAME="1666"></A>
+<A NAME="sec:engines"></A><A NAME="1710"></A><A NAME="1711"></A>
 <BR>
 <SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN> Drawing engines, style specifications and sub-styles
 </H2>
@@ -169,7 +169,6 @@ foo-bar-baz
 foo-*-baz
 foo-bar
 *
-foo-baz   -- Doesn't match, not selected!
 </PRE>
 
 <P>
@@ -178,7 +177,7 @@ specified, also in the form
 <PRE>
 attr1-attr2-...-attrn
 </PRE>
-These extra attributes are called <SPAN  CLASS="textit">substyles</SPAN><A NAME="1677"></A>
+These extra attributes are called <SPAN  CLASS="textit">substyles</SPAN><A NAME="1722"></A>
 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 
@@ -209,11 +208,15 @@ tag and drag states.)
 </TR>
 <TR><TD ALIGN="LEFT"><TT>frame</TT></TD>
 <TD ALIGN="LEFT">Style for frames. 
-       Substyles: <TT>active</TT>, <TT>inactive</TT>.</TD>
+       Substyle attributes: <TT>active</TT>/<TT>inactive</TT> 
+       (mutually exclusive) and
+       <TT>quasiactive</TT>/<TT>not_quasiactive</TT>. 
+       A frame is ``quasiactive'' when an active region
+       has a backlink to it, such as a detached window.</TD>
 </TR>
 <TR><TD ALIGN="LEFT"><TT>frame-tiled</TT></TD>
 <TD ALIGN="LEFT">A more specific style for tiled frames.
-        Substyles as for <TT>frame</TT>.</TD>
+        Substyle attributes as for <TT>frame</TT>.</TD>
 </TR>
 <TR><TD ALIGN="LEFT"><TT>frame-tiled-alt</TT></TD>
 <TD ALIGN="LEFT">An alternative style for tiled frames.
@@ -242,17 +245,17 @@ tag and drag states.)
 </TR>
 <TR><TD ALIGN="LEFT"><TT>tab</TT></TD>
 <TD ALIGN="LEFT">Style for frames' tabs and menu entries. 
-       Substyles: combinations of the form <TT>a-s</TT> where
-       <TT>a</TT> is one of <TT>active</TT>/<TT>inactive</TT> and
-       <TT>s</TT> is one of <TT>selected</TT>/<TT>unselected</TT></TD>
+       Substyle attributes:
+       <TT>active</TT>/<TT>inactive</TT> and
+       <TT>selected</TT>/<TT>unselected</TT></TD>
 </TR>
 <TR><TD ALIGN="LEFT"><TT>tab-frame</TT></TD>
 <TD ALIGN="LEFT">A more specific style for frames' tabs.
-       Substyles: combinations of the form <TT>a-s-t-d-u</TT> where
-       <TT>a</TT> and <TT>s</TT> are as above and
-       <TT>t</TT> is one of <TT>tagged</TT>/<TT>not_tagged</TT>,
-       <TT>d</TT> is one of <TT>dragged</TT>/<TT>not_dragged</TT> and
-       <TT>u</TT> is one of <TT>activity</TT>/<TT>no_activity</TT>.</TD>
+        Additional substyle attributes include:
+       <TT>tagged</TT>/<TT>not_tagged</TT>,
+       <TT>dragged</TT>/<TT>not_dragged</TT>,
+       <TT>activity</TT>/<TT>no_activity</TT> and
+       <TT>quasiactive</TT>/<TT>not_quasiactive</TT>.</TD>
 </TR>
 <TR><TD ALIGN="LEFT"><TT>tab-frame-tiled</TT>,</TD>
 <TD ALIGN="LEFT">&nbsp;</TD>
@@ -268,7 +271,9 @@ tag and drag states.)
         different modes.</TD>
 </TR>
 <TR><TD ALIGN="LEFT"><TT>tab-menuentry</TT></TD>
-<TD ALIGN="LEFT">A more specific style for entries in WMenus.</TD>
+<TD ALIGN="LEFT">A more specific style for entries in WMenus. 
+        Additional substyle attributes include <TT>submenu</TT> and
+        occasionally also <TT>activity</TT> is used.</TD>
 </TR>
 <TR><TD ALIGN="LEFT"><TT>tab-menuentry-bigmenu</TT></TD>
 <TD ALIGN="LEFT">An alternate style for entries in WMenus.</TD>
@@ -291,7 +296,7 @@ tag and drag states.)
 </TR>
 <TR><TD ALIGN="LEFT"><TT>input-edln</TT></TD>
 <TD ALIGN="LEFT">A more specific style for WEdlns. 
-       Substyles: <TT>selection</TT> for selected text and
+       Substyle attributes: <TT>selection</TT> for selected text and
        <TT>cursor</TT> for the cursor indicating current editing point.</TD>
 </TR>
 <TR><TD ALIGN="LEFT"><TT>input-message</TT></TD>
@@ -335,7 +340,7 @@ and should usually be symlinked to or a copy of of some
 </H3>
 
 <P>
-The first thing to do in a stylefile is to choose the drawing
+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.
 
@@ -407,7 +412,7 @@ border elements and styles referred to there are explained in Figure
 
 <P>
 
-<DIV ALIGN="CENTER"><A NAME="fig:borders"></A><A NAME="1777"></A>
+<DIV ALIGN="CENTER"><A NAME="fig:borders"></A><A NAME="1819"></A>
 <TABLE>
 <CAPTION ALIGN="BOTTOM"><STRONG>Figure 4.1:</STRONG>
 Sketch of different border styles and elements</CAPTION>
index b1bbe8bf3fe0cb8a6c2e9ff4742a04ed29990215..8c985d1cb3fa2bed420c7114658bcb529fc9f1be 100644 (file)
@@ -180,11 +180,11 @@ end
 <P>
 If you want to a single non-WClientWin region with an exact known 
 name, use <A HREF="node7.html#fn:ioncore.lookup_region"><TT>ioncore.lookup_region</TT></A>. If you want a list of all regions,
-use <A HREF="node7.html#fn:ioncore.region_list"><TT>ioncore.region_list</TT></A>. Both functions accept an optional argument
+use <A HREF="#fn:ioncore.region_list"><TT>ioncore.region_list</TT></A>. 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 <A HREF="node7.html#fn:ioncore.lookup_clientwin"><TT>ioncore.lookup_clientwin</TT></A>
-and <A HREF="node7.html#fn:ioncore.clientwin_list"><TT>ioncore.clientwin_list</TT></A>.
+and <A HREF="#fn:ioncore.clientwin_list"><TT>ioncore.clientwin_list</TT></A>.
 
 <P>
 To get the name of an object, use <A HREF="node7.html#fn:WRegion.name"><TT>WRegion.name</TT></A>. Please be
index 5a3e390e466263e9701eff33b458d3ec9d14b9f1..628a67028af7057943ef75d7a974892bc334e55d 100644 (file)
@@ -163,8 +163,8 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 </H2>
 
   <DL>
-<DD><A NAME="4188"></A>
-<A NAME="4189"></A>
+<DD><A NAME="4285"></A>
+<A NAME="4286"></A>
 <A NAME="fn:ioncore.TR"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -180,8 +180,8 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 <P>
 
   <DL>
-<DD><A NAME="4190"></A>
-<A NAME="4191"></A>
+<DD><A NAME="4287"></A>
+<A NAME="4288"></A>
 <A NAME="fn:ioncore.bdoc"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -198,8 +198,8 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 <P>
 
   <DL>
-<DD><A NAME="4192"></A>
-<A NAME="4193"></A>
+<DD><A NAME="4289"></A>
+<A NAME="4290"></A>
 <A NAME="fn:ioncore.chdir_for"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -215,8 +215,8 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 <P>
 
   <DL>
-<DD><A NAME="4194"></A>
-<A NAME="4195"></A>
+<DD><A NAME="4291"></A>
+<A NAME="4292"></A>
 <A NAME="fn:ioncore.compile_cmd"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -242,18 +242,18 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4196"></A>
-<A NAME="4197"></A>
+<DD><A NAME="4293"></A>
+<A NAME="4294"></A>
 <A NAME="fn:ioncore.create_ws"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>ioncore.create_ws(scr, tmpl, no_default)</TT>
+<DD><TT>ioncore.create_ws(scr, tmpl, layout)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
 <DD>Create new workspace on screen <TT>scr</TT>. The table <TT>tmpl</TT>
- may be used to override parts of <TT>default_ws_params</TT>,
and <TT>no_default</TT> may be set to <TT>true</TT> to complete ignore it.
+ may be used to override parts of the layout named with <TT>layout</TT>.
If no <TT>layout</TT> is given, "default" is used.
   
 </DD>
 </DL>
@@ -261,8 +261,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4198"></A>
-<A NAME="4199"></A>
+<DD><A NAME="4295"></A>
+<A NAME="4296"></A>
 <A NAME="fn:ioncore.defbindings"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -280,8 +280,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4200"></A>
-<A NAME="4201"></A>
+<DD><A NAME="4297"></A>
+<A NAME="4298"></A>
 <A NAME="fn:ioncore.defctxmenu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -298,8 +298,27 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4202"></A>
-<A NAME="4203"></A>
+<DD><A NAME="4299"></A>
+<A NAME="4300"></A>
+<A NAME="fn:ioncore.deflayout"></A>  
+</DD>
+<DT><STRONG>Synopsis:</STRONG></DT>
+<DD><TT>ioncore.deflayout(name, tab)</TT>
+
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD>Define a new workspace layout with name <TT>name</TT>, and
+ attach/creation parameters given in <TT>tab</TT>. The layout
+ "empty" may not be defined.
+  
+</DD>
+</DL>
+
+<P>
+
+  <DL>
+<DD><A NAME="4301"></A>
+<A NAME="4302"></A>
 <A NAME="fn:ioncore.defmenu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -317,8 +336,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4204"></A>
-<A NAME="4205"></A>
+<DD><A NAME="4303"></A>
+<A NAME="4304"></A>
 <A NAME="fn:ioncore.defwinprop"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -334,8 +353,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4206"></A>
-<A NAME="4207"></A>
+<DD><A NAME="4305"></A>
+<A NAME="4306"></A>
 <A NAME="fn:ioncore.exec_on"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -357,8 +376,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4208"></A>
-<A NAME="4209"></A>
+<DD><A NAME="4307"></A>
+<A NAME="4308"></A>
 <A NAME="fn:ioncore.read_savefile"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -374,8 +393,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4210"></A>
-<A NAME="4211"></A>
+<DD><A NAME="4309"></A>
+<A NAME="4310"></A>
 <A NAME="fn:ioncore.get_savefile"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -392,8 +411,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4212"></A>
-<A NAME="4213"></A>
+<DD><A NAME="4311"></A>
+<A NAME="4312"></A>
 <A NAME="fn:ioncore.lookup_script"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -410,8 +429,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4214"></A>
-<A NAME="4215"></A>
+<DD><A NAME="4313"></A>
+<A NAME="4314"></A>
 <A NAME="fn:ioncore.write_savefile"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -428,8 +447,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4216"></A>
-<A NAME="4217"></A>
+<DD><A NAME="4315"></A>
+<A NAME="4316"></A>
 <A NAME="fn:ioncore.find_manager"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -446,8 +465,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4218"></A>
-<A NAME="4219"></A>
+<DD><A NAME="4317"></A>
+<A NAME="4318"></A>
 <A NAME="fn:ioncore.get_dir_for"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -463,8 +482,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4220"></A>
-<A NAME="4221"></A>
+<DD><A NAME="4319"></A>
+<A NAME="4320"></A>
 <A NAME="fn:ioncore.getbindings"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -480,8 +499,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4222"></A>
-<A NAME="4223"></A>
+<DD><A NAME="4321"></A>
+<A NAME="4322"></A>
 <A NAME="fn:ioncore.getctxmenu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -497,8 +516,26 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4224"></A>
-<A NAME="4225"></A>
+<DD><A NAME="4323"></A>
+<A NAME="4324"></A>
+<A NAME="fn:ioncore.getlayout"></A>  
+</DD>
+<DT><STRONG>Synopsis:</STRONG></DT>
+<DD><TT>ioncore.getlayout(name, all)</TT>
+
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD>Get named layout (or all of the latter parameter is set,
+ but this is for internal use only).
+  
+</DD>
+</DL>
+
+<P>
+
+  <DL>
+<DD><A NAME="4325"></A>
+<A NAME="4326"></A>
 <A NAME="fn:ioncore.getmenu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -514,8 +551,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4226"></A>
-<A NAME="4227"></A>
+<DD><A NAME="4327"></A>
+<A NAME="4328"></A>
 <A NAME="fn:ioncore.getwinprop"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -531,8 +568,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4228"></A>
-<A NAME="4229"></A>
+<DD><A NAME="4329"></A>
+<A NAME="4330"></A>
 <A NAME="fn:ioncore.aboutmsg"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -548,8 +585,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4230"></A>
-<A NAME="4231"></A>
+<DD><A NAME="4331"></A>
+<A NAME="4332"></A>
 <A NAME="fn:ioncore.activity_first"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -565,16 +602,18 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4232"></A>
-<A NAME="4233"></A>
-<A NAME="fn:ioncore.activity_list"></A>  
+<DD><A NAME="4333"></A>
+<A NAME="4334"></A>
+<A NAME="fn:ioncore.activity_i"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table ioncore.activity_list()</TT>
+<DD><TT>bool ioncore.activity_i(function iterfn)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Return list of regions with activity/urgency bit set.
+<DD>Iterate over activity list until <TT>iterfn</TT> returns <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -582,8 +621,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4234"></A>
-<A NAME="4235"></A>
+<DD><A NAME="4335"></A>
+<A NAME="4336"></A>
 <A NAME="fn:ioncore.clear_tags"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -599,16 +638,18 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4236"></A>
-<A NAME="4237"></A>
-<A NAME="fn:ioncore.clientwin_list"></A>  
+<DD><A NAME="4337"></A>
+<A NAME="4338"></A>
+<A NAME="fn:ioncore.clientwin_i"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table ioncore.clientwin_list()</TT>
+<DD><TT>bool ioncore.clientwin_i(function fn)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Return a list of all client windows.
+<DD>Iterate over client windows until <TT>iterfn</TT> returns <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -616,8 +657,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4238"></A>
-<A NAME="4239"></A>
+<DD><A NAME="4339"></A>
+<A NAME="4340"></A>
 <A NAME="fn:ioncore.current"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -633,8 +674,8 @@ The string <TT>guard</TT>  maybe set to pose limits on <TT>_sub</TT>. Currently
 <P>
 
   <DL>
-<DD><A NAME="4240"></A>
-<A NAME="4241"></A>
+<DD><A NAME="4341"></A>
+<A NAME="4342"></A>
 <A NAME="fn:ioncore.defshortening"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -687,8 +728,32 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4242"></A>
-<A NAME="4243"></A>
+<DD><A NAME="4343"></A>
+<A NAME="4344"></A>
+<A NAME="fn:ioncore.detach"></A>  
+</DD>
+<DT><STRONG>Synopsis:</STRONG></DT>
+<DD><TT>bool ioncore.detach(WRegion reg, string how)</TT>
+
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD>Detach or reattach <TT>reg</TT>, depending on whether <TT>how</TT>
+ is 'set'/'unset'/'toggle'. (Detaching means making <TT>reg</TT> 
+ managed by its nearest ancestor WGroup, framed if <TT>reg</TT> is
+ not itself WFrame. Reattaching means making it managed where
+ it used to be managed, if a return-placeholder exists.)
+ If <TT>reg</TT> is the 'bottom' of some group, the whole group is
+ detached. If <TT>reg</TT> is a WWindow, it is put into a 
+ frame.
+  
+</DD>
+</DL>
+
+<P>
+
+  <DL>
+<DD><A NAME="4345"></A>
+<A NAME="4346"></A>
 <A NAME="fn:ioncore.exec"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -707,8 +772,8 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4244"></A>
-<A NAME="4245"></A>
+<DD><A NAME="4347"></A>
+<A NAME="4348"></A>
 <A NAME="fn:ioncore.find_screen_id"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -716,10 +781,26 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Find the screen with numerical id <TT>id</TT>. If Xinerama is
- not present, <TT>id</TT> corresponds to X screen numbers. Otherwise
- the ids are some arbitrary ordering of Xinerama rootwins.
- If <TT>id</TT> is <SPAN CLASS="MATH"></SPAN>, the screen with the highest id is returned.
+<DD>Find the screen with numerical id <TT>id</TT>.
+  
+</DD>
+</DL>
+
+<P>
+
+  <DL>
+<DD><A NAME="4349"></A>
+<A NAME="4350"></A>
+<A NAME="fn:ioncore.focushistory_i"></A>  
+</DD>
+<DT><STRONG>Synopsis:</STRONG></DT>
+<DD><TT>bool ioncore.focushistory_i(function iterfn)</TT>
+
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD>Iterate over focus history until <TT>iterfn</TT> returns <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -727,8 +808,8 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4246"></A>
-<A NAME="4247"></A>
+<DD><A NAME="4351"></A>
+<A NAME="4352"></A>
 <A NAME="fn:ioncore.get"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -744,8 +825,8 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4248"></A>
-<A NAME="4249"></A>
+<DD><A NAME="4353"></A>
+<A NAME="4354"></A>
 <A NAME="fn:ioncore.get_paths"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -761,8 +842,8 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4250"></A>
-<A NAME="4251"></A>
+<DD><A NAME="4355"></A>
+<A NAME="4356"></A>
 <A NAME="fn:ioncore.goto_activity"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -778,8 +859,8 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4252"></A>
-<A NAME="4253"></A>
+<DD><A NAME="4357"></A>
+<A NAME="4358"></A>
 <A NAME="fn:ioncore.goto_first"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -799,8 +880,8 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4254"></A>
-<A NAME="4255"></A>
+<DD><A NAME="4359"></A>
+<A NAME="4360"></A>
 <A NAME="fn:ioncore.goto_next"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -820,8 +901,8 @@ Similarly to sed's 's' command, <TT>rule</TT> may contain characters that are
 <P>
 
   <DL>
-<DD><A NAME="4256"></A>
-<A NAME="4257"></A>
+<DD><A NAME="4361"></A>
+<A NAME="4362"></A>
 <A NAME="fn:ioncore.goto_next_screen"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -841,8 +922,8 @@ Note that this function is asynchronous; the screen will not
 <P>
 
   <DL>
-<DD><A NAME="4258"></A>
-<A NAME="4259"></A>
+<DD><A NAME="4363"></A>
+<A NAME="4364"></A>
 <A NAME="fn:ioncore.goto_nth_screen"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -862,8 +943,8 @@ Note that this function is asynchronous; the screen will not
 <P>
 
   <DL>
-<DD><A NAME="4260"></A>
-<A NAME="4261"></A>
+<DD><A NAME="4365"></A>
+<A NAME="4366"></A>
 <A NAME="fn:ioncore.goto_prev_screen"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -883,8 +964,8 @@ Note that this function is asynchronous; the screen will not
 <P>
 
   <DL>
-<DD><A NAME="4262"></A>
-<A NAME="4263"></A>
+<DD><A NAME="4367"></A>
+<A NAME="4368"></A>
 <A NAME="fn:ioncore.goto_previous"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -904,8 +985,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4264"></A>
-<A NAME="4265"></A>
+<DD><A NAME="4369"></A>
+<A NAME="4370"></A>
 <A NAME="fn:ioncore.is_i18n"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -921,8 +1002,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4266"></A>
-<A NAME="4267"></A>
+<DD><A NAME="4371"></A>
+<A NAME="4372"></A>
 <A NAME="fn:ioncore.load_module"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -938,8 +1019,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4268"></A>
-<A NAME="4269"></A>
+<DD><A NAME="4373"></A>
+<A NAME="4374"></A>
 <A NAME="fn:ioncore.lookup_clientwin"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -955,8 +1036,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4270"></A>
-<A NAME="4271"></A>
+<DD><A NAME="4375"></A>
+<A NAME="4376"></A>
 <A NAME="fn:ioncore.lookup_region"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -973,8 +1054,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4272"></A>
-<A NAME="4273"></A>
+<DD><A NAME="4377"></A>
+<A NAME="4378"></A>
 <A NAME="fn:ioncore.navi_first"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -992,8 +1073,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4274"></A>
-<A NAME="4275"></A>
+<DD><A NAME="4379"></A>
+<A NAME="4380"></A>
 <A NAME="fn:ioncore.navi_next"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1015,8 +1096,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4276"></A>
-<A NAME="4277"></A>
+<DD><A NAME="4381"></A>
+<A NAME="4382"></A>
 <A NAME="fn:ioncore.popen_bgread"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1034,8 +1115,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4278"></A>
-<A NAME="4279"></A>
+<DD><A NAME="4383"></A>
+<A NAME="4384"></A>
 <A NAME="fn:ioncore.progname"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1051,16 +1132,19 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4280"></A>
-<A NAME="4281"></A>
-<A NAME="fn:ioncore.region_list"></A>  
+<DD><A NAME="4385"></A>
+<A NAME="4386"></A>
+<A NAME="fn:ioncore.region_i"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table ioncore.region_list(string typenam)</TT>
+<DD><TT>bool ioncore.region_i(function fn, string typenam)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Find all non-client window regions inheriting <TT>typenam</TT>.
+<DD>Iterate over all non-client window regions with (inherited) class
+ <TT>typenam</TT> until <TT>iterfn</TT> returns <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -1068,8 +1152,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4282"></A>
-<A NAME="4283"></A>
+<DD><A NAME="4387"></A>
+<A NAME="4388"></A>
 <A NAME="fn:ioncore.request_selection"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1086,8 +1170,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4284"></A>
-<A NAME="4285"></A>
+<DD><A NAME="4389"></A>
+<A NAME="4390"></A>
 <A NAME="fn:ioncore.resign"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1104,8 +1188,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4286"></A>
-<A NAME="4287"></A>
+<DD><A NAME="4391"></A>
+<A NAME="4392"></A>
 <A NAME="fn:ioncore.restart"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1121,8 +1205,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4288"></A>
-<A NAME="4289"></A>
+<DD><A NAME="4393"></A>
+<A NAME="4394"></A>
 <A NAME="fn:ioncore.restart_other"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1138,8 +1222,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4290"></A>
-<A NAME="4291"></A>
+<DD><A NAME="4395"></A>
+<A NAME="4396"></A>
 <A NAME="fn:ioncore.set"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1208,10 +1292,6 @@ Note that this function is asynchronous; the region will not
                           One of ''udlr'' (up-down, then left-right), 
                           ''lrud'' (left-right, then up-down) or ''random''.</TD>
 </TR>
-<TR><TD ALIGN="LEFT"><TT>default_ws_params</TT></TD>
-<TD ALIGN="LEFT">(table) Default workspace layout; the 
-                          attach/creation parameters for a WGroup.</TD>
-</TR>
 </TABLE>
 
 <P>
@@ -1229,25 +1309,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4292"></A>
-<A NAME="4293"></A>
-<A NAME="fn:ioncore.set_get_winprop_fn"></A>  
-</DD>
-<DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>void ioncore.set_get_winprop_fn(function fn)</TT>
-
-</DD>
-<DT><STRONG>Description:</STRONG></DT>
-<DD>Set function used to look up winprops.
-  
-</DD>
-</DL>
-
-<P>
-
-  <DL>
-<DD><A NAME="4294"></A>
-<A NAME="4295"></A>
+<DD><A NAME="4397"></A>
+<A NAME="4398"></A>
 <A NAME="fn:ioncore.set_paths"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1263,8 +1326,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4296"></A>
-<A NAME="4297"></A>
+<DD><A NAME="4399"></A>
+<A NAME="4400"></A>
 <A NAME="fn:ioncore.set_selection"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1280,8 +1343,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4298"></A>
-<A NAME="4299"></A>
+<DD><A NAME="4401"></A>
+<A NAME="4402"></A>
 <A NAME="fn:ioncore.shutdown"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1297,8 +1360,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4300"></A>
-<A NAME="4301"></A>
+<DD><A NAME="4403"></A>
+<A NAME="4404"></A>
 <A NAME="fn:ioncore.snapshot"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1314,16 +1377,16 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4302"></A>
-<A NAME="4303"></A>
-<A NAME="fn:ioncore.tagged_list"></A>  
+<DD><A NAME="4405"></A>
+<A NAME="4406"></A>
+<A NAME="fn:ioncore.tagged_first"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table ioncore.tagged_list()</TT>
+<DD><TT>WRegion ioncore.tagged_first()</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Returns a list of tagged regions.
+<DD>Returns first tagged object.
   
 </DD>
 </DL>
@@ -1331,16 +1394,18 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4304"></A>
-<A NAME="4305"></A>
-<A NAME="fn:ioncore.tags_first"></A>  
+<DD><A NAME="4407"></A>
+<A NAME="4408"></A>
+<A NAME="fn:ioncore.tagged_i"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>WRegion ioncore.tags_first()</TT>
+<DD><TT>bool ioncore.tagged_i(function iterfn)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Returns first tagged object.
+<DD>Iterate over tagged regions until <TT>iterfn</TT> returns <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -1348,8 +1413,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4306"></A>
-<A NAME="4307"></A>
+<DD><A NAME="4409"></A>
+<A NAME="4410"></A>
 <A NAME="fn:ioncore.version"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1365,8 +1430,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4308"></A>
-<A NAME="4309"></A>
+<DD><A NAME="4411"></A>
+<A NAME="4412"></A>
 <A NAME="fn:ioncore.warn"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1383,8 +1448,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4310"></A>
-<A NAME="4311"></A>
+<DD><A NAME="4413"></A>
+<A NAME="4414"></A>
 <A NAME="fn:ioncore.warn_traced"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1400,8 +1465,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4312"></A>
-<A NAME="4313"></A>
+<DD><A NAME="4415"></A>
+<A NAME="4416"></A>
 <A NAME="fn:ioncore.x_change_property"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1420,8 +1485,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4314"></A>
-<A NAME="4315"></A>
+<DD><A NAME="4417"></A>
+<A NAME="4418"></A>
 <A NAME="fn:ioncore.x_delete_property"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1437,8 +1502,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4316"></A>
-<A NAME="4317"></A>
+<DD><A NAME="4419"></A>
+<A NAME="4420"></A>
 <A NAME="fn:ioncore.x_get_atom_name"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1455,8 +1520,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4318"></A>
-<A NAME="4319"></A>
+<DD><A NAME="4421"></A>
+<A NAME="4422"></A>
 <A NAME="fn:ioncore.x_get_text_property"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1475,8 +1540,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4320"></A>
-<A NAME="4321"></A>
+<DD><A NAME="4423"></A>
+<A NAME="4424"></A>
 <A NAME="fn:ioncore.x_get_window_property"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1497,8 +1562,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4322"></A>
-<A NAME="4323"></A>
+<DD><A NAME="4425"></A>
+<A NAME="4426"></A>
 <A NAME="fn:ioncore.x_intern_atom"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1514,8 +1579,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4324"></A>
-<A NAME="4325"></A>
+<DD><A NAME="4427"></A>
+<A NAME="4428"></A>
 <A NAME="fn:ioncore.x_set_text_property"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1533,8 +1598,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4326"></A>
-<A NAME="4327"></A>
+<DD><A NAME="4429"></A>
+<A NAME="4430"></A>
 <A NAME="fn:ioncore.kpress"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1552,8 +1617,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4328"></A>
-<A NAME="4329"></A>
+<DD><A NAME="4431"></A>
+<A NAME="4432"></A>
 <A NAME="fn:ioncore.kpress_wait"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1572,8 +1637,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4330"></A>
-<A NAME="4331"></A>
+<DD><A NAME="4433"></A>
+<A NAME="4434"></A>
 <A NAME="fn:ioncore.match_winprop_name"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1589,8 +1654,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4332"></A>
-<A NAME="4333"></A>
+<DD><A NAME="4435"></A>
+<A NAME="4436"></A>
 <A NAME="fn:ioncore.mclick"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1609,8 +1674,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4334"></A>
-<A NAME="4335"></A>
+<DD><A NAME="4437"></A>
+<A NAME="4438"></A>
 <A NAME="fn:ioncore.mdblclick"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1627,8 +1692,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4336"></A>
-<A NAME="4337"></A>
+<DD><A NAME="4439"></A>
+<A NAME="4440"></A>
 <A NAME="fn:ioncore.mdrag"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1648,8 +1713,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4338"></A>
-<A NAME="4339"></A>
+<DD><A NAME="4441"></A>
+<A NAME="4442"></A>
 <A NAME="fn:ioncore.menuentry"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1668,8 +1733,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4340"></A>
-<A NAME="4341"></A>
+<DD><A NAME="4443"></A>
+<A NAME="4444"></A>
 <A NAME="fn:ioncore.mpress"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1686,8 +1751,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4342"></A>
-<A NAME="4343"></A>
+<DD><A NAME="4445"></A>
+<A NAME="4446"></A>
 <A NAME="fn:ioncore.refresh_stylelist"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1703,8 +1768,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4344"></A>
-<A NAME="4345"></A>
+<DD><A NAME="4447"></A>
+<A NAME="4448"></A>
 <A NAME="fn:ioncore.submap"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1723,8 +1788,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4346"></A>
-<A NAME="4347"></A>
+<DD><A NAME="4449"></A>
+<A NAME="4450"></A>
 <A NAME="fn:ioncore.submenu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1752,8 +1817,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4349"></A>
-<A NAME="4350"></A>
+<DD><A NAME="4452"></A>
+<A NAME="4453"></A>
 <A NAME="fn:WClientWin.get_ident"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1772,25 +1837,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4351"></A>
-<A NAME="4352"></A>
-<A NAME="fn:WClientWin.is_fullscreen"></A>  
-</DD>
-<DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>bool WClientWin.is_fullscreen(WClientWin cwin)</TT>
-
-</DD>
-<DT><STRONG>Description:</STRONG></DT>
-<DD>Is <TT>cwin</TT> in full screen mode?
-  
-</DD>
-</DL>
-
-<P>
-
-  <DL>
-<DD><A NAME="4353"></A>
-<A NAME="4354"></A>
+<DD><A NAME="4454"></A>
+<A NAME="4455"></A>
 <A NAME="fn:WClientWin.kill"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1807,8 +1855,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4355"></A>
-<A NAME="4356"></A>
+<DD><A NAME="4456"></A>
+<A NAME="4457"></A>
 <A NAME="fn:WClientWin.nudge"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1825,8 +1873,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4357"></A>
-<A NAME="4358"></A>
+<DD><A NAME="4458"></A>
+<A NAME="4459"></A>
 <A NAME="fn:WClientWin.quote_next"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1842,27 +1890,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4359"></A>
-<A NAME="4360"></A>
-<A NAME="fn:WClientWin.set_fullscreen"></A>  
-</DD>
-<DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>bool WClientWin.set_fullscreen(WClientWin cwin, string how)</TT>
-
-</DD>
-<DT><STRONG>Description:</STRONG></DT>
-<DD>Set client window <TT>cwin</TT> full screen state according to the 
- parameter <TT>how</TT> (set/unset/toggle). Resulting state is returned,
- which may not be what was requested.
-  
-</DD>
-</DL>
-
-<P>
-
-  <DL>
-<DD><A NAME="4361"></A>
-<A NAME="4362"></A>
+<DD><A NAME="4460"></A>
+<A NAME="4461"></A>
 <A NAME="fn:WClientWin.xid"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1884,8 +1913,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4364"></A>
-<A NAME="4365"></A>
+<DD><A NAME="4463"></A>
+<A NAME="4464"></A>
 <A NAME="fn:WFrame.is_shaded"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1901,8 +1930,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4366"></A>
-<A NAME="4367"></A>
+<DD><A NAME="4465"></A>
+<A NAME="4466"></A>
 <A NAME="fn:WFrame.maximize_horiz"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1918,8 +1947,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4368"></A>
-<A NAME="4369"></A>
+<DD><A NAME="4467"></A>
+<A NAME="4468"></A>
 <A NAME="fn:WFrame.maximize_vert"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1935,8 +1964,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4370"></A>
-<A NAME="4371"></A>
+<DD><A NAME="4469"></A>
+<A NAME="4470"></A>
 <A NAME="fn:WFrame.mode"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1952,8 +1981,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4372"></A>
-<A NAME="4373"></A>
+<DD><A NAME="4471"></A>
+<A NAME="4472"></A>
 <A NAME="fn:WFrame.p_switch_tab"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1970,8 +1999,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4374"></A>
-<A NAME="4375"></A>
+<DD><A NAME="4473"></A>
+<A NAME="4474"></A>
 <A NAME="fn:WFrame.p_tabdrag"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -1989,8 +2018,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4376"></A>
-<A NAME="4377"></A>
+<DD><A NAME="4475"></A>
+<A NAME="4476"></A>
 <A NAME="fn:WFrame.set_mode"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2006,8 +2035,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4378"></A>
-<A NAME="4379"></A>
+<DD><A NAME="4477"></A>
+<A NAME="4478"></A>
 <A NAME="fn:WFrame.set_numbers"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2025,8 +2054,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4380"></A>
-<A NAME="4381"></A>
+<DD><A NAME="4479"></A>
+<A NAME="4480"></A>
 <A NAME="fn:WFrame.set_shaded"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2050,8 +2079,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4383"></A>
-<A NAME="4384"></A>
+<DD><A NAME="4482"></A>
+<A NAME="4483"></A>
 <A NAME="fn:WGroup.attach"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2069,8 +2098,8 @@ When a keyboard resize function is called, and at most <TT>kbresize_t_max</TT>
 <P>
 
   <DL>
-<DD><A NAME="4385"></A>
-<A NAME="4386"></A>
+<DD><A NAME="4484"></A>
+<A NAME="4485"></A>
 <A NAME="fn:WGroup.attach_new"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2116,8 +2145,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4387"></A>
-<A NAME="4388"></A>
+<DD><A NAME="4486"></A>
+<A NAME="4487"></A>
 <A NAME="fn:WGroup.bottom"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2133,16 +2162,55 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4389"></A>
-<A NAME="4390"></A>
-<A NAME="fn:WGroup.managed_list"></A>  
+<DD><A NAME="4488"></A>
+<A NAME="4489"></A>
+<A NAME="fn:WGroup.is_fullscreen"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table WGroup.managed_list(WGroup ws)</TT>
+<DD><TT>bool WGroup.is_fullscreen(WGroup grp)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Returns a list of regions managed by the workspace (frames, mostly).
+<DD>Is <TT>reg</TT> in full screen mode?
+  
+</DD>
+</DL>
+
+<P>
+
+  <DL>
+<DD><A NAME="4490"></A>
+<A NAME="4491"></A>
+<A NAME="fn:WGroup.managed_i"></A>  
+</DD>
+<DT><STRONG>Synopsis:</STRONG></DT>
+<DD><TT>bool WGroup.managed_i(WGroup ws, function iterfn)</TT>
+
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD>Iterate over managed regions of <TT>ws</TT> until <TT>iterfn</TT> returns
+ <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
+  
+</DD>
+</DL>
+
+<P>
+
+  <DL>
+<DD><A NAME="4492"></A>
+<A NAME="4493"></A>
+<A NAME="fn:WGroup.set_fullscreen"></A>  
+</DD>
+<DT><STRONG>Synopsis:</STRONG></DT>
+<DD><TT>bool WGroup.set_fullscreen(WGroup grp, string how)</TT>
+
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD>Set client window <TT>reg</TT> full screen state according to the 
+ parameter <TT>how</TT> (set/unset/toggle). Resulting state is returned,
+ which may not be what was requested.
   
 </DD>
 </DL>
@@ -2162,8 +2230,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4393"></A>
-<A NAME="4394"></A>
+<DD><A NAME="4496"></A>
+<A NAME="4497"></A>
 <A NAME="fn:WGroupWS.attach_framed"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2201,8 +2269,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4396"></A>
-<A NAME="4397"></A>
+<DD><A NAME="4499"></A>
+<A NAME="4500"></A>
 <A NAME="fn:WInfoWin.set_text"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2224,8 +2292,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4399"></A>
-<A NAME="4400"></A>
+<DD><A NAME="4502"></A>
+<A NAME="4503"></A>
 <A NAME="fn:WMPlex.attach"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2243,8 +2311,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4401"></A>
-<A NAME="4402"></A>
+<DD><A NAME="4504"></A>
+<A NAME="4505"></A>
 <A NAME="fn:WMPlex.attach_new"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2307,8 +2375,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4403"></A>
-<A NAME="4404"></A>
+<DD><A NAME="4506"></A>
+<A NAME="4507"></A>
 <A NAME="fn:WMPlex.attach_tagged"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2324,8 +2392,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4405"></A>
-<A NAME="4406"></A>
+<DD><A NAME="4508"></A>
+<A NAME="4509"></A>
 <A NAME="fn:WMPlex.dec_index"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2341,8 +2409,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4407"></A>
-<A NAME="4408"></A>
+<DD><A NAME="4510"></A>
+<A NAME="4511"></A>
 <A NAME="fn:WMPlex.get_index"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2360,8 +2428,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4409"></A>
-<A NAME="4410"></A>
+<DD><A NAME="4512"></A>
+<A NAME="4513"></A>
 <A NAME="fn:WMPlex.get_stdisp"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2378,8 +2446,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4411"></A>
-<A NAME="4412"></A>
+<DD><A NAME="4514"></A>
+<A NAME="4515"></A>
 <A NAME="fn:WMPlex.inc_index"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2395,8 +2463,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4413"></A>
-<A NAME="4414"></A>
+<DD><A NAME="4516"></A>
+<A NAME="4517"></A>
 <A NAME="fn:WMPlex.is_hidden"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2412,16 +2480,19 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4415"></A>
-<A NAME="4416"></A>
-<A NAME="fn:WMPlex.managed_list"></A>  
+<DD><A NAME="4518"></A>
+<A NAME="4519"></A>
+<A NAME="fn:WMPlex.managed_i"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table WMPlex.managed_list(WMPlex mplex)</TT>
+<DD><TT>bool WMPlex.managed_i(WMPlex mplex, function iterfn)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Returns a list of all regions managed by <TT>mplex</TT>.
+<DD>Iterate over managed regions of <TT>mplex</TT> until <TT>iterfn</TT> returns
+ <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -2429,8 +2500,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4417"></A>
-<A NAME="4418"></A>
+<DD><A NAME="4520"></A>
+<A NAME="4521"></A>
 <A NAME="fn:WMPlex.mx_count"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2446,8 +2517,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4419"></A>
-<A NAME="4420"></A>
+<DD><A NAME="4522"></A>
+<A NAME="4523"></A>
 <A NAME="fn:WMPlex.mx_current"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2464,17 +2535,19 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4421"></A>
-<A NAME="4422"></A>
-<A NAME="fn:WMPlex.mx_list"></A>  
+<DD><A NAME="4524"></A>
+<A NAME="4525"></A>
+<A NAME="fn:WMPlex.mx_i"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table WMPlex.mx_list(WMPlex mplex)</TT>
+<DD><TT>bool WMPlex.mx_i(WMPlex mplex, function iterfn)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Returns a list of regions on the numbered/mutually exclusive list of 
- <TT>mplex</TT>.
+<DD>Iterate over numbered/mutually exclusive region list of <TT>mplex</TT> 
+ until <TT>iterfn</TT> returns <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -2482,8 +2555,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4423"></A>
-<A NAME="4424"></A>
+<DD><A NAME="4526"></A>
+<A NAME="4527"></A>
 <A NAME="fn:WMPlex.mx_nth"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2500,8 +2573,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4425"></A>
-<A NAME="4426"></A>
+<DD><A NAME="4528"></A>
+<A NAME="4529"></A>
 <A NAME="fn:WMPlex.set_hidden"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2519,8 +2592,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4427"></A>
-<A NAME="4428"></A>
+<DD><A NAME="4530"></A>
+<A NAME="4531"></A>
 <A NAME="fn:WMPlex.set_index"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2532,10 +2605,10 @@ In addition parameters to the region to be created are passed in this
  the mutually exclusive list. Special values for <TT>index</TT> are:
  <TABLE CELLPADDING=3 WIDTH="100%">
 <TR><TD ALIGN="LEFT"><SPAN CLASS="MATH"></SPAN></TD>
-<TD ALIGN="LEFT">After <A HREF="#fn:WMPlex.mx_current"><TT>WMPlex.mx_current</TT></A>.</TD>
+<TD ALIGN="LEFT">Last.</TD>
 </TR>
 <TR><TD ALIGN="LEFT"><SPAN CLASS="MATH"></SPAN></TD>
-<TD ALIGN="LEFT">Last.</TD>
+<TD ALIGN="LEFT">After <A HREF="#fn:WMPlex.mx_current"><TT>WMPlex.mx_current</TT></A>.</TD>
 </TR>
 </TABLE>
   
@@ -2545,8 +2618,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4429"></A>
-<A NAME="4430"></A>
+<DD><A NAME="4532"></A>
+<A NAME="4533"></A>
 <A NAME="fn:WMPlex.set_stdisp"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2585,8 +2658,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4431"></A>
-<A NAME="4432"></A>
+<DD><A NAME="4534"></A>
+<A NAME="4535"></A>
 <A NAME="fn:WMPlex.switch_next"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2603,8 +2676,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4433"></A>
-<A NAME="4434"></A>
+<DD><A NAME="4536"></A>
+<A NAME="4537"></A>
 <A NAME="fn:WMPlex.switch_nth"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2620,8 +2693,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4435"></A>
-<A NAME="4436"></A>
+<DD><A NAME="4538"></A>
+<A NAME="4539"></A>
 <A NAME="fn:WMPlex.switch_prev"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2644,8 +2717,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4438"></A>
-<A NAME="4439"></A>
+<DD><A NAME="4541"></A>
+<A NAME="4542"></A>
 <A NAME="fn:WMoveresMode.cancel"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2662,8 +2735,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4440"></A>
-<A NAME="4441"></A>
+<DD><A NAME="4543"></A>
+<A NAME="4544"></A>
 <A NAME="fn:WMoveresMode.finish"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2680,8 +2753,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4442"></A>
-<A NAME="4443"></A>
+<DD><A NAME="4545"></A>
+<A NAME="4546"></A>
 <A NAME="fn:WMoveresMode.move"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2713,8 +2786,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4444"></A>
-<A NAME="4445"></A>
+<DD><A NAME="4547"></A>
+<A NAME="4548"></A>
 <A NAME="fn:WMoveresMode.resize"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2739,8 +2812,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4447"></A>
-<A NAME="4448"></A>
+<DD><A NAME="4550"></A>
+<A NAME="4551"></A>
 <A NAME="fn:WRegion.begin_kbresize"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2761,8 +2834,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4449"></A>
-<A NAME="4450"></A>
+<DD><A NAME="4552"></A>
+<A NAME="4553"></A>
 <A NAME="fn:WRegion.current"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2779,8 +2852,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4451"></A>
-<A NAME="4452"></A>
+<DD><A NAME="4554"></A>
+<A NAME="4555"></A>
 <A NAME="fn:WRegion.geom"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2797,8 +2870,8 @@ In addition parameters to the region to be created are passed in this
 <P>
 
   <DL>
-<DD><A NAME="4453"></A>
-<A NAME="4454"></A>
+<DD><A NAME="4556"></A>
+<A NAME="4557"></A>
 <A NAME="fn:WRegion.goto"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2819,8 +2892,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4455"></A>
-<A NAME="4456"></A>
+<DD><A NAME="4558"></A>
+<A NAME="4559"></A>
 <A NAME="fn:WRegion.is_active"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2836,8 +2909,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4457"></A>
-<A NAME="4458"></A>
+<DD><A NAME="4560"></A>
+<A NAME="4561"></A>
 <A NAME="fn:WRegion.is_activity"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2853,8 +2926,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4459"></A>
-<A NAME="4460"></A>
+<DD><A NAME="4562"></A>
+<A NAME="4563"></A>
 <A NAME="fn:WRegion.is_mapped"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2870,8 +2943,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4461"></A>
-<A NAME="4462"></A>
+<DD><A NAME="4564"></A>
+<A NAME="4565"></A>
 <A NAME="fn:WRegion.is_tagged"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2887,8 +2960,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4463"></A>
-<A NAME="4464"></A>
+<DD><A NAME="4566"></A>
+<A NAME="4567"></A>
 <A NAME="fn:WRegion.manager"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2904,8 +2977,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4465"></A>
-<A NAME="4466"></A>
+<DD><A NAME="4568"></A>
+<A NAME="4569"></A>
 <A NAME="fn:WRegion.name"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2921,8 +2994,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4467"></A>
-<A NAME="4468"></A>
+<DD><A NAME="4570"></A>
+<A NAME="4571"></A>
 <A NAME="fn:WRegion.parent"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2938,8 +3011,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4469"></A>
-<A NAME="4470"></A>
+<DD><A NAME="4572"></A>
+<A NAME="4573"></A>
 <A NAME="fn:WRegion.rootwin_of"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2955,8 +3028,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4471"></A>
-<A NAME="4472"></A>
+<DD><A NAME="4574"></A>
+<A NAME="4575"></A>
 <A NAME="fn:WRegion.rqclose"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -2981,8 +3054,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4473"></A>
-<A NAME="4474"></A>
+<DD><A NAME="4576"></A>
+<A NAME="4577"></A>
 <A NAME="fn:WRegion.rqclose_propagate"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3002,8 +3075,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4475"></A>
-<A NAME="4476"></A>
+<DD><A NAME="4578"></A>
+<A NAME="4579"></A>
 <A NAME="fn:WRegion.rqgeom"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3022,8 +3095,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4477"></A>
-<A NAME="4478"></A>
+<DD><A NAME="4580"></A>
+<A NAME="4581"></A>
 <A NAME="fn:WRegion.rqorder"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3040,8 +3113,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4479"></A>
-<A NAME="4480"></A>
+<DD><A NAME="4582"></A>
+<A NAME="4583"></A>
 <A NAME="fn:WRegion.screen_of"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3057,8 +3130,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4481"></A>
-<A NAME="4482"></A>
+<DD><A NAME="4584"></A>
+<A NAME="4585"></A>
 <A NAME="fn:WRegion.set_activity"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3075,8 +3148,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4483"></A>
-<A NAME="4484"></A>
+<DD><A NAME="4586"></A>
+<A NAME="4587"></A>
 <A NAME="fn:WRegion.set_name"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3095,8 +3168,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4485"></A>
-<A NAME="4486"></A>
+<DD><A NAME="4588"></A>
+<A NAME="4589"></A>
 <A NAME="fn:WRegion.set_name_exact"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3114,8 +3187,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4487"></A>
-<A NAME="4488"></A>
+<DD><A NAME="4590"></A>
+<A NAME="4591"></A>
 <A NAME="fn:WRegion.set_tagged"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3132,8 +3205,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4489"></A>
-<A NAME="4490"></A>
+<DD><A NAME="4592"></A>
+<A NAME="4593"></A>
 <A NAME="fn:WRegion.size_hints"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3157,8 +3230,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4492"></A>
-<A NAME="4493"></A>
+<DD><A NAME="4595"></A>
+<A NAME="4596"></A>
 <A NAME="fn:WRootWin.current_scr"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3180,8 +3253,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4495"></A>
-<A NAME="4496"></A>
+<DD><A NAME="4598"></A>
+<A NAME="4599"></A>
 <A NAME="fn:WScreen.id"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3197,8 +3270,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4497"></A>
-<A NAME="4498"></A>
+<DD><A NAME="4600"></A>
+<A NAME="4601"></A>
 <A NAME="fn:WScreen.set_managed_offset"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3223,8 +3296,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4500"></A>
-<A NAME="4501"></A>
+<DD><A NAME="4603"></A>
+<A NAME="4604"></A>
 <A NAME="fn:WWindow.p_move"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3242,8 +3315,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4502"></A>
-<A NAME="4503"></A>
+<DD><A NAME="4605"></A>
+<A NAME="4606"></A>
 <A NAME="fn:WWindow.p_resize"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3261,8 +3334,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4504"></A>
-<A NAME="4505"></A>
+<DD><A NAME="4607"></A>
+<A NAME="4608"></A>
 <A NAME="fn:WWindow.xid"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3284,7 +3357,7 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4507"></A>
+<DD><A NAME="4610"></A>
 <A NAME="fn:export"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3306,8 +3379,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4509"></A>
-<A NAME="4510"></A>
+<DD><A NAME="4612"></A>
+<A NAME="4613"></A>
 <A NAME="fn:gr.read_config"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3323,8 +3396,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4511"></A>
-<A NAME="4512"></A>
+<DD><A NAME="4614"></A>
+<A NAME="4615"></A>
 <A NAME="fn:gr.refresh"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3340,8 +3413,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4513"></A>
-<A NAME="4514"></A>
+<DD><A NAME="4616"></A>
+<A NAME="4617"></A>
 <A NAME="fn:gr.select_engine"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3367,8 +3440,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4516"></A>
-<A NAME="4517"></A>
+<DD><A NAME="4619"></A>
+<A NAME="4620"></A>
 <A NAME="fn:string.shell_safe"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3390,8 +3463,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4519"></A>
-<A NAME="4520"></A>
+<DD><A NAME="4622"></A>
+<A NAME="4623"></A>
 <A NAME="fn:table.append"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3407,8 +3480,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4521"></A>
-<A NAME="4522"></A>
+<DD><A NAME="4624"></A>
+<A NAME="4625"></A>
 <A NAME="fn:table.copy"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3425,8 +3498,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4523"></A>
-<A NAME="4524"></A>
+<DD><A NAME="4626"></A>
+<A NAME="4627"></A>
 <A NAME="fn:table.icat"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3442,8 +3515,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4525"></A>
-<A NAME="4526"></A>
+<DD><A NAME="4628"></A>
+<A NAME="4629"></A>
 <A NAME="fn:table.join"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3460,8 +3533,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="4527"></A>
-<A NAME="4528"></A>
+<DD><A NAME="4630"></A>
+<A NAME="4631"></A>
 <A NAME="fn:table.map"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3483,26 +3556,8 @@ Note that this function is asynchronous; the region will not
 </H2>
 
   <DL>
-<DD><A NAME="6781"></A>
-<A NAME="6782"></A>
-<A NAME="fn:mod_tiling.detach"></A>  
-</DD>
-<DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>bool mod_tiling.detach(WRegion reg)</TT>
-
-</DD>
-<DT><STRONG>Description:</STRONG></DT>
-<DD>Detach <TT>reg</TT>, i.e. make it managed by its nearest ancestor
- WGroup, framed if <TT>reg</TT> is not itself WFrame.
-  
-</DD>
-</DL>
-
-<P>
-
-  <DL>
-<DD><A NAME="6783"></A>
-<A NAME="6784"></A>
+<DD><A NAME="6929"></A>
+<A NAME="6930"></A>
 <A NAME="fn:mod_tiling.get"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3518,8 +3573,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6785"></A>
-<A NAME="6786"></A>
+<DD><A NAME="6931"></A>
+<A NAME="6932"></A>
 <A NAME="fn:mod_tiling.mkbottom"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3536,8 +3591,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6787"></A>
-<A NAME="6788"></A>
+<DD><A NAME="6933"></A>
+<A NAME="6934"></A>
 <A NAME="fn:mod_tiling.set"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3560,8 +3615,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6790"></A>
-<A NAME="6791"></A>
+<DD><A NAME="6936"></A>
+<A NAME="6937"></A>
 <A NAME="fn:WSplit.geom"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3577,8 +3632,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6792"></A>
-<A NAME="6793"></A>
+<DD><A NAME="6938"></A>
+<A NAME="6939"></A>
 <A NAME="fn:WSplit.parent"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3594,8 +3649,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6794"></A>
-<A NAME="6795"></A>
+<DD><A NAME="6940"></A>
+<A NAME="6941"></A>
 <A NAME="fn:WSplit.rqgeom"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3613,8 +3668,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6796"></A>
-<A NAME="6797"></A>
+<DD><A NAME="6942"></A>
+<A NAME="6943"></A>
 <A NAME="fn:WSplit.transpose"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3636,8 +3691,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6799"></A>
-<A NAME="6800"></A>
+<DD><A NAME="6945"></A>
+<A NAME="6946"></A>
 <A NAME="fn:WSplitInner.current"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3659,8 +3714,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6802"></A>
-<A NAME="6803"></A>
+<DD><A NAME="6948"></A>
+<A NAME="6949"></A>
 <A NAME="fn:WSplitRegion.reg"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3682,8 +3737,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6805"></A>
-<A NAME="6806"></A>
+<DD><A NAME="6951"></A>
+<A NAME="6952"></A>
 <A NAME="fn:WSplitSplit.br"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3700,8 +3755,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6807"></A>
-<A NAME="6808"></A>
+<DD><A NAME="6953"></A>
+<A NAME="6954"></A>
 <A NAME="fn:WSplitSplit.dir"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3718,8 +3773,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6809"></A>
-<A NAME="6810"></A>
+<DD><A NAME="6955"></A>
+<A NAME="6956"></A>
 <A NAME="fn:WSplitSplit.flip"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3735,8 +3790,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6811"></A>
-<A NAME="6812"></A>
+<DD><A NAME="6957"></A>
+<A NAME="6958"></A>
 <A NAME="fn:WSplitSplit.tl"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3759,8 +3814,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6814"></A>
-<A NAME="6815"></A>
+<DD><A NAME="6960"></A>
+<A NAME="6961"></A>
 <A NAME="fn:WTiling.flip_at"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3776,8 +3831,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6816"></A>
-<A NAME="6817"></A>
+<DD><A NAME="6962"></A>
+<A NAME="6963"></A>
 <A NAME="fn:WTiling.transpose_at"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3793,8 +3848,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6818"></A>
-<A NAME="6819"></A>
+<DD><A NAME="6964"></A>
+<A NAME="6965"></A>
 <A NAME="fn:WTiling.farthest"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3813,16 +3868,19 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6820"></A>
-<A NAME="6821"></A>
-<A NAME="fn:WTiling.managed_list"></A>  
+<DD><A NAME="6966"></A>
+<A NAME="6967"></A>
+<A NAME="fn:WTiling.managed_i"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>table WTiling.managed_list(WTiling ws)</TT>
+<DD><TT>bool WTiling.managed_i(WTiling ws, function iterfn)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Returns a list of regions managed by the workspace (frames, mostly).
+<DD>Iterate over managed regions of <TT>ws</TT> until <TT>iterfn</TT> returns
+ <TT>false</TT>.
+ The function itself returns <TT>true</TT> if it reaches the end of list
+ without this happening.
   
 </DD>
 </DL>
@@ -3830,8 +3888,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6822"></A>
-<A NAME="6823"></A>
+<DD><A NAME="6968"></A>
+<A NAME="6969"></A>
 <A NAME="fn:WTiling.nextto"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3850,8 +3908,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6824"></A>
-<A NAME="6825"></A>
+<DD><A NAME="6970"></A>
+<A NAME="6971"></A>
 <A NAME="fn:WTiling.node_of"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3868,8 +3926,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6826"></A>
-<A NAME="6827"></A>
+<DD><A NAME="6972"></A>
+<A NAME="6973"></A>
 <A NAME="fn:WTiling.set_floating_at"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3888,8 +3946,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6828"></A>
-<A NAME="6829"></A>
+<DD><A NAME="6974"></A>
+<A NAME="6975"></A>
 <A NAME="fn:WTiling.set_floating"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3907,8 +3965,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6830"></A>
-<A NAME="6831"></A>
+<DD><A NAME="6976"></A>
+<A NAME="6977"></A>
 <A NAME="fn:WTiling.split"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3926,8 +3984,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6832"></A>
-<A NAME="6833"></A>
+<DD><A NAME="6978"></A>
+<A NAME="6979"></A>
 <A NAME="fn:WTiling.split_at"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3948,8 +4006,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6834"></A>
-<A NAME="6835"></A>
+<DD><A NAME="6980"></A>
+<A NAME="6981"></A>
 <A NAME="fn:WTiling.split_top"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3965,8 +4023,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6836"></A>
-<A NAME="6837"></A>
+<DD><A NAME="6982"></A>
+<A NAME="6983"></A>
 <A NAME="fn:WTiling.split_tree"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -3982,8 +4040,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="6838"></A>
-<A NAME="6839"></A>
+<DD><A NAME="6984"></A>
+<A NAME="6985"></A>
 <A NAME="fn:WTiling.unsplit_at"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4006,8 +4064,8 @@ Note that this function is asynchronous; the region will not
 </H2>
 
   <DL>
-<DD><A NAME="7832"></A>
-<A NAME="7833"></A>
+<DD><A NAME="7977"></A>
+<A NAME="7978"></A>
 <A NAME="fn:mod_query.defcmd"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4023,8 +4081,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7834"></A>
-<A NAME="7835"></A>
+<DD><A NAME="7979"></A>
+<A NAME="7980"></A>
 <A NAME="fn:mod_query.get"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4041,8 +4099,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7836"></A>
-<A NAME="7837"></A>
+<DD><A NAME="7981"></A>
+<A NAME="7982"></A>
 <A NAME="fn:mod_query.history_clear"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4058,8 +4116,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7838"></A>
-<A NAME="7839"></A>
+<DD><A NAME="7983"></A>
+<A NAME="7984"></A>
 <A NAME="fn:mod_query.history_get"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4075,8 +4133,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7840"></A>
-<A NAME="7841"></A>
+<DD><A NAME="7985"></A>
+<A NAME="7986"></A>
 <A NAME="fn:mod_query.history_push"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4092,19 +4150,20 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7842"></A>
-<A NAME="7843"></A>
+<DD><A NAME="7987"></A>
+<A NAME="7988"></A>
 <A NAME="fn:mod_query.history_search"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>integer mod_query.history_search(string s, integer from, bool bwd)</TT>
+<DD><TT>integer mod_query.history_search(string s, integer from, bool bwd, bool exact)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
 <DD>Try to find matching history entry. Returns -1 if none was
  found. The parameter <TT>from</TT> specifies where to start 
  searching from, and <TT>bwd</TT> causes backward search from
- that point.
+ that point. If <TT>exact</TT> is not set, <TT>s</TT> only required
+ to be a prefix of the match.
   
 </DD>
 </DL>
@@ -4112,8 +4171,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7844"></A>
-<A NAME="7845"></A>
+<DD><A NAME="7989"></A>
+<A NAME="7990"></A>
 <A NAME="fn:mod_query.history_table"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4129,8 +4188,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7846"></A>
-<A NAME="7847"></A>
+<DD><A NAME="7991"></A>
+<A NAME="7992"></A>
 <A NAME="fn:mod_query.message"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4146,8 +4205,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7848"></A>
-<A NAME="7849"></A>
+<DD><A NAME="7993"></A>
+<A NAME="7994"></A>
 <A NAME="fn:mod_query.set"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4170,6 +4229,10 @@ Note that this function is asynchronous; the region will not
 <TD ALIGN="LEFT">(integer) auto-show-completions delay
       in milliseconds (default: 250).</TD>
 </TR>
+<TR><TD ALIGN="LEFT"><TT>caseicompl</TT></TD>
+<TD ALIGN="LEFT">(boolean) Turn some completions case-insensitive
+      (default: false).</TD>
+</TR>
 </TABLE>
   
 </DD>
@@ -4178,8 +4241,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7850"></A>
-<A NAME="7851"></A>
+<DD><A NAME="7995"></A>
+<A NAME="7996"></A>
 <A NAME="fn:mod_query.warn"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4195,8 +4258,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7852"></A>
-<A NAME="7853"></A>
+<DD><A NAME="7997"></A>
+<A NAME="7998"></A>
 <A NAME="fn:mod_query.popen_completions"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4219,8 +4282,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7854"></A>
-<A NAME="7855"></A>
+<DD><A NAME="7999"></A>
+<A NAME="8000"></A>
 <A NAME="fn:mod_query.query"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4246,8 +4309,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7856"></A>
-<A NAME="7857"></A>
+<DD><A NAME="8001"></A>
+<A NAME="8002"></A>
 <A NAME="fn:mod_query.query_attachclient"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4265,8 +4328,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7858"></A>
-<A NAME="7859"></A>
+<DD><A NAME="8003"></A>
+<A NAME="8004"></A>
 <A NAME="fn:mod_query.query_editfile"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4284,8 +4347,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7860"></A>
-<A NAME="7861"></A>
+<DD><A NAME="8005"></A>
+<A NAME="8006"></A>
 <A NAME="fn:mod_query.query_exec"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4305,8 +4368,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7862"></A>
-<A NAME="7863"></A>
+<DD><A NAME="8007"></A>
+<A NAME="8008"></A>
 <A NAME="fn:mod_query.query_gotoclient"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4324,8 +4387,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7864"></A>
-<A NAME="7865"></A>
+<DD><A NAME="8009"></A>
+<A NAME="8010"></A>
 <A NAME="fn:mod_query.query_lua"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4344,8 +4407,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7866"></A>
-<A NAME="7867"></A>
+<DD><A NAME="8011"></A>
+<A NAME="8012"></A>
 <A NAME="fn:mod_query.query_man"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4363,8 +4426,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7868"></A>
-<A NAME="7869"></A>
+<DD><A NAME="8013"></A>
+<A NAME="8014"></A>
 <A NAME="fn:mod_query.query_menu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4380,8 +4443,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7870"></A>
-<A NAME="7871"></A>
+<DD><A NAME="8015"></A>
+<A NAME="8016"></A>
 <A NAME="fn:mod_query.query_renameframe"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4398,17 +4461,18 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7872"></A>
-<A NAME="7873"></A>
+<DD><A NAME="8017"></A>
+<A NAME="8018"></A>
 <A NAME="fn:mod_query.query_renameworkspace"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>mod_query.query_renameworkspace(mplex)</TT>
+<DD><TT>mod_query.query_renameworkspace(mplex, ws)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>This function asks for a name new for the workspace on which the
- query resides.
+<DD>This function asks for a name new for the workspace <TT>ws</TT>,
+ or the one on which <TT>mplex</TT> resides, if it is not set.
+ If <TT>mplex</TT> is not set, one is looked for.
   
 </DD>
 </DL>
@@ -4416,8 +4480,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7874"></A>
-<A NAME="7875"></A>
+<DD><A NAME="8019"></A>
+<A NAME="8020"></A>
 <A NAME="fn:mod_query.query_restart"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4434,8 +4498,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7876"></A>
-<A NAME="7877"></A>
+<DD><A NAME="8021"></A>
+<A NAME="8022"></A>
 <A NAME="fn:mod_query.query_runfile"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4453,8 +4517,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7878"></A>
-<A NAME="7879"></A>
+<DD><A NAME="8023"></A>
+<A NAME="8024"></A>
 <A NAME="fn:mod_query.query_shutdown"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4472,8 +4536,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7880"></A>
-<A NAME="7881"></A>
+<DD><A NAME="8025"></A>
+<A NAME="8026"></A>
 <A NAME="fn:mod_query.query_ssh"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4490,8 +4554,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7883"></A>
-<A NAME="7884"></A>
+<DD><A NAME="8028"></A>
+<A NAME="8029"></A>
 <A NAME="fn:mod_query.query_workspace"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4511,8 +4575,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7885"></A>
-<A NAME="7886"></A>
+<DD><A NAME="8030"></A>
+<A NAME="8031"></A>
 <A NAME="fn:mod_query.query_yesno"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4530,8 +4594,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7887"></A>
-<A NAME="7888"></A>
+<DD><A NAME="8032"></A>
+<A NAME="8033"></A>
 <A NAME="fn:mod_query.show_about_ion"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4547,8 +4611,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7889"></A>
-<A NAME="7890"></A>
+<DD><A NAME="8034"></A>
+<A NAME="8035"></A>
 <A NAME="fn:mod_query.show_tree"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4570,8 +4634,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7892"></A>
-<A NAME="7893"></A>
+<DD><A NAME="8037"></A>
+<A NAME="8038"></A>
 <A NAME="fn:WComplProxy.set_completions"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4597,8 +4661,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7895"></A>
-<A NAME="7896"></A>
+<DD><A NAME="8040"></A>
+<A NAME="8041"></A>
 <A NAME="fn:WEdln.back"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4614,8 +4678,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7897"></A>
-<A NAME="7898"></A>
+<DD><A NAME="8042"></A>
+<A NAME="8043"></A>
 <A NAME="fn:WEdln.backspace"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4631,8 +4695,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7899"></A>
-<A NAME="7900"></A>
+<DD><A NAME="8044"></A>
+<A NAME="8045"></A>
 <A NAME="fn:WEdln.bkill_word"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4649,8 +4713,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7901"></A>
-<A NAME="7902"></A>
+<DD><A NAME="8046"></A>
+<A NAME="8047"></A>
 <A NAME="fn:WEdln.bol"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4666,8 +4730,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7903"></A>
-<A NAME="7904"></A>
+<DD><A NAME="8048"></A>
+<A NAME="8049"></A>
 <A NAME="fn:WEdln.bskip_word"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4684,8 +4748,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7905"></A>
-<A NAME="7906"></A>
+<DD><A NAME="8050"></A>
+<A NAME="8051"></A>
 <A NAME="fn:WEdln.clear_mark"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4701,8 +4765,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7907"></A>
-<A NAME="7908"></A>
+<DD><A NAME="8052"></A>
+<A NAME="8053"></A>
 <A NAME="fn:WEdln.complete"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4724,8 +4788,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7909"></A>
-<A NAME="7910"></A>
+<DD><A NAME="8054"></A>
+<A NAME="8055"></A>
 <A NAME="fn:WEdln.contents"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4741,8 +4805,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7911"></A>
-<A NAME="7912"></A>
+<DD><A NAME="8056"></A>
+<A NAME="8057"></A>
 <A NAME="fn:WEdln.context"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4758,8 +4822,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7913"></A>
-<A NAME="7914"></A>
+<DD><A NAME="8058"></A>
+<A NAME="8059"></A>
 <A NAME="fn:WEdln.copy"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4775,8 +4839,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7915"></A>
-<A NAME="7916"></A>
+<DD><A NAME="8060"></A>
+<A NAME="8061"></A>
 <A NAME="fn:WEdln.cut"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4793,8 +4857,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7917"></A>
-<A NAME="7918"></A>
+<DD><A NAME="8062"></A>
+<A NAME="8063"></A>
 <A NAME="fn:WEdln.delete"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4810,8 +4874,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7919"></A>
-<A NAME="7920"></A>
+<DD><A NAME="8064"></A>
+<A NAME="8065"></A>
 <A NAME="fn:WEdln.eol"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4827,8 +4891,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7921"></A>
-<A NAME="7922"></A>
+<DD><A NAME="8066"></A>
+<A NAME="8067"></A>
 <A NAME="fn:WEdln.finish"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4844,8 +4908,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7923"></A>
-<A NAME="7924"></A>
+<DD><A NAME="8068"></A>
+<A NAME="8069"></A>
 <A NAME="fn:WEdln.forward"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4861,8 +4925,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7925"></A>
-<A NAME="7926"></A>
+<DD><A NAME="8070"></A>
+<A NAME="8071"></A>
 <A NAME="fn:WEdln.history_next"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4880,8 +4944,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7927"></A>
-<A NAME="7928"></A>
+<DD><A NAME="8072"></A>
+<A NAME="8073"></A>
 <A NAME="fn:WEdln.history_prev"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4899,8 +4963,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7929"></A>
-<A NAME="7930"></A>
+<DD><A NAME="8074"></A>
+<A NAME="8075"></A>
 <A NAME="fn:WEdln.insstr"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4916,8 +4980,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7931"></A>
-<A NAME="7932"></A>
+<DD><A NAME="8076"></A>
+<A NAME="8077"></A>
 <A NAME="fn:WEdln.is_histcompl"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4933,8 +4997,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7933"></A>
-<A NAME="7934"></A>
+<DD><A NAME="8078"></A>
+<A NAME="8079"></A>
 <A NAME="fn:WEdln.kill_line"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4950,8 +5014,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7935"></A>
-<A NAME="7936"></A>
+<DD><A NAME="8080"></A>
+<A NAME="8081"></A>
 <A NAME="fn:WEdln.kill_to_bol"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4967,8 +5031,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7937"></A>
-<A NAME="7938"></A>
+<DD><A NAME="8082"></A>
+<A NAME="8083"></A>
 <A NAME="fn:WEdln.kill_to_eol"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -4984,8 +5048,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7939"></A>
-<A NAME="7940"></A>
+<DD><A NAME="8084"></A>
+<A NAME="8085"></A>
 <A NAME="fn:WEdln.kill_word"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5002,8 +5066,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7941"></A>
-<A NAME="7942"></A>
+<DD><A NAME="8086"></A>
+<A NAME="8087"></A>
 <A NAME="fn:WEdln.mark"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5021,8 +5085,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7943"></A>
-<A NAME="7944"></A>
+<DD><A NAME="8088"></A>
+<A NAME="8089"></A>
 <A NAME="fn:WEdln.next_completion"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5038,8 +5102,8 @@ Note that this function is asynchronous; the region will not
 <P>
 
   <DL>
-<DD><A NAME="7945"></A>
-<A NAME="7946"></A>
+<DD><A NAME="8090"></A>
+<A NAME="8091"></A>
 <A NAME="fn:WEdln.paste"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5060,8 +5124,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7947"></A>
-<A NAME="7948"></A>
+<DD><A NAME="8092"></A>
+<A NAME="8093"></A>
 <A NAME="fn:WEdln.point"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5078,8 +5142,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7949"></A>
-<A NAME="7950"></A>
+<DD><A NAME="8094"></A>
+<A NAME="8095"></A>
 <A NAME="fn:WEdln.prev_completion"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5095,8 +5159,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7951"></A>
-<A NAME="7952"></A>
+<DD><A NAME="8096"></A>
+<A NAME="8097"></A>
 <A NAME="fn:WEdln.set_context"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5112,8 +5176,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7953"></A>
-<A NAME="7954"></A>
+<DD><A NAME="8098"></A>
+<A NAME="8099"></A>
 <A NAME="fn:WEdln.set_mark"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5129,8 +5193,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7955"></A>
-<A NAME="7956"></A>
+<DD><A NAME="8100"></A>
+<A NAME="8101"></A>
 <A NAME="fn:WEdln.skip_word"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5147,8 +5211,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7957"></A>
-<A NAME="7958"></A>
+<DD><A NAME="8102"></A>
+<A NAME="8103"></A>
 <A NAME="fn:WEdln.transpose_chars"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5164,8 +5228,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7959"></A>
-<A NAME="7960"></A>
+<DD><A NAME="8104"></A>
+<A NAME="8105"></A>
 <A NAME="fn:WEdln.transpose_words"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5187,8 +5251,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7962"></A>
-<A NAME="7963"></A>
+<DD><A NAME="8107"></A>
+<A NAME="8108"></A>
 <A NAME="fn:WInput.cancel"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5204,8 +5268,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7964"></A>
-<A NAME="7965"></A>
+<DD><A NAME="8109"></A>
+<A NAME="8110"></A>
 <A NAME="fn:WInput.scrolldown"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5221,8 +5285,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="7966"></A>
-<A NAME="7967"></A>
+<DD><A NAME="8111"></A>
+<A NAME="8112"></A>
 <A NAME="fn:WInput.scrollup"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5244,8 +5308,8 @@ Note that this function is asynchronous; the selection will not
 </H2>
 
   <DL>
-<DD><A NAME="8777"></A>
-<A NAME="8778"></A>
+<DD><A NAME="8928"></A>
+<A NAME="8929"></A>
 <A NAME="fn:mod_menu.grabmenu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5263,8 +5327,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8779"></A>
-<A NAME="8780"></A>
+<DD><A NAME="8930"></A>
+<A NAME="8931"></A>
 <A NAME="fn:mod_menu.menu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5290,8 +5354,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8781"></A>
-<A NAME="8782"></A>
+<DD><A NAME="8932"></A>
+<A NAME="8933"></A>
 <A NAME="fn:mod_menu.get"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5307,8 +5371,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8783"></A>
-<A NAME="8784"></A>
+<DD><A NAME="8934"></A>
+<A NAME="8935"></A>
 <A NAME="fn:mod_menu.set"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5342,8 +5406,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8785"></A>
-<A NAME="8786"></A>
+<DD><A NAME="8936"></A>
+<A NAME="8937"></A>
 <A NAME="fn:mod_menu.pmenu"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5367,8 +5431,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8788"></A>
-<A NAME="8789"></A>
+<DD><A NAME="8939"></A>
+<A NAME="8940"></A>
 <A NAME="fn:WMenu.cancel"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5384,8 +5448,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8790"></A>
-<A NAME="8791"></A>
+<DD><A NAME="8941"></A>
+<A NAME="8942"></A>
 <A NAME="fn:WMenu.finish"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5402,8 +5466,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8792"></A>
-<A NAME="8793"></A>
+<DD><A NAME="8943"></A>
+<A NAME="8944"></A>
 <A NAME="fn:WMenu.select_next"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5419,8 +5483,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8794"></A>
-<A NAME="8795"></A>
+<DD><A NAME="8945"></A>
+<A NAME="8946"></A>
 <A NAME="fn:WMenu.select_nth"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5436,8 +5500,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8796"></A>
-<A NAME="8797"></A>
+<DD><A NAME="8947"></A>
+<A NAME="8948"></A>
 <A NAME="fn:WMenu.select_prev"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5453,8 +5517,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="8798"></A>
-<A NAME="8799"></A>
+<DD><A NAME="8949"></A>
+<A NAME="8950"></A>
 <A NAME="fn:WMenu.typeahead_clear"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5476,8 +5540,8 @@ Note that this function is asynchronous; the selection will not
 </H2>
 
   <DL>
-<DD><A NAME="8997"></A>
-<A NAME="8998"></A>
+<DD><A NAME="9148"></A>
+<A NAME="9149"></A>
 <A NAME="fn:mod_dock.set_floating_shown_on"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5499,8 +5563,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="9000"></A>
-<A NAME="9001"></A>
+<DD><A NAME="9151"></A>
+<A NAME="9152"></A>
 <A NAME="fn:WDock.attach"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5516,8 +5580,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="9002"></A>
-<A NAME="9003"></A>
+<DD><A NAME="9153"></A>
+<A NAME="9154"></A>
 <A NAME="fn:WDock.get"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5534,8 +5598,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="9004"></A>
-<A NAME="9005"></A>
+<DD><A NAME="9155"></A>
+<A NAME="9156"></A>
 <A NAME="fn:WDock.resize"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5551,8 +5615,8 @@ Note that this function is asynchronous; the selection will not
 <P>
 
   <DL>
-<DD><A NAME="9006"></A>
-<A NAME="9007"></A>
+<DD><A NAME="9157"></A>
+<A NAME="9158"></A>
 <A NAME="fn:WDock.set"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5607,8 +5671,8 @@ Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
 </H2>
 
   <DL>
-<DD><A NAME="9106"></A>
-<A NAME="9107"></A>
+<DD><A NAME="9257"></A>
+<A NAME="9258"></A>
 <A NAME="fn:mod_sp.set_shown"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5625,8 +5689,8 @@ Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
 <P>
 
   <DL>
-<DD><A NAME="9108"></A>
-<A NAME="9109"></A>
+<DD><A NAME="9259"></A>
+<A NAME="9260"></A>
 <A NAME="fn:mod_sp.set_shown_on"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5649,8 +5713,8 @@ Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
 </H2>
 
   <DL>
-<DD><A NAME="9173"></A>
-<A NAME="9174"></A>
+<DD><A NAME="9324"></A>
+<A NAME="9325"></A>
 <A NAME="fn:de.defstyle"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5666,8 +5730,8 @@ Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
 <P>
 
   <DL>
-<DD><A NAME="9175"></A>
-<A NAME="9176"></A>
+<DD><A NAME="9326"></A>
+<A NAME="9327"></A>
 <A NAME="fn:de.defstyle_rootwin"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5683,8 +5747,8 @@ Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
 <P>
 
   <DL>
-<DD><A NAME="9177"></A>
-<A NAME="9178"></A>
+<DD><A NAME="9328"></A>
+<A NAME="9329"></A>
 <A NAME="fn:de.reset"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5700,8 +5764,8 @@ Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
 <P>
 
   <DL>
-<DD><A NAME="9179"></A>
-<A NAME="9180"></A>
+<DD><A NAME="9330"></A>
+<A NAME="9331"></A>
 <A NAME="fn:de.substyle"></A>  
 </DD>
 <DT><STRONG>Synopsis:</STRONG></DT>
@@ -5725,7 +5789,7 @@ Any parameters not explicitly set in <TT>conftab</TT> will be left unchanged.
 <P>
 
   <DL>
-<DD><A NAME="9401"></A>
+<DD><A NAME="9529"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5797,7 +5861,7 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9402"></A>
+<DD><A NAME="9530"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5817,7 +5881,28 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9403"></A>
+<DD><A NAME="9531"></A>
+
+</DD>
+<DT><STRONG>Hook name:</STRONG></DT>
+<DD><A NAME="clientwin_property_change_hook"></A><TT>clientwin_property_change_hook</TT>
+
+</DD>
+<DT><STRONG>Parameters:</STRONG></DT>
+<DD><TT>(WClientWin, integer)</TT>
+
+</DD>
+<DT><STRONG>Description:</STRONG></DT>
+<DD>Called when the property identified by the parameter atom id
+      (integer) has changed on a client window.
+      
+</DD>
+</DL>
+
+<P>
+
+  <DL>
+<DD><A NAME="9532"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5838,7 +5923,7 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9404"></A>
+<DD><A NAME="9533"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5884,7 +5969,7 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9405"></A>
+<DD><A NAME="9534"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5905,7 +5990,7 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9406"></A>
+<DD><A NAME="9535"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5925,7 +6010,7 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9407"></A>
+<DD><A NAME="9536"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5946,7 +6031,7 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9408"></A>
+<DD><A NAME="9537"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -5966,7 +6051,7 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9409"></A>
+<DD><A NAME="9538"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
@@ -6018,85 +6103,11 @@ reg:attach(cwin)
 <P>
 
   <DL>
-<DD><A NAME="9410"></A>
+<DD><A NAME="9539"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
-<DD><A NAME="panews_make_placement_alt"></A><TT>panews_make_placement_alt</TT>
-
-</DD>
-<DT><STRONG>Parameters:</STRONG></DT>
-<DD><TT>table</TT>
-
-</DD>
-<DT><STRONG>Description:</STRONG></DT>
-<DD>Called to make a placement on panews. The parameter table has
-      the following fields:
-
-<P>
-<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
-<TR><TD ALIGN="LEFT">Field</TD>
-<TD ALIGN="LEFT">Type</TD>
-<TD ALIGN="LEFT">Description</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>ws</TT></TD>
-<TD ALIGN="LEFT">WPaneWS</TD>
-<TD ALIGN="LEFT">The workspace</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>frame</TT></TD>
-<TD ALIGN="LEFT">WFrame</TD>
-<TD ALIGN="LEFT">A frame initially allocated for the
-              region to be placed</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>reg</TT></TD>
-<TD ALIGN="LEFT">WRegion</TD>
-<TD ALIGN="LEFT">The region to be placed</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>specifier</TT></TD>
-<TD ALIGN="LEFT">WRegion</TD>
-<TD ALIGN="LEFT">For drag&amp;drop on handling empty areas</TD>
-</TR>
-</TABLE>
-
-<P>
-The handler should set some of these fields on success:
-
-<P>
-<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
-<TR><TD ALIGN="LEFT">Field</TD>
-<TD ALIGN="LEFT">Type</TD>
-<TD ALIGN="LEFT">Description</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>res_node</TT></TD>
-<TD ALIGN="LEFT">WSplit</TD>
-<TD ALIGN="LEFT">Target split</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>res_config</TT></TD>
-<TD ALIGN="LEFT">WFrame</TD>
-<TD ALIGN="LEFT">New configuration for it, unless
-              WSplitRegion</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>res_w</TT></TD>
-<TD ALIGN="LEFT">integer</TD>
-<TD ALIGN="LEFT">New width for target split (optional)</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT>res_h</TT></TD>
-<TD ALIGN="LEFT">integer</TD>
-<TD ALIGN="LEFT">New height for target split (optional)</TD>
-</TR>
-</TABLE>
-      
-</DD>
-</DL>
-
-<P>
-
-  <DL>
-<DD><A NAME="9411"></A>
-
-</DD>
-<DT><STRONG>Hook name:</STRONG></DT>
-<DD><A NAME="region_activated_hook"></A><TT>region_activated_hook</TT>
+<DD><A NAME="region_do_warp_alt"></A><TT>region_do_warp_alt</TT>
 
 </DD>
 <DT><STRONG>Parameters:</STRONG></DT>
@@ -6104,7 +6115,8 @@ The handler should set some of these fields on success:
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>Signalled when a region or one of its children has received the focus.
+<DD>This alt-hook exist to allow for alternative pointer warping
+      implementations.
       
 </DD>
 </DL>
@@ -6112,20 +6124,21 @@ The handler should set some of these fields on success:
 <P>
 
   <DL>
-<DD><A NAME="9412"></A>
+<DD><A NAME="9540"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
-<DD><A NAME="region_activity_hook"></A><TT>region_activity_hook</TT>
+<DD><A NAME="screen_managed_changed_hook"></A><TT>screen_managed_changed_hook</TT>
 
 </DD>
 <DT><STRONG>Parameters:</STRONG></DT>
-<DD><TT>WRegion</TT>
+<DD><TT>table</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>This hook is triggered when the activity flag of the parameter 
-      region has been changed.
+<DD>Called when there are changes in the objects managed by a screen
+      or their order. The table parameter is similar to that of
+      <A HREF="#fn:frame_managed_changed_hook"><TT>frame_managed_changed_hook</TT></A>.
       
 </DD>
 </DL>
@@ -6133,67 +6146,73 @@ The handler should set some of these fields on success:
 <P>
 
   <DL>
-<DD><A NAME="9413"></A>
+<DD><A NAME="9541"></A>
 
 </DD>
 <DT><STRONG>Hook name:</STRONG></DT>
-<DD><A NAME="region_do_warp_alt"></A><TT>region_do_warp_alt</TT>
+<DD><A NAME="region_notify_hook"></A><TT>region_notify_hook</TT>
 
 </DD>
 <DT><STRONG>Parameters:</STRONG></DT>
-<DD><TT>WRegion</TT>
+<DD><TT>(WRegion, string)</TT>
 
 </DD>
 <DT><STRONG>Description:</STRONG></DT>
-<DD>This alt-hook exist to allow for alternative pointer warping
-      implementations.
-      
-</DD>
-</DL>
+<DD>Signalled when something (minor) has changed in relation to 
+      the first parameter region. The string argument gives the
+      change:
 
 <P>
+<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
+<TR><TD ALIGN="LEFT">String</TD>
+<TD ALIGN="LEFT">Description</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>deinit</TT></TD>
+<TD ALIGN="LEFT">The region is about to be deinitialised.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>activated</TT></TD>
+<TD ALIGN="LEFT">The region has received focus.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>inactivated</TT></TD>
+<TD ALIGN="LEFT">The region has lost focus.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>activity</TT></TD>
+<TD ALIGN="LEFT">There's been activity in the region itself.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>sub_activity</TT></TD>
+<TD ALIGN="LEFT">There's been activity in some sub-region.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>name</TT></TD>
+<TD ALIGN="LEFT">The name of the region has changed.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>unset_manager</TT></TD>
+<TD ALIGN="LEFT">The region no longer has a manager.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>set_manager</TT></TD>
+<TD ALIGN="LEFT">The region now has a manager.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>tag</TT></TD>
+<TD ALIGN="LEFT">Tagging state has changed.</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>pseudoactivated</TT></TD>
+<TD ALIGN="LEFT">The region has become pseudoactive
+                      (see below).</TD>
+</TR>
+<TR><TD ALIGN="LEFT"><TT>pseudoinactivated</TT></TD>
+<TD ALIGN="LEFT">The region is no longer pseudoactive.</TD>
+</TR>
+</TABLE>
 
-  <DL>
-<DD><A NAME="9414"></A>
-
-</DD>
-<DT><STRONG>Hook name:</STRONG></DT>
-<DD><A NAME="region_inactivated_hook"></A><TT>region_inactivated_hook</TT>
-
-</DD>
-<DT><STRONG>Parameters:</STRONG></DT>
-<DD><TT>WRegion</TT>
-
-</DD>
-<DT><STRONG>Description:</STRONG></DT>
-<DD>Signalled when the focus has moved from the parameter region or
-      one of its children to a non-child region of the parameter region.
+<P>
+A region is pseudoactive, 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.
       
 </DD>
 </DL>
 
 <P>
 
-  <DL>
-<DD><A NAME="9415"></A>
-
-</DD>
-<DT><STRONG>Hook name:</STRONG></DT>
-<DD><A NAME="screen_managed_changed_hook"></A><TT>screen_managed_changed_hook</TT>
-
-</DD>
-<DT><STRONG>Parameters:</STRONG></DT>
-<DD><TT>table</TT>
-
-</DD>
-<DT><STRONG>Description:</STRONG></DT>
-<DD>Called when there are changes in the objects managed by a screen
-      or their order. The table parameter is similar to that of
-      <A HREF="#fn:frame_managed_changed_hook"><TT>frame_managed_changed_hook</TT></A>.
-      
-</DD>
-</DL>
-
 <P>
 
 <P>
index 69a5affb7a36d910af2323da73d5828cf62855f1..9d55faa9522b86352c4f3a78ef0661a3dab07f7a 100644 (file)
@@ -74,10 +74,10 @@ B. Full class hierarchy visible to Lua-side
      |--&gt;WRegion
      |    |--&gt;WClientWin
      |    |--&gt;WWindow
-     |    |    |--&gt;WRootWin
      |    |    |--&gt;WMPlex
-     |    |    |    |--&gt;WScreen
      |    |    |    |--&gt;WFrame
+     |    |    |    |--&gt;WScreen
+     |    |    |         |-&gt;WRootWin
      |    |    |--&gt;WInfoWin
      |    |    |    |--&gt;WStatusBar (mod_statusbar)
      |    |    |--&gt;WMenu (mod_menu)
index 2922df55eb288a8d98eb4857cc31a5e9a4e4baa2..599aad6a386aaefd0a3ad94c8b01f430b62f687d 100644 (file)
Binary files a/doc/ionnotes.dvi.gz and b/doc/ionnotes.dvi.gz differ
index d432ffb83576a7cfdbc9e77265d89c84b6d008ad..2bbff07cc488b76cae151234be7bf9eb1ed86921 100644 (file)
Binary files a/doc/ionnotes.ps.gz and b/doc/ionnotes.ps.gz differ
index e25fd2d14bcbf0ac56dd6155c6f3ecbdc005c593..ad3c8396a0853d7b6f6332c9f912660453906e40 100644 (file)
@@ -128,7 +128,7 @@ implement.
 
 <P>
 
-<DIV ALIGN="CENTER"><A NAME="fig:classhierarchy"></A><A NAME="319"></A>
+<DIV ALIGN="CENTER"><A NAME="fig:classhierarchy"></A><A NAME="318"></A>
 <TABLE>
 <CAPTION ALIGN="BOTTOM"><STRONG>Figure 1:</STRONG>
 Partial Ioncore, <SPAN  CLASS="textit">mod_tiling</SPAN> and <SPAN  CLASS="textit">mod_query</SPAN> 
@@ -138,10 +138,10 @@ Partial Ioncore, <SPAN  CLASS="textit">mod_tiling</SPAN> and <SPAN  CLASS="texti
      |--&gt;WRegion
      |    |--&gt;WClientWin
      |    |--&gt;WWindow
-     |    |    |--&gt;WRootWin
      |    |    |--&gt;WMPlex
-     |    |    |    |--&gt;WScreen
      |    |    |    |--&gt;WFrame
+     |    |    |    |--&gt;WScreen
+     |    |    |         |--&gt;WRootWin
      |    |    |--&gt;WInput (mod_query)
      |    |         |--&gt;WEdln (mod_query)
      |    |         |--&gt;WMessage (mod_query)
@@ -160,13 +160,13 @@ The core classes:
 <P>
 <DL>
 <DT><STRONG>Obj</STRONG></DT>
-<DD><A NAME="325"></A>
+<DD><A NAME="324"></A>
     Is the base of Ion's object system.
 
 <P>
 </DD>
 <DT><STRONG>WRegion</STRONG></DT>
-<DD><A NAME="326"></A>
+<DD><A NAME="325"></A>
     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 
@@ -178,27 +178,27 @@ The core classes:
 <P>
 </DD>
 <DT><STRONG>WClientWin</STRONG></DT>
-<DD><A NAME="327"></A> is a class for
+<DD><A NAME="326"></A> is a class for
     client window objects, the objects that window managers are
     supposed to manage.
 
 <P>
 </DD>
 <DT><STRONG>WWindow</STRONG></DT>
-<DD><A NAME="328"></A> is the base class for all
+<DD><A NAME="327"></A> is the base class for all
     internal objects having an X window associated to them
     (WClientWins also have X windows associated to them).
 
 <P>
 </DD>
 <DT><STRONG>WRootWin</STRONG></DT>
-<DD><A NAME="329"></A> is the class for
+<DD><A NAME="328"></A> is the class for
     root windows<A NAME="242"></A> of X screens<A NAME="243"></A>.
     Note that an ''X screen'' or root window is not necessarily a
     single  physical screen<A NAME="244"></A> as a root window
-    may be split over multiple screens when multi-head extension
-    such as Xinerama<A NAME="245"></A> are used. (Actually there
-    can be only one WRootWin when Xinerama is used.)
+    may be split over multiple screens when hacks such a
+    Xinerama<A NAME="245"></A> are used. (Actually there can be only 
+    one root window when Xinerama is used.)
 
 <P>
 </DD>
@@ -211,15 +211,14 @@ The core classes:
 <P>
 </DD>
 <DT><STRONG>WScreen</STRONG></DT>
-<DD><A NAME="330"></A> is the class for objects
+<DD><A NAME="329"></A> is the class for objects
     corresponding to physical screens. Screens may share a root
-    window when Xinerama multihead extensions are used as explained
-    above.
+    window when the Xinerama extension is used as explained above.
 
 <P>
 </DD>
 <DT><STRONG>WFrame</STRONG></DT>
-<DD><A NAME="331"></A> is the class for frames.
+<DD><A NAME="330"></A> 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).
@@ -227,11 +226,11 @@ The core classes:
 <P>
 </DD>
 <DT><STRONG>WGroup</STRONG></DT>
-<DD><A NAME="332"></A> is the base class for groups.
+<DD><A NAME="331"></A> is the base class for groups.
     Particular types of groups are workspaces 
-    (WGroupWS<A NAME="333"></A>)
+    (WGroupWS<A NAME="332"></A>)
     and groups of client windows
-    (WGroupCW<A NAME="334"></A>).
+    (WGroupCW<A NAME="333"></A>).
 </DD>
 </DL>
 
@@ -241,12 +240,12 @@ Classes implemented by the <SPAN  CLASS="textit">mod_tiling</SPAN> module:
 <P>
 <DL>
 <DT><STRONG>WTiling</STRONG></DT>
-<DD><A NAME="336"></A> is the class for tilings
+<DD><A NAME="335"></A> is the class for tilings
     of frames.
   
 </DD>
 <DT><STRONG>WSplit</STRONG></DT>
-<DD><A NAME="337"></A> (or, more specifically, classes
+<DD><A NAME="336"></A> (or, more specifically, classes
     that inherit it) encode the WTiling tree structure.
 </DD>
 </DL>
@@ -257,19 +256,19 @@ Classes implemented by the <SPAN  CLASS="textit">mod_query</SPAN> module:
 <P>
 <DL>
 <DT><STRONG>WInput</STRONG></DT>
-<DD><A NAME="339"></A> is a virtual base class for the
+<DD><A NAME="338"></A> is a virtual base class for the
     two classes below.
   
 </DD>
 <DT><STRONG>WEdln</STRONG></DT>
-<DD><A NAME="340"></A> is the class for the ''queries'',
+<DD><A NAME="339"></A> 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.
   
 </DD>
 <DT><STRONG>WMessage</STRONG></DT>
-<DD><A NAME="341"></A> implements the boxes for 
+<DD><A NAME="340"></A> 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.
 </DD>
@@ -293,7 +292,7 @@ binding callbacks in the move and resize mode.
 <SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN> Parent-child relations</A>
 </H3>
 Each object of type WRegion has a parent and possibly a manager
-associated to it. The parent<A NAME="282"></A> for an object is always a 
+associated to it. The parent<A NAME="281"></A> 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.
@@ -303,7 +302,7 @@ Figure <A HREF="#fig:parentship">2</A>.
 
 <P>
 
-<DIV ALIGN="CENTER"><A NAME="fig:parentship"></A><A NAME="293"></A>
+<DIV ALIGN="CENTER"><A NAME="fig:parentship"></A><A NAME="292"></A>
 <TABLE>
 <CAPTION ALIGN="BOTTOM"><STRONG>Figure 2:</STRONG>
 Most common parent-child relations</CAPTION>
@@ -324,7 +323,7 @@ Most common parent-child relations</CAPTION>
 
 <P>
 WRegions have very little control over their children as a parent.
-The manager<A NAME="297"></A> WRegion has much more control over its
+The manager<A NAME="296"></A> 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
@@ -342,7 +341,7 @@ but all have a parent-a screen if not anything else.
 
 <P>
 
-<DIV ALIGN="CENTER"><A NAME="fig:managership"></A><A NAME="305"></A>
+<DIV ALIGN="CENTER"><A NAME="fig:managership"></A><A NAME="304"></A>
 <TABLE>
 <CAPTION ALIGN="BOTTOM"><STRONG>Figure 3:</STRONG>
 Most common manager-managed relations</CAPTION>
index 4f17c4e0a75dd3d340f55a7640d488083d85142a..0309e19e39ec3072217a2c6ac64b8e89aff4c0e4 100644 (file)
@@ -64,11 +64,11 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 
 <P>
 First, to get things clear, what are considered objects here are C
-structures containing a properly initialized <A NAME="428"></A>
+structures containing a properly initialized <A NAME="427"></A>
 structure defined in <SPAN  CLASS="textit">ioncore/obj.h</SPAN> 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<A NAME="430"></A> class type info structure and
+to a WObjDescr<A NAME="429"></A> 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'').
@@ -77,7 +77,7 @@ 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
-<A NAME="431"></A> structure) may be used to create safe references to
+<A NAME="430"></A> 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
index 037e8bc20a64cb24781a5df6b5429e5809342872..1ae2bf72847ad5555eb1dc8152b683c0bd1d9bde 100644 (file)
@@ -126,11 +126,11 @@ C side of Ion and Lua:
 <TD ALIGN="LEFT">&nbsp;</TD>
 </TR>
 <TR><TD ALIGN="RIGHT">t</TD>
-<TD ALIGN="LEFT">ExtlTab<A NAME="521"></A></TD>
+<TD ALIGN="LEFT">ExtlTab<A NAME="520"></A></TD>
 <TD ALIGN="LEFT">Reference to Lua table</TD>
 </TR>
 <TR><TD ALIGN="RIGHT">f</TD>
-<TD ALIGN="LEFT">ExltFn<A NAME="522"></A></TD>
+<TD ALIGN="LEFT">ExltFn<A NAME="521"></A></TD>
 <TD ALIGN="LEFT">Reference to Lua function.</TD>
 </TR>
 <TR><TD ALIGN="RIGHT">o</TD>
@@ -195,7 +195,7 @@ initialisation and deinitialisation code.
 
 <P>
 You've seen the terms level 1 and 2 call handler mentioned above. 
-<A NAME="491"></A>
+<A NAME="490"></A>
 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
@@ -230,10 +230,10 @@ supported by the generated L2 call handlers).
 
 <P>
 The functions
-<TT>extl_call</TT><A NAME="515"></A>,
-<TT>extl_call_named</TT><A NAME="516"></A>,
-<TT>extl_dofile</TT><A NAME="517"></A> and
-<TT>extl_dostring</TT><A NAME="518"></A>
+<TT>extl_call</TT><A NAME="514"></A>,
+<TT>extl_call_named</TT><A NAME="515"></A>,
+<TT>extl_dofile</TT><A NAME="516"></A> and
+<TT>extl_dostring</TT><A NAME="517"></A>
 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
@@ -249,7 +249,7 @@ passing succeeded or not.
 <P>
 Sometimes it is necessary to block calls to all but a limited set of
 Ion functions. This can be accomplished with
-<TT>extl_set_safelist</TT><A NAME="519"></A>.
+<TT>extl_set_safelist</TT><A NAME="518"></A>.
 The parameter to this function is a NULL-terminated array of strings
 and the return value is a similar old safelist.
 The call <TT>extl_set_safelist(NULL)</TT> removes any safelist and allows
@@ -263,7 +263,7 @@ calls to all exported functions.
 
 <P>
 Configuration files should be read as before with the function
-<TT>read_config_for</TT><A NAME="520"></A>
+<TT>read_config_for</TT><A NAME="519"></A>
 except that the list of known options is no longer present.
 
 <P>
index 51c46f894c67e6f0217feffedb478d18346bab93..d3aba2e7d96c6cc553064f83c0e67646e0071b54 100644 (file)
@@ -83,10 +83,10 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 <P>
 To keep Ion's code as simple as possible yet safe, there are restrictions
 when the WObj
-<TT>destroy_obj</TT><A NAME="619"></A>
+<TT>destroy_obj</TT><A NAME="618"></A>
 function that calls watches, the deinit routine and frees memory may
 be called directly. In all other cases the 
-<TT>defer_destroy</TT><A NAME="620"></A>
+<TT>defer_destroy</TT><A NAME="619"></A>
 function should be used to defer the call of <TT>destroy_obj</TT> until
 Ioncore returns to its main event loop. 
 
@@ -104,7 +104,7 @@ following cases:
       some reason failed to reparent the object to this frame.
 </LI>
 <LI>In a deferred action handler set with
-      <TT>defer_action</TT><A NAME="621"></A>.
+      <TT>defer_action</TT><A NAME="620"></A>.
       Like deferred destroys, other deferred actions are called when
       Ioncore has returned to the main loop.
 </LI>
index 0ec574ae7be2f791ef4ce877e56d24690589fb71..6e12241b32f2584b8dcdbb947906606919c1935d 100644 (file)
@@ -58,35 +58,35 @@ original version by:  Nikos Drakos, CBLU, University of Leeds
 Index</A>
 </H2><HR><DL>
 <DD><STRONG>call handler</STRONG>
- : <A HREF="node4.html#491"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node4.html#490"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG><TT>defer_action</TT></STRONG>
- : <A HREF="node5.html#621"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>defer_destroy</TT></STRONG>
  : <A HREF="node5.html#620"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG><TT>destroy_obj</TT></STRONG>
+<DD><STRONG><TT>defer_destroy</TT></STRONG>
  : <A HREF="node5.html#619"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG><TT>destroy_obj</TT></STRONG>
+ : <A HREF="node5.html#618"><SPAN CLASS="arabic">4</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>extl_call</TT></STRONG>
- : <A HREF="node4.html#515"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node4.html#514"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>extl_call_named</TT></STRONG>
- : <A HREF="node4.html#516"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node4.html#515"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>extl_dofile</TT></STRONG>
- : <A HREF="node4.html#517"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node4.html#516"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>extl_dostring</TT></STRONG>
- : <A HREF="node4.html#518"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node4.html#517"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG><TT>extl_set_safelist</TT></STRONG>
- : <A HREF="node4.html#519"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
+ : <A HREF="node4.html#518"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
 <DD><STRONG>ExtlFn</STRONG>
- : <A HREF="node4.html#522"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG>ExtlTab</STRONG>
  : <A HREF="node4.html#521"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG>ExtlTab</STRONG>
+ : <A HREF="node4.html#520"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>manager</STRONG>
- : <A HREF="node2.html#297"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#296"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>Obj</STRONG>
- : <A HREF="node2.html#325"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#324"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>parent</STRONG>
- : <A HREF="node2.html#282"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#281"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG><TT>read_config_for</TT></STRONG>
- : <A HREF="node4.html#520"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
+ : <A HREF="node4.html#519"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN></A>
 <DD><STRONG>root window</STRONG>
  : <A HREF="node2.html#242"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>screen</STRONG><DL>
@@ -94,39 +94,39 @@ Index</A>
 <DD><STRONG>X</STRONG> : <A HREF="node2.html#243"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 </DL>
 <DD><STRONG>WClientWin</STRONG>
- : <A HREF="node2.html#327"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#326"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WEdln</STRONG>
- : <A HREF="node2.html#340"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#339"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WFrame</STRONG>
- : <A HREF="node2.html#331"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#330"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WGroup</STRONG>
- : <A HREF="node2.html#332"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#331"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WGroupCW</STRONG>
- : <A HREF="node2.html#334"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG>WGroupWS</STRONG>
  : <A HREF="node2.html#333"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG>WGroupWS</STRONG>
+ : <A HREF="node2.html#332"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WInput</STRONG>
- : <A HREF="node2.html#339"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#338"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WMessage</STRONG>
- : <A HREF="node2.html#341"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#340"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WObj</STRONG>
- : <A HREF="node3.html#428"><SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node3.html#427"><SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG>WObjDescr</STRONG>
- : <A HREF="node3.html#430"><SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node3.html#429"><SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG>WRegion</STRONG>
- : <A HREF="node2.html#326"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#325"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WRootWin</STRONG>
- : <A HREF="node2.html#329"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#328"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WScreen</STRONG>
- : <A HREF="node2.html#330"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#329"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WSplit</STRONG>
- : <A HREF="node2.html#337"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
-<DD><STRONG>WTiling</STRONG>
  : <A HREF="node2.html#336"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+<DD><STRONG>WTiling</STRONG>
+ : <A HREF="node2.html#335"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>WWatch</STRONG>
- : <A HREF="node3.html#431"><SPAN CLASS="arabic">2</SPAN></A>
+ : <A HREF="node3.html#430"><SPAN CLASS="arabic">2</SPAN></A>
 <DD><STRONG>WWindow</STRONG>
- : <A HREF="node2.html#328"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
+ : <A HREF="node2.html#327"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 <DD><STRONG>Xinerama</STRONG>
  : <A HREF="node2.html#245"><SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
 
index a4ce07fa0df8047ce2afa782fa599b0718321776..78230101dbf17e6ae233ac5ad1f569a0582f3ed8 100644 (file)
@@ -70,7 +70,7 @@ Mathematics Department, Macquarie University, Sydney.
 The command line arguments were: <BR>
  <STRONG>latex2html</STRONG> <TT>-show_section_numbers -short_index -local_icons -noaddress -up_url http://iki.fi/tuomov/ion/ -up_title 'Ion homepage' -nofootnode -split 4 ionnotes</TT>
 <P>
-The translation was initiated by tuomov on 2006-12-23
+The translation was initiated by tuomov on 2007-02-03
 <BR><HR>
 
 </BODY>
index e751eabf27fe4c7de892c0d58b01201177e623a0..80321fa94cc61cade38de40cdf2d994c0109ec76 100644 (file)
@@ -44,10 +44,10 @@ implement.
      |-->WRegion
      |    |-->WClientWin
      |    |-->WWindow
-     |    |    |-->WRootWin
      |    |    |-->WMPlex
-     |    |    |    |-->WScreen
      |    |    |    |-->WFrame
+     |    |    |    |-->WScreen
+     |    |    |         |-->WRootWin
      |    |    |-->WInput (mod_query)
      |    |         |-->WEdln (mod_query)
      |    |         |-->WMessage (mod_query)
@@ -89,10 +89,10 @@ The core classes:
     root windows\index{root window} of X screens\index{screen!X}.
     Note that an ''X screen'' or root window is not necessarily a
     single  physical screen\index{screen!physical} as a root window
-    may be split over multiple screens when multi-head extension
-    such as Xinerama\index{Xinerama} are used. (Actually there
-    can be only one \type{WRootWin} when Xinerama is used.)
-       
+    may be split over multiple screens when hacks such a
+    Xinerama\index{Xinerama} are used. (Actually there can be only 
+    one root window when Xinerama is used.)
+    
   \item[\type{WMPlex}] is a base class for all regions that''multiplex'' 
     other regions. This means that of the regions managed by the multiplexer,
     only one can be displayed at a time. Classes that inhereit \type{WMPlex}
@@ -100,8 +100,7 @@ The core classes:
     
   \item[\type{WScreen}]\indextype{WScreen} is the class for objects
     corresponding to physical screens. Screens may share a root
-    window when Xinerama multihead extensions are used as explained
-    above.
+    window when the Xinerama extension is used as explained above.
 
   \item[\type{WFrame}]\indextype{WFrame} is the class for frames.
     While most Ion's objects have no graphical presentation, frames basically
index 81ba5c1cc0843e3b4990accb32b85130ac9fa965..2c5b191a53934f46c19f738875f0a92d9a3d2e21 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/build/system-inc.mk
 
 ETC =  cfg_ion.lua cfg_ioncore.lua cfg_kludges.lua cfg_modules.lua \
        cfg_tiling.lua cfg_query.lua cfg_menu.lua \
-       cfg_statusbar.lua cfg_dock.lua \
+       cfg_statusbar.lua cfg_dock.lua cfg_layouts.lua \
        look_brownsteel.lua look_clean.lua look_dusky.lua \
        look_greyviolet.lua look_ios.lua look_cleanviolet.lua \
        look_simpleblue.lua look_cleanios.lua \
index 8e8d02e10406e2c3e90ae3089f9400992904edb1..339a026952c9a527e48e4792a9508c171f02a3ce 100644 (file)
@@ -52,5 +52,9 @@ dopath("cfg_modules")
 --dopath("mod_dock")
 --dopath("mod_sp")
 
+-- Define some default layouts. This is also done by cfg_modules
+-- if loaded.
+--dopath("cfg_layouts", true)
+
 -- Deprecated.
 dopath("cfg_user", true)
index acf7e947a36bc7b5726ebc8cfcde4382d2aab8a4..b10b46c3e31bca7cfb9144f7960b3239dbe5a7bb 100644 (file)
@@ -36,10 +36,12 @@ defbindings("WScreen", {
     bdoc("Switch to next/previous object within current screen."),
     kpress(META.."comma", "WScreen.switch_prev(_)"),
     kpress(META.."period", "WScreen.switch_next(_)"),
-    
+
     submap(META.."K", {
         bdoc("Go to first region demanding attention or previously active one."),
-        kpress("K", "ioncore.goto_activity() or ioncore.goto_previous()"),
+        kpress("K", "mod_menu.grabmenu(_, _sub, 'focuslist')"),
+        -- Alternative without (cyclable) menu
+        --kpress("K", "ioncore.goto_activity() or ioncore.goto_previous()"),
 
         --bdoc("Go to previous active object."),
         --kpress("K", "ioncore.goto_previous()"),
@@ -115,21 +117,27 @@ defbindings("WClientWin", {
 
 defbindings("WGroupCW", {
     bdoc("Toggle client window group full-screen mode"),
-    kpress_wait(META.."Return",
-                "WClientWin.set_fullscreen(_:bottom(), 'toggle')"),
+    kpress_wait(META.."Return", "WGroup.set_fullscreen(_, 'toggle')"),
 })
 
 
 -- WMPlex context bindings
 --
 -- These bindings work in frames and on screens. The innermost of such
--- contexts/objects always gets to handle the key press. Most of these 
--- bindings define actions on client windows. (Remember that client windows 
--- can be put in fullscreen mode and therefore may not have a frame.)
+-- contexts/objects always gets to handle the key press. 
 
 defbindings("WMPlex", {
     bdoc("Close current object."),
     kpress_wait(META.."C", "WRegion.rqclose_propagate(_, _sub)"),
+    
+    submap(META.."K", {
+        bdoc("Detach (float) or reattach an object to its previous location."),
+        -- By using _chld instead of _sub, we can detach/reattach queries
+        -- attached to a group. The detach code checks if the parameter 
+        -- (_chld) is a group 'bottom' and detaches the whole group in that
+        -- case.
+        kpress("D", "ioncore.detach(_chld, 'toggle')", "_chld:non-nil"),
+    }),
 })
 
 -- Frames for transient windows ignore this bindmap
@@ -182,9 +190,8 @@ defbindings("WMPlex.toplevel", {
 
 -- WFrame context bindings
 --
--- These bindings are common to all types of frames. The rest of frame
--- bindings that differ between frame types are defined in the modules' 
--- configuration files.
+-- These bindings are common to all types of frames. Some additional
+-- frame bindings are found in some modules' configuration files.
 
 defbindings("WFrame", {
     submap(META.."K", {
@@ -359,6 +366,8 @@ defctxmenu("WFrame", "Frame", {
     menuentry("Close",          "WRegion.rqclose_propagate(_, _sub)"),
     menuentry("Kill",           "WClientWin.kill(_sub)",
                                 "_sub:WClientWin"),
+    menuentry("De/reattach",    "ioncore.detach(_sub, 'toggle')", 
+                                "_sub:non-nil"),
     menuentry("Toggle tag",     "WRegion.set_tagged(_sub, 'toggle')",
                                 "_sub:non-nil"),
     menuentry("Attach tagged",  "WFrame.attach_tagged(_)"),
@@ -367,11 +376,9 @@ defctxmenu("WFrame", "Frame", {
 })
 
 
--- Context menu for screens
-defctxmenu("WScreen", "Screen", {
-    menuentry("New workspace",  "ioncore.create_ws(_)"),
-    menuentry("New empty workspace",
-                                "ioncore.create_ws(_, nil, true)"),
-    menuentry("Close workspace","WRegion.rqclose(_sub)"),
+-- Context menu for workspaces
+defctxmenu("WGroupWS", "Workspace", {
+    menuentry("Close",          "WRegion.rqclose(_)"),
+    menuentry("Rename",         "mod_query.query_renameworkspace(nil, _)"),
 })
 
diff --git a/etc/cfg_layouts.lua b/etc/cfg_layouts.lua
new file mode 100644 (file)
index 0000000..4299c76
--- /dev/null
@@ -0,0 +1,55 @@
+--
+-- Layouts for Ion
+--
+
+local a_frame = {
+    type="WSplitRegion",
+    regparams = {
+        type = "WFrame", 
+        frame_style = "frame-tiled"
+    }
+}
+
+
+local horizontally_split = {
+    -- Destroy workspace if the 'bottom' tiling is destroyed last
+    bottom_last_close = true,
+    -- Layout
+    managed = {
+        {
+            type = "WTiling",
+            bottom = true,
+            -- The default is a single 1:1 horizontal split
+            split_tree = {
+                type = "WSplitSplit",
+                dir = "horizontal",
+                tls = 1,
+                brs = 1,
+                tl = a_frame,
+                br = a_frame
+            }
+            -- For a single frame
+            --split_tree = nil
+        }
+    }
+}
+
+
+local full_tiled = {
+    -- Destroy workspace if the 'bottom' tiling is destroyed last
+    bottom_last_close = true,
+    -- Layout
+    managed = {
+        {
+            type = "WTiling",
+            bottom = true,
+        }
+    }
+}
+
+
+-- Let the world know about them
+
+ioncore.deflayout("default", horizontally_split)
+ioncore.deflayout("hsplit", horizontally_split)
+ioncore.deflayout("full", full_tiled)
index ccbfb701d8ddd8466c9d39fcf24208175b308b6d..7128f1592549798ef903b1cace11b0d6628ecf10 100644 (file)
@@ -5,7 +5,9 @@
 dopath("mod_query")
 dopath("mod_menu")
 dopath("mod_tiling")
---dopath("mod_panews")
 dopath("mod_statusbar")
 --dopath("mod_dock")
 dopath("mod_sp")
+
+-- Load some layouts
+dopath("cfg_layouts")
diff --git a/etc/cfg_panews.lua b/etc/cfg_panews.lua
deleted file mode 100644 (file)
index 65761a0..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
---
--- Ion panews module configuration file
---
-
--- Bindings for unused area. 
-
-defbindings("WUnusedWin", {
-    bdoc("Begin move/resize mode."),
-    kpress(META.."R", "WUnusedWin.begin_kbresize(_)"),
-    
-    bdoc("Resize the area."),
-    mdrag(META.."Button3", "WUnusedWin.p_resize(_)"),
-    mdrag(META.."Button1", "WUnusedWin.p_move(_)"),
-})
-
-
-mod_panews.set{ 
-    -- Layout template may be one of default|alternative1|alternative2 
-    -- or a template table. (The one for 'default' is reproduced below
-    -- as an example.)
-    --template="default",
-    -- The scale factor parameter controls the size-based classification 
-    -- heuristic. The default of 1.0 is designed for 1280x1024 at 75dpi.
-    --scalef=1.0,
-}
-
-
--- The layout template for the 'default' layout looks as follows.
---[[
-{
-    type="WSplitFloat",
-    dir="horizontal",
-    tls=settings.b_ratio,
-    brs=settings.s_ratio,
-    tl={
-        type="WSplitPane",
-        contents={
-            type="WSplitFloat",
-            dir="vertical",
-            tls=settings.b_ratio2,
-            brs=settings.s_ratio2,
-            tl={
-                type="WSplitPane",
-                marker="V:single",
-            },
-            br={
-                type="WSplitPane",
-                marker="M:right",
-            },
-        },
-    },
-    br={
-        type="WSplitPane",
-        marker="T:up",
-    },
-}
---]]
index 0225d3a472ab2c4bcc3616b22821981ad66206e6..b07178e66f66a4b80e868cd31feaf69369e6fcc2 100644 (file)
@@ -26,22 +26,6 @@ defbindings("WTiling", {
 
 -- Frame bindings
 
-defbindings("WFrame.tiled", {
-    submap(META.."K", {
-        bdoc("Detach window from tiled frame"),
-        kpress("D", "mod_tiling.detach(_sub)", "_sub:non-nil"),
-    }),
-})
-
-
-defbindings("WFrame.transient", {
-    submap(META.."K", {
-        bdoc("Detach transient frame"),
-        kpress("D", "mod_tiling.detach(_)", "_sub:non-nil"),
-    }),
-})
-
-
 defbindings("WFrame.floating", {
     submap(META.."K", {
         bdoc("Tile frame, if no tiling exists on the workspace"),
@@ -86,21 +70,6 @@ defctxmenu("WTiling", "Tiling", {
 })
 
 
--- Context menu entries for tiled frames.
-
-defctxmenu("WFrame.tiled", "Tiled frame", {
-    menuentry("Detach window", "mod_tiling.detach(_sub)", "_sub:non-nil"),
-})
-
-
--- Context menu entries for transient frames.
-
-defctxmenu("WFrame.transient", "Transient frame", {
-    append=true,
-    menuentry("Detach", "mod_tiling.detach(_)", "_sub:non-nil"),
-})
-
-
 -- Extra context menu extra entries for floatframes. 
 
 defctxmenu("WFrame.floating", "Floating frame", {
@@ -108,39 +77,3 @@ defctxmenu("WFrame.floating", "Floating frame", {
     menuentry("New tiling", "mod_tiling.mkbottom(_)"),
 })
 
-
--- Adjust default workspace layout
-
-local a_frame = {
-    type="WSplitRegion",
-    regparams = {
-        type = "WFrame", 
-        frame_style = "frame-tiled"
-    }
-}
-    
-ioncore.set{
-    default_ws_params = {
-        -- Destroy workspace if the 'bottom' tiling is destroyed last
-        bottom_last_close = true,
-        -- Layout
-        managed = {
-            {
-                type = "WTiling",
-                bottom = true,
-                -- The default is a single 1:1 horizontal split
-                split_tree = {
-                    type = "WSplitSplit",
-                    dir = "horizontal",
-                    tls = 1,
-                    brs = 1,
-                    tl = a_frame,
-                    br = a_frame
-                }
-                -- For a single frame
-                --split_tree = nil
-            }
-        }
-    }
-}
-
index 221c5f567858136cb8f88a5b104ed5b6c51ae2f4..5aa488e2a2046c4ec1d29605aad91a6ac0e60aee 100644 (file)
@@ -59,18 +59,6 @@ de.defstyle("tab", {
     text_align = "center",
 })
 
-de.defstyle("tab-menuentry", {
-    based_on = "tab",
-    text_align = "left",
-    highlight_pixels = 0,
-    shadow_pixels = 0,
-})
-
-de.defstyle("tab-menuentry-big", {
-    based_on = "tab-menuentry",
-    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
-    padding_pixels = 7,
-})
 
 de.defstyle("input", {
     based_on = "*",
index 7da34a9798b9a1ede95ac63145a845e1520288c8..a95cbf3873397e84bcd1a79a91624c6ee9d0b6c5 100644 (file)
@@ -17,18 +17,6 @@ de.defstyle("*", {
     text_align = "center",
 })
 
-de.defstyle("frame", {
-    based_on = "*",
-    padding_colour = "#545d75",
-    background_colour = "black",
-    de.substyle("active", {
-        shadow_colour = "grey",
-        highlight_colour = "grey",
-        padding_colour = "#545d75",
-        background_colour = "black",
-    }),
-})
-
 de.defstyle("tab", {
     based_on = "*",
     font = "-misc-fixed-medium-r-*-*-13-*-*-*-*-60-*-*",
@@ -59,22 +47,6 @@ de.defstyle("tab", {
     text_align = "center",
 })
 
-de.defstyle("tab-menuentry", {
-    based_on = "tab",
-    text_align = "left",
-    de.substyle("inactive-selected", {
-        shadow_colour = "grey",
-        highlight_colour = "grey",
-        background_colour = "#8a999e",
-        foreground_colour = "grey",
-    }),
-})
-
-de.defstyle("tab-menuentry-big", {
-    based_on = "tab-menuentry",
-    padding_pixels = 7,
-})
-
 de.defstyle("input", {
     based_on = "*",
     shadow_colour = "grey",
@@ -98,5 +70,10 @@ de.defstyle("input", {
 
 dopath("lookcommon_clean")
 
+de.defstyle("tab-menuentry-big", {
+    based_on = "tab-menuentry",
+    padding_pixels = 7,
+})
+
 gr.refresh()
 
index 6a70546dee62b69a2dae6b5356776b512487bf02..3c11bc8d106b32b4b1625d4b44f370279a097d09 100644 (file)
@@ -18,13 +18,6 @@ de.defstyle("*", {
     text_align = "center",
 })
 
-de.defstyle("frame", {
-    based_on = "*",
-    padding_colour = "#d8d8d8",
-    background_colour = "#000000",
-    transparent_background = false,
-})
-
 de.defstyle("tab", {
     based_on = "*",
     font = "-*-helvetica-bold-r-normal-*-10-*-*-*-*-*-*-*",
@@ -55,18 +48,6 @@ de.defstyle("tab", {
     text_align = "center",
 })
 
-de.defstyle("tab-menuentry", {
-    based_on = "tab",
-    text_align = "left",
-    spacing = 1,
-})
-
-de.defstyle("tab-menuentry-big", {
-    based_on = "tab-menuentry",
-    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
-    padding_pixels = 7,
-})
-
 de.defstyle("input-edln", {
     based_on = "*",
     de.substyle("*-cursor", {
@@ -81,5 +62,11 @@ de.defstyle("input-edln", {
 
 dopath("lookcommon_clean")
 
+de.defstyle("tab-menuentry-big", {
+    based_on = "tab-menuentry",
+    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
+    padding_pixels = 7,
+})
+
 gr.refresh()
 
index 32dce5001f7735f0391d6cd55152670667a7cb62..70e8acce664f39572089bcfad8e34fbedce2daaf 100644 (file)
@@ -29,14 +29,6 @@ de.defstyle("*", {
 })
 
 
-de.defstyle("frame", {
-    based_on = "*",
-    padding_colour = "#aaaaaa",
-    background_colour = "#000000",
-    transparent_background = false,
-})
-
-
 de.defstyle("tab", {
     based_on = "*",
     font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",
@@ -59,20 +51,6 @@ de.defstyle("tab", {
 })
 
 
-de.defstyle("tab-menuentry", {
-    based_on = "tab",
-    text_align = "left",
-    spacing = 1,
-})
-
-
-de.defstyle("tab-menuentry-big", {
-    based_on = "tab-menuentry",
-    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
-    padding_pixels = 7,
-})
-
-
 de.defstyle("input", {
     based_on = "*",
     text_align = "left",
@@ -94,7 +72,16 @@ de.defstyle("input", {
     }),
 })
 
+
 dopath("lookcommon_clean")
+
+
+de.defstyle("tab-menuentry-big", {
+    based_on = "tab-menuentry",
+    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
+    padding_pixels = 7,
+})
+
     
 -- Refresh objects' brushes.
 gr.refresh()
index 5effeee6ec96f8862079986fbe5b07729a92acfd..4387e9d8ab548b030b43bc70b0354fa98768425e 100644 (file)
@@ -59,19 +59,6 @@ de.defstyle("tab", {
     text_align = "center",
 })
 
-de.defstyle("tab-menuentry", {
-    based_on = "tab",
-    text_align = "left",
-    highlight_pixels = 0,
-    shadow_pixels = 0,
-})
-
-de.defstyle("tab-menuentry-big", {
-    based_on = "tab-menuentry",
-    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
-    padding_pixels = 7,
-})
-
 de.defstyle("input", {
     based_on = "*",
     shadow_colour = "#404040",
index ec15a78faf024cd2de05e982a1d4418127fb2b92..43dafee90116a4f9935e1e01eacf5591d9ab83fd 100644 (file)
@@ -59,19 +59,6 @@ de.defstyle("tab", {
     text_align = "center",
 })
 
-de.defstyle("tab-menuentry", {
-    based_on = "tab",
-    text_align = "left",
-    highlight_pixels = 0,
-    shadow_pixels = 0,
-})
-
-de.defstyle("tab-menuentry-big", {
-    based_on = "tab-menuentry",
-    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
-    padding_pixels = 7,
-})
-
 de.defstyle("input", {
     based_on = "*",
     shadow_colour = "#777777",
index 4b8f4da0768aa1099a99e6c7edd69a94a2bad493..85afceb1d2f4187c14ffc97da9f1d31ef9e1a355 100644 (file)
@@ -65,19 +65,6 @@ de.defstyle("tab", {
     text_align = "center",
 })
 
-de.defstyle("tab-menuentry", {
-    based_on = "tab",
-    text_align = "left",
-    highlight_pixels = 0,
-    shadow_pixels = 0,
-})
-
-de.defstyle("tab-menuentry-big", {
-    based_on = "tab-menuentry",
-    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
-    padding_pixels = 7,
-})
-
 de.defstyle("input", {
     based_on = "*",
     shadow_colour = "#606060",
index 0773f7abe4837ecd1d98bf29180d0f6722ff2882..2c378529142fb304543d89ec3240cf06a19f4ec7 100644 (file)
@@ -42,7 +42,7 @@ de.defstyle("tab", {
         shadow_colour = "black",
         highlight_colour = "black",
         background_colour = "#3f3f3f",
-        foreground_colour = "#9f9f9f",
+        foreground_colour = "#bfbfbf",
     }),
     de.substyle("active-unselected", {
         shadow_colour = "black",
@@ -53,8 +53,8 @@ de.defstyle("tab", {
     de.substyle("inactive-selected", {
         shadow_colour = "black",
         highlight_colour = "black",
-        background_colour = "#0f1f4f",
-        foreground_colour = "#9f9f9f",
+        background_colour = "#1f2f4f",
+        foreground_colour = "#bfbfbf",
     }),
     de.substyle("inactive-unselected", {
         shadow_colour = "black",
@@ -106,6 +106,11 @@ de.defstyle("input", {
     }),
 })
 
+de.defstyle("input-menu", {
+    based_on = "input",
+    padding_pixels=0,
+})
+
 dopath("lookcommon_clean")
 
 gr.refresh()
index cfb059ad7ab70cc50662597fb0d812cb4c1f9ae8..de0efa2323e29f2749b660dab4e1b9700d3f19ed 100644 (file)
@@ -20,20 +20,31 @@ de.defstyle("stdisp", {
 
 de.defstyle("actnotify", {
     based_on = "*",
-    shadow_colour = "#e0c0c0",
-    highlight_colour = "#e0c0c0",
-    background_colour = "#990000",
+    shadow_colour = "#c04040",
+    highlight_colour = "#c04040",
+    background_colour = "#901010",
     foreground_colour = "#eeeeee",
 })
 
 de.defstyle("tab-frame", {
     based_on = "tab",
-    de.substyle("*-*-*-*-activity", {
-        shadow_colour = "#e0c0c0",
-        highlight_colour = "#e0c0c0",
-        background_colour = "#990000",
+    -- TODO: some kind of amend option. It should not be necessary to 
+    -- duplicate this definition for both tab-frame and tab-menuentry,
+    -- or for each style, nor use more complex hacks to communicate
+    -- this stuff otherwise.
+    de.substyle("*-*-*-unselected-activity", {
+        shadow_colour = "#c04040",
+        highlight_colour = "#c04040",
+        background_colour = "#901010",
         foreground_colour = "#eeeeee",
     }),
+    
+    de.substyle("*-*-*-selected-activity", {
+        shadow_colour = "#c04040",
+        highlight_colour = "#c04040",
+        background_colour = "#b03030",
+        foreground_colour = "#ffffff",
+    }),
 })
 
 de.defstyle("tab-frame-tiled", {
@@ -41,11 +52,40 @@ de.defstyle("tab-frame-tiled", {
     spacing = 1,
 })
 
+de.defstyle("tab-menuentry", {
+    based_on = "tab",
+    text_align = "left",
+    
+    de.substyle("*-*-*-unselected-activity", {
+        shadow_colour = "#c04040",
+        highlight_colour = "#c04040",
+        background_colour = "#901010",
+        foreground_colour = "#eeeeee",
+    }),
+    
+    de.substyle("*-*-*-selected-activity", {
+        shadow_colour = "#c04040",
+        highlight_colour = "#c04040",
+        background_colour = "#b03030",
+        foreground_colour = "#ffffff",
+    }),
+})
+
+de.defstyle("frame", {
+    based_on = "*",
+    background_colour = "#000000",
+    transparent_background = false,
+    de.substyle("quasiactive", {
+        -- Something detached from the frame is active
+        padding_colour = "#901010",
+    }),
+})
+
 de.defstyle("frame-tiled", {
     based_on = "frame",
     shadow_pixels = 0,
     highlight_pixels = 0,
-    padding_pixels = 0,
+    padding_pixels = 1,
     spacing = 1,
 })
 
@@ -56,5 +96,6 @@ de.defstyle("frame-tiled-alt", {
 
 de.defstyle("frame-floating", {
     based_on = "frame",
-    bar = "shaped"
+    bar = "shaped",
+    padding_pixels = 0,
 })
index 4c558e1d236baed28da194f3726bf6ea258551d2..1d771c13dae7f15e8e4df08ddb7f261728fc9b74 100644 (file)
@@ -17,20 +17,31 @@ de.defstyle("stdisp", {
 
 de.defstyle("actnotify", {
     based_on = "*",
-    shadow_colour = "#401010",
-    highlight_colour = "#eec0c0",
-    background_colour = "#990000",
-    foreground_colour = "#eeeeee",
+    shadow_colour = "#600808",
+    highlight_colour = "#c04040",
+    background_colour = "#b03030",
+    foreground_colour = "#ffffff",
 })
 
 de.defstyle("tab-frame", {
     based_on = "tab",
-    de.substyle("*-*-*-*-activity", {
-        shadow_colour = "#401010",
-        highlight_colour = "#eec0c0",
-        background_colour = "#990000",
+    -- TODO: some kind of amend option. It should not be necessary to 
+    -- duplicate this definition for both tab-frame and tab-menuentry,
+    -- or for each style, nor use more complex hacks to communicate
+    -- this stuff otherwise.
+    de.substyle("*-*-*-unselected-activity", {
+        shadow_colour = "#600808",
+        highlight_colour = "#c04040",
+        background_colour = "#901010",
         foreground_colour = "#eeeeee",
     }),
+    
+    de.substyle("*-*-*-selected-activity", {
+        shadow_colour = "#600808",
+        highlight_colour = "#c04040",
+        background_colour = "#b03030",
+        foreground_colour = "#ffffff",
+    }),
 })
 
 de.defstyle("tab-frame-tiled", {
@@ -55,3 +66,30 @@ de.defstyle("frame-tiled-alt", {
     based_on = "frame-tiled",
     bar = "none",
 })
+
+de.defstyle("tab-menuentry", {
+    based_on = "tab",
+    text_align = "left",
+    highlight_pixels = 0,
+    shadow_pixels = 0,
+    
+    de.substyle("*-*-*-unselected-activity", {
+        shadow_colour = "#600808",
+        highlight_colour = "#c04040",
+        background_colour = "#901010",
+        foreground_colour = "#eeeeee",
+    }),
+    
+    de.substyle("*-*-*-selected-activity", {
+        shadow_colour = "#600808",
+        highlight_colour = "#c04040",
+        background_colour = "#b03030",
+        foreground_colour = "#ffffff",
+    }),
+})
+
+de.defstyle("tab-menuentry-big", {
+    based_on = "tab-menuentry",
+    font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
+    padding_pixels = 7,
+})
index d04e47fb8d174b491da172219e2e0ac6a4b777ec..43c91871cce000ab413f494469b112bfcd1dd487 100644 (file)
@@ -1,5 +1,5 @@
 
 Context:
 
-[TAG ion-3ds-20061223
-Tuomo Valkonen <tuomov@iki.fi>**20061223145904
+[TAG ion-3ds-20070203
+Tuomo Valkonen <tuomov@iki.fi>**20070203145039
index a79fa9f16672b7943073788c97855456876ff330..823ab7ffc99a4175ef3f179205fb192e8bfef64d 100644 (file)
@@ -19,7 +19,7 @@ INCLUDES += $(X11_INCLUDES)
 INCLUDES += $(LIBMAINLOOP_INCLUDES) $(LIBTU_INCLUDES) $(LIBEXTL_INCLUDES)
 INCLUDES += -I..
 
-LIBS += $(X11_LIBS) $(XINERAMA_LIBS)
+LIBS += $(X11_LIBS)
 LIBS += $(WHOLEA) $(LIBMAINLOOP_LIBS) $(LIBEXTL_LIBS) $(LIBTU_LIBS) $(NO_WHOLEA)
 LIBS += $(LUA_LIBS) $(DL_LIBS)
 LIBS += -lm
index 93a59776a7ef8a5b7fcd4a5e0d9cda17388a0430..1c7fcf97dcda3faca0591fb6794cea169907453c 100644 (file)
--- a/ion/ion.c
+++ b/ion/ion.c
@@ -1,7 +1,7 @@
 /*
  * ion/ion/ion.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -48,16 +48,8 @@ static OptParserOpt ion_opts[]={
      DUMMY_TR("Add directory to search path")},
 
     {OPT_ID('o'), "oneroot",  0, NULL,
-     DUMMY_TR("Manage default root window/non-Xinerama screen only")},
+     DUMMY_TR("Manage default screen only")},
 
-#if defined(CF_XINERAMA) || defined(CF_SUN_XINERAMA)
-    {OPT_ID('x'), "xinerama", OPT_ARG, "1|0", 
-     DUMMY_TR("Use Xinerama screen information (default: 1/yes)")},
-#else
-    {OPT_ID('x'), "xinerama", OPT_ARG, "?", 
-     DUMMY_TR("Ignored: not compiled with Xinerama support")},
-#endif
-    
     {OPT_ID('s'), "session",  OPT_ARG, "session_name", 
      DUMMY_TR("Name of session (affects savefiles)")},
     
@@ -189,17 +181,6 @@ int main(int argc, char*argv[])
         case OPT_ID('o'):
             stflags|=IONCORE_STARTUP_ONEROOT;
             break;
-        case OPT_ID('x'):
-            {
-                const char *p=optparser_get_arg();
-                if(strcmp(p, "1")==0)
-                    stflags&=~IONCORE_STARTUP_NOXINERAMA;
-                else if(strcmp(p, "0")==0)
-                    stflags|=IONCORE_STARTUP_NOXINERAMA;
-                else
-                    warn(TR("Invalid parameter to -xinerama."));
-            }
-            break;
         case OPT_ID('s'):
             extl_set_sessiondir(optparser_get_arg());
             break;
index c0bd8d90eec7ba84439b2c5646f9918ad3630b2a..c98fc614e06dd833bbd5bd7c967d0b41ff392e79 100644 (file)
@@ -23,7 +23,8 @@ SOURCES=binding.c conf-bindings.c cursor.c event.c exec.c focus.c         \
        kbresize.c rectangle.c xwindow.c presize.c extlrx.c               \
         pholder.c mplexpholder.c llist.c basicpholder.c sizepolicy.c      \
         stacking.c group.c grouppholder.c group-cw.c navi.c              \
-        group-ws.c float-placement.c groupedpholder.c framedpholder.c
+        group-ws.c float-placement.c groupedpholder.c framedpholder.c    \
+        return.c detach.c
 
 LUA_SOURCES=\
        ioncore_ext.lua ioncore_luaext.lua ioncore_bindings.lua \
index 0f7b7a6e6e3501d3c262e7d11b79dc0871ba12bf..668d10a95f6bf824a2e579174a5dfbbbbb1435f4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/activity.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -32,7 +32,7 @@ void region_mark_mgd_activity(WRegion *mgr)
     mgr->mgd_activity++;
     
     if(!mgr_marked){
-        region_notify_change(mgr, "sub-activity");
+        region_notify_change(mgr, ioncore_g.notifies.sub_activity);
         region_mark_mgd_activity(REGION_MANAGER(mgr));
     }
 }
@@ -46,7 +46,7 @@ void region_clear_mgd_activity(WRegion *mgr)
     mgr->mgd_activity=maxof(0, mgr->mgd_activity-1);
     
     if(!region_is_activity_r(mgr)){
-        region_notify_change(mgr, "sub-activity");
+        region_notify_change(mgr, ioncore_g.notifies.sub_activity);
         region_clear_mgd_activity(REGION_MANAGER(mgr));
     }
 }
@@ -89,7 +89,7 @@ bool region_set_activity(WRegion *reg, int sp)
             propagate_clear(reg);
     }
     
-    region_notify_change(reg, "activity");
+    region_notify_change(reg, ioncore_g.notifies.activity);
     
     return nset;
 }
@@ -124,22 +124,15 @@ bool region_is_activity_r(WRegion *reg)
 
 
 /*EXTL_DOC
- * Return list of regions with activity/urgency bit set.
+ * Iterate over activity list until \var{iterfn} returns \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT
-ExtlTab ioncore_activity_list()
+bool ioncore_activity_i(ExtlFn iterfn)
 {
-    ExtlTab t=extl_create_table();
-    ObjListIterTmp tmp;
-    Obj *obj;
-    int i=1;
-    
-    FOR_ALL_ON_OBJLIST(Obj*, obj, actlist, tmp){
-        extl_table_seti_o(t, i, obj);
-    }
-    
-    return t;
+    return extl_iter_objlist(iterfn, actlist);
 }
 
 
index 912e8832d0c3b5d69e52d2c09e6fd847a110219c..5971a6c10f000e1cc8e7dc42f21342340325af53 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/activity.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -24,7 +24,7 @@ extern bool region_is_activity_r(WRegion *reg);
 extern void region_mark_mgd_activity(WRegion *mgr);
 extern void region_clear_mgd_activity(WRegion *mgr);
 
-extern ExtlTab ioncore_activity_list();
+extern bool ioncore_activity_i(ExtlFn fn);
 extern WRegion *ioncore_activity_first();
 extern bool ioncore_goto_activity();
 
index 23004cb143bbdaf284780ad5735c72439456208a..4eeb64e65dc184cc6303c5a7127e1b4a0ff0a05b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/attach.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -35,7 +35,7 @@ static WRegion *doit_new(WRegion *mgr,
     
     if(reg==NULL)
         return NULL;
-    
+        
     if(!cont(mgr, reg, cont_param)){
         destroy_obj((Obj*)reg);
         return NULL;
@@ -90,21 +90,31 @@ static WRegion *wrap_load(WWindow *par, const WFitParams *fp,
 }
 
 
+WRegion *ioncore_newly_created=NULL;
+
+
 static WRegion *doit_load(WRegion *mgr,
                           WWindow *par, const WFitParams *fp,
                           WRegionDoAttachFn *cont, void *cont_param,
                           ExtlTab tab)
 {
-    WRegion *reg;
+    WRegion *reg=NULL;
     
     if(extl_table_gets_o(tab, "reg", (Obj**)&reg)){
         if(!OBJ_IS(reg, WRegion))
             return FALSE;
+    }/*else if(extl_table_is_bool_set(tab, "reg_use_new")){
+        reg=ioncore_newly_created;
+        if(reg==NULL)
+            return NULL;
+    }*/
+    
+    if(reg!=NULL){
         return doit_reparent(mgr, par, fp, cont, cont_param, reg);
+    }else{
+        return doit_new(mgr, par, fp, cont, cont_param,
+                        (WRegionCreateFn*)wrap_load, &tab);
     }
-    
-    return doit_new(mgr, par, fp, cont, cont_param,
-                    (WRegionCreateFn*)wrap_load, &tab);
 }
 
 WRegion *region_attach_helper(WRegion *mgr,
index 9183ee2c929725cba430304c28c18c27c69009d6..8fb94d8712d1f380183cd9d780a4c2628d53fd70 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/attach.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -56,4 +56,5 @@ extern WRegion *region_attach_helper(WRegion *mgr,
 
 extern bool region_attach_reparent_check(WRegion *mgr, WRegion *reg);
 
+
 #endif /* ION_IONCORE_ATTACH_H */
index b8b2e964dffb491d818a85e3af04475a98fb73bd..d5c85a4fca897ae7404d2d05c49d1ce86881daf5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/basicpholder.c
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
index 5008537cabd065c5252883a224ae6514a71e6b33..6b0df42c34455f43a8c9c385fdf6b9eda12c12e1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/basicpholder.h
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
index 4d03abdb0d987d39f7ce9a1afd900d68392a7e1b..7b80d111776d7572a29d9d8afc7784b2dd17badd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/binding.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 8e13d34e8da11cb62462862df84f7bffdaf84dd9..a776a64f92dc57f3ae2a588dc4734e9a5f6c4df3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/binding.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index dd4a1d041f3c3c991fa2dc61db196f68fd943259..9c6bd4689b0483cd7de598508b9049a899c0c616 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/bindmaps.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -23,7 +23,7 @@
  */
 
 
-WBindmap *ioncore_rootwin_bindmap=NULL;
+WBindmap *ioncore_screen_bindmap=NULL;
 WBindmap *ioncore_mplex_bindmap=NULL;
 WBindmap *ioncore_mplex_toplevel_bindmap=NULL;
 WBindmap *ioncore_frame_bindmap=NULL;
@@ -56,7 +56,7 @@ static StringIntMap frame_areas[]={
 
 void ioncore_deinit_bindmaps()
 {
-    DO_FREE(rootwin, "WScreen");
+    DO_FREE(screen, "WScreen");
     DO_FREE(mplex, "WMPlex");
     DO_FREE(mplex_toplevel, "WMPlex.toplevel");
     DO_FREE(frame, "WFrame");
@@ -86,7 +86,7 @@ bool ioncore_init_bindmaps()
     if(known_bindmaps==NULL)
         return FALSE;
     
-    DO_ALLOC(rootwin, "WScreen", NULL);
+    DO_ALLOC(screen, "WScreen", NULL);
     DO_ALLOC(mplex, "WMPlex", NULL);
     DO_ALLOC(mplex_toplevel, "WMPlex.toplevel", NULL);
     DO_ALLOC(frame, "WFrame", frame_areas);
index bef0ae08b4e4edd2a6a76a9b8d3b8b924407666d..441aabbf02764c6668cbf072ec9e8d000465c8ed 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/bindmaps.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -15,7 +15,7 @@
 #ifndef ION_IONCORE_BINDMAP_H
 #define ION_IONCORE_BINDMAP_H
 
-extern WBindmap *ioncore_rootwin_bindmap;
+extern WBindmap *ioncore_screen_bindmap;
 extern WBindmap *ioncore_mplex_bindmap;
 extern WBindmap *ioncore_mplex_toplevel_bindmap;
 extern WBindmap *ioncore_frame_bindmap;
index c990b14e7f5adef2c5e1dc110100097fb79e1176..3836bc77930cef9d39b67b534a86c6756985d398 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/classes.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -33,6 +33,7 @@ INTRCLASS(WGroupWS);
 
 INTRCLASS(WPHolder);
 INTRCLASS(WMPlexPHolder);
+INTRCLASS(WFramedPHolder);
 
 INTRSTRUCT(WStacking);
 INTRSTRUCT(WLListNode);
index 4b4dbe4a56ab4011a5f28071b9d3a423e0f00855..d80c37b8c73c86395d7879f6d06212f73f47eb2a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/clientwin.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -41,6 +41,8 @@
 #include "netwm.h"
 #include "xwindow.h"
 #include "bindmaps.h"
+#include "return.h"
+#include "conf.h"
 
 
 static void set_clientwin_state(WClientWin *cwin, int state);
@@ -78,22 +80,6 @@ void clientwin_get_protocols(WClientWin *cwin)
 }
 
 
-static bool get_winprop_fn_set=FALSE;
-static ExtlFn get_winprop_fn;
-
-/*EXTL_DOC
- * Set function used to look up winprops.
- */
-EXTL_EXPORT
-void ioncore_set_get_winprop_fn(ExtlFn fn)
-{
-    if(get_winprop_fn_set)
-        extl_unref_fn(get_winprop_fn);
-    get_winprop_fn=extl_ref_fn(fn);
-    get_winprop_fn_set=TRUE;
-}
-
-
 static WSizePolicy get_sizepolicy_winprop(WClientWin *cwin,
                                           const char *propname,
                                           WSizePolicy value)
@@ -118,17 +104,8 @@ static void clientwin_get_winprops(WClientWin *cwin)
 {
     ExtlTab tab, tab2;
     int i1, i2;
-    bool ret;
     
-    if(!get_winprop_fn_set)
-        return;
-    
-    extl_protect(NULL);
-    ret=extl_call(get_winprop_fn, "o", "t", cwin, &tab);
-    extl_unprotect(NULL);
-
-    if(!ret)
-        return;
+    tab=ioncore_get_winprop(cwin);
     
     cwin->proptab=tab;
     
@@ -346,8 +323,6 @@ static bool clientwin_init(WClientWin *cwin, WWindow *par, Window win,
     cwin->n_cmapwins=0;
     cwin->event_mask=IONCORE_EVENTMASK_CLIENTWIN;
 
-    cwin->fs_pholder=NULL;
-
     region_init(&(cwin->region), par, &fp);
 
     cwin->region.flags|=REGION_GRAB_ON_PARENT;
@@ -376,26 +351,6 @@ static WClientWin *create_clientwin(WWindow *par, Window win,
 }
 
 
-static bool handle_target_prop(WClientWin *cwin, const WManageParams *param)
-{
-    WRegion *r=NULL;
-    char *target_name=NULL;
-    
-    if(extl_table_gets_s(cwin->proptab, "target", &target_name)){
-        r=ioncore_lookup_region(target_name, NULL);
-        
-        free(target_name);
-    
-        if(r!=NULL){
-            if(region_manage_clientwin(r, cwin, param, 
-                                       MANAGE_REDIR_PREFER_NO))
-                return TRUE;
-        }
-    }
-    
-    return FALSE;
-}
-
 
 WClientWin *clientwin_get_transient_for(const WClientWin *cwin)
 {
@@ -484,6 +439,7 @@ WClientWin* ioncore_manage_clientwin(Window win, bool maprq)
     XWMHints *hints;
     int init_state=NormalState;
     WManageParams param=MANAGEPARAMS_INIT;
+    void *mrshpm[2];
 
     param.dockapp=FALSE;
     
@@ -581,21 +537,14 @@ again:
                                   FALSE);
     }
 
-    if(!handle_target_prop(cwin, &param)){
-        bool managed;
-        void *mrshpm[2];
-        
-        mrshpm[0]=cwin;
-        mrshpm[1]=&param;
+    mrshpm[0]=cwin;
+    mrshpm[1]=&param;
         
-        managed=hook_call_alt(clientwin_do_manage_alt, &mrshpm, 
-                              (WHookMarshall*)do_manage_mrsh,
-                              (WHookMarshallExtl*)do_manage_mrsh_extl);
-
-        if(!managed){
-            warn(TR("Unable to manage client window %#x."), win);
-            goto failure;
-        }
+    if(!hook_call_alt(clientwin_do_manage_alt, &mrshpm, 
+                      (WHookMarshall*)do_manage_mrsh,
+                      (WHookMarshallExtl*)do_manage_mrsh_extl)){
+        warn(TR("Unable to manage client window %#x."), win);
+        goto failure;
     }
     
     if(ioncore_g.opmode==IONCORE_OPMODE_NORMAL &&
@@ -604,7 +553,6 @@ again:
         region_set_activity((WRegion*)cwin, SETPARAM_SET);
     }
     
-    
     if(postmanage_check(cwin, &attr)){
         if(param.jumpto && ioncore_g.focus_next==NULL)
             region_goto((WRegion*)cwin);
@@ -696,6 +644,8 @@ void clientwin_deinit(WClientWin *cwin)
     WRegion *reg;
     
     if(cwin->win!=None){
+        region_pointer_focus_hack(&cwin->region);
+
         xwindow_unmanaged_selectinput(cwin->win, 0);
         XUnmapWindow(ioncore_g.dpy, cwin->win);
         
@@ -721,12 +671,6 @@ void clientwin_deinit(WClientWin *cwin)
     
     clientwin_clear_colormaps(cwin);
     
-    if(cwin->fs_pholder!=NULL){
-        WPHolder *ph=cwin->fs_pholder;
-        cwin->fs_pholder=NULL;
-        destroy_obj((Obj*)ph);
-    }
-    
     region_deinit((WRegion*)cwin);
 }
 
@@ -747,12 +691,7 @@ static bool mrsh_u_extl(ExtlFn fn, void *param)
 
 static void clientwin_do_unmapped(WClientWin *cwin, Window win)
 {
-    bool mcf=region_may_control_focus((WRegion*)cwin);
-
-    if(mcf && cwin->fs_pholder!=NULL)
-        pholder_goto(cwin->fs_pholder);
-    
-    destroy_obj((Obj*)cwin);
+    region_dispose_((WRegion*)cwin);
     
     hook_call(clientwin_unmapped_hook, &win, mrsh_u_c, mrsh_u_extl);
 }
@@ -843,6 +782,8 @@ static void set_clientwin_state(WClientWin *cwin, int state)
 
 static void hide_clientwin(WClientWin *cwin)
 {
+    region_pointer_focus_hack(&cwin->region);
+
     if(cwin->flags&CLIENTWIN_PROP_ACROBATIC){
         XMoveWindow(ioncore_g.dpy, cwin->win,
                     -2*REGION_GEOM(cwin).w, -2*REGION_GEOM(cwin).h);
@@ -981,15 +922,8 @@ static bool clientwin_fitrep(WClientWin *cwin, WWindow *np,
         region_set_parent((WRegion*)cwin, np);
         sendconfig_clientwin(cwin);
         
-        if(!REGION_IS_FULLSCREEN(cwin) && cwin->fs_pholder!=NULL){
-            WPHolder *ph=cwin->fs_pholder;
-            cwin->fs_pholder=NULL;
+        if(!REGION_IS_FULLSCREEN(cwin))
             cwin->flags&=~CLIENTWIN_FS_RQ;
-            /* Can't destroy it yet - messes up mplex placeholder
-             * reorganisation.
-             */
-            mainloop_defer_destroy((Obj*)ph);
-        }
 
         netwm_update_state(cwin);
     }
index 2080d3db33ee5191d035d6870979034d6cc35ef3..f78e8261b6055b982df07c6e623c153c7e7ca56d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/clientwin.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -58,8 +58,6 @@ DECLCLASS(WClientWin){
 
     XSizeHints size_hints;
     
-    WPHolder *fs_pholder;
-    
     ExtlTab proptab;
 };
 
index 83c3b755fcecc37a9a62241b836c30b11687a7e0..564336da11a000c0bdcfaf010269c8b216d57cc1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/colormap.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index b44f7fdbd4dbb581e0e4be7326f3dbecfce16bbe..143f1ec2646baaa80e382517532bc4d634ce1ffd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/colormap.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 4959a5b1f7d6eae42d1f53a3aec04d68c233e2e0..61bd5df16ab897abc7be800d9d4e778ae98d328e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/common.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index e39b81101e0708236c86e0b3ba459314b6cb06d1..56d679e6dd54458a4e4b305bb203e0f6191f3bc4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/conf-bindings.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index c888a6f8f527fc70c5089612791be9c985231395..e86c87194875aaa260440a9af285a3228b65e014 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/conf-bindings.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 207c1c1c471ed610a77cc491ecf51f892e968fe1..62c91f117679ace71fd879314ecc7816058a7f36 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/conf.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -36,6 +36,12 @@ StringIntMap frame_idxs[]={
     END_STRINGINTMAP
 };
 
+static bool get_winprop_fn_set=FALSE;
+static ExtlFn get_winprop_fn;
+
+static bool get_layout_fn_set=FALSE;
+static ExtlFn get_layout_fn;
+
 
 /*EXTL_DOC
  * Set ioncore basic settings. The table \var{tab} may contain the
@@ -70,8 +76,6 @@ StringIntMap frame_idxs[]={
  *  \var{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''. \\
- *  \var{default_ws_params} & (table) Default workspace layout; the 
- *                          attach/creation parameters for a \type{WGroup}. \\
  * \end{tabularx}
  * 
  * When a keyboard resize function is called, and at most \var{kbresize_t_max} 
@@ -88,6 +92,7 @@ void ioncore_set(ExtlTab tab)
     int dd, rd;
     char *wst, *tmp;
     ExtlTab t;
+    ExtlFn fn;
     
     extl_table_gets_b(tab, "opaque_resize", &(ioncore_g.opaque_resize));
     extl_table_gets_b(tab, "warp", &(ioncore_g.warp_enabled));
@@ -108,6 +113,22 @@ void ioncore_set(ExtlTab tab)
     ioncore_set_moveres_accel(tab);
     
     ioncore_groupws_set(tab);
+    
+    /* Internal -- therefore undocumented above */
+    if(extl_table_gets_f(tab, "_get_winprop", &fn)){
+        if(get_winprop_fn_set)
+            extl_unref_fn(get_winprop_fn);
+        get_winprop_fn=fn;
+        get_winprop_fn_set=TRUE;
+    }
+    
+    if(extl_table_gets_f(tab, "_get_layout", &fn)){
+        if(get_layout_fn_set)
+            extl_unref_fn(get_layout_fn);
+        get_layout_fn=fn;
+        get_layout_fn_set=TRUE;
+    }
+    
 }
 
 
@@ -137,7 +158,35 @@ ExtlTab ioncore_get()
     
     return tab;
 }
-        
+
+
+ExtlTab ioncore_get_winprop(WClientWin *cwin)
+{
+    ExtlTab tab=extl_table_none();
+    
+    if(get_winprop_fn_set){
+        extl_protect(NULL);
+        extl_call(get_winprop_fn, "o", "t", cwin, &tab);
+        extl_unprotect(NULL);
+    }
+    
+    return tab;
+}
+
+
+ExtlTab ioncore_get_layout(const char *layout)
+{
+    ExtlTab tab=extl_table_none();
+    
+    if(get_layout_fn_set){
+        extl_protect(NULL);
+        extl_call(get_layout_fn, "s", "t", layout, &tab);
+        extl_unprotect(NULL);
+    }
+    
+    return tab;
+}
+    
 
 /*EXTL_DOC
  * Get important directories (userdir, sessiondir, searchpath).
@@ -232,7 +281,7 @@ bool ioncore_read_main_config(const char *cfgfile)
     
     ret=extl_read_config(cfgfile, ".", TRUE);
     
-    unset+=(ioncore_rootwin_bindmap->nbindings==0);
+    unset+=(ioncore_screen_bindmap->nbindings==0);
     unset+=(ioncore_mplex_bindmap->nbindings==0);
     unset+=(ioncore_frame_bindmap->nbindings==0);
     
index da3679b8795f7449ab24ee5f68d28d446f41c133..696852da7c009a803e9bdbf83f35dae8029e0a0a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/conf.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -14,4 +14,7 @@
 
 extern bool ioncore_read_main_config(const char *cfgfile);
 
+extern ExtlTab ioncore_get_winprop(WClientWin *cwin);
+extern ExtlTab ioncore_get_layout(const char *str);
+
 #endif /* ION_IONCORE_CONF_H */
index 31ea25b9fc7f05ce6c060b4350c02a111cd001d3..6973a165b2b1898e677d93d0db9c265cf180dcbf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/cursor.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 0137e8ccc4cf5f75ae1a1317368ee9021bcce0f4..8d03f7917af3c011a8bb8065b2f3ff120c4893c4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/cursor.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
diff --git a/ioncore/detach.c b/ioncore/detach.c
new file mode 100644 (file)
index 0000000..c93ca0c
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * ion/ioncore/detach.c
+ *
+ * Copyright (c) Tuomo Valkonen 1999-2007. 
+ *
+ * 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 <libtu/objp.h>
+#include <libtu/setparam.h>
+#include <libtu/minmax.h>
+
+#include <ioncore/common.h>
+#include <ioncore/mplex.h>
+#include <ioncore/focus.h>
+#include <ioncore/group.h>
+#include <ioncore/group-ws.h>
+#include <ioncore/framedpholder.h>
+#include <ioncore/return.h>
+
+
+static void get_relative_geom(WRectangle *g, WRegion *reg, WRegion *mgr)
+{
+    WWindow *rel=REGION_PARENT(mgr), *w;
+    
+    *g=REGION_GEOM(reg);
+    
+    for(w=REGION_PARENT(reg); 
+        w!=rel && (WRegion*)w!=mgr; 
+        w=REGION_PARENT(w)){
+        
+        g->x+=REGION_GEOM(w).x;
+        g->y+=REGION_GEOM(w).y;
+    }
+}
+
+
+bool ioncore_do_detach(WRegion *reg, WGroup *grp, WFrameMode framemode)
+{
+    WGroupAttachParams ap=GROUPATTACHPARAMS_INIT;
+    WRegionAttachData data;
+    WPHolder *ph;
+    bool newph=FALSE;
+    bool ret;
+    
+    ap.switchto_set=TRUE;
+    ap.switchto=region_may_control_focus(reg);
+    
+    data.type=REGION_ATTACH_REPARENT;
+    data.u.reg=reg;
+    
+    ph=region_unset_get_return(reg);
+    
+    if(ph==NULL){
+        ph=region_make_return_pholder(reg);
+        newph=TRUE;
+    }
+    
+    if(framemode!=FRAME_MODE_UNKNOWN){
+        WFramedParam fpa=FRAMEDPARAM_INIT;
+        
+        fpa.mode=framemode;
+        fpa.inner_geom_gravity_set=TRUE;
+        fpa.gravity=ForgetGravity;
+        
+        ap.geom_weak_set=TRUE;
+        ap.geom_weak=0;
+        
+        get_relative_geom(&fpa.inner_geom, reg, (WRegion*)grp);
+
+        ret=(region_attach_framed((WRegion*)grp, &fpa,
+                                  (WRegionAttachFn*)group_do_attach,
+                                  &ap, &data)!=NULL);
+    }else{
+        WStacking *st=ioncore_find_stacking(reg);
+        
+        if(st!=NULL){
+            ap.szplcy=st->szplcy;
+            ap.szplcy_set=TRUE;
+            
+            ap.level=maxof(st->level, STACKING_LEVEL_NORMAL);
+            ap.level_set=TRUE;
+        }
+        
+        ap.geom_set=TRUE;
+        get_relative_geom(&ap.geom, reg, (WRegion*)grp);
+        
+        ret=(group_do_attach(grp, &ap, &data)!=NULL);
+    }
+    
+    if(!ret && newph)
+        destroy_obj((Obj*)ph);
+    else if(!region_do_set_return(reg, ph))
+        destroy_obj((Obj*)ph);
+    
+    return ret;
+}
+
+
+static WRegion *check_mplex(WRegion *reg, WFrameMode *mode)
+{
+    WMPlex *mplex=REGION_MANAGER_CHK(reg, WMPlex);
+    
+    if(OBJ_IS(reg, WWindow) || mplex==NULL){
+        *mode=FRAME_MODE_UNKNOWN;
+        return reg;
+    }
+        
+    *mode=FRAME_MODE_FLOATING;
+    
+    if(OBJ_IS(mplex, WFrame)
+       && frame_mode((WFrame*)mplex)==FRAME_MODE_TRANSIENT){
+        *mode=FRAME_MODE_TRANSIENT;
+    }
+    
+    return (WRegion*)mplex;
+}
+
+
+static WGroup *find_group(WRegion *reg)
+{
+    WRegion *mgr=REGION_MANAGER(reg);
+    
+    while(mgr!=NULL){
+        mgr=REGION_MANAGER(mgr);
+        if(OBJ_IS(mgr, WGroup))
+            break;
+    }
+    
+    return (WGroup*)mgr;
+}
+
+
+bool ioncore_detach(WRegion *reg, int sp)
+{
+    WPHolder *ph=region_get_return(reg);
+    WFrameMode mode;
+    WGroup *grp;
+    bool set, nset;
+    
+    reg=region_group_if_bottom(reg);
+    
+    grp=find_group(check_mplex(reg, &mode));
+    
+    /* reg is only considered detached if there's no higher-level group
+     * to attach to, thus causing 'toggle' to cycle.
+     */
+    set=(grp==NULL);
+    nset=libtu_do_setparam(sp, set);
+    
+    if(!XOR(nset, set))
+        return set;
+
+    if(!set){
+        return ioncore_do_detach(reg, grp, mode);
+    }else{
+        WPHolder *ph=region_get_return(reg);
+        
+        if(ph!=NULL){
+            if(!pholder_attach_mcfgoto(ph, PHOLDER_ATTACH_SWITCHTO, reg)){
+                warn(TR("Failed to reattach."));    
+                return TRUE;
+            }
+            region_unset_return(reg);
+        }
+        
+        return FALSE;
+    }
+}
+
+
+/*EXTL_DOC
+ * Detach or reattach \var{reg}, depending on whether \var{how}
+ * is 'set'/'unset'/'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.
+ */
+EXTL_EXPORT_AS(ioncore, detach)
+bool ioncore_detach_extl(WRegion *reg, const char *how)
+{
+    if(how==NULL)
+        how="set";
+    
+    return ioncore_detach(reg, libtu_string_to_setparam(how));
+}
+
+
diff --git a/ioncore/detach.h b/ioncore/detach.h
new file mode 100644 (file)
index 0000000..30b4a4a
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * ion/ioncore/detach.h
+ *
+ * Copyright (c) Tuomo Valkonen 1999-2007. 
+ *
+ * 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.
+ */
+
+#ifndef ION_IONCORE_DETACH_H
+#define ION_IONCORE_DETACH_H
+
+#include "region.h"
+
+extern bool ioncore_detach(WRegion *reg, int sp);
+
+#endif /* ION_IONCORE_DETACH_H */
+
index f3343be73addb26377965cb0a1a76947cd2766ae..6d1a4913ad8fcd3680554091974249ccfb7d2bfe 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/dummywc.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 84943d56ee046441d4c06808d13d866c66344270..9a3b95790f4b7e33ac19c296835abc14df5908c9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/event.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 1bf227d1e17fb18ba0281e3a64b201a1add6b106..b81edf1d38e507704de0d2e3812214c8bb813e79 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/event.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
                                      PropertyChangeMask|FocusChangeMask|  \
                                      StructureNotifyMask|EnterWindowMask)
 
+#define IONCORE_EVENTMASK_SCREEN (FocusChangeMask|EnterWindowMask|   \
+                                  KeyPressMask|KeyReleaseMask|       \
+                                  ButtonPressMask|ButtonReleaseMask)
+
 extern void ioncore_x_connection_handler(int conn, void *unused);
 extern void ioncore_flush();
 extern void ioncore_get_event(XEvent *ev, long mask);
index 91ab5501dfd2405575798afe79890d31097f8518..5e1e1fe81d9439dafebb3e4b77548b6ec725e68f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/eventh.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -305,9 +305,6 @@ void ioncore_handle_expose(const XExposeEvent *ev)
 /*{{{ Enter window, focus */
 
 
-/*extern Time ioncore_focus_time;*/
-
-
 static void do_handle_enter_window(XEvent *ev)
 {
     XEnterWindowEvent *eev=&(ev->xcrossing);
@@ -316,15 +313,6 @@ static void do_handle_enter_window(XEvent *ev)
     if(ioncore_g.input_mode!=IONCORE_INPUTMODE_NORMAL)
         return;
     
-    /*if(ioncore_g.focus_next!=NULL && ioncore_focus_time==CurrentTime)
-        return;*/
-        
-    /*if(ioncore_await_warp())
-        return;
-    
-    if(eev->mode!=NotifyNormal && !ioncore_g.warp_enabled)
-        return;*/
-        
     reg=XWINDOW_REGION_OF_T(eev->window, WRegion);
     
     if(reg==NULL)
@@ -335,9 +323,10 @@ static void do_handle_enter_window(XEvent *ev)
         
     if(region_skip_focus(reg))
         return;
-        
+
     /* If a child of 'reg' is to be focused, do not process this
-     * event.
+     * event. (ioncore_g.focus_next should only be set here by
+     * another call to use from ioncore_handle_enter_window below.)
      */
     if(ioncore_g.focus_next!=NULL){
         WRegion *r2=ioncore_g.focus_next;
@@ -397,8 +386,7 @@ void ioncore_handle_focus_in(const XFocusChangeEvent *ev, bool skip)
     if(ev->detail==NotifyPointer)
         return;
     
-    /* Root windows appear either as WRootWins or WScreens */
-    if(ev->window==region_root_of(reg)){
+    if(ev->window==region_root_of(reg)){ /* OBJ_IS(reg, WRootWin) */
         D(fprintf(stderr, "scr-in %d %d %d\n", ROOTWIN_OF(reg)->xscr,
                   ev->mode, ev->detail));
         if((ev->detail==NotifyPointerRoot || ev->detail==NotifyDetailNone) &&
@@ -408,7 +396,6 @@ void ioncore_handle_focus_in(const XFocusChangeEvent *ev, bool skip)
                 region_set_focus(reg);
             return;
         }
-        /*return;*/
     }
 
     /* Input contexts */
index f80257b8ca0748b0a68a4a5e34bc5dbc729eb5c2..84257a4c90db760b050c125e02fdbb21356a0eaf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/eventh.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 10c8267781eb70113e92d50cbae1304d14eec068..4147172703bb4318bc4913337485d58309d6a132 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/exec.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 63c8917203f1c303e87c09388c38a8bf8afb9a3a..b7f9bced556ad6efae109bb3092acd2dade5b7e8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/exec.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 5f23b7464b28de5fa69f59a4183819a5178c356c..9fc7af9467f094ff3d6eac4012f048744915d360 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/extlconv.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 /*{{{ Object list */
 
 
-ExtlTab extl_obj_iterable_to_table(ObjIterator *iter, void *st)
+bool extl_iter_objlist_(ExtlFn fn, ObjIterator *iter, void *st)
 {
-    ExtlTab tab=extl_create_table();
-    int i=1;
     Obj *obj;
     
     while(1){
         obj=iter(st);
         if(obj==NULL)
             break;
-        if(extl_table_seti_o(tab, i, obj))
-            i++;
+        if(!extl_iter_obj(fn, obj))
+            return FALSE;
     }
     
-    return tab;
+    return TRUE;
+}
+
+
+bool extl_iter_objlist(ExtlFn fn, ObjList *list)
+{
+    ObjListIterTmp tmp;
+    
+    objlist_iter_init(&tmp, list);
+    
+    return extl_iter_objlist_(fn, (ObjIterator*)objlist_iter, &tmp);
+}
+
+
+bool extl_iter_obj(ExtlFn fn, Obj *obj)
+{
+    bool ret1, ret2=FALSE;
+    
+    extl_protect(NULL);
+    
+    ret1=extl_call(fn, "o", "b", obj, &ret2);
+    
+    extl_unprotect(NULL);
+    
+    return (ret1 && ret2);
 }
 
 
index b4e3b806ff3a21cbc0a5dbea33731c11d4b8c814..28fbb95472a4c19e10c21642734d5eb548d28ea2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/extlconv.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include <libextl/extl.h>
 #include <libtu/iterable.h>
 #include <libtu/setparam.h>
+#include <libtu/objlist.h>
 #include "common.h"
 #include "region.h"
 
-extern ExtlTab extl_obj_iterable_to_table(ObjIterator *iter, void *st);
+extern bool extl_iter_obj(ExtlFn fn, Obj *obj);
+extern bool extl_iter_objlist_(ExtlFn fn, ObjIterator *iter, void *st);
+extern bool extl_iter_objlist(ExtlFn fn, ObjList *list);
 
 extern bool extl_table_is_bool_set(ExtlTab tab, const char *entry);
 
index b9a380e0927ae62d5f41386e07aadb2f6f3f9624..a13038a79fe178588380ea719c2908b7c1187da6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/extlrx.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 399f5ec90af6655f47afb3de1fc0d03d5c119887..8d5fb2119cdc862972b18fa544d1855258f39681 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/float-placement.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 0f52dafd51a61bb53f78d8272aba392cf797e7b2..2dc062d83844fcc278cca99f5795b6f562ae03f4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/float-placement.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index fb2159bf7f992f6ee0dc74f51d2681b3f95b3470..c25ec716ff1750906c2a9ad50927eccca32f0cb9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/focus.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -25,8 +25,6 @@
 
 
 WHook *region_do_warp_alt=NULL;
-WHook *region_activated_hook=NULL;
-WHook *region_inactivated_hook=NULL;
 
 
 /*}}}*/
@@ -35,22 +33,27 @@ WHook *region_inactivated_hook=NULL;
 /*{{{ Focus list */
 
 
-void region_focuslist_remove(WRegion *reg)
+void region_focuslist_remove_with_mgrs(WRegion *reg)
 {
+    WRegion *mgrp=region_manager_or_parent(reg);
+    
     UNLINK_ITEM(ioncore_g.focus_current, reg, active_next, active_prev);
+    
+    if(mgrp!=NULL)
+        region_focuslist_remove_with_mgrs(mgrp);
 }
 
 
 void region_focuslist_push(WRegion *reg)
 {
-    region_focuslist_remove(reg);
+    region_focuslist_remove_with_mgrs(reg);
     LINK_ITEM_FIRST(ioncore_g.focus_current, reg, active_next, active_prev);
 }
 
 
 void region_focuslist_move_after(WRegion *reg, WRegion *after)
 {
-    region_focuslist_remove(reg);
+    region_focuslist_remove_with_mgrs(reg);
     LINK_ITEM_AFTER(ioncore_g.focus_current, after, reg, 
                     active_next, active_prev);
 }
@@ -62,8 +65,8 @@ void region_focuslist_deinit(WRegion *reg)
     
     if(replace!=NULL)
         region_focuslist_move_after(replace, reg);
-    
-    region_focuslist_remove(reg);
+        
+    UNLINK_ITEM(ioncore_g.focus_current, reg, active_next, active_prev);
 }
 
 
@@ -99,6 +102,34 @@ WRegion *ioncore_goto_previous()
 }
 
 
+/*EXTL_DOC
+ * Iterate over focus history until \var{iterfn} returns \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
+ */
+EXTL_EXPORT
+bool ioncore_focushistory_i(ExtlFn iterfn)
+{
+    WRegion *next;
+    
+    if(ioncore_g.focus_current==NULL)
+        return FALSE;
+    
+    /* Find the first region on focus history list that isn't currently
+     * active.
+     */
+    for(next=ioncore_g.focus_current->active_next;
+        next!=NULL; 
+        next=next->active_next){
+        
+        if(!extl_iter_obj(iterfn, (Obj*)next))
+            return FALSE;
+    }
+    
+    return TRUE;
+}
+
+
 /*}}}*/
 
 
@@ -161,9 +192,9 @@ static void check_clear_await(WRegion *reg)
 }
 
 
-bool ioncore_await_focus()
+WRegion *ioncore_await_focus()
 {
-    return (await_watch.obj!=NULL);
+    return (WRegion*)(await_watch.obj);
 }
 
 
@@ -175,7 +206,7 @@ bool ioncore_await_focus()
 
 void region_got_focus(WRegion *reg)
 {
-    WRegion *par, *mgr, *tmp;
+    WRegion *par;
     
     check_clear_await(reg);
     
@@ -188,30 +219,18 @@ void region_got_focus(WRegion *reg)
     
     if(!REGION_IS_ACTIVE(reg)){
         D(fprintf(stderr, "got focus (inact) %s [%p]\n", OBJ_TYPESTR(reg), reg);)
+        
         reg->flags|=REGION_ACTIVE;
+        region_set_manager_pseudoactivity(reg);
         
         par=REGION_PARENT_REG(reg);
         if(par!=NULL){
             par->active_sub=reg;
             region_update_owned_grabs(par);
         }
-
-        region_activated(reg);
         
-        mgr=REGION_MANAGER(reg);
-        tmp=reg;
-        while(mgr!=NULL){
-            /* We need to loop over managing non-windows (workspaces) here to
-             * signal their managers.
-             */
-            region_managed_activated(mgr, tmp);
-            
-            if(REGION_PARENT_REG(reg)==mgr)
-                break;
-            
-            tmp=mgr;
-            mgr=REGION_MANAGER(mgr);
-        }
+        region_activated(reg);
+        region_notify_change(reg, ioncore_g.notifies.activated);
     }else{
         D(fprintf(stderr, "got focus (act) %s [%p]\n", OBJ_TYPESTR(reg), reg);)
     }
@@ -223,16 +242,12 @@ void region_got_focus(WRegion *reg)
      */
     if(reg->active_sub==NULL && !OBJ_IS(reg, WClientWin))
         rootwin_install_colormap(region_rootwin_of(reg), None); 
-    
-    extl_protect(NULL);
-    hook_call_o(region_activated_hook, (Obj*)reg);
-    extl_unprotect(NULL);
 }
 
 
 void region_lost_focus(WRegion *reg)
 {
-    WRegion *r, *par;
+    WRegion *par;
     
     if(!REGION_IS_ACTIVE(reg)){
         D(fprintf(stderr, "lost focus (inact) %s [%p:]\n", OBJ_TYPESTR(reg), reg);)
@@ -260,14 +275,10 @@ void region_lost_focus(WRegion *reg)
     D(fprintf(stderr, "lost focus (act) %s [%p:]\n", OBJ_TYPESTR(reg), reg);)
     
     reg->flags&=~REGION_ACTIVE;
-    region_inactivated(reg);
-    r=REGION_MANAGER(reg);
-    if(r!=NULL)
-        region_managed_inactivated(r, reg);
+    region_unset_manager_pseudoactivity(reg);
     
-    extl_protect(NULL);
-    hook_call_o(region_inactivated_hook, (Obj*)reg);
-    extl_unprotect(NULL);
+    region_inactivated(reg);
+    region_notify_change(reg, ioncore_g.notifies.inactivated);
 }
 
 
@@ -290,28 +301,14 @@ bool region_is_active(WRegion *reg)
 
 bool region_may_control_focus(WRegion *reg)
 {
-    WRegion *par, *r2;
-    
     if(OBJ_IS_BEING_DESTROYED(reg))
         return FALSE;
 
-    if(REGION_IS_ACTIVE(reg))
+    if(REGION_IS_ACTIVE(reg) || REGION_IS_PSEUDOACTIVE(reg))
         return TRUE;
     
     if(region_is_await(reg))
         return TRUE;
-    
-    par=REGION_PARENT_REG(reg);
-    
-    if(par==NULL || !REGION_IS_ACTIVE(par))
-        return FALSE;
-    
-    r2=par->active_sub;
-    while(r2!=NULL && r2!=par){
-        if(r2==reg)
-            return TRUE;
-        r2=REGION_MANAGER(r2);
-    }
 
     return FALSE;
 }
@@ -395,6 +392,14 @@ void region_maybewarp(WRegion *reg, bool warp)
 }
 
 
+void region_maybewarp_now(WRegion *reg, bool warp)
+{
+    ioncore_g.focus_next=NULL;
+    /* TODO: what if focus isn't set? Should focus_next be reset then? */
+    region_do_set_focus(reg, warp);
+}
+
+
 void region_set_focus(WRegion *reg)
 {
     region_maybewarp(reg, FALSE);
@@ -432,4 +437,49 @@ WRegion *ioncore_current()
     return ioncore_g.focus_current;
 }
 
+
+/*}}}*/
+
+
+/*{{{ Pointer focus hack */
+
+
+/* This ugly hack tries to prevent focus change, when the pointer is
+ * in a window to be unmapped (or destroyed), and that does not have
+ * the focus, or should not soon have it.
+ */
+void region_pointer_focus_hack(WRegion *reg)
+{
+    WRegion *act=ioncore_await_focus();
+    const WRectangle *g=&REGION_GEOM(reg);
+    int x, y;
+    
+    if(ioncore_g.opmode!=IONCORE_OPMODE_NORMAL)
+        return;
+    
+    if(!REGION_IS_ACTIVE(reg) && act==NULL)
+        act=ioncore_g.focus_current;
+        
+    if(act==NULL || OBJ_IS_BEING_DESTROYED(act))
+        return;
+        
+    /* Ok, anything under us should not get focus as we're unmapped:
+     * Either we don't have the focus, or focus change somewhere else
+     * is pending.
+     *
+     * It might be possible to do the pointer check more efficiently
+     * by trying to maintain our internal pointer containment state
+     * by tracking Enter/Leave events...
+     */
+    
+    xwindow_pointer_pos(region_xwindow(reg), &x, &y);
+    
+    if(x>=0 && y>=0 && x<g->w && y<g->h){
+        D(fprintf(stderr, "Pointer here and shouldn't alter focus!\n"));
+        region_set_focus(act);
+    }
+}
+
+
 /*}}}*/
+
index e995d6d087fb3f4421ab58a3d040dac3e7460b7c..683d8aebba704b75ab14f74f0d46aa691e506227 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/focus.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include "window.h"
 #include "region.h"
 
-DYNFUN void region_do_set_focus(WRegion *reg, bool warp);
 
 /* Delayed (until return to main loop) warp/focus */
-extern void region_warp(WRegion *reg);
-extern void region_set_focus(WRegion *reg);
 extern void region_maybewarp(WRegion *reg, bool warp);
+/* warp/focus now; do not skip enter window events etc. in mainloop */
+extern void region_maybewarp_now(WRegion *reg, bool warp);
 
-/* Immediate warp/focus */
-extern void region_do_warp(WRegion *reg);
-extern bool region_do_warp_default(WRegion *reg);
+extern void region_warp(WRegion *reg); /* maybewarp TRUE */
+extern void region_set_focus(WRegion *reg); /* maybewarp FALSE */
 
 extern void region_finalise_focusing(WRegion* reg, Window win, bool warp);
 
+DYNFUN void region_do_set_focus(WRegion *reg, bool warp);
+extern void region_do_warp(WRegion *reg);
+extern bool region_do_warp_default(WRegion *reg);
+
 /* Awaiting focus state */
 extern void region_set_await_focus(WRegion *reg);
-extern bool ioncore_await_focus();
+extern WRegion *ioncore_await_focus();
 
 /* Event handling */
 extern void region_got_focus(WRegion *reg);
@@ -45,20 +47,20 @@ extern bool region_may_control_focus(WRegion *reg);
 extern bool region_is_active(WRegion *reg);
 
 /* Focus history */
-extern void region_focuslist_remove(WRegion *reg);
+extern void region_focuslist_remove_with_mgrs(WRegion *reg);
 extern void region_focuslist_push(WRegion *reg);
 extern void region_focuslist_move_after(WRegion *reg, WRegion *after);
 extern void region_focuslist_deinit(WRegion *reg);
 
 extern WRegion *ioncore_goto_previous();
 
-/* Handlers to these shook should take WRegion* as parameter. */
+/* Handlers to this hook should take WRegion* as parameter. */
 extern WHook *region_do_warp_alt;
-extern WHook *region_activated_hook;
-extern WHook *region_inactivated_hook;
 
 /* Misc. */
 extern bool region_skip_focus(WRegion *reg);
 WRegion *ioncore_current();
 
+extern void region_pointer_focus_hack(WRegion *reg);
+
 #endif /* ION_IONCORE_FOCUS_H */
index 116f10cff63759050ff4e1e55cdcd1d24c3f68ee..6c43fc60b3c2df9acb8ba231a0b39484e65a26a6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/frame-draw.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include "framep.h"
 #include "frame-draw.h"
 #include "strings.h"
+#include "activity.h"
 #include "names.h"
 #include "gr.h"
+#include "gr-util.h"
 
 
 #define BAR_INSIDE_BORDER(FRAME) \
 #define BAR_H(FRAME) (FRAME)->bar_h
 
 
+/*{{{ Attributes */
+
+
+GR_DEFATTR(active);
+GR_DEFATTR(inactive);
+GR_DEFATTR(selected);
+GR_DEFATTR(unselected);
+GR_DEFATTR(tagged);
+GR_DEFATTR(not_tagged);
+GR_DEFATTR(dragged);
+GR_DEFATTR(not_dragged);
+GR_DEFATTR(activity);
+GR_DEFATTR(no_activity);
+GR_DEFATTR(quasiactive);
+GR_DEFATTR(not_quasiactive);
+
+
+static void ensure_create_attrs()
+{
+    GR_ALLOCATTR_BEGIN;
+    GR_ALLOCATTR(active);
+    GR_ALLOCATTR(inactive);
+    GR_ALLOCATTR(selected);
+    GR_ALLOCATTR(unselected);
+    GR_ALLOCATTR(tagged);
+    GR_ALLOCATTR(not_tagged);
+    GR_ALLOCATTR(dragged);
+    GR_ALLOCATTR(not_dragged);
+    GR_ALLOCATTR(no_activity);
+    GR_ALLOCATTR(activity);
+    GR_ALLOCATTR(quasiactive);
+    GR_ALLOCATTR(not_quasiactive);
+    GR_ALLOCATTR_END;
+}
+    
+
+void frame_update_attr(WFrame *frame, int i, WRegion *reg)
+{
+    GrStyleSpec *spec;
+    bool selected, tagged, dragged, activity;
+    
+    if(i>=frame->titles_n){
+        /* Might happen when deinitialising */
+        return;
+    }
+    
+    ensure_create_attrs();
+    
+    spec=&frame->titles[i].attr;
+    
+    selected=(reg==FRAME_CURRENT(frame));
+    tagged=(reg!=NULL && reg->flags&REGION_TAGGED);
+    dragged=(i==frame->tab_dragged_idx);
+    activity=(reg!=NULL && region_is_activity_r(reg));
+    
+    gr_stylespec_unalloc(spec);
+    gr_stylespec_set(spec, selected ? GR_ATTR(selected) : GR_ATTR(unselected));
+    gr_stylespec_set(spec, tagged ? GR_ATTR(tagged) : GR_ATTR(not_tagged));
+    gr_stylespec_set(spec, dragged ? GR_ATTR(dragged) : GR_ATTR(not_dragged));
+    gr_stylespec_set(spec, activity ? GR_ATTR(activity) : GR_ATTR(no_activity));
+}
+
+
+/*}}}*/
+
+
 /*{{{ (WFrame) dynfun default implementations */
 
 
@@ -82,7 +150,7 @@ void frame_bar_geom(const WFrame *frame, WRectangle *geom)
     uint off;
     
     if(BAR_INSIDE_BORDER(frame)){
-        off=get_spacing(frame);
+        off=0; /*get_spacing(frame);*/
         frame_border_inner_geom(frame, geom);
     }else{
         off=0;
@@ -105,10 +173,12 @@ void frame_managed_geom(const WFrame *frame, WRectangle *geom)
     
     frame_border_inner_geom(frame, geom);
     
+    /*
     geom->x+=spacing;
     geom->y+=spacing;
     geom->w-=2*spacing;
     geom->h-=2*spacing;
+    */
     
     if(BAR_INSIDE_BORDER(frame) && BAR_EXISTS(frame)){
         geom->y+=frame->bar_h+spacing;
@@ -241,7 +311,8 @@ void frame_recalc_bar(WFrame *frame)
     if(FRAME_MCOUNT(frame)==0){
         textw=init_title(frame, i);
         if(textw>0){
-            title=grbrush_make_label(frame->bar_brush, CF_STR_EMPTY, textw);
+            title=grbrush_make_label(frame->bar_brush, TR("<empty frame>"), 
+                                     textw);
             frame->titles[i].text=title;
         }
         return;
@@ -269,11 +340,22 @@ void frame_recalc_bar(WFrame *frame)
 }
 
 
+static void set_common_attrs(const WFrame *frame, GrBrush *brush)
+{
+    ensure_create_attrs();
+    
+    grbrush_set_attr(brush, REGION_IS_ACTIVE(frame) 
+                            ? GR_ATTR(active) 
+                            : GR_ATTR(inactive));
+    grbrush_set_attr(brush, frame->quasiactive_count>0 
+                            ? GR_ATTR(quasiactive)
+                            : GR_ATTR(not_quasiactive));
+}
+
+                      
 void frame_draw_bar(const WFrame *frame, bool complete)
 {
     WRectangle geom;
-    const char *cattr=(REGION_IS_ACTIVE(frame) 
-                       ? "active" : "inactive");
     
     if(frame->bar_brush==NULL
        || !BAR_EXISTS(frame)
@@ -285,27 +367,29 @@ void frame_draw_bar(const WFrame *frame, bool complete)
 
     grbrush_begin(frame->bar_brush, &geom, GRBRUSH_AMEND);
     
+    set_common_attrs(frame, frame->bar_brush);
+    
     grbrush_draw_textboxes(frame->bar_brush, &geom, frame->titles_n, 
-                           frame->titles, complete, cattr);
+                           frame->titles, complete);
     
     grbrush_end(frame->bar_brush);
 }
 
-
 void frame_draw(const WFrame *frame, bool complete)
 {
     WRectangle geom;
-    const char *attr=(REGION_IS_ACTIVE(frame) 
-                      ? "active" : "inactive");
     
     if(frame->brush==NULL)
         return;
-    
+        
     frame_border_geom(frame, &geom);
     
     grbrush_begin(frame->brush, &geom, (complete ? 0 : GRBRUSH_NO_CLEAR_OK));
     
-    grbrush_draw_border(frame->brush, &geom, attr);
+    set_common_attrs(frame, frame->brush);
+    
+    grbrush_draw_border(frame->brush, &geom);
+    
     frame_draw_bar(frame, TRUE);
     
     grbrush_end(frame->brush);
@@ -478,4 +562,18 @@ bool frame_set_background(WFrame *frame, bool set_always)
 }
 
 
+void frame_setup_dragwin_style(WFrame *frame, GrStyleSpec *spec, int tab)
+{
+    gr_stylespec_append(spec, &frame->titles[tab].attr);
+    
+    gr_stylespec_set(spec, REGION_IS_ACTIVE(frame) 
+                           ? GR_ATTR(active) 
+                           : GR_ATTR(inactive));
+    gr_stylespec_set(spec, frame->quasiactive_count>0 
+                           ? GR_ATTR(quasiactive)
+                           : GR_ATTR(not_quasiactive));
+}
+
+
 /*}}}*/
+
index 4086dec817dc2118bddb1493057f5521c7fec401..b0134f5597ae1ba4a565354884926534b1181d15 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/frame-draw.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -35,4 +35,8 @@ extern void frame_clear_shape(WFrame *frame);
 extern const char *framemode_get_style(WFrameMode mode);
 extern const char *framemode_get_tab_style(WFrameMode mode);
 
+extern void frame_update_attr(WFrame *frame, int i, WRegion *reg);
+
+extern void frame_setup_dragwin_style(WFrame *frame, GrStyleSpec *spec, int tab);
+
 #endif /* ION_IONCORE_FRAME_DRAW_H */
index 1d9a1968c2f9bc9453e3cb6668beff5219309abb..09f1c0aa43f2d25dc0a22419437ff3cf2cfd1503 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/frame-pointer.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -138,7 +138,7 @@ static bool tabdrag_kbd_handler(WRegion *reg, XEvent *xev)
     
     assert(reg!=NULL);
 
-    binding=bindmap_lookup_binding(ioncore_rootwin_bindmap, BINDING_KEYPRESS,
+    binding=bindmap_lookup_binding(ioncore_screen_bindmap, BINDING_KEYPRESS,
                                    ev->state&~BUTTONS_MASK, ev->keycode);
     
     if(binding!=NULL && binding->func!=extl_fn_none()){
@@ -173,9 +173,7 @@ static void setup_dragwin(WFrame *frame, uint tab)
     if(tabdrag_infowin==NULL)
         return;
     
-    infowin_set_attr2(tabdrag_infowin, (REGION_IS_ACTIVE(frame) 
-                                        ? "active" : "inactive"),
-                      frame->titles[tab].attr);
+    frame_setup_dragwin_style(frame, infowin_stylespec(tabdrag_infowin), tab);
     
     if(frame->titles[tab].text!=NULL){
         char *buf=INFOWIN_BUFFER(tabdrag_infowin);
index 092b90a42dcab6d90d48c08e99ca992fb8e3cece..c7163a106a5eb55e7eaead1551f843bd217c5ed7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/frame-pointer.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 0f3e8f285e374d6a5908ed4e1afcf23e84c800ad..d733c3f46252d475be9d40f990281d86fc43c3dd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/frame.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -37,8 +37,9 @@
 #include "bindmaps.h"
 #include "regbind.h"
 #include "gr.h"
-#include "activity.h"
 #include "llist.h"
+#include "framedpholder.h"
+#include "return.h"
 
 
 extern bool frame_set_background(WFrame *frame, bool set_always);
@@ -91,7 +92,7 @@ bool frame_init(WFrame *frame, WWindow *parent, const WFitParams *fp,
     frame_initialise_titles(frame);
     
     region_add_bindmap((WRegion*)frame, ioncore_frame_bindmap);
-    region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap);
+    region_add_bindmap((WRegion*)frame, ioncore_mplex_bindmap);
     
     frame_add_mode_bindmaps(frame);
     
@@ -130,15 +131,18 @@ static void frame_add_mode_bindmaps(WFrame *frame)
 {
     WFrameMode mode=frame->mode;
     
-    if(mode==FRAME_MODE_TILED || mode==FRAME_MODE_TILED_ALT){
-       region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap);
-        region_add_bindmap((WRegion*)frame, ioncore_frame_tiled_bindmap);
-    }else if(mode==FRAME_MODE_FLOATING){
+    if(mode==FRAME_MODE_FLOATING){
+       region_add_bindmap((WRegion*)frame, ioncore_mplex_toplevel_bindmap);
        region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap);
         region_add_bindmap((WRegion*)frame, ioncore_frame_floating_bindmap);
     }else if(mode==FRAME_MODE_TRANSIENT){
         region_add_bindmap((WRegion*)frame, ioncore_frame_transient_bindmap);
-    }
+    }else{
+        /* mode==FRAME_MODE_TILED || mode==FRAME_MODE_TILED_ALT || mode==FRAME_MODE_UNKNOWN */
+       region_add_bindmap((WRegion*)frame, ioncore_mplex_toplevel_bindmap);
+       region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap);
+        region_add_bindmap((WRegion*)frame, ioncore_frame_tiled_bindmap);
+    } 
 }
 
 
@@ -151,6 +155,7 @@ void frame_set_mode(WFrame *frame, WFrameMode mode)
     
     frame_release_brushes(frame);
     
+    region_remove_bindmap((WRegion*)frame, ioncore_mplex_toplevel_bindmap);
     region_remove_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap);
     region_remove_bindmap((WRegion*)frame, ioncore_frame_tiled_bindmap);
     region_remove_bindmap((WRegion*)frame, ioncore_frame_floating_bindmap);
@@ -175,6 +180,7 @@ WFrameMode frame_mode(WFrame *frame)
 
 
 StringIntMap frame_modes[]={
+    {"unknown", FRAME_MODE_UNKNOWN},
     {"tiled", FRAME_MODE_TILED},
     {"tiled-alt", FRAME_MODE_TILED_ALT},
     {"floating", FRAME_MODE_FLOATING},
@@ -186,6 +192,7 @@ StringIntMap frame_modes[]={
 /*EXTL_DOC
  * Get frame mode.
  */
+EXTL_SAFE
 EXTL_EXPORT_AS(WFrame, mode)
 const char *frame_mode_extl(WFrame *frame)
 {
@@ -299,46 +306,6 @@ int frame_nth_tab_iw(WFrame *frame, int n)
 
 
 
-static void update_attr(WFrame *frame, int i, WRegion *reg)
-{
-    int flags=0;
-    static char *attrs[]={
-        "unselected-not_tagged-not_dragged-no_activity",
-        "selected-not_tagged-not_dragged-no_activity",
-        "unselected-tagged-not_dragged-no_activity",
-        "selected-tagged-not_dragged-no_activity",
-        "unselected-not_tagged-dragged-no_activity",
-        "selected-not_tagged-dragged-no_activity",
-        "unselected-tagged-dragged-no_activity",
-        "selected-tagged-dragged-no_activity",
-        "unselected-not_tagged-not_dragged-activity",
-        "selected-not_tagged-not_dragged-activity",
-        "unselected-tagged-not_dragged-activity",
-        "selected-tagged-not_dragged-activity",
-        "unselected-not_tagged-dragged-activity",
-        "selected-not_tagged-dragged-activity",
-        "unselected-tagged-dragged-activity",
-        "selected-tagged-dragged-activity"
-    };
-
-    if(i>=frame->titles_n){
-        /* Might happen when deinitialising */
-        return;
-    }
-    
-    if(reg==FRAME_CURRENT(frame))
-        flags|=0x01;
-    if(reg!=NULL && reg->flags&REGION_TAGGED)
-        flags|=0x02;
-    if(i==frame->tab_dragged_idx)
-        flags|=0x04;
-    if(reg!=NULL && region_is_activity_r(reg))
-        flags|=0x08;
-    
-    frame->titles[i].attr=attrs[flags];
-}
-
-
 void frame_update_attr_nth(WFrame *frame, int i)
 {
     WRegion *reg;
@@ -346,18 +313,18 @@ void frame_update_attr_nth(WFrame *frame, int i)
     if(i<0 || i>=frame->titles_n)
         return;
 
-    update_attr(frame, i, mplex_mx_nth((WMPlex*)frame, i));
+    frame_update_attr(frame, i, mplex_mx_nth((WMPlex*)frame, i));
 }
 
 
-static void update_attrs(WFrame *frame)
+static void frame_update_attrs(WFrame *frame)
 {
     int i=0;
     WRegion *sub;
     WLListIterTmp tmp;
     
     FRAME_MX_FOR_ALL(sub, frame, tmp){
-        update_attr(frame, i, sub);
+        frame_update_attr(frame, i, sub);
         i++;
     }
 }
@@ -371,6 +338,7 @@ static void frame_free_titles(WFrame *frame)
         for(i=0; i<frame->titles_n; i++){
             if(frame->titles[i].text)
                 free(frame->titles[i].text);
+            gr_stylespec_unalloc(&frame->titles[i].attr);
         }
         free(frame->titles);
         frame->titles=NULL;
@@ -383,7 +351,10 @@ static void do_init_title(WFrame *frame, int i, WRegion *sub)
 {
     frame->titles[i].text=NULL;
     frame->titles[i].iw=frame_nth_tab_iw(frame, i);
-    update_attr(frame, i, sub);
+    
+    gr_stylespec_init(&frame->titles[i].attr);
+    
+    frame_update_attr(frame, i, sub);
 }
 
 
@@ -551,6 +522,74 @@ void frame_activated(WFrame *frame)
 }
 
 
+void frame_quasiactivation(WFrame *frame, WRegion *reg, bool act)
+{
+    bool was, is;
+    
+    was=(frame->quasiactive_count>0);
+    
+    frame->quasiactive_count=maxof(0, frame->quasiactive_count 
+                                       + (act ? 1 : -1));
+                                       
+    is=(frame->quasiactive_count>0);
+    
+    if(was!=is && !REGION_IS_ACTIVE(frame))
+        window_draw((WWindow*)frame, FALSE);
+}
+
+
+static bool actinact(WRegion *reg, bool act)
+{
+    WPHolder *returnph=region_get_return(reg);
+    WFrame *frame;
+    
+    if(returnph==NULL || pholder_stale(returnph))
+        return FALSE;
+    
+    frame=OBJ_CAST(pholder_target(returnph), WFrame);
+    
+    if(frame!=NULL){
+        /* Ok, reg has return placeholder set to a frame: 
+         * do quasiactivation/inactivation 
+         */
+        frame_quasiactivation(frame, reg, act);
+    }
+    
+    return TRUE;
+}
+
+
+static bool activated(WRegion *reg)
+{
+    return actinact(reg, TRUE);
+}
+
+
+static bool inactivated(WRegion *reg)
+{
+    return actinact(reg, FALSE);
+}
+
+
+void ioncore_frame_quasiactivation_notify(WRegion *reg, 
+                                          WRegionNotify how)
+{
+    if(how==ioncore_g.notifies.activated || 
+       how==ioncore_g.notifies.pseudoactivated){
+        activated(reg);
+    }else if(how==ioncore_g.notifies.inactivated ||
+             how==ioncore_g.notifies.pseudoinactivated){
+        inactivated(reg);
+    }else if(how==ioncore_g.notifies.set_return){
+        if(REGION_IS_ACTIVE(reg) || REGION_IS_PSEUDOACTIVE(reg))
+            activated(reg);
+    }else if(how==ioncore_g.notifies.unset_return){
+        if(REGION_IS_ACTIVE(reg) || REGION_IS_PSEUDOACTIVE(reg))
+            inactivated(reg);
+    }
+}
+
+
 /*}}}*/
 
 
@@ -620,6 +659,73 @@ static void frame_managed_rqgeom_absolute(WFrame *frame, WRegion *sub,
 /*}}}*/
 
 
+/*{{{ Frame recreate pholder stuff */
+
+
+static WFramedPHolder *frame_make_recreate_pholder(WFrame *frame)
+{
+    WPHolder *ph;
+    WFramedPHolder *fph;
+    WFramedParam fparam=FRAMEDPARAM_INIT;
+    
+    ph=region_make_return_pholder((WRegion*)frame);
+    
+    if(ph==NULL)
+        return NULL;
+        
+    fparam.mode=frame->mode;
+    
+    fph=create_framedpholder(ph, &fparam);
+    
+    if(fph==NULL){
+        destroy_obj((Obj*)ph);
+        return NULL;
+    }
+    
+    return fph;
+}
+
+
+static void mplex_flatten_phs(WMPlex *mplex)
+{
+    WLListNode *node;
+    WLListIterTmp tmp;
+
+    FOR_ALL_NODES_ON_LLIST(node, mplex->mx_list, tmp){
+        WMPlexPHolder *last=(mplex->mx_phs==NULL ? NULL : mplex->mx_phs->prev);
+        mplex_move_phs(mplex, node, last, NULL);
+    }
+}
+
+
+static void frame_modify_pholders(WFrame *frame)
+{
+    WFramedPHolder *fph;
+    WMPlexPHolder *phs, *ph;
+    
+    mplex_flatten_phs(&frame->mplex);
+    
+    if(frame->mplex.mx_phs==NULL)
+        return;
+    
+    fph=frame_make_recreate_pholder(frame);
+    
+    if(fph==NULL)
+        return;
+    
+    phs=frame->mplex.mx_phs;
+    frame->mplex.mx_phs=NULL;
+    
+    phs->recreate_pholder=fph;
+    
+    for(ph=phs; ph!=NULL; ph=ph->next)
+        watch_reset(&ph->mplex_watch);
+}
+
+
+/*}}}*/
+
+
 /*{{{ Misc. */
 
 
@@ -724,9 +830,9 @@ bool frame_is_numbers(WFrame *frame)
 }
 
 
-void frame_managed_notify(WFrame *frame, WRegion *sub, const char *how)
+void frame_managed_notify(WFrame *frame, WRegion *sub, WRegionNotify how)
 {
-    update_attrs(frame);
+    frame_update_attrs(frame);
     frame_recalc_bar(frame);
     frame_draw_bar(frame, FALSE);
 }
@@ -755,7 +861,7 @@ static void frame_managed_changed(WFrame *frame, int mode, bool sw,
     if(mode!=MPLEX_CHANGE_SWITCHONLY)
         frame_initialise_titles(frame);
     else
-        update_attrs(frame);
+        frame_update_attrs(frame);
 
     if(sw)
         need_draw=!frame_set_background(frame, FALSE);
@@ -776,8 +882,10 @@ static void frame_managed_changed(WFrame *frame, int mode, bool sw,
 
 static void frame_destroy_empty(WFrame *frame)
 {
-    if(EMPTY_AND_SHOULD_BE_DESTROYED(frame))
+    if(EMPTY_AND_SHOULD_BE_DESTROYED(frame)){
+        frame_modify_pholders(frame);
         destroy_obj((Obj*)frame);
+    }
 }
 
 
index ce3781495a1f243565947f2939feaedeabbca646..aa4e7a6f27437d91258222d4fc14b1d285f6a1ee 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/frame.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -64,6 +64,7 @@ DECLCLASS(WFrame){
     int saved_x, saved_y;
     
     int tab_dragged_idx;
+    uint quasiactive_count;
     
     GrBrush *brush;
     GrBrush *bar_brush;
@@ -115,9 +116,11 @@ extern bool frame_is_numbers(WFrame *frame);
 extern int frame_default_index(WFrame *frame);
 
 /* Misc */
-extern void frame_managed_notify(WFrame *frame, WRegion *sub, const char *how);
+extern void frame_managed_notify(WFrame *frame, WRegion *sub, WRegionNotify how);
 extern void frame_managed_remove(WFrame *frame, WRegion *reg);
 
+extern void ioncore_frame_quasiactivation_notify(WRegion *reg, WRegionNotify how);
+
 /* Save/load */
 extern ExtlTab frame_get_configuration(WFrame *frame);
 extern WRegion *frame_load(WWindow *par, const WFitParams *fp, ExtlTab tab);
index 43375f2d2a51cb1f7c2a3c770999e426653b602c..6ef378bf3fd0d4b299ed79db1809b778a463c60b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/framedpholder.c
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
@@ -65,37 +65,13 @@ typedef struct{
 } AP;
 
 
-WRegion *framed_handler(WWindow *par, 
-                        const WFitParams *fp, 
-                        void *ap_)
+void frame_adjust_to_initial(WFrame *frame, const WFitParams *fp, 
+                             const WFramedParam *param, WRegion *reg)
 {
-    AP *ap=(AP*)ap_;
-    WMPlexAttachParams mp=MPLEXATTACHPARAMS_INIT;
-    WFramedParam *param=ap->param;
     WRectangle rqg, mg;
-    WFrame *frame;
-    WRegion *reg;
-    
-    if(param->mkframe!=NULL)
-        frame=(WFrame*)(param->mkframe)(par, fp);
-    else
-        frame=create_frame(par, fp, FRAME_MODE_FLOATING);
-    
-    if(frame==NULL)
-        return NULL;
-    
-    if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))
-        mp.flags|=MPLEX_ATTACH_WHATEVER;
-
-    reg=mplex_do_attach(&frame->mplex, &mp, ap->data);
-    
-    if(reg==NULL){
-        destroy_obj((Obj*)frame);
-        return NULL;
-    }
-
     if(!(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER)))
-        return (WRegion*)frame;
+        return;
 
     mplex_managed_geom((WMPlex*)frame, &mg);
 
@@ -111,9 +87,9 @@ WRegion *framed_handler(WWindow *par,
         int bt=mg.y;
         int bb=REGION_GEOM(frame).h-(mg.y+mg.h);
         
-        rqg.x=(fp->g.x+param->inner_geom.x+
+        rqg.x=(/*fp->g.x+*/param->inner_geom.x+
                xgravity_deltax(param->gravity, bl, br));
-        rqg.y=(fp->g.y+param->inner_geom.y+
+        rqg.y=(/*fp->g.y+*/param->inner_geom.y+
                xgravity_deltay(param->gravity, bt, bb));
         rqg.w=maxof(1, param->inner_geom.w+(REGION_GEOM(frame).w-mg.w));
         rqg.h=maxof(1, param->inner_geom.h+(REGION_GEOM(frame).h-mg.h));
@@ -123,6 +99,35 @@ WRegion *framed_handler(WWindow *par,
         rectangle_constrain(&rqg, &fp->g);
     
     region_fit((WRegion*)frame, &rqg, REGION_FIT_EXACT);
+}
+
+
+WRegion *framed_handler(WWindow *par, 
+                        const WFitParams *fp, 
+                        void *ap_)
+{
+    AP *ap=(AP*)ap_;
+    WMPlexAttachParams mp=MPLEXATTACHPARAMS_INIT;
+    WFramedParam *param=ap->param;
+    WFrame *frame;
+    WRegion *reg;
+    
+    frame=create_frame(par, fp, param->mode);
+    
+    if(frame==NULL)
+        return NULL;
+    
+    if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))
+        mp.flags|=MPLEX_ATTACH_WHATEVER;
+
+    reg=mplex_do_attach(&frame->mplex, &mp, ap->data);
+    
+    if(reg==NULL){
+        destroy_obj((Obj*)frame);
+        return NULL;
+    }
+    
+    frame_adjust_to_initial(frame, fp, param, reg);
     
     return (WRegion*)frame;
 }
@@ -162,7 +167,7 @@ WRegion *framedpholder_do_attach(WFramedPHolder *ph, int flags,
     ap.data=data;
     ap.param=&ph->param;
         
-    return pholder_attach_(ph->cont, flags, &data2);
+    return pholder_do_attach(ph->cont, flags, &data2);
 }
 
 
@@ -174,19 +179,32 @@ WRegion *framedpholder_do_attach(WFramedPHolder *ph, int flags,
 
 bool framedpholder_do_goto(WFramedPHolder *ph)
 {
-    if(ph->cont!=NULL)
-        return pholder_goto(ph->cont);
-    
-    return FALSE;
+    return (ph->cont!=NULL
+            ? pholder_goto(ph->cont)
+            : FALSE);
 }
 
 
 WRegion *framedpholder_do_target(WFramedPHolder *ph)
 {
-    if(ph->cont!=NULL)
-        return pholder_target(ph->cont);
+    return (ph->cont!=NULL
+            ? pholder_target(ph->cont)
+            : NULL);
+}
+
+
+WPHolder *framedpholder_do_root(WFramedPHolder *ph)
+{
+    WPHolder *root;
+    
+    if(ph->cont==NULL)
+        return NULL;
+    
+    root=pholder_root(ph->cont);
     
-    return NULL;
+    return (root!=ph->cont 
+            ? root
+            : &ph->ph);
 }
 
 
@@ -205,6 +223,9 @@ static DynFunTab framedpholder_dynfuntab[]={
 
     {(DynFun*)pholder_do_target, 
      (DynFun*)framedpholder_do_target},
+     
+    {(DynFun*)pholder_do_root, 
+     (DynFun*)framedpholder_do_root},
     
     END_DYNFUNTAB
 };
index 2bd7f1b631cf0acdce643e9c6b2ff630a3dbbbf2..dfbbe5044c8b4f1e9c43b88bed1bb9509658ffa8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/framedpholder.h
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
 #include "common.h"
 #include "pholder.h"
 #include "attach.h"
-
-INTRCLASS(WFramedPHolder);
-INTRSTRUCT(WFramedParam);
+#include "frame.h"
 
 
-#define FRAMEDPARAM_INIT {0, 0, {0, 0, 0, 0}, NULL}
+#define FRAMEDPARAM_INIT {0, 0, {0, 0, 0, 0}, FRAME_MODE_FLOATING /*, NULL*/}
 
+INTRSTRUCT(WFramedParam);
 
 DECLSTRUCT(WFramedParam){
     uint inner_geom_gravity_set:1;
     int gravity;
     WRectangle inner_geom;
-    WRegionSimpleCreateFn *mkframe;
+    WFrameMode mode;
+    /*WRegionSimpleCreateFn *mkframe;*/
 };
 
 
@@ -48,6 +48,8 @@ extern void framedpholder_deinit(WFramedPHolder *ph);
 
 extern bool framedpholder_do_goto(WFramedPHolder *ph);
 
+extern WPHolder *framedpholder_do_root(WFramedPHolder *ph);
+
 extern WRegion *framedpholder_do_target(WFramedPHolder *ph);
 
 extern WRegion *framedpholder_do_attach(WFramedPHolder *ph, int flags,
@@ -57,4 +59,7 @@ extern WRegion *region_attach_framed(WRegion *reg, WFramedParam *param,
                                      WRegionAttachFn *fn, void *fn_param,
                                      WRegionAttachData *data);
 
+extern void frame_adjust_to_initial(WFrame *frame, const WFitParams *fp, 
+                                    const WFramedParam *param, WRegion *reg);
+
 #endif /* ION_IONCORE_FRAMEDPHOLDER_H */
index a3b1283d2ae250945f770e4aba73f504379990c3..9dabf485d4c4e92be0372081841a5dd7c89c7386 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/framep.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index e11a2d929bafa2ee04c59c961ac09e4015354aa1..56ea52702e54c75f58aa083d0da7f2f755f787db 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/fullscreen.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include "mwmhints.h"
 #include "focus.h"
 #include "group-cw.h"
+#include "return.h"
 
 
-bool clientwin_fullscreen_may_switchto(WClientWin *cwin)
-{
-    return (region_may_control_focus((WRegion*)cwin)
-            || !REGION_IS_ACTIVE(region_screen_of((WRegion*)cwin)));
-}
 
+/*{{{ Generic full screen mode code */
 
-bool clientwin_check_fullscreen_request(WClientWin *cwin, int w, int h,
-                                        bool sw)
+
+bool region_fullscreen_scr(WRegion *reg, WScreen *scr, bool switchto)
 {
-    WScreen *scr;
-    WMwmHints *mwm;
-    WRectangle *rwgeom;
-    
-    mwm=xwindow_get_mwmhints(cwin->win);
-    if(mwm==NULL || !(mwm->flags&MWM_HINTS_DECORATIONS) ||
-       mwm->decorations!=0)
-        return FALSE;
+    int rootx, rooty;
+    bool wasfs=TRUE;
+    int swf=(switchto ? MPLEX_ATTACH_SWITCHTO : 0);
+    WPHolder *ph=NULL;
+    bool newph=FALSE, ret;
+
+    ph=region_unset_get_return(reg);
     
-    FOR_ALL_SCREENS(scr){
-        if(!region_same_rootwin((WRegion*)scr, (WRegion*)cwin))
-            continue;
-        /* TODO: if there are multiple possible rootwins, use the one with
-         * requested position, if any.
-         */
-        if(REGION_GEOM(scr).w==w && REGION_GEOM(scr).h==h){
-            cwin->flags|=CLIENTWIN_FS_RQ;
-            if(!clientwin_fullscreen_scr(cwin, (WScreen*)scr, sw)){
-                cwin->flags&=~CLIENTWIN_FS_RQ;
-                return FALSE;
-            }
-            return TRUE;
-        }
+    if(ph==NULL){
+        ph=region_make_return_pholder(reg);
+        newph=TRUE;
     }
     
-    rwgeom=&REGION_GEOM(region_rootwin_of((WRegion*)cwin));
-                        
-    /* Catch Xinerama-unaware apps here */
-    if(rwgeom->w==w && rwgeom->h==h){
-        cwin->flags|=CLIENTWIN_FS_RQ;
-        if(clientwin_enter_fullscreen(cwin, sw))
-            return TRUE;
-        cwin->flags&=~CLIENTWIN_FS_RQ;
-    }
-
-    return FALSE;
-}
-
-
-static void destroy_pholder(WPHolder **fs_pholder)
-{
-    WPHolder *ph=*fs_pholder;
-    *fs_pholder=NULL;
-    destroy_obj((Obj*)ph);
+    ret=(mplex_attach_simple((WMPlex*)scr, reg, swf)!=NULL);
+    
+    if(!ret)
+        warn(TR("Failed to enter full screen mode."));
+    
+    if(!ret && newph)
+        destroy_obj((Obj*)ph);
+    else if(!region_do_set_return(reg, ph))
+        destroy_obj((Obj*)ph);
+    
+    return TRUE;
 }
 
 
-static bool do_fullscreen_scr(WRegion *reg, WPHolder **fs_pholder,
-                              WScreen *scr, bool switchto)
+bool region_enter_fullscreen(WRegion *reg, bool switchto)
 {
-    int rootx, rooty;
-    bool wasfs=TRUE;
-    int swf=(switchto ? MPLEX_ATTACH_SWITCHTO : 0);
-    WRegion *mgr=REGION_MANAGER(reg);
-    
-    if(*fs_pholder!=NULL)
-        destroy_pholder(fs_pholder);
-        
-    if(*fs_pholder==NULL && mgr!=NULL)
-        *fs_pholder=region_managed_get_pholder(mgr, reg);
+    WScreen *scr=region_screen_of(reg);
     
-    if(!mplex_attach_simple((WMPlex*)scr, reg, swf)){
-        warn(TR("Failed to enter full screen mode."));
-        if(*fs_pholder!=NULL)
-            destroy_pholder(fs_pholder);
-        return FALSE;
+    if(scr==NULL){
+        scr=rootwin_current_scr(region_rootwin_of(reg));
+        if(scr==NULL)
+            return FALSE;
     }
-
-    return TRUE;
+    
+    return region_fullscreen_scr(reg, scr, switchto);
 }
 
 
-static bool do_leave_fullscreen(WRegion *reg, WPHolder **fs_pholder, 
-                                bool switchto)
-{    
-    bool cf;
+bool region_leave_fullscreen(WRegion *reg, bool switchto)
+{
     int swf=(switchto ? PHOLDER_ATTACH_SWITCHTO : 0);
+    WPHolder *ph=region_unset_get_return(reg);
     
-    if(*fs_pholder==NULL)
+    if(ph==NULL)
         return FALSE;
     
-    cf=region_may_control_focus(reg);
-    
-    if(!pholder_attach(*fs_pholder, swf, reg)){
+    if(!pholder_attach_mcfgoto(ph, swf, reg)){
         warn(TR("Failed to return from full screen mode; remaining manager "
                 "or parent from previous location refused to manage us."));
         return FALSE;
     }
     
-    if(*fs_pholder!=NULL)
-        destroy_pholder(fs_pholder);
-        
-    if(cf)
-        region_goto(reg);
+    destroy_obj((Obj*)ph);
     
     return TRUE;
 }
 
 
-static WRegion *get_group(WClientWin *cwin)
+/*#undef REGION_IS_FULLSCREEN
+#define REGION_IS_FULLSCREEN(REG) (region_get_return((WRegion*)REG)!=NULL)*/
+
+
+static bool region_set_fullscreen(WRegion *reg, int sp)
 {
-    WGroupCW *cwg=OBJ_CAST(REGION_MANAGER(cwin), WGroupCW);
+    bool set=REGION_IS_FULLSCREEN(reg);
+    bool nset=libtu_do_setparam(sp, set);
     
-    return ((cwg!=NULL && group_bottom(&cwg->grp)==(WRegion*)cwin)
-            ? (WRegion*)cwg
-            : (WRegion*)cwin);
+    if(!XOR(nset, set))
+        return set;
+
+    if(nset)
+        region_enter_fullscreen(reg, TRUE);
+    else
+        region_leave_fullscreen(reg, TRUE);
+    
+    return REGION_IS_FULLSCREEN(reg);
 }
 
 
-bool clientwin_fullscreen_scr(WClientWin *cwin, WScreen *scr, bool switchto)
+/*}}}*/
+
+
+/*{{{ Client window requests */
+
+
+bool clientwin_fullscreen_may_switchto(WClientWin *cwin)
 {
-    WRegion *reg=get_group(cwin);
-    return do_fullscreen_scr(reg, &cwin->fs_pholder, scr, switchto);
+    return (region_may_control_focus((WRegion*)cwin)
+            || !REGION_IS_ACTIVE(region_screen_of((WRegion*)cwin)));
 }
 
 
-bool clientwin_enter_fullscreen(WClientWin *cwin, bool switchto)
+bool clientwin_check_fullscreen_request(WClientWin *cwin, int w, int h,
+                                        bool sw)
 {
-    WScreen *scr=region_screen_of((WRegion*)cwin);
+    WScreen *scr;
+    WMwmHints *mwm;
+    WRectangle *rwgeom;
     
-    if(scr==NULL){
-        scr=rootwin_current_scr(region_rootwin_of((WRegion*)cwin));
-        if(scr==NULL)
-            return FALSE;
+    mwm=xwindow_get_mwmhints(cwin->win);
+    if(mwm==NULL || !(mwm->flags&MWM_HINTS_DECORATIONS) ||
+       mwm->decorations!=0)
+        return FALSE;
+    
+    FOR_ALL_SCREENS(scr){
+        if(!region_same_rootwin((WRegion*)scr, (WRegion*)cwin))
+            continue;
+        /* Only Mplayer supports single Xinerama region FS to my knowledge, 
+         * and doesn't set position, so we also don't check position here, 
+         * and instead take the first screen with matching size.
+         */
+        if(REGION_GEOM(scr).w==w && REGION_GEOM(scr).h==h){
+            cwin->flags|=CLIENTWIN_FS_RQ;
+            if(!region_fullscreen_scr((WRegion*)cwin, (WScreen*)scr, sw)){
+                cwin->flags&=~CLIENTWIN_FS_RQ;
+                return FALSE;
+            }
+            return TRUE;
+        }
     }
     
-    return clientwin_fullscreen_scr(cwin, scr, switchto);
+    return FALSE;
 }
 
-bool clientwin_leave_fullscreen(WClientWin *cwin, bool switchto)
-{
-    WRegion *reg=get_group(cwin);
-    return do_leave_fullscreen(reg, &cwin->fs_pholder, switchto);
-}
 
+/*}}}*/
 
-bool clientwin_set_fullscreen(WClientWin *cwin, int sp)
-{
-    bool set=REGION_IS_FULLSCREEN(cwin);
-    bool nset=libtu_do_setparam(sp, set);
-    
-    if(!XOR(nset, set))
-        return set;
 
-    if(nset)
-        clientwin_enter_fullscreen(cwin, TRUE);
-    else
-        clientwin_leave_fullscreen(cwin, TRUE);
-    
-    return REGION_IS_FULLSCREEN(cwin);
-}
+/*{{{ Group exports */
 
 
 /*EXTL_DOC
- * Set client window \var{cwin} full screen state according to the 
+ * Set client window \var{reg} full screen state according to the 
  * parameter \var{how} (set/unset/toggle). Resulting state is returned,
  * which may not be what was requested.
  */
-EXTL_EXPORT_AS(WClientWin, set_fullscreen)
-bool clientwin_set_fullscreen_extl(WClientWin *cwin, const char *how)
+EXTL_EXPORT_AS(WGroup, set_fullscreen)
+bool group_set_fullscreen_extl(WGroup *grp, const char *how)
 {
-    return clientwin_set_fullscreen(cwin, libtu_string_to_setparam(how));
+    return region_set_fullscreen((WRegion*)grp, libtu_string_to_setparam(how));
 }
 
 
 /*EXTL_DOC
- * Is \var{cwin} in full screen mode?
+ * Is \var{reg} in full screen mode?
  */
 EXTL_SAFE
 EXTL_EXPORT_MEMBER
-bool clientwin_is_fullscreen(WClientWin *cwin)
+bool group_is_fullscreen(WGroup *grp)
 {
-    return REGION_IS_FULLSCREEN(cwin);
+    return REGION_IS_FULLSCREEN(grp);
 }
 
 
+/*}}}*/
 
index 8c820a430c9e5ccd8547b4db71f467583b1bf076..28227038b8b1e6f123d32a7bc03323963413995e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/fullscreen.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 
 extern bool clientwin_check_fullscreen_request(WClientWin *cwin, 
                                                int w, int h, bool switchto);
-extern bool clientwin_fullscreen_scr(WClientWin *cwin, WScreen *vp,
-                                     bool switchto);
-extern bool clientwin_enter_fullscreen(WClientWin *cwin, bool switchto);
-extern bool clientwin_leave_fullscreen(WClientWin *cwin, bool switchto);
-extern bool clientwin_set_fullscreen(WClientWin *cwin, int sp);
-extern bool clientwin_is_fullscreen(WClientWin *cwin);
 extern bool clientwin_fullscreen_may_switchto(WClientWin *cwin);
 
+extern bool region_fullscreen_scr(WRegion *reg, WScreen *vp, bool switchto);
+extern bool region_enter_fullscreen(WRegion *reg, bool switchto);
+extern bool region_leave_fullscreen(WRegion *reg, bool switchto);
+
+
 #endif /* ION_IONCORE_FULLSCREEN_H */
index 37569104b812575552ccab5799951413a944f044..b23dce272789da027a58c2cff62827e63cdbe854 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/global.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -17,6 +17,8 @@
 #include <X11/Xutil.h>
 #include <X11/Xresource.h>
 
+#include <libtu/stringstore.h>
+
 #include "rootwin.h"
 #include "screen.h"
 #include "window.h"
@@ -37,6 +39,7 @@ enum{
 
 INTRSTRUCT(WGlobal);
 
+
 DECLSTRUCT(WGlobal){
     int argc;
     char **argv;
@@ -85,6 +88,22 @@ DECLSTRUCT(WGlobal){
     bool enc_utf8; /* mb encoding is utf8? */
     
     const char *sm_client_id;
+    
+    struct{
+        StringId activated,
+                 inactivated,
+                 activity,
+                 sub_activity,
+                 name,
+                 unset_manager,
+                 set_manager,
+                 tag,
+                 set_return,
+                 unset_return,
+                 pseudoactivated,
+                 pseudoinactivated,
+                 deinit;
+    } notifies;
 };
 
 
diff --git a/ioncore/gr-util.h b/ioncore/gr-util.h
new file mode 100644 (file)
index 0000000..52cf384
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * ion/ioncore/gr-util.h
+ *
+ * Copyright (c) Tuomo Valkonen 2007. 
+ *
+ * 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.
+ */
+
+#ifndef ION_IONCORE_GR_UTIL_H
+#define ION_IONCORE_GR_UTIL_H
+
+#include "gr.h"
+
+#define GR_ATTR(X) grattr_##X
+#define GR_DEFATTR(X) static GrAttr GR_ATTR(X) = STRINGID_NONE
+#define GR_ALLOCATTR_BEGIN static bool alloced=FALSE; if(alloced) return
+#define GR_ALLOCATTR_END alloced=TRUE
+#define GR_ALLOCATTR(X) GR_ATTR(X) = stringstore_alloc(#X)
+
+#endif /* ION_IONCORE_GR_UTIL_H */
+
index d4f5a151959e6c7242284647a50e8bc2b1da9f7c..f86479287fd6ef2c84e50ece3ef2384b77657ff8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/gr.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -12,6 +12,7 @@
 #include <string.h>
 
 #include <libtu/objp.h>
+#include <libtu/minmax.h>
 #include <libextl/readconfig.h>
 #include <libmainloop/hooks.h>
 #include "common.h"
@@ -147,68 +148,294 @@ GrBrush *gr_get_brush(Window win, WRootWin *rootwin, const char *style)
 /*{{{ Scoring */
 
 
-uint gr_stylespec_score2(const char *spec, const char *attrib, 
-                         const char *attrib_p2)
+static GrAttr star_id=STRINGID_NONE;
+
+
+static int cmp(const void *a_, const void *b_)
 {
-    uint score=0;
-    uint a=0;
-    uint mult=1;
+    StringId a=*(const StringId*)a_;
+    StringId b=((const GrAttrScore*)b_)->attr;
+    
+    return (a < b ? -1 : ((a == b) ? 0 : 1));
+}
 
-    if(attrib==NULL){
-        if(spec==NULL || strcmp(spec, "*")==0)
-            return 1;
+
+static uint scorefind(const GrStyleSpec *attr, const GrAttrScore *spec)
+{
+    GrAttrScore *res;
+    
+    if(attr->attrs==NULL)
         return 0;
+    
+    if(star_id==STRINGID_NONE)
+        star_id=stringstore_alloc("*");
+    
+    if(spec->attr==star_id){
+        /* Since every item occurs only once on the list, with a score,
+         * return the score of the star in the spec, instead of one.
+         */
+        return spec->score;
+    }
+    
+    res=bsearch(&spec->attr, attr->attrs, attr->n, sizeof(GrAttrScore), cmp);
+    
+    return (res==NULL ? 0 : 2*res->score);
+}
+
+
+uint gr_stylespec_score2(const GrStyleSpec *spec, const GrStyleSpec *attr1, 
+                         const GrStyleSpec *attr2)
+{
+    uint score=0;
+    uint i;
+    
+    for(i=0; i<spec->n; i++){
+        int sc=scorefind(attr1, &spec->attrs[i]);
+        
+        if(attr2!=NULL)
+            sc=maxof(sc, scorefind(attr2, &spec->attrs[i]));
+        
+        if(sc==0){
+            score=0;
+            break;
+        }
+        
+        score+=sc;
+    }
+    
+    return score;
+}
+
+
+uint gr_stylespec_score(const GrStyleSpec *spec, const GrStyleSpec *attr)
+{
+    return gr_stylespec_score2(spec, attr, NULL);
+}
+
+
+static uint count_dashes(const char *str)
+{
+    uint n=0;
+    
+    if(str!=NULL){
+        while(1){
+            const char *p=strchr(str, '-');
+            if(p==NULL)
+                break;
+            n++;
+            str=p+1;
+        }
     }
     
-    while(1){
-        if(*spec=='*'){
-            score=score+mult;
-            spec++;
-            attrib=strchr(attrib, '-');
+    return n;
+}
+    
+    
+bool gr_stylespec_load_(GrStyleSpec *spec, const char *str, bool no_order_score)
+{
+    uint score=(no_order_score ? 1 : count_dashes(str)+1);
+    
+    gr_stylespec_init(spec);
+    
+    while(str!=NULL){
+        GrAttr a;
+        const char *p=strchr(str, '-');
+    
+        if(p==NULL){
+            a=stringstore_alloc(str);
+            str=p;
         }else{
-            while(1){
-                if(*attrib=='\0'){
-                    attrib=NULL;
-                    break;
-                }
-                if(*attrib=='-')
-                    break;
-                if(*spec!=*attrib)
-                    return 0;
-                attrib++;
-                spec++;
-            }
-            score=score+2*mult;
+            a=stringstore_alloc_n(str, p-str);
+            str=p+1;
         }
         
-        if(*spec=='\0')
-            return score;
-        else if(*spec!='-')
-            return 0;
+        if(a==STRINGID_NONE)
+            goto fail;
+            
+        if(!gr_stylespec_add(spec, a, score))
+            goto fail;
+            
+        stringstore_free(a);
         
-        if(attrib==NULL){
-            if(a==0 && attrib_p2!=NULL){
-                attrib=attrib_p2;
-                a++;
-            }else{
-                return 0;
-            }
-        }else{
-            attrib++;
+        if(!no_order_score)
+            score--;
+    }
+    
+    return TRUE;
+    
+fail:
+    gr_stylespec_unalloc(spec);
+    
+    return FALSE;
+}
+
+
+bool gr_stylespec_load(GrStyleSpec *spec, const char *str)
+{
+    return gr_stylespec_load_(spec, str, FALSE);
+}
+
+
+void gr_stylespec_unalloc(GrStyleSpec *spec)
+{
+    uint i;
+    
+    for(i=0; i<spec->n; i++)
+        stringstore_free(spec->attrs[i].attr);
+    
+    if(spec->attrs!=NULL){
+        free(spec->attrs);
+        spec->attrs=NULL;
+    }
+    
+    spec->n=0;
+}
+
+
+void gr_stylespec_init(GrStyleSpec *spec)
+{
+    spec->attrs=NULL;
+    spec->n=0;
+}
+
+
+static bool gr_stylespec_find_(GrStyleSpec *spec, GrAttr a, int *idx_ge)
+{
+    bool found=FALSE;
+    uint i;
+    
+    for(i=0; i<spec->n; i++){
+        if(spec->attrs[i].attr>=a){
+            found=(spec->attrs[i].attr==a);
+            break;
         }
+    }
+    
+    *idx_ge=i;
+    return found;
+}
+
+bool gr_stylespec_add(GrStyleSpec *spec, GrAttr a, uint score)
+{
+    static const uint sz=sizeof(GrAttrScore);
+    GrAttrScore *idsn;
+    int idx_ge;
+    
+    if(a==GRATTR_NONE || score==0)
+        return TRUE;
+    
+    if(gr_stylespec_find_(spec, a, &idx_ge)){
+        spec->attrs[idx_ge].score+=score;
+        return TRUE;
+    }
+    
+    idsn=(GrAttrScore*)realloc(spec->attrs, (spec->n+1)*sz);
+    
+    if(idsn==NULL)
+        return FALSE;
+        
+    stringstore_ref(a);
+        
+    memmove(idsn+idx_ge+1, idsn+idx_ge, (spec->n-idx_ge)*sz);
+    
+    idsn[idx_ge].attr=a;
+    idsn[idx_ge].score=score;
+    spec->attrs=idsn;
+    spec->n++;
+    
+    return TRUE;
+}
+
+
+bool gr_stylespec_set(GrStyleSpec *spec, GrAttr a)
+{
+    return gr_stylespec_add(spec, a, 1);
+}
+
+
+void gr_stylespec_unset(GrStyleSpec *spec, GrAttr a)
+{
+    static const uint sz=sizeof(GrAttrScore);
+    GrAttrScore *idsn;
+    int idx_ge;
+    
+    if(a==GRATTR_NONE)
+        return;
+    
+    if(!gr_stylespec_find_(spec, a, &idx_ge))
+        return;
+    
+    stringstore_free(spec->attrs[idx_ge].attr);
+    
+    memmove(spec->attrs+idx_ge, spec->attrs+idx_ge+1,
+            (spec->n-idx_ge-1)*sz);
+            
+    spec->n--;
+    
+    idsn=(GrAttrScore*)realloc(spec->attrs, (spec->n)*sz);
+    
+    if(idsn!=NULL || spec->n==0)
+        spec->attrs=idsn;
+}
+
 
-        spec++;
-        mult=mult*3;
+static bool gr_stylespec_do_init_from(GrStyleSpec *dst, const GrStyleSpec *src)
+{
+    uint i;
+    
+    if(src->n==0)
+        return TRUE;
+        
+    dst->attrs=ALLOC_N(GrAttrScore, src->n);
+    
+    if(dst->attrs==NULL)
+        return FALSE;
+    
+    for(i=0; i<src->n; i++){
+        dst->attrs[i]=src->attrs[i];
+        stringstore_ref(dst->attrs[i].attr);
     }
+    
+    dst->n=src->n;
+    
+    return TRUE;
 }
 
 
-uint gr_stylespec_score(const char *spec, const char *attrib)
+bool gr_stylespec_append(GrStyleSpec *dst, const GrStyleSpec *src)
 {
-    return gr_stylespec_score2(spec, attrib, NULL);
+    uint i;
+    bool ok=TRUE;
+    
+    if(dst->attrs==NULL){
+        ok=gr_stylespec_do_init_from(dst, src);
+    }else{
+        for(i=0; i<src->n; i++){
+            if(!gr_stylespec_add(dst, src->attrs[i].attr, src->attrs[i].score))
+                ok=FALSE;
+        }
+    }
+    
+    return ok;
 }
 
 
+bool gr_stylespec_equals(const GrStyleSpec *s1, const GrStyleSpec *s2)
+{
+    uint i;
+    
+    if(s1->n!=s2->n)
+        return FALSE;
+        
+    for(i=0; i<s1->n; i++){
+        if(s1->attrs[i].attr!=s2->attrs[i].attr)
+            return FALSE;
+    }
+    
+    return TRUE;
+}
+    
+
 /*}}}*/
 
 
@@ -294,17 +521,16 @@ DYNFUN bool grbrush_get_extra(GrBrush *brush, const char *key,
 /*{{{ Dynfuns/Borders */
 
 
-void grbrush_draw_border(GrBrush *brush, const WRectangle *geom,
-                         const char *attrib)
+void grbrush_draw_border(GrBrush *brush, const WRectangle *geom)
 {
-    CALL_DYN(grbrush_draw_border, brush, (brush, geom, attrib));
+    CALL_DYN(grbrush_draw_border, brush, (brush, geom));
 }
 
 
 void grbrush_draw_borderline(GrBrush *brush, const WRectangle *geom,
-                             const char *attrib, GrBorderLine line)
+                             GrBorderLine line)
 {
-    CALL_DYN(grbrush_draw_borderline, brush, (brush, geom, attrib, line));
+    CALL_DYN(grbrush_draw_borderline, brush, (brush, geom, line));
 }
 
 
@@ -315,11 +541,9 @@ void grbrush_draw_borderline(GrBrush *brush, const WRectangle *geom,
 
 
 void grbrush_draw_string(GrBrush *brush, int x, int y,
-                         const char *str, int len, bool needfill,
-                         const char *attrib)
+                         const char *str, int len, bool needfill)
 {
-    CALL_DYN(grbrush_draw_string, brush, 
-             (brush, x, y, str, len, needfill, attrib));
+    CALL_DYN(grbrush_draw_string, brush, (brush, x, y, str, len, needfill));
 }
 
 
@@ -339,19 +563,16 @@ uint grbrush_get_text_width(GrBrush *brush, const char *text, uint len)
 
 
 void grbrush_draw_textbox(GrBrush *brush, const WRectangle *geom,
-                          const char *text, const char *attr,
-                          bool needfill)
+                          const char *text, bool needfill)
 {
-    CALL_DYN(grbrush_draw_textbox, brush, 
-             (brush, geom, text, attr, needfill));
+    CALL_DYN(grbrush_draw_textbox, brush, (brush, geom, text, needfill));
 }
 
 void grbrush_draw_textboxes(GrBrush *brush, const WRectangle *geom,
                             int n, const GrTextElem *elem, 
-                            bool needfill, const char *common_attrib)
+                            bool needfill)
 {
-    CALL_DYN(grbrush_draw_textboxes, brush, 
-             (brush, geom, n, elem, needfill, common_attrib));
+    CALL_DYN(grbrush_draw_textboxes, brush, (brush, geom, n, elem, needfill));
 }
 
 
@@ -374,10 +595,9 @@ void grbrush_enable_transparency(GrBrush *brush, GrTransparency tr)
 }
 
 
-void grbrush_fill_area(GrBrush *brush, const WRectangle *geom,
-                       const char *attr)
+void grbrush_fill_area(GrBrush *brush, const WRectangle *geom)
 {
-    CALL_DYN(grbrush_fill_area, brush, (brush, geom, attr));
+    CALL_DYN(grbrush_fill_area, brush, (brush, geom));
 }
 
 
@@ -387,6 +607,24 @@ void grbrush_clear_area(GrBrush *brush, const WRectangle *geom)
 }
 
 
+void grbrush_init_attr(GrBrush *brush, const GrStyleSpec *spec)
+{
+    CALL_DYN(grbrush_init_attr, brush, (brush, spec));
+}
+
+
+void grbrush_set_attr(GrBrush *brush, GrAttr attr)
+{
+    CALL_DYN(grbrush_set_attr, brush, (brush, attr));
+}
+
+
+void grbrush_unset_attr(GrBrush *brush, GrAttr attr)
+{
+    CALL_DYN(grbrush_unset_attr, brush, (brush, attr));
+}
+
+
 /*}}}*/
 
 
index 911edc634c8bdadf413bab9011f82a4c641a11fc..2d552985c5fc09dec39bc174333307fe829b7eb9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/gr.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -12,6 +12,8 @@
 #ifndef ION_IONCORE_GR_H
 #define ION_IONCORE_GR_H
 
+#include <libtu/stringstore.h>
+
 #include "common.h"
 #include "rectangle.h"
 
@@ -42,10 +44,28 @@ typedef struct{
     uint spacing;
 } GrBorderWidths;
 
+typedef StringId GrAttr;
+
+#define GRATTR_NONE STRINGID_NONE
+
+#define GR_STYLESPEC_INIT {0, NULL}
+
+typedef struct{
+    GrAttr attr;
+    uint score;
+} GrAttrScore;
+
+typedef struct{
+    uint n;
+    GrAttrScore *attrs;
+} GrStyleSpec;
+
+#define GR_TEXTELEM_INIT {NULL, 0, GR_STYLESPEC_INIT}
+
 typedef struct{
     char *text;
     int iw;
-    char *attr;
+    GrStyleSpec attr;
 } GrTextElem;
 
 typedef enum{
@@ -66,6 +86,7 @@ typedef enum{
 #define GRBRUSH_AMEND       0x0001
 #define GRBRUSH_NEED_CLIP   0x0004
 #define GRBRUSH_NO_CLEAR_OK 0x0008 /* implied by GRBRUSH_AMEND */
+#define GRBRUSH_KEEP_ATTR   0x0010
 
 /* Engines etc. */
 
@@ -78,31 +99,32 @@ extern bool gr_select_engine(const char *engine);
 extern void gr_refresh();
 extern void gr_read_config();
 
-/* Stylespecs are of the from attr1-attr2-etc. We require that each attr in
- * 'spec' matches the one at same index in 'attrib' when '*' matches anything.
- * The score increment for exact match is 2*3^index and 1*3^index for '*' 
- * match. If all elements of 'spec' match those of 'attrib' exactly, the 
- * accumulated score is returned. Otherwise the matching fails and zero is
- * returned. For example:
- *  
- *  spec        attrib            score
- *     foo-*-baz     foo-bar-baz        2+1*3+2*3^2 = 23
- *  foo-bar          foo-bar-baz        2+2*3         = 8
- *  foo-baz          foo-bar-baz        0
- * 
- * gr_stylespec_score2 continues matching from attrib_p2 (if not NULL) when
- * it has reached end of attrib.
- */
-extern uint gr_stylespec_score(const char *spec, const char *attrib);
-extern uint gr_stylespec_score2(const char *spec, const char *attrib, 
-                                const char *attrib_p2);
+ /* Every star ('*') element of 'spec' increases score by one.
+  * Every other element of 'spec' found in 'attr' increases the score by the
+  * number set in attr times two. Any element of 'spec' (other than star),
+  *  not found in 'attr', forces score to zero.
+  */
+extern uint gr_stylespec_score(const GrStyleSpec *spec, const GrStyleSpec *attr);
+extern uint gr_stylespec_score2(const GrStyleSpec *spec, const GrStyleSpec *attr,
+                                const GrStyleSpec *attr2);
+
+extern void gr_stylespec_init(GrStyleSpec *spec);
+extern bool gr_stylespec_set(GrStyleSpec *spec, GrAttr a);
+extern void gr_stylespec_unset(GrStyleSpec *spec, GrAttr a);
+extern bool gr_stylespec_add(GrStyleSpec *spec, GrAttr a, uint score);
+extern bool gr_stylespec_append(GrStyleSpec *dst, const GrStyleSpec *src);
+extern void gr_stylespec_unalloc(GrStyleSpec *spec);
+extern bool gr_stylespec_equals(const GrStyleSpec *s1, const GrStyleSpec *s2);
+extern bool gr_stylespec_load(GrStyleSpec *spec, const char *str);
+extern bool gr_stylespec_load_(GrStyleSpec *spec, const char *str, 
+                               bool no_order_score);
 
 /* GrBrush */
 
 extern GrBrush *gr_get_brush(Window win, WRootWin *rootwin,
                              const char *style);
 
-extern GrBrush *grbrush_get_slave(GrBrush *brush, WRootWin *rootwin, 
+DYNFUN GrBrush *grbrush_get_slave(GrBrush *brush, WRootWin *rootwin, 
                                   const char *style);
 
 extern void grbrush_release(GrBrush *brush);
@@ -110,18 +132,23 @@ extern void grbrush_release(GrBrush *brush);
 extern bool grbrush_init(GrBrush *brush);
 extern void grbrush_deinit(GrBrush *brush);
 
-extern void grbrush_begin(GrBrush *brush, const WRectangle *geom,
+DYNFUN void grbrush_begin(GrBrush *brush, const WRectangle *geom,
                           int flags);
-extern void grbrush_end(GrBrush *brush);
+DYNFUN void grbrush_end(GrBrush *brush);
+
+/* Attributes */
+
+DYNFUN void grbrush_init_attr(GrBrush *brush, const GrStyleSpec *spec);
+DYNFUN void grbrush_set_attr(GrBrush *brush, GrAttr attr);
+DYNFUN void grbrush_unset_attr(GrBrush *brush, GrAttr attr);
 
 /* Border drawing */
 
 DYNFUN void grbrush_get_border_widths(GrBrush *brush, GrBorderWidths *bdi);
 
-DYNFUN void grbrush_draw_border(GrBrush *brush, const WRectangle *geom,
-                                const char *attrib);
+DYNFUN void grbrush_draw_border(GrBrush *brush, const WRectangle *geom);
 DYNFUN void grbrush_draw_borderline(GrBrush *brush, const WRectangle *geom,
-                                    const char *attrib, GrBorderLine line);
+                                    GrBorderLine line);
 
 /* String drawing */
 
@@ -130,18 +157,16 @@ DYNFUN void grbrush_get_font_extents(GrBrush *brush, GrFontExtents *fnti);
 DYNFUN uint grbrush_get_text_width(GrBrush *brush, const char *text, uint len);
 
 DYNFUN void grbrush_draw_string(GrBrush *brush, int x, int y,
-                                const char *str, int len, bool needfill,
-                                const char *attrib);
+                                const char *str, int len, bool needfill);
 
 /* Textbox drawing */
 
 DYNFUN void grbrush_draw_textbox(GrBrush *brush, const WRectangle *geom,
-                                 const char *text, const char *attr,
-                                 bool needfill);
+                                 const char *text, bool needfill);
 
 DYNFUN void grbrush_draw_textboxes(GrBrush *brush, const WRectangle *geom,
                                    int n, const GrTextElem *elem, 
-                                   bool needfill, const char *common_attrib);
+                                   bool needfill);
 
 /* Misc */
 
@@ -155,8 +180,7 @@ DYNFUN void grbrush_set_window_shape(GrBrush *brush, bool rough,
 
 DYNFUN void grbrush_enable_transparency(GrBrush *brush, GrTransparency mode);
 
-DYNFUN void grbrush_fill_area(GrBrush *brush, const WRectangle *geom, 
-                              const char *attr);
+DYNFUN void grbrush_fill_area(GrBrush *brush, const WRectangle *geom);
 DYNFUN void grbrush_clear_area(GrBrush *brush, const WRectangle *geom);
 
 DYNFUN bool grbrush_get_extra(GrBrush *brush, const char *key, 
index dc5cc69e6b43aca6dadc2e8cbc9e05a73aae8e47..0084ee204343d993e811e511470376ab2775f713 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/group-cw.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 /*{{{ Add/remove managed */
 
 
-WRegion *create_transient_frame(WWindow *par, 
-                                const WFitParams *fp)
-{
-    return (WRegion*)create_frame(par, fp, FRAME_MODE_TRANSIENT);
-}
-
-
 static WPHolder *groupcw_transient_pholder(WGroupCW *cwg, 
                                            const WClientWin *cwin,
                                            const WManageParams *mp)
@@ -69,7 +62,7 @@ static WPHolder *groupcw_transient_pholder(WGroupCW *cwg,
         fp.inner_geom_gravity_set=1;
         fp.inner_geom=mp->geom;
         fp.gravity=ForgetGravity;
-        fp.mkframe=create_transient_frame;
+        fp.mode=FRAME_MODE_TRANSIENT;
         
         ph=(WPHolder*)create_grouppholder(&cwg->grp, NULL, &param);
         
@@ -181,10 +174,9 @@ const char *groupcw_displayname(WGroupCW *cwg)
 }
 
 
-void groupcw_managed_notify(WGroupCW *cwg, WRegion *reg, const char *how)
+void groupcw_managed_notify(WGroupCW *cwg, WRegion *reg, WRegionNotify how)
 {
-    if(group_bottom(&cwg->grp)==reg 
-       && strcmp(how, "name")==0){
+    if(group_bottom(&cwg->grp)==reg && how==ioncore_g.notifies.name){
         /* Title has changed */
         region_notify_change((WRegion*)cwg, how);
     }
@@ -200,7 +192,6 @@ void groupcw_managed_notify(WGroupCW *cwg, WRegion *reg, const char *how)
 bool groupcw_init(WGroupCW *cwg, WWindow *parent, const WFitParams *fp)
 {
     cwg->transient_szplcy=DFLT_SZPLCY;
-    /*cwg->fs_pholder=NULL;*/
     
     if(!group_init(&(cwg->grp), parent, fp))
         return FALSE;
index b389d46a93e35ecf47ec9394f248bf92f2c89fd8..b8616a7d7890b9c7d0544f236e0b72d19cc3cf54 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/group-cw.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -39,7 +39,4 @@ extern WPHolder *groupcw_prepare_manage_transient(WGroupCW *cwg,
 
 extern WRegion *groupcw_load(WWindow *par, const WFitParams *fp, ExtlTab tab);
 
-extern WRegion *create_transient_frame(WWindow *par, 
-                                       const WFitParams *fp);
-
 #endif /* ION_IONCORE_GROUPCW_H */
index b50402cfd1b94992d812d0499906859c1d0a3655..48ee838cb4a5a7dccdd00b83ae175ebf2f82847c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/group-ws.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include "framedpholder.h"
 #include "float-placement.h"
 #include "resize.h"
+#include "conf.h"
 
 
 /*{{{ Settings */
 
 
-static bool default_ws_params_set=FALSE;
-static ExtlTab default_ws_params;
-
-
-/*EXTL_DOC
- * Set module basic settings. Currently only the \code{placement_method} 
- * parameter is supported.
- *
- * The method can be one  of ''udlr'', ''lrud'' (default) and ''random''. 
- * The ''udlr'' method looks for free space starting from top the top left
- * corner of the workspace moving first down keeping the x coordinate fixed.
- * If it find no free space, it start looking similarly at next x coordinate
- * unoccupied by other objects and so on. ''lrud' is the same but with the 
- * role of coordinates changed and both fall back to ''random'' placement 
- * if no free area was found.
- */
-
 void ioncore_groupws_set(ExtlTab tab)
 {
     char *method=NULL;
@@ -67,13 +51,6 @@ void ioncore_groupws_set(ExtlTab tab)
             warn(TR("Unknown placement method \"%s\"."), method);
         free(method);
     }
-    
-    if(extl_table_gets_t(tab, "default_ws_params", &t)){
-        if(default_ws_params_set)
-            extl_unref_table(default_ws_params);
-        default_ws_params=t;
-        default_ws_params_set=TRUE;
-    }
 }
 
 
@@ -85,9 +62,6 @@ void ioncore_groupws_get(ExtlTab t)
                        : (ioncore_placement_method==PLACEMENT_LRUD
                           ? "lrud" 
                           : "random")));
-    
-    if(default_ws_params_set)
-        extl_table_sets_t(t, "default_ws_params", default_ws_params);
 }
 
 
@@ -196,28 +170,6 @@ bool groupws_attach_framed_extl(WGroupWS *ws, WRegion *reg, ExtlTab t)
 /*{{{ groupws_prepare_manage */
 
 
-#define REG_OK(R) OBJ_IS(R, WMPlex)
-
-
-static WMPlex *find_existing(WGroupWS *ws)
-{
-    WGroupIterTmp tmp;
-    WRegion *r=(ws->grp.current_managed!=NULL 
-                ? ws->grp.current_managed->reg 
-                : NULL);
-    
-    if(r!=NULL && REG_OK(r))
-        return (WMPlex*)r;
-    
-    FOR_ALL_MANAGED_BY_GROUP(&ws->grp, r, tmp){
-        if(REG_OK(r))
-            return (WMPlex*)r;
-    }
-    
-    return NULL;
-}
-
-
 static WPHolder *groupws_do_prepare_manage(WGroupWS *ws, 
                                            const WClientWin *cwin,
                                            const WManageParams *param, 
@@ -228,13 +180,22 @@ static WPHolder *groupws_do_prepare_manage(WGroupWS *ws,
     WPHolder *ph;
     
     if(redir==MANAGE_REDIR_PREFER_YES){
-        WMPlex *m=find_existing(ws);
-        if(m!=NULL){
-            WPHolder *ph;
-            ph=region_prepare_manage((WRegion*)m, cwin, param,
-                                     MANAGE_REDIR_STRICT_YES);
-            if(ph!=NULL)
-                return ph;
+        WRegion *r=(ws->grp.current_managed!=NULL 
+                    ? ws->grp.current_managed->reg 
+                    : NULL);
+        WGroupIterTmp tmp;
+        WPHolder *ph=NULL;
+        
+        if(r!=NULL)
+            ph=region_prepare_manage(r, cwin, param, MANAGE_REDIR_PREFER_YES);
+        
+        if(ph==NULL){
+            FOR_ALL_MANAGED_BY_GROUP(&ws->grp, r, tmp){
+                ph=region_prepare_manage(r, cwin, param, 
+                                         MANAGE_REDIR_PREFER_YES);
+                if(ph!=NULL)
+                    break;
+            }
         }
     }
     
@@ -267,7 +228,7 @@ WPHolder *groupws_prepare_manage(WGroupWS *ws, const WClientWin *cwin,
     WRegion *b=(ws->grp.bottom!=NULL ? ws->grp.bottom->reg : NULL);
     WPHolder *ph=NULL;
     bool act_b=(ws->grp.bottom==ws->grp.current_managed);
-    bool always_float, use_bottom;
+    bool use_bottom;
     int weak=0;
     
     if(param->maprq && ioncore_g.opmode!=IONCORE_OPMODE_INIT
@@ -315,7 +276,7 @@ WPHolder *groupws_prepare_manage_transient(WGroupWS *ws, const WClientWin *cwin,
     fp.inner_geom_gravity_set=TRUE;
     fp.inner_geom=param->geom;
     fp.gravity=param->gravity;
-    fp.mkframe=create_transient_frame;
+    fp.mode=FRAME_MODE_TRANSIENT;
     
     ap.geom_weak_set=1;
     ap.geom_weak=0;
@@ -379,7 +340,7 @@ void groupws_deinit(WGroupWS *ws)
 
 
 WRegion *groupws_load(WWindow *par, const WFitParams *fp, 
-                       ExtlTab tab)
+                      ExtlTab tab)
 {
     WGroupWS *ws;
     
@@ -394,14 +355,6 @@ WRegion *groupws_load(WWindow *par, const WFitParams *fp,
 }
 
 
-WRegion *groupws_load_default(WWindow *par, const WFitParams *fp)
-{
-    return groupws_load(par, fp, (default_ws_params_set
-                                  ? default_ws_params
-                                  : extl_table_none()));
-}
-
-
 static DynFunTab groupws_dynfuntab[]={
     {(DynFun*)region_prepare_manage, 
      (DynFun*)groupws_prepare_manage},
index cfc43a96c88789853cf497d6497fbca66d53eb26..1fee2235b432fe57cd11e6bc9a7359d56611bd3b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/groupws.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -40,7 +40,6 @@ extern WGroupWS *create_groupws(WWindow *parent, const WFitParams *fp);
 extern bool groupws_init(WGroupWS *ws, WWindow *parent, const WFitParams *fp);
 extern void groupws_deinit(WGroupWS *ws);
 
-extern WRegion *groupws_load_default(WWindow *par, const WFitParams *fp);
 extern WRegion *groupws_load(WWindow *par, const WFitParams *fp, ExtlTab tab);
 
 extern void ioncore_groupws_set(ExtlTab tab);
index 591fcd757dd4f1a609f658a12de71d597f527f5c..538db141f11d9abe6c3b7fd6e785fa9faa659679 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/group.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -40,6 +40,7 @@
 #include "grouppholder.h"
 #include "frame.h"
 #include "float-placement.h"
+#include "return.h"
 
 
 static void group_place_stdisp(WGroup *ws, WWindow *parent,
@@ -352,7 +353,7 @@ void group_managed_remove(WGroup *ws, WRegion *reg)
     }
     
     region_unset_manager(reg, (WRegion*)ws);
-
+    
     if(!dest && !ds){
         if(was_bottom && !was_stdisp && ws->managed_stdisp==NULL){
             /* We should probably be managing any stdisp, that 'bottom' 
@@ -368,19 +369,30 @@ void group_managed_remove(WGroup *ws, WRegion *reg)
         }
         
         if(cur){
+            /* This may still potentially cause problems when focus
+             * change is pending. Perhaps we should use region_await_focus,
+             * if it is pointing to our child (and region_may_control_focus 
+             * fail if it is pointing somewhere else).
+             */
             WStacking *stf=find_to_focus(ws, next_st, TRUE);
-            if(stf!=NULL)
-                region_warp(stf->reg);
+            if(stf!=NULL && mcf){
+                region_maybewarp_now(stf->reg, FALSE);
+            }else{
+                ws->current_managed=stf;
+            }
         }
     }else if(dest && !ds){
-        mainloop_defer_destroy((Obj*)ws);
+        region_dispose((WRegion*)ws, mcf);
     }
 }
 
 
-static void group_managed_activated(WGroup *ws, WRegion *reg)
+static void group_managed_notify(WGroup *ws, WRegion *reg, WRegionNotify how)
 {
-    ws->current_managed=group_find_stacking(ws, reg);
+    if(how==ioncore_g.notifies.activated || 
+       how==ioncore_g.notifies.pseudoactivated){
+        ws->current_managed=group_find_stacking(ws, reg);
+    }
 }
 
 
@@ -584,17 +596,20 @@ bool group_do_attach_final(WGroup *ws,
      * position request is never honoured.
      */
     if((g.x+g.w<=REGION_GEOM(ws).x) ||
-       (g.y+g.h<=REGION_GEOM(ws).y) ||
-       (g.x>=REGION_GEOM(ws).x+REGION_GEOM(ws).w) ||
+       (g.x>=REGION_GEOM(ws).x+REGION_GEOM(ws).w)){
+        weak|=REGION_RQGEOM_WEAK_X;
+    }
+       
+    if((g.y+g.h<=REGION_GEOM(ws).y) ||
        (g.y>=REGION_GEOM(ws).y+REGION_GEOM(ws).h)){
-        weak|=REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_X;
+        weak|=REGION_RQGEOM_WEAK_Y;
     }
 
-    if((weak&(REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y))
-       ==(REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y) &&
+    if(weak&(REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y) &&
         (szplcy==SIZEPOLICY_UNCONSTRAINED ||
          szplcy==SIZEPOLICY_FREE ||
          szplcy==SIZEPOLICY_FREE_GLUE /* without flags */)){
+        /* TODO: use 'weak'? */
         group_calc_placement(ws, &g);
     }
 
@@ -665,7 +680,7 @@ WRegion *group_do_attach(WGroup *ws,
     WFitParams fp;
     WWindow *par;
     WRegion *reg;
-
+    
     if(ws->bottom!=NULL && param->bottom){
         warn(TR("'bottom' already set."));
         return NULL;
@@ -681,7 +696,7 @@ WRegion *group_do_attach(WGroup *ws,
         fp.g=REGION_GEOM(ws);
         fp.mode=REGION_FIT_BOUNDS|REGION_FIT_WHATEVER;
     }
-
+    
     return region_attach_helper((WRegion*) ws, par, &fp, 
                                 (WRegionDoAttachFn*)group_do_attach_final,
                                 /*(const WRegionAttachParams*)*/param, data);
@@ -985,7 +1000,7 @@ static WStacking *do_get_next(WGroup *ws, WStacking *sti,
     }
 
     if(sti_ok && focusable(ws, sti, min_level))
-        return st;
+        return sti;
     
     return NULL;
 }
@@ -1082,8 +1097,6 @@ void group_restack(WGroup *ws, Window other, int mode)
 
 WStacking *group_find_stacking(WGroup *ws, WRegion *r)
 {
-    WStacking *st;
-    
     if(r==NULL || REGION_MANAGER(r)!=(WRegion*)ws)
         return NULL;
     
@@ -1146,16 +1159,19 @@ WRegion *group_bottom(WGroup *ws)
 
 
 /*EXTL_DOC
- * Returns a list of regions managed by the workspace (frames, mostly).
+ * Iterate over managed regions of \var{ws} until \var{iterfn} returns
+ * \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT_MEMBER
-ExtlTab group_managed_list(WGroup *ws)
+bool group_managed_i(WGroup *ws, ExtlFn iterfn)
 {
     WGroupIterTmp tmp;
     group_iter_init(&tmp, ws);
     
-    return extl_obj_iterable_to_table((ObjIterator*)group_iter, &tmp);
+    return extl_iter_objlist_(iterfn, (ObjIterator*)group_iter, &tmp);
 }
 
 
@@ -1182,6 +1198,17 @@ Window group_xwindow(const WGroup *ws)
 }
 
 
+WRegion *region_group_if_bottom(WRegion *reg)
+{
+    WGroup *grp=REGION_MANAGER_CHK(reg, WGroup);
+    
+    if(grp!=NULL && group_bottom(grp)==reg)
+        return (WRegion*)grp;
+    else
+        return reg;
+}
+
+
 /*}}}*/
 
 
@@ -1295,8 +1322,8 @@ static DynFunTab group_dynfuntab[]={
     {region_do_set_focus, 
      group_do_set_focus},
     
-    {region_managed_activated
-     group_managed_activated},
+    {region_managed_notify
+     group_managed_notify},
     
     {region_managed_remove,
      group_managed_remove},
index 0de372a84f35f790604c334829dda0e8b2ff2dde..cfc1b600332d1b75f1c0f611a8f928ea22b4a938 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/group.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -36,7 +36,6 @@ DECLSTRUCT(WGroupAttachParams){
     uint switchto_set:1;
     
     uint switchto:1;
-    uint modal:1;
     uint bottom:1;
     
     int geom_weak;
@@ -48,7 +47,7 @@ DECLSTRUCT(WGroupAttachParams){
 };
 
 #define GROUPATTACHPARAMS_INIT \
-    {0, 0, 0, 0, 0,  0, 0, 0,  0, {0, 0, 0, 0},  0, 0, NULL}
+    {0, 0, 0, 0, 0,  0, 0,   0, {0, 0, 0, 0},  0, 0, NULL}
 
 
 DECLCLASS(WGroup){
@@ -105,6 +104,8 @@ extern bool group_managed_rqorder(WGroup *grp, WRegion *sub,
 extern WStacking *group_find_stacking(WGroup *ws, WRegion *r);
 extern WStacking *group_find_to_focus(WGroup *ws, WStacking *to_try);
 
+extern WRegion *region_group_if_bottom(WRegion *reg);
+
 typedef WStackingFilter WGroupIterFilter;
 typedef WStackingIterTmp WGroupIterTmp;
 
index ac3b6924d751ebb7ddf416c369cc454f816a3268..4112372de8618ca63731ffef46091f0f6841e085 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/groupedpholder.c
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
@@ -127,7 +127,7 @@ WRegion *groupedpholder_do_attach(WGroupedPHolder *ph, int flags,
     data2.u.n.fn=grouped_handler;
     data2.u.n.param=data;
         
-    return pholder_attach_(ph->cont, flags, &data2);
+    return pholder_do_attach(ph->cont, flags, &data2);
 }
 
 
@@ -139,19 +139,32 @@ WRegion *groupedpholder_do_attach(WGroupedPHolder *ph, int flags,
 
 bool groupedpholder_do_goto(WGroupedPHolder *ph)
 {
-    if(ph->cont!=NULL)
-        return pholder_goto(ph->cont);
-    
-    return FALSE;
+    return (ph->cont!=NULL
+            ? pholder_goto(ph->cont)
+            : FALSE);
 }
 
 
 WRegion *groupedpholder_do_target(WGroupedPHolder *ph)
 {
-    if(ph->cont!=NULL)
-        return pholder_target(ph->cont);
+    return (ph->cont!=NULL
+            ? pholder_target(ph->cont)
+            : NULL);
+}
+
+
+WPHolder *groupedpholder_do_root(WGroupedPHolder *ph)
+{
+    WPHolder *root;
+    
+    if(ph->cont==NULL)
+        return NULL;
+    
+    root=pholder_root(ph->cont);
     
-    return NULL;
+    return (root!=ph->cont 
+            ? root
+            : &ph->ph);
 }
 
 
@@ -170,6 +183,9 @@ static DynFunTab groupedpholder_dynfuntab[]={
 
     {(DynFun*)pholder_do_target, 
      (DynFun*)groupedpholder_do_target},
+     
+    {(DynFun*)pholder_do_root, 
+     (DynFun*)groupedpholder_do_root},
     
     END_DYNFUNTAB
 };
index 4feb699dd663c0b648352c12978399fdeb1f4dc1..3fb9edddabea0c06d0e189e29eb86896b070b0e8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/groupedpholder.h
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
@@ -33,6 +33,8 @@ extern bool groupedpholder_do_goto(WGroupedPHolder *ph);
 
 extern WRegion *groupedpholder_do_target(WGroupedPHolder *ph);
 
+extern WPHolder *groupedpholder_do_root(WGroupedPHolder *ph);
+
 extern WRegion *groupedpholder_do_attach(WGroupedPHolder *ph, int flags,
                                          WRegionAttachData *data);
 
index d92c5b4dbab0ad4c9ec27c01d14be16521f2b6f2..aa6f5cfaead48e3614adc68d9401a5f7f068bb9f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/grouppholder.c
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
@@ -73,9 +73,7 @@ bool grouppholder_init(WGroupPHolder *ph, WGroup *ws,
         if(st->above!=NULL && st->above->reg!=NULL)
             ph->param.stack_above=st->above->reg;
         
-        ph->param.modal=FALSE;
         ph->param.bottom=(st==ws->bottom);
-        /*ph->passive=FALSE;*/
     }else{
         ph->param=*param;
     }
index 4b0208ad8f61f92fda5cf418971b99537cebfd78..cb0ab198df23867d701b1aee17d88c10f9a07f51 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/grouppholder.h
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
index 95622b47095a3cad191e1af6dae30c1756638b3f..463b16e8a5eb277f1d6407e676eab85fd82fe14c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/infowin.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -45,7 +45,8 @@ bool infowin_init(WInfoWin *p, WWindow *parent, const WFitParams *fp,
         goto fail2;
     
     p->brush=NULL;
-    p->attr=NULL;
+    
+    gr_stylespec_init(&p->attr);
     
     infowin_updategr(p);
     
@@ -62,7 +63,8 @@ bool infowin_init(WInfoWin *p, WWindow *parent, const WFitParams *fp,
 
     return TRUE;
 
-fail3:    
+fail3:
+    gr_stylespec_unalloc(&p->attr);
     free(p->style);
 fail2:
     free(p->buffer);
@@ -86,11 +88,6 @@ void infowin_deinit(WInfoWin *p)
         p->buffer=NULL;
     }
 
-    if(p->attr!=NULL){
-        free(p->attr);
-        p->attr=NULL;
-    }
-    
     if(p->style!=NULL){
         free(p->style);
         p->style=NULL;
@@ -101,6 +98,8 @@ void infowin_deinit(WInfoWin *p)
         p->brush=NULL;
     }
     
+    gr_stylespec_unalloc(&p->attr);
+    
     window_deinit(&(p->wwin));
 }
 
@@ -124,7 +123,8 @@ void infowin_draw(WInfoWin *p, bool complete)
     g.h=REGION_GEOM(p).h;
 
     grbrush_begin(p->brush, &g, GRBRUSH_NO_CLEAR_OK);
-    grbrush_draw_textbox(p->brush, &g, p->buffer, p->attr, TRUE);
+    grbrush_init_attr(p->brush, &p->attr);
+    grbrush_draw_textbox(p->brush, &g, p->buffer, TRUE);
     grbrush_end(p->brush);
 }
 
@@ -157,25 +157,9 @@ void infowin_updategr(WInfoWin *p)
 /*{{{ Content-setting */
 
 
-bool infowin_set_attr2(WInfoWin *p, const char *attr1, const char *attr2)
+GrStyleSpec *infowin_stylespec(WInfoWin *p)
 {
-    char *p2=NULL;
-    
-    if(attr1!=NULL){
-        if(attr2==NULL)
-            p2=scopy(attr1);
-        else
-            libtu_asprintf(&p2, "%s-%s", attr1, attr2);
-        if(p2==NULL)
-            return FALSE;
-    }
-    
-    if(p->attr)
-        free(p->attr);
-    
-    p->attr=p2;
-    
-    return TRUE;
+    return &p->attr;
 }
 
 
index c57dd01cf7aee5b90f93acc09306ad21f66b6f6a..e51396b3e7cf0cccd9c4bda5e1f68d1ad8686791 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/infowin.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -23,8 +23,8 @@ DECLCLASS(WInfoWin){
     WWindow wwin;
     GrBrush *brush;
     char *buffer;
-    char *attr;
     char *style;
+    GrStyleSpec attr;
 };
 
 #define INFOWIN_BRUSH(INFOWIN) ((INFOWIN)->brush)
@@ -38,7 +38,7 @@ extern WInfoWin *create_infowin(WWindow *parent, const WFitParams *fp,
 extern void infowin_deinit(WInfoWin *p);
 
 extern void infowin_set_text(WInfoWin *p, const char *s);
-extern bool infowin_set_attr2(WInfoWin *p, const char *a1, const char *a2);
+extern GrStyleSpec *infowin_stylespec(WInfoWin *p);
 
 extern WRegion *infowin_load(WWindow *par, const WFitParams *fp, ExtlTab tab);
 
index 5c88803f8d2358f59cb3ea38e55387aa79fce45e..62f616b985135b5ccbc94fc2483fccf70cfd7ba6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/ioncore.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -69,7 +69,7 @@ WGlobal ioncore_g;
 static const char *progname="ion";
 
 static const char ioncore_copy[]=
-    "Ion " ION_VERSION ", copyright (c) Tuomo Valkonen 1999-2006.";
+    "Ion " ION_VERSION ", copyright (c) Tuomo Valkonen 1999-2007.";
 
 static const char ioncore_license[]=DUMMY_TR(
     "This program is free software; you can redistribute it and/or\n"
@@ -267,13 +267,11 @@ static bool init_hooks()
     INIT_HOOK_(ioncore_deinit_hook);
     INIT_HOOK_(screen_managed_changed_hook);
     INIT_HOOK_(frame_managed_changed_hook);
-    INIT_HOOK_(region_activated_hook);
-    INIT_HOOK_(region_inactivated_hook);
     INIT_HOOK_(clientwin_mapped_hook);
     INIT_HOOK_(clientwin_unmapped_hook);
     INIT_HOOK_(clientwin_property_change_hook);
-    INIT_HOOK_(region_notify_hook);
     
+    INIT_HOOK(region_notify_hook, ioncore_frame_quasiactivation_notify);
     INIT_HOOK(clientwin_do_manage_alt, clientwin_do_manage_default);
     INIT_HOOK(ioncore_handle_event_alt, ioncore_handle_event);
     INIT_HOOK(region_do_warp_alt, region_do_warp_default);
@@ -308,7 +306,11 @@ static bool register_classes()
 }
 
 
-static void init_global()
+#define INITSTR(NM)                             \
+    ioncore_g.notifies.NM=stringstore_alloc(#NM); \
+    if(ioncore_g.notifies.NM==STRINGID_NONE) return FALSE;
+    
+static bool init_global()
 {
     /* argc, argv must be set be the program */
     ioncore_g.dpy=NULL;
@@ -338,13 +340,30 @@ static void init_global()
     ioncore_g.frame_default_index=LLIST_INDEX_AFTER_CURRENT_ACT;
     
     ioncore_g.framed_transients=TRUE;
+    
+    INITSTR(activated);
+    INITSTR(inactivated);
+    INITSTR(activity);
+    INITSTR(sub_activity);
+    INITSTR(name);
+    INITSTR(unset_manager);
+    INITSTR(set_manager);
+    INITSTR(unset_return);
+    INITSTR(set_return);
+    INITSTR(pseudoactivated);
+    INITSTR(pseudoinactivated);
+    INITSTR(tag);
+    INITSTR(deinit);
+    
+    return TRUE;
 }
 
 
 bool ioncore_init(const char *prog, int argc, char *argv[],
                   const char *localedir)
 {
-    init_global();
+    if(!init_global())
+        return FALSE;
     
     progname=prog;
     ioncore_g.argc=argc;
@@ -483,7 +502,7 @@ static bool ioncore_init_x(const char *display, int stflags)
     ioncore_init_session(XDisplayName(display));
 
     for(i=drw; i<nrw; i++)
-        ioncore_manage_rootwin(i, stflags&IONCORE_STARTUP_NOXINERAMA);
+        create_rootwin(i);
 
     if(ioncore_g.rootwins==NULL){
         if(nrw-drw>1)
index 658e96626fca03e5c6ad9829294b2c7d57228c8c..ace4908835b2e2f431abf00ee48c8d4bcfc06f21 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/focus.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -16,7 +16,6 @@
 #include "common.h"
 
 #define IONCORE_STARTUP_ONEROOT    0x0001
-#define IONCORE_STARTUP_NOXINERAMA 0x0002
 
 extern bool ioncore_init(const char *prog, int argc, char *argv[],
                          const char *localedir);
index bf5c9fe7021975a52e6929f449edc3f350639dd7..ec03dddd2f6fd141cf526adb90bd27eb8208a4ef 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/share/ioncore-bindings.lua
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
index 156a95da2f11d9fd6bf9fd95ba58ac1ab7afc7a0..af1134cfe51061a9e9d2b959aa83b5b3452d1d27 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/share/ioncore_efbb.lua -- Minimal emergency fallback bindings.
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
index cc56732676fe2cc3318d0d5c4e38b25e2985887b..2255bdd37af2aa25f0de3fa8704348fa705930cb 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/share/ioncore_ext.lua -- Ioncore Lua library
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
index cb52b9705f781557506a81e05a6a1b33c64668b6..b36159397f510c4114c798075c32e4333c26563e 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/share/ioncore_luaext.lua
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
index 6032b9415df05e79a9b503724a6e9917966c2b0a..98d86a2c4b2a8041ae74f4191820126486250347 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/ioncore/ioncore_menudb.lua -- Routines for defining menus.
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
@@ -28,7 +28,9 @@ function ioncore.defmenu(name, tab)
             ioncore.warn(TR("Unable to append to non-table menu"))
             return
         else
-            table.append(menus[name], tab)
+            for k, v in ipairs(tab) do
+                table.insert(menus[name], v)
+            end
         end
     else
         menus[name]=tab
@@ -117,23 +119,73 @@ end
 
 -- Workspace and window lists {{{
 
-local function makelist(list)
-    local function mkentry(tgt)
-        return menuentry(tgt:name(), function() tgt:goto() end)
+local function addto(list)
+    return function(tgt, attr)
+        local e=menuentry(tgt:name(), function() tgt:goto() end)
+        e.attr=attr;
+        table.insert(list, e)
+        return true
     end
-    local entries=table.map(mkentry, list)
+end
+    
+local function sort(entries)
     table.sort(entries, function(a, b) return a.name < b.name end)
     return entries
 end
 
 function menus.windowlist()
-    return makelist(ioncore.clientwin_list())
+    local entries={}
+    ioncore.clientwin_i(addto(entries))
+    return sort(entries)
 end
 
 function menus.workspacelist()
-    return makelist(ioncore.region_list("WGenWS"))
+    local entries={}
+    local iter_=addto(entries)
+    
+    local function iter(obj) 
+        return (not obj_is(obj, "WGroupWS") 
+                or iter_(obj))
+    end
+    
+    ioncore.region_i(iter)
+    
+    return sort(entries)
+end
+
+local function focuslist(do_act)
+    local entries={}
+    local seen={}
+    local iter_=addto(entries)
+    
+    local function iter(obj, attr) 
+        if obj_is(obj, "WClientWin") then
+            iter_(obj, attr)
+            seen[obj]=true
+        end
+        return true
+    end
+    
+    local function iter_act(obj)
+        return iter(obj, "activity")
+    end
+    
+    local function iter_foc(obj)
+        return (seen[obj] or iter(obj))
+    end
+    
+    if do_act then
+        ioncore.activity_i(iter_act)
+    end
+    
+    ioncore.focushistory_i(iter_foc)
+    
+    return entries
 end
 
+menus.focuslist=function() return focuslist(true) end
+menus.focuslist_=function() return focuslist(false) end
+
 -- }}}
 
 
index fd72b4d96b0af1ee620d4637f2bbbbae5c3b71df..3b24b668e5ac2507f120e79199ae650a925aef2c 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/share/ioncore_misc.lua
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
@@ -9,18 +9,54 @@
 -- (at your option) any later version.
 --
 
+local group_tmpl = { type="WGroupWS" }
 
-local group_tmpl={type="WGroupWS", switchto=true}
+local default_tmpl = { switchto=true }
+
+local empty = { type="WGroupWS", managed={} }
+
+local layouts={
+    empty = empty,
+    default = empty,
+}
+
+--DOC 
+-- Define a new workspace layout with name \var{name}, and
+-- attach/creation parameters given in \var{tab}. The layout
+-- "empty" may not be defined.
+function ioncore.deflayout(name, tab)
+    assert(layout ~= "empty")
+    
+    if name=="default" and not tab then
+        layouts[name] = empty
+    else
+        layouts[name] = table.join(tab, group_tmpl)
+    end
+end
+
+--DOC
+-- Get named layout (or all of the latter parameter is set,
+-- but this is for internal use only).
+function ioncore.getlayout(name, all)
+    if all then
+        return layouts
+    else
+        return layouts[name]
+    end
+end
+
+ioncore.set{_get_layout=ioncore.getlayout}
 
 --DOC
 -- Create new workspace on screen \var{scr}. The table \var{tmpl}
--- may be used to override parts of \code{default_ws_params},
--- and \var{no_default} may be set to \code{true} to complete ignore it.
-function ioncore.create_ws(scr, tmpl, no_default)
-    local dflt=(not no_default and ioncore.get().default_ws_params) or {}
-    local t=table.join(table.join(tmpl or {}, dflt), group_tmpl)
+-- may be used to override parts of the layout named with \code{layout}.
+-- If no \var{layout} is given, "default" is used.
+function ioncore.create_ws(scr, tmpl, layout)
+    local lo=ioncore.getlayout(layout or "default")
+    
+    assert(lo, TR("Unknown layout"))
     
-    return scr:attach_new(t)
+    return scr:attach_new(table.join(tmpl or default_tmpl, lo))
 end
 
 
index 84107b81568a3f2012fe388f5f849d4ada2bee98..a908d3e29d896ffeac116031bab7ff488a687065 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/share/ioncore_wd.lua
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
index 333ff69a3667fd8073f6222dc9ee23f939d4e5c6..c241d63b378a6247c7edec07ff5b9cdf78b80e67 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/share/ioncore_winprops.lua
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
@@ -68,7 +68,7 @@ function ioncore.getwinprop(cwin)
     end
 end
 
-ioncore.set_get_winprop_fn(ioncore.getwinprop)
+ioncore.set{_get_winprop=ioncore.getwinprop}
 
 local function ensure_winproptab(class, role, instance)
     if not winprops[class] then
@@ -91,14 +91,16 @@ end
 --DOC
 -- The basic name-based winprop matching criteria.
 function ioncore.match_winprop_name(prop, cwin)
-    local nm=cwin:name()
     if not prop.name then
         return true
-    elseif nm then
-        local st, en=string.find(nm, prop.name)
-        return (st and en)
     else
-        return false
+        local nm=cwin:name()
+        if nm then
+            local st, en=string.find(nm, prop.name)
+            return (st and en)
+        else
+            return false
+        end
     end
 end
 
index b427228475e7600755bf57e4326b550fb14f2922..012a93147fca2472a90b3892dfd994224161b7ab 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/kbresize.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 3af07815a7ad4b685be6d5038476bc1112716d64..a3841c03eb0b0d24aaca63a5132dd5d98a1e6859 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/kbresize.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 00848a44e227ec46d25998c947da255d63efc4f7..57ada801f313f85d8f3515f6611e638876e62a2c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/key.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -172,11 +172,20 @@ static bool add_sub(WRegion *reg, uint key, uint state)
 
 
 static XKeyEvent *current_key_event=NULL;
+static uint current_kcb, current_state;
+static bool current_submap;
 
-
-XKeyEvent *ioncore_current_key_event()
+/* Note: state set to AnyModifier for submaps */
+bool ioncore_current_key(uint *kcb, uint *state, bool *sub)
 {
-    return current_key_event;
+    if(current_kcb==0)
+        return FALSE;
+        
+    *kcb=current_kcb;
+    *state=current_state;
+    *sub=current_submap;
+    
+    return TRUE;
 }
 
 
@@ -227,15 +236,16 @@ static bool do_key(WRegion *reg, XKeyEvent *ev)
             if(grabbed)
                 XUngrabKeyboard(ioncore_g.dpy, CurrentTime);
             
-            if(!subs)
-                current_key_event=ev;
-                
+            current_kcb=ev->keycode;
+            current_state=ev->state;
+            current_submap=subs;
+            
             /* TODO: having to pass both mgd and subreg for some handlers
              * to work is ugly and complex.
              */
             extl_call(binding->func, "ooo", NULL, binding_owner, mgd, subreg);
             
-            current_key_event=NULL;
+            current_kcb=0;
             
             if(ev->state!=0 && !subs && binding->wait)
                 waitrelease(oreg);
index e5ba29c0382982aa8d4efba4c28367b23a48a28f..35d8d5520b69442b975b887e9c013432362c881c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/key.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -19,6 +19,6 @@
 
 extern void ioncore_do_handle_keypress(XKeyEvent *ev);
 extern void clientwin_quote_next(WClientWin *cwin);
-extern XKeyEvent *ioncore_current_key_event();
+extern bool ioncore_current_key(uint *kcb, uint *state, bool *sub);
 
 #endif /* ION_IONCORE_KEY_H */
index 3baca81c07ba6e2fd1dc762a1f26494868aca0b0..657a9e3e2e9be85a97e4890a65b9f887b465a487 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/llist.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 83d148d1b0b661633fbb3f869def8a7db196fc4f..32ac441c735466c699e4b3f17515989c888396b9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/llist.h
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  * 
  * 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
index f1d78a0a95ac567f82cb3870e5de232e1d62e778..fda8d7b6117fcb6198d6403a282e1a32ef65ac69 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/manage.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -20,6 +20,9 @@
 #include "pointer.h"
 #include "netwm.h"
 #include "extlconv.h"
+#include "return.h"
+#include "conf.h"
+#include "group-ws.h"
 
 
 /*{{{ Add */
@@ -34,16 +37,22 @@ WScreen *clientwin_find_suitable_screen(WClientWin *cwin,
     FOR_ALL_SCREENS(scr){
         if(!region_same_rootwin((WRegion*)scr, (WRegion*)cwin))
             continue;
-        if(REGION_IS_ACTIVE(scr)){
-            found=scr;
-            if(!respectpos)
-                break;
-        }
-        
-        if(rectangle_contains(&REGION_GEOM(scr), param->geom.x, param->geom.y)){
-            found=scr;
-            if(respectpos)
-                break;
+            
+        if(!OBJ_IS(scr, WRootWin)){
+            /* The root window itself is only a fallback */
+            
+            if(REGION_IS_ACTIVE(scr)){
+                found=scr;
+                if(!respectpos)
+                    break;
+            }
+            
+            if(rectangle_contains(&REGION_GEOM(scr), 
+                                  param->geom.x, param->geom.y)){
+                found=scr;
+                if(respectpos)
+                    break;
+            }
         }
         
         if(found==NULL)
@@ -54,6 +63,78 @@ WScreen *clientwin_find_suitable_screen(WClientWin *cwin,
 }
 
 
+/*extern WRegion *ioncore_newly_created;*/
+
+
+static WPHolder *try_target(WClientWin *cwin, const WManageParams *param, 
+                            const char *target)
+{
+    WRegion *r=ioncore_lookup_region(target, NULL);
+        
+    if(r==NULL)
+        return NULL;
+            
+    return region_prepare_manage(r, cwin, param, MANAGE_REDIR_PREFER_NO);
+}
+
+
+static bool handle_target_winprops(WClientWin *cwin, const WManageParams *param,
+                                   WScreen *scr, WPHolder **ph_ret)
+{
+    char *layout=NULL, *target=NULL;
+    WPHolder *ph=NULL;
+    bool mgd=FALSE;
+    
+    if(extl_table_gets_s(cwin->proptab, "target", &target))
+        ph=try_target(cwin, param, target);
+    
+    if(ph==NULL && extl_table_gets_s(cwin->proptab, "new_group", &layout)){
+        ExtlTab lo=ioncore_get_layout(layout);
+        
+        free(layout);
+        
+        if(lo!=extl_table_none()){
+            WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
+            int mask=MPLEX_ATTACH_SWITCHTO;
+            WRegion *reg;
+            
+            if(param->switchto)
+                par.flags|=MPLEX_ATTACH_SWITCHTO;
+            
+            /*ioncore_newly_created=(WRegion*)cwin;*/
+            
+            reg=mplex_attach_new_(&scr->mplex, &par, mask, lo);
+            
+            extl_unref_table(lo);
+            
+            /*ioncore_newly_created=NULL;*/
+            
+            mgd=(region_manager((WRegion*)cwin)!=NULL);
+            
+            if(reg!=NULL && !mgd){
+                if(target!=NULL)
+                    ph=try_target(cwin, param, target);
+                
+                if(ph==NULL){
+                    ph=region_prepare_manage(reg, cwin, param, 
+                                             MANAGE_REDIR_PREFER_YES);
+                    
+                    if(ph==NULL)
+                        destroy_obj((Obj*)reg);
+                }
+            }
+        }
+    }
+    
+    if(target!=NULL)
+        free(target);
+    
+    *ph_ret=ph;
+    
+    return mgd;
+}
+
+
 bool clientwin_do_manage_default(WClientWin *cwin, 
                                  const WManageParams *param)
 {
@@ -64,13 +145,6 @@ bool clientwin_do_manage_default(WClientWin *cwin,
     int swf;
     bool ok, tmp;
 
-    /* Check if param->tfor or any of its managers want to manage cwin. */
-    if(param->tfor!=NULL){
-        assert(param->tfor!=cwin);
-        ph=region_prepare_manage_transient((WRegion*)param->tfor, cwin, 
-                                           param, 0);
-    }
-    
     /* Find a suitable screen */
     scr=clientwin_find_suitable_screen(cwin, param);
     if(scr==NULL){
@@ -78,24 +152,36 @@ bool clientwin_do_manage_default(WClientWin *cwin,
         return FALSE;
     }
     
+    if(handle_target_winprops(cwin, param, scr, &ph))
+        return TRUE;
+        
+    /* Check if param->tfor or any of its managers want to manage cwin. */
+    if(ph==NULL && param->tfor!=NULL){
+        assert(param->tfor!=cwin);
+        ph=region_prepare_manage_transient((WRegion*)param->tfor, cwin, 
+                                           param, 0);
+    }
+
     if(ph==NULL){
         /* Find a placeholder for non-fullscreen state */
         ph=region_prepare_manage((WRegion*)scr, cwin, param,
                                  MANAGE_REDIR_PREFER_YES);
-    }
-    
-    /* Check fullscreen mode */
-    if(extl_table_gets_b(cwin->proptab, "fullscreen", &tmp))
-        fs=tmp;
 
-    if(fs<0)
-        fs=netwm_check_initial_fullscreen(cwin, param->switchto);
+        /* Check fullscreen mode. (This is intentionally not done
+         * for transients and windows with target winprops.)
+         */
+        if(extl_table_gets_b(cwin->proptab, "fullscreen", &tmp))
+            fs=tmp;
+
+        if(fs<0)
+            fs=netwm_check_initial_fullscreen(cwin, param->switchto);
     
-    if(fs<0){
-        fs=clientwin_check_fullscreen_request(cwin, 
-                                              param->geom.w,
-                                              param->geom.h,
-                                              param->switchto);
+        if(fs<0){
+            fs=clientwin_check_fullscreen_request(cwin, 
+                                                  param->geom.w,
+                                                  param->geom.h,
+                                                  param->switchto);
+        }
     }
 
     if(fs>0){
@@ -105,8 +191,10 @@ bool clientwin_do_manage_default(WClientWin *cwin,
             destroy_obj((Obj*)ph);
             return TRUE;
         }
-        assert(cwin->fs_pholder==NULL);
-        cwin->fs_pholder=ph;
+        
+        if(!region_do_set_return((WRegion*)cwin, ph))
+            destroy_obj((Obj*)ph);
+        
         return TRUE;
     }
         
index 5354beaa501317fb4eb8c7a786e41fb5484bb032..5b81f3d0245bd9b256e04e15714826a726bddc43 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/manage.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index f7f62429b233fc235fdb4dc27c74a36d1472ef67..34d64c887b982efaec466dc0e2d5585f5c290222 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/modules.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6cc565ed3bdb5e63de1d1b6c12e073c2c7ed3190..0d00e52af31267b196224d542c2ad72550b56aac 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/modules.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 158b9ffa42f1b9a74c17b950ef355e28f77de32c..a202e7c51672b0565baacfb03f95539d230d3eb8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/mplex.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -94,8 +94,8 @@ WStacking *mplex_iter_nodes(WMPlexIterTmp *tmp)
 /*{{{ Destroy/create mplex */
 
 
-bool mplex_do_init(WMPlex *mplex, WWindow *parent, Window win,
-                   const WFitParams *fp, bool create)
+bool mplex_do_init(WMPlex *mplex, WWindow *parent, 
+                   const WFitParams *fp, Window win)
 {
     mplex->flags=0;
     
@@ -110,21 +110,13 @@ bool mplex_do_init(WMPlex *mplex, WWindow *parent, Window win,
     mplex->stdispinfo.pos=MPLEX_STDISP_BL;
     mplex->stdispinfo.fullsize=FALSE;
     
-    if(create){
-        if(!window_init((WWindow*)mplex, parent, fp))
-            return FALSE;
-    }else{
-        if(!window_do_init((WWindow*)mplex, parent, win, fp))
-            return FALSE;
-    }
+    if(!window_do_init((WWindow*)mplex, parent, fp, win))
+        return FALSE;
     
     mplex->win.region.flags|=REGION_BINDINGS_ARE_GRABBED;
     
     window_select_input(&(mplex->win), IONCORE_EVENTMASK_CWINMGR);
     
-    region_add_bindmap((WRegion*)mplex, ioncore_mplex_bindmap);
-    region_add_bindmap((WRegion*)mplex, ioncore_mplex_toplevel_bindmap);
-    
     region_register((WRegion*)mplex);
     
     /* Call this to set MPLEX_MANAGED_UNVIEWABLE if necessary. */
@@ -136,7 +128,7 @@ bool mplex_do_init(WMPlex *mplex, WWindow *parent, Window win,
 
 bool mplex_init(WMPlex *mplex, WWindow *parent, const WFitParams *fp)
 {
-    return mplex_do_init(mplex, parent, None, fp, TRUE);
+    return mplex_do_init(mplex, parent, fp, None);
 }
 
 
@@ -266,31 +258,36 @@ WRegion *mplex_mx_nth(WMPlex *mplex, uint n)
 
 
 /*EXTL_DOC
- * Returns a list of regions on the numbered/mutually exclusive list of 
- * \var{mplex}.
+ * Iterate over numbered/mutually exclusive region list of \var{mplex} 
+ * until \var{iterfn} returns \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT_MEMBER
-ExtlTab mplex_mx_list(WMPlex *mplex)
+bool mplex_mx_i(WMPlex *mplex, ExtlFn iterfn)
 {
     WLListIterTmp tmp;
     llist_iter_init(&tmp, mplex->mx_list);
     
-    return extl_obj_iterable_to_table((ObjIterator*)llist_iter_regions, &tmp);
+    return extl_iter_objlist_(iterfn, (ObjIterator*)llist_iter_regions, &tmp);
 }
 
 
 /*EXTL_DOC
- * Returns a list of all regions managed by \var{mplex}.
+ * Iterate over managed regions of \var{mplex} until \var{iterfn} returns
+ * \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT_MEMBER
-ExtlTab mplex_managed_list(WMPlex *mplex)
+bool mplex_managed_i(WMPlex *mplex, ExtlFn iterfn)
 {
     WMPlexIterTmp tmp;
     mplex_iter_init(&tmp, mplex);
     
-    return extl_obj_iterable_to_table((ObjIterator*)mplex_iter, &tmp);
+    return extl_iter_objlist_(iterfn, (ObjIterator*)mplex_iter, &tmp);
 }
 
 
@@ -298,8 +295,8 @@ ExtlTab mplex_managed_list(WMPlex *mplex)
  * Set index of \var{reg} within the multiplexer to \var{index} within 
  * the mutually exclusive list. Special values for \var{index} are:
  * \begin{tabularx}{\linewidth}{lX}
- *   $-1$ & After \fnref{WMPlex.mx_current}. \\
- *   $-2$ & Last. \\
+ *   $-1$ & Last. \\
+ *   $-2$ & After \fnref{WMPlex.mx_current}. \\
  * \end{tabularx}
  */
 EXTL_EXPORT_MEMBER
@@ -514,7 +511,7 @@ static void mplex_managed_rqgeom(WMPlex *mplex, WRegion *sub,
 
     mplex_managed_geom(mplex, &fp.g);
 
-    sizepolicy(&node->szplcy, sub, &rq->geom, &rq->flags, &fp);
+    sizepolicy(&node->szplcy, sub, &rq->geom, rq->flags, &fp);
     
     if(geomret!=NULL)
         *geomret=fp.g;
@@ -921,11 +918,11 @@ typedef WStacking *NxtFn(WMPlex *mplex, WStacking *st, bool wrap);
 
 
 static WRegion *do_navi(WMPlex *mplex, WStacking *sti, 
-                        NxtFn *fn, WRegionNaviData *data, bool sti_ok)
+                        NxtFn *fn, WRegionNaviData *data, 
+                        bool sti_ok, bool wrap)
 {
     WStacking *st, *stacking;
     uint min_level=0;
-    bool wrap=FALSE;
     
     stacking=mplex_get_stacking(mplex);
     
@@ -968,20 +965,22 @@ WRegion *mplex_navi_first(WMPlex *mplex, WRegionNavi nh,
                           WRegionNaviData *data)
 {
     WStacking *lst=mplex->mgd;
-
-    if(lst==NULL)
-        return region_navi_cont((WRegion*)mplex, NULL, data);
+    WRegion *res=NULL;
     
-    if(nh==REGION_NAVI_ANY){
-        /* ? */
-    }
+    if(lst!=NULL){
+        if(nh==REGION_NAVI_ANY){
+            /* ? */
+        }
     
-    if(nh==REGION_NAVI_ANY || nh==REGION_NAVI_END || 
-       nh==REGION_NAVI_BOTTOM || nh==REGION_NAVI_RIGHT){
-        return do_navi(mplex, lst, mplex_prv, data, TRUE);
-    }else{
-        return do_navi(mplex, lst->mgr_prev, mplex_nxt, data, TRUE);
+        if(nh==REGION_NAVI_ANY || nh==REGION_NAVI_END || 
+           nh==REGION_NAVI_BOTTOM || nh==REGION_NAVI_RIGHT){
+            res=do_navi(mplex, lst, mplex_prv, data, TRUE, TRUE);
+        }else{
+            res=do_navi(mplex, lst->mgr_prev, mplex_nxt, data, TRUE, TRUE);
+        }
     }
+    
+    return region_navi_cont((WRegion*)mplex, res, data);
 }
 
     
@@ -989,6 +988,7 @@ WRegion *mplex_navi_next(WMPlex *mplex, WRegion *rel, WRegionNavi nh,
                          WRegionNaviData *data)
 {
     WStacking *st;
+    WRegion *res;
     
     if(rel!=NULL){
         st=mplex_find_stacking(mplex, rel);
@@ -999,17 +999,19 @@ WRegion *mplex_navi_next(WMPlex *mplex, WRegion *rel, WRegionNavi nh,
     }else{
         return mplex_navi_first(mplex, nh, data);
     }
-        
+    
     if(nh==REGION_NAVI_ANY){
         /* ? */
     }
     
     if(nh==REGION_NAVI_ANY || nh==REGION_NAVI_END || 
        nh==REGION_NAVI_BOTTOM || nh==REGION_NAVI_RIGHT){
-        return do_navi(mplex, st, mplex_nxt, data, FALSE);
+        res=do_navi(mplex, st, mplex_nxt, data, FALSE, FALSE);
     }else{
-        return do_navi(mplex, st, mplex_prv, data, FALSE);
+        res=do_navi(mplex, st, mplex_prv, data, FALSE, FALSE);
     }
+    
+    return region_navi_cont((WRegion*)mplex, res, data);
 }
 
 
@@ -1265,15 +1267,15 @@ WRegion *mplex_attach_simple(WMPlex *mplex, WRegion *reg, int flags)
 }
 
 
-static void get_params(WMPlex *mplex, ExtlTab tab, WMPlexAttachParams *par)
+static void get_params(WMPlex *mplex, ExtlTab tab, int mask,
+                       WMPlexAttachParams *par)
 {
     int layer=1;
     int tmp;
+    int ok=~mask;
     
-    par->flags=0;
-    
-    if(extl_table_gets_i(tab, "layer", &tmp)){
-        /* backwards compatibility */
+    if(mask==0 && extl_table_gets_i(tab, "layer", &tmp)){
+        /* backwards compatibility. No need to consider masked cases */
         if(tmp==2){
             par->flags|=MPLEX_ATTACH_UNNUMBERED;
             if(!extl_table_is_bool_set(tab, "passive"))
@@ -1282,34 +1284,36 @@ static void get_params(WMPlex *mplex, ExtlTab tab, WMPlexAttachParams *par)
     }
 
     if(extl_table_gets_i(tab, "level", &tmp)){
-        if(tmp>=0){
+        if(tmp>=0 && ok&MPLEX_ATTACH_LEVEL){
             par->flags|=MPLEX_ATTACH_LEVEL;
             par->level=tmp;
         }
     }
     
     if(extl_table_is_bool_set(tab, "modal"))
-        par->flags|=MPLEX_ATTACH_MODAL;
+        par->flags|=MPLEX_ATTACH_MODAL&ok;
 
     if(extl_table_is_bool_set(tab, "unnumbered"))
-        par->flags|=MPLEX_ATTACH_UNNUMBERED;
+        par->flags|=MPLEX_ATTACH_UNNUMBERED&ok;
     
     if(extl_table_is_bool_set(tab, "switchto"))
-        par->flags|=MPLEX_ATTACH_SWITCHTO;
+        par->flags|=MPLEX_ATTACH_SWITCHTO&ok;
 
     if(extl_table_is_bool_set(tab, "hidden"))
-        par->flags|=MPLEX_ATTACH_HIDDEN;
+        par->flags|=MPLEX_ATTACH_HIDDEN&ok;
 
     if(extl_table_gets_i(tab, "index", &(par->index)))
-        par->flags|=MPLEX_ATTACH_INDEX;
+        par->flags|=MPLEX_ATTACH_INDEX&ok;
 
     if(extl_table_gets_i(tab, "sizepolicy", &tmp)){
-        par->flags|=MPLEX_ATTACH_SIZEPOLICY;
-        par->szplcy=tmp;
+        if(ok&MPLEX_ATTACH_SIZEPOLICY){
+            par->flags|=MPLEX_ATTACH_SIZEPOLICY;
+            par->szplcy=tmp;
+        }
     }
     
     if(extl_table_gets_rectangle(tab, "geom", &par->geom))
-        par->flags|=MPLEX_ATTACH_GEOM;
+        par->flags|=MPLEX_ATTACH_GEOM&ok;
 }
 
 
@@ -1321,13 +1325,13 @@ static void get_params(WMPlex *mplex, ExtlTab tab, WMPlexAttachParams *par)
 EXTL_EXPORT_MEMBER
 WRegion *mplex_attach(WMPlex *mplex, WRegion *reg, ExtlTab param)
 {
-    WMPlexAttachParams par;
+    WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
     WRegionAttachData data;
 
     if(reg==NULL)
         return NULL;
     
-    get_params(mplex, param, &par);
+    get_params(mplex, param, 0, &par);
     
     data.type=REGION_ATTACH_REPARENT;
     data.u.reg=reg;
@@ -1336,6 +1340,20 @@ WRegion *mplex_attach(WMPlex *mplex, WRegion *reg, ExtlTab param)
 }
 
 
+WRegion *mplex_attach_new_(WMPlex *mplex, WMPlexAttachParams *par, 
+                           int mask, ExtlTab param)
+{
+    WRegionAttachData data;
+    
+    get_params(mplex, param, mask, par);
+    
+    data.type=REGION_ATTACH_LOAD;
+    data.u.tab=param;
+    
+    return mplex_do_attach(mplex, par, &data);
+}
+
+
 /*EXTL_DOC
  * Create a new region to be managed by \var{mplex}. At least the following
  * fields in \var{param} are understood (all but \var{type} are optional).
@@ -1365,15 +1383,9 @@ WRegion *mplex_attach(WMPlex *mplex, WRegion *reg, ExtlTab param)
 EXTL_EXPORT_MEMBER
 WRegion *mplex_attach_new(WMPlex *mplex, ExtlTab param)
 {
-    WMPlexAttachParams par;
-    WRegionAttachData data;
+    WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
     
-    get_params(mplex, param, &par);
-    
-    data.type=REGION_ATTACH_LOAD;
-    data.u.tab=param;
-    
-    return mplex_do_attach(mplex, &par, &data);
+    return mplex_attach_new_(mplex, &par, 0, param);
 }
 
 
@@ -1384,9 +1396,12 @@ EXTL_EXPORT_MEMBER
 void mplex_attach_tagged(WMPlex *mplex)
 {
     WRegion *reg;
+    int flags=MPLEX_ATTACH_SWITCHTO;
     
-    while((reg=ioncore_tags_take_first())!=NULL)
-        mplex_attach_simple(mplex, reg, 0);
+    while((reg=ioncore_tagged_take_first())!=NULL){
+        mplex_attach_simple(mplex, reg, flags);
+        /*flags=0;*/
+    }
 }
 
 
@@ -1597,17 +1612,14 @@ bool mplex_set_stdisp(WMPlex *mplex, WRegion *reg,
         
         if(!CAN_MANAGE_STDISP(mgr))
             mgr=NULL;
-        
-        if(oldstdisp!=reg){
-            mainloop_defer_destroy((Obj*)oldstdisp);
-            watch_reset(&(mplex->stdispwatch));
-        }
     }
     
     if(din!=NULL)
         mplex->stdispinfo=*din;
     
     if(reg==NULL){
+        watch_reset(&(mplex->stdispwatch));
+        
         if(mgr!=NULL){
             region_unmanage_stdisp(mgr, TRUE, FALSE);
             if(oldstdisp!=NULL)
@@ -1619,6 +1631,9 @@ bool mplex_set_stdisp(WMPlex *mplex, WRegion *reg,
         mplex_remanage_stdisp(mplex);
     }
     
+    if(oldstdisp!=NULL && oldstdisp!=reg)
+        region_dispose((WRegion*)oldstdisp, FALSE);
+    
     return TRUE;
 }
 
@@ -1920,7 +1935,7 @@ ExtlTab mplex_get_configuration(WMPlex *mplex)
     tab=region_get_base_configuration((WRegion*)mplex);
     
     subs=extl_create_table();
-    extl_table_sets_t(tab, "subs", subs);
+    extl_table_sets_t(tab, "managed", subs);
     
     /* First the numbered/mutually exclusive nodes */
     FOR_ALL_NODES_ON_LLIST(lnode, mplex->mx_list, ltmp){
@@ -1964,16 +1979,17 @@ void mplex_load_contents(WMPlex *mplex, ExtlTab tab)
         extl_unref_table(subtab);
     }*/
     
-    if(extl_table_gets_t(tab, "subs", &substab)){
+    if(extl_table_gets_t(tab, "managed", &substab) ||
+       extl_table_gets_t(tab, "subs", &substab)){
         n=extl_table_get_n(substab);
         for(i=1; i<=n; i++){
             if(extl_table_geti_t(substab, i, &subtab)){
                 /*mplex_attach_new(mplex, subtab);*/
-                WMPlexAttachParams par;
+                WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
                 WRegionAttachData data;
                 char *tmp=NULL;
                 
-                get_params(mplex, subtab, &par);
+                get_params(mplex, subtab, 0, &par);
                 
                 par.flags|=MPLEX_ATTACH_INDEX;
                 par.index=LLIST_INDEX_LAST;
index 889f387d298a53f1f11fdb151a1efeb49fef280d..829c84124c5ac4a0521f516c2a044b082fc816bb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/mplex.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  * 
  * 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
@@ -108,8 +108,8 @@ DECLCLASS(WMPlex){
 extern WMPlex *create_mplex(WWindow *parent, const WFitParams *fp);
 extern bool mplex_init(WMPlex *mplex, WWindow *parent,
                        const WFitParams *fp);
-extern bool mplex_do_init(WMPlex *mplex, WWindow *parent, Window win,
-                          const WFitParams *fp, bool create);
+extern bool mplex_do_init(WMPlex *mplex, WWindow *parent, 
+                          const WFitParams *fp, Window win);
 extern void mplex_deinit(WMPlex *mplex);
 
 /* Resize and reparent */
@@ -129,6 +129,8 @@ extern WRegion *mplex_attach_simple(WMPlex *mplex, WRegion *reg,
                                     int flags);
 
 extern WRegion *mplex_attach(WMPlex *mplex, WRegion *reg, ExtlTab param);
+extern WRegion *mplex_attach_new_(WMPlex *mplex, WMPlexAttachParams *partmpl,
+                                  int mask, ExtlTab param);
 extern WRegion *mplex_attach_new(WMPlex *mplex, ExtlTab param);
 
 extern WRegion *mplex_do_attach_pholder(WMPlex *mplex, WMPlexPHolder *ph,
@@ -176,9 +178,11 @@ extern bool mplex_managed_rqorder(WMPlex *mplex, WRegion *sub,
 extern WRegion *mplex_current(WMPlex *mplex);
 extern bool mplex_may_destroy(WMPlex *mplex);
 
+extern bool mplex_managed_i(WMPlex *mplex, ExtlFn iterfn);
+
 extern int mplex_mx_count(WMPlex *mplex);
 extern WRegion *mplex_mx_nth(WMPlex *mplex, uint n);
-extern ExtlTab mplex_mx_list(WMPlex *mplex);
+extern bool mplex_mx_i(WMPlex *mplex, ExtlFn iterfn);
 extern WRegion *mplex_mx_current(WMPlex *mplex);
 
 extern void mplex_call_changed_hook(WMPlex *mplex, WHook *hook, 
index 51166f77edbbc478a41368f20d77e73e20ac4588..f6d089a2a5cc89fbbbcbec7fb9f1739c90a184ec 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/mplexpholder.c
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
@@ -17,6 +17,7 @@
 #include "mplex.h"
 #include "mplexpholder.h"
 #include "llist.h"
+#include "framedpholder.h"
 
 
 static void mplex_watch_handler(Watch *watch, Obj *mplex);
@@ -60,12 +61,28 @@ static void mplexpholder_do_link(WMPlexPHolder *ph,
 
 void mplexpholder_do_unlink(WMPlexPHolder *ph, WMPlex *mplex)
 {
+    if(ph->recreate_pholder!=NULL){
+        if(ph->prev!=NULL)
+            ph->prev->recreate_pholder=ph->recreate_pholder;
+        else
+            destroy_obj((Obj*)ph->recreate_pholder);
+        ph->recreate_pholder=NULL;
+    }
+    
     if(ph->after!=NULL){
         UNLINK_ITEM(ph->after->phs, ph, next, prev);
     }else if(mplex!=NULL && on_ph_list(mplex->mx_phs, ph)){
         UNLINK_ITEM(mplex->mx_phs, ph, next, prev);
     }else{
-        assert(ph->next==NULL && ph->prev==NULL);
+        WMPlexPHolder *next=ph->next;
+    
+        assert((ph->next==NULL && ph->prev==NULL)
+               || ph->mplex_watch.obj==NULL);
+        
+        if(ph->next!=NULL)
+            ph->next->prev=ph->prev;
+        if(ph->prev!=NULL)
+            ph->prev->next=next;
     }
     
     ph->after=NULL;
@@ -101,6 +118,7 @@ bool mplexpholder_init(WMPlexPHolder *ph, WMPlex *mplex, WStacking *st,
     ph->next=NULL;
     ph->prev=NULL;
     ph->param.flags=0;
+    ph->recreate_pholder=NULL;
     
     if(!watch_setup(&(ph->mplex_watch), (Obj*)mplex, mplex_watch_handler)){
         pholder_deinit(&(ph->ph));
@@ -171,14 +189,121 @@ void mplexpholder_deinit(WMPlexPHolder *ph)
 /*{{{ Move, attach, layer */
 
 
+typedef struct{
+    WMPlexPHolder *ph, *ph_head;
+    WRegionAttachData *data;
+    WFramedParam *param;
+} RP;
+
+
+WRegion *recreate_handler(WWindow *par, 
+                          const WFitParams *fp, 
+                          void *rp_)
+{
+    RP *rp=(RP*)rp_;
+    WMPlexPHolder *ph=rp->ph, *ph_head=rp->ph_head, *phtmp;
+    WFramedParam *param=rp->param;
+    WFrame *frame;
+    WRegion *reg;
+    
+    frame=create_frame(par, fp, param->mode);
+    
+    if(frame==NULL)
+        return NULL;
+    
+    /* Move pholders to frame */
+    frame->mplex.mx_phs=ph_head;
+    
+    for(phtmp=frame->mplex.mx_phs; phtmp!=NULL; phtmp=phtmp->next)
+        watch_setup(&(phtmp->mplex_watch), (Obj*)frame, mplex_watch_handler);
+        
+    /* Attach */
+    if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))
+        ph->param.flags|=MPLEX_ATTACH_WHATEVER;
+    
+    reg=mplex_do_attach_pholder(&frame->mplex, ph, rp->data);
+
+    ph->param.flags&=~MPLEX_ATTACH_WHATEVER;
+
+    if(reg==NULL){
+        /* Try to recover */
+        for(phtmp=frame->mplex.mx_phs; phtmp!=NULL; phtmp=phtmp->next)
+            watch_reset(&(phtmp->mplex_watch));
+        frame->mplex.mx_phs=NULL;
+    
+        destroy_obj((Obj*)frame);
+        
+        return NULL;
+    }else{
+        frame_adjust_to_initial(frame, fp, param, reg);
+        
+        return (WRegion*)frame;
+    }
+}
+
+
+static WMPlexPHolder *get_head(WMPlexPHolder *ph)
+{
+    while(1){
+        if(ph->prev->next==NULL)
+            break;
+        ph=ph->prev;
+    }
+    
+    return ph;
+}
+
+
+static WFramedPHolder *get_recreate_ph(WMPlexPHolder *ph)
+{
+    return get_head(ph)->recreate_pholder;
+}
+
+    
+static WRegion *mplexpholder_attach_recreate(WMPlexPHolder *ph, int flags,
+                                             WRegionAttachData *data)
+{
+    WRegionAttachData data2;
+    WFramedPHolder *fph;
+    WPHolder *root;
+    WRegion *reg;
+    RP rp;
+    
+    rp.ph_head=get_head(ph);
+    
+    assert(rp.ph_head!=NULL);
+    
+    fph=rp.ph_head->recreate_pholder;
+    
+    if(fph==NULL)
+        return NULL;
+    
+    rp.ph=ph;
+    rp.data=data;
+    rp.param=&fph->param;
+    
+    data2.type=REGION_ATTACH_NEW;
+    data2.u.n.fn=recreate_handler;
+    data2.u.n.param=&rp;
+    
+    reg=pholder_do_attach(fph->cont, flags, &data2); /* == frame */
+    
+    if(reg!=NULL){
+        destroy_obj((Obj*)fph);
+        rp.ph_head->recreate_pholder=NULL;
+    }
+
+    return reg;
+}
+
+
 WRegion *mplexpholder_do_attach(WMPlexPHolder *ph, int flags,
                                 WRegionAttachData *data)
 {
     WMPlex *mplex=(WMPlex*)ph->mplex_watch.obj;
-    WRegion *reg=NULL;
     
     if(mplex==NULL)
-        return FALSE;
+        return mplexpholder_attach_recreate(ph, flags, data);
     
     if(flags&PHOLDER_ATTACH_SWITCHTO)
         ph->param.flags|=MPLEX_ATTACH_SWITCHTO;
@@ -212,18 +337,55 @@ bool mplexpholder_move(WMPlexPHolder *ph, WMPlex *mplex,
 
 bool mplexpholder_do_goto(WMPlexPHolder *ph)
 {
-    WMPlex *mplex=(WMPlex*)ph->mplex_watch.obj;
-    
-    if(mplex!=NULL)
-        return region_goto((WRegion*)mplex);
+    WRegion *reg=(WRegion*)ph->mplex_watch.obj;
     
-    return FALSE;
+    if(reg!=NULL){
+        return region_goto(reg);
+    }else{
+        WFramedPHolder *fph=get_recreate_ph(ph);
+        
+        return (fph!=NULL
+                ? pholder_do_goto((WPHolder*)fph)
+                : FALSE);
+    }
 }
 
 
 WRegion *mplexpholder_do_target(WMPlexPHolder *ph)
 {
-    return (WRegion*)ph->mplex_watch.obj;
+    WRegion *reg=(WRegion*)ph->mplex_watch.obj;
+    
+    if(reg!=NULL){
+        return reg;
+    }else{
+        WFramedPHolder *fph=get_recreate_ph(ph);
+        
+        return (fph!=NULL
+                ? pholder_do_target((WPHolder*)fph)
+                : NULL);
+    }
+}
+
+
+WPHolder *mplexpholder_do_root(WMPlexPHolder *ph)
+{
+    WRegion *reg=(WRegion*)ph->mplex_watch.obj;
+    
+    if(reg!=NULL){
+        return &ph->ph;
+    }else{
+        WFramedPHolder *fph=get_recreate_ph(ph);
+        WPHolder *root;
+        
+        if(fph==NULL)
+            return NULL;
+    
+        root=pholder_root((WPHolder*)fph);
+    
+        return (root!=(WPHolder*)fph
+                ? root
+                : &ph->ph);
+    }
 }
 
 
@@ -300,6 +462,9 @@ static DynFunTab mplexpholder_dynfuntab[]={
 
     {(DynFun*)pholder_do_target, 
      (DynFun*)mplexpholder_do_target},
+     
+    {(DynFun*)pholder_do_root, 
+     (DynFun*)mplexpholder_do_root},
 
     END_DYNFUNTAB
 };
index 4dce782953ffe319ad9d8a76916e2af675690be8..5a9892232beb69083f9af39a40294a63e97bb892 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/mplexpholder.h
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
 #include "pholder.h"
 #include "mplex.h"
 #include "attach.h"
+#include "framedpholder.h"
+
 
 DECLCLASS(WMPlexPHolder){
     WPHolder ph;
     Watch mplex_watch;
+    WFramedPHolder *recreate_pholder; /* only on first of list */
     WLListNode *after;
     WMPlexPHolder *next, *prev;
     WMPlexAttachParams param;
@@ -46,6 +49,8 @@ extern WRegion *mplexpholder_do_attach(WMPlexPHolder *ph, int flags,
 
 extern bool mplexpholder_do_goto(WMPlexPHolder *ph);
 
+extern WPHolder *mplexpholder_do_root(WMPlexPHolder *ph);
+
 extern WRegion *mplexpholder_do_target(WMPlexPHolder *ph);
 
 extern bool mplexpholder_move(WMPlexPHolder *ph, WMPlex *mplex, 
index 2ebc683624e911bc0e1a419ebc263c43531249d5..2c2269c24d565fa48266009f56a1c928bd1e16ac 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/mwmhints.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 99ac8ad2c346bb4569ef6e7fc17f6a52a32bb100..09571f31d0b7dfbb6917a94e61ee59fea5715d68 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/mwmhints.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 70855042e7e6fd288ad718f037f66325835c5ef1..5f3c386d8eab7337fd9b5be31c63b8aba9f014aa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/names.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -19,6 +19,7 @@
 #include <libextl/extl.h>
 
 #include "common.h"
+#include "global.h"
 #include "region.h"
 #include "clientwin.h"
 #include "names.h"
@@ -416,7 +417,7 @@ static bool do_set_name(bool (*fn)(WRegion *reg, WNamespace *ns, const char *p),
     if(nm!=NULL)
         free(nm);
 
-    region_notify_change(reg, "name");
+    region_notify_change(reg, ioncore_g.notifies.name);
     
     return ret;
 }
@@ -537,16 +538,13 @@ WClientWin *ioncore_lookup_clientwin(const char *name)
 }
 
 
-static ExtlTab do_list(WNamespace *ns, const char *typenam)
+static bool do_list(ExtlFn fn, WNamespace *ns, const char *typenam)
 {
-    ExtlTab tab;
     Rb_node node;
     int n=0;
     
     if(!ns->initialised)
-        return extl_table_none();
-    
-    tab=extl_create_table();
+        return FALSE;
     
     rb_traverse(node, ns->rb){
         WRegion *reg=(WRegion*)node->v.val;
@@ -556,33 +554,38 @@ static ExtlTab do_list(WNamespace *ns, const char *typenam)
         if(typenam!=NULL && !obj_is_str((Obj*)reg, typenam))
             continue;
 
-        if(extl_table_seti_o(tab, n+1, (Obj*)reg))
-            n++;
+        if(!extl_iter_obj(fn, (Obj*)reg))
+            return FALSE;
     }
     
-    return tab;
+    return TRUE;
 }
 
 
 /*EXTL_DOC
- * Find all non-client window regions inheriting \var{typenam}.
+ * Iterate over all non-client window regions with (inherited) class
+ * \var{typenam} until \var{iterfn} returns \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT
-ExtlTab ioncore_region_list(const char *typenam)
+bool ioncore_region_i(ExtlFn fn, const char *typenam)
 {
-    return do_list(&ioncore_internal_ns, typenam);
+    return do_list(fn, &ioncore_internal_ns, typenam);
 }
 
 
 /*EXTL_DOC
- * Return a list of all client windows.
+ * Iterate over client windows until \var{iterfn} returns \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT
-ExtlTab ioncore_clientwin_list()
+bool ioncore_clientwin_i(ExtlFn fn)
 {
-    return do_list(&ioncore_clientwin_ns, NULL);
+    return do_list(fn, &ioncore_clientwin_ns, NULL);
 }
 
 
index 5a2cc36db1ab1b97372e2028914e959fd47bf28a..57dd5aae8dc4812b43ff0f658979fb93a467452c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/names.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -43,8 +43,8 @@ DYNFUN const char *region_displayname(WRegion *reg);
 
 extern char *region_make_label(WRegion *reg, int maxw, GrBrush *brush);
 
-extern ExtlTab ioncore_region_list(const char *typenam);
-extern ExtlTab ioncore_clientwin_list();
+extern bool ioncore_region_i(ExtlFn fn, const char *typenam);
+extern bool ioncore_clientwin_i(ExtlFn fn);
 extern WRegion *ioncore_lookup_region(const char *cname, const char *typenam);
 extern WClientWin *ioncore_lookup_clientwin(const char *cname);
 
index f52a44bf9739ce9b83e36115586317e36680e1cb..7a10e6be580bc709429d7e866852b24c74c92658 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/navi.c
  *
- * Copyright (c) Tuomo Valkonen 2006. 
+ * Copyright (c) Tuomo Valkonen 2006-2007
  *
  * 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
@@ -120,6 +120,7 @@ static bool may_ascend(WRegion *to, WRegion *from, WRegionNaviData *data)
     }else if(data->no_ascend!=NULL){
         return (data->no_ascend!=(Obj*)from);
     }else{
+        /* Set to TRUE for cycling out of nested workspaces etc. */
         return !OBJ_IS(from, WMPlex);
     }
 }
@@ -136,6 +137,7 @@ static bool may_descend(WRegion *to, WRegion *from, WRegionNaviData *data)
     }else if(data->no_descend!=NULL){
         return (data->no_descend!=(Obj*)from);
     }else{
+        /* Set to TRUE for cycling into nested workspaces etc. */
         return !OBJ_IS(to, WMPlex);
     }
 }
index 3c389731fb08dda7ebf9813341f90f6e917b0502..b1ed6a0e95dbd19c8932c20bd11c90f76ade9a9d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/navi.h
  *
- * Copyright (c) Tuomo Valkonen 2006. 
+ * Copyright (c) Tuomo Valkonen 2006-2007
  *
  * 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
index cd0cb85b991ac79def8c3bca3df9a512ae2817c4..d7c466e69cfd6c7c361d8d849456095c20b46a01 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/netwm.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -100,7 +100,7 @@ int netwm_check_initial_fullscreen(WClientWin *cwin, bool sw)
     
     for(i=0; i<n; i++){
         if(data[i]==(long)atom_net_wm_state_fullscreen){
-            ret=clientwin_enter_fullscreen(cwin, sw);
+            ret=region_enter_fullscreen((WRegion*)cwin, sw);
             break;
         }
     }
@@ -147,7 +147,7 @@ static void netwm_state_change_rq(WClientWin *cwin,
            ev->data.l[0]==_NET_WM_STATE_TOGGLE){
             bool sw=clientwin_fullscreen_may_switchto(cwin);
             cwin->flags|=CLIENTWIN_FS_RQ;
-            if(!clientwin_enter_fullscreen(cwin, sw))
+            if(!region_enter_fullscreen((WRegion*)cwin, sw))
                 cwin->flags&=~CLIENTWIN_FS_RQ;
         }else{
             /* Should not be set.. */
@@ -158,7 +158,7 @@ static void netwm_state_change_rq(WClientWin *cwin,
            ev->data.l[0]==_NET_WM_STATE_TOGGLE){
             bool sw=clientwin_fullscreen_may_switchto(cwin);
             cwin->flags&=~CLIENTWIN_FS_RQ;
-            clientwin_leave_fullscreen(cwin, sw);
+            region_leave_fullscreen((WRegion*)cwin, sw);
         }else{
             /* Set the flag */
             cwin->flags|=CLIENTWIN_FS_RQ;
index bbfa9b94763e0bef7feaeffc08903cc41b8e758b..e566ca6c16383ba176a8d9c9d1296c1193ff6989 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/netwm.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 4aed2ccd05159bcf58cb4e5801290355d5b22c0c..5fdb7b8aae991f5520bf2515ae445e109b63eea4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/pholder.c
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
@@ -13,6 +13,7 @@
 #include "common.h"
 #include "attach.h"
 #include "pholder.h"
+#include "focus.h"
 
 
 bool pholder_init(WPHolder *ph)
@@ -53,10 +54,15 @@ static WRegion *add_fn_reparent(WWindow *par, const WFitParams *fp,
 
 WRegion *pholder_attach_(WPHolder *ph, int flags, WRegionAttachData *data)
 {
-    if(ph->redirect!=NULL)
-        return pholder_attach_(ph->redirect, flags, data);
-    else
-        return pholder_do_attach(ph, flags, data);
+    WPHolder *root=pholder_root(ph);
+    
+    /* Use the root, so that extra containers are not added from
+     * stale chains.
+     */
+    
+    return (root==NULL
+            ? NULL
+            : pholder_do_attach(root, flags, data));
 }
 
 
@@ -71,6 +77,20 @@ bool pholder_attach(WPHolder *ph, int flags, WRegion *reg)
 }
 
 
+bool pholder_attach_mcfgoto(WPHolder *ph, int flags, WRegion *reg)
+{
+    bool cf=region_may_control_focus(reg);
+    
+    if(!pholder_attach(ph, flags, reg))
+        return FALSE;
+        
+    if(cf)
+        region_goto(reg);
+    
+    return TRUE;
+}
+
+
 WRegion *pholder_do_target(WPHolder *ph)
 {
     WRegion *ret=NULL;
@@ -81,10 +101,9 @@ WRegion *pholder_do_target(WPHolder *ph)
 
 WRegion *pholder_target(WPHolder *ph)
 {
-    if(ph->redirect!=NULL)
-        return pholder_target(ph->redirect);
-    else
-        return pholder_do_target(ph);
+    return (ph->redirect!=NULL
+            ? pholder_target(ph->redirect)
+            : pholder_do_target(ph));
 }
 
 
@@ -126,13 +145,39 @@ bool pholder_do_goto(WPHolder *ph)
 
 bool pholder_goto(WPHolder *ph)
 {
-    if(ph->redirect!=NULL)
-        return pholder_goto(ph->redirect);
-    else
-        return pholder_do_goto(ph);
+    return (ph->redirect!=NULL
+            ? pholder_goto(ph->redirect)
+            : pholder_do_goto(ph));
 }
 
 
+WPHolder *pholder_do_root_default(WPHolder *ph)
+{
+    return ph;
+}
+
+
+WPHolder *pholder_do_root(WPHolder *ph)
+{
+    WPHolder *ret=NULL;
+    CALL_DYN_RET(ret, WPHolder*, pholder_do_root, ph, (ph));
+    return ret;
+}
+
+
+WPHolder *pholder_root(WPHolder *ph)
+{
+    return (ph->redirect!=NULL
+            ? pholder_root(ph->redirect)
+            : pholder_do_root(ph));
+}
+
+
+bool pholder_stale(WPHolder *ph)
+{
+    return (pholder_root(ph)!=ph);
+}
+
 
 bool pholder_redirect(WPHolder *ph, WRegion *old_target)
 {
@@ -201,6 +246,9 @@ WPHolder *pholder_either(WPHolder *a, WPHolder *b)
 static DynFunTab pholder_dynfuntab[]={
     {(DynFun*)pholder_do_check_reparent, 
      (DynFun*)pholder_do_check_reparent_default},
+     
+    {(DynFun*)pholder_do_root, 
+     (DynFun*)pholder_do_root_default},
 
     END_DYNFUNTAB
 };
index 7fe27106104b0626b9b5c4aa0ba4babdcf15d85a..4ccc65447c56947f1250d6c31f8f2f57ae4ae3b8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/pholder.h
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * 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
@@ -39,10 +39,18 @@ extern WRegion *pholder_attach_(WPHolder *ph, int flags,
 
 extern bool pholder_attach(WPHolder *ph, int flags, WRegion *reg);
 
+extern bool pholder_attach_mcfgoto(WPHolder *ph, int flags, WRegion *reg);
+
 DYNFUN WRegion *pholder_do_target(WPHolder *ph);
 
 extern WRegion *pholder_target(WPHolder *ph);
 
+extern WPHolder *pholder_do_root(WPHolder *ph);
+
+extern WPHolder *pholder_root(WPHolder *ph);
+
+extern bool pholder_stale(WPHolder *ph);
+
 DYNFUN bool pholder_do_check_reparent(WPHolder *ph, WRegion *reg);
 
 extern bool pholder_check_reparent(WPHolder *ph, WRegion *reg);
index 977940df05f61976a694c5ef63013aaf18a4b726..671af84835cce79f6b4bed427ec111b4df3e25e3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/pointer.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index bf2e00a150bbddffcbba49e9ebc5709d41866430..7b73cdb411f9fd2f8948ff1a06488889f5b602f2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/pointer.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 80b7203399dbe9a712e5a6a9d8383157b5491e10..5b16ba459a2280ff87f72b392ca1a484e6fcfeb1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/presize.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 85fd88990ecd36b0963f6c55758434defd806d5d..a4800333bde455c5327b1d37b59b632d151a968a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/presize.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 3bacca1c0fd3b76b83c065029a1b77ac0a6490db..798dbf5e32cc0ef2746eaa72083dd9ea531636df 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/property.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index c340380a2288baca9977ac525eb99d3a40f713fb..cb9252ea0178aa559b21b32a47cfd45cac3bea1e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/property.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 00cae8670681ddb5f389266d4e608b6268320d55..50dcc09e3986f4bdd4344857a953e764adb0311c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/rectangle.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index da7b305173aa77e98c12e401a58413fbda5807e9..701d2b22be5d343da6dd00ed69456ea3fd48c873 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/rectangle.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 43bc3a6d38558476bc8d88414379f471102ba172..0b2f371d5912009df44ba98b629075bc0b200582 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/regbind.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index b7c04121261f68b5060d45835efccb719d9cc604..ad1fe6d968718a83bc1e4710cf506876e926869e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/regbind.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 5606b09dd40e8f13f40b2a2e5fec780e12f75c3d..981588043ee16d8c8465918b7e0db9e9ae941f9a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/reginfo.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index a83c2e2c6b6e25eee55b46ba83fae8656e4547e9..0a75a985a635da97d5e005d91137e087700e4490 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/reginfo.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index bf9f135e3fec107f43a3c2b49f9e8b6a72bf761b..157ab7d59da60ca14ad5a56e430898d3d0d5ef8d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/region-iter.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index dede094fae0db007d9732d37cbbef10987260479..68be25d32e8695ecaeb7ae0b62ac5388e4afea2d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/region.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -26,6 +26,7 @@
 #include "extlconv.h"
 #include "activity.h"
 #include "region-iter.h"
+#include "return.h"
 
 
 #define D2(X)
@@ -33,8 +34,8 @@
 
 WHook *region_notify_hook=NULL;
 
-static void region_notify_change_(WRegion *reg, const char *how, 
-                                  Obj *detail);
+
+static void region_notify_change_(WRegion *reg, WRegionNotify how);
 
 
 /*{{{ Init & deinit */
@@ -73,7 +74,7 @@ void region_init(WRegion *reg, WWindow *par, const WFitParams *fp)
         reg->rootwin=((WRegion*)par)->rootwin;
         region_set_parent(reg, par);
     }else{
-        assert(OBJ_IS(reg, WRootWin));/* || OBJ_IS(reg, WScreen));*/
+        assert(OBJ_IS(reg, WRootWin));
     }
 }
 
@@ -103,6 +104,8 @@ static void destroy_children(WRegion *reg)
 
 void region_deinit(WRegion *reg)
 {
+    region_notify_change(reg, ioncore_g.notifies.deinit);
+    
     destroy_children(reg);
 
     if(ioncore_g.focus_next==reg){
@@ -111,6 +114,7 @@ void region_deinit(WRegion *reg)
     }
 
     region_detach_manager(reg);
+    region_unset_return(reg);
     region_unset_parent(reg);
     region_remove_bindings(reg);
     
@@ -192,18 +196,6 @@ void region_do_set_focus(WRegion *reg, bool warp)
 /*{{{ Manager region dynfuns */
 
 
-void region_managed_activated(WRegion *mgr, WRegion *reg)
-{
-    CALL_DYN(region_managed_activated, mgr, (mgr, reg));
-}
-
-
-void region_managed_inactivated(WRegion *mgr, WRegion *reg)
-{
-    CALL_DYN(region_managed_inactivated, mgr, (mgr, reg));
-}
-
-
 static bool region_managed_prepare_focus_default(WRegion *mgr, WRegion *reg, 
                                                  int flags, 
                                                  WPrepareFocusResult *res)
@@ -228,7 +220,7 @@ bool region_managed_prepare_focus(WRegion *mgr, WRegion *reg,
 }
 
 
-void region_managed_notify(WRegion *mgr, WRegion *reg, const char *how)
+void region_managed_notify(WRegion *mgr, WRegion *reg, WRegionNotify how)
 {
     CALL_DYN(region_managed_notify, mgr, (mgr, reg, how));
 }
@@ -377,7 +369,7 @@ bool region_reparent(WRegion *reg, WWindow *par,
 static bool region_rqclose_default(WRegion *reg, bool relocate)
 {
     WPHolder *ph;
-    bool refuse=TRUE;
+    bool refuse=TRUE, mcf;
     
     if((!relocate && !region_may_destroy(reg)) ||
        !region_manager_allows_destroying(reg)){
@@ -385,6 +377,7 @@ static bool region_rqclose_default(WRegion *reg, bool relocate)
     }
     
     ph=region_get_rescue_pholder(reg);
+    mcf=region_may_control_focus(reg);
     
     if(ph!=NULL){
         refuse=!region_rescue_clientwins(reg, ph);
@@ -396,7 +389,7 @@ static bool region_rqclose_default(WRegion *reg, bool relocate)
         return FALSE;
     }
 
-    mainloop_defer_destroy((Obj*)reg);
+    region_dispose(reg, mcf);
     
     return TRUE;
 }
@@ -478,6 +471,24 @@ bool region_manager_allows_destroying(WRegion *reg)
 }
 
 
+void region_dispose(WRegion *reg, bool was_mcf)
+{
+    if(was_mcf){
+        WPHolder *ph=region_get_return(reg);
+        if(ph!=NULL)
+            pholder_goto(ph);
+    }
+
+    mainloop_defer_destroy((Obj*)reg);
+}
+
+
+void region_dispose_(WRegion *reg)
+{
+    region_dispose(reg, region_may_control_focus(reg));
+}
+
+
 /*}}}*/
 
 
@@ -494,6 +505,7 @@ void region_detach_manager(WRegion *reg)
     if(mgr==NULL)
         return;
     
+#if 0
     /* Restore activity state to non-parent manager */
     if(region_may_control_focus(reg)){
         WRegion *par=REGION_PARENT_REG(reg);
@@ -504,11 +516,10 @@ void region_detach_manager(WRegion *reg)
              * be made to work.
              */
             par->active_sub=mgr;
-            /*if(region_xwindow(mgr)!=None){*/
-                region_do_set_focus(mgr, FALSE);
-            /*}*/
+            region_maybewarp_now(mgr, FALSE);
         }
     }
+#endif
 
     region_set_activity(reg, SETPARAM_UNSET);
 
@@ -518,6 +529,39 @@ void region_detach_manager(WRegion *reg)
 }
 
 
+void region_unset_manager_pseudoactivity(WRegion *reg)
+{
+    WRegion *mgr=reg->manager, *par=REGION_PARENT_REG(reg);
+    
+    if(mgr==NULL || mgr==par || !REGION_IS_PSEUDOACTIVE(mgr))
+        return;
+        
+    mgr->flags&=~REGION_PSEUDOACTIVE;
+    
+    region_notify_change(mgr, ioncore_g.notifies.pseudoinactivated);
+    
+    region_unset_manager_pseudoactivity(mgr);
+}
+
+
+void region_set_manager_pseudoactivity(WRegion *reg)
+{
+    WRegion *mgr=reg->manager, *par=REGION_PARENT_REG(reg);
+    
+    if(!REGION_IS_ACTIVE(reg) && !REGION_IS_PSEUDOACTIVE(reg))
+        return;
+        
+    if(mgr==NULL || mgr==par || REGION_IS_PSEUDOACTIVE(mgr))
+        return;
+    
+    mgr->flags|=REGION_PSEUDOACTIVE;
+    
+    region_notify_change(mgr, ioncore_g.notifies.pseudoactivated);
+    
+    region_set_manager_pseudoactivity(mgr);
+}
+
+
 /* This should only be called within region_managed_remove,
  * _after_ any managed lists and other essential structures
  * of mgr have been broken.
@@ -526,13 +570,17 @@ void region_unset_manager(WRegion *reg, WRegion *mgr)
 {
     if(reg->manager!=mgr)
         return;
+        
+    region_notify_change_(reg, ioncore_g.notifies.unset_manager);
+    
+    region_unset_manager_pseudoactivity(reg);
     
     reg->manager=NULL;
     
     if(region_is_activity_r(reg))
         region_clear_mgd_activity(mgr);
-
-    region_notify_change_(reg, "unset_manager", (Obj*)mgr);
+    
+    region_unset_return(reg);
 }
 
 
@@ -546,10 +594,12 @@ void region_set_manager(WRegion *reg, WRegion *mgr)
     
     reg->manager=mgr;
     
+    region_set_manager_pseudoactivity(reg);
+    
     if(region_is_activity_r(reg))
         region_mark_mgd_activity(mgr);
     
-    region_notify_change_(reg, "set_manager", (Obj*)mgr);
+    region_notify_change_(reg, ioncore_g.notifies.set_manager);
 }
 
 
@@ -776,54 +826,53 @@ void region_rootpos(WRegion *reg, int *xret, int *yret)
 }
 
 
-static bool mrsh_not(WHookDummy *fn, void *p)
+typedef struct{
+    WRegion *reg;
+    WRegionNotify how;
+} MRSHP;
+
+
+static bool mrsh_notify_change(WHookDummy *fn, void *p_)
 {
-    WRegion *reg=(WRegion*)((void**)p)[0];
-    const char *how=(const char*)((void**)p)[1];
-    Obj *detail=(Obj*)((void**)p)[2];
+    MRSHP *p=(MRSHP*)p_;
     
-    fn(reg, how, detail);
+    fn(p->reg, p->how);
     
     return TRUE;
 }
 
 
-static bool mrshe_not(ExtlFn fn, void *p)
+static bool mrshe_notify_change(ExtlFn fn, void *p_)
 {
-    WRegion *reg=(WRegion*)((void**)p)[0];
-    const char *how=(const char*)((void**)p)[1];
-    Obj *detail=(Obj*)((void**)p)[2];
+    MRSHP *p=(MRSHP*)p_;
     
-    extl_call(fn, "oso", NULL, reg, how, detail);
+    extl_call(fn, "os", NULL, p->reg, stringstore_get(p->how));
     
     return TRUE;
 }
 
 
-static void region_notify_change_(WRegion *reg, const char *how, 
-                                  Obj *detail)
+static void region_notify_change_(WRegion *reg, WRegionNotify how)
 {
-    const void *p[3];
+    MRSHP p;
+    
+    p.reg=reg;
+    p.how=how;
     
-    p[0]=reg;
-    p[1]=how;
-    p[2]=detail;
-
     extl_protect(NULL);
-    hook_call(region_notify_hook, p, mrsh_not, mrshe_not),
+    hook_call(region_notify_hook, &p, mrsh_notify_change, mrshe_notify_change),
     extl_unprotect(NULL);
-    
 }
 
 
-void region_notify_change(WRegion *reg, const char *how)
+void region_notify_change(WRegion *reg, WRegionNotify how)
 {
     WRegion *mgr=REGION_MANAGER(reg);
 
     if(mgr!=NULL)
         region_managed_notify(mgr, reg, how);
     
-    region_notify_change_(reg, how, NULL);
+    region_notify_change_(reg, how);
 }
 
 
index b2feff748852b02ee512ed4f7f3d24cfcd4d9792..d30b4359536f61866161413a78e2d1556018b42c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/region.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #define ION_IONCORE_REGION_H
 
 #include <libtu/obj.h>
+#include <libtu/stringstore.h>
 #include <libmainloop/hooks.h>
 #include "common.h"
 #include "rectangle.h"
 
-#define REGION_MAPPED        0x0001
-#define REGION_ACTIVE        0x0002
-#define REGION_HAS_GRABS     0x0004
-#define REGION_TAGGED        0x0008
+#define REGION_MAPPED               0x0001
+#define REGION_ACTIVE               0x0002
+#define REGION_HAS_GRABS            0x0004
+#define REGION_TAGGED               0x0008
+#define REGION_PSEUDOACTIVE         0x0010
 #define REGION_BINDINGS_ARE_GRABBED 0x0020
-#define REGION_GRAB_ON_PARENT 0x0040
-#define REGION_ACTIVITY      0x0100
-#define REGION_SKIP_FOCUS    0x0200
-#define REGION_CWINS_BEING_RESCUED 0x0400
-#define REGION_PLEASE_WARP   0x0800
+#define REGION_GRAB_ON_PARENT       0x0040
+#define REGION_ACTIVITY             0x0100
+#define REGION_SKIP_FOCUS           0x0200
+#define REGION_CWINS_BEING_RESCUED  0x0400
+#define REGION_PLEASE_WARP          0x0800
 #define REGION_BINDING_UPDATE_SCHEDULED 0x1000
 
-#define REGION_GOTO_FOCUS    0x0001
-#define REGION_GOTO_NOWARP   0x0002
-#define REGION_GOTO_ENTERWINDOW 0x0004
+#define REGION_GOTO_FOCUS           0x0001
+#define REGION_GOTO_NOWARP          0x0002
+#define REGION_GOTO_ENTERWINDOW     0x0004
 
 /* Use region_is_fully_mapped instead for most cases. */
 #define REGION_IS_MAPPED(R)     (((WRegion*)(R))->flags&REGION_MAPPED)
 #define REGION_MARK_MAPPED(R)   (((WRegion*)(R))->flags|=REGION_MAPPED)
 #define REGION_MARK_UNMAPPED(R) (((WRegion*)(R))->flags&=~REGION_MAPPED)
 #define REGION_IS_ACTIVE(R)     (((WRegion*)(R))->flags&REGION_ACTIVE)
+#define REGION_IS_PSEUDOACTIVE(R) (((WRegion*)(R))->flags&REGION_PSEUDOACTIVE)
 #define REGION_IS_TAGGED(R)     (((WRegion*)(R))->flags&REGION_TAGGED)
 #define REGION_IS_URGENT(R)     (((WRegion*)(R))->flags&REGION_URGENT)
 #define REGION_GEOM(R)          (((WRegion*)(R))->geom)
@@ -58,6 +61,8 @@
 
 typedef int WRegionFitMode;
 
+typedef StringId WRegionNotify;
+
 
 typedef enum{
     REGION_ORDER_FRONT,
@@ -135,9 +140,7 @@ DYNFUN WRegion *region_managed_control_focus(WRegion *mgr, WRegion *reg);
 DYNFUN void region_managed_remove(WRegion *reg, WRegion *sub);
 DYNFUN bool region_managed_prepare_focus(WRegion *reg, WRegion *sub, 
                                          int flags, WPrepareFocusResult *res);
-DYNFUN void region_managed_activated(WRegion *reg, WRegion *sub);
-DYNFUN void region_managed_inactivated(WRegion *reg, WRegion *sub);
-DYNFUN void region_managed_notify(WRegion *reg, WRegion *sub, const char *how);
+DYNFUN void region_managed_notify(WRegion *reg, WRegion *sub, WRegionNotify how);
 DYNFUN bool region_managed_may_destroy(WRegion *mgr, WRegion *reg);
 DYNFUN bool region_managed_rqorder(WRegion *reg, WRegion *sub, 
                                    WRegionOrder order);
@@ -162,7 +165,7 @@ extern bool region_reparent(WRegion *reg, WWindow *target,
 extern void region_updategr_default(WRegion *reg);
 
 extern void region_rootpos(WRegion *reg, int *xret, int *yret);
-extern void region_notify_change(WRegion *reg, const char *how);
+extern void region_notify_change(WRegion *reg, WRegionNotify how);
 
 extern bool region_goto(WRegion *reg);
 extern bool region_goto_flags(WRegion *reg, int flags);
@@ -171,6 +174,9 @@ extern bool region_is_fully_mapped(WRegion *reg);
 
 extern void region_detach_manager(WRegion *reg);
 
+extern void region_dispose(WRegion *reg, bool was_mcf);
+extern void region_dispose_(WRegion *reg);
+
 extern WWindow *region_parent(WRegion *reg);
 extern WRegion *region_manager(WRegion *reg);
 extern WRegion *region_manager_or_parent(WRegion *reg);
@@ -188,6 +194,9 @@ extern bool region_manager_allows_destroying(WRegion *reg);
 
 extern WRegion *region_managed_within(WRegion *reg, WRegion *mgd);
 
+extern void region_set_manager_pseudoactivity(WRegion *reg);
+extern void region_unset_manager_pseudoactivity(WRegion *reg);
+
 extern WHook *region_notify_hook;
 
 #endif /* ION_IONCORE_REGION_H */
index a8cff5ae5e8a67df871521fdb35575f89afd4a4f..33bfde01ada0f8f0fbb7f5a3ac833d49a56da9b6 100644 (file)
@@ -1,7 +1,7 @@
 /* 
  * ion/ioncore/resize.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -478,7 +478,7 @@ bool moveresmode_do_end(WMoveresMode *mode, bool apply)
         set_saved(mode, reg);
     
     if(mode->infowin!=NULL){
-        mainloop_defer_destroy((Obj*)mode->infowin);
+        region_dispose((WRegion*)mode->infowin, FALSE);
         mode->infowin=NULL;
     }
     destroy_obj((Obj*)mode);
index 3a4f0626f9147d15521b104032080ab97fb05a9e..700c56ef0daaea3d54db79046b928f97229484f7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/resize.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
diff --git a/ioncore/return.c b/ioncore/return.c
new file mode 100644 (file)
index 0000000..444f548
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * ion/ioncore/return.h
+ *
+ * Copyright (c) Tuomo Valkonen 1999-2007. 
+ *
+ * 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 <libtu/rb.h>
+#include <libmainloop/defer.h>
+
+#include "common.h"
+#include "global.h"
+#include "region.h"
+#include "pholder.h"
+#include "return.h"
+
+
+/*{{{ Storage tree */
+
+
+static Rb_node retrb=NULL;
+
+
+/*}}}*/
+
+
+
+/*{{{ Set */
+
+
+bool region_do_set_return(WRegion *reg, WPHolder *ph)
+{
+    Rb_node node;
+    int found=0;
+    
+    assert(!OBJ_IS_BEING_DESTROYED(reg));
+    
+    region_unset_return(reg);
+    
+    if(retrb==NULL){
+        retrb=make_rb();
+        if(retrb==NULL)
+            return FALSE;
+    }
+    
+    node=rb_insertp(retrb, reg, ph);
+    
+    region_notify_change(reg, ioncore_g.notifies.set_return);
+    
+    return (node!=NULL);
+}
+
+
+WPHolder *region_make_return_pholder(WRegion *reg)
+{
+    WRegion *mgr=region_manager(reg);
+    
+    if(mgr==NULL)
+        return NULL;
+    
+    return region_managed_get_pholder(mgr, reg);
+}
+
+
+/*
+extern WPHolder *region_set_return(WRegion *reg)
+{
+    WPHolder *ph=region_make_return_pholder(reg);
+    
+    if(ph!=NULL){
+        if(region_do_set_return(reg, ph))
+            return ph;
+        destroy_obj((Obj*)ph);
+    }
+    
+    return NULL;
+}
+*/
+
+
+/*}}}*/
+
+
+/*{{{ Get */
+
+Rb_node do_find(WRegion *reg)
+{
+    int found=0;
+    Rb_node node;
+    
+    if(retrb==NULL)
+        return NULL;
+    
+    node=rb_find_pkey_n(retrb, reg, &found);
+    
+    return (found ? node : NULL);
+}
+
+
+WPHolder *region_do_get_return(WRegion *reg)
+{
+    Rb_node node=do_find(reg);
+    
+    return (node!=NULL ? (WPHolder*)node->v.val : NULL);
+}
+
+
+WPHolder *region_get_return(WRegion *reg)
+{
+    /* Should managers be scanned? */
+    return region_do_get_return(reg);
+}
+
+
+/*}}}*/
+
+
+/*{{{ Unset */
+
+
+static WPHolder *do_remove_node(Rb_node node)
+{
+    WPHolder *ph=(WPHolder*)node->v.val;
+   
+    rb_delete_node(node);
+   
+    return ph;
+}
+
+
+WPHolder *region_unset_get_return(WRegion *reg)
+{
+    Rb_node node; 
+    
+    node=do_find(reg);
+    
+    if(node!=NULL){
+        region_notify_change(reg, ioncore_g.notifies.unset_return);
+        return do_remove_node(node);
+    }else{
+        return NULL;
+    }
+}
+
+
+void region_unset_return(WRegion *reg)
+{
+    WPHolder *ph=region_unset_get_return(reg);
+    
+    if(ph!=NULL)
+        mainloop_defer_destroy((Obj*)ph);
+}
+
+
+/*}}}*/
+
diff --git a/ioncore/return.h b/ioncore/return.h
new file mode 100644 (file)
index 0000000..6870f18
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * ion/ioncore/return.h
+ *
+ * Copyright (c) Tuomo Valkonen 1999-2007. 
+ *
+ * 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.
+ */
+
+#ifndef ION_IONCORE_RETURN_H
+#define ION_IONCORE_RETURN_H
+
+#include "region.h"
+#include "pholder.h"
+
+/* Note: 'ph' is under the control of this 'return' module after succesfully
+ * (true return value) having been passed to this function and must no 
+ * longer be destroyed by other code unless removed with unset_get.
+ */
+extern bool region_do_set_return(WRegion *reg, WPHolder *ph);
+
+/*extern WPHolder *region_set_return(WRegion *reg);*/
+
+extern WPHolder *region_get_return(WRegion *reg);
+
+extern void region_unset_return(WRegion *reg);
+
+extern WPHolder *region_unset_get_return(WRegion *reg);
+
+extern WPHolder *region_make_return_pholder(WRegion *reg);
+
+#endif /* ION_IONCORE_RETURN_H */
index 5fc4891aff5c60fb1958b85772f413d2a3f4063d..6e75ee3b5de1ed3a33000a7b3fe7bbe8da6dd1ff 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/rootwin.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include <stdio.h>
 #include <X11/Xlib.h>
 #include <X11/Xproto.h>
-/*#include <X11/Xmu/Error.h>*/
-#ifdef CF_XINERAMA
-#include <X11/extensions/Xinerama.h>
-#elif defined(CF_SUN_XINERAMA)
-#include <X11/extensions/xinerama.h>
-#endif
 
 #include <libtu/objp.h>
 #include "common.h"
@@ -201,13 +195,14 @@ static void preinit_gr(WRootWin *rootwin)
 }
 
 
-static WRootWin *preinit_rootwin(int xscr)
+static Atom net_virtual_roots=None;
+
+
+static bool rootwin_init(WRootWin *rootwin, int xscr)
 {
     Display *dpy=ioncore_g.dpy;
-    WRootWin *rootwin;
     WFitParams fp;
     Window root;
-    int i;
     
     /* Try to select input on the root window */
     root=RootWindow(dpy, xscr);
@@ -215,24 +210,16 @@ static WRootWin *preinit_rootwin(int xscr)
     redirect_error=FALSE;
 
     XSetErrorHandler(my_redirect_error_handler);
-    XSelectInput(dpy, root, IONCORE_EVENTMASK_ROOT);
+    XSelectInput(dpy, root, IONCORE_EVENTMASK_ROOT|IONCORE_EVENTMASK_SCREEN);
     XSync(dpy, 0);
     XSetErrorHandler(my_error_handler);
 
     if(redirect_error){
         warn(TR("Unable to redirect root window events for screen %d."),
              xscr);
-        return NULL;
+        return FALSE;
     }
     
-    rootwin=ALLOC(WRootWin);
-    
-    if(rootwin==NULL)
-        return NULL;
-    
-    /* Init the struct */
-    OBJ_INIT(rootwin, WRootWin);
-
     rootwin->xscr=xscr;
     rootwin->default_cmap=DefaultColormap(dpy, xscr);
     rootwin->tmpwins=NULL;
@@ -245,14 +232,12 @@ static WRootWin *preinit_rootwin(int xscr)
     fp.g.w=DisplayWidth(dpy, xscr);
     fp.g.h=DisplayHeight(dpy, xscr);
     
-    if(!window_do_init((WWindow*)rootwin, NULL, root, &fp)){
+    if(!screen_init((WScreen*)rootwin, NULL, &fp, xscr, root)){
         free(rootwin);
-        return NULL;
+        return FALSE;
     }
 
-    /* Note: this mask isn't right if some WScreen auses the same window. */
-    ((WWindow*)rootwin)->event_mask=IONCORE_EVENTMASK_ROOT;
-    
+    ((WWindow*)rootwin)->event_mask=IONCORE_EVENTMASK_ROOT|IONCORE_EVENTMASK_SCREEN;
     ((WRegion*)rootwin)->flags|=REGION_BINDINGS_ARE_GRABBED|REGION_PLEASE_WARP;
     ((WRegion*)rootwin)->rootwin=rootwin;
     
@@ -264,208 +249,9 @@ static WRootWin *preinit_rootwin(int xscr)
     preinit_gr(rootwin);
     netwm_init_rootwin(rootwin);
     
-    region_add_bindmap((WRegion*)rootwin, ioncore_rootwin_bindmap);
-    
-    return rootwin;
-}
-
-
-static Atom net_virtual_roots=None;
-
-
-static WScreen *add_screen(WRootWin *rw, int id, const WRectangle *geom, 
-                           bool useroot)
-{
-    WScreen *scr;
-    CARD32 p[1];
-    WFitParams fp;
-    
-    fp.g=*geom;
-    fp.mode=REGION_FIT_EXACT;
-    
-#ifdef CF_ALWAYS_VIRTUAL_ROOT
-    useroot=FALSE;
-#endif
-
-    scr=create_screen(rw, id, &fp, useroot);
-    
-    if(scr==NULL)
-        return NULL;
-    
-    region_set_manager((WRegion*)scr, (WRegion*)rw);
-    
-    region_map((WRegion*)scr);
-
-    if(!useroot){
-        p[0]=region_xwindow((WRegion*)scr);
-        XChangeProperty(ioncore_g.dpy, WROOTWIN_ROOT(rw), net_virtual_roots,
-                        XA_WINDOW, 32, PropModeAppend, (uchar*)&(p[0]), 1);
-    }
-
-    return scr;
-}
-
-
-#ifdef CF_XINERAMA
-static bool xinerama_sanity_check(XineramaScreenInfo *xi, int nxi)
-{
-    int i, j;
-
-    for(i=0; i<nxi; i++){
-        for(j=0; j<nxi; j++){
-            if(i!=j &&
-               (xi[j].x_org>=xi[i].x_org && xi[j].x_org<xi[i].x_org+xi[i].width) &&
-               (xi[j].y_org>=xi[i].y_org && xi[j].y_org<xi[i].y_org+xi[i].height)){
-                warn(TR("Xinerama sanity check failed; overlapping "
-                        "screens detected."));
-                return FALSE;
-            }
-        }
-        
-        if(xi[i].width<=0 || xi[i].height<=0){
-            warn(TR("Xinerama sanity check failed; zero size detected."));
-            return FALSE;
-        }
-    }
-    return TRUE;
-}
-#elif defined(CF_SUN_XINERAMA)
-static bool xinerama_sanity_check(XRectangle *monitors, int nxi)
-{
-    int i, j;
-
-    for(i=0; i<nxi; i++){
-        for(j=0; j<nxi; j++){
-            if(i!=j &&
-               (monitors[j].x>=monitors[i].x &&
-                monitors[j].x<monitors[i].x+monitors[i].width) &&
-               (monitors[j].y>=monitors[i].y &&
-                monitors[j].y<monitors[i].y+monitors[i].height)){
-                warn(TR("Xinerama sanity check failed; overlapping "
-                        "screens detected."));
-                return FALSE;
-            }
-        }
-        
-        if(monitors[i].width<=0 || monitors[i].height<=0){
-            warn(TR("Xinerama sanity check failed; zero size detected."));
-            return FALSE;
-        }
-    }
-    return TRUE;
-}
-#endif
-
-
-WRootWin *ioncore_manage_rootwin(int xscr, bool noxinerama)
-{
-    WRootWin *rootwin;
-    int nxi=0, fail=0;
-#ifdef CF_XINERAMA
-    XineramaScreenInfo *xi=NULL;
-    int i;
-    int event_base, error_base;
-#elif defined(CF_SUN_XINERAMA)
-    XRectangle monitors[MAXFRAMEBUFFERS];
-    int i;
-#endif
-
-    if(!noxinerama){
-#ifdef CF_XINERAMA
-        if(XineramaQueryExtension(ioncore_g.dpy, &event_base, &error_base)){
-            xi=XineramaQueryScreens(ioncore_g.dpy, &nxi);
-
-            if(xi!=NULL && ioncore_g.rootwins!=NULL){
-                warn(TR("Don't know how to get Xinerama information for "
-                        "multiple X root windows."));
-                XFree(xi);
-                xi=NULL;
-                nxi=0;
-            }
-        }
-#elif defined(CF_SUN_XINERAMA)
-        if(XineramaGetState(ioncore_g.dpy, xscr)){
-            unsigned char hints[16];
-            int num;
-
-            if(XineramaGetInfo(ioncore_g.dpy, xscr, monitors, hints,
-                               &nxi)==0){
-                warn(TR("Error retrieving Xinerama information."));
-                nxi=0;
-            }else{
-                if(ioncore_g.rootwins!=NULL){
-                    warn(TR("Don't know how to get Xinerama information for "
-                            "multiple X root windows."));
-                    nxi=0;
-                }
-            }
-        }
-#endif
-    }
-
-    rootwin=preinit_rootwin(xscr);
-
-    if(rootwin==NULL){
-#ifdef CF_XINERAMA
-        if(xi!=NULL)
-            XFree(xi);
-#endif
-        return NULL;
-    }
-
     net_virtual_roots=XInternAtom(ioncore_g.dpy, "_NET_VIRTUAL_ROOTS", False);
-    XDeleteProperty(ioncore_g.dpy, WROOTWIN_ROOT(rootwin), net_virtual_roots);
-
-#ifdef CF_XINERAMA
-    if(xi!=NULL && nxi!=0 && xinerama_sanity_check(xi, nxi)){
-        bool useroot=FALSE;
-        WRectangle geom;
-
-        for(i=0; i<nxi; i++){
-            geom.x=xi[i].x_org;
-            geom.y=xi[i].y_org;
-            geom.w=xi[i].width;
-            geom.h=xi[i].height;
-            /*if(nxi==1)
-                useroot=(geom.x==0 && geom.y==0);*/
-            if(!add_screen(rootwin, i, &geom, useroot)){
-                warn(TR("Unable to setup Xinerama screen %d."), i);
-                fail++;
-            }
-        }
-        XFree(xi);
-    }else
-#elif defined(CF_SUN_XINERAMA)
-    if(nxi!=0 && xinerama_sanity_check(monitors, nxi)){
-        bool useroot=FALSE;
-        WRectangle geom;
-
-        for(i=0; i<nxi; i++){
-            geom.x=monitors[i].x;
-            geom.y=monitors[i].y;
-            geom.w=monitors[i].width;
-            geom.h=monitors[i].height;
-            /*if(nxi==1)
-                useroot=(geom.x==0 && geom.y==0);*/
-            if(!add_screen(rootwin, i, &geom, useroot)){
-                warn(TR("Unable to setup Xinerama screen %d."), i);
-                fail++;
-            }
-        }
-    }else
-#endif
-    {
-        nxi=1;
-        if(!add_screen(rootwin, xscr, &REGION_GEOM(rootwin), TRUE))
-            fail++;
-    }
-    
-    if(fail==nxi){
-        warn(TR("Unable to setup X screen %d."), xscr);
-        destroy_obj((Obj*)rootwin);
-        return NULL;
-    }
-    
+    XDeleteProperty(ioncore_g.dpy, root, net_virtual_roots);
+
     /* */ {
         /* TODO: typed LINK_ITEM */
         WRegion *tmp=(WRegion*)ioncore_g.rootwins;
@@ -473,9 +259,15 @@ WRootWin *ioncore_manage_rootwin(int xscr, bool noxinerama)
         ioncore_g.rootwins=(WRootWin*)tmp;
     }
 
-    xwindow_set_cursor(WROOTWIN_ROOT(rootwin), IONCORE_CURSOR_DEFAULT);
+    xwindow_set_cursor(root, IONCORE_CURSOR_DEFAULT);
     
-    return rootwin;
+    return TRUE;
+}
+
+
+WRootWin *create_rootwin(int xscr)
+{
+    CREATEOBJ_IMPL(WRootWin, rootwin, (p, xscr));
 }
 
 
@@ -498,7 +290,9 @@ void rootwin_deinit(WRootWin *rw)
     
     XFreeGC(ioncore_g.dpy, rw->xor_gc);
     
-    window_deinit((WWindow*)rw);
+    rw->scr.mplex.win.win=None;
+
+    screen_deinit(&rw->scr);
 }
 
 
@@ -508,29 +302,6 @@ void rootwin_deinit(WRootWin *rw)
 /*{{{ region dynfun implementations */
 
 
-static void rootwin_do_set_focus(WRootWin *rootwin, bool warp)
-{
-    WRegion *sub;
-    
-    sub=REGION_ACTIVE_SUB(rootwin);
-    
-    if(sub==NULL || !REGION_IS_MAPPED(sub)){
-        WScreen *scr;
-        FOR_ALL_SCREENS(scr){
-            if(REGION_IS_MAPPED(scr)){
-                sub=(WRegion*)scr;
-                break;
-            }
-        }
-    }
-
-    if(sub!=NULL)
-        region_do_set_focus(sub, warp);
-    else
-        window_do_set_focus((WWindow*)rootwin, warp);
-}
-
-
 static bool rootwin_fitrep(WRootWin *rootwin, WWindow *par, 
                            const WFitParams *fp)
 {
@@ -551,30 +322,12 @@ static void rootwin_unmap(WRootWin *rootwin)
 }
 
 
-static void rootwin_managed_remove(WRootWin *rootwin, WRegion *reg)
-{
-    region_unset_manager(reg, (WRegion*)rootwin);
-}
-
-
-static Window rootwin_x_window(WRootWin *rootwin)
-{
-    return WROOTWIN_ROOT(rootwin);
-}
-
-
 /*}}}*/
 
 
 /*{{{ Misc */
 
 
-static bool scr_ok(WRegion *r)
-{
-    return (OBJ_IS(r, WScreen) && REGION_IS_MAPPED(r));
-}
-
-
 /*EXTL_DOC
  * Returns previously active screen on root window \var{rootwin}.
  */
@@ -582,22 +335,17 @@ EXTL_SAFE
 EXTL_EXPORT_MEMBER
 WScreen *rootwin_current_scr(WRootWin *rootwin)
 {
-    WRegion *r=REGION_ACTIVE_SUB(rootwin);
-    WScreen *scr;
-    
-    /* There should be no non-WScreen as children or managed by us, but... */
-    
-    if(r!=NULL && scr_ok(r))
-        return (WScreen*)r;
+    WScreen *scr, *fb=NULL;
     
     FOR_ALL_SCREENS(scr){
-        if(REGION_MANAGER(scr)==(WRegion*)rootwin
-           && REGION_IS_MAPPED(scr)){
-            break;
+        if(REGION_MANAGER(scr)==(WRegion*)rootwin && REGION_IS_MAPPED(scr)){
+            fb=scr;
+            if(REGION_IS_ACTIVE(scr))
+                return scr;
         }
     }
     
-    return scr;
+    return (fb ? fb : &rootwin->scr);
 }
 
 
@@ -610,16 +358,13 @@ WScreen *rootwin_current_scr(WRootWin *rootwin)
 static DynFunTab rootwin_dynfuntab[]={
     {region_map, rootwin_map},
     {region_unmap, rootwin_unmap},
-    {region_do_set_focus, rootwin_do_set_focus},
-    {(DynFun*)region_xwindow, (DynFun*)rootwin_x_window},
     {(DynFun*)region_fitrep, (DynFun*)rootwin_fitrep},
-    {region_managed_remove, rootwin_managed_remove},
     END_DYNFUNTAB
 };
 
 
 EXTL_EXPORT
-IMPLCLASS(WRootWin, WWindow, rootwin_deinit, rootwin_dynfuntab);
+IMPLCLASS(WRootWin, WScreen, rootwin_deinit, rootwin_dynfuntab);
 
     
 /*}}}*/
index 41dd89c68e1b43dc10b482413e25b62f54398ea6..74e50bda9330e930702d4edcaa4d50984747106c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/rootwin.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 #include "screen.h"
 #include "gr.h"
 #include "rectangle.h"
+#include "screen.h"
+
 
-#define WROOTWIN_ROOT(X) ((X)->wwin.win)
+#define WROOTWIN_ROOT(X) (((WWindow*)(X))->win)
 #define FOR_ALL_ROOTWINS(RW)         \
     for(RW=ioncore_g.rootwins;         \
         RW!=NULL;                    \
@@ -26,7 +28,7 @@
 
 
 DECLCLASS(WRootWin){
-    WWindow wwin;
+    WScreen scr;
     int xscr;
     
     Colormap default_cmap;
@@ -44,7 +46,7 @@ extern void rootwin_deinit(WRootWin *rootwin);
 extern WScreen *rootwin_current_scr(WRootWin *rootwin);
 
 extern void rootwin_manage_initial_windows(WRootWin *rootwin);
-extern WRootWin *ioncore_manage_rootwin(int xscr, bool noxinerama);
+extern WRootWin *create_rootwin(int xscr);
 
 #endif /* ION_IONCORE_ROOTWIN_H */
 
index e5902b302dec819020e92716aa4418d5d0777a2e..bb67ac1fcb482b5bb7f657421fafce6237071f5d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/saveload.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -226,6 +226,14 @@ bool ioncore_init_layout()
     FOR_ALL_SCREENS(scr){
         ExtlTab scrtab=extl_table_none();
         bool scrok=FALSE;
+        
+        /* Potential Xinerama or such support should set the screen ID
+         * of the root window to less than zero, and number its own
+         * fake screens up from 0.
+         */
+        if(screen_id(scr)<0)
+            continue;
+
         if(ok)
             scrok=extl_table_geti_t(tab, screen_id(scr), &scrtab);
         
@@ -278,7 +286,14 @@ bool ioncore_save_layout()
         return FALSE;
     
     FOR_ALL_SCREENS(scr){
-        ExtlTab scrtab=region_get_configuration((WRegion*)scr);
+        ExtlTab scrtab;
+        
+        /* See note above */
+        if(screen_id(scr)<0)
+            continue;
+            
+        scrtab=region_get_configuration((WRegion*)scr);
+        
         if(scrtab==extl_table_none()){
             warn(TR("Unable to get configuration for screen %d."),
                  screen_id(scr));
index 27e3b3e79fd1a35013cd9a5379ed3e5b31fa3886..bc2ad6c4fe810154a6e57bc68e7acfc82be53ac6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/saveload.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 3b896bfab6e218012b041d6a11d2e4d12f81b626..cac75a061b063d51d9fdc97e888b2a0e610ca8c0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/screen.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -39,6 +39,9 @@
 #include "group-ws.h"
 #include "mplex.h"
 #include "tags.h"
+#include "gr.h"
+#include "gr-util.h"
+#include "conf.h"
 
 
 WHook *screen_managed_changed_hook=NULL;
@@ -51,16 +54,16 @@ static void screen_update_infowin(WScreen *scr);
 /*{{{ Init/deinit */
 
 
-static bool screen_init(WScreen *scr, WRootWin *rootwin,
-                        int id, const WFitParams *fp, bool useroot)
+bool screen_init(WScreen *scr, WRootWin *parent,
+                 const WFitParams *fp, int id, Window rootwin)
 {
     Window win;
     XSetWindowAttributes attr;
     ulong attrflags=0;
+    bool is_root=FALSE;
     
     scr->id=id;
     scr->atom_workspace=None;
-    scr->uses_root=useroot;
     scr->managed_off.x=0;
     scr->managed_off.y=0;
     scr->managed_off.w=0;
@@ -72,38 +75,40 @@ static bool screen_init(WScreen *scr, WRootWin *rootwin,
     watch_init(&(scr->notifywin_watch));
     watch_init(&(scr->infowin_watch));
 
-    if(useroot){
-        win=WROOTWIN_ROOT(rootwin);
+    if(parent==NULL){
+        win=rootwin;
+        is_root=TRUE;
     }else{
         attr.background_pixmap=ParentRelative;
         attrflags=CWBackPixmap;
         
-        win=XCreateWindow(ioncore_g.dpy, WROOTWIN_ROOT(rootwin),
+        win=XCreateWindow(ioncore_g.dpy, WROOTWIN_ROOT(parent),
                           fp->g.x, fp->g.y, fp->g.w, fp->g.h, 0, 
-                          DefaultDepth(ioncore_g.dpy, rootwin->xscr),
+                          DefaultDepth(ioncore_g.dpy, parent->xscr),
                           InputOutput,
-                          DefaultVisual(ioncore_g.dpy, rootwin->xscr),
+                          DefaultVisual(ioncore_g.dpy, parent->xscr),
                           attrflags, &attr);
         if(win==None)
             return FALSE;
+            
     }
 
-    if(!mplex_do_init((WMPlex*)scr, (WWindow*)rootwin, win, fp, FALSE))
+    if(!mplex_do_init((WMPlex*)scr, (WWindow*)parent, fp, win)){
+        if(!is_root)
+            XDestroyWindow(ioncore_g.dpy, win);
         return FALSE;
+    }
 
     /*scr->mplex.win.region.rootwin=rootwin;
     region_set_parent((WRegion*)scr, (WRegion*)rootwin);*/
     scr->mplex.flags|=MPLEX_ADD_TO_END;
     scr->mplex.win.region.flags|=REGION_BINDINGS_ARE_GRABBED;
-    if(useroot)
+    
+    if(!is_root){
         scr->mplex.win.region.flags|=REGION_MAPPED;
+        window_select_input((WWindow*)scr, IONCORE_EVENTMASK_SCREEN);
+    }
     
-    window_select_input(&(scr->mplex.win),
-                        FocusChangeMask|EnterWindowMask|
-                        KeyPressMask|KeyReleaseMask|
-                        ButtonPressMask|ButtonReleaseMask|
-                        (useroot ? IONCORE_EVENTMASK_ROOT : 0));
-
     if(id==0){
         scr->atom_workspace=XInternAtom(ioncore_g.dpy, 
                                         "_ION_WORKSPACE", False);
@@ -116,10 +121,12 @@ static bool screen_init(WScreen *scr, WRootWin *rootwin,
         }
     }
 
-    /* Add rootwin's bindings to screens (ungrabbed) so that bindings
-     * are called with the proper region.
+    /* Add all the needed bindings here; mplex does nothing so that
+     * frames don't have to remove extra bindings.
      */
-    region_add_bindmap((WRegion*)scr, ioncore_rootwin_bindmap);
+    region_add_bindmap((WRegion*)scr, ioncore_screen_bindmap);
+    region_add_bindmap((WRegion*)scr, ioncore_mplex_bindmap);
+    region_add_bindmap((WRegion*)scr, ioncore_mplex_toplevel_bindmap);
 
     LINK_ITEM(ioncore_g.screens, scr, next_scr, prev_scr);
     
@@ -127,10 +134,9 @@ static bool screen_init(WScreen *scr, WRootWin *rootwin,
 }
 
 
-WScreen *create_screen(WRootWin *rootwin, int id, const WFitParams *fp,
-                       bool useroot)
+WScreen *create_screen(WRootWin *parent, const WFitParams *fp, int id)
 {
-    CREATEOBJ_IMPL(WScreen, screen, (p, rootwin, id, fp, useroot));
+    CREATEOBJ_IMPL(WScreen, screen, (p, parent, fp, id, None));
 }
 
 
@@ -138,9 +144,6 @@ void screen_deinit(WScreen *scr)
 {
     UNLINK_ITEM(ioncore_g.screens, scr, next_scr, prev_scr);
     
-    if(scr->uses_root)
-        scr->mplex.win.win=None;
-    
     mplex_deinit((WMPlex*)scr);
 }
 
@@ -266,8 +269,7 @@ void screen_activated(WScreen *scr)
 
 
 static void do_notify(WScreen *scr, Watch *watch, bool right,
-                      const char *str,
-                      char *style, const char *attr)
+                      const char *str, char *style)
 {
 
     WInfoWin *iw=(WInfoWin*)(watch->obj);
@@ -304,20 +306,19 @@ static void do_notify(WScreen *scr, Watch *watch, bool right,
         watch_setup(watch, (Obj*)iw, NULL);
     }
 
-    infowin_set_attr2(iw, attr, NULL);
     infowin_set_text(iw, str);
 }
 
 
 void screen_notify(WScreen *scr, const char *str)
 {
-    do_notify(scr, &scr->notifywin_watch, FALSE, str, "actnotify", NULL);
+    do_notify(scr, &scr->notifywin_watch, FALSE, str, "actnotify");
 }
 
 
-void screen_windowinfo(WScreen *scr, const char *str, const char *attr)
+void screen_windowinfo(WScreen *scr, const char *str)
 {
-    do_notify(scr, &scr->infowin_watch, TRUE, str, "tab-info", attr);
+    do_notify(scr, &scr->infowin_watch, TRUE, str, "tab-info");
 }
 
 
@@ -326,7 +327,7 @@ void screen_unnotify(WScreen *scr)
     Obj *iw=scr->notifywin_watch.obj;
     if(iw!=NULL){
         watch_reset(&(scr->notifywin_watch));
-        mainloop_defer_destroy(iw);
+        region_dispose((WRegion*)iw, FALSE);
     }
 }
 
@@ -336,7 +337,7 @@ void screen_nowindowinfo(WScreen *scr)
     Obj *iw=scr->infowin_watch.obj;
     if(iw!=NULL){
         watch_reset(&(scr->infowin_watch));
-        mainloop_defer_destroy(iw);
+        region_dispose((WRegion*)iw, FALSE);
     }
 }
 
@@ -397,35 +398,73 @@ static void screen_notify_tag(WScreen *scr)
 }
 
 
+GR_DEFATTR(active);
+GR_DEFATTR(inactive);
+GR_DEFATTR(selected);
+GR_DEFATTR(tagged);
+GR_DEFATTR(not_tagged);
+GR_DEFATTR(not_dragged);
+GR_DEFATTR(activity);
+GR_DEFATTR(no_activity);
+
+
+static void init_attr()
+{
+    GR_ALLOCATTR_BEGIN;
+    GR_ALLOCATTR(active);
+    GR_ALLOCATTR(inactive);
+    GR_ALLOCATTR(selected);
+    GR_ALLOCATTR(tagged);
+    GR_ALLOCATTR(not_tagged);
+    GR_ALLOCATTR(not_dragged);
+    GR_ALLOCATTR(no_activity);
+    GR_ALLOCATTR(activity);
+    GR_ALLOCATTR_END;
+}
+
+
 static void screen_update_infowin(WScreen *scr)
 {
     WRegion *reg=mplex_mx_current(&(scr->mplex));
     bool tag=(reg!=NULL && region_is_tagged(reg));
-    bool act=(reg!=NULL && region_is_activity_r(reg));
+    bool act=(reg!=NULL && region_is_activity_r(reg) && !REGION_IS_ACTIVE(scr));
+    bool sac=REGION_IS_ACTIVE(scr);
     
     if(tag || act){
         const char *n=region_displayname(reg);
-        char *attr=NULL;
+        WInfoWin *iw;
+                
+        screen_windowinfo(scr, n);
         
-        libtu_asprintf(&attr, "%s-selected-%s-not_dragged-%s",
-                       (REGION_IS_ACTIVE(scr) ? "active" : "inactive"),
-                       (tag ? "tagged" : "not_tagged"),
-                       (act ? "activity" : "no_activity"));
+        iw=(WInfoWin*)scr->infowin_watch.obj;
         
-        screen_windowinfo(scr, n, attr); /* NULL attr ok */
+        if(iw!=NULL){
+            GrStyleSpec *spec=infowin_stylespec(iw);
+            
+            init_attr();
+            
+            gr_stylespec_unalloc(spec);
+            
+            gr_stylespec_set(spec, GR_ATTR(selected));
+            gr_stylespec_set(spec, GR_ATTR(not_dragged));
+            gr_stylespec_set(spec, sac ? GR_ATTR(active) : GR_ATTR(inactive));
+            gr_stylespec_set(spec, tag ? GR_ATTR(tagged) : GR_ATTR(not_tagged));
+            gr_stylespec_set(spec, act ? GR_ATTR(activity) : GR_ATTR(no_activity));
+        }
+            
     }else{
         screen_nowindowinfo(scr);
     }
 }
 
 
-static void screen_managed_notify(WScreen *scr, WRegion *reg, const char *how)
+static void screen_managed_notify(WScreen *scr, WRegion *reg, WRegionNotify how)
 {
-    if(strcmp(how, "sub-activity")==0){
+    if(how==ioncore_g.notifies.sub_activity){
         /* TODO: multiple calls */
         mainloop_defer_action((Obj*)scr, 
                               (WDeferredAction*)screen_notify_activity);
-    }else if(strcmp(how, "tag")==0){
+    }else if(how==ioncore_g.notifies.tag){
         mainloop_defer_action((Obj*)scr, 
                               (WDeferredAction*)screen_notify_tag);
     }
@@ -439,10 +478,7 @@ static void screen_managed_notify(WScreen *scr, WRegion *reg, const char *how)
 
 
 /*EXTL_DOC
- * Find the screen with numerical id \var{id}. If Xinerama is
- * not present, \var{id} corresponds to X screen numbers. Otherwise
- * the ids are some arbitrary ordering of Xinerama rootwins.
- * If \var{id} is $-1$, the screen with the highest id is returned.
+ * Find the screen with numerical id \var{id}. 
  */
 EXTL_SAFE
 EXTL_EXPORT
@@ -644,13 +680,16 @@ static WRegion *do_create_initial(WWindow *parent, const WFitParams *fp,
 static bool create_initial_ws(WScreen *scr)
 {
     WRegion *reg=NULL;
-    WMPlexAttachParams par;
-    
-    par.flags=0;
+    WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
+    ExtlTab lo=ioncore_get_layout("default");
     
-    reg=mplex_do_attach_new(&scr->mplex, &par,
-                            (WRegionCreateFn*)groupws_load_default, 
-                            NULL);
+    if(lo==extl_table_none()){
+        reg=mplex_do_attach_new(&scr->mplex, &par,
+                                (WRegionCreateFn*)create_groupws, NULL);
+    }else{
+        reg=mplex_attach_new_(&scr->mplex, &par, 0, lo);
+        extl_unref_table(lo);
+    }
     
     if(reg==NULL){
         warn(TR("Unable to create a workspace on screen %d."), scr->id);
index 11c83faaac04d85be06e7ddf6135a44a25936a92..6555c17e2fe5628ff4b9c6bcde408891830caa7f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/screen.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -17,7 +17,6 @@
 #include "common.h"
 #include "mplex.h"
 #include "rectangle.h"
-#include "rootwin.h"
 #include "pholder.h"
 
 #define FOR_ALL_SCREENS(SCR)   \
@@ -50,9 +49,15 @@ DECLCLASS(WScreen){
     Watch infowin_watch;
 };
 
-extern WScreen *create_screen(WRootWin *rootwin, int id, 
-                              const WFitParams *fp,
-                              bool useroot);
+/* rootwin should only be set if parent is NULL, and this WScreen is
+ * actually a root window.
+ */
+extern bool screen_init(WScreen *scr, WRootWin *parent, 
+                        const WFitParams *fp, int id, Window rootwin);
+
+extern WScreen *create_screen(WRootWin *parent, const WFitParams *fp, int id);
+
+extern void screen_deinit(WScreen *scr);
 
 extern int screen_id(WScreen *scr);
 
@@ -62,16 +67,11 @@ extern bool screen_init_layout(WScreen *scr, ExtlTab tab);
 
 extern void screen_notify(WScreen *scr, const char *notstr);
 extern void screen_unnotify(WScreen *scr);
-extern void screen_windowinfo(WScreen *scr, const char *name, const char *attr);
+extern void screen_windowinfo(WScreen *scr, const char *name);
 extern void screen_nowindowinfo(WScreen *scr);
 
 extern WPHolder *screen_get_rescue_pholder_for(WScreen *scr, WRegion *mgd);
 
-/* For viewports corresponding to Xinerama rootwins <id> is initially set
- * to the Xinerama screen number. When Xinerama is not enabled, <id> is
- * the X screen number (which is the same for all Xinerama rootwins).
- * For all other viewports <id> is undefined.
- */
 extern WScreen *ioncore_find_screen_id(int id);
 extern WScreen *ioncore_goto_screen_id(int id);
 extern WScreen *ioncore_goto_next_screen();
index 4bb8cd74bec2e9d64fe7ff20c6572f1c61eeb2c6..3941436e80f6f571bf5eaa45d077d714b279f31b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/selection.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6a49786734bb5e51f93e8cfa5b824979ed9b08b5..7710e0835d68fb1b47ee5e7ee8cb51f9905e1148 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/selection.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 50c1c99aaabcac78913e4e7dd1bfd557927e9d30..b5747539ea1780401847d538d1997f6ae785b8d8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/sizehint.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6065e74a35d1f98cdf086aa5078c19f0802430b1..4ddfb4172c2ea29793fbba12a3c8ee5caf2c4010 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/sizehint.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6e23875d09b4c10d5e3dcf7a522170ca665c7e6c..7101da8b2632024ba6b340951e0d625458798f33 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/sizepolicy.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 0984737e2bf6fd41c32c9afe3c3ab9b284d78779..602652ded4ea3e0ae78e93b2a1afa5ea1bda5337 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/sizepolicy.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 8d696cb26a9b51c46689438f5cdd7ad31ab556d8..9d77ac9489ecd981f68acbfe9e9204a060a0eb2a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/stacking.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * Copyright (c) Tuomo Valkonen 1999-2007.
  *
  * 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
index a5e34642df966d94ea32dfb7a2981a7007f79cd0..2810bdaa40617ba307091a782e93aa1f3728d5ec 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/stacking.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * Copyright (c) Tuomo Valkonen 1999-2007.
  *
  * 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
index 9f2bbd3c1f48afa246b9817dd952df7433ca88c6..37487fd0216f17872c034ff889eca140110d924f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/strings.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 0f2a1f45d5736031a16442f61d2b725ac6aeb94e..df30189b0ca6e9c07a81746ad94f7c328649b10e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/strings.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6b7d5c24431cd34c9ec6680c9d3ae4dfd3a17db2..383af0c116a0a3a67c2454dd644acfa7757d1b92 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/tags.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
 
 #include <libtu/objlist.h>
 #include <libtu/setparam.h>
+
+#include "global.h"
 #include "region.h"
 #include "tags.h"
+#include "extlconv.h"
 
 
 static ObjList *taglist=NULL;
@@ -34,7 +37,7 @@ bool region_set_tagged(WRegion *reg, int sp)
             reg->flags|=REGION_TAGGED;
             objlist_insert_last(&taglist, (Obj*)reg);
         }
-        region_notify_change(reg, "tag");
+        region_notify_change(reg, ioncore_g.notifies.tag);
     }
 
     return nset;
@@ -69,7 +72,7 @@ bool region_is_tagged(WRegion *reg)
 EXTL_EXPORT
 void ioncore_clear_tags()
 {
-    while(ioncore_tags_take_first()!=NULL)
+    while(ioncore_tagged_take_first()!=NULL)
         /* nothing */;
 }
 
@@ -85,48 +88,34 @@ void ioncore_clear_tags()
  */
 EXTL_SAFE
 EXTL_EXPORT
-WRegion *ioncore_tags_first()
+WRegion *ioncore_tagged_first()
 {
     return (WRegion*)OBJLIST_FIRST(WRegion*, taglist);
 }
 
 
-WRegion *ioncore_tags_take_first()
+WRegion *ioncore_tagged_take_first()
 {
     WRegion *reg=(WRegion*)objlist_take_first(&taglist);
     
     if(reg!=NULL){
         reg->flags&=~REGION_TAGGED;
-        region_notify_change(reg, "tag");
+        region_notify_change(reg, ioncore_g.notifies.tag);
     }
     
     return reg;
 }
 
 /*EXTL_DOC
- * Returns a list of tagged regions.
+ * Iterate over tagged regions until \var{iterfn} returns \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT
-ExtlTab ioncore_tagged_list()
+bool ioncore_tagged_i(ExtlFn iterfn)
 {
-    int n=0;
-    ExtlTab tab;
-    WRegion *region;
-    ObjListIterTmp tmp;
-
-    region=ioncore_tags_first();
-    if(!region)
-        return extl_table_none();
-
-    tab=extl_create_table();
-
-    FOR_ALL_ON_OBJLIST(WRegion*, region, taglist, tmp){
-        if(extl_table_seti_o(tab, n+1, (Obj*)region))
-            n++;
-    }
-
-    return tab;
+    return extl_iter_objlist(iterfn, taglist);
 }
 
 
index 478d47b030ffa0a9bd93991ac857cf8d118bc021..a8fe8f5af1366eeea3c69996ad74b4080a37d591 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/tags.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -19,7 +19,7 @@ extern bool region_set_tagged(WRegion *reg, int sp);
 extern bool region_is_tagged(WRegion *reg);
 
 extern void ioncore_clear_tags();
-extern WRegion *ioncore_tags_first();
-extern WRegion *ioncore_tags_take_first();
+extern WRegion *ioncore_tagged_first();
+extern WRegion *ioncore_tagged_take_first();
 
 #endif /* ION_IONCORE_TAGS_H */
index 8d2986fe6fb9ccf12b1ec8ec1e919f78f44d4fbe..0b122008e70a7a98231065fa74f9b1ff5ee288d2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/window.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -57,9 +57,17 @@ void window_release(WWindow *wwin)
 /*{{{ Init, create */
 
 
-bool window_do_init(WWindow *wwin, WWindow *par, Window win,
-                    const WFitParams *fp)
+bool window_do_init(WWindow *wwin, WWindow *par, 
+                    const WFitParams *fp, Window win)
 {
+    if(win==None){
+        assert(par!=NULL);
+        win=create_xwindow(region_rootwin_of((WRegion*)par),
+                           par->win, &(fp->g));
+        if(win==None)
+            return FALSE;
+    }
+
     wwin->win=win;
     wwin->xic=NULL;
     wwin->event_mask=0;
@@ -67,10 +75,8 @@ bool window_do_init(WWindow *wwin, WWindow *par, Window win,
     
     region_init(&(wwin->region), par, fp);
     
-    if(win!=None){
-        XSaveContext(ioncore_g.dpy, win, ioncore_g.win_context, 
-                     (XPointer)wwin);
-    }
+    XSaveContext(ioncore_g.dpy, win, ioncore_g.win_context, 
+                 (XPointer)wwin);
     
     return TRUE;
 }
@@ -78,14 +84,7 @@ bool window_do_init(WWindow *wwin, WWindow *par, Window win,
 
 bool window_init(WWindow *wwin, WWindow *par, const WFitParams *fp)
 {
-    Window win;
-    
-    win=create_xwindow(region_rootwin_of((WRegion*)par),
-                       par->win, &(fp->g));
-    if(win==None)
-        return FALSE;
-    /* window_init does not fail */
-    return window_do_init(wwin, par, win, fp);
+    return window_do_init(wwin, par, fp, None);
 }
 
 
@@ -93,11 +92,14 @@ void window_deinit(WWindow *wwin)
 {
     region_deinit((WRegion*)wwin);
     
+    region_pointer_focus_hack(&wwin->region);
+    
     if(wwin->xic!=NULL)
         XDestroyIC(wwin->xic);
-
+        
     if(wwin->win!=None){
         XDeleteContext(ioncore_g.dpy, wwin->win, ioncore_g.win_context);
+        /* Probably should not try destroy if root window... */
         XDestroyWindow(ioncore_g.dpy, wwin->win);
     }
     
@@ -174,6 +176,8 @@ void window_map(WWindow *wwin)
 
 void window_unmap(WWindow *wwin)
 {
+    region_pointer_focus_hack(&wwin->region);
+
     XUnmapWindow(ioncore_g.dpy, wwin->win);
     REGION_MARK_UNMAPPED(wwin);
 }
index b9f4ffa837d6f5a718ba3d35e3e15bd1de1c4d65..e4de5bbacb652c98a7fc9bf453f7dbd0287cf8f2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/window.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -29,8 +29,8 @@ DECLCLASS(WWindow){
 
 extern bool window_init(WWindow *p, WWindow *parent, 
                         const WFitParams *fp);
-extern bool window_do_init(WWindow *p, WWindow *parent, Window win, 
-                           const WFitParams *fp);
+extern bool window_do_init(WWindow *p, WWindow *parent, 
+                           const WFitParams *fp, Window win);
 extern void window_deinit(WWindow *win);
 
 DYNFUN void window_draw(WWindow *wwin, bool complete);
index 304adf476e9e8ff22872218d969d649a779eeb62..21339d633bfb547fa4afd9e86b86071c22f09bb9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/xic.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index dcc3de6b0c32c33dd4694f49d3cc20de9ab57112..f745442b8ff162b942c459026a021c646a935208 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/xic.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 16491c7efecb2dd6a1bdc8d6372ac444c2c6de0e..9ce3df2a7b76395a43845c47296aa1b8b40057d1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/xwindow.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 50e7db5075f735fb6808ab97e71b5f624e76558f..6379ddf9c07946864c64b05e768bd221b2f4c937 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/xwindow.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index c79e2ce94328804fb9cf91e65908fd5da800dc04..dfc0e89df2b4baf9aefcbee1713b019cee981c30 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/libmainloop/defer.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 3c6807e9905799ab068156bacfeb71a3e687f525..ee7d400744af7b67b781e44a408ec1bb5e4f18bc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/libmainloop/defer.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 3f0f264edb4f2acc487f195d90dfb3d2afdcee6f..6038e36a48517dd9723ed7baad10934f54d9e33c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mainloop/exec.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index c9278b33138b78b97dda3324f8a9d6f00c5cbd3e..796e453d90a4788571e7521e07d4e471a2b662c5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/libmainloop/exec.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 1a15bc97046e42d907738ed37ec750e120762683..9b873a5def40ff28d68b3b30548f2c2c3f6398a7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mainloop/hooks.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -95,6 +95,9 @@ EXTL_SAFE
 EXTL_EXPORT
 WHook *mainloop_get_hook(const char *name)
 {
+    if(name==NULL)
+        return NULL;
+    
     if(named_hooks!=NULL){
         bool found=FALSE;
         Rb_node node=rb_find_key_n(named_hooks, name, &found);
index 63d3554a982ecf210040863a0366204759408cac..11487de27210ce230e465f92ce84572ef6288bad 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mainloop/hooks.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index ddf6aba40cf582115bb133596c4b2b0aa39072de..fea01ba6ccabebb43ff9ded99c57707db64bef84 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/libmainloop/signal.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 7867c18b11964117f3a6410d9c966364a9457fe0..7e8682e33c7b2d455e9756c6102b3a37a19ac6de 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mainloop/signal.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index cce76e5041071bafeaf66e4e48fc67d3dbddc354..4143c2a65d36d3fe58862030d4373359d1c2c0ec 100644 (file)
@@ -1,7 +1,7 @@
 
 libtu
 
-Copyright (c) Tuomo Valkonen 1999-2004.
+Copyright (c) Tuomo Valkonen 1999-2007.
 <tuomov at iki.fi>
 
 
@@ -29,3 +29,5 @@ is included in snprintf_2.2/ and is used by default. To use the
 system's versions of these functions, if available, modify
 system.mk.
 
+The implementation of red-black trees is based on that by
+James S. Plank; see README.rb for details.
index 20aff081c6ed108600e44fbb068a13266e8021ca..420d613c0a7fba4ae4753bbc7aa0696eb19ee12d 100644 (file)
@@ -1,6 +1,18 @@
 
 Context:
 
+[Clean-up and pending updates
+Tuomo Valkonen <tuomov@iki.fi>**20070129141139] 
+
+[stringstore_get should work on STRINGID_NONE too.
+Tuomo Valkonen <tuomov@iki.fi>**20070126232827] 
+
+[Added stringstore_find/alloc_n
+Tuomo Valkonen <tuomov@iki.fi>**20070125191555] 
+
+[Added stringstore_ref
+Tuomo Valkonen <tuomov@iki.fi>**20070121200255] 
+
 [Path fix
 Tuomo Valkonen <tuomov@iki.fi>**20061016223205] 
 
diff --git a/libtu/np-conv.h b/libtu/np-conv.h
deleted file mode 100644 (file)
index c6c13c7..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * libtu/np-conv.h
- *
- * Copyright (c) Tuomo Valkonen 1999-2002. 
- *
- * You may distribute and modify this library under the terms of either
- * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
- */
-
-#include <math.h>
-
-#ifdef NP_SIMPLE_IMPL
-
-#define FN_NUM_TO_SIGNED(T, UMAX, MAX, MIN)                          \
- static int num_to_##T(T *ret, const NPNum *num, bool allow_uns_big) \
- {                                                                   \
-       if(num->type!=NPNUM_INT)                                         \
-               return E_TOKZ_NOTINT;                                        \
-                                                                        \
-       if(!num->negative){                                              \
-               *ret=num->ival;                                              \
-               if(allow_uns_big?num->ival>UMAX:num->ival>MAX)               \
-               return E_TOKZ_RANGE;                                         \
-       }else{                                                           \
-               *ret=-num->ival;                                             \
-               if(num->ival>-(ulong)MIN)                                    \
-               return E_TOKZ_RANGE;                                         \
-       }                                                                \
-       return 0;                                                        \
- }
-
-#define FN_NUM_TO_UNSIGNED(T, UMAX, MIN)                         \
- static int num_to_##T(T *ret, const NPNum *num, bool allow_neg) \
- {                                                               \
-       if(num->type!=NPNUM_INT)                                     \
-               return E_TOKZ_NOTINT;                                    \
-                                                                    \
-       if(!num->negative){                                          \
-               *ret=num->ival;                                          \
-               if(num->ival>UMAX)                                       \
-               return E_TOKZ_RANGE;                                     \
-       }else{                                                       \
-               *ret=-num->ival;                                         \
-               if(!allow_neg || num->ival>(ulong)-MIN)                  \
-               return E_TOKZ_RANGE;                                     \
-       }                                                            \
-       return 0;                                                    \
- }
-
-#define FN_NUM_TO_FLOAT(T, POW)                  \
- static int num_to_##T(T *ret, const NPNum *num) \
- {                                               \
-       *ret=(num->negative?-num->fval:num->fval);   \
-       return 0;                                    \
- }
-
-#else /* NP_SIMPLE_IMPL */
-
-#define FN_NUM_TO_SIGNED(T, UMAX, MAX, MIN)                          \
- static int num_to_##T(T *ret, const NPNum *num, bool allow_uns_big) \
- {                                                                   \
-       if(num->exponent)                                                \
-               return E_TOKZ_NOTINT;                                        \
-       if(num->nmantissa>0)                                             \
-               return E_TOKZ_RANGE;                                         \
-                                                                     \
-       if(!num->negative){                                              \
-               *ret=num->mantissa[0];                                       \
-               if(allow_uns_big?num->mantissa[0]>UMAX:num->mantissa[0]>MAX) \
-                       return E_TOKZ_RANGE;                                     \
-       }else{                                                           \
-               *ret=-num->mantissa[0];                                      \
-               if(num->mantissa[0]>-(ulong)MIN)                             \
-                       return E_TOKZ_RANGE;                                     \
-       }                                                                \
-       return 0;                                                        \
-}
-
-#define FN_NUM_TO_UNSIGNED(T, UMAX, MIN)                         \
- static int num_to_##T(T *ret, const NPNum *num, bool allow_neg) \
- {                                                               \
-       if(num->exponent)                                            \
-               return E_TOKZ_NOTINT;                                    \
-       if(num->nmantissa>0)                                         \
-               return E_TOKZ_RANGE;                                     \
-                                                                 \
-       if(!num->negative){                                          \
-               *ret=num->mantissa[0];                                   \
-               if(num->mantissa[0]>UMAX)                                \
-                       return E_TOKZ_RANGE;                                 \
-       }else{                                                       \
-               *ret=-num->mantissa[0];                                  \
-               if(!allow_neg || num->mantissa[0]>(ulong)-MIN)           \
-                       return E_TOKZ_RANGE;                                 \
-       }                                                            \
-       return 0;                                                    \
-}
-
-
-#define FN_NUM_TO_FLOAT(T, POW)                  \
- static int num_to_##T(T *ret, const NPNum *num) \
- {                                               \
-       T d=0;                                       \
-       int i;                                       \
-                                                    \
-       for(i=num->nmantissa;i>=0;i--)               \
-               d=d*(T)(ULONG_MAX+1.0)+num->mantissa[i]; \
-                                                 \
-       d*=POW(num->base, num->exponent);            \
-       *ret=d;                                      \
-                                                    \
-       return 0;                                    \
- }
-
-#endif /* NP_SIMPLE_IMPL */
-
-FN_NUM_TO_SIGNED(long, ULONG_MAX, LONG_MAX, LONG_MIN)
-FN_NUM_TO_SIGNED(char, UCHAR_MAX, CHAR_MAX, CHAR_MIN)
-FN_NUM_TO_FLOAT(double, pow)
-
-#undef NEG
diff --git a/libtu/numparser2.h b/libtu/numparser2.h
deleted file mode 100644 (file)
index b43e2ec..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * libtu/numparser2.h
- *
- * Copyright (c) Tuomo Valkonen 1999-2002. 
- *
- * You may distribute and modify this library under the terms of either
- * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
- */
-
-#define MAX_MANTISSA 10  /* should be enough for our needs */
-#define ULONG_SIZE (sizeof(ulong)*8)
-
-enum{
-       NPNUM_INT,
-       NPNUM_FLOAT
-};
-
-#ifdef NP_SIMPLE_IMPL
-
-typedef struct _NPNum{
-       int type;
-       int base;
-       bool negative;
-       double fval;
-       ulong ival;
-} NPNum;
-
-#define NUM_INIT {0, 0, 0, 0.0, 0}
-
-static int npnum_mulbase_add(NPNum *num, long base, long v)
-{
-       double iold=num->ival;
-       
-       num->fval=num->fval*base+(double)v;
-       
-       num->ival*=base;
-       
-       if(num->ival<iold)
-               num->type=NPNUM_FLOAT;
-       
-       num->ival+=v;
-       
-       return 0;
-}
-
-#else /* NP_SIMPLE_IMPL */
-
-typedef struct _NPNum{
-       unsigned char nmantissa;
-       int type;
-       int base;
-       bool negative;
-       ulong mantissa[MAX_MANTISSA];
-       long exponent;
-} NPNum;
-
-#define NUM_INIT {0, 0, 0, 0, {0,}, 0}
-
-#define ADD_EXP(NUM, X) (NUM)->exponent+=(X);
-
-#if defined(__GNUG__) && defined(i386) && !defined(NP_NO_I386_ASM)
- #define NP_I386_ASM
-#endif
-
-static int npnum_mulbase_add(NPNum *num, long base, long v)
-{
-       long i, j;
-       ulong overflow;
-#ifndef NP_I386_ASM
-       ulong val;
-#endif
-       
-       for(i=num->nmantissa;i>=0;i--){
-#ifdef NP_I386_ASM
-               __asm__("mul %4\n"
-                               : "=a" (num->mantissa[i]), "=d" (overflow)
-                               : "0" (num->mantissa[i]), "1" (0), "q" (base)
-                               : "eax", "edx");
-#else
-               overflow=0;
-               val=num->mantissa[i];
-               
-               if(val<ULONG_MAX/base){
-                       val*=base;
-               }else if(val){
-                       ulong tmp=val;
-                       ulong old=val;
-                       for(j=0; j<base; j++){
-                               val+=tmp;
-                               if(val<=old)
-                                       overflow++;
-                               old=val;
-                       }
-               }
-               num->mantissa[i]=val;
-#endif
-               if(overflow){
-                       if(i==num->nmantissa){
-                               if(num->nmantissa==MAX_MANTISSA)
-                                       return E_TOKZ_TOOBIG;
-                               num->nmantissa++;
-                       }
-                       num->mantissa[i+1]+=overflow;
-               }
-       }
-       num->mantissa[0]+=v;
-       
-       return 0;
-}
-
-#undef NP_I386_ASM
-
-#endif /* NP_SIMPLE_IMPL */
-
-
-/* */
-
-
-static bool is_end(int c)
-{
-       /* oops... EOF was missing */
-       return (c==EOF || (c!='.' && ispunct(c)) || isspace(c) || iscntrl(c));
-}
-
-
-/* */
-
-
-static int parse_exponent(NPNum *num, Tokenizer *tokz, int c)
-{
-       long exp=0;
-       bool neg=FALSE;
-       int err=0;
-       
-       c=GETCH();
-       
-       if(c=='-' || c=='+'){
-               if(c=='-')
-                       neg=TRUE;
-               c=GETCH();
-       }
-       
-       for(; 1; c=GETCH()){
-               if(isdigit(c)){
-                       exp*=10;
-                       exp+=c-'0';
-               }else if(is_end(c)){
-                       UNGETCH(c);
-                       break;
-               }else{
-                       err=E_TOKZ_NUMFMT;
-               }
-       }
-
-       if(neg)
-               exp*=-1;
-
-#ifndef NP_SIMPLE_IMPL
-       ADD_EXP(num, exp);
-#else
-       num->fval*=pow(num->base, exp);
-#endif 
-       return err;
-}
-
-
-static int parse_number(NPNum *num, Tokenizer *tokz, int c)
-{
-       int base=10;
-       int dm=1;
-       int err=0;
-       int tmp;
-#ifdef NP_SIMPLE_IMPL
-       double divisor=base;
-#endif 
-       
-       if(c=='-' || c=='+'){
-               if(c=='-')
-                       num->negative=TRUE;
-               c=GETCH();
-               if(!isdigit(c))
-                       err=E_TOKZ_NUMFMT;
-       }
-       
-       if(c=='0'){
-               dm=0;
-               c=GETCH();
-               if(c=='x' || c=='X'){
-                       base=16;
-                       c=GETCH();
-               }else if(c=='b' || c=='B'){
-                       base=2;
-                       c=GETCH();
-               }else if('0'<=c && c<='7'){
-                       base=8;
-               }else{
-                       dm=2;
-               }
-       }
-       
-       num->base=base;
-       
-       for(; 1; c=GETCH()){
-               if((c=='e' || c=='E') && dm!=0){
-                       if(dm<2){
-                               err=E_TOKZ_NUMFMT;
-                               continue;
-                       }
-                       tmp=parse_exponent(num, tokz, c);
-                       if(err==0)
-                               err=tmp;
-                       break;
-               }
-               
-               if(isxdigit(c)){
-                       if('0'<=c && c<='9')
-                               c-='0';
-                       else if(isupper(c))
-                               c-='A'-10;
-                       else
-                               c-='a'-10;
-                       
-                       if(c>=base)
-                               err=E_TOKZ_NUMFMT;
-
-#ifdef NP_SIMPLE_IMPL
-                       if(dm==3){
-                               num->fval+=(double)c/divisor;
-                               divisor*=base;
-                       }else
-#endif
-                       {
-                               tmp=npnum_mulbase_add(num, base, c);
-                               if(err==0)
-                                       err=tmp;
-                       }
-                       
-                       if(dm==1)
-                               dm=2;
-#ifndef NP_SIMPLE_IMPL                 
-                       else if(dm==3)
-                               ADD_EXP(num, -1);
-#endif                 
-                       continue;
-               }
-               
-               if(c=='.'){
-                       if(dm!=2){
-                               err=E_TOKZ_NUMFMT;
-                       }
-                       dm=3;
-#ifdef NP_SIMPLE_IMPL
-                       num->type=NPNUM_FLOAT;
-                       divisor=base;
-#endif
-                       continue;
-               }
-               
-               if(is_end(c)){
-                       UNGETCH(c);
-                       break;
-               }
-               
-               err=E_TOKZ_NUMFMT;
-       }
-       
-#ifndef NP_SIMPLE_IMPL                 
-       num->type=(num->exponent==0 ? NPNUM_INT : NPNUM_FLOAT);
-#endif
-
-       return err;
-}
index 6f54387b86280bb677d924f7c4d59706dc93c5ed..5529820666cd46d27f7d25b01d9ce35070ca54dd 100644 (file)
@@ -1,13 +1,14 @@
 /*
  * libtu/stringstore.c
  *
- * Copyright (c) Tuomo Valkonen 2004. 
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * You may distribute and modify this library under the terms of either
  * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
  */
 
 #include <stdlib.h>
+#include <string.h>
 
 #include "misc.h"
 #include "output.h"
@@ -20,19 +21,42 @@ static Rb_node stringstore=NULL;
 
 const char *stringstore_get(StringId id)
 {
-    return (const char*)(((Rb_node)id)->k.key);
+    return (id==STRINGID_NONE
+            ? NULL
+            : (const char*)(((Rb_node)id)->k.key));
 }
 
+
+typedef struct{
+    const char *key;
+    uint len;
+} D;
+
+static int cmp(const void *d_, const char *nodekey)
+{
+    D *d=(D*)d_;
     
-StringId stringstore_find(const char *str)
+    int res=strncmp(d->key, nodekey, d->len);
+    
+    return (res!=0 
+            ? res 
+            : (nodekey[d->len]=='\0' ? 0 : 1));
+}
+
+
+StringId stringstore_find_n(const char *str, uint l)
 {
     Rb_node node;
     int found=0;
+    D d;
     
     if(stringstore==NULL)
         return STRINGID_NONE;
     
-    node=rb_find_key_n(stringstore, str, &found);
+    d.key=str;
+    d.len=l;
+    
+    node=rb_find_gkey_n(stringstore, &d, (Rb_compfn*)cmp, &found);
     
     if(!found)
         return STRINGID_NONE;
@@ -41,9 +65,15 @@ StringId stringstore_find(const char *str)
 }
 
 
-StringId stringstore_alloc(const char *str)
+StringId stringstore_find(const char *str)
 {
-    Rb_node node=(Rb_node)stringstore_find(str);
+    return stringstore_find_n(str, strlen(str));
+}
+
+
+StringId stringstore_alloc_n(const char *str, uint l)
+{
+    Rb_node node=(Rb_node)stringstore_find_n(str, l);
     char *s;
     
     if(node!=NULL){
@@ -57,7 +87,7 @@ StringId stringstore_alloc(const char *str)
             return STRINGID_NONE;
     }
     
-    s=scopy(str);
+    s=scopyn(str, l);
     
     if(s==NULL)
         return STRINGID_NONE;
@@ -73,6 +103,12 @@ StringId stringstore_alloc(const char *str)
 }
 
 
+StringId stringstore_alloc(const char *str)
+{
+    return stringstore_alloc_n(str, strlen(str));
+}
+
+
 void stringstore_free(StringId id)
 {
     Rb_node node=(Rb_node)id;
@@ -96,3 +132,12 @@ void stringstore_free(StringId id)
     }
 }
 
+
+void stringstore_ref(StringId id)
+{
+    Rb_node node=(Rb_node)id;
+    
+    if(node!=NULL)
+        node->v.ival++;
+}
+
index 752e57335b46316d17e82e682c6ab0f4873f2ddd..5510ef41de0429e121f57d215f93995e76c501d1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * libtu/stringstore.h
  *
- * Copyright (c) Tuomo Valkonen 2004. 
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * You may distribute and modify this library under the terms of either
  * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
@@ -17,6 +17,9 @@ typedef void* StringId;
 extern const char *stringstore_get(StringId id);
 extern StringId stringstore_find(const char *str);
 extern StringId stringstore_alloc(const char *str);
+extern StringId stringstore_find_n(const char *str, uint l);
+extern StringId stringstore_alloc_n(const char *str, uint l);
 extern void stringstore_free(StringId id);
+extern void stringstore_ref(StringId id);
 
 #endif /* LIBTU_STRINGSTORE_H */
index b3a8c918565380719682f0808a4549f4395e9ce9..81efb95fb42b457e772e40d08f40348527280da2 100644 (file)
@@ -28,10 +28,6 @@ obrazovku (ko
 Nastaví název sezení. Tato volba ovlivní, kam se ulo¾í pracovní plochy
 a ostatní soubory. Pokud není nastavená, pou¾ije se ~/.ion3/session_name.
 .TP
-.B \-xinerama 0|1
-Jestli¾e byl Ion sestaven s podporou Xineramy, mù¾ete touto volbou
-povolit/zakázat (1/0) její pou¾ití. Implicitnì je Xinerama povolena.
-.TP
 .B \-help
 Zobrazí nápovìdu k pøíkazovým parametrùm
 .TP
@@ -101,12 +97,12 @@ BINDINGS:WFrame.toplevel
 
 .SS Pøiøazení pro práci s plovoucími/odpojenými rámy
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Pøiøazení pro dla¾dicové plochy a rámy [mod_tiling]
 
 BINDINGS:WTiling
-BINDINGS:WFrame-on-WTiling
+.\" BINDINGS:WFrame.tiled
 
 .SS Pøiøazení pro kientská okna
 
index 3a2106f0293286f365d77caed17b2305628c9662..fa60e7beb0ab27b5695bf9e52c315132381be994 100644 (file)
@@ -30,11 +30,6 @@ Setzt einen Sitzungsnamen. Diese Option beeinflusst wo der Arbeitsbereich und
 andere Sicherungsdateien abgelegt werden (~/.ion3/sitzungs_name wenn die Option
 gesetzt wurde).
 .TP
-.B \-xinerama 0|1
-Wenn Ion mit Xinerama Unterstützung kompiliert wurde, kann diese Option benutzt
-werden um sie 'an = 1' oder 'aus = 0' zu stellen. Die Voreinstelllung ist
-Xineramas Screeninformation zu benutzen.
-.TP
 .B \-help
 Zeigt die Hilfe für die Kommandozeilenoptionen
 .TP
@@ -107,12 +102,13 @@ BINDINGS:WMoveresMode
 .SS Bindungen zum teilen der Arbeitsfläche [mod_ionws]
 
 BINDINGS:WTiling
+.\" BINDINGS:WFrame.tiled
 
 .SS Bindungen für den fliessenden Arbeitsbereich und Frames [mod_floatws]
 
 BINDINGS:WGroupWS
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Bindungen für Message- und Anfrageboxen [mod_query]
 
index ae82a00cf01099d74dcf1df51c3418313d79939d..82fca519000e459546e265febf3434e108f787f7 100644 (file)
@@ -28,10 +28,6 @@ parametrill
 .B \-session session_name
 Istunnon nimi. Tämä vaikuttaa talletustiedostojen sijaintiin.
 .TP
-.B \-xinerama 0|1
-Jos Ion käännettiin Xinerama-tuella, voidaan Xinerama tieto silti jättää
-hyödyntämättä  asettamalla tämä valinta arvoon 0.
-.TP
 .B \-help
 Näytä komentorivin ohje.
 .TP
@@ -104,12 +100,12 @@ BINDINGS:WFrame.toplevel
 
 .SS Kelluvissa/irroitetuissa kehyksissä toimivat sidonnat
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Laatoituksien ja laatoitettujen kehysten sidonnat [mod_tiling]
 
 BINDINGS:WTiling
-BINDINGS:WFrame-on-WTiling
+.\" BINDINGS:WFrame.tiled
 
 .SS Asiakasikkunoiden sidonnat
 
index 5ddbb3349ce79c10e86c85ac5441c78089e39edc..b9ab3f1a939cf93f18235176d43e0d1eb1dbc8cc 100644 (file)
@@ -28,11 +28,6 @@ in the DISPLAY environment variable.
 Set session name. This option affects where workspace and other save files are
 put (~/.ion3/session_name if option set).
 .TP
-.B \-xinerama 0|1
-If Ion was compiled with Xinerama support, this option can be used to
-enable/disable (1/0) the use of it. The default is to use Xinerama
-screen information.
-.TP
 .B \-help
 Show help on command line options
 .TP
@@ -102,12 +97,12 @@ BINDINGS:WFrame.toplevel
 
 .SS Bindings for floating/detached frames
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Bindings for tilings and tiled frames [mod_tiling]
 
 BINDINGS:WTiling
-BINDINGS:WFrame-on-WTiling
+.\" BINDINGS:WFrame.tiled
 
 .SS Bindings for client windows
 
index a45f74c6ad07d89354cb850adbec557d4fc6c193..548a16fc3d9961ee3688c222405c2bde9e42a8ab 100644 (file)
@@ -30,10 +30,6 @@ obrazovku (ko
 Nastaví název sezení. Tato volba ovlivní, kam se ulo¾í pracovní plochy
 a ostatní soubory. Pokud není nastavená, pou¾ije se ~/.pwm3/session_name.
 .TP
-.B \-xinerama 0|1
-Jestli¾e byl Ioncore sestaven s podporou Xineramy, mù¾ete touto volbou
-povolit/zakázat (1/0) její pou¾ití. Implicitnì je Xinerama _zakázána_.
-.TP
 .B \-help
 Zobrazí nápovìdu k pøíkazovým parametrùm
 .TP
@@ -74,7 +70,7 @@ BINDINGS:WMoveresMode
 
 BINDINGS:WGroupWS
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Pøiøazení pro menu [mod_menu]
 
index fe387397dfc123af9e7536a3abcac2f08efc3df3..5f6138dd8cd2698291af6009fd05cddcd07b702d 100644 (file)
@@ -32,11 +32,6 @@ Setzt einen Sitzungsnamen. Diese Option beeinflusst wo der Arbeitsbereich und
 andere Sicherungsdateien abgelegt werden (~/.pwm3/sitzungs_name wenn die Option
 gesetzt wurde).
 .TP
-.B \-xinerama 0|1
-Wenn Ion mit Xinerama Unterstützung kompiliert wurde, kann diese Option benutzt
-werden um sie 'an = 1' oder 'aus = 0' zu stellen. Die Voreinstelllung ist
-Xineramas Screeninformation 'NICHT' zu benutzen.
-.TP
 .B \-help
 Zeigt die Hilfe für die Kommandozeilenoptionen
 .TP
@@ -78,7 +73,7 @@ BINDINGS:WMoveresMode
 
 BINDINGS:WGroupWS
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Bindungen für die Menüs [mod_menu]
 
index 6e634c964371d7e5681c10ca104ad20d1cd4842f..40c140fe5312be3a05e5b5afa619a96bda8d33b2 100644 (file)
@@ -29,12 +29,6 @@ parametrill
 .B \-sessionname session_name
 Istunnon nimi. Tämä vaikuttaa talletustiedostojen sijaintiin.
 .TP
-.B \-xinerama 0|1
-PWM ei oletuksena käytä Xinerama-tietoa Ionista poiketen. Jos se kuitenkin
-käännettiin Xinerama-tuella, voidaan tuo tieto ottaa käyttää asettamalla
-tämän parametrin arvoksi 1. Tuolloin kaikilla Xinerama-näytöillä on 
-erilliset työpöydät.
-.TP
 .B \-help
 Näytä komentorivin ohje.
 .TP
@@ -75,7 +69,7 @@ BINDINGS:WMoveresMode
 
 BINDINGS:WGroupWS
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Valikoiden sidonnat [mod_menu]
 
index 50df639be1617ebdd2003448850cdddda6c4091a..e38625b5eb2be2281dcd92a13c29a206e6824789 100644 (file)
@@ -31,11 +31,6 @@ in the DISPLAY environment variable.
 Set session name. This option affects where workspace and other save files are
 put (~/.pwm3/session_name if option set).
 .TP
-.B \-xinerama 0|1
-If Ioncore was compiled with Xinerama support, this option can be used to
-enable/disable (1/0) the use of it. The default is _not_ to use Xinerama
-screen information.
-.TP
 .B \-help
 Show help on command line options
 .TP
@@ -75,7 +70,7 @@ BINDINGS:WMoveresMode
 
 BINDINGS:WGroupWS
 
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
 
 .SS Bindings for menus [mod_menu]
 
index 3b18513a830288a684254c7684123cb7c61e9881..c67ce6d45c83ba16f13f2b9ec5c8d585ec83bbea 100644 (file)
@@ -2,7 +2,7 @@
  * Ion dock module
  * Copyright (C) 2003 Tom Payne
  * Copyright (C) 2003 Per Olofsson
- * Copyright (C) 2004-2006 Tuomo Valkonen
+ * Copyright (C) 2004-2007 Tuomo Valkonen
  *
  * by Tom Payne <ion@tompayne.org>
  * based on code by Per Olofsson <pelle@dsv.su.se>
@@ -905,7 +905,7 @@ static void dock_draw(WDock *dock, bool complete)
         {
             WRectangle geom=REGION_GEOM(dock);
             geom.x=geom.y=0;
-            grbrush_draw_border(dock->brush, &geom, "dock");
+            grbrush_draw_border(dock->brush, &geom);
         }
         break;
     case DOCK_OUTLINE_STYLE_EACH:
@@ -913,8 +913,7 @@ static void dock_draw(WDock *dock, bool complete)
             WDockApp *dockapp;
             for(dockapp=dock->dockapps; dockapp!=NULL;
                 dockapp=dockapp->next){
-                grbrush_draw_border(dock->brush, &dockapp->tile_geom, 
-                                    "dock");
+                grbrush_draw_border(dock->brush, &dockapp->tile_geom);
             }
         }
         break;
index cc94437677fb0c57cc915d444c236162b9feb5f8..79a01ce4b47ea926ebd37e6d66bfc1d81fdf5c0d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_menu/grabmenu.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -37,8 +37,10 @@ static bool grabmenu_handler(WRegion *reg, XEvent *xev)
     if(reg==NULL)
         return FALSE;
     
-    if(menu->gm_state==ev->state && ev->keycode==menu->gm_kcb)
+    if((menu->gm_state==ev->state || menu->gm_state==AnyModifier) 
+       && ev->keycode==menu->gm_kcb){
         menu_select_next(menu);
+    }
     
     return FALSE;
 }
@@ -53,12 +55,17 @@ WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab,
     WMPlexAttachParams par;
     WMenu *menu;
     XKeyEvent *ev;
+    uint state, kcb;
+    bool sub;
     
-    ev=ioncore_current_key_event();
-    
-    if(ev==NULL)
+    if(!ioncore_current_key(&kcb, &state, &sub))
         return NULL;
     
+    if(state==0){
+        /* TODO: cycle key? */
+        return mod_menu_do_menu(mplex, handler, tab, param);
+    }
+    
     fnp.handler=handler;
     fnp.tab=tab;
     fnp.pmenu_mode=FALSE;
@@ -77,10 +84,10 @@ WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab,
                                      (void*)&fnp); 
     
     if(menu==NULL)
-        return FALSE;
+        return NULL;
  
-    menu->gm_kcb=ev->keycode;
-    menu->gm_state=ev->state;
+    menu->gm_kcb=kcb;
+    menu->gm_state=state;
     
     ioncore_grab_establish((WRegion*)menu, grabmenu_handler, NULL, 0);
     
index 98df15b11e2bb7b10e5fa0c2e4eafac8b1317bc1..601e11e9ca00b94dec06c227f96b4a22b6387ae1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_menu/main.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index c5568b80b1f5a408c771aa29bb00dd21712050b4..e779d1581dac9a63929188243a1a9fe5603d0174 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_menu/main.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index b8ec9cfa446984102770562de2ba244c45ccd5eb..d891c230b6690a014b3cf1ec5810af78c450031b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_menu/menu.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -28,6 +28,8 @@
 #include <ioncore/event.h>
 #include <ioncore/xwindow.h>
 #include <ioncore/names.h>
+#include <ioncore/gr.h>
+#include <ioncore/gr-util.h>
 #include "menu.h"
 #include "main.h"
 
@@ -85,22 +87,35 @@ static void get_inner_geom(WMenu *menu, WRectangle *geom)
 }
 
 
+GR_DEFATTR(active);
+GR_DEFATTR(inactive);
+GR_DEFATTR(selected);
+GR_DEFATTR(unselected);
+GR_DEFATTR(normal);
+GR_DEFATTR(submenu);
+
+
+static void init_attr()
+{
+    GR_ALLOCATTR_BEGIN;
+    GR_ALLOCATTR(active);
+    GR_ALLOCATTR(inactive);
+    GR_ALLOCATTR(selected);
+    GR_ALLOCATTR(unselected);
+    GR_ALLOCATTR(normal);
+    GR_ALLOCATTR(submenu);
+    GR_ALLOCATTR_END;
+}
+
+
 static void menu_draw_entry(WMenu *menu, int i, const WRectangle *igeom,
                             bool complete)
 {
     WRectangle geom;
-    int a;
-
-    static const char *attrs[]={
-        "active-selected-normal",
-        "active-selected-submenu",
-        "active-unselected-normal",
-        "active-unselected-submenu",
-        "inactive-selected-normal",
-        "inactive-selected-submenu",
-        "inactive-unselected-normal",
-        "inactive-unselected-submenu",
-    };
+    GrAttr sa, aa;
+
+    aa=(REGION_IS_ACTIVE(menu) ? GR_ATTR(active) : GR_ATTR(inactive));
+    sa=(menu->selected_entry==i ? GR_ATTR(selected) : GR_ATTR(unselected));
     
     if(menu->entry_brush==NULL)
         return;
@@ -109,14 +124,15 @@ static void menu_draw_entry(WMenu *menu, int i, const WRectangle *igeom,
     geom.h=menu->entry_h;
     geom.y+=(i-menu->first_entry)*(menu->entry_h+menu->entry_spacing);
     
-    a=((REGION_IS_ACTIVE(menu) ? 0 : 4)
-       |(menu->selected_entry==i ? 0 : 2)
-       |(menu->entries[i].flags&WMENUENTRY_SUBMENU ? 1 : 0));
-
-    grbrush_begin(menu->entry_brush, &geom, GRBRUSH_AMEND);
+    grbrush_begin(menu->entry_brush, &geom, GRBRUSH_AMEND|GRBRUSH_KEEP_ATTR);
+    
+    grbrush_init_attr(menu->entry_brush, &menu->entries[i].attr);
+    
+    grbrush_set_attr(menu->entry_brush, aa);
+    grbrush_set_attr(menu->entry_brush, sa);
 
     grbrush_draw_textbox(menu->entry_brush, &geom, menu->entries[i].title, 
-                         attrs[a], complete);
+                         complete);
     
     grbrush_end(menu->entry_brush);
 }
@@ -126,10 +142,10 @@ void menu_draw_entries(WMenu *menu, bool complete)
 {
     WRectangle igeom;
     int i, mx;
-
+    
     if(menu->entry_brush==NULL)
         return;
-    
+        
     get_inner_geom(menu, &igeom);
     
     mx=menu->first_entry+menu->vis_entries;
@@ -142,8 +158,8 @@ void menu_draw_entries(WMenu *menu, bool complete)
 
 void menu_draw(WMenu *menu, bool complete)
 {
+    GrAttr aa=(REGION_IS_ACTIVE(menu) ? GR_ATTR(active) : GR_ATTR(inactive));
     WRectangle geom;
-    const char *substyle=(REGION_IS_ACTIVE(menu) ? "active" : "inactive");
     
     if(menu->brush==NULL)
         return;
@@ -153,7 +169,9 @@ void menu_draw(WMenu *menu, bool complete)
     grbrush_begin(menu->brush, &geom, 
                   (complete ? 0 : GRBRUSH_NO_CLEAR_OK));
     
-    grbrush_draw_border(menu->brush, &geom, substyle);
+    grbrush_set_attr(menu->brush, aa);
+    
+    grbrush_draw_border(menu->brush, &geom);
     
     menu_draw_entries(menu, FALSE);
     
@@ -491,9 +509,8 @@ static void menu_release_gr(WMenu *menu)
 
 static WMenuEntry *preprocess_menu(ExtlTab tab, int *n_entries)
 {
-    ExtlTab entry, sub;
-    ExtlFn fn;
     WMenuEntry *entries;
+    ExtlTab entry;
     int i, n;
     
     n=extl_table_get_n(tab);
@@ -506,17 +523,40 @@ static WMenuEntry *preprocess_menu(ExtlTab tab, int *n_entries)
     
     if(entries==NULL)
         return NULL;
-
+        
+    init_attr();
+    
     /* Initialise entries and check submenus */
     for(i=1; i<=n; i++){
-        entries[i-1].title=NULL;
-        entries[i-1].flags=0;
-        if(extl_table_getis(tab, i, "submenu_fn", 'f', &fn)){
-            entries[i-1].flags|=WMENUENTRY_SUBMENU;
-            extl_unref_fn(fn);
-        }else if(extl_table_getis(tab, i, "submenu", 't', &sub)){
-            entries[i-1].flags|=WMENUENTRY_SUBMENU;
-            extl_unref_table(sub);
+        WMenuEntry *ent=&entries[i-1];
+        
+        ent->title=NULL;
+        ent->flags=0;
+        
+        gr_stylespec_init(&ent->attr);
+        
+        if(extl_table_geti_t(tab, i, &entry)){
+            char *attr;
+            ExtlTab sub;
+            ExtlFn fn;
+            
+            if(extl_table_gets_s(entry, "attr", &attr)){
+                gr_stylespec_load_(&ent->attr, attr, TRUE);
+                free(attr);
+            }
+            
+            if(extl_table_gets_f(entry, "submenu_fn", &fn)){
+                ent->flags|=WMENUENTRY_SUBMENU;
+                extl_unref_fn(fn);
+            }else if(extl_table_gets_t(entry, "submenu", &sub)){
+                ent->flags|=WMENUENTRY_SUBMENU;
+                extl_unref_table(sub);
+            }
+            
+            if(ent->flags&WMENUENTRY_SUBMENU)
+                gr_stylespec_set(&ent->attr, GR_ATTR(submenu));
+            
+            extl_unref_table(entry);
         }
     }
     
@@ -524,6 +564,8 @@ static WMenuEntry *preprocess_menu(ExtlTab tab, int *n_entries)
 }
 
 
+static void deinit_entries(WMenu *menu);
+
 
 bool menu_init(WMenu *menu, WWindow *par, const WFitParams *fp,
                const WMenuCreateParams *params)
@@ -545,9 +587,9 @@ bool menu_init(WMenu *menu, WWindow *par, const WFitParams *fp,
 
     menu->last_fp=*fp;
     
-    if(params->pmenu_mode)
+    if(params->pmenu_mode){
         menu->selected_entry=-1;
-    else{
+    }else{
         menu->selected_entry=params->initial-1;
         if(menu->selected_entry<0)
            menu->selected_entry=0;
@@ -575,7 +617,9 @@ bool menu_init(WMenu *menu, WWindow *par, const WFitParams *fp,
     
     if(!menu_init_gr(menu, region_rootwin_of((WRegion*)par), win))
         goto fail2;
-
+        
+    init_attr();
+    
     menu_firstfit(menu, params->submenu_mode, &(params->refg));
     
     window_select_input(&(menu->win), IONCORE_EVENTMASK_NORMAL);
@@ -591,7 +635,7 @@ fail2:
 fail:
     extl_unref_table(menu->tab);
     extl_unref_fn(menu->handler);
-    free(menu->entries);
+    deinit_entries(menu);
     return FALSE;
 }
 
@@ -603,11 +647,22 @@ WMenu *create_menu(WWindow *par, const WFitParams *fp,
 }
 
 
-
-void menu_deinit(WMenu *menu)
+static void deinit_entries(WMenu *menu)
 {
     int i;
     
+    for(i=0; i<menu->n_entries; i++){
+        gr_stylespec_unalloc(&menu->entries[i].attr);
+        if(menu->entries[i].title!=NULL)
+            free(menu->entries[i].title);
+    }
+    
+    free(menu->entries);
+}
+
+
+void menu_deinit(WMenu *menu)
+{
     menu_typeahead_clear(menu);
     
     if(menu->submenu!=NULL)
@@ -616,11 +671,10 @@ void menu_deinit(WMenu *menu)
     extl_unref_table(menu->tab);
     extl_unref_fn(menu->handler);
     
-    for(i=0; i<menu->n_entries; i++)
-        free(menu->entries[i].title);
-    free(menu->entries);
+    deinit_entries(menu);
     
     menu_release_gr(menu);
+    
     window_deinit((WWindow*)menu);
 }
 
@@ -931,7 +985,7 @@ EXTL_EXPORT_MEMBER
 void menu_cancel(WMenu *menu)
 {
     if(region_manager_allows_destroying((WRegion*)menu))
-        mainloop_defer_destroy((Obj*)menu);
+        region_dispose_((WRegion*)menu);
 }
 
 
index a79d36a08f0446b7eecf56a986cc97c763e596aa..38dd1f85dad780c8d2a46bcaa129d28ebe066d95 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_menu/menu.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -25,6 +25,7 @@ INTRSTRUCT(WMenuEntry);
 DECLSTRUCT(WMenuEntry){
     char *title;
     int flags;
+    GrStyleSpec attr;
 };
 
 DECLCLASS(WMenu){
index 5f4fecf72e45c708313f41d1d7a76ef409977a66..0c27f73168f9ba87244cecf40cefdbd8800f20b1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_menu/mkmenu.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 2efed2f092aa526ec54e71018df34ccf2a0aa83f..610047f925c510acccf4bf437a1f6c3571a0f2b4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_menu/mkmenu.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6375e9f76423ada9fe59e9c9f70053810b516d8f..913ad1618673adc04d6671e86d3581249afed9da 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/mod_menu/mod_menu.lua -- Menu opening helper routines.
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
@@ -29,11 +29,11 @@ assert(mod_menu and menudb)
 local function menu_(reg, sub, menu_or_name, fn, check)
     if check then
         -- Check that no other menus are open in reg.
-        local l=reg:managed_list()
-        for i, r in pairs(l) do
-            if obj_is(r, "WMenu") then
-                return
-            end
+        local ok=reg:managed_i(function(r) 
+                                   return not obj_is(r, "WMenu") 
+                               end)
+        if not ok then
+            return
         end
     end
 
index fc5ecc6ec841e97d5b018c738e96318f8aadc79b..ef62c52bff2497ab5d777c4bcce58b4dd1644983 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_mgmtmode/main.c
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * 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
index 30f61f3af5dc766c4e363fa797bd74dbd5600ca6..5c9fde42f01ad978c573ab26d8c195ca049016a3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_mgmtmode/main.h
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * 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
index 92a3d274f09952a0648b5c0aef9b96189da0a2b0..4b86aa4f38c519418ab41b146370a7b03bbb1ddb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_mgmtmode/mgmtmode.c
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * 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
index 1e5ee6412cb30049d212dc39e8b28aa9cdec3fbe..daf7eaeb951f38a9aba1bbf6522e72f00b646016 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_mgmtmode/mgmtmode.h
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * 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
diff --git a/mod_panews/Makefile b/mod_panews/Makefile
deleted file mode 100644 (file)
index c1b79fb..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-##
-## mod_panews workspace module Makefile
-##
-
-# System-specific configuration is in system.mk
-TOPDIR=..
-include $(TOPDIR)/build/system-inc.mk
-
-######################################
-
-INCLUDES += $(X11_INCLUDES) $(LIBTU_INCLUDES) $(LIBEXTL_INCLUDES) -I..
-CFLAGS += $(XOPEN_SOURCE) $(C99_SOURCE)
-
-SOURCES=main.c panews.c placement.c splitext.c unusedwin.c
-
-MAKE_EXPORTS=mod_panews
-
-MODULE=mod_panews
-MODULE_STUB=mod_panews.lua
-
-######################################
-
-include $(TOPDIR)/build/rules.mk
-
-######################################
-
-_install: module_install
diff --git a/mod_panews/main.c b/mod_panews/main.c
deleted file mode 100644 (file)
index b3f4f10..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * ion/panews/main.c
- *
- * Copyright (c) Tuomo Valkonen 1999-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 <libtu/map.h>
-
-#include <ioncore/common.h>
-#include <ioncore/reginfo.h>
-#include <libextl/readconfig.h>
-#include <ioncore/framep.h>
-#include <ioncore/bindmaps.h>
-#include <ioncore/bindmaps.h>
-
-#include "main.h"
-#include "panews.h"
-#include "placement.h"
-#include "exports.h"
-
-
-/*{{{ Module information */
-
-
-#include "../version.h"
-
-char mod_panews_ion_api_version[]=ION_API_VERSION;
-
-
-/*}}}*/
-
-
-/*{{{ Bindmaps */
-
-
-WBindmap *mod_panews_panews_bindmap=NULL;
-WBindmap *mod_panews_frame_bindmap=NULL;
-WBindmap *mod_panews_unusedwin_bindmap=NULL;
-
-
-/*}}}*/
-
-
-/*{{{ Module init & deinit */
-
-
-void mod_panews_deinit()
-{
-    mod_panews_unregister_exports();
-    ioncore_unregister_regclass(&CLASSDESCR(WPaneWS));
-    
-    if(mod_panews_panews_bindmap!=NULL){
-        ioncore_free_bindmap("WPaneWS", mod_panews_panews_bindmap);
-        mod_panews_panews_bindmap=NULL;
-    }
-
-    if(mod_panews_unusedwin_bindmap!=NULL){
-        ioncore_free_bindmap("WUnusedWin", mod_panews_unusedwin_bindmap);
-        mod_panews_unusedwin_bindmap=NULL;
-    }
-    
-    if(mod_panews_frame_bindmap!=NULL){
-        ioncore_free_bindmap("WFrame-on-WPaneWS", mod_panews_frame_bindmap);
-        mod_panews_frame_bindmap=NULL;
-    }
-    
-    if(panews_init_layout_alt!=NULL){
-        destroy_obj((Obj*)panews_init_layout_alt);
-        panews_init_layout_alt=NULL;
-    }
-
-    if(panews_make_placement_alt!=NULL){
-        destroy_obj((Obj*)panews_make_placement_alt);
-        panews_make_placement_alt=NULL;
-    }
-}
-
-
-static bool register_regions()
-{
-    if(!ioncore_register_regclass(&CLASSDESCR(WPaneWS),
-                                  (WRegionLoadCreateFn*)panews_load)){
-        return FALSE;
-    }
-    
-    return TRUE;
-}
-
-
-#define INIT_HOOK_(NM)                             \
-    NM=mainloop_register_hook(#NM, create_hook()); \
-    if(NM==NULL) return FALSE;
-
-
-static bool init_hooks()
-{
-    INIT_HOOK_(panews_init_layout_alt);
-    INIT_HOOK_(panews_make_placement_alt);
-    return TRUE;
-}
-
-
-
-bool mod_panews_init()
-{
-    if(!init_hooks())
-        goto err;
-
-    mod_panews_panews_bindmap=ioncore_alloc_bindmap("WPaneWS", NULL);
-    mod_panews_unusedwin_bindmap=ioncore_alloc_bindmap_frame("WUnusedWin");
-    mod_panews_frame_bindmap=ioncore_alloc_bindmap_frame("WFrame-on-WPaneWS");
-
-    if(mod_panews_panews_bindmap==NULL ||
-       mod_panews_unusedwin_bindmap==NULL ||
-       mod_panews_frame_bindmap==NULL){
-        goto err;
-    }
-
-    if(!mod_panews_register_exports())
-        goto err;
-    
-    if(!register_regions())
-        goto err;
-    
-    /*ioncore_read_config("cfg_panews", NULL, FALSE);*/
-
-    return TRUE;
-    
-err:
-    mod_panews_deinit();
-    return FALSE;
-}
-
-
-/*}}}*/
-
diff --git a/mod_panews/main.h b/mod_panews/main.h
deleted file mode 100644 (file)
index 5dc226c..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * ion/panews/main.h
- *
- * Copyright (c) Tuomo Valkonen 1999-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.
- */
-
-#ifndef ION_PANEWS_MAIN_H
-#define ION_PANEWS_MAIN_H
-
-#include <ioncore/binding.h>
-#include <ioncore/regbind.h>
-
-extern bool mod_panews_init();
-extern void mod_panews_deinit();
-
-extern WBindmap *mod_panews_panews_bindmap;
-extern WBindmap *mod_panews_unusedwin_bindmap;
-extern WBindmap *mod_panews_frame_bindmap;
-
-#endif /* ION_PANEWS_MAIN_H */
diff --git a/mod_panews/mod_panews.lua b/mod_panews/mod_panews.lua
deleted file mode 100644 (file)
index 65bf32e..0000000
+++ /dev/null
@@ -1,562 +0,0 @@
---
--- ion/mod_panews/mod_panews.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.
---
-
-
--- This is a slight abuse of the package.loaded variable perhaps, but
--- library-like packages should handle checking if they're loaded instead of
--- confusing the user with require/include differences.
-if package.loaded["templates"] then return end
-
-if not ioncore.load_module("mod_panews") then
-    return
-end
-
-assert(not _G["mod_panews"]);
-local mod_panews={}
-_G["mod_panews"]=mod_panews
-
-local private={}
-local settings={}
-
--- Settings {{{
-
--- Classes:
---  (T)erminal
---  (V)iewer
---  (M)isc
-settings.valid_classifications={["V"]=true, ["T"]=true, ["M"]=true,}
-
--- Xterm, rxvt, aterm, etc. all have "XTerm" as class part of WM_CLASS
-settings.terminal_emulators={["XTerm"]=true,} 
-
--- Pixel scale factor from 1280x1024/75dpi
-settings.scalef=1.0
-
---settings.b_ratio=(1+math.sqrt(5))/2
---settings.s_ratio=1
-settings.b_ratio=3
-settings.s_ratio=2
-
-settings.b_ratio2=7
-settings.s_ratio2=1
-
-settings.templates={}
-
-settings.templates["default"]={
-    type="WSplitFloat",
-    dir="horizontal",
-    tls=settings.b_ratio,
-    brs=settings.s_ratio,
-    tls_brs_incl_handles=true,
-    tl={
-        type="WSplitPane",
-        contents={
-            type="WSplitFloat",
-            dir="vertical",
-            tls=settings.b_ratio2,
-            brs=settings.s_ratio2,
-            tls_brs_incl_handles=true,
-            tl={
-                type="WSplitPane",
-                marker="V:single",
-            },
-            br={
-                type="WSplitPane",
-                marker="M:right",
-            },
-        },
-    },
-    br={
-        type="WSplitPane",
-        marker="T:up",
-    },
-}
-
-
-settings.templates["alternative1"]={
-    type="WSplitFloat",
-    dir="horizontal",
-    tls=settings.s_ratio2,
-    brs=settings.b_ratio2,
-    tls_brs_incl_handles=true,
-    tl={
-        type="WSplitPane",
-        marker="M:down",
-    },
-    br={
-        type="WSplitFloat",
-        dir="vertical",
-        tls=settings.b_ratio,
-        brs=settings.s_ratio,
-        tls_brs_incl_handles=true,
-        tl={
-            type="WSplitPane",
-            marker="V:single",
-        },
-        br={
-            type="WSplitPane",
-            marker="T:right",
-        },
-    },
-}
-
-
-settings.templates["alternative2"]={
-    type="WSplitFloat",
-    dir="vertical",
-    tls=settings.b_ratio,
-    brs=settings.s_ratio,
-    tls_brs_incl_handles=true,
-    tl={
-        type="WSplitFloat",
-        dir="horizontal",
-        tls=settings.s_ratio2,
-        brs=settings.b_ratio2,
-        tls_brs_incl_handles=true,
-        tl={
-            type="WSplitPane",
-            marker="M:down",
-        },
-        br={
-            type="WSplitPane",
-            marker="V:single",
-        },
-    },
-    br={
-        type="WSplitPane",
-        marker="T:right",
-    },
-}
-
-
-settings.template=settings.templates["default"]
-
-settings.shrink_minimum=32
-
---DOC
--- Set some module parameters. Currently \var{s} may contain the following
--- fields:
--- \begin{tabularx}{\linewidth}{lX}
---  \tabhead{Field & Description}
---  \var{template} & layout template for newly created \type{WPaneWS} 
---                   workspaces. This can be either a table or one of the 
---                   predefined layouts 'default', 'alternative1', and
---                   'alternative2'. \\
---  \var{scalef}   & Scale factor for classification heuristics to work 
---                   with different screen resolutions. The default is 1.0 
---                   and is designed for 1280x1024 at 75dpi. \\
---  \var{valid_classifications} & A table with valid window classifications
---                                as valid keys. \\
--- \end{tabularx}
-function mod_panews.set(s)
-    if s.template then
-        local ok=false
-        if type(s.template)=="string" then
-            if settings.templates[s.template] then
-                settings.template=settings.templates[s.template]
-                ok=true
-            end
-        elseif type(s.template)=="table" then
-            settings.template=s.template
-            ok=true
-        end
-        if not ok then
-            ioncore.warn_traced("Invalid template.")
-        end
-    end
-    if s.scalef then
-        if type(s.scalef)~="number" or s.scalef<=0 then
-            ioncore.warn_traced('Invalid scale factor')
-        else
-            settings.scalef=s.scalef
-        end
-    end
-    
-    if type(s.valid_classifications)=="table" then
-        settings.valid_classifications=s.valid_classifications
-    end
-end
-
-
---DOC
--- Get some module settings. See \fnref{mod_panews.set} for documentation
--- on the contents of the returned table.
-function mod_panews.get()
-    return table.copy(settings, true)
-end
-
-                        
--- }}}
-
-
--- Helper code {{{
-
-local function sfind(s, p)
-    local function drop2(a, b, ...)
-        return unpack(arg)
-    end
-    return drop2(string.find(s, p))
-end
-
-
-function private.div_length(w, r1, r2)
-    local a=math.ceil(w*r1/(r1+r2))
-    return a, w-a
-end
-
-function private.split3(d, ls, cs, rs, lo, co, ro)
-    return {
-        tls = ls+cs,
-        brs = rs,
-        dir = d,
-        tl = {
-            tls = ls,
-            brs = cs,
-            dir = d,
-            tl = (lo or {}),
-            br = (co or {}),
-        },
-        br = (ro or {}),
-    }
-end
-
-function private.center3(d, ts, cs, lo, co, ro)
-    local sc=math.min(ts, cs)
-    local sl=math.floor((ts-sc)/2)
-    local sr=ts-sc-sl
-    local r=private.split3(d, sl, sc, sr, lo, co, ro)
-    return r
-end
-
-function private.split2(d, ts, ls, rs, lo, ro)
-    if ls and rs then
-        assert(ls+rs==ts)
-    elseif not ls then
-        ls=ts-rs
-    else
-        rs=ts-ls
-    end
-    assert(rs>=0 and ls>=0)
-    return {
-        type="WSplitSplit",
-        dir=d,
-        tls=math.floor(ls),
-        brs=math.ceil(rs),
-        tl=lo,
-        br=ro,
-    }
-end
-
--- }}}
-
-
--- Classification {{{
-
-function private.classify(ws, reg)
-    if obj_is(reg, "WClientWin") then
-        -- Check if there's a winprop override
-        local wp=ioncore.getwinprop(reg)
-        if wp and wp.panews_classification then
-            if settings.valid_classifications[wp.panews_classification] then
-                return wp.panews_classification
-            end
-        end
-        
-        -- Handle known terminal emulators.
-        local id=reg:get_ident()
-        if settings.terminal_emulators[id.class] then
-            return "T"
-        end
-    end
-    
-    -- Try size heuristics.
-    local cg=reg:geom()
-
-    if cg.w<3/8*(1280*settings.scalef) then
-        return "M"
-    end
-    
-    if cg.h>4/8*(960*settings.scalef) then
-        return "V"
-    else
-        return "T"
-    end
-end
-
--- }}}
-
-
--- Placement code {{{
-
-local max_penalty=5
-local just_some_pixel_count=16
-
-function private.fitlevel_(min1, s1, us1, min2, s2, us2)
-    local p1, p2=4, 0.5
-    
-    if us2>=min2 then
-        p2=0
-    end
-    
-    if us1>=math.max(s1/2, min1) then
-        p1=0
-    elseif us1>=min1+just_some_pixel_count then
-        p1=1
-    elseif us1>=min1 then
-        p1=2
-    elseif us1>0 then
-        p1=3
-    end
-    
-    return p1+p2
-end
-
-function private.fitlevel(frame, node, horiz)
-    local fg=frame:geom()
-    local fsh=frame:size_hints()
-    local sg=node:geom()
-    if not horiz then
-        return private.fitlevel_(fsh.min_h, fg.h, sg.h, fsh.min_w, fg.w, sg.w)
-    else
-        return private.fitlevel_(fsh.min_w, fg.w, sg.w, fsh.min_h, fg.h, sg.h)
-    end
-end
-
-
-function private.use_unused(p, n, d, forcelevel)
-    local f=private.fitlevel(p.frame, n, (d=="left" or d=="right"))
-    if f>forcelevel then
-        return false, f
-    end
-
-    if d=="single" then
-        p.res_node=n
-        p.res_config={reg=p.frame}
-        return true, f
-    end
-
-    -- TODO: Check fit
-    local sg=n:geom()
-    local fg=p.frame:geom()
-    
-    if d=="up" or d=="down" then
-        p.res_node=n
-        local fh=math.min(fg.h, sg.h)
-        if d=="up" then
-            p.res_config=private.split2("vertical", sg.h, nil, fh,
-                                  {}, {reg=p.frame})
-        else
-            p.res_config=private.split2("vertical", sg.h, fh, nil,
-                                  {reg=p.frame}, {})
-        end
-        return true, f
-    elseif d=="left" or d=="right" then
-        p.res_node=n
-        local fw=math.min(fg.w, sg.w)
-        if d=="left" then
-            p.res_config=private.split2("horizontal", sg.w, nil, fw,
-                                  {}, {reg=p.frame})
-        else
-            p.res_config=private.split2("horizontal", sg.w, fw, nil,
-                                  {reg=p.frame}, {})
-        end
-        return true, f
-    end
-    
-    return false, f
-end
-
-
-function private.scan_pane(p, node, d)
-    local function do_scan_active(n, uf)
-        local t=obj_typename(n)
-        if t=="WSplitRegion" then
-            local f=private.fitlevel(p.frame, n, (d=="left" or d=="right"))
-            if f<uf then
-                p.res_node=n
-                return true
-            end
-        elseif t=="WSplitSplit" or t=="WSplitFloat" then
-            local a, b=n:tl(), n:br()
-            if b==n:current() then
-                a, b=b, a
-            end
-            return (do_scan_active(a, uf) or do_scan_active(b, uf))
-        end
-        return false
-    end
-
-    local function do_scan_unused(n, forcelevel)
-        local t=obj_typename(n)
-        if t=="WSplitSplit" or t=="WSplitFloat" then
-            local sd=n:dir()
-            local a, b
-            if (d=="up" and sd=="vertical") or (d=="left" and sd=="horizontal") then
-                a, b=n:tl(), n:br()
-            elseif (d=="down" and sd=="vertical") or (d=="right" and sd=="horizontal") then
-                a, b=n:br(), n:tl()
-            else
-                a, b=n:current(), (n:current()==n:tl() and n:br() or n:tl())
-            end
-
-            local ok, f, f2
-            ok, f=do_scan_unused(a, forcelevel)
-            if not ok then
-                ok, f2=do_scan_unused(b, forcelevel)
-            end
-            return ok, math.min(f, f2 or max_penalty)
-        elseif t=="WSplitUnused" then
-            -- Found it
-            return private.use_unused(p, n, d, forcelevel)
-        end
-        return false, max_penalty
-    end
-    
-    local ok, fitlevel=do_scan_unused(node, 0)
-    if not ok then
-        ok=do_scan_active(node, fitlevel)
-        if not ok then
-            ok=do_scan_unused(node, 3)
-        end
-    end
-    return ok
-end
-    
-
-function private.make_placement(p)
-    if p.specifier then
-        local n=p.specifier
-        local pcls, pdir
-        
-        while n and not obj_is(n, "WSplitPane") do
-            n=n:parent()
-        end
-        
-        if n then
-            pcls, pdir=sfind((n:marker() or ""), "(.*):(.*)")
-        end
-            
-        return private.use_unused(p, p.specifier, (pdir or "single"), 2)
-    end
-    
-    local cls=private.classify(p.ws, p.reg)
-    
-    local function do_scan_cls(n)
-        local t=obj_typename(n)
-        if t=="WSplitPane" then
-            local m=n:marker()
-            if m then
-                local pcls, pdir=sfind(m, "(.*):(.*)")
-                if pcls and pcls==cls then
-                    return private.scan_pane(p, n:contents(), pdir)
-                end
-            else
-                return do_scan_cls(n:contents())
-            end
-        elseif t=="WSplitSplit" or t=="WSplitFloat" then
-            return (do_scan_cls(n:tl()) or do_scan_cls(n:br()))
-        end
-    end
-    
-    local function do_scan_fallback(n)
-        local t=obj_typename(n)
-        if t=="WSplitUnused" then
-            p.res_node=n
-            p.res_config={reg=p.frame}
-            return true
-        elseif t=="WSplitRegion" then
-            p.res_node=n
-            return true
-        elseif t=="WSplitPane" then
-            return do_scan_fallback(n:contents())
-        elseif t=="WSplitSplit" or t=="WSplitFloat" then
-            return (do_scan_fallback(n:tl()) or do_scan_fallback(n:br()))
-        end
-    end
-    
-    local node=p.ws:split_tree()
-    return (do_scan_cls(node) or do_scan_fallback(node))
-end
-
--- }}}
-
-
--- Layout initialisation {{{
-
-
-function private.calc_sizes(tmpl, sw, sh)
-    tmpl._w, tmpl._h=sw, sh
-
-    if tmpl.type=="WSplitSplit" or tmpl.type=="WSplitFloat" then
-        local tmps, tlw, tlh, brw, brh
-        -- Calculate pixel sizes of things
-        if tmpl.dir=="vertical" then
-            tmps=sh
-        else
-            tmps=sw
-        end
-        
-        tmpl.tls, tmpl.brs=private.div_length(tmps, tmpl.tls, tmpl.brs)
-    
-        if tmpl.dir=="vertical" then
-            tlw, brw=sw, sw
-            tlh, brh=tmpl.tls, tmpl.brs
-        else
-            tlw, brw=tmpl.tls, tmpl.brs
-            tlh, brh=sh, sh
-        end
-    
-        private.calc_sizes(tmpl.tl, tlw, tlh)
-        private.calc_sizes(tmpl.br, brw, brh)
-    end
-end
-
-
-function private.init_layout(p)
-    p.layout=table.copy(settings.template, true) -- deep copy template
-    local wg=p.ws:geom()
-    private.calc_sizes(p.layout, wg.w, wg.h)
-    return true
-end
-
--- }}}
-
-
--- Initialisation {{{
-
-function private.setup_hooks()
-    local function hookto(hkname, fn)
-        local hk=ioncore.get_hook(hkname)
-        if not hk then
-            error("No hook "..hkname)
-        end
-        if not hk:add(fn) then
-            error("Unable to hook to "..hkname)
-        end
-    end
-
-    hookto("panews_init_layout_alt", private.init_layout)
-    hookto("panews_make_placement_alt", private.make_placement)
-end
-
-
-private.setup_hooks()
-
--- }}}
-
-
--- Mark ourselves loaded.
-package.loaded["templates"]=true
-
-
--- Load configuration file
-dopath('cfg_panews', false)
-
diff --git a/mod_panews/panews.c b/mod_panews/panews.c
deleted file mode 100644 (file)
index 70f83fe..0000000
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * ion/mod_panews/panews.c
- *
- * Copyright (c) Tuomo Valkonen 1999-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 <string.h>
-
-#include <libtu/objp.h>
-#include <libtu/minmax.h>
-#include <libextl/extl.h>
-#include <libmainloop/defer.h>
-
-#include <ioncore/common.h>
-#include <ioncore/global.h>
-#include <ioncore/region.h>
-#include <ioncore/focus.h>
-#include <ioncore/manage.h>
-#include <ioncore/saveload.h>
-#include <ioncore/attach.h>
-#include <ioncore/regbind.h>
-#include <ioncore/extlconv.h>
-#include <ioncore/frame.h>
-#include <mod_tiling/tiling.h>
-#include <mod_tiling/split.h>
-#include "panews.h"
-#include "placement.h"
-#include "main.h"
-#include "splitext.h"
-
-
-/*{{{ Create/destroy */
-
-
-bool panews_managed_add(WPaneWS *ws, WRegion *reg)
-{
-    if(OBJ_IS(reg, WFrame))
-        region_add_bindmap(reg, mod_panews_frame_bindmap);
-    
-    return tiling_managed_add_default(&(ws->tiling), reg);
-}
-
-
-static WRegion *create_frame_panews(WWindow *parent, const WFitParams *fp)
-{
-    return (WRegion*)create_frame(parent, fp, "frame-tiled-panews");
-}
-
-
-static bool mrsh_init_layout_extl(ExtlFn fn, WPaneWSInitParams *p)
-{
-    ExtlTab t=extl_create_table();
-    bool ret=FALSE;
-    
-    extl_table_sets_o(t, "ws", (Obj*)p->ws);
-
-    extl_protect(NULL);
-    ret=extl_call(fn, "t", "b", t, &ret);
-    extl_unprotect(NULL);
-    
-    if(ret)
-        ret=extl_table_gets_t(t, "layout", &(p->layout));
-        
-    extl_unref_table(t);
-    return ret;
-}
-
-
-static bool panews_init_layout(WPaneWS *ws)
-{
-    WPaneWSInitParams p;
-    
-    p.ws=ws;
-    p.layout=extl_table_none();
-       
-    hook_call_p(panews_init_layout_alt, &p,
-                (WHookMarshallExtl*)mrsh_init_layout_extl);
-
-    if(p.layout!=extl_table_none()){            
-        ws->tiling.split_tree=tiling_load_node(&(ws->tiling),
-                                             &REGION_GEOM(ws), 
-                                             p.layout);
-        extl_unref_table(p.layout);
-    }
-         
-    if(ws->tiling.split_tree==NULL)
-        ws->tiling.split_tree=(WSplit*)create_splitunused(&REGION_GEOM(ws), ws);
-        
-    if(ws->tiling.split_tree!=NULL)
-        ws->tiling.split_tree->ws_if_root=&(ws->tiling);
-    
-    return (ws->tiling.split_tree!=NULL);
-}
-
-
-bool panews_init(WPaneWS *ws, WWindow *parent, const WFitParams *fp, 
-                 bool ilo)
-{
-    if(!tiling_init(&(ws->tiling), parent, fp, 
-                   create_frame_panews, FALSE))
-        return FALSE;
-    
-    region_add_bindmap((WRegion*)ws, mod_panews_panews_bindmap);
-
-    assert(ws->tiling.split_tree==NULL);
-    
-    if(ilo){
-        if(!panews_init_layout(ws)){
-            panews_deinit(ws);
-            return FALSE;
-        }
-    }
-    
-    return TRUE;
-}
-
-
-WPaneWS *create_panews(WWindow *parent, const WFitParams *fp, bool cu)
-{
-    CREATEOBJ_IMPL(WPaneWS, panews, (p, parent, fp, cu));
-}
-
-
-WPaneWS *create_panews_simple(WWindow *parent, const WFitParams *fp)
-{
-    return create_panews(parent, fp, TRUE);
-}
-
-
-void panews_deinit(WPaneWS *ws)
-{
-    tiling_deinit(&(ws->tiling));
-}
-
-
-static WSplitRegion *get_node_check(WPaneWS *ws, WRegion *reg)
-{
-    WSplitRegion *node;
-
-    if(reg==NULL)
-        return NULL;
-    
-    node=splittree_node_of(reg);
-    
-    if(node==NULL || REGION_MANAGER(reg)!=(WRegion*)ws)
-        return NULL;
-    
-    return node;
-}
-
-
-static void panews_do_managed_remove(WPaneWS *ws, WRegion *reg)
-{
-    tiling_do_managed_remove(&(ws->tiling), reg);
-    if(OBJ_IS(reg, WFrame))
-        region_remove_bindmap(reg, mod_panews_frame_bindmap);
-}
-
-
-static bool plainregionfilter(WSplit *node)
-{
-    return (strcmp(OBJ_TYPESTR(node), "WSplitRegion")==0);
-}
-
-
-
-void panews_managed_remove(WPaneWS *ws, WRegion *reg)
-{
-    bool ds=OBJ_IS_BEING_DESTROYED(ws);
-    bool act=REGION_IS_ACTIVE(reg);
-    bool mcf=region_may_control_focus((WRegion*)ws);
-    WSplitRegion *node=get_node_check(ws, reg);
-    WRegion *other=NULL;
-
-    other=tiling_do_get_nextto(&(ws->tiling), reg, SPLIT_ANY, PRIMN_ANY, FALSE);
-    
-    panews_do_managed_remove(ws, reg);
-
-    if(node==(WSplitRegion*)(ws->tiling.stdispnode))
-        ws->tiling.stdispnode=NULL;
-    
-    if(node==NULL)
-        return;
-    
-    splittree_remove((WSplit*)node, !ds);
-    
-    if(!ds){
-        if(other==NULL){
-            if(ws->tiling.split_tree==NULL){
-                warn(TR("Unable to re-initialise workspace. Destroying."));
-                mainloop_defer_destroy((Obj*)ws);
-            }else if(act && mcf){
-                /* We don't want to give the stdisp focus, even if one exists. 
-                 * Or do we?
-                 */
-                tiling_fallback_focus(&ws->tiling, FALSE);
-            }
-        }else if(act && mcf){
-            region_warp(other);
-        }
-    }
-}
-
-
-/*}}}*/
-
-
-/*{{{ Misc. */
-
-
-bool panews_managed_prepare_focus(WPaneWS *ws, WRegion *reg,
-                                  int flags, WPrepareFocusResult *res)
-{
-    if(flags&REGION_GOTO_ENTERWINDOW){
-        WSplitRegion *other, *node=get_node_check(ws, reg);
-        if(node!=NULL && OBJ_IS(node, WSplitUnused)){
-            /* An unused region - do not focus unless there are no
-             * normal regions in its pane. 
-             */
-            other=split_tree_find_region_in_pane_of((WSplit*)node);
-            if(other!=NULL){
-                tiling_managed_prepare_focus(&(ws->tiling), other->reg, 
-                                            flags&~REGION_GOTO_ENTERWINDOW, 
-                                            res);
-                return FALSE;
-            }
-        }
-    }
-        
-    return tiling_managed_prepare_focus(&(ws->tiling), reg, flags, res);
-}
-
-
-static bool filter_no_stdisp_unused(WSplit *split)
-{
-    return (OBJ_IS(split, WSplitRegion)
-            && !OBJ_IS(split, WSplitST)
-            && !OBJ_IS(split, WSplitUnused));
-}
-
-
-bool panews_managed_may_destroy(WPaneWS *ws, WRegion *reg)
-{
-    if(region_manager_allows_destroying((WRegion*)ws))
-        return TRUE;
-    
-    if(tiling_do_get_nextto(&(ws->tiling), reg, 
-                           SPLIT_ANY, PRIMN_ANY, FALSE)==NULL){
-        return FALSE;
-    }
-    
-    return TRUE;
-}
-
-
-bool panews_may_destroy(WPaneWS *ws)
-{
-    if(split_current_todir(ws->tiling.split_tree, SPLIT_ANY, PRIMN_ANY, 
-                           filter_no_stdisp_unused)!=NULL){
-        warn(TR("Refusing to close non-empty workspace."));
-        return FALSE;
-    }
-    
-    return TRUE;
-}
-
-
-/*
-static WRegion *panews_rqclose_propagate(WPaneWS *ws, WRegion *sub)
-{
-    WSplitRegion *node=NULL;
-    WRegion *reg=NULL;
-    
-    if(sub==NULL){
-        if(ws->tiling.split_tree!=NULL){
-            node=(WSplitRegion*)split_current_todir(ws->tiling.split_tree, 
-                                                    SPLIT_ANY, PRIMN_ANY, 
-                                                    filter_no_stdisp_unused);
-        }
-        if(node==NULL){
-            mainloop_defer_destroy((Obj*)ws);
-            return (WRegion*)ws;
-        }
-        if(node->reg==NULL)
-            return NULL;
-        sub=node->reg;
-    }else{
-        node=get_node_check(ws, sub);
-        if(node==NULL)
-            return NULL;
-    }
-    
-    
-    return (region_rqclose(sub) ? sub : NULL);
-}
-*/
-
-
-/*}}}*/
-
-
-/*{{{ Save */
-
-
-ExtlTab panews_get_configuration(WPaneWS *ws)
-{
-    return tiling_get_configuration(&(ws->tiling));
-}
-
-
-/*}}}*/
-
-
-/*{{{ Load */
-
-
-static WSplit *load_splitunused(WPaneWS *ws, const WRectangle *geom, 
-                                ExtlTab tab)
-{
-    return (WSplit*)create_splitunused(geom, (WPaneWS*)ws);
-}
-
-
-static WSplit *load_splitpane(WPaneWS *ws, const WRectangle *geom, ExtlTab tab)
-{
-    ExtlTab t;
-    WSplitPane *pane;
-    WSplit *cnt;
-
-    pane=create_splitpane(geom, NULL);
-    if(pane==NULL)
-        return NULL;
-    
-    if(extl_table_gets_t(tab, "contents", &t)){
-        cnt=tiling_load_node(&(ws->tiling), geom, t);
-        extl_unref_table(t);
-    }else{
-        cnt=load_splitunused(ws, geom, extl_table_none());
-    }
-    
-    if(cnt==NULL){
-        destroy_obj((Obj*)pane);
-        return NULL;
-    }
-    
-    pane->contents=cnt;
-    cnt->parent=&(pane->isplit);
-    
-    assert(pane->marker==NULL);
-    extl_table_gets_s(tab, "marker", &(pane->marker));
-
-    return (WSplit*)pane;
-}
-
-
-static WSplit *panews_load_node(WPaneWS *ws, const WRectangle *geom, 
-                                ExtlTab tab)
-{
-    char *s=NULL;
-    
-    if(!extl_table_gets_s(tab, "type", &s)){
-        WRegion *reg=NULL;
-        /* Shortcuts for templates.lua */
-        if(extl_table_gets_o(tab, "reg", (Obj**)&reg)){
-            if(OBJ_IS(reg, WRegion))
-                return load_splitregion_doit(&(ws->tiling), geom, tab);
-        }else{
-            return load_splitunused(ws, geom, tab);
-        }
-    }else{
-        if(strcmp(s, "WSplitPane")==0)
-            return load_splitpane(ws, geom, tab);
-        else if(strcmp(s, "WSplitUnused")==0)
-            return load_splitunused(ws, geom, tab);
-    }
-
-    return tiling_load_node_default(&(ws->tiling), geom, tab);
-}
-
-
-WRegion *panews_load(WWindow *par, const WFitParams *fp, ExtlTab tab)
-{
-    WPaneWS *ws;
-    ExtlTab treetab;
-
-    ws=create_panews(par, fp, FALSE);
-    
-    if(ws==NULL)
-        return NULL;
-    if(extl_table_gets_t(tab, "split_tree", &treetab)){
-        ws->tiling.split_tree=tiling_load_node(&(ws->tiling), &REGION_GEOM(ws), 
-                                             treetab);
-        extl_unref_table(treetab);
-    }
-    
-    if(ws->tiling.split_tree==NULL){
-        if(!panews_init_layout(ws)){
-            destroy_obj((Obj*)ws);
-            return NULL;
-        }
-    }
-    
-    ws->tiling.split_tree->ws_if_root=ws;
-    split_restack(ws->tiling.split_tree, ws->tiling.dummywin, Above);
-    
-    return (WRegion*)ws;
-}
-
-
-/*}}}*/
-
-
-/*{{{ Dynamic function table and class implementation */
-
-
-static DynFunTab panews_dynfuntab[]={
-    {region_managed_remove, 
-     panews_managed_remove},
-
-    {(DynFun*)region_prepare_manage, 
-     (DynFun*)panews_prepare_manage},
-    
-    {(DynFun*)region_get_configuration,
-     (DynFun*)panews_get_configuration},
-
-    {(DynFun*)region_may_destroy,
-     (DynFun*)panews_may_destroy},
-
-    {(DynFun*)region_managed_may_destroy,
-     (DynFun*)panews_managed_may_destroy},
-
-    {(DynFun*)tiling_managed_add,
-     (DynFun*)panews_managed_add},
-    
-    {(DynFun*)tiling_load_node,
-     (DynFun*)panews_load_node},
-
-    {(DynFun*)tiling_do_get_nextto,
-     (DynFun*)panews_do_get_nextto},
-
-    {(DynFun*)tiling_do_get_farthest,
-     (DynFun*)panews_do_get_farthest},
-
-    {(DynFun*)region_managed_prepare_focus,
-     (DynFun*)panews_managed_prepare_focus},
-
-    /*
-    {(DynFun*)region_rqclose_propagate,
-     (DynFun*)panews_rqclose_propagate},*/
-    
-    END_DYNFUNTAB
-};
-
-
-EXTL_EXPORT
-IMPLCLASS(WPaneWS, WTiling, panews_deinit, panews_dynfuntab);
-
-    
-/*}}}*/
-
diff --git a/mod_panews/panews.h b/mod_panews/panews.h
deleted file mode 100644 (file)
index 1402523..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * ion/panews/panews.h
- *
- * Copyright (c) Tuomo Valkonen 1999-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.
- */
-
-#ifndef ION_PANEWS_PANEWS_H
-#define ION_PANEWS_PANEWS_H
-
-#include <ioncore/common.h>
-#include <ioncore/region.h>
-#include <ioncore/screen.h>
-#include <libextl/extl.h>
-#include <ioncore/rectangle.h>
-
-#include <mod_tiling/tiling.h>
-
-
-INTRCLASS(WPaneWS);
-DECLCLASS(WPaneWS){
-    WTiling tiling;
-};
-
-
-extern void panews_deinit(WPaneWS *ws);
-extern bool panews_init(WPaneWS *ws, WWindow *parent, const WFitParams *fp,
-                        bool cu);
-extern WPaneWS *create_panews(WWindow *parent, const WFitParams *fp, bool cu);
-extern WPaneWS *create_panews_simple(WWindow *parent, const WFitParams *fp);
-extern WRegion *panews_load(WWindow *par, const WFitParams *fp, ExtlTab tab);
-
-/* Dynfun implementations */
-
-extern bool panews_managed_may_destroy(WPaneWS *ws, WRegion *reg);
-extern void panews_managed_remove(WPaneWS *ws, WRegion *reg);
-extern bool panews_managed_add(WPaneWS *ws, WRegion *reg);
-extern WRegion *panews_managed_control_focus(WPaneWS *ws, WRegion *reg);
-
-extern ExtlTab panews_get_configuration(WPaneWS *ws);
-extern WRegion *panews_load(WWindow *par, const WFitParams *fp, ExtlTab tab);
-
-#endif /* ION_PANEWS_PANEWS_H */
diff --git a/mod_panews/placement.c b/mod_panews/placement.c
deleted file mode 100644 (file)
index 73e2690..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * ion/mod_panews/placement.h
- *
- * Copyright (c) Tuomo Valkonen 1999-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 <limits.h>
-#include <math.h>
-#include <string.h>
-
-#include <libtu/minmax.h>
-#include <libtu/objp.h>
-#include <libextl/extl.h>
-#include <libmainloop/defer.h>
-
-#include <ioncore/common.h>
-#include <ioncore/global.h>
-#include <ioncore/clientwin.h>
-#include <ioncore/attach.h>
-#include <ioncore/manage.h>
-#include <ioncore/framep.h>
-#include <ioncore/names.h>
-#include <ioncore/resize.h>
-#include <mod_tiling/split.h>
-#include <mod_tiling/split-stdisp.h>
-#include "placement.h"
-#include "panews.h"
-#include "splitext.h"
-#include "unusedwin.h"
-
-
-WHook *panews_init_layout_alt=NULL;
-WHook *panews_make_placement_alt=NULL;
-
-
-/*{{{ create_frame_for */
-
-
-static WFrame *create_frame_for(WPaneWS *ws, WRegion *reg)
-{
-    WWindow *par=REGION_PARENT(ws);
-    WFitParams fp;
-    WRectangle mg;
-    WFrame *frame;
-    
-    if(par==NULL)
-        return NULL;
-    
-    fp.g=REGION_GEOM(ws);
-    fp.mode=REGION_FIT_BOUNDS;
-    
-    frame=(WFrame*)ws->tiling.create_frame_fn(par, &fp);
-    
-    if(frame==NULL)
-        return NULL;
-
-    frame->flags|=FRAME_DEST_EMPTY;
-    
-    mplex_managed_geom((WMPlex*)frame, &mg);
-    
-    fp.g.w=REGION_GEOM(reg).w+(REGION_GEOM(frame).w-mg.w);
-    fp.g.h=REGION_GEOM(reg).h+(REGION_GEOM(frame).h-mg.h);
-    fp.mode=REGION_FIT_EXACT;
-    
-    region_fitrep((WRegion*)frame, NULL, &fp);
-    
-    return (WFrame*)frame;
-}
-
-
-/*}}}*/
-
-
-/*{{{ Placement scan */
-
-
-static bool mrsh_layout_extl(ExtlFn fn, WPaneWSPlacementParams *p)
-{
-    ExtlTab t=extl_create_table();
-    bool ret=FALSE;
-    
-    extl_table_sets_o(t, "ws", (Obj*)p->ws);
-    extl_table_sets_o(t, "frame", (Obj*)p->frame);
-    extl_table_sets_o(t, "reg", (Obj*)p->reg);
-    extl_table_sets_o(t, "specifier", (Obj*)p->specifier);
-
-    extl_protect(NULL);
-    extl_call(fn, "t", "b", t, &ret);
-    extl_unprotect(NULL);
-    
-    if(ret){
-        ret=FALSE;
-
-        extl_table_gets_i(t, "res_w", &(p->res_w));
-        extl_table_gets_i(t, "res_h", &(p->res_h));
-        
-        if(extl_table_gets_o(t, "res_node", (Obj**)&(p->res_node))){
-            if(OBJ_IS(p->res_node, WSplitUnused)){
-                if(!extl_table_gets_t(t, "res_config", &(p->res_config))){
-                    warn(TR("Malfunctioning placement hook; condition #%d."), 1);
-                    goto err;
-                }
-            }else if(!OBJ_IS(p->res_node, WSplitRegion)){
-                warn(TR("Malfunctioning placement hook; condition #%d."), 2);
-                goto err;
-            }
-        }
-    }
-    
-    extl_unref_table(t);
-    
-    return ret;
-    
-err:    
-    p->res_node=NULL;
-    extl_unref_table(t);
-    return FALSE;
-}
-
-
-static bool plainregionfilter(WSplit *node)
-{
-    return (strcmp(OBJ_TYPESTR(node), "WSplitRegion")==0);
-}
-
-
-static bool fallback_filter(WSplit *node)
-{
-    return (OBJ_IS(node, WSplitUnused) || plainregionfilter(node));
-}
-
-
-static bool fallback_layout(WPaneWSPlacementParams *p)
-{
-    if(p->ws->tiling.split_tree==NULL)
-        return FALSE;
-    
-    if(p->specifier!=NULL){
-        p->res_node=(WSplit*)p->specifier;
-    }else{
-        p->res_node=split_current_todir(p->ws->tiling.split_tree, SPLIT_ANY,
-                                        PRIMN_ANY, fallback_filter);
-    }
-
-    if(p->res_node!=NULL && OBJ_IS(p->res_node, WSplitUnused)){
-        p->res_config=extl_create_table();
-        if(p->res_config==extl_table_none() || p->frame==NULL)
-            return FALSE;
-        extl_table_sets_o(p->res_config, "reg", (Obj*)(p->frame));
-    }
-    
-    return (p->res_node!=NULL);
-}
-
-
-/*}}}*/
-
-
-/*{{{ Split/replace unused code */
-
-
-static bool do_replace(WPaneWS *ws, WFrame *frame, WRegion *reg, 
-                       WPaneWSPlacementParams *rs)
-{
-    WSplit *u=rs->res_node;
-    WSplit *node=tiling_load_node(&(ws->tiling), &(u->geom), rs->res_config);
-    
-    assert(OBJ_IS(u, WSplitUnused));
-    
-    if(node==NULL){
-        warn(TR("Malfunctioning placement hook; condition #%d."), 3);
-        return FALSE;
-    }
-
-    if(REGION_MANAGER(frame)!=(WRegion*)ws){
-        warn(TR("Malfunctioning placement hook; condition #%d."), 4);
-        destroy_obj((Obj*)node);
-        return FALSE;
-    }
-    
-    if(u->parent!=NULL)
-        splitinner_replace(u->parent, u, node);
-    else
-        splittree_changeroot((WSplit*)u, node);
-    
-    u->parent=NULL;
-    mainloop_defer_destroy((Obj*)u);
-    
-    if(ws->tiling.stdispnode!=NULL)
-        split_regularise_stdisp(ws->tiling.stdispnode);
-
-    if(ws->tiling.split_tree!=NULL)
-        split_restack(ws->tiling.split_tree, ws->tiling.dummywin, Above);
-
-    return TRUE;
-}
-
-/*}}}*/
-
-
-/*{{{ The main dynfun */
-
-
-static bool current_unused(WPaneWS *ws)
-{
-    return OBJ_IS(tiling_current(&ws->tiling), WUnusedWin);
-}
-
-
-static WRegion *panews_get_target(WPaneWS *ws, WSplitUnused *specifier,
-                                  WRegion *reg)
-{
-    WRegion *target=NULL;
-    WFrame *frame=create_frame_for(ws, reg);
-    WSplit **tree=&(ws->tiling.split_tree);
-    WPaneWSPlacementParams rs;
-    
-    assert(ws->tiling.split_tree!=NULL);
-
-    rs.ws=ws;
-    rs.frame=frame;
-    rs.reg=reg;
-    rs.specifier=specifier;
-    rs.res_node=NULL;
-    rs.res_config=extl_table_none();
-    rs.res_w=-1;
-    rs.res_h=-1;
-    
-    if(frame!=NULL){
-        split_update_bounds(*tree, TRUE);
-        
-        assert(panews_make_placement_alt!=NULL);
-        
-        hook_call_p(panews_make_placement_alt, &rs,
-                    (WHookMarshallExtl*)mrsh_layout_extl);
-    }
-        
-    if(rs.res_node==NULL && specifier==NULL)
-        fallback_layout(&rs);
-        
-    if(rs.res_node!=NULL){
-        /* Resize */
-        if(rs.res_w>0 || rs.res_h>0){
-            WRectangle grq=rs.res_node->geom;
-            int gflags=REGION_RQGEOM_WEAK_ALL;
-            
-            if(rs.res_w>0){
-                grq.w=rs.res_w;
-                gflags&=~REGION_RQGEOM_WEAK_W;
-            }
-            
-            if(rs.res_h>0){
-                grq.h=rs.res_h;
-                gflags&=~REGION_RQGEOM_WEAK_H;
-            }
-            
-            splittree_rqgeom(rs.res_node, gflags, &grq, NULL);
-        }
-        
-        if(OBJ_IS(rs.res_node, WSplitUnused)){
-            if(frame!=NULL){
-                if(do_replace(ws, frame, reg, &rs))
-                    target=(WRegion*)frame;
-            }
-        }else{
-            assert(OBJ_IS(rs.res_node, WSplitRegion));
-            target=((WSplitRegion*)rs.res_node)->reg;
-        }
-        
-        extl_unref_table(rs.res_config);
-    }
-        
-    if(frame!=NULL && target!=(WRegion*)frame)
-        destroy_obj((Obj*)frame);
-    
-    if(target!=NULL && current_unused(ws))
-        region_goto(target);
-    
-    return target;
-}
-
-
-WPHolder *panews_prepare_manage(WPaneWS *ws, const WClientWin *cwin,
-                                const WManageParams *param, int redir)
-{
-    WRegion *target=panews_get_target(ws, NULL, (WRegion*)cwin);
-    WPHolder *ph;
-    
-    if(target!=NULL){
-        ph=region_prepare_manage(target, cwin, param, MANAGE_REDIR_PREFER_YES);
-        if(ph!=NULL)
-            return ph;
-    }
-
-    warn(TR("Ooops... could not find a region to attach client window to "
-            "on workspace %s."), region_name((WRegion*)ws));
-    return NULL;
-}
-
-
-bool panews_handle_unused_drop(WPaneWS *ws, WSplitUnused *specifier, 
-                               WRegion *reg)
-{
-    WRegion *target=panews_get_target(ws, specifier, reg);
-    
-    if(target==NULL || !OBJ_IS(target, WMPlex))
-        return FALSE;
-    
-    return (mplex_attach_simple((WMPlex*)target, reg, 
-                                MPLEX_ATTACH_SWITCHTO)!=NULL);
-}
-
-
-/*}}}*/
-
diff --git a/mod_panews/placement.h b/mod_panews/placement.h
deleted file mode 100644 (file)
index 23dd9fe..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * ion/mod_panews/placement.h
- *
- * Copyright (c) Tuomo Valkonen 1999-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.
- */
-
-#ifndef ION_MOD_PANEWS_PLACEMENT_H
-#define ION_MOD_PANEWS_PLACEMENT_H
-
-#include <libextl/extl.h>
-#include <libmainloop/hooks.h>
-#include <ioncore/common.h>
-#include <ioncore/clientwin.h>
-#include <ioncore/manage.h>
-#include <mod_tiling/split.h>
-#include "panews.h"
-#include "splitext.h"
-
-
-typedef struct{
-    WPaneWS *ws;
-    ExtlTab layout;
-} WPaneWSInitParams;
-
-
-typedef struct{
-    WPaneWS *ws;
-    WFrame *frame;
-    WRegion *reg;
-    WSplitUnused *specifier;
-    
-    WSplit *res_node;
-    ExtlTab res_config;
-    int res_w, res_h;
-} WPaneWSPlacementParams;
-
-
-/* Handlers of this hook should accept WPaneWSInitParams as parameter. */
-extern WHook *panews_init_layout_alt;
-/* Handlers of this hook should accept WPaneWSPlacementParams as parameter. */
-extern WHook *panews_make_placement_alt;
-
-
-extern WPHolder *panews_prepare_manage(WPaneWS *ws, const WClientWin *cwin,
-                                       const WManageParams *param,
-                                       int redir);
-extern bool panews_handle_unused_drop(WPaneWS *ws, WSplitUnused *specifier, 
-                                      WRegion *reg);
-
-#endif /* ION_MOD_PANEWS_PLACEMENT_H */
diff --git a/mod_panews/splitext.c b/mod_panews/splitext.c
deleted file mode 100644 (file)
index ad392c5..0000000
+++ /dev/null
@@ -1,617 +0,0 @@
-/*
- * ion/panews/splitext.c
- *
- * Copyright (c) Tuomo Valkonen 1999-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 <string.h>
-#include <limits.h>
-#include <libtu/objp.h>
-#include <libtu/minmax.h>
-#include <ioncore/common.h>
-#include <ioncore/global.h>
-#include <ioncore/rootwin.h>
-#include <ioncore/xwindow.h>
-#include <ioncore/window.h>
-#include <mod_tiling/split.h>
-#include "splitext.h"
-#include "unusedwin.h"
-
-
-#define GEOM(X) (((WSplit*)(X))->geom)
-
-
-/*{{{ Init/deinit */
-
-
-bool splitunused_init(WSplitUnused *split, const WRectangle *geom,
-                      WPaneWS *ws)
-{
-    WWindow *par=REGION_PARENT(ws);
-    WUnusedWin *uwin;
-    WFitParams fp;
-
-    assert(par!=NULL);
-    
-    fp.g=*geom;
-    fp.mode=REGION_FIT_EXACT;
-    
-    uwin=create_unusedwin(par, &fp);
-    
-    if(uwin==NULL)
-        return FALSE;
-    
-    if(!splitregion_init(&(split->regnode), geom, (WRegion*)uwin)){
-        destroy_obj((Obj*)uwin);
-        return FALSE;
-    }
-    
-    if(!tiling_managed_add(&ws->tiling, (WRegion*)uwin)){
-        split->regnode.reg=NULL;
-        destroy_obj((Obj*)uwin);
-        return FALSE;
-    }
-    
-    return TRUE;
-}
-
-
-WSplitUnused *create_splitunused(const WRectangle *geom, WPaneWS *ws)
-{
-    CREATEOBJ_IMPL(WSplitUnused, splitunused, (p, geom, ws));
-}
-
-
-bool splitpane_init(WSplitPane *pane, const WRectangle *geom, WSplit *cnt)
-{
-    pane->contents=cnt;
-    pane->marker=NULL;
-    
-    if(!splitinner_init(&(pane->isplit), geom))
-        return FALSE;
-
-    return TRUE;
-}
-
-
-WSplitPane *create_splitpane(const WRectangle *geom, WSplit *cnt)
-{
-    CREATEOBJ_IMPL(WSplitPane, splitpane, (p, geom, cnt));
-}
-
-
-void splitunused_deinit(WSplitUnused *split)
-{
-    if(split->regnode.reg!=NULL){
-        destroy_obj((Obj*)split->regnode.reg);
-        split->regnode.reg=NULL;
-    }
-    
-    splitregion_deinit(&(split->regnode));
-}
-
-
-void splitpane_deinit(WSplitPane *split)
-{
-    if(split->contents!=NULL){
-        WSplit *tmp=split->contents;
-        split->contents=NULL;
-        tmp->parent=NULL;
-        destroy_obj((Obj*)tmp);
-    }
-    splitinner_deinit(&(split->isplit));
-}
-
-
-/*}}}*/
-
-
-/*{{{ X window handling */
-
-
-static void splitpane_stacking(WSplitPane *pane, 
-                               Window *bottomret, Window *topret)
-{
-
-    *bottomret=None;
-    *topret=None;
-    
-    if(pane->contents!=NULL)
-        split_stacking(pane->contents, bottomret, topret);
-}
-
-
-static void splitpane_restack(WSplitPane *pane, Window other, int mode)
-{
-    if(pane->contents!=None)
-        split_restack(pane->contents, other, mode);
-}
-
-
-static void stack_restack_reg(WRegion *reg, Window *other, int *mode)
-{
-    Window b=None, t=None;
-    
-    if(reg!=NULL){
-        region_restack(reg, *other, *mode);
-        region_stacking(reg, &b, &t);
-        if(t!=None){
-            *other=t;
-            *mode=Above;
-        }
-    }
-}
-
-
-static void stack_restack_split(WSplit *split, Window *other, int *mode)
-{
-    Window b=None, t=None;
-    
-    if(split!=NULL){
-        split_restack(split, *other, *mode);
-        split_stacking(split, &b, &t);
-        if(t!=None){
-            *other=t;
-            *mode=Above;
-        }
-    }
-}
-
-
-static void splitpane_reparent(WSplitPane *pane, WWindow *target)
-{
-    if(pane->contents!=NULL)
-        split_reparent(pane->contents, target);
-}
-
-
-static void reparentreg(WRegion *reg, WWindow *target)
-{
-    WRectangle g=REGION_GEOM(reg);
-    region_reparent(reg, target, &g, REGION_FIT_EXACT);
-}
-
-
-/*}}}*/
-
-
-/*{{{ Geometry */
-
-
-static void set_unused_bounds(WSplit *node)
-{
-    node->min_w=0;
-    node->min_h=0;
-    node->max_w=INT_MAX;
-    node->max_h=INT_MAX;
-    node->unused_w=node->geom.w;
-    node->unused_h=node->geom.h;
-}
-
-
-static void copy_bounds(WSplit *dst, const WSplit *src)
-{
-    dst->min_w=src->min_w;
-    dst->min_h=src->min_h;
-    dst->max_w=src->max_w;
-    dst->max_h=src->max_h;
-    dst->unused_w=src->unused_w;
-    dst->unused_h=src->unused_h;
-}
-
-
-static void splitunused_update_bounds(WSplitUnused *node, bool recursive)
-{
-    set_unused_bounds((WSplit*)node);
-}
-
-
-static void splitpane_update_bounds(WSplitPane *node, bool recursive)
-{
-    if(node->contents!=NULL){
-        if(recursive)
-            split_update_bounds(node->contents, recursive);
-        copy_bounds((WSplit*)node, node->contents);
-    }else{
-        set_unused_bounds((WSplit*)node);
-    }
-}
-
-
-static int infadd(int x, int y)
-{
-    return ((x==INT_MAX || y==INT_MAX) ? INT_MAX : (x+y));
-}
-
-
-static void splitpane_do_resize(WSplitPane *pane, const WRectangle *ng, 
-                                int hprimn, int vprimn, bool transpose)
-{
-    if(transpose && pane->marker!=NULL){
-        char *growdir=strchr(pane->marker, ':');
-        if(growdir!=NULL){
-            const char *newdir=NULL;
-            growdir++;
-            
-            if(strcmp(growdir, "right")==0)
-                newdir="down";
-            else if(strcmp(growdir, "left")==0)
-                newdir="up";
-            if(strcmp(growdir, "down")==0)
-                newdir="right";
-            else if(strcmp(growdir, "up")==0)
-                newdir="left";
-            
-            if(newdir!=NULL){
-                char *newmarker=NULL;
-                *growdir='\0';
-                libtu_asprintf(&newmarker, "%s:%s", pane->marker, newdir);
-                if(newmarker==NULL){
-                    *growdir=':';
-                }else{
-                    free(pane->marker);
-                    pane->marker=newmarker;
-                }
-            }
-        }
-        
-    }
-    
-    ((WSplit*)pane)->geom=*ng;
-    
-    if(pane->contents!=NULL)
-        split_do_resize(pane->contents, ng, hprimn, vprimn, transpose);
-}
-
-
-static void splitpane_do_rqsize(WSplitPane *pane, WSplit *node, 
-                                RootwardAmount *ha, RootwardAmount *va, 
-                                WRectangle *rg, bool tryonly)
-{
-    WSplitInner *par=((WSplit*)pane)->parent;
-    
-    if(par!=NULL){
-        splitinner_do_rqsize(par, (WSplit*)pane, ha, va, rg, tryonly);
-        if(!tryonly)
-            ((WSplit*)pane)->geom=*rg;
-    }else{
-        *rg=GEOM(pane);
-    }
-}
-
-
-/*}}}*/
-
-
-/*{{{ Tree manipulation */
-
-
-static void splitpane_replace(WSplitPane *pane, WSplit *child, WSplit *what)
-{
-    assert(child==pane->contents && what!=NULL);
-    
-    child->parent=NULL;
-    pane->contents=what;
-    what->parent=(WSplitInner*)pane;
-    what->ws_if_root=NULL; /* May not be needed */
-}
-
-
-static WPaneWS *find_ws(WSplit *split)
-{
-    if(split->parent!=NULL)
-        return find_ws((WSplit*)split->parent);
-    
-    if(split->ws_if_root!=NULL)
-        return OBJ_CAST(split->ws_if_root, WPaneWS);
-    
-    return NULL;
-}
-
-
-static void splitpane_remove(WSplitPane *pane, WSplit *child, 
-                             bool reclaim_space)
-{
-    WSplitInner *parent=((WSplit*)pane)->parent;
-    WSplitUnused *un;
-    WPaneWS *ws=find_ws((WSplit*)pane);
-    
-    assert(child==pane->contents);
-    
-    pane->contents=NULL;
-    child->parent=NULL;
-
-    if(ws!=NULL
-       && !OBJ_IS_BEING_DESTROYED(ws)
-       && !OBJ_IS_BEING_DESTROYED(pane)){
-        pane->contents=(WSplit*)create_splitunused(&GEOM(pane), ws);
-        if(pane->contents!=NULL){
-            pane->contents->parent=(WSplitInner*)pane;
-            return;
-        }
-    }
-    
-    if(parent!=NULL)
-        splitinner_remove(parent, (WSplit*)pane, reclaim_space);
-    else
-        splittree_changeroot((WSplit*)pane, NULL);
-    
-    destroy_obj((Obj*)pane);
-}
-
-
-/*}}}*/
-
-
-/*{{{ Tree traversal */
-
-
-static bool filter_any(WSplit *split)
-{
-    return OBJ_IS(split, WSplitRegion);
-}
-
-
-static bool filter_no_unused(WSplit *split)
-{
-    return (OBJ_IS(split, WSplitRegion)
-            && !OBJ_IS(split, WSplitUnused));
-}
-
-
-static bool filter_no_stdisp(WSplit *split)
-{
-    return (OBJ_IS(split, WSplitRegion)
-            && !OBJ_IS(split, WSplitST));
-}
-
-
-static bool filter_no_stdisp_unused(WSplit *split)
-{
-    return (OBJ_IS(split, WSplitRegion)
-            && !OBJ_IS(split, WSplitST)
-            && !OBJ_IS(split, WSplitUnused));
-            
-}
-
-
-static WSplit *splitpane_current_todir(WSplitPane *pane, int dir, int primn,
-                                       WSplitFilter *filter)
-{
-    WSplit *ret=NULL;
-    
-    if(pane->contents==NULL)
-        return NULL;
-    
-    /* Try non-unused first */
-    if(filter==filter_no_stdisp){
-        ret=split_current_todir(pane->contents, dir, primn, 
-                                filter_no_stdisp_unused);
-    }else if(filter==filter_any){
-        ret=split_current_todir(pane->contents, dir, primn, 
-                                filter_no_unused);
-    }
-    
-    if(ret==NULL)
-        ret=split_current_todir(pane->contents, dir, primn, filter);
-    
-    return ret;
-}
-
-
-static void splitpane_forall(WSplitPane *pane, WSplitFn *fn)
-{
-    if(pane->contents!=NULL)
-        fn(pane->contents);
-}
-
-
-static WSplit *splitpane_current(WSplitPane *pane)
-{
-    return pane->contents;
-}
-
-
-static WSplitRegion *get_node_check(WPaneWS *ws, WRegion *reg)
-{
-    WSplitRegion *node;
-
-    if(reg==NULL)
-        return NULL;
-    
-    node=splittree_node_of(reg);
-    
-    if(node==NULL || REGION_MANAGER(reg)!=(WRegion*)ws)
-        return NULL;
-    
-    return node;
-}
-
-
-static WSplitRegion *do_get_nextto(WSplit *node, int dir, int primn, 
-                                   bool any, bool paneonly)
-{
-    WSplitFilter *filter=(any ? filter_no_unused : filter_no_stdisp_unused);
-    WSplit *nextto=NULL;
-
-    while(node->parent!=NULL){
-        if(OBJ_IS(node, WSplitPane)){
-            if(paneonly)
-                break;
-            filter=(any ? filter_any : filter_no_stdisp);
-        }
-        nextto=splitinner_nextto(node->parent, node, dir, primn, filter);
-        if(nextto!=NULL)
-            break;
-        node=(WSplit*)(node->parent);
-    }
-    
-    if(OBJ_IS(nextto, WSplitRegion))
-        return (WSplitRegion*)nextto;
-    return NULL;
-}
-
-
-WRegion *panews_do_get_nextto(WPaneWS *ws, WRegion *reg,
-                              int dir, int primn, bool any)
-{
-    WSplitRegion *node=get_node_check(ws, reg), *nextto=NULL;
-
-    if(node==NULL)
-        return NULL;
-    
-    nextto=do_get_nextto((WSplit*)node, dir, primn, TRUE, FALSE);
-    
-    if(nextto!=NULL)
-        return nextto->reg;
-
-    return NULL;
-}
-
-WRegion *panews_do_get_farthest(WPaneWS *ws,
-                                int dir, int primn, bool any)
-{
-    WSplitFilter *filter=(any ? filter_any : filter_no_stdisp);
-    WSplit *node=NULL;
-    if(ws->tiling.split_tree!=NULL)
-        node=split_current_todir(ws->tiling.split_tree, dir, primn, filter);
-    if(node!=NULL && OBJ_IS(node, WSplitRegion))
-        return ((WSplitRegion*)node)->reg;
-    return NULL;
-}
-
-
-WSplitRegion *split_tree_find_region_in_pane_of(WSplit *node)
-{
-    return do_get_nextto(node, SPLIT_ANY, PRIMN_ANY, FALSE, TRUE);
-}
-
-
-/*}}}*/
-
-
-/*{{{ Markers and other exports */
-
-
-/*EXTL_DOC
- * Get marker.
- */
-EXTL_SAFE
-EXTL_EXPORT_MEMBER
-const char *splitpane_marker(WSplitPane *pane)
-{
-    return pane->marker;
-}
-
-
-/*EXTL_DOC
- * Set marker.
- */
-EXTL_EXPORT_MEMBER
-bool splitpane_set_marker(WSplitPane *pane, const char *s)
-{
-    char *s2=NULL;
-    
-    if(s!=NULL){
-        s2=scopy(s);
-        if(s2==NULL)
-            return FALSE;
-    }
-    
-    if(pane->marker==NULL)
-        free(pane->marker);
-    
-    pane->marker=s2;
-    
-    return TRUE;
-}
-
-
-/*EXTL_DOC
- * Get root of contained sub-split tree.
- */
-EXTL_SAFE
-EXTL_EXPORT_MEMBER
-WSplit *splitpane_contents(WSplitPane *pane)
-{
-    return pane->contents;
-}
-
-
-/*}}}*/
-
-
-/*{{{ Save support */
-
-
-static bool splitunused_get_config(WSplitUnused *node, ExtlTab *ret)
-{
-    *ret=split_base_config((WSplit*)node);
-    return TRUE;
-}
-
-
-static bool splitpane_get_config(WSplitPane *pane, ExtlTab *ret)
-{
-    *ret=split_base_config((WSplit*)pane);
-    
-    if(pane->contents!=NULL){
-        ExtlTab t;
-        if(!split_get_config(pane->contents, &t)){
-            extl_unref_table(*ret);
-            return FALSE;
-        }
-        extl_table_sets_t(*ret, "contents", t);
-        extl_unref_table(t);
-    }
-    
-    extl_table_sets_s(*ret, "marker", pane->marker);
-
-    return TRUE;
-}
-
-
-/*}}}*/
-
-
-/*{{{ The classes */
-
-
-static DynFunTab splitunused_dynfuntab[]={
-    {split_update_bounds, splitunused_update_bounds},
-    {(DynFun*)split_get_config, (DynFun*)splitunused_get_config},
-    END_DYNFUNTAB,
-};
-
-
-static DynFunTab splitpane_dynfuntab[]={
-    {split_update_bounds, splitpane_update_bounds},
-    {split_do_resize, splitpane_do_resize},
-    {splitinner_do_rqsize, splitpane_do_rqsize},
-    {splitinner_replace, splitpane_replace},
-    {splitinner_remove, splitpane_remove},
-    {(DynFun*)split_current_todir, (DynFun*)splitpane_current_todir},
-    {(DynFun*)splitinner_current, (DynFun*)splitpane_current},
-    {(DynFun*)split_get_config, (DynFun*)splitpane_get_config},
-    {splitinner_forall, splitpane_forall},
-    {split_stacking, splitpane_stacking},
-    {split_restack, splitpane_restack},
-    {split_reparent, splitpane_reparent},
-    END_DYNFUNTAB,
-};
-
-
-EXTL_EXPORT
-IMPLCLASS(WSplitUnused, WSplitRegion, splitunused_deinit, splitunused_dynfuntab);
-
-EXTL_EXPORT
-IMPLCLASS(WSplitPane, WSplitInner, splitpane_deinit, splitpane_dynfuntab);
-
-
-/*}}}*/
-
diff --git a/mod_panews/splitext.h b/mod_panews/splitext.h
deleted file mode 100644 (file)
index 0bc73e3..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * ion/panews/splitext.h
- *
- * Copyright (c) Tuomo Valkonen 1999-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.
- */
-
-#ifndef ION_PANEWS_SPLITEXT_H
-#define ION_PANEWS_SPLITEXT_H
-
-#include <ioncore/common.h>
-#include <mod_tiling/split.h>
-
-INTRCLASS(WSplitUnused);
-INTRCLASS(WSplitPane);
-
-#include "panews.h"
-
-DECLCLASS(WSplitUnused){
-    WSplitRegion regnode;
-};
-
-DECLCLASS(WSplitPane){
-    WSplitInner isplit;
-    WSplit *contents;
-    char *marker;
-};
-
-extern bool splitunused_init(WSplitUnused *split, const WRectangle *geom,
-                             WPaneWS *ws);
-extern bool splitpane_init(WSplitPane *split, const WRectangle *geom,
-                           WSplit *cnt);
-
-extern WSplitUnused *create_splitunused(const WRectangle *geom,
-                                        WPaneWS *ws);
-extern WSplitPane *create_splitpane(const WRectangle *geom, WSplit *cnt);
-
-extern void splitunused_deinit(WSplitUnused *split);
-extern void splitpane_deinit(WSplitPane *split);
-
-extern const char *splitpane_get_marker(WSplitPane *pane);
-extern bool splitpane_set_marker(WSplitPane *pane, const char *s);
-
-extern WRegion *panews_do_get_nextto(WPaneWS *ws, WRegion *reg,
-                                     int dir, int primn, bool any);
-extern WRegion *panews_do_get_farthest(WPaneWS *ws,
-                                       int dir, int primn, bool any);
-
-extern WSplitRegion *split_tree_find_region_in_pane_of(WSplit *node);
-
-#endif /* ION_PANEWS_SPLITEXT_H */
diff --git a/mod_panews/unusedwin.c b/mod_panews/unusedwin.c
deleted file mode 100644 (file)
index 7e030f0..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * ion/panews/unusedwin.c
- *
- * Copyright (c) Tuomo Valkonen 1999-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 <string.h>
-
-#include <libtu/objp.h>
-#include <libtu/minmax.h>
-#include <ioncore/common.h>
-#include <ioncore/global.h>
-#include <ioncore/event.h>
-#include <ioncore/gr.h>
-#include <ioncore/regbind.h>
-#include <ioncore/framep.h>
-#include <ioncore/presize.h>
-#include <ioncore/frame-pointer.h>
-#include "unusedwin.h"
-#include "splitext.h"
-#include "placement.h"
-#include "main.h"
-
-
-/*{{{ Init/deinit */
-
-
-static void unusedwin_getbrush(WUnusedWin *uwin)
-{
-    GrBrush *brush=gr_get_brush(uwin->wwin.win,
-                                region_rootwin_of((WRegion*)uwin),
-                                "frame-tiled-panews-unused");
-
-    if(brush!=NULL){
-        if(uwin->brush!=NULL)
-            grbrush_release(uwin->brush);
-        
-        uwin->brush=brush;
-        
-        grbrush_enable_transparency(brush, GR_TRANSPARENCY_YES);
-    }
-}
-
-
-bool unusedwin_init(WUnusedWin *uwin, WWindow *parent, const WFitParams *fp)
-{
-    uwin->brush=NULL;
-    
-    if(!window_init(&(uwin->wwin), parent, fp))
-        return FALSE;
-    
-    unusedwin_getbrush(uwin);
-    
-    region_add_bindmap((WRegion*)uwin, mod_panews_unusedwin_bindmap);
-
-    window_select_input(&(uwin->wwin), IONCORE_EVENTMASK_NORMAL);
-
-    ((WRegion*)uwin)->flags|=REGION_PLEASE_WARP;
-    
-    return TRUE;
-}
-
-
-WUnusedWin *create_unusedwin(WWindow *parent, const WFitParams *fp)
-{
-    CREATEOBJ_IMPL(WUnusedWin, unusedwin, (p, parent, fp));
-}
-
-
-void unusedwin_deinit(WUnusedWin *uwin)
-{
-    if(uwin->brush!=NULL){
-        grbrush_release(uwin->brush);
-        uwin->brush=NULL;
-    }
-    
-    window_deinit(&(uwin->wwin));
-}
-
-
-/*}}}*/
-
-
-/*{{{ unusedwin_press */
-
-
-static void unusedwin_border_inner_geom(const WUnusedWin *uwin, 
-                                        WRectangle *geom)
-{
-    GrBorderWidths bdw;
-    
-    geom->x=0;
-    geom->y=0;
-    geom->w=REGION_GEOM(uwin).w;
-    geom->h=REGION_GEOM(uwin).h;
-    
-    if(uwin->brush!=NULL){
-        grbrush_get_border_widths(uwin->brush, &bdw);
-
-        geom->x+=bdw.left;
-        geom->y+=bdw.top;
-        geom->w-=bdw.left+bdw.right;
-        geom->h-=bdw.top+bdw.bottom;
-    }
-    
-    geom->w=maxof(geom->w, 0);
-    geom->h=maxof(geom->h, 0);
-}
-
-
-static int unusedwin_press(WUnusedWin *uwin, XButtonEvent *ev, 
-                           WRegion **reg_ret)
-{
-    WRectangle g;
-    
-    *reg_ret=NULL;
-    
-    window_p_resize_prepare(&uwin->wwin, ev);
-    
-    /* Check border */
-    
-    unusedwin_border_inner_geom(uwin, &g);
-    
-    if(rectangle_contains(&g, ev->x, ev->y))
-        return FRAME_AREA_CLIENT;
-    
-    return FRAME_AREA_BORDER;
-}
-
-
-/*}}}*/
-
-
-/*{{{ unusedwin_handle_drop */
-
-
-static bool unusedwin_handle_drop(WUnusedWin *uwin, int x, int y,
-                                  WRegion *dropped)
-{
-    WSplitUnused *us=OBJ_CAST(splittree_node_of((WRegion*)uwin),
-                              WSplitUnused);
-    WPaneWS *ws=REGION_MANAGER_CHK(uwin, WPaneWS);
-    
-    if(us==NULL || ws==NULL)
-        return FALSE;
-    
-    return panews_handle_unused_drop(ws, us, dropped);
-}
-
-
-/*}}}*/
-
-
-/*{{{ Drawing */
-
-
-static void unusedwin_updategr(WUnusedWin *uwin)
-{
-    unusedwin_getbrush(uwin);
-    region_updategr_default((WRegion*)uwin);
-}
-
-
-static void unusedwin_draw(WUnusedWin *uwin, bool complete)
-{
-    WRectangle g;
-    const char *substyle=(REGION_IS_ACTIVE(uwin)
-                          ? "active"
-                          : "inactive");
-    
-    if(uwin->brush==NULL)
-        return;
-    
-    g.x=0;
-    g.y=0;
-    g.w=REGION_GEOM(uwin).w;
-    g.h=REGION_GEOM(uwin).h;
-    
-    grbrush_begin(uwin->brush, &g, (complete ? 0 : GRBRUSH_NO_CLEAR_OK));
-    
-    grbrush_draw_border(uwin->brush, &g, substyle);
-    
-    grbrush_end(uwin->brush);
-}
-
-
-/*}}}*/
-
-
-/*{{{ The class */
-
-
-static DynFunTab unusedwin_dynfuntab[]={
-    {region_updategr, unusedwin_updategr},
-    {window_draw, unusedwin_draw},
-    {(DynFun*)window_press, (DynFun*)unusedwin_press},
-    {(DynFun*)region_handle_drop, (DynFun*)unusedwin_handle_drop},
-    END_DYNFUNTAB,
-};
-
-
-IMPLCLASS(WUnusedWin, WWindow, unusedwin_deinit, unusedwin_dynfuntab);
-
-
-/*}}}*/
-
diff --git a/mod_panews/unusedwin.h b/mod_panews/unusedwin.h
deleted file mode 100644 (file)
index bcdc5ba..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * ion/panews/unusedwin.h
- *
- * Copyright (c) Tuomo Valkonen 1999-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.
- */
-
-#ifndef ION_PANEWS_UNUSEDWIN_H
-#define ION_PANEWS_UNUSEDWIN_H
-
-#include <ioncore/common.h>
-#include <ioncore/gr.h>
-
-INTRCLASS(WUnusedWin);
-
-DECLCLASS(WUnusedWin){
-    WWindow wwin;
-    GrBrush *brush;
-};
-
-extern bool unusedwin_init(WUnusedWin *pwin, 
-                           WWindow *parent, const WFitParams *fp);
-extern WUnusedWin *create_unusedwin(WWindow *parent, const WFitParams *fp);
-
-#endif /* ION_PANEWS_UNUSEDWIN_H */
index 0bc2df3c3f406b33b8f6f0b58aa50da4a2cfd5fd..87cd93424ace14cf189bcfa6a034a71932dd2d4b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/complete.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index f7aa9108de301494acfbe9015ee3536ac9e80091..d9c9773e88109de10677d85ee94ff045fec99547 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/complete.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 99283f40ef71c2b918782582245606a5e264e7bb..911dee734174b03f4ba70071230015088b64af78 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/edln.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -644,10 +644,10 @@ static int search(Edln *edln, int from, bool bwd, bool match)
         char *tmpstr=history_search_str(edln);
         if(tmpstr==NULL)
             return edln->histent;
-        e=mod_query_history_search(tmpstr, from, bwd);
+        e=mod_query_history_search(tmpstr, from, bwd, FALSE);
         free(tmpstr);
     }else{
-        e=mod_query_history_search(edln->context, from, bwd);
+        e=mod_query_history_search(edln->context, from, bwd, FALSE);
     }
     
     return e;
index 9d95de5d199e39c741285993a4b966d0e906f85a..ea00f6f63c3139b4da3b7c0b4452ff7be9c36117 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/edln.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 7280f85c8cddd2fa383e916aaf5bec5c389f5147..e10d2774c4da87ff3acde4165a2901ed6092bfc2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/query.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6dfee3775368ffd11fc9763b4ac660372c753dcd..6e91a644d2e7adc2e712229b29f54bfc66d76d5d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/fwarn.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 05b6aa51973275423ab708c65062fcd104bdf78e..168f6066aa7b6b04d341ffe243295b04fd342e79 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/history.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -52,9 +52,10 @@ bool mod_query_history_push(const char *str)
 
 void mod_query_history_push_(char *str)
 {
-    int ndx=mod_query_history_search(str, 0, FALSE);
+    int ndx=mod_query_history_search(str, 0, FALSE, TRUE);
     
     if(ndx==0){
+        free(str);
         return; /* First entry already */
     }else if(ndx>0){
         int i, j;
@@ -110,7 +111,7 @@ void mod_query_history_clear()
 
 
 
-static bool match(const char *h, const char *b)
+static bool match(const char *h, const char *b, bool exact)
 {
     const char *h_;
     
@@ -124,8 +125,10 @@ static bool match(const char *h, const char *b)
         if(h_!=NULL)
             h=h_+1;
     }
-        
-    return (strncmp(h, b, strlen(b))==0);
+    
+    return (exact
+            ? strcmp(h, b)==0
+            : strncmp(h, b, strlen(b))==0);
 }
 
 
@@ -140,17 +143,18 @@ static const char *skip_colon(const char *s)
  * Try to find matching history entry. Returns -1 if none was
  * found. The parameter \var{from} specifies where to start 
  * searching from, and \var{bwd} causes backward search from
- * that point.
+ * that point. If \var{exact} is not set, \var{s} only required
+ * to be a prefix of the match.
  */
 EXTL_SAFE
 EXTL_EXPORT
-int mod_query_history_search(const char *s, int from, bool bwd)
+int mod_query_history_search(const char *s, int from, bool bwd, bool exact)
 {
     while(1){
         int i=get_index(from);
         if(i<0)
             return -1;
-        if(match(hist[i], s))
+        if(match(hist[i], s, exact))
             return from;
         if(bwd)
             from--;
@@ -172,7 +176,7 @@ uint mod_query_history_complete(const char *s, char ***h_ret)
         int j=get_index(i);
         if(j<0)
             break;
-        if(match(hist[j], s)){
+        if(match(hist[j], s, FALSE)){
             h[n]=scopy(skip_colon(hist[j]));
             if(h[n]!=NULL)
                 n++;
index 005d62e8a9f43b2dcdb568826d2ae2ffdf9500a3..f27be88387bbb40c68f716ffbd81528d1e2ace56 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/history.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -19,7 +19,8 @@ extern const char *mod_query_history_get(int n);
 extern bool mod_query_history_push(const char *s);
 extern void mod_query_history_push_(char *s);
 extern void mod_query_history_clear();
-extern int mod_query_history_search(const char *s, int from, bool bwd);
+extern int mod_query_history_search(const char *s, int from, bool bwd, 
+                                    bool exact);
 extern uint mod_query_history_complete(const char *s, char ***h_ret);
 extern ExtlTab mod_query_history_table();
 
index ee190265f237494c2374a3bb04ed9510e2d0bae7..7f8ac99faa9f1b3bbab30adc8614c1516dbf6aaa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/input.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -162,7 +162,7 @@ EXTL_EXPORT_MEMBER
 void input_cancel(WInput *input)
 {
     if(region_manager_allows_destroying((WRegion*)input))
-        mainloop_defer_destroy((Obj*)input);
+        region_dispose_((WRegion*)input);
 }
 
 
index 21abf71114d83e461230262259688dac05a2b5ae..4f9f758aeb4906228cdaf866564f96542c7829e9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/input.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 1da92b5bd4e98766aeac68b58601c5ab515859dc..d91960fad6319d351d7cdb33ebf8d6e61d411208 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/inputp.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 9ceb41d6cbb2b3348f9dc5a54166a53d797292ad..271d17e53a0be6411a440288ecc6b3f707bed0be 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/listing.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -141,12 +141,12 @@ static void string_calc_parts(GrBrush *brush, int maxw, char *str,
 
 static void draw_multirow(GrBrush *brush, int x, int y, int h, 
                           char *str, WListingItemInfo *iinf,
-                          int maxw, int ciw, int wrapw, const char *style)
+                          int maxw, int ciw, int wrapw)
 {
     int i, l;
     
     if(iinf==NULL){
-        grbrush_draw_string(brush, x, y, str, strlen(str), TRUE, style);
+        grbrush_draw_string(brush, x, y, str, strlen(str), TRUE);
         return;
     }
 
@@ -158,10 +158,10 @@ static void draw_multirow(GrBrush *brush, int x, int y, int h,
         l=iinf->part_lens[0];
     }
 
-    grbrush_draw_string(brush, x, y, str, l, TRUE, style);
+    grbrush_draw_string(brush, x, y, str, l, TRUE);
     
     for(i=1; i<iinf->n_parts; i++){
-        grbrush_draw_string(brush, x+maxw-wrapw, y, "\\", 1, TRUE, style);
+        grbrush_draw_string(brush, x+maxw-wrapw, y, "\\", 1, TRUE);
         
         y+=h;
         str+=l;
@@ -171,7 +171,7 @@ static void draw_multirow(GrBrush *brush, int x, int y, int h,
         }
         l=iinf->part_lens[i];
             
-        grbrush_draw_string(brush, x, y, str, l, TRUE, style);
+        grbrush_draw_string(brush, x, y, str, l, TRUE);
     }
 }
 
@@ -348,8 +348,7 @@ void init_listing(WListing *l)
 
 
 static void do_draw_listing(GrBrush *brush, const WRectangle *geom, 
-                            WListing *l, const char *style,
-                            const char *selstyle)
+                            WListing *l, GrAttr selattr)
 {
     int wrapw=grbrush_get_text_width(brush, "\\", 1);
     int ciw=grbrush_get_text_width(brush, CONT_INDENT, CONT_INDENT_LEN);
@@ -372,10 +371,15 @@ static void do_draw_listing(GrBrush *brush, const WRectangle *geom,
             if(i>=l->nstrs)
                 return;
             
+            if(i==l->selected_str)
+                grbrush_set_attr(brush, selattr);
+                
             draw_multirow(brush, geom->x+x, y, l->itemh, l->strs[i],
                           (l->iteminfos!=NULL ? &(l->iteminfos[i]) : NULL),
-                          geom->w-x, ciw, wrapw, 
-                          (i==l->selected_str ? selstyle : style));
+                          geom->w-x, ciw, wrapw);
+            
+            if(i==l->selected_str)
+                grbrush_unset_attr(brush, selattr);
 
             y+=l->itemh*ITEMROWS(l, i);
             r+=ITEMROWS(l, i);
@@ -388,18 +392,18 @@ static void do_draw_listing(GrBrush *brush, const WRectangle *geom,
 
 
 void draw_listing(GrBrush *brush, const WRectangle *geom,
-                  WListing *l, bool complete, const char *style,
-                  const char *selstyle)
+                  WListing *l, bool complete, GrAttr selattr)
 {
     WRectangle geom2;
     GrBorderWidths bdw;
-                         
-    grbrush_begin(brush, geom, GRBRUSH_AMEND|GRBRUSH_NEED_CLIP);
-
+    
+    grbrush_begin(brush, geom, GRBRUSH_AMEND|GRBRUSH_KEEP_ATTR
+                               |GRBRUSH_NEED_CLIP);
+    
     if(complete)
         grbrush_clear_area(brush, geom);
     
-    grbrush_draw_border(brush, geom, style);
+    grbrush_draw_border(brush, geom);
 
     grbrush_get_border_widths(brush, &bdw);
     
@@ -408,7 +412,7 @@ void draw_listing(GrBrush *brush, const WRectangle *geom,
     geom2.w=geom->w-bdw.left-bdw.right;
     geom2.h=geom->h-bdw.top-bdw.bottom;
     
-    do_draw_listing(brush, &geom2, l, style, selstyle);
+    do_draw_listing(brush, &geom2, l, selattr);
     
     grbrush_end(brush);
 }
index 457ec086e9cf06fdc8899ffa419be95eb59d808c..b4d10f06dca7b0612377ab6a0ec37d5f8063e33e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/listing.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -41,8 +41,7 @@ extern void setup_listing(WListing *l, char **strs, int nstrs, bool onecol);
 extern void deinit_listing(WListing *l);
 extern void fit_listing(GrBrush *brush, const WRectangle *geom, WListing *l);
 extern void draw_listing(GrBrush *brush, const WRectangle *geom, WListing *l, 
-                         bool complete, const char *style, 
-                         const char *selstyle);
+                         bool complete, GrAttr selattr);
 extern bool scrollup_listing(WListing *l);
 extern bool scrolldown_listing(WListing *l);
 extern bool listing_select(WListing *l, int i);
index 9eb7323f6d7b6f17f89a6b0b6587d1945f664b4f..aeef9ae942f90e873ba61508739673c744dee15f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/main.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -55,7 +55,8 @@ WBindmap *mod_query_wedln_bindmap=NULL;
 
 ModQueryConfig mod_query_config={
     250,
-    TRUE
+    TRUE,
+    FALSE
 };
 
 
@@ -68,6 +69,8 @@ ModQueryConfig mod_query_config={
  *      (default: true). \\
  *  \var{autoshowcompl_delay} & (integer) auto-show-completions delay
  *      in milliseconds (default: 250). \\
+ *  \var{caseicompl} & (boolean) Turn some completions case-insensitive
+ *      (default: false). \\
  * \end{tabularx}
  */
 EXTL_EXPORT
@@ -76,6 +79,7 @@ void mod_query_set(ExtlTab tab)
     ModQueryConfig *c=&mod_query_config;
 
     extl_table_gets_b(tab, "autoshowcompl", &c->autoshowcompl);
+    extl_table_gets_b(tab, "caseicompl", &c->caseicompl);
     
     if(extl_table_gets_i(tab, "autoshowcompl_delay",
                          &c->autoshowcompl_delay)){
@@ -87,6 +91,7 @@ void mod_query_set(ExtlTab tab)
  * Get module configuration. For more information see
  * \fnref{mod_query.set}.
  */
+EXTL_SAFE
 EXTL_EXPORT
 ExtlTab mod_query_get()
 {
@@ -94,6 +99,7 @@ ExtlTab mod_query_get()
     ExtlTab tab=extl_create_table();
     
     extl_table_sets_b(tab, "autoshowcompl", c->autoshowcompl);
+    extl_table_sets_b(tab, "caseicompl", c->caseicompl);
     extl_table_sets_i(tab, "autoshowcompl_delay", c->autoshowcompl_delay);
     
     return tab;
index 2d57b13d037634cb1c767610f7edae1974c52691..0a3f34feb728ebcf14ce62dc83440fc025cd3ef7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/main.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -20,6 +20,7 @@ INTRSTRUCT(ModQueryConfig);
 DECLSTRUCT(ModQueryConfig){
     int autoshowcompl_delay;
     bool autoshowcompl;
+    bool caseicompl;
 };
 
 
index 0f51738edceb6c7dde1058f5354a01cdf09cb18a..243f98785fafc317097fc52506531214f55c29f3 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/query/mod_query.lua -- Some common queries for Ion
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 -- 
 -- 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
@@ -31,14 +31,6 @@ local DIE_TIMEOUT_NO_ERRORCODE=2 -- 2 seconds
 -- Generic helper functions {{{
 
 
-function mod_query.make_completor(completefn)
-    local function completor(cp, str, point)
-        cp:set_completions(completefn(str, point))
-    end
-    return completor
-end
-
-
 --DOC
 -- Low-level query routine. \var{mplex} is the \type{WMPlex} to display
 -- the query in, \var{prompt} the prompt string, and \var{initvalue}
@@ -60,12 +52,13 @@ function mod_query.query(mplex, prompt, initvalue, handler, completor,
     end
 
     -- Check that no other queries are open in the mplex.
-    local l=mplex:managed_list()
-    for i, r in pairs(l) do
-        if obj_is(r, "WEdln") then
-            return
-        end
+    local ok=mplex:managed_i(function(r) 
+                                 return not obj_is(r, "WEdln") 
+                             end)
+    if not ok then
+        return
     end
+    
     local wedln=mod_query.do_query(mplex, prompt, initvalue, 
                                    handle_it, completor, cycle)
     if context then
@@ -175,6 +168,20 @@ function mod_query.file_completor(wedln, str)
 end
 
 
+function mod_query.get_initdir(mplex)
+    --if mod_query.last_dir then
+    --    return mod_query.last_dir
+    --end
+    local wd=(ioncore.get_dir_for(mplex) or os.getenv("PWD"))
+    if wd==nil then
+        wd="/"
+    elseif string.sub(wd, -1)~="/" then
+        wd=wd .. "/"
+    end
+    return wd
+end
+
+
 function mod_query.query_execfile(mplex, prompt, prog)
     assert(prog~=nil)
     local function handle_execwith(mplex, str)
@@ -200,39 +207,10 @@ function mod_query.query_execwith(mplex, prompt, dflt, prog, completor,
 end
 
 
-function mod_query.get_initdir(mplex)
-    --if mod_query.last_dir then
-    --    return mod_query.last_dir
-    --end
-    local wd=(ioncore.get_dir_for(mplex) or os.getenv("PWD"))
-    if wd==nil then
-        wd="/"
-    elseif string.sub(wd, -1)~="/" then
-        wd=wd .. "/"
-    end
-    return wd
-end
-
-
-local MAXDEPTH=10
-
+-- }}}
 
-function mod_query.complete_from_list(list, str)
-    local results={}
-    local len=string.len(str)
-    if len==0 then
-        results=list
-    else
-        for _, m in pairs(list) do
-            if string.sub(m, 1, len)==str then
-                table.insert(results, m)
-            end
-        end
-    end
-    
-    return results
-end    
 
+-- Completion helpers {{{
 
 local pipes={}
 
@@ -325,6 +303,85 @@ function mod_query.popen_completions(cp, cmd, fn, reshnd)
 end
 
 
+local function mk_completion_test(str, sub_ok, casei_ok)
+    if not str then
+        return function(s) return true end
+    end
+    
+    local function mk(str, sub_ok)
+        if sub_ok then
+            return function(s) return string.find(s, str, 1, true) end
+        else
+            local len=string.len(str)
+            return function(s) return string.sub(s, 1, len)==str end
+        end
+    end
+    
+    local casei=(casei_ok and mod_query.get().caseicompl)
+    
+    if not casei then
+        return mk(str, sub_ok)
+    else
+        local fn=mk(string.lower(str), sub_ok)
+        return function(s) return fn(string.lower(s)) end
+    end
+end
+
+
+local function mk_completion_add(entries, str, sub_ok, casei_ok)
+    local tst=mk_completion_test(str, sub_ok, casei_ok)
+    
+    return function(s) 
+               if s and tst(s) then
+                   table.insert(entries, s)
+               end
+           end
+end
+
+
+function mod_query.complete_keys(list, str, sub_ok, casei_ok)
+    local results={}
+    local test_add=mk_completion_add(results, str, sub_ok, casei_ok)
+    
+    for m, _ in pairs(list) do
+        test_add(m)
+    end
+
+    return results
+end    
+
+
+function mod_query.complete_name(str, iter)
+    local sub_ok_first=true
+    local casei_ok=true
+    local entries={}
+    local tst_add=mk_completion_add(entries, str, sub_ok_first, casei_ok)
+    
+    iter(function(reg)
+             tst_add(reg:name())
+             return true
+         end)
+    
+    if #entries==0 and not sub_ok_first then
+        local tst_add2=mk_completion_add(entries, str, true, casei_ok)
+        iter(function(reg)
+                 tst_add2(reg:name())
+                 return true
+             end)
+    end
+    
+    return entries
+end
+
+
+function mod_query.make_completor(completefn)
+    local function completor(cp, str, point)
+        cp:set_completions(completefn(str, point))
+    end
+    return completor
+end
+
+
 -- }}}
 
 
@@ -340,36 +397,24 @@ function mod_query.call_warn(mplex, fn)
 end
 
 
-function mod_query.complete_name(str, list)
-    local entries={}
-    local l=string.len(str)
-    for i, reg in pairs(list) do
-        local nm=reg:name()
-        if nm and string.sub(nm, 1, l)==str then
-            table.insert(entries, nm)
-        end
-    end
-    if #entries==0 then
-        for i, reg in pairs(list) do
-            local nm=reg:name()
-            if nm and string.find(nm, str, 1, true) then
-                table.insert(entries, nm)
-            end
-        end
-    end
-    return entries
-end
-
 function mod_query.complete_clientwin(str)
-    return mod_query.complete_name(str, ioncore.clientwin_list())
+    return mod_query.complete_name(str, ioncore.clientwin_i)
 end
 
+
 function mod_query.complete_workspace(str)
-    return mod_query.complete_name(str, ioncore.region_list("WGroupWS"))
+    local function iter(fn) 
+        return ioncore.region_i(function(obj)
+                                    return (not obj_is(obj, "WGroupWS")
+                                            or fn(obj))
+                                end)
+    end
+    return mod_query.complete_name(str, iter)
 end
 
+
 function mod_query.complete_region(str)
-    return mod_query.complete_name(str, ioncore.region_list())
+    return mod_query.complete_name(str, ioncore.region_i)
 end
 
 
@@ -383,6 +428,7 @@ function mod_query.gotoclient_handler(frame, str)
     end
 end
 
+
 function mod_query.attachclient_handler(frame, str)
     local cwin=ioncore.lookup_clientwin(str)
     
@@ -423,18 +469,37 @@ function mod_query.workspace_handler(mplex, name)
     local ws=ioncore.lookup_region(name, "WGroupWS")
     if ws then
         ws:goto()
-        return
-    end
+    else
+        local function create_handler(mplex_, layout)
+            if not layout or layout=="" then
+                layout="default"
+            end
+            
+            if not ioncore.getlayout(layout) then
+                mod_query.warn(mplex_, TR("Unknown layout"))
+            else
+                local scr=mplex:screen_of()
+                
+                local function mkws()
+                    local tmpl={name=name, switchto=true}
+                    if not ioncore.create_ws(scr, tmpl, layout) then
+                        error(TR("Unknown error"))
+                    end
+                end
 
-    local scr=mplex:screen_of()
-    
-    local function mkws()
-       if not ioncore.create_ws(scr, {name=name}) then
-            error(TR("Unknown error"))
+                mod_query.call_warn(mplex, mkws)
+            end
         end
-    end
 
-    mod_query.call_warn(mplex, mkws)
+        local function compl_layout(str)
+            local los=ioncore.getlayout(nil, true)
+            return mod_query.complete_keys(los, str, true, true)
+        end
+        
+        mod_query.query(mplex, TR("New workspace layout (default):"), nil,
+                        create_handler, mod_query.make_completor(compl_layout),
+                        "workspacelayout")
+    end
 end
 
 
@@ -504,10 +569,20 @@ end
 
 
 --DOC
--- This function asks for a name new for the workspace on which the
--- query resides.
-function mod_query.query_renameworkspace(mplex)
-    local ws=ioncore.find_manager(mplex, "WGroupWS")
+-- This function asks for a name new for the workspace \var{ws},
+-- or the one on which \var{mplex} resides, if it is not set.
+-- If \var{mplex} is not set, one is looked for.
+function mod_query.query_renameworkspace(mplex, ws)
+    if not mplex then
+        assert(ws)
+        mplex=ioncore.find_manager(ws, "WMPlex")
+    elseif not ws then
+        assert(mplex)
+        ws=ioncore.find_manager(mplex, "WGroupWS")
+    end
+    
+    assert(mplex and ws)
+    
     mod_query.query(mplex, TR("Workspace name:"), ws:name(),
                     function(mplex, str) ws:set_name(str) end,
                     nil, "framename")
@@ -766,6 +841,8 @@ end
 
 
 mod_query.known_hosts={}
+mod_query.hostnicks={}
+mod_query.ssh_completions={}
 
 
 function mod_query.get_known_hosts(mplex)
@@ -789,8 +866,6 @@ function mod_query.get_known_hosts(mplex)
 end
 
 
-mod_query.hostnicks={}
-
 function mod_query.get_hostnicks(mplex)
     mod_query.hostnicks={}
     local f
@@ -800,7 +875,7 @@ function mod_query.get_hostnicks(mplex)
     if h then
         f=io.open(h.."/.ssh/config")
     end
-    if not f then 
+    if not f then
         warn(TR("Failed to open ~/.ssh/config"))
         return
     end
@@ -837,21 +912,10 @@ function mod_query.complete_ssh(str)
     end
     
     local res = {}
-    
-    if string.len(host)==0 then
-        if string.len(user)==0 then
-            return mod_query.ssh_completions
-        end
-        
-        for _, v in ipairs(mod_query.ssh_completions) do
-            table.insert(res, user .. v)
-        end
-        return res
-    end
+    local tst = mk_completion_test(host, true, false)
     
     for _, v in ipairs(mod_query.ssh_completions) do
-        local s, e=string.find(v, host, 1, true)
-        if s==1 and e>=1 then
+        if tst(v) then
             table.insert(res, user .. v)
         end
     end
@@ -859,7 +923,6 @@ function mod_query.complete_ssh(str)
     return res
 end
 
-mod_query.ssh_completions={}
 
 --DOC
 -- This query asks for a host to connect to with SSH. 
@@ -1086,7 +1149,7 @@ function mod_query.query_menu(mplex, themenu, prompt)
     end
 
     local function xform_name(n, is_submenu)
-        return (string.lower(string.gsub(n, "[-%s]+", "-"))
+        return (string.lower(string.gsub(n, "[-/%s]+", "-"))
                 ..(is_submenu and "/" or ""))
     end
 
@@ -1116,13 +1179,8 @@ function mod_query.query_menu(mplex, themenu, prompt)
     local ntab=xform_menu({}, menu, "")
     
     local function complete(str)
-        local results={}
-        for s, e in pairs(ntab) do
-            if string.find(s, str, 1, true) then
-                table.insert(results, s)
-            end
-        end
-        return results
+        -- casei_ok false, because everything is already in lower case
+        return mod_query.complete_keys(ntab, str, true, false)
     end
     
     local function handle(mplex, str)
@@ -1188,14 +1246,16 @@ function mod_query.show_tree(mplex, reg, max_depth)
                       indent, reg:xid())
         end
         
-        if (not max_depth or max_depth > d) and reg.managed_list then
-            local mgd=reg:managed_list()
-            if #mgd > 0 then
-                s=s .. "\n" .. indent .. "---"
-                for k, v in pairs(mgd) do
-                    s=s .. "\n" .. get_info(v, indent, d+1)
-                end
-            end
+        if (not max_depth or max_depth > d) and reg.managed_i then
+            local first=true
+            reg:managed_i(function(sub)
+                              if first then
+                                  s=s .. "\n" .. indent .. "---"
+                                  first=false
+                              end
+                              s=s .. "\n" .. get_info(sub, indent, d+1)
+                              return true
+                          end)
         end
         
         return s
index 3b408d2d8afb17796c663dfe85dff926010bfb08..8c60cb1d67785207d4fbf96c4c97aaf1e751e3b9 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/query/mod_query_chdir.lua
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 -- 
 -- 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
index b56c087a4b24bc5d8e108af305927c71bbca053b..9318c897144d91e510d75734a15b8fbb1940b7f4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/query.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -20,7 +20,7 @@
 #include "wedln.h"
 
 
-static void create_cycle_binding(WEdln *wedln, XKeyEvent *ev, ExtlFn cycle)
+static void create_cycle_binding(WEdln *wedln, uint kcb, uint state, ExtlFn cycle)
 {
     WBindmap *bindmap=create_bindmap();
     WBinding b;
@@ -28,9 +28,9 @@ static void create_cycle_binding(WEdln *wedln, XKeyEvent *ev, ExtlFn cycle)
     if(bindmap==NULL)
         return;
         
-    b.ksb=XKeycodeToKeysym(ioncore_g.dpy, ev->keycode, 0);
-    b.kcb=ev->keycode;
-    b.state=ev->state;
+    b.ksb=XKeycodeToKeysym(ioncore_g.dpy, kcb, 0);
+    b.kcb=kcb;
+    b.state=state;
     b.act=BINDING_KEYPRESS;
     b.area=0;
     b.wait=FALSE;
@@ -67,7 +67,6 @@ WEdln *mod_query_do_query(WMPlex *mplex, const char *prompt, const char *dflt,
     WRectangle geom;
     WEdlnCreateParams fnp;
     WMPlexAttachParams par;
-    XKeyEvent *ev=ioncore_current_key_event();
     WEdln *wedln;
 
     fnp.prompt=prompt;
@@ -85,9 +84,13 @@ WEdln *mod_query_do_query(WMPlex *mplex, const char *prompt, const char *dflt,
                                       (WRegionCreateFn*)create_wedln,
                                       (void*)&fnp); 
                                       
-    if(wedln!=NULL && ev!=NULL && cycle!=extl_fn_none())
-        create_cycle_binding(wedln, ev, cycle);
+    if(wedln!=NULL && cycle!=extl_fn_none()){
+        uint kcb, state; 
+        bool sub;
         
+        if(ioncore_current_key(&kcb, &state, &sub) && !sub)
+            create_cycle_binding(wedln, kcb, state, cycle);
+    }
     
     return wedln;
 }
index 9387a17cc4a015bc597352364da207c76eb59f1a..87b60ee61c4bec176a8982f7a95acd7205234591 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/query.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 3043d05243dce58dda8823a9e2bdfeb410f5248c..fa5f0e4bd05b39f4db1ab3274ade136d05168817 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/wedln-wrappers.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 094f22cc45a702c8f4a49c15d3bb607bd0c90936..fa9193c5e9460312abc15eba5266aa9307a30754 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/wedln.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -25,6 +25,7 @@
 #include <ioncore/selection.h>
 #include <ioncore/event.h>
 #include <ioncore/regbind.h>
+#include <ioncore/gr-util.h>
 #include "edln.h"
 #include "wedln.h"
 #include "inputp.h"
@@ -50,12 +51,14 @@ static int calc_text_y(WEdln *wedln, const WRectangle *geom)
 
 static int wedln_draw_strsect(WEdln *wedln, const WRectangle *geom, 
                               int x, int y, const char *str, int len,
-                              const char *attr)
+                              GrAttr a)
 {
     if(len==0)
         return 0;
     
-    grbrush_draw_string(WEDLN_BRUSH(wedln), x, y, str, len, TRUE, attr);
+    grbrush_set_attr(WEDLN_BRUSH(wedln), a);
+    grbrush_draw_string(WEDLN_BRUSH(wedln), x, y, str, len, TRUE);
+    grbrush_unset_attr(WEDLN_BRUSH(wedln), a);
     
     return grbrush_get_text_width(WEDLN_BRUSH(wedln), str, len);
 }
@@ -73,9 +76,34 @@ static void dispu(const char* s, int l)
 }
 #endif
 
-#define DSTRSECT(LEN, INV) \
-    if(LEN>0){tx+=wedln_draw_strsect(wedln, geom, geom->x+tx, ty, str, LEN, INV); \
-     str+=LEN; len-=LEN;}
+#define DSTRSECT(LEN, A)                                    \
+    if(LEN>0){                                              \
+        tx+=wedln_draw_strsect(wedln, geom, geom->x+tx, ty, \
+                               str, LEN, GR_ATTR(A));       \
+        str+=LEN; len-=LEN;                                 \
+    }
+
+
+GR_DEFATTR(active);
+GR_DEFATTR(inactive);
+GR_DEFATTR(normal);
+GR_DEFATTR(selection);
+GR_DEFATTR(cursor);
+GR_DEFATTR(prompt);
+GR_DEFATTR(info);
+
+static void init_attr()
+{
+    GR_ALLOCATTR_BEGIN;
+    GR_ALLOCATTR(active);
+    GR_ALLOCATTR(inactive);
+    GR_ALLOCATTR(normal);
+    GR_ALLOCATTR(selection);
+    GR_ALLOCATTR(cursor);
+    GR_ALLOCATTR(prompt);
+    GR_ALLOCATTR(info);
+    GR_ALLOCATTR_END;
+}
 
 
 static void wedln_do_draw_str_box(WEdln *wedln, const WRectangle *geom,
@@ -83,43 +111,30 @@ static void wedln_do_draw_str_box(WEdln *wedln, const WRectangle *geom,
                                   int mark, int tx)
 {
     int len=strlen(str), ll=0, ty=0;
-    const char *normalstyle=(REGION_IS_ACTIVE(wedln)
-                             ? "active-normal" : "inactive-normal");
-    const char *selectionstyle=(REGION_IS_ACTIVE(wedln)
-                                ? "active-selection" : "inactive-selection");
-    const char *cursorstyle=(REGION_IS_ACTIVE(wedln)
-                             ? "active-cursor" : "inactive-cursor");
-    
-    /*if(tx<geom->w){
-        WRectangle g=*geom;
-        g.x+=tx;
-        g.w-=tx;
-        grbrush_clear_area(WEDLN_BRUSH(wedln), &g);
-    }*/
     
     ty=calc_text_y(wedln, geom);
 
     if(mark<=cursor){
         if(mark>=0){
-            DSTRSECT(mark, normalstyle);
-            DSTRSECT(cursor-mark, selectionstyle);
+            DSTRSECT(mark, normal);
+            DSTRSECT(cursor-mark, selection);
         }else{
-            DSTRSECT(cursor, normalstyle);
+            DSTRSECT(cursor, normal);
         }
         if(len==0){
             tx+=wedln_draw_strsect(wedln, geom, geom->x+tx, ty,
-                                   " ", 1, cursorstyle);
+                                   " ", 1, GR_ATTR(cursor));
         }else{
             ll=str_nextoff(str, 0);
-            DSTRSECT(ll, cursorstyle);
+            DSTRSECT(ll, cursor);
         }
     }else{
-        DSTRSECT(cursor, normalstyle);
+        DSTRSECT(cursor, normal);
         ll=str_nextoff(str, 0);
-        DSTRSECT(ll, cursorstyle);
-        DSTRSECT(mark-cursor-ll, selectionstyle);
+        DSTRSECT(ll, cursor);
+        DSTRSECT(mark-cursor-ll, selection);
     }
-    DSTRSECT(len, normalstyle);
+    DSTRSECT(len, normal);
 
     if(tx<geom->w){
         WRectangle g=*geom;
@@ -150,7 +165,8 @@ static void wedln_draw_str_box(WEdln *wedln, const WRectangle *geom,
     if(dstart!=0)
         tx=grbrush_get_text_width(WEDLN_BRUSH(wedln), str+vstart, dstart);
 
-    grbrush_begin(WEDLN_BRUSH(wedln), geom, GRBRUSH_AMEND|GRBRUSH_NEED_CLIP);
+    grbrush_begin(WEDLN_BRUSH(wedln), geom, 
+                  GRBRUSH_AMEND|GRBRUSH_KEEP_ATTR|GRBRUSH_NEED_CLIP);
     
     wedln_do_draw_str_box(wedln, geom, str+vstart+dstart, point, mark, tx);
 
@@ -350,17 +366,10 @@ void wedln_draw_completions(WEdln *wedln, bool complete)
     WRectangle geom;
     
     if(wedln->compl_list.strs!=NULL && WEDLN_BRUSH(wedln)!=NULL){
-        const char *style=(REGION_IS_ACTIVE(wedln) 
-                           ? "active" 
-                           : "inactive");
-        const char *selstyle=(REGION_IS_ACTIVE(wedln) 
-                              ? "active-selection" 
-                              : "inactive-selection");
-        
         get_completions_geom(wedln, G_CURRENT, &geom);
         
         draw_listing(WEDLN_BRUSH(wedln), &geom, &(wedln->compl_list), 
-                     complete, style, selstyle);
+                     complete, GR_ATTR(selection));
     }
 }
 
@@ -369,7 +378,6 @@ void wedln_draw_textarea(WEdln *wedln)
 {
     WRectangle geom;
     int ty;
-    const char *style=(REGION_IS_ACTIVE(wedln) ? "active" : "inactive");
 
     if(WEDLN_BRUSH(wedln)==NULL)
         return;
@@ -378,30 +386,29 @@ void wedln_draw_textarea(WEdln *wedln)
     
     /*grbrush_begin(WEDLN_BRUSH(wedln), &geom, GRBRUSH_AMEND);*/
     
-    grbrush_draw_border(WEDLN_BRUSH(wedln), &geom, style);
+    grbrush_draw_border(WEDLN_BRUSH(wedln), &geom);
 
     get_inner_geom(wedln, G_CURRENT, &geom);
 
     ty=calc_text_y(wedln, &geom);
 
+    grbrush_set_attr(WEDLN_BRUSH(wedln), GR_ATTR(prompt));
+   
     if(wedln->prompt!=NULL){
-        const char *promptstyle=(REGION_IS_ACTIVE(wedln) 
-                                 ? "active-prompt" 
-                                 : "inactive-prompt");
         grbrush_draw_string(WEDLN_BRUSH(wedln), geom.x, ty,
-                            wedln->prompt, wedln->prompt_len, TRUE, 
-                            promptstyle);
+                            wedln->prompt, wedln->prompt_len, TRUE);
     }
     
     if(wedln->info!=NULL){
         int x=geom.x+geom.w-wedln->info_w;
-        const char *promptstyle=(REGION_IS_ACTIVE(wedln) 
-                                 ? "active-prompt-info" 
-                                 : "inactive-prompt-info");
+        
+        grbrush_set_attr(WEDLN_BRUSH(wedln), GR_ATTR(info));
         grbrush_draw_string(WEDLN_BRUSH(wedln), x, ty,
-                            wedln->info, wedln->info_len, TRUE
-                            promptstyle);
+                            wedln->info, wedln->info_len, TRUE);
+        grbrush_unset_attr(WEDLN_BRUSH(wedln), GR_ATTR(info));
     }
+
+    grbrush_unset_attr(WEDLN_BRUSH(wedln), GR_ATTR(prompt));
         
     get_textarea_geom(wedln, G_CURRENT, &geom);
     
@@ -412,7 +419,7 @@ void wedln_draw_textarea(WEdln *wedln)
 }
 
 
-void wedln_draw(WEdln *wedln, bool complete)
+static void wedln_draw_(WEdln *wedln, bool complete, bool completions)
 {
     WRectangle g;
     int f=(complete ? 0 : GRBRUSH_NO_CLEAR_OK);
@@ -424,13 +431,24 @@ void wedln_draw(WEdln *wedln, bool complete)
     
     grbrush_begin(WEDLN_BRUSH(wedln), &g, f);
     
-    wedln_draw_completions(wedln, FALSE);
+    grbrush_set_attr(WEDLN_BRUSH(wedln), REGION_IS_ACTIVE(wedln) 
+                                         ? GR_ATTR(active) 
+                                         : GR_ATTR(inactive));
+
+    if(completions)
+        wedln_draw_completions(wedln, FALSE);
+    
     wedln_draw_textarea(wedln);
     
     grbrush_end(WEDLN_BRUSH(wedln));
 }
 
 
+void wedln_draw(WEdln *wedln, bool complete)
+{
+    wedln_draw_(wedln, complete, TRUE);
+}
+
 /*}}} */
 
 
@@ -464,7 +482,7 @@ static void wedln_set_info(WEdln *wedln, const char *info)
     get_textarea_geom(wedln, G_CURRENT, &tageom);
     wedln_update_cursor(wedln, tageom.w);
     
-    wedln_draw_textarea(wedln);
+    wedln_draw_(wedln, FALSE, FALSE);
 }
 
 
@@ -526,7 +544,8 @@ static void free_completions(char **ptr, int i)
 {
     while(i>0){
         i--;
-        free(ptr[i]);
+        if(ptr[i]!=NULL)
+            free(ptr[i]);
     }
     free(ptr);
 }
@@ -595,19 +614,14 @@ void wedln_set_completions(WEdln *wedln, ExtlTab completions, int cycle)
     extl_table_gets_s(completions, "common_beg", &beg);
     extl_table_gets_s(completions, "common_end", &end);
     
-    if(wedln_do_set_completions(wedln, ptr, n, beg, end, cycle, FALSE))
-        return;
+    if(!wedln_do_set_completions(wedln, ptr, n, beg, end, cycle, FALSE))
+        wedln_hide_completions(wedln);
+
+    return;
     
 allocfail:
     wedln_hide_completions(wedln);
     free_completions(ptr, i);
-    while(i>0){
-        i--;
-        /* edln_do_completions may NULL things */
-        if(ptr[i]!=NULL)
-            free(ptr[i]);
-    }
-    free(ptr);
 }
     
 
@@ -899,6 +913,8 @@ static bool wedln_init(WEdln *wedln, WWindow *par, const WFitParams *fp,
 {
     wedln->vstart=0;
 
+    init_attr();
+    
     if(!wedln_init_prompt(wedln, params->prompt))
         return FALSE;
     
index 40c052973f11226d9c22ad1465ab0769693f4b24..e966b41790c2428e2deac9691a9bc54541e597f9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/wedln.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index aa6002da42518053a62dbe45794929bfee4e5873..b8c5fa4bf24e400ab7f8b8e5ee6e32fa56640a7e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/wmessage.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -16,6 +16,7 @@
 #include <ioncore/strings.h>
 #include <ioncore/global.h>
 #include <ioncore/event.h>
+#include <ioncore/gr-util.h>
 #include "wmessage.h"
 #include "inputp.h"
 
@@ -77,9 +78,21 @@ static void wmsg_calc_size(WMessage *wmsg, WRectangle *geom)
 /*{{{ Draw */
 
 
+GR_DEFATTR(active);
+GR_DEFATTR(inactive);
+
+
+static void init_attr()
+{
+    GR_ALLOCATTR_BEGIN;
+    GR_ALLOCATTR(active);
+    GR_ALLOCATTR(inactive);
+    GR_ALLOCATTR_END;
+}
+
+
 static void wmsg_draw(WMessage *wmsg, bool complete)
 {
-    const char *style=(REGION_IS_ACTIVE(wmsg) ? "active" : "inactive");
     WRectangle geom;
     
     if(WMSG_BRUSH(wmsg)==NULL)
@@ -90,8 +103,12 @@ static void wmsg_draw(WMessage *wmsg, bool complete)
     grbrush_begin(WMSG_BRUSH(wmsg), &geom, 
                   (complete ? 0 : GRBRUSH_NO_CLEAR_OK));
     
+    grbrush_set_attr(WMSG_BRUSH(wmsg), REGION_IS_ACTIVE(wmsg)
+                                       ? GR_ATTR(active)
+                                       : GR_ATTR(inactive));
+    
     draw_listing(WMSG_BRUSH(wmsg), &geom, &(wmsg->listing), 
-                 FALSE, style, style);
+                 FALSE, GRATTR_NONE);
     
     grbrush_end(WMSG_BRUSH(wmsg));
 }
@@ -174,6 +191,8 @@ static bool wmsg_init(WMessage *wmsg, WWindow *par, const WFitParams *fp,
         p=p+l+1;
     }
     
+    init_attr();
+    
     init_listing(&(wmsg->listing));
     setup_listing(&(wmsg->listing), ptr, k, TRUE);
     
index bc05b52f3c8a62c924a40e2da2cab1d3e218481f..be1bfca0da04b9b29435fe9114d93e7cc849e849 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_query/wmessage.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6971f7d1d6354f77ee926053f6ef7e43443c0b4e..d47a546a701125bcae6262a0db1c80e2a66abbab 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_sm/sm.c
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * 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
index d64f671f04f6c12886a88afdb50787e7c71b9d4b..eb5b7a272ed4a08ccbb93df54243f58ba1f706d3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_sm/sm_mathcwin.c
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  * 
  * Based on the code of the 'sm' module for Ion1 by an unknown contributor.
  *
index 2dd45f30d37ba028f164e0ed31f9f84a6d29ea72..def2a97ea1fa4c6f45c405eb1a6d7e167a7ccb73 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_sm/sm_mathcwin.c
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  * 
  * Based on the code of the 'sm' module for Ion1 by an unknown contributor.
  *
index 7472e8b83e7794c81e099f0d7c326bbec8dae101..a4373d097d76c67efd2b6f25ec631030c4668a93 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_sm/sm_session.c
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  * 
  * Based on the code of the 'sm' module for Ion1 by an unknown contributor.
  *
index 306bf99ad89dc78ec81b94f5cb0292682253f52a..3fa353284d25ab67472c1da4345365e947a37a2b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_sm/sm_session.h
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  * 
  * Based on the code of the 'sm' module for Ion1 by an unknown contributor.
  *
index b827ae2fa55c5571ce6838474e074f90355d07ac..c9f13b43bcd2c2c34626c270cad817ba60ea9b86 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_sp/main.c
  *
- * Copyright (c) Tuomo Valkonen 2004-2006
+ * Copyright (c) Tuomo Valkonen 2004-2007
  *
  * 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
index f290b35451b4e18b34fc23807229f82bcccfe153..45b85e0d3b3ce4a5505565d89722406d6224bd6c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_sp/main.h
  *
- * Copyright (c) Tuomo Valkonen 2004-2006.
+ * Copyright (c) Tuomo Valkonen 2004-2007.
  *
  * 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
index 29e9f0230a093be52c260e1a580d5489d084e732..19ba93a25582f74b92ee1ca2b3406a1654922f24 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_statusbar/draw.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -109,7 +109,7 @@ void statusbar_calculate_xs(WStatusBar *sb)
 
 static void draw_elems(GrBrush *brush, WRectangle *g, int ty,
                        WSBElem *elems, int nelems, bool needfill, 
-                       const char *dfltattr, bool complete)
+                       bool complete)
 {
     int prevx=g->x;
     int maxx=g->x+g->w;
@@ -125,8 +125,15 @@ static void draw_elems(GrBrush *brush, WRectangle *g, int ty,
             const char *s=(elems->text!=NULL
                            ? elems->text 
                            : STATUSBAR_NX_STR);
-            grbrush_draw_string(brush, elems->x, ty, s, strlen(s), needfill, 
-                                elems->attr ? elems->attr : dfltattr);
+            
+            grbrush_set_attr(brush, elems->attr);
+            grbrush_set_attr(brush, elems->meter);
+                
+            grbrush_draw_string(brush, elems->x, ty, s, strlen(s), needfill);
+            
+            grbrush_unset_attr(brush, elems->meter);
+            grbrush_unset_attr(brush, elems->attr);
+            
             prevx=elems->x+elems->text_w;
         }
         elems++;
@@ -162,7 +169,7 @@ void statusbar_draw(WStatusBar *sb, bool complete)
     
     grbrush_begin(sb->brush, &g, (complete ? 0 : GRBRUSH_NO_CLEAR_OK));
     
-    grbrush_draw_border(sb->brush, &g, NULL);
+    grbrush_draw_border(sb->brush, &g);
     
     if(sb->elems==NULL)
         return;
@@ -174,8 +181,7 @@ void statusbar_draw(WStatusBar *sb, bool complete)
 
     ty=(g.y+fnte.baseline+(g.h-fnte.max_height)/2);
         
-    draw_elems(sb->brush, &g, ty, sb->elems, sb->nelems,
-               TRUE, NULL, complete);
+    draw_elems(sb->brush, &g, ty, sb->elems, sb->nelems, TRUE, complete);
     
     grbrush_end(sb->brush);
 }
index c30a86fe3b4c2281b000c99ccac1d427c6b9a5eb..0724973b31a68eb6084a283e95048a5cb448e22c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_statusbar/draw.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 9ec4f20c0aac1a91ac5f346a38c8bc5f6a7dbbe5..bf0e1d0034c101fe1ef823d7a2dc24976945a6b8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_statusbar/main.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -94,7 +94,6 @@ static bool wait_statusd_init(int outfd, int errfd, ExtlFn dh, ExtlFn eh)
     int nfds=maxof(outfd, errfd);
     int retval;
     bool dummy, doneseen, eagain=FALSE;
-    const char *timeout_msg=TR("ion-statusd launch timeout.");
     
     if(gettimeofday(&endtime, NULL)!=0){
         warn_err();
index b8ec8d2ce7716f2139816aa61bee49df73f959e4..fa4dbfdd62bd79ac0fec99b4d1ac7c1586483e8b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_statusbar/main.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index aeef9cb34a6c6db8b3cc4e4bdc89ae7c192d4d50..3164927046c790397deacc3d6fb25437c282ff1f 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- ion/mod_statusbar/mod_statusbar.lua
 -- 
--- Copyright (c) Tuomo Valkonen 2004-2006.
+-- Copyright (c) Tuomo Valkonen 2004-2007.
 --
 -- 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
index 1568b9fcf5c354b7316c2bd8ab023008da288c27..261560c12889e4783d8cd1854cb723d591e74c1b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_statusbar/statusbar.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -10,6 +10,7 @@
  */
 
 #include <string.h>
+#include <limits.h>
 
 #include <libtu/objp.h>
 #include <libtu/minmax.h>
@@ -23,6 +24,7 @@
 #include <ioncore/event.h>
 #include <ioncore/resize.h>
 #include <ioncore/gr.h>
+#include <ioncore/gr-util.h>
 #include <ioncore/names.h>
 #include <ioncore/strings.h>
 #include <ioncore/basicpholder.h>
@@ -42,7 +44,6 @@ static void statusbar_rearrange(WStatusBar *sb, bool rs);
 static void do_calc_systray_w(WStatusBar *p, WSBElem *el);
 static void statusbar_calc_systray_w(WStatusBar *p);
 
-
 static WStatusBar *statusbars=NULL;
 
 
@@ -113,15 +114,16 @@ void statusbar_deinit(WStatusBar *p)
 
 /*{{{ Content stuff */
 
+
 static void init_sbelem(WSBElem *el)
 {
     el->type=WSBELEM_NONE;
-    el->meter=NULL;
     el->text_w=0;
     el->text=NULL;
     el->max_w=0;
     el->tmpl=NULL;
-    el->attr=NULL;
+    el->meter=STRINGID_NONE;
+    el->attr=STRINGID_NONE;
     el->stretch=0;
     el->align=WSBELEM_ALIGN_CENTER;
     el->zeropad=0;
@@ -130,6 +132,20 @@ static void init_sbelem(WSBElem *el)
 }
 
 
+static bool gets_stringstore(ExtlTab t, const char *str, StringId *id)
+{
+    char *s;
+    
+    if(extl_table_gets_s(t, str, &s)){
+        *id=stringstore_alloc(s);
+        free(s);
+        return (*id!=STRINGID_NONE);
+    }
+    
+    return FALSE;
+}
+
+    
 static WSBElem *get_sbelems(ExtlTab t, int *nret, int *filleridxret)
 {
     int i, n=extl_table_get_n(t);
@@ -157,15 +173,20 @@ static WSBElem *get_sbelems(ExtlTab t, int *nret, int *filleridxret)
                 if(el[i].type==WSBELEM_TEXT || el[i].type==WSBELEM_STRETCH){
                     extl_table_gets_s(tt, "text", &(el[i].text));
                 }else if(el[i].type==WSBELEM_METER){
-                    extl_table_gets_s(tt, "meter", &(el[i].meter));
+                    gets_stringstore(tt, "meter", &(el[i].meter));
                     extl_table_gets_s(tt, "tmpl", &(el[i].tmpl));
                     extl_table_gets_i(tt, "align", &(el[i].align));
                     extl_table_gets_i(tt, "zeropad", &(el[i].zeropad));
                     el[i].zeropad=maxof(el[i].zeropad, 0);
                 }else if(el[i].type==WSBELEM_SYSTRAY){
-                    extl_table_gets_s(tt, "meter", &(el[i].meter));
+                    const char *tmp;
+                    
+                    gets_stringstore(tt, "meter", &(el[i].meter));
                     extl_table_gets_i(tt, "align", &(el[i].align));
-                    if(el[i].meter==NULL || strcmp(el[i].meter, "systray")==0)
+                    
+                    tmp=stringstore_get(el[i].meter);
+                    
+                    if(tmp==NULL || strcmp(tmp, "systray")==0)
                         systrayidx=i;
                 }else if(el[i].type==WSBELEM_FILLER){
                     *filleridxret=i;
@@ -198,12 +219,12 @@ static void free_sbelems(WSBElem *el, int n)
     for(i=0; i<n; i++){
         if(el[i].text!=NULL)
             free(el[i].text);
-        if(el[i].meter!=NULL)
-            free(el[i].meter);
         if(el[i].tmpl!=NULL)
             free(el[i].tmpl);
-        if(el[i].attr!=NULL)
-            free(el[i].attr);
+        if(el[i].meter!=STRINGID_NONE)
+            stringstore_free(el[i].meter);
+        if(el[i].attr!=STRINGID_NONE)
+            stringstore_free(el[i].attr);
         if(el[i].traywins!=NULL)
             ptrlist_clear(&el[i].traywins);
     }
@@ -332,7 +353,7 @@ void statusbar_size_hints(WStatusBar *p, WSizeHints *h)
     h->min_height=p->natural_h;
     
     h->max_set=TRUE;
-    h->max_width=p->natural_w;
+    h->max_width=INT_MAX;/*p->natural_w;*/
     h->max_height=p->natural_h;
 }
 
@@ -354,17 +375,22 @@ static WSBElem *statusbar_associate_systray(WStatusBar *sb, WRegion *reg)
         extl_table_gets_s(cwin->proptab, "statusbar", &name);
     
     for(i=0; i<sb->nelems; i++){
+        const char *meter;
+        
         if(sb->elems[i].type!=WSBELEM_SYSTRAY)
             continue;
-        if(sb->elems[i].meter==NULL){
+        
+        meter=stringstore_get(sb->elems[i].meter);
+        
+        if(meter==NULL){
             fbel=&sb->elems[i];
             continue;
         }
-        if(name!=NULL && strcmp(sb->elems[i].meter, name)==0){
+        if(name!=NULL && strcmp(meter, name)==0){
             el=&sb->elems[i];
             break;
         }
-        if(strcmp(sb->elems[i].meter, "systray")==0)
+        if(strcmp(meter, "systray")==0)
             fbel=&sb->elems[i];
     }
     
@@ -721,7 +747,7 @@ ExtlTab statusbar_get_template_table(WStatusBar *sb)
         
         extl_table_sets_i(tt, "type", sb->elems[i].type);
         extl_table_sets_s(tt, "text", sb->elems[i].text);
-        extl_table_sets_s(tt, "meter", sb->elems[i].meter);
+        extl_table_sets_s(tt, "meter", stringstore_get(sb->elems[i].meter));
         extl_table_sets_s(tt, "tmpl", sb->elems[i].tmpl);
         extl_table_sets_i(tt, "align", sb->elems[i].align);
         extl_table_sets_i(tt, "zeropad", sb->elems[i].zeropad);
@@ -844,6 +870,8 @@ void statusbar_update(WStatusBar *sb, ExtlTab t)
         return;
     
     for(i=0; i<sb->nelems; i++){
+        const char *meter;
+        
         el=&(sb->elems[i]);
         
         if(el->type!=WSBELEM_METER)
@@ -854,16 +882,18 @@ void statusbar_update(WStatusBar *sb, ExtlTab t)
             el->text=NULL;
         }
 
-        if(el->attr!=NULL){
-            free(el->attr);
-            el->attr=NULL;
+        if(el->attr!=GRATTR_NONE){
+            stringstore_free(el->attr);
+            el->attr=GRATTR_NONE;
         }
         
-        if(el->meter!=NULL){
+        meter=stringstore_get(el->meter);
+        
+        if(meter!=NULL){
             const char *str;
             char *attrnm;
             
-            extl_table_gets_s(t, el->meter, &(el->text));
+            extl_table_gets_s(t, meter, &(el->text));
             
             if(el->text==NULL){
                 str=STATUSBAR_NX_STR;
@@ -900,9 +930,13 @@ void statusbar_update(WStatusBar *sb, ExtlTab t)
                 grow=TRUE;
             }
             
-            attrnm=scat(el->meter, "_hint");
+            attrnm=scat(meter, "_hint");
             if(attrnm!=NULL){
-                extl_table_gets_s(t, attrnm, &(el->attr));
+                char *s;
+                if(extl_table_gets_s(t, attrnm, &s)){
+                    el->attr=stringstore_alloc(s);
+                    free(s);
+                }
                 free(attrnm);
             }
         }
index 73999ad33be879237f4c5a519ab6436fd4551e16..8392f166a589d231f8410020aa29022abc997ce4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_statusbar/statusbar.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -48,10 +48,10 @@ DECLSTRUCT(WSBElem){
     int stretch;
     int text_w;
     char *text;
-    char *meter;
     int max_w;
     char *tmpl;
-    char *attr;
+    StringId meter;
+    StringId attr;
     int zeropad;
     int x;
     PtrList *traywins;
index 5901c1c1eb032efb51c0f3c5f7da62a34ea69b82..47878700806c2fd6a3e6f87860436dfa40df6024 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/main.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 35d9ddf5a36d4ec58e815d6ffa78b3152ede822b..08bb4464a15cce955918cf4733814048de9b8944 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/main.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index c86a80a94f6bbb2fc69a88b6b034d1d3b83bb0ea..48365528a2c2c16efc17ce8d35daf0135f8fef1b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/ops.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
  * (at your option) any later version.
  */
 
-#include <libtu/objp.h>
-
 #include <ioncore/common.h>
 #include <ioncore/mplex.h>
 #include <ioncore/focus.h>
+#include <ioncore/return.h>
 #include <ioncore/group.h>
-#include <ioncore/group-ws.h>
-#include <ioncore/framedpholder.h>
 #include "tiling.h"
 
 
-static WGroup *find_group(WRegion *reg, bool *detach_framed)
-{
-    WRegion *mgr=REGION_MANAGER(reg);
-    bool was_grouped=FALSE;
-    
-    if(OBJ_IS(mgr, WMPlex)){
-        WMPlex *mplex=(WMPlex*)mgr;
-        *detach_framed=TRUE;
-        mgr=REGION_MANAGER(mgr);
-        if(OBJ_IS(mgr, WGroup)){
-            assert(mplex->mgd!=NULL);
-            if(mplex->mgd->reg==reg && mplex->mgd->mgr_next==NULL){
-                /* Nothing to detach */
-                return NULL;
-            }
-        }
-    }else{
-        was_grouped=OBJ_IS(mgr, WGroup);
-        *detach_framed=FALSE;
-    }
-    
-    while(mgr!=NULL){
-        mgr=REGION_MANAGER(mgr);
-        if(OBJ_IS(mgr, WGroup))
-            break;
-    }
-
-    if(mgr==NULL && was_grouped)
-        warn(TR("Already detached."));
-    
-    return (WGroup*)mgr;
-}
-
-
-static void get_relative_geom(WRectangle *g, WRegion *reg, WRegion *mgr)
-{
-    WWindow *rel=REGION_PARENT(mgr), *w;
-    
-    *g=REGION_GEOM(reg);
-    
-    for(w=REGION_PARENT(reg); 
-        w!=rel && (WRegion*)w!=mgr; 
-        w=REGION_PARENT(w)){
-        
-        g->x+=REGION_GEOM(w).x;
-        g->y+=REGION_GEOM(w).y;
-    }
-}
-
-
-/*EXTL_DOC
- * Detach \var{reg}, i.e. make it managed by its nearest ancestor
- * \type{WGroup}, framed if \var{reg} is not itself \type{WFrame}.
- */
-EXTL_EXPORT
-bool mod_tiling_detach(WRegion *reg)
-{
-    bool detach_framed=!OBJ_IS(reg, WFrame);
-    WGroupAttachParams ap=GROUPATTACHPARAMS_INIT;
-    WRegionAttachData data;
-    WGroup *grp;
-    
-    grp=find_group(reg, &detach_framed);
-    
-    if(grp==NULL)
-        return FALSE;
-    
-    ap.switchto_set=TRUE;
-    ap.switchto=region_may_control_focus(reg);
-    
-    ap.geom_set=TRUE;
-    get_relative_geom(&ap.geom, reg, (WRegion*)grp);
-    
-    /* TODO: Retain (root-relative) geometry of reg for framed 
-     * detach instead of making a frame of this size?
-     */
-    
-    data.type=REGION_ATTACH_REPARENT;
-    data.u.reg=reg;
-    
-    if(detach_framed){
-        WFramedParam fp=FRAMEDPARAM_INIT;
-        
-        return (region_attach_framed((WRegion*)grp, &fp,
-                                     (WRegionAttachFn*)group_do_attach,
-                                     &ap, &data)!=NULL);
-    }else{
-        return (group_do_attach(grp, &ap, &data)!=NULL);
-    }
-}
-
-
 static WRegion *mkbottom_fn(WWindow *parent, const WFitParams *fp, 
                             void *param)
 {
index 586385d779bb204070cff1d53cdb3d0544e76c50..480e02d052fe8fc7d1cce81deba8e17cf806fc54 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * ion/panews/panehandle.c
+ * ion/mod_tiling/panehandle.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -113,7 +113,7 @@ static void panehandle_draw(WPaneHandle *pwin, bool complete)
     
     grbrush_begin(pwin->brush, &g, (complete ? 0 : GRBRUSH_NO_CLEAR_OK));
     
-    grbrush_draw_borderline(pwin->brush, &g, NULL, pwin->bline);
+    grbrush_draw_borderline(pwin->brush, &g, pwin->bline);
     
     grbrush_end(pwin->brush);
 }
index c4ad184fa08b5e51ee25c55e71485d6c4c1015d0..fe06f3efca66afa4e8a3f983d31c639e45cf1ad8 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * ion/panews/panehandle.h
+ * ion/mod_tiling/panehandle.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 47cfa76fccb83def64e6922adee1dbdf1fd66dea..07de5f47d7db138837dec53db8c83732c41cecdd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/placement.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 9094b626cfbba4ec77b52f2a55a4781ab41f8331..a61f892d7e76eb36fa958fd8794e4e853ea141ec 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/placement.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index d1c55f241d8029426922a3cb1f22b048d23fcf1c..352ba412147bb8f27da9bfe8c20536354cd9facb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/split-stdisp.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 5d41fe1f86193d400806bc124420c3c0edeb3825..4f6ca592742f9478269b2ec21dcaf3ec60913f7c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/split-stdisp.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 54864d7b93bfbb2ea71b711cf5b773e44f69144c..c3edc5e8bc3acff293ca12efe265cb858c4ada09 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/split.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index fa7412205a80e0e3b693879146e5716e90fbba1c..10a0e5fb7730c2e0d8455a5d25e47b509c5a3b1b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/split.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 6ab6b316bce575c9311aa495b7ae9e0b269e22b0..ff71afd4631cf538ccf1fcecb782edcfc9ea808b 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * ion/panews/splitext.c
+ * ion/mod_tiling/splitext.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 9bb428effc4795d385568a8a4b61b91e97c781f2..8d51b595991f9910a5e2788f7c612e3f370f6dee 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * ion/panews/splitfloat.h
+ * ion/mod_tiling/splitfloat.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -9,8 +9,8 @@
  * (at your option) any later version.
  */
 
-#ifndef ION_PANEWS_SPLITFLOAT_H
-#define ION_PANEWS_SPLITFLOAT_H
+#ifndef ION_MOD_TILING_SPLITFLOAT_H
+#define ION_MOD_TILING_SPLITFLOAT_H
 
 #include <ioncore/common.h>
 #include <ioncore/gr.h>
@@ -53,4 +53,4 @@ extern WSplitRegion *splittree_split_floating(WSplit *node, int dir,
                                               WRegionSimpleCreateFn *fn, 
                                               WTiling *ws);
 
-#endif /* ION_PANEWS_SPLITFLOAT_H */
+#endif /* ION_MOD_TILING_SPLITFLOAT_H */
index 2ab56b01c11cddc2cbadac90b71b66eb29d45738..159f001a0a9af20f7980469f19dc9f3fc0ae10f1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/tiling.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -731,7 +731,7 @@ void tiling_managed_remove(WTiling *ws, WRegion *reg)
     
     if(!ds){
         if(other==NULL)
-            mainloop_defer_destroy((Obj*)ws);
+            region_dispose((WRegion*)ws, mcf);
         else if(act && mcf)
             region_warp(other);
     }
@@ -1125,17 +1125,20 @@ WRegion *tiling_current(WTiling *ws)
 
 
 /*EXTL_DOC
- * Returns a list of regions managed by the workspace (frames, mostly).
+ * Iterate over managed regions of \var{ws} until \var{iterfn} returns
+ * \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
  */
 EXTL_SAFE
 EXTL_EXPORT_MEMBER
-ExtlTab tiling_managed_list(WTiling *ws)
+bool tiling_managed_i(WTiling *ws, ExtlFn iterfn)
 {
     PtrListIterTmp tmp;
     
     ptrlist_iter_init(&tmp, ws->managed_list);
     
-    return extl_obj_iterable_to_table((ObjIterator*)ptrlist_iter, &tmp);
+    return extl_iter_objlist_(iterfn, (ObjIterator*)ptrlist_iter, &tmp);
 }
 
 
index 5b7a8e7724f536b26c2220ccc3c39a21c24dea6d..7d9346973ced3460bc20cc23e851e1a15cfd2d65 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/mod_tiling/tiling.h
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
index 84c3946182f61dae1ce62666802a09c8afe18c31..0bfbed5f1799b75f05e8f3b25a603e901f4c73df 100644 (file)
@@ -21,7 +21,7 @@ INCLUDES += $(X11_INCLUDES)
 INCLUDES += $(LIBMAINLOOP_INCLUDES) $(LIBTU_INCLUDES) $(LIBEXTL_INCLUDES)
 INCLUDES += -I..
 
-LIBS += $(X11_LIBS) $(XINERAMA_LIBS)
+LIBS += $(X11_LIBS)
 LIBS += $(WHOLEA) $(LIBMAINLOOP_LIBS) $(LIBEXTL_LIBS) $(LIBTU_LIBS) $(NO_WHOLEA)
 LIBS += $(LUA_LIBS) $(DL_LIBS)
 LIBS += -lm
index 1fe7df4a11f1ff384bec1ffbd9fc43a3d4e01803..ca01137e8e972e82c42be4cd1983267fcf2ba121 100644 (file)
@@ -40,7 +40,6 @@ dopath("cfg_ioncore")
 --dopath("mod_query")
 dopath("mod_menu")
 --dopath("mod_tiling")
---dopath("mod_panews")
 --dopath("mod_statusbar")
 dopath("mod_dock")
 --dopath("mod_sp")
index 773aace74b43bbdf74cb77a33972e18c175bf9e8..bbb042f792dfb9fcbf294cb33b03e77ae713e6d8 100644 (file)
--- a/pwm/pwm.c
+++ b/pwm/pwm.c
@@ -1,7 +1,7 @@
 /*
  * ion/pwm/pwm.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2007
  *
  * 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
@@ -48,16 +48,8 @@ static OptParserOpt pwm_opts[]={
      DUMMY_TR("Add directory to search path")},
 
     {OPT_ID('o'), "oneroot",  0, NULL,
-     DUMMY_TR("Manage default root window/non-Xinerama screen only")},
-
-#if defined(CF_XINERAMA) || defined(CF_SUN_XINERAMA)
-    {OPT_ID('x'), "xinerama", OPT_ARG, "1|0",
-     DUMMY_TR("Use Xinerama screen information (default: 0/no)")},
-#else
-    {OPT_ID('x'), "xinerama", OPT_ARG, "?",
-     DUMMY_TR("Ignored: not compiled with Xinerama support")},
-#endif
-    
+     DUMMY_TR("Manage default screen only")},
+
     {OPT_ID('s'), "session",  OPT_ARG, "session_name", 
      DUMMY_TR("Name of session (affects savefiles)")},
     
@@ -97,7 +89,7 @@ int main(int argc, char*argv[])
     const char *cfgfile="cfg_pwm";
     const char *display=NULL;
     char *cmd=NULL;
-    int stflags=IONCORE_STARTUP_NOXINERAMA;
+    int stflags=0;
     int opt;
     ErrorLog el;
     FILE *ef=NULL;
@@ -139,17 +131,6 @@ int main(int argc, char*argv[])
         case OPT_ID('o'):
             stflags|=IONCORE_STARTUP_ONEROOT;
             break;
-        case OPT_ID('x'):
-            {
-                const char *p=optparser_get_arg();
-                if(strcmp(p, "1")==0)
-                    stflags&=~IONCORE_STARTUP_NOXINERAMA;
-                else if(strcmp(p, "0")==0)
-                    stflags|=IONCORE_STARTUP_NOXINERAMA;
-                else
-                    warn(TR("Invalid parameter to -xinerama."));
-            }
-            break;
         case OPT_ID('s'):
             extl_set_sessiondir(optparser_get_arg());
             break;
index 06ce3b1234932a42b5ed984c6b9c085cc3009a23..e09131818094b347187e2e6ccc79f637422b58df 100644 (file)
--- a/system.mk
+++ b/system.mk
@@ -81,13 +81,6 @@ X11_PREFIX=/usr/X11R6
 X11_LIBS=-L$(X11_PREFIX)/lib -lX11 -lXext
 X11_INCLUDES=-I$(X11_PREFIX)/include
 
-# Change commenting to disable Xinerama support
-XINERAMA_LIBS=-lXinerama
-DEFINES += -DCF_XINERAMA
-# For Solaris
-#XINERAMA_LIBS=
-#DEFINES += -DCF_SUN_XINERAMA
-
 # XFree86 libraries up to 4.3.0 have a bug that will cause Ion to segfault
 # if Opera is used when i18n support is enabled. The following setting
 # should work around that situation.
index e5a60c96f9ed7c35a8ca4b424f554d214c7ace59..4688aae84d469ea8660aa4c7b94d2bdb2b247099 100644 (file)
--- a/version.h
+++ b/version.h
@@ -1,2 +1,2 @@
-#define ION_VERSION "3ds-20061223"
+#define ION_VERSION "3ds-20070203"
 #define ION_API_VERSION "3-"ION_VERSION