+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
Ion
===
-Copyright (c) Tuomo Valkonen 1999-2006.
+Copyright (c) Tuomo Valkonen 1999-2007.
tuomov at iki.fi
* 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`.
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:
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.
+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
----------------
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
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
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])
/*
* 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
#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 */
/*
* 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))){
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,
}
-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){
{
destyle_unref(brush->d);
brush->d=NULL;
+ gr_stylespec_unalloc(&brush->current_attr);
grbrush_deinit(&(brush->grbrush));
}
/*}}}*/
+/*{{{ 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 */
{
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:
{(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
};
/*
* 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
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){
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,
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);
/* 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;
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);
/*
* 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
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);
}
/*
* 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
DECLSTRUCT(DEColourGroup){
- char *spec;
+ GrStyleSpec spec;
DEColour bg, hl, sh, fg, pad;
};
/*
* 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;
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));
+}
+
+
/*}}}*/
}
+
+
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);
}
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);
}
}
+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;
* 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;
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,
}
-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;
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
}
-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;
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);
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,
}
-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)
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);
/*
* 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
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);
}
/*
* 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
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);
/*
* 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
/*
* 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 */
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);
}
+
+
/*EXTL_DOC
* Define a style for the root window \var{rootwin}.
*/
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;
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);
}
/*
* 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
/*
* 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 */
/*
* 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
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;
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;
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);
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;
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;
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)
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);
}
/*
* 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
DECLSTRUCT(DEStyle){
- char *style;
+ GrStyleSpec spec;
int usecount;
bool is_fallback;
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 */
+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
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
######################################
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 $@ $+
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. \\
\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
\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}
foo-*-baz
foo-bar
*
-foo-baz -- Doesn't match, not selected!
\end{verbatim}
Some of the drawing primitives allow extra attributes to be
\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
\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}
\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. \\
\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.
Context:
-[TAG ion-doc-3ds-20061223
-Tuomo Valkonen <tuomov@iki.fi>**20061223150012]
+[TAG ion-doc-3ds-20070203
+Tuomo Valkonen <tuomov@iki.fi>**20070203150437]
|-->WRegion
| |-->WClientWin
| |-->WWindow
- | | |-->WRootWin
| | |-->WMPlex
- | | | |-->WScreen
| | | |-->WFrame
+ | | | |-->WScreen
+ | | | |->WRootWin
| | |-->WInfoWin
| | | |-->WStatusBar (mod_statusbar)
| | |-->WMenu (mod_menu)
\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}
\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}
\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}
\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}
+
+
\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}
\title{Configuring and extending Ion3 with Lua}
\author{Tuomo Valkonen \\ tuomov at iki.fi}
-\date{2006-12-23}
+\date{2007-02-03}
\makeindex
-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
(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
\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}
\stepcounter{subsection}
\stepcounter{subsection}
{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline1032}%
+\lthtmlinlinemathA{tex2html_wrap_inline1031}%
$N=1{\ldots} 5$%
\lthtmlinlinemathZ
\lthtmlcheckvsize\clearpage}
\stepcounter{section}
\stepcounter{subsection}
{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline1981}%
+\lthtmlinlinemathA{tex2html_wrap_inline2020}%
$(0, 1]$%
\lthtmlinlinemathZ
\lthtmlcheckvsize\clearpage}
\stepcounter{section}
\stepcounter{chapter}
\stepcounter{section}
-{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline6076}%
-$-1$%
-\lthtmlinlinemathZ
-\lthtmlcheckvsize\clearpage}
-
\stepcounter{subsection}
\stepcounter{subsection}
\stepcounter{subsection}
\stepcounter{subsection}
\stepcounter{subsection}
{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline6080}%
+\lthtmlinlinemathA{tex2html_wrap_inline6229}%
+$-1$%
+\lthtmlinlinemathZ
+\lthtmlcheckvsize\clearpage}
+
+{\newpage\clearpage
+\lthtmlinlinemathA{tex2html_wrap_inline6231}%
$-2$%
\lthtmlinlinemathZ
\lthtmlcheckvsize\clearpage}
\stepcounter{section}
\stepcounter{subsection}
{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline9064}%
+\lthtmlinlinemathA{tex2html_wrap_inline9215}%
$\{t,m,b\}\times\{t,c,b\}$%
\lthtmlinlinemathZ
\lthtmlcheckvsize\clearpage}
<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>
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
<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>
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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/;
$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";
$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";
$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";
$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";
$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/;
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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";
$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/;
$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";
$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";
<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>
<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>
<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>
<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>
<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>
<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>
<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</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>
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>
<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>
|-->WRegion
| |-->WClientWin
| |-->WWindow
- | | |-->WRootWin
| | |-->WMPlex
- | | | |-->WScreen
| | | |-->WFrame
+ | | | |-->WScreen
+ | | | |-->WRootWin
| | |-->WInput (mod_query)
| | |-->WEdln (mod_query)
| | |-->WMessage (mod_query)
<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
<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 extensions
- 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 as
+ Xinerama<A NAME="339"></A> are used. (Actually there can be only
+ one root window when Xinerama is used.)
<P>
</DD>
<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).
<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>
<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>
<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>
<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.
<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>
<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
<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>
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.
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>.
<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>
<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>
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
</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
<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>
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>
</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
</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
</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.
</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.
</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>
</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.
</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>
</DD>
<DT><STRONG>Description:</STRONG></DT>
-<DD><A NAME="1416"></A>
+<DD><A NAME="1435"></A>
Should application supplied size increments be ignored?
</DD>
</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.
</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.
</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>
</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>
</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.
</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>
</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
</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?
</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>
<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
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
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
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:
<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
<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>
foo-*-baz
foo-bar
*
-foo-baz -- Doesn't match, not selected!
</PRE>
<P>
<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
</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.
</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"> </TD>
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>
</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>
</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.
<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>
<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
</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<P>
<DL>
-<DD><A NAME="4507"></A>
+<DD><A NAME="4610"></A>
<A NAME="fn:export"></A>
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
</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>
<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>
<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>
<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>
<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>
</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>
<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>
</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>
<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>
<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>
<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>
<P>
<DL>
-<DD><A NAME="9401"></A>
+<DD><A NAME="9529"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="9402"></A>
+<DD><A NAME="9530"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<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>
<P>
<DL>
-<DD><A NAME="9404"></A>
+<DD><A NAME="9533"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="9405"></A>
+<DD><A NAME="9534"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="9406"></A>
+<DD><A NAME="9535"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="9407"></A>
+<DD><A NAME="9536"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="9408"></A>
+<DD><A NAME="9537"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="9409"></A>
+<DD><A NAME="9538"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<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&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>
</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>
<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>
<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>
|-->WRegion
| |-->WClientWin
| |-->WWindow
- | | |-->WRootWin
| | |-->WMPlex
- | | | |-->WScreen
| | | |-->WFrame
+ | | | |-->WScreen
+ | | | |->WRootWin
| | |-->WInfoWin
| | | |-->WStatusBar (mod_statusbar)
| | |-->WMenu (mod_menu)
<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>
|-->WRegion
| |-->WClientWin
| |-->WWindow
- | | |-->WRootWin
| | |-->WMPlex
- | | | |-->WScreen
| | | |-->WFrame
+ | | | |-->WScreen
+ | | | |-->WRootWin
| | |-->WInput (mod_query)
| | |-->WEdln (mod_query)
| | |-->WMessage (mod_query)
<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
<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 extensions
- 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 as
+ Xinerama<A NAME="245"></A> are used. (Actually there can be only
+ one root window when Xinerama is used.)
<P>
</DD>
<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).
<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>
<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>
<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>
<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.
<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>
<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
<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>
<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'').
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
<TD ALIGN="LEFT"> </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>
<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
<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
<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
<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>
<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.
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</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>
<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>
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>
|-->WRegion
| |-->WClientWin
| |-->WWindow
- | | |-->WRootWin
| | |-->WMPlex
- | | | |-->WScreen
| | | |-->WFrame
+ | | | |-->WScreen
+ | | | |-->WRootWin
| | |-->WInput (mod_query)
| | |-->WEdln (mod_query)
| | |-->WMessage (mod_query)
root windows\index{root window} of X screens\index{screen!X}.
Note that an ''X screen'' or root window is not necessarily a
single physical screen\index{screen!physical} as a root window
- may be split over multiple screens when multi-head extensions
- such as Xinerama\index{Xinerama} are used. (Actually there
- can be only one \type{WRootWin} when Xinerama is used.)
-
+ may be split over multiple screens when hacks such as
+ 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}
\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
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 \
--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)
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()"),
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
-- 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", {
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(_)"),
})
--- 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, _)"),
})
--- /dev/null
+--
+-- 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)
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")
+++ /dev/null
---
--- 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",
- },
-}
---]]
-- 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"),
})
--- 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", {
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
- }
- }
- }
-}
-
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 = "*",
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-*-*",
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",
dopath("lookcommon_clean")
+de.defstyle("tab-menuentry-big", {
+ based_on = "tab-menuentry",
+ padding_pixels = 7,
+})
+
gr.refresh()
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-*-*-*-*-*-*-*",
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", {
dopath("lookcommon_clean")
+de.defstyle("tab-menuentry-big", {
+ based_on = "tab-menuentry",
+ font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",
+ padding_pixels = 7,
+})
+
gr.refresh()
})
-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-*-*-*-*-*-*-*",
})
-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",
}),
})
+
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()
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",
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",
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",
shadow_colour = "black",
highlight_colour = "black",
background_colour = "#3f3f3f",
- foreground_colour = "#9f9f9f",
+ foreground_colour = "#bfbfbf",
}),
de.substyle("active-unselected", {
shadow_colour = "black",
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",
}),
})
+de.defstyle("input-menu", {
+ based_on = "input",
+ padding_pixels=0,
+})
+
dopath("lookcommon_clean")
gr.refresh()
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", {
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,
})
de.defstyle("frame-floating", {
based_on = "frame",
- bar = "shaped"
+ bar = "shaped",
+ padding_pixels = 0,
})
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", {
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,
+})
Context:
-[TAG ion-3ds-20061223
-Tuomo Valkonen <tuomov@iki.fi>**20061223145904]
+[TAG ion-3ds-20070203
+Tuomo Valkonen <tuomov@iki.fi>**20070203145039]
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
/*
* 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
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)")},
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;
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 \
/*
* 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
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));
}
}
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));
}
}
propagate_clear(reg);
}
- region_notify_change(reg, "activity");
+ region_notify_change(reg, ioncore_g.notifies.activity);
return nset;
}
/*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);
}
/*
* 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
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();
/*
* 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
if(reg==NULL)
return NULL;
-
+
if(!cont(mgr, reg, cont_param)){
destroy_obj((Obj*)reg);
return NULL;
}
+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**)®)){
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,
/*
* 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
extern bool region_attach_reparent_check(WRegion *mgr, WRegion *reg);
+
#endif /* ION_IONCORE_ATTACH_H */
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
*/
-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;
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");
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);
/*
* 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
#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;
/*
* 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
INTRCLASS(WPHolder);
INTRCLASS(WMPlexPHolder);
+INTRCLASS(WFramedPHolder);
INTRSTRUCT(WStacking);
INTRSTRUCT(WLListNode);
/*
* 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
#include "netwm.h"
#include "xwindow.h"
#include "bindmaps.h"
+#include "return.h"
+#include "conf.h"
static void set_clientwin_state(WClientWin *cwin, int state);
}
-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)
{
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;
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;
}
-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)
{
XWMHints *hints;
int init_state=NormalState;
WManageParams param=MANAGEPARAMS_INIT;
+ void *mrshpm[2];
param.dockapp=FALSE;
FALSE);
}
- if(!handle_target_prop(cwin, ¶m)){
- bool managed;
- void *mrshpm[2];
-
- mrshpm[0]=cwin;
- mrshpm[1]=¶m;
+ mrshpm[0]=cwin;
+ mrshpm[1]=¶m;
- 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 &&
region_set_activity((WRegion*)cwin, SETPARAM_SET);
}
-
if(postmanage_check(cwin, &attr)){
if(param.jumpto && ioncore_g.focus_next==NULL)
region_goto((WRegion*)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);
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);
}
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);
}
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);
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);
}
/*
* 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
XSizeHints size_hints;
- WPHolder *fs_pholder;
-
ExtlTab proptab;
};
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
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
* \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}
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));
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;
+ }
+
}
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).
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);
/*
* 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
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 */
/*
* 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
/*
* 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
--- /dev/null
+/*
+ * 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));
+}
+
+
--- /dev/null
+/*
+ * 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 */
+
/*
* 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
/*
* 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
/*
* 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);
/*
* 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
/*{{{ Enter window, focus */
-/*extern Time ioncore_focus_time;*/
-
-
static void do_handle_enter_window(XEvent *ev)
{
XEnterWindowEvent *eev=&(ev->xcrossing);
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)
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;
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) &&
region_set_focus(reg);
return;
}
- /*return;*/
}
/* Input contexts */
/*
* 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
/*
* 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
/*
* 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
/*
* 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);
}
/*
* 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);
/*
* 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
/*
* 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
/*
* 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
/*
* 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
WHook *region_do_warp_alt=NULL;
-WHook *region_activated_hook=NULL;
-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);
}
if(replace!=NULL)
region_focuslist_move_after(replace, reg);
-
- region_focuslist_remove(reg);
+
+ UNLINK_ITEM(ioncore_g.focus_current, reg, active_next, active_prev);
}
}
+/*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;
+}
+
+
/*}}}*/
}
-bool ioncore_await_focus()
+WRegion *ioncore_await_focus()
{
- return (await_watch.obj!=NULL);
+ return (WRegion*)(await_watch.obj);
}
void region_got_focus(WRegion *reg)
{
- WRegion *par, *mgr, *tmp;
+ WRegion *par;
check_clear_await(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);)
}
*/
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);)
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);
}
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;
}
}
+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);
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=®ION_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);
+ }
+}
+
+
/*}}}*/
+
/*
* 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);
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 */
/*
* 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®ION_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 */
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;
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;
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;
}
+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)
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);
}
+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));
+}
+
+
/*}}}*/
+
/*
* 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
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 */
/*
* 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
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()){
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);
/*
* 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
/*
* 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
#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);
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);
{
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);
+ }
}
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);
StringIntMap frame_modes[]={
+ {"unknown", FRAME_MODE_UNKNOWN},
{"tiled", FRAME_MODE_TILED},
{"tiled-alt", FRAME_MODE_TILED_ALT},
{"floating", FRAME_MODE_FLOATING},
/*EXTL_DOC
* Get frame mode.
*/
+EXTL_SAFE
EXTL_EXPORT_AS(WFrame, mode)
const char *frame_mode_extl(WFrame *frame)
{
-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®ION_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;
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++;
}
}
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;
{
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);
}
}
+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);
+ }
+}
+
+
/*}}}*/
/*}}}*/
+/*{{{ 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. */
}
-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);
}
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);
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);
+ }
}
/*
* 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
int saved_x, saved_y;
int tab_dragged_idx;
+ uint quasiactive_count;
GrBrush *brush;
GrBrush *bar_brush;
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);
/*
* 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
} 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);
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));
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;
}
ap.data=data;
ap.param=&ph->param;
- return pholder_attach_(ph->cont, flags, &data2);
+ return pholder_do_attach(ph->cont, flags, &data2);
}
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);
}
{(DynFun*)pholder_do_target,
(DynFun*)framedpholder_do_target},
+
+ {(DynFun*)pholder_do_root,
+ (DynFun*)framedpholder_do_root},
END_DYNFUNTAB
};
/*
* 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;*/
};
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,
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 */
/*
* 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
/*
* 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=®ION_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);
}
+/*}}}*/
/*
* 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 */
/*
* 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
#include <X11/Xutil.h>
#include <X11/Xresource.h>
+#include <libtu/stringstore.h>
+
#include "rootwin.h"
#include "screen.h"
#include "window.h"
INTRSTRUCT(WGlobal);
+
DECLSTRUCT(WGlobal){
int argc;
char **argv;
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;
};
--- /dev/null
+/*
+ * 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 */
+
/*
* 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
#include <string.h>
#include <libtu/objp.h>
+#include <libtu/minmax.h>
#include <libextl/readconfig.h>
#include <libmainloop/hooks.h>
#include "common.h"
/*{{{ 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;
+}
+
+
/*}}}*/
/*{{{ 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));
}
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));
}
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));
}
}
-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));
}
}
+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));
+}
+
+
/*}}}*/
/*
* 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
#ifndef ION_IONCORE_GR_H
#define ION_IONCORE_GR_H
+#include <libtu/stringstore.h>
+
#include "common.h"
#include "rectangle.h"
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{
#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. */
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);
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 */
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 */
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,
/*
* 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)
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, ¶m);
}
-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);
}
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;
/*
* 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
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 */
/*
* 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;
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;
- }
}
: (ioncore_placement_method==PLACEMENT_LRUD
? "lrud"
: "random")));
-
- if(default_ws_params_set)
- extl_table_sets_t(t, "default_ws_params", default_ws_params);
}
/*{{{ 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,
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;
+ }
}
}
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
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;
WRegion *groupws_load(WWindow *par, const WFitParams *fp,
- ExtlTab tab)
+ ExtlTab tab)
{
WGroupWS *ws;
}
-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},
/*
* 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
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);
/*
* 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
#include "grouppholder.h"
#include "frame.h"
#include "float-placement.h"
+#include "return.h"
static void group_place_stdisp(WGroup *ws, WWindow *parent,
}
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'
}
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);
+ }
}
* 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);
}
WFitParams fp;
WWindow *par;
WRegion *reg;
-
+
if(ws->bottom!=NULL && param->bottom){
warn(TR("'bottom' already set."));
return NULL;
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);
}
if(sti_ok && focusable(ws, sti, min_level))
- return st;
+ return sti;
return NULL;
}
WStacking *group_find_stacking(WGroup *ws, WRegion *r)
{
- WStacking *st;
-
if(r==NULL || REGION_MANAGER(r)!=(WRegion*)ws)
return NULL;
/*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);
}
}
+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;
+}
+
+
/*}}}*/
{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},
/*
* 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
uint switchto_set:1;
uint switchto:1;
- uint modal:1;
uint bottom:1;
int geom_weak;
};
#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){
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;
/*
* 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
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);
}
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);
}
{(DynFun*)pholder_do_target,
(DynFun*)groupedpholder_do_target},
+
+ {(DynFun*)pholder_do_root,
+ (DynFun*)groupedpholder_do_root},
END_DYNFUNTAB
};
/*
* 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
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);
/*
* 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
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;
}
/*
* 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
/*
* 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
goto fail2;
p->brush=NULL;
- p->attr=NULL;
+
+ gr_stylespec_init(&p->attr);
infowin_updategr(p);
return TRUE;
-fail3:
+fail3:
+ gr_stylespec_unalloc(&p->attr);
free(p->style);
fail2:
free(p->buffer);
p->buffer=NULL;
}
- if(p->attr!=NULL){
- free(p->attr);
- p->attr=NULL;
- }
-
if(p->style!=NULL){
free(p->style);
p->style=NULL;
p->brush=NULL;
}
+ gr_stylespec_unalloc(&p->attr);
+
window_deinit(&(p->wwin));
}
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);
}
/*{{{ 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;
}
/*
* 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
WWindow wwin;
GrBrush *brush;
char *buffer;
- char *attr;
char *style;
+ GrStyleSpec attr;
};
#define INFOWIN_BRUSH(INFOWIN) ((INFOWIN)->brush)
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);
/*
* 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
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"
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);
}
-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;
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;
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)
/*
* 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 "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);
--
-- 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
--
-- 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
--
-- 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
--
-- 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
--
-- 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
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
-- 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
+
-- }}}
--
-- 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
-- (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
--
-- 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
--
-- 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
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
--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
/*
* 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
/*
* 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
/*
* 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
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;
}
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);
/*
* 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
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 */
/*
* 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
/*
* 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
/*
* 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
#include "pointer.h"
#include "netwm.h"
#include "extlconv.h"
+#include "return.h"
+#include "conf.h"
+#include "group-ws.h"
/*{{{ Add */
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(®ION_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(®ION_GEOM(scr),
+ param->geom.x, param->geom.y)){
+ found=scr;
+ if(respectpos)
+ break;
+ }
}
if(found==NULL)
}
+/*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)
{
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){
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){
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;
}
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*{{{ 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;
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. */
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);
}
/*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);
}
* 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
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;
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);
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);
}
WRegionNaviData *data)
{
WStacking *st;
+ WRegion *res;
if(rel!=NULL){
st=mplex_find_stacking(mplex, rel);
}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);
}
}
-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"))
}
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;
}
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;
}
+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).
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);
}
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;*/
+ }
}
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)
mplex_remanage_stdisp(mplex);
}
+ if(oldstdisp!=NULL && oldstdisp!=reg)
+ region_dispose((WRegion*)oldstdisp, FALSE);
+
return TRUE;
}
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){
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;
/*
* 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
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 */
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,
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,
/*
* 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
#include "mplex.h"
#include "mplexpholder.h"
#include "llist.h"
+#include "framedpholder.h"
static void mplex_watch_handler(Watch *watch, Obj *mplex);
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;
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));
/*{{{ 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;
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);
+ }
}
{(DynFun*)pholder_do_target,
(DynFun*)mplexpholder_do_target},
+
+ {(DynFun*)pholder_do_root,
+ (DynFun*)mplexpholder_do_root},
END_DYNFUNTAB
};
/*
* 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;
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,
/*
* 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
/*
* 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
/*
* 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
#include <libextl/extl.h>
#include "common.h"
+#include "global.h"
#include "region.h"
#include "clientwin.h"
#include "names.h"
if(nm!=NULL)
free(nm);
- region_notify_change(reg, "name");
+ region_notify_change(reg, ioncore_g.notifies.name);
return ret;
}
}
-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;
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);
}
/*
* 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
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);
/*
* 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
}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);
}
}
}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);
}
}
/*
* 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
/*
* 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
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;
}
}
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.. */
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;
/*
* 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
/*
* 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
#include "common.h"
#include "attach.h"
#include "pholder.h"
+#include "focus.h"
bool pholder_init(WPHolder *ph)
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));
}
}
+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;
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));
}
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)
{
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
};
/*
* 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
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);
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
#include "extlconv.h"
#include "activity.h"
#include "region-iter.h"
+#include "return.h"
#define D2(X)
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 */
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));
}
}
void region_deinit(WRegion *reg)
{
+ region_notify_change(reg, ioncore_g.notifies.deinit);
+
destroy_children(reg);
if(ioncore_g.focus_next==reg){
}
region_detach_manager(reg);
+ region_unset_return(reg);
region_unset_parent(reg);
region_remove_bindings(reg);
/*{{{ 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)
}
-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));
}
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)){
}
ph=region_get_rescue_pholder(reg);
+ mcf=region_may_control_focus(reg);
if(ph!=NULL){
refuse=!region_rescue_clientwins(reg, ph);
return FALSE;
}
- mainloop_defer_destroy((Obj*)reg);
+ region_dispose(reg, mcf);
return TRUE;
}
}
+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));
+}
+
+
/*}}}*/
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);
* 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);
}
+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.
{
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);
}
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);
}
}
-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);
}
/*
* 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®ION_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®ION_ACTIVE)
+#define REGION_IS_PSEUDOACTIVE(R) (((WRegion*)(R))->flags®ION_PSEUDOACTIVE)
#define REGION_IS_TAGGED(R) (((WRegion*)(R))->flags®ION_TAGGED)
#define REGION_IS_URGENT(R) (((WRegion*)(R))->flags®ION_URGENT)
#define REGION_GEOM(R) (((WRegion*)(R))->geom)
typedef int WRegionFitMode;
+typedef StringId WRegionNotify;
+
typedef enum{
REGION_ORDER_FRONT,
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);
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);
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);
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 */
/*
* 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
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);
/*
* 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
--- /dev/null
+/*
+ * 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);
+}
+
+
+/*}}}*/
+
--- /dev/null
+/*
+ * 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 */
/*
* 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"
}
-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);
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;
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;
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, ®ION_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;
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));
}
XFreeGC(ioncore_g.dpy, rw->xor_gc);
- window_deinit((WWindow*)rw);
+ rw->scr.mplex.win.win=None;
+
+ screen_deinit(&rw->scr);
}
/*{{{ 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)
{
}
-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}.
*/
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);
}
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);
/*}}}*/
/*
* 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; \
DECLCLASS(WRootWin){
- WWindow wwin;
+ WScreen scr;
int xscr;
Colormap default_cmap;
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 */
/*
* 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
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);
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));
/*
* 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
/*
* 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
#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;
/*{{{ 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;
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);
}
}
- /* 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);
}
-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));
}
{
UNLINK_ITEM(ioncore_g.screens, scr, next_scr, prev_scr);
- if(scr->uses_root)
- scr->mplex.win.win=None;
-
mplex_deinit((WMPlex*)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);
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");
}
Obj *iw=scr->notifywin_watch.obj;
if(iw!=NULL){
watch_reset(&(scr->notifywin_watch));
- mainloop_defer_destroy(iw);
+ region_dispose((WRegion*)iw, FALSE);
}
}
Obj *iw=scr->infowin_watch.obj;
if(iw!=NULL){
watch_reset(&(scr->infowin_watch));
- mainloop_defer_destroy(iw);
+ region_dispose((WRegion*)iw, FALSE);
}
}
}
+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);
}
/*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
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);
/*
* 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
#include "common.h"
#include "mplex.h"
#include "rectangle.h"
-#include "rootwin.h"
#include "pholder.h"
#define FOR_ALL_SCREENS(SCR) \
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);
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();
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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;
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;
EXTL_EXPORT
void ioncore_clear_tags()
{
- while(ioncore_tags_take_first()!=NULL)
+ while(ioncore_tagged_take_first()!=NULL)
/* nothing */;
}
*/
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);
}
/*
* 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
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 */
/*
* 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
/*{{{ 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;
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;
}
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);
}
{
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);
}
void window_unmap(WWindow *wwin)
{
+ region_pointer_focus_hack(&wwin->region);
+
XUnmapWindow(ioncore_g.dpy, wwin->win);
REGION_MARK_UNMAPPED(wwin);
}
/*
* 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
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);
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
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);
/*
* 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
/*
* 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
/*
* 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
libtu
-Copyright (c) Tuomo Valkonen 1999-2004.
+Copyright (c) Tuomo Valkonen 1999-2007.
<tuomov at iki.fi>
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.
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]
+++ /dev/null
-/*
- * 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
+++ /dev/null
-/*
- * 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;
-}
/*
* 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"
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;
}
-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){
return STRINGID_NONE;
}
- s=scopy(str);
+ s=scopyn(str, l);
if(s==NULL)
return STRINGID_NONE;
}
+StringId stringstore_alloc(const char *str)
+{
+ return stringstore_alloc_n(str, strlen(str));
+}
+
+
void stringstore_free(StringId id)
{
Rb_node node=(Rb_node)id;
}
}
+
+void stringstore_ref(StringId id)
+{
+ Rb_node node=(Rb_node)id;
+
+ if(node!=NULL)
+ node->v.ival++;
+}
+
/*
* 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.
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 */
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
.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
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
.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]
.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
.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
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
.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
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
BINDINGS:WGroupWS
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
.SS Pøiøazenà pro menu [mod_menu]
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
BINDINGS:WGroupWS
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
.SS Bindungen für die Menüs [mod_menu]
.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
BINDINGS:WGroupWS
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
.SS Valikoiden sidonnat [mod_menu]
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
BINDINGS:WGroupWS
-BINDINGS:WFloatFrame
+BINDINGS:WFrame.floating
.SS Bindings for menus [mod_menu]
* 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>
{
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:
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;
/*
* 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
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;
}
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;
(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);
/*
* 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
/*
* 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
/*
* 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
#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"
}
+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;
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);
}
{
WRectangle igeom;
int i, mx;
-
+
if(menu->entry_brush==NULL)
return;
-
+
get_inner_geom(menu, &igeom);
mx=menu->first_entry+menu->vis_entries;
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;
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);
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);
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);
}
}
}
+static void deinit_entries(WMenu *menu);
+
bool menu_init(WMenu *menu, WWindow *par, const WFitParams *fp,
const WMenuCreateParams *params)
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;
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);
fail:
extl_unref_table(menu->tab);
extl_unref_fn(menu->handler);
- free(menu->entries);
+ deinit_entries(menu);
return FALSE;
}
}
-
-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)
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);
}
void menu_cancel(WMenu *menu)
{
if(region_manager_allows_destroying((WRegion*)menu))
- mainloop_defer_destroy((Obj*)menu);
+ region_dispose_((WRegion*)menu);
}
/*
* 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
DECLSTRUCT(WMenuEntry){
char *title;
int flags;
+ GrStyleSpec attr;
};
DECLCLASS(WMenu){
/*
* 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
/*
* 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
--
-- 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
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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
+++ /dev/null
-##
-## 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
+++ /dev/null
-/*
- * 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;
-}
-
-
-/*}}}*/
-
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
---
--- 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)
-
+++ /dev/null
-/*
- * 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),
- ®ION_GEOM(ws),
- p.layout);
- extl_unref_table(p.layout);
- }
-
- if(ws->tiling.split_tree==NULL)
- ws->tiling.split_tree=(WSplit*)create_splitunused(®ION_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®ION_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**)®)){
- 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), ®ION_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);
-
-
-/*}}}*/
-
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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);
-}
-
-
-/*}}}*/
-
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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);
-
-
-/*}}}*/
-
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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);
-
-
-/*}}}*/
-
+++ /dev/null
-/*
- * 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 */
/*
* 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
/*
* 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
/*
* 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
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;
/*
* 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
/*
* 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
/*
* 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
/*
* 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
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;
-static bool match(const char *h, const char *b)
+static bool match(const char *h, const char *b, bool exact)
{
const char *h_;
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);
}
* 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--;
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++;
/*
* 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
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();
/*
* 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
void input_cancel(WInput *input)
{
if(region_manager_allows_destroying((WRegion*)input))
- mainloop_defer_destroy((Obj*)input);
+ region_dispose_((WRegion*)input);
}
/*
* 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
/*
* 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
/*
* 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
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;
}
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;
}
l=iinf->part_lens[i];
- grbrush_draw_string(brush, x, y, str, l, TRUE, style);
+ grbrush_draw_string(brush, x, y, str, l, TRUE);
}
}
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);
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);
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);
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);
}
/*
* 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
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);
/*
* 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
ModQueryConfig mod_query_config={
250,
- TRUE
+ TRUE,
+ FALSE
};
* (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
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)){
* Get module configuration. For more information see
* \fnref{mod_query.set}.
*/
+EXTL_SAFE
EXTL_EXPORT
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;
/*
* 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
DECLSTRUCT(ModQueryConfig){
int autoshowcompl_delay;
bool autoshowcompl;
+ bool caseicompl;
};
--
-- 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
-- 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}
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
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)
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={}
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
+
+
-- }}}
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
end
end
+
function mod_query.attachclient_handler(frame, str)
local cwin=ioncore.lookup_clientwin(str)
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
--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")
mod_query.known_hosts={}
+mod_query.hostnicks={}
+mod_query.ssh_completions={}
function mod_query.get_known_hosts(mplex)
end
-mod_query.hostnicks={}
-
function mod_query.get_hostnicks(mplex)
mod_query.hostnicks={}
local f
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
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
return res
end
-mod_query.ssh_completions={}
--DOC
-- This query asks for a host to connect to with SSH.
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
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)
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
--
-- 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
/*
* 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
#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;
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;
WRectangle geom;
WEdlnCreateParams fnp;
WMPlexAttachParams par;
- XKeyEvent *ev=ioncore_current_key_event();
WEdln *wedln;
fnp.prompt=prompt;
(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;
}
/*
* 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
/*
* 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
/*
* 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
#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"
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);
}
}
#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,
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;
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);
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));
}
}
{
WRectangle geom;
int ty;
- const char *style=(REGION_IS_ACTIVE(wedln) ? "active" : "inactive");
if(WEDLN_BRUSH(wedln)==NULL)
return;
/*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);
}
-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);
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);
+}
+
/*}}} */
get_textarea_geom(wedln, G_CURRENT, &tageom);
wedln_update_cursor(wedln, tageom.w);
- wedln_draw_textarea(wedln);
+ wedln_draw_(wedln, FALSE, FALSE);
}
{
while(i>0){
i--;
- free(ptr[i]);
+ if(ptr[i]!=NULL)
+ free(ptr[i]);
}
free(ptr);
}
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);
}
{
wedln->vstart=0;
+ init_attr();
+
if(!wedln_init_prompt(wedln, params->prompt))
return FALSE;
/*
* 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
/*
* 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
#include <ioncore/strings.h>
#include <ioncore/global.h>
#include <ioncore/event.h>
+#include <ioncore/gr-util.h>
#include "wmessage.h"
#include "inputp.h"
/*{{{ 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)
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));
}
p=p+l+1;
}
+ init_attr();
+
init_listing(&(wmsg->listing));
setup_listing(&(wmsg->listing), ptr, k, TRUE);
/*
* 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
/*
* 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
/*
* 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.
*
/*
* 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.
*
/*
* 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.
*
/*
* 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.
*
/*
* 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
/*
* 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
/*
* 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
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;
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++;
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;
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);
}
/*
* 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
/*
* 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
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();
/*
* 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
--
-- 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
/*
* 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
*/
#include <string.h>
+#include <limits.h>
#include <libtu/objp.h>
#include <libtu/minmax.h>
#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>
static void do_calc_systray_w(WStatusBar *p, WSBElem *el);
static void statusbar_calc_systray_w(WStatusBar *p);
-
static WStatusBar *statusbars=NULL;
/*{{{ 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;
}
+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);
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;
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);
}
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;
}
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];
}
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);
return;
for(i=0; i<sb->nelems; i++){
+ const char *meter;
+
el=&(sb->elems[i]);
if(el->type!=WSBELEM_METER)
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;
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);
}
}
/*
* 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
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;
/*
* 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
/*
* 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
/*
* 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)
{
/*
- * 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
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);
}
/*
- * 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
- * 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
/*
- * 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
* (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>
WRegionSimpleCreateFn *fn,
WTiling *ws);
-#endif /* ION_PANEWS_SPLITFLOAT_H */
+#endif /* ION_MOD_TILING_SPLITFLOAT_H */
/*
* 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
if(!ds){
if(other==NULL)
- mainloop_defer_destroy((Obj*)ws);
+ region_dispose((WRegion*)ws, mcf);
else if(act && mcf)
region_warp(other);
}
/*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);
}
/*
* 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
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
--dopath("mod_query")
dopath("mod_menu")
--dopath("mod_tiling")
---dopath("mod_panews")
--dopath("mod_statusbar")
dopath("mod_dock")
--dopath("mod_sp")
/*
* 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
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)")},
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;
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;
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.
-#define ION_VERSION "3ds-20061223"
+#define ION_VERSION "3ds-20070203"
#define ION_API_VERSION "3-"ION_VERSION