+2007-06-08 16:55 UTC Tuomo Valkonen <tuomov@iki.fi>
+ tagged ion-3rc-20070608
+
+2007-06-08 16:55 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Release notes
+
+2007-06-08 16:04 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Bah, too many indirect deps from Xmu; reimplement the wh^Wmacros.
+
+2007-06-08 15:57 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * X selection code tuning
+
+2007-06-06 18:10 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Use getloadavg(3) instead of /proc/loadavg or `uptime` in statusd.
+
+2007-06-05 19:21 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Updated configuration document name in man pages
+
+2007-06-05 15:15 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Removed release from Ion ION_API_VERSION
+ (It should be "stable", so modules don't have to be checked to
+ be compiled against the exact release.)
+
+2007-06-04 06:32 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Fixed uninitialised variables
+
+2007-05-30 18:12 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Fixed stdisp split tree node dodging
+
+2007-05-29 21:09 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Oops, hidden and pseudomodal flags used the same bit
+
+2007-05-28 19:59 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Document 'bottom' parameter to WGroup.attach_new
+
+2007-05-28 17:50 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Don't redraw full listing on completion cycle
+
+2007-05-28 08:14 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Bah, removed redundant statement
+
+2007-05-26 14:08 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * fix
+
+2007-05-26 14:00 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * More name policy refinements
+ (Removed "ion soup" and replaced with explicit patch requests
+ by the user.)
+
+2007-05-24 20:57 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Use clock_gettime(CLOCK_MONOTONIC) when available.
+
+ *nix provides only one interval timer (or 'select' timeout), so programs
+ with multiple timers need to do their own timeout management. This means
+ converting the times from delays to absolute times. When gettimeofday is
+ used, the time thus provided is not guaranteed to be monotonic, and may
+ be adjusted backwards, which is a serious problem. The CLOCK_MONOTONIC
+ time advanced monotonically from an unspecified starting point, thus
+ providing exactly what is needed for decent timeout management.
+
+ This partially fixes issues with e.g. statusbar updates when time is
+ adjusted backwards. If CLOCK_MONOTONIC is not available, the issue
+ remains, as I can't be arsed to write ugly countermeasures against
+ the lack of an absolutely _essential_ feature that every system that
+ is not totally moronic, should have had to begin with. (I should also
+ be just using the rather nice libevent that I just learned about
+ instead of my own mainloop library... but since there's a feature
+ freeze and the conversion would be quite a bit of work that could
+ induce new bugs, it isn't happening for Ion3.)
+
+2007-05-21 18:27 UTC Pierre-Henri RAMBOZ DidouPh@gmail.com
+ * Added French translation
+
+2007-05-21 13:55 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * set_stdisp doc update
+
+2007-05-20 19:37 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Some "clean" style tuning
+
+2007-05-20 19:19 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Added $(C99_SOURCE) to ion-completefile CFLAGS
+
+2007-05-20 17:09 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Don't start statusd in quiet mode
+ (non-statusd meters are also auto-loaded these days, so it might just
+ as well complain of meters not found.)
+
+2007-05-20 17:07 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Made statusd startup timeout non-fatal
+
+2007-05-20 14:58 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * popen_bgread doc improvement
+
+2007-05-18 07:03 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Some improvements to name policy explanations
+
+2007-05-17 16:51 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Don't check for pointer in tab-bar when disabled.
+ While the bar has no geometry when disabled, the Fitt's Law
+ hack for top of the screen borders was still functional.
+
+2007-05-17 16:44 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * ioncore.popen_bgread doc fix
+
+2007-05-14 16:13 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Ungrabbed submaps had stopped working. Fixed.
+
+2007-05-12 19:21 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Missing stdio.h header in ion-completefile
+
+2007-05-12 14:25 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * WTF is strcasecmp doing in strings.h and not string.h on some systems?
+
+2007-05-10 13:39 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Removed references to no longer existent layers
+
+2007-05-08 22:41 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * A bit more better wording
+
+2007-05-08 16:01 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Fixed unsplit
+
+2007-05-08 15:56 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Fixed tiling emergency restore code
+
+2007-05-08 15:25 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Binding fn. doc. fixes
+
+2007-05-08 15:23 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * "Improved" stacking traversal code wasn't considering fallback.
+
+2007-05-07 20:55 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Do not use `which lua5.1` in system.mk examples.
+ Makes for confusing error messages if not found.
+
+2007-05-07 15:49 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Do not try to automatically launch statusd if config file launch fails
+
+2007-05-07 15:22 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Fixed statusd-not-found message
+
+2007-05-07 08:34 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Doc. notation fix
+
+2007-05-07 08:31 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Added some documentation and commented-out settings to cfg_ion.lua
+
+2007-05-06 20:50 UTC Tuomo Valkonen <tuomov@iki.fi>
+ * Better wording of name policy
+ (Author instead of copyright/trademark holder.)
+
2007-05-06 14:43 UTC Tuomo Valkonen <tuomov@iki.fi>
tagged ion-3rc-20070506
The code of this project is "essentially" licensed under the LGPL, version
2.1, unless otherwise indicated in components taken from elsewhere. It is
reproduced below. Additionally, the following terms apply to the use of
-the names Ion, Ion3, and other derived names:
-
- Derived works and altered versions that significantly differ from the
- original copyright holder's versions, must either a) be given names
- that can not be associated with the "Ion" project, or b) be qualified
- as "Ion soup", and still be considerable as customised versions of this
- software. In both cases, executables must also be given names that do
- not conflict with the original copyright holder's version, and the
- copyright holder may not be referred to for support.
-
- Modules and other (standalone) extensions to Ion must also be named
- so that they can not be confused to be supported by the copyright
- holder. If "Ion" occurs in the name, it must be in the form
- "Foo for Ion" instead of "Ion Foo", etc.
-
- If the name of the project (Ion), resp. names of particular branches
- (Ion1, Ion2, Ion3, etc.), are used without further prominent version
- qualifiers and notices of possible out-datedness to distribute this
- software, then the following conditions must hold: a) The version
- distributed online may not significantly differ from the copyright
- holder's latest release marked stable, resp. latest release on a
- branch, within a reasonable delay (normally 28 days) from the release.
- b) The holders of physical distribution media are provided ways to
- upgrade to the latest release within this same delay.
-
- This name policy notice may not be altered, and must be included in
- any altered versions and binary redistributions. It may only be
- removed when using small portions of the code in unrelated projects.
-
- The copyright holder and the Ion project retain the same rights to
- your modifications that it would have under the LGPL or GPL without
- these or similar additional terms.
+the name of the project, Ion(tm), names of particular "branches" such as
+Ion3(tm), and other derived names:
+
+ If the name Ion(tm) or other names that can be associated with the Ion
+ project are used to distribute this software, then:
+
+ - A version that does not significantly differ from one of the
+ original author's versions must be provided by default.
+
+ - When there are no further prominent notices of possible out-datedness,
+ and no prominent original author's version qualifiers present (resp.
+ only branch qualifier is present), then the version distributed online
+ may not significantly differ from the original author's latest stable
+ release (resp. latest release on the branch) within a reasonable delay
+ (normally 28 days). The holders of physical distribution media must
+ be provided ways to upgrade to the latest release within this delay.
+
+ - Significantly altered versions may be provided only if the user
+ explicitly requests for those modifications to be applied, and
+ is prominently notified that the software is no longer considered
+ the standard version, and is not supported by the original author.
+ The version string displayed by the program must describe these
+ modifications and the "support void" status.
+
+ Derived works that do not satisfy the above terms must be renamed so
+ that they can not be associated with the Ion project, their executables
+ must be given names that do not conflict with the original author's
+ version, and this author may not be referred to for support.
+
+ Modules and other (standalone) extensions to Ion must also be named
+ so that they can not be confused to be supported by the original
+ author. If "Ion" occurs in the name, it must be in the form
+ "Foo for Ion" instead of "Ion Foo", etc.
+
+ This name policy notice may not be altered, and must be included in
+ any altered versions and binary redistributions. It may only be
+ removed when using small portions of the code in unrelated projects.
+
+ The original author and the Ion project retain the same rights to
+ your modifications that it would have under the LGPL or GPL without
+ these or similar additional terms.
+
+ If you fail to follow these terms, you lose the rights granted to
+ you by the LGPL.
Explanations:
platform are a priori insignificant. Additionally, basic configuration
changes to better integrate the software with the target platform,
without obstructing the standard behaviour, are a priori insignificant.
-The copyright holder, however, reserves the right to refine the
-definition of significant changes on a per-case basis. Please consult
+Everything else is significant. The author reserves the right to refine
+the definition of significant changes on a per-case basis. Please consult
when in doubt.
Distributions: For example, suppose an aggregate distribution of software
-provides a `installpkg` command for installing packages. Then the action
-`installpkg ion3` (resp. `installpkg ion`) should always install the
-latest release of Ion3 (resp. the latest stable release), online
-connectivity provided. The action `installpkg ion-3ds-20070318` may
-at any date install this particular mentioned release. Likewise
-`installpkg ion-soup` may install any non-conflicting customised
-version.
+provides an `installpkg` command for installing packages. Then the action
+`installpkg ion3` (resp. `installpkg ion`) should within a reasonable
+delay install the latest release of Ion3 (resp. the latest stable release),
+or prominently notify the user that the provided version is not or may not
+be the latest. The action `installpkg ion-3ds-20070318` may at any date
+install this particular mentioned release. Likewise, the action `installpkg
+--support-void-featurex ion3` may apply additional patches to the latest
+Ion3, within the further constraints set above.
+
+The intent of these terms is to curb the power that "distributions", as
+the primary sources of software for many users, have in defining what
+is perceived as Ion. By providing significantly modified versions and
+out-dated development snapshots without prominently mentioning this fact,
+they do not present the work in a light that the author can agree with,
+and create a burden of dealing with (new) users seeking for support for
+such versions.
+
---
+ion-3rc-20070608
+----------------
+
+This is the second "rc" release, and contains primarily bug fixes
+and other minor improvements.
+
+
ion-3rc-20070506
----------------
+2007-06-08 16:58 UTC Tuomo Valkonen <tuomov@iki.fi>
+ tagged ion-doc-3rc-20070608
+
2007-05-06 14:40 UTC Tuomo Valkonen <tuomov@iki.fi>
tagged ion-doc-3rc-20070506
Context:
-[TAG ion-doc-3rc-20070506
-Tuomo Valkonen <tuomov@iki.fi>**20070506144001]
+[TAG ion-doc-3rc-20070608
+Tuomo Valkonen <tuomov@iki.fi>**20070608165851]
\title{Configuring and extending Ion3 with Lua}
\author{Tuomo Valkonen \\ tuomov at iki.fi}
-\date{2007-05-06}
+\date{2007-06-08}
\makeindex
-This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=latex 2007.4.8) 6 MAY 2007 17:46
+This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=latex 2007.4.8) 8 JUN 2007 20:00
entering extended mode
**./images.tex
(./images.tex
]
-l2hSize :tex2html_wrap_inline5502:7.5626pt::7.5626pt::14.53923pt.
+l2hSize :tex2html_wrap_inline5512:7.5626pt::7.5626pt::14.53923pt.
[4
]
-l2hSize :tex2html_wrap_inline5504:7.5626pt::7.5626pt::14.53923pt.
+l2hSize :tex2html_wrap_inline5514:7.5626pt::7.5626pt::14.53923pt.
[5
]
-l2hSize :tex2html_wrap_inline7754:8.7125pt::8.7125pt::86.9574pt.
+l2hSize :tex2html_wrap_inline7764:8.7125pt::8.7125pt::86.9574pt.
[6
Here is how much of TeX's memory you used:
4467 strings out of 94501
63452 string characters out of 1175795
- 123525 words of memory out of 1000000
+ 123527 words of memory out of 1000000
7611 multiletter control sequences out of 10000+50000
7874 words of font info for 24 fonts, out of 500000 for 2000
580 hyphenation exceptions out of 8191
\title{Configuring and extending Ion3 with Lua}
\author{Tuomo Valkonen \\tuomov at iki.fi}
-\date{2007-05-06}
+\date{2007-06-08}
\makeindex
\stepcounter{subsection}
\stepcounter{subsection}
{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline5502}%
+\lthtmlinlinemathA{tex2html_wrap_inline5512}%
$-1$%
\lthtmlinlinemathZ
\lthtmlcheckvsize\clearpage}
{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline5504}%
+\lthtmlinlinemathA{tex2html_wrap_inline5514}%
$-2$%
\lthtmlinlinemathZ
\lthtmlcheckvsize\clearpage}
\stepcounter{section}
\stepcounter{subsection}
{\newpage\clearpage
-\lthtmlinlinemathA{tex2html_wrap_inline7754}%
+\lthtmlinlinemathA{tex2html_wrap_inline7764}%
$\{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>2007-05-06</STRONG></P>
+<P ALIGN="CENTER"><STRONG>2007-06-08</STRONG></P>
</DIV>
<P>
<P ALIGN="CENTER"><STRONG>Tuomo Valkonen</STRONG></P>
<P ALIGN="CENTER"><I>tuomov at iki.fi</I></P>
-<P ALIGN="CENTER"><STRONG>2007-05-06</STRONG></P>
+<P ALIGN="CENTER"><STRONG>2007-06-08</STRONG></P>
</DIV>
<P>
<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1473"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
</DL>
<DD><STRONG><TT>clientwin_do_manage_alt</TT></STRONG>
- : <A HREF="node7.html#8232"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8242"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>clientwin_mapped_hook</TT></STRONG>
- : <A HREF="node7.html#8233"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8243"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>clientwin_property_change_hook</TT></STRONG>
- : <A HREF="node7.html#8234"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8244"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>clientwin_unmapped_hook</TT></STRONG>
- : <A HREF="node7.html#8235"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8245"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><SPAN CLASS="textbf">Control</SPAN></STRONG>
: <A HREF="node4.html#879"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
<DD><STRONG><TT>defmenu</TT></STRONG>
<DD><STRONG><TT>float</TT></STRONG>
: <A HREF="node4.html#1452"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
<DD><STRONG><TT>frame_managed_changed_hook</TT></STRONG>
- : <A HREF="node7.html#8236"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8246"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>fullscreen</TT></STRONG>
: <A HREF="node4.html#1453"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
<DD><STRONG><TT>ignore_resizeinc</TT></STRONG>
<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1475"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
</DL>
<DD><STRONG><TT>ioncore_deinit_hook</TT></STRONG>
- : <A HREF="node7.html#8238"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8248"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>ioncore_post_layout_setup_hook</TT></STRONG>
- : <A HREF="node7.html#8239"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8249"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>ioncore_sigchld_hook</TT></STRONG>
- : <A HREF="node7.html#8237"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8247"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>ioncore_snapshot_hook</TT></STRONG>
- : <A HREF="node7.html#8240"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8250"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>ioncore_submap_ungrab_hook</TT></STRONG>
- : <A HREF="node7.html#8241"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8251"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>is_dockapp</TT></STRONG><DL>
<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1478"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
</DL>
<DD><STRONG><TT>PREFIX</TT></STRONG>
: <A HREF="node4.html#582"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN></A>
<DD><STRONG><TT>region_do_warp_alt</TT></STRONG>
- : <A HREF="node7.html#8243"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8253"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>region_notify_hook</TT></STRONG>
- : <A HREF="node7.html#8245"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8255"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><TT>role</TT></STRONG><DL>
<DD><STRONG>winprop</STRONG> : <A HREF="node4.html#1474"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">2</SPAN></A>
</DL>
<DD><STRONG>X</STRONG> : <A HREF="node3.html#332"><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#8244"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8254"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG><SPAN CLASS="textbf">ScrollLock</SPAN></STRONG>
: <A HREF="node4.html#886"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
<DD><STRONG><SPAN CLASS="textbf">Shift</SPAN></STRONG>
<DD><STRONG><TT>target</TT></STRONG>
: <A HREF="node4.html#1461"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN></A>
<DD><STRONG><TT>tiling_placement_alt</TT></STRONG>
- : <A HREF="node7.html#8242"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
+ : <A HREF="node7.html#8252"><SPAN CLASS="arabic">6</SPAN>.<SPAN CLASS="arabic">9</SPAN></A>
<DD><STRONG>transient</STRONG>
: <A HREF="node4.html#1432"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN>.<SPAN CLASS="arabic">3</SPAN></A>
<DD><STRONG><TT>transient_mode</TT></STRONG>
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 2007-05-06
+The translation was initiated by tuomov on 2007-06-08
<BR><HR>
</BODY>
<DT><STRONG>Description:</STRONG></DT>
<DD>Define bindings for context <TT>context</TT>. Here <TT>binding</TT> is
a table composed of entries created with <A HREF="#fn:ioncore.kpress"><TT>ioncore.kpress</TT></A>,
- etc.; see section <A HREF="node4.html#sec:bindings">3.3</A> for details.
+ etc.; see Section <A HREF="node4.html#sec:bindings">3.3</A> for details.
</DD>
</DL>
</DD>
<DT><STRONG>Description:</STRONG></DT>
-<DD>Run <TT>cmd</TT> with a read pipe connected to its stdout.
- When data is received through the pipe, <TT>handler</TT> is called
- with that data.
+<DD>Run <TT>cmd</TT> with a read pipe connected to its stdout and stderr.
+ When data is received through one of these pipes, <TT>h</TT> or <TT>errh</TT>
+ is called with that data. When the pipe is closed, the handler is called
+ with <TT>nil</TT> argument. The PID of the new process is returned, or
+ -1 on error.
</DD>
</DL>
</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Creates a binding description table for the action of pressing a key given
- by <TT>keyspec</TT> (with possible modifiers) to the function <TT>func</TT>.
- For more information on bindings, see section <A HREF="node4.html#sec:bindings">3.3</A>.
+ by <TT>keyspec</TT> (with possible modifiers) to the function <TT>cmd</TT>.
+ The <TT>guard</TT> controls when the binding can be called.
+ For more informationp see Section <A HREF="node4.html#sec:bindings">3.3</A>.
</DD>
</DL>
</DD>
<DT><STRONG>Description:</STRONG></DT>
-<DD>This is similar to <A HREF="#fn:kpress"><TT>kpress</TT></A> but after calling <TT>cmd</TT>,
+<DD>This is similar to <A HREF="#fn:ioncore.kpress"><TT>ioncore.kpress</TT></A> but after calling <TT>cmd</TT>,
Ioncore waits for all modifiers to be released before processing
any further actions.
- For more information on bindings, see section <A HREF="node4.html#sec:bindings">3.3</A>.
+ For more information on bindings, see Section <A HREF="node4.html#sec:bindings">3.3</A>.
</DD>
</DL>
<DT><STRONG>Description:</STRONG></DT>
<DD>Creates a binding description table for the action of clicking a mouse
button while possible modifier keys are pressed,
- both given by <TT>buttonspec</TT>, to the function <TT>func</TT>.
- For more information, see section <A HREF="node4.html#sec:bindings">3.3</A>.
+ both given by <TT>buttonspec</TT>, to the function <TT>cmd</TT>.
+ For more information, see Section <A HREF="node4.html#sec:bindings">3.3</A>.
</DD>
</DL>
</DD>
<DT><STRONG>Description:</STRONG></DT>
-<DD>Similar to <A HREF="#fn:mclick"><TT>mclick</TT></A> but for double-click.
- Also see section <A HREF="node4.html#sec:bindings">3.3</A>.
+<DD>Similar to <A HREF="#fn:ioncore.mclick"><TT>ioncore.mclick</TT></A> but for double-click.
+ Also see Section <A HREF="node4.html#sec:bindings">3.3</A>.
</DD>
</DL>
</DD>
<DT><STRONG>Description:</STRONG></DT>
-<DD>Similar to <A HREF="#fn:mclick"><TT>mclick</TT></A> but for just pressing the mouse button.
- Also see section <A HREF="node4.html#sec:bindings">3.3</A>.
+<DD>Similar to <A HREF="#fn:ioncore.mclick"><TT>ioncore.mclick</TT></A> but for just pressing the mouse button.
+ Also see Section <A HREF="node4.html#sec:bindings">3.3</A>.
</DD>
</DL>
<DD><A NAME="fn:ioncore.submap"></A>
</DD>
<DT><STRONG>Synopsis:</STRONG></DT>
-<DD><TT>ioncore.submap(kcb_, list)</TT>
+<DD><TT>ioncore.submap(keyspec, list)</TT>
</DD>
<DT><STRONG>Description:</STRONG></DT>
<DD>Returns a function that creates a submap binding description table.
When the key press action <TT>keyspec</TT> occurs, Ioncore will wait for
a further key presse and act according to the submap.
- For details, see section <A HREF="node4.html#sec:bindings">3.3</A>.
+ For details, see Section <A HREF="node4.html#sec:bindings">3.3</A>.
</DD>
</DL>
<TR><TD ALIGN="LEFT"><TT>sizepolicy</TT></TD>
<TD ALIGN="LEFT">(string) Size policy; see Section <A HREF="#sec:sizepolicies">6.10.1</A>.</TD>
</TR>
+<TR><TD ALIGN="LEFT"><TT>bottom</TT></TD>
+<TD ALIGN="LEFT">(boolean) Mark the attached region as the
+ ``bottom'' of <TT>ws</TT>.</TD>
+</TR>
</TABLE>
<P>
</DD>
<DT><STRONG>Description:</STRONG></DT>
-<DD>Returns the <TT>n</TT>:th object managed by <TT>mplex</TT> on the
- <TT>l</TT>:th layer.
+<DD>Returns the <TT>n</TT>:th object on the mutually exclusive
+ list of <TT>mplex</TT>.
</DD>
</DL>
<TD ALIGN="LEFT">Description</TD>
</TR>
<TR><TD ALIGN="LEFT"><TT>pos</TT></TD>
-<TD ALIGN="LEFT">The corner of the screen to place the status display
- in: one of `<TT>tl</TT>', `<TT>tr</TT>', `<TT>bl</TT>'
+<TD ALIGN="LEFT">(string) The corner of the screen to place the status
+ display in: one of `<TT>tl</TT>', `<TT>tr</TT>', `<TT>bl</TT>'
or `<TT>br</TT>'.</TD>
</TR>
+<TR><TD ALIGN="LEFT"><TT>fullsize</TT></TD>
+<TD ALIGN="LEFT">(boolean) Waste all available space.</TD>
+</TR>
<TR><TD ALIGN="LEFT"><TT>action</TT></TD>
-<TD ALIGN="LEFT">If this field is set to `<TT>keep</TT>', <TT>corner</TT>
- and <TT>orientation</TT> are changed for the existing
+<TD ALIGN="LEFT">(string) If this field is set to `<TT>keep</TT>',
+ <TT>pos</TT> and <TT>fullsize</TT> are changed for the existing
status display. If this field is set to `<TT>remove</TT>',
the existing status display is removed. If this
field is not set or is set to `<TT>replace</TT>', a
</DD>
<DT><STRONG>Description:</STRONG></DT>
-<DD>Flip contents of <TT>node</TT>.
+<DD>Flip contents of <TT>split</TT>.
</DD>
</DL>
</TR>
<TR><TD ALIGN="LEFT"><TT>pos</TT></TD>
<TD ALIGN="LEFT">string</TD>
-<TD ALIGN="LEFT">Position: <TT>"tl"</TT>, <TT>"tr"</TT>,
- <TT>"bl"</TT> or <TT>"br"</TT>
+<TD ALIGN="LEFT">Position: `<TT>tl</TT>', `<TT>tr</TT>',
+ `<TT>bl</TT>' or `<TT>br</TT>'
(for the obvious combinations of
top/left/bottom/right).</TD>
</TR>
<P>
<DL>
-<DD><A NAME="8232"></A>
+<DD><A NAME="8242"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8233"></A>
+<DD><A NAME="8243"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8234"></A>
+<DD><A NAME="8244"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8235"></A>
+<DD><A NAME="8245"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8236"></A>
+<DD><A NAME="8246"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8237"></A>
+<DD><A NAME="8247"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8238"></A>
+<DD><A NAME="8248"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8239"></A>
+<DD><A NAME="8249"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8240"></A>
+<DD><A NAME="8250"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8241"></A>
+<DD><A NAME="8251"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8242"></A>
+<DD><A NAME="8252"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8243"></A>
+<DD><A NAME="8253"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8244"></A>
+<DD><A NAME="8254"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
<P>
<DL>
-<DD><A NAME="8245"></A>
+<DD><A NAME="8255"></A>
</DD>
<DT><STRONG>Hook name:</STRONG></DT>
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 2007-05-06
+The translation was initiated by tuomov on 2007-06-08
<BR><HR>
</BODY>
-- Movement commands warp the pointer to frames instead of just
-- changing focus. Enabled by default.
--warp=true,
+
+ -- Switch frames to display newly mapped windows
+ --switchto=true,
+
+ -- Default index for windows in frames: one of 'last', 'next' (for
+ -- after current), or 'next-act' (for after current and anything with
+ -- activity right after it).
+ --frame_default_index='next',
+
+ -- Auto-unsqueeze transients/menus/queries.
+ --unsqueeze=true,
+
+ -- Display notification tooltips for activity on hidden workspace.
+ --screen_notify=true,
}
-- commented out below, except mod_dock. If you do not want to load
-- something, comment out this line, and uncomment the lines corresponding
-- the the modules or configuration files that you want, below.
+-- The modules' configuration files correspond to the names of the
+-- modules with 'mod' replaced by 'cfg'.
dopath("cfg_defaults")
-- Load configuration of the Ion 'core'
border_sides = "all",
})
-de.defstyle("frame-transient", {
- bar = "none",
- padding_pixels = 1,
-})
-
dopath("lookcommon_clean")
-
+
-- Refresh objects' brushes.
gr.refresh()
-- For user scripts
padding_colour = "#009010",
}),
+ padding_pixels = 1,
})
de.defstyle("frame-tiled", {
shadow_pixels = 0,
highlight_pixels = 0,
- padding_pixels = 1,
spacing = 1,
})
padding_pixels = 0,
})
+de.defstyle("frame-transient", {
+ bar = "none",
+ padding_pixels = 0,
+})
+
de.defstyle("actnotify", {
shadow_colour = "#c04040",
Context:
-[TAG ion-3rc-20070506
-Tuomo Valkonen <tuomov@iki.fi>**20070506144318]
+[TAG ion-3rc-20070608
+Tuomo Valkonen <tuomov@iki.fi>**20070608165559]
/*EXTL_DOC
- * Run \var{cmd} with a read pipe connected to its stdout.
- * When data is received through the pipe, \var{handler} is called
- * with that data.
+ * Run \var{cmd} with a read pipe connected to its stdout and stderr.
+ * When data is received through one of these pipes, \var{h} or \var{errh}
+ * is called with that data. When the pipe is closed, the handler is called
+ * with \code{nil} argument. The PID of the new process is returned, or
+ * -1 on error.
*/
EXTL_SAFE
EXTL_EXPORT
g.y=0;
}
- if(rectangle_contains(&g, ev->x, ev->y)){
+ if(frame->barmode!=FRAME_BAR_NONE &&
+ rectangle_contains(&g, ev->x, ev->y)){
p_tabnum=frame_tab_at_x(frame, ev->x);
region_rootpos((WRegion*)frame, &p_tab_x, &p_tab_y);
* \var{level} & (integer) Stacking level; default is 1. \\
* \var{modal} & (boolean) Make object modal; ignored if level is set. \\
* \var{sizepolicy} & (string) Size policy; see Section \ref{sec:sizepolicies}. \\
+ * \var{bottom} & (boolean) Mark the attached region as the
+ * ``bottom'' of \var{ws}. \\
* \end{tabularx}
*
* In addition parameters to the region to be created are passed in this
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
+#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <ctype.h>
-- Returns a function that creates a submap binding description table.
-- When the key press action \var{keyspec} occurs, Ioncore will wait for
-- a further key presse and act according to the submap.
--- For details, see section \ref{sec:bindings}.
-function ioncore.submap(kcb_, list)
+-- For details, see Section \ref{sec:bindings}.
+function ioncore.submap(keyspec, list)
if not list then
return function(lst)
- return submap(kcb_, lst)
+ return submap(keyspec, lst)
end
end
- return {action = "kpress", kcb = kcb_, submap = list}
+ return {action = "kpress", kcb = keyspec, submap = list}
end
--DOC
-- Creates a binding description table for the action of pressing a key given
--- by \var{keyspec} (with possible modifiers) to the function \var{func}.
--- For more information on bindings, see section \ref{sec:bindings}.
+-- by \var{keyspec} (with possible modifiers) to the function \var{cmd}.
+-- The \var{guard} controls when the binding can be called.
+-- For more informationp see Section \ref{sec:bindings}.
function ioncore.kpress(keyspec, cmd, guard)
return putcmd(cmd, guard, {action = "kpress", kcb = keyspec})
end
--DOC
--- This is similar to \fnref{kpress} but after calling \var{cmd},
+-- This is similar to \fnref{ioncore.kpress} but after calling \var{cmd},
-- Ioncore waits for all modifiers to be released before processing
-- any further actions.
--- For more information on bindings, see section \ref{sec:bindings}.
+-- For more information on bindings, see Section \ref{sec:bindings}.
function ioncore.kpress_wait(keyspec, cmd, guard)
return putcmd(cmd, guard, {action = "kpress_wait", kcb = keyspec})
end
--DOC
-- Creates a binding description table for the action of clicking a mouse
-- button while possible modifier keys are pressed,
--- both given by \var{buttonspec}, to the function \var{func}.
--- For more information, see section \ref{sec:bindings}.
+-- both given by \var{buttonspec}, to the function \var{cmd}.
+-- For more information, see Section \ref{sec:bindings}.
function ioncore.mclick(buttonspec, cmd, guard)
return mact("mclick", buttonspec, cmd, guard)
end
--DOC
--- Similar to \fnref{mclick} but for double-click.
--- Also see section \ref{sec:bindings}.
+-- Similar to \fnref{ioncore.mclick} but for double-click.
+-- Also see Section \ref{sec:bindings}.
function ioncore.mdblclick(buttonspec, cmd, guard)
return mact("mdblclick", buttonspec, cmd, guard)
end
--DOC
--- Similar to \fnref{mclick} but for just pressing the mouse button.
--- Also see section \ref{sec:bindings}.
+-- Similar to \fnref{ioncore.mclick} but for just pressing the mouse button.
+-- Also see Section \ref{sec:bindings}.
function ioncore.mpress(buttonspec, cmd, guard)
return mact("mpress", buttonspec, cmd, guard)
end
--DOC
-- Define bindings for context \var{context}. Here \var{binding} is
-- a table composed of entries created with \fnref{ioncore.kpress},
--- etc.; see section \ref{sec:bindings} for details.
+-- etc.; see Section \ref{sec:bindings} for details.
function ioncore.defbindings(context, bindings)
local function filterdoc(b)
local t={}
struct timeval tv;
long adiff, udiff;
- gettimeofday(&tv, NULL);
+ if(mainloop_gettime(&tv)!=0)
+ return;
adiff=tvdiffmsec(&tv, &last_action_tv);
udiff=tvdiffmsec(&tv, &last_update_tv);
}
-enum{GRAB_NONE, GRAB_SUBMAP, GRAB_WAITRELEASE};
+enum{GRAB_NONE, GRAB_NONE_SUBMAP, GRAB_SUBMAP, GRAB_WAITRELEASE};
static WBinding *lookup_binding_(WRegion *reg,
oreg->submapstat,
&binding_owner, &subreg);
- ret=(grabbed ? GRAB_SUBMAP : GRAB_NONE);
+ ret=(grabbed ? GRAB_SUBMAP : GRAB_NONE_SUBMAP);
}
}else{
call=binding;
submapgrab(reg);
else if(grab==GRAB_WAITRELEASE)
waitrelease(reg);
+ else if(grab==GRAB_NONE_SUBMAP)
+ /* nothing */;
else if(grab==GRAB_NONE && reg->submapstat!=NULL)
clear_subs(reg);
}
/*EXTL_DOC
- * Returns the \var{n}:th object managed by \var{mplex} on the
- * \var{l}:th layer.
+ * Returns the \var{n}:th object on the mutually exclusive
+ * list of \var{mplex}.
*/
EXTL_SAFE
EXTL_EXPORT_MEMBER
static void get_params(WMPlex *mplex, ExtlTab tab, int mask,
WMPlexAttachParams *par)
{
- int layer=1;
int tmp;
char *tmpstr;
int ok=~mask;
*
* \begin{tabularx}{\linewidth}{lX}
* \tabhead{Field & Description}
- * \var{pos} & The corner of the screen to place the status display
- * in: one of \codestr{tl}, \codestr{tr}, \codestr{bl}
+ * \var{pos} & (string) The corner of the screen to place the status
+ * display in: one of \codestr{tl}, \codestr{tr}, \codestr{bl}
* or \codestr{br}. \\
- * \var{action} & If this field is set to \codestr{keep}, \var{corner}
- * and \var{orientation} are changed for the existing
+ * \var{fullsize} & (boolean) Waste all available space. \\
+ * \var{action} & (string) If this field is set to \codestr{keep},
+ * \var{pos} and \var{fullsize} are changed for the existing
* status display. If this field is set to \codestr{remove},
* the existing status display is removed. If this
* field is not set or is set to \codestr{replace}, a
#define MPLEX_ATTACH_SWITCHTO 0x0001 /* switch to region */
#define MPLEX_ATTACH_UNNUMBERED 0x0002 /* do not put on mut.ex list */
#define MPLEX_ATTACH_HIDDEN 0x0004 /* should be hidden */
-#define MPLEX_ATTACH_PSEUDOMODAL 0x0004 /* pseudomodal (if modal) */
+#define MPLEX_ATTACH_PSEUDOMODAL 0x0008 /* pseudomodal (if modal) */
#define MPLEX_ATTACH_LEVEL 0x0010 /* level field set */
#define MPLEX_ATTACH_GEOM 0x0020 /* geometry field is set */
#define MPLEX_ATTACH_SIZEPOLICY 0x0040 /* size policy field is set */
/*}}}*/
-/*{{{ Move, attach, layer */
+/*{{{ Move, attach */
typedef struct{
};
-/* If 'after' is set, it is used, otherwise 'or_after',
- * and finally 'or_layer' if this is also unset
+/* If 'either_st' is set, it is used, otherwise 'or_param', is used.
*/
extern WMPlexPHolder *create_mplexpholder(WMPlex *mplex,
WMPlexAttachParams *or_param);
extern void mplexpholder_deinit(WMPlexPHolder *ph);
-extern int mplexpholder_layer(WMPlexPHolder *ph);
-
extern WRegion *mplexpholder_do_attach(WMPlexPHolder *ph, int flags,
WRegionAttachData *data);
static bool continuation_set=FALSE;
static ExtlFn continuation;
+#define CLIPATOM(X) XA_PRIMARY
+
+static Atom XA_COMPOUND_TEXT(Display *unused)
+{
+ static Atom a=None;
+
+ if(a==None)
+ a=XInternAtom(ioncore_g.dpy, "COMPOUND_TEXT", False);
+
+ return a;
+}
+
+
void ioncore_handle_selection_request(XSelectionRequestEvent *ev)
{
XSelectionEvent sev;
+ XTextProperty prop;
const char *p[1];
+ bool ok=FALSE;
- if(selection_data==NULL)
- return;
+ sev.property=None;
+ sev.target=None;
+
+ if(selection_data==NULL || ev->property==None)
+ goto refuse;
p[0]=selection_data;
- xwindow_set_text_property(ev->requestor, ev->property, p, 1);
+ if(!ioncore_g.use_mb && ev->target==XA_STRING){
+ Status st=XStringListToTextProperty((char **)&p, 1, &prop);
+ ok=st;
+ }else if(ioncore_g.use_mb){
+ XICCEncodingStyle style;
+
+ if(ev->target==XA_STRING){
+ style=XStringStyle;
+ ok=TRUE;
+ }else if(ev->target==XA_COMPOUND_TEXT(ioncore_g.dpy)){
+ style=XCompoundTextStyle;
+ ok=TRUE;
+ }
+
+ if(ok){
+ Status st=XmbTextListToTextProperty(ioncore_g.dpy, (char **)p, 1,
+ style, &prop);
+ ok=!st;
+ }
+ }
+ if(ok){
+ XSetTextProperty(ioncore_g.dpy, ev->requestor, &prop, ev->property);
+ sev.target=prop.encoding;
+ sev.property=ev->property;
+ XFree(prop.value);
+ }
+
+refuse:
sev.type=SelectionNotify;
sev.requestor=ev->requestor;
sev.selection=ev->selection;
- sev.target=ev->target;
sev.time=ev->time;
- sev.property=ev->property;
XSendEvent(ioncore_g.dpy, ev->requestor, False, 0L, (XEvent*)&sev);
}
XStoreBytes(ioncore_g.dpy, p, n);
- XSetSelectionOwner(ioncore_g.dpy, XA_PRIMARY,
+ XSetSelectionOwner(ioncore_g.dpy, CLIPATOM(ioncore_g.dpy),
DefaultRootWindow(ioncore_g.dpy),
CurrentTime);
}
continuation_set=FALSE;
}
- if(ioncore_g.use_mb){
-#ifdef X_HAVE_UTF8_STRING
- a=XInternAtom(ioncore_g.dpy, "UTF8_STRING", True);
-#else
- a=XInternAtom(ioncore_g.dpy, "COMPOUND_TEXT", True);
-#endif
- }
+ if(ioncore_g.use_mb)
+ a=XA_COMPOUND_TEXT(ioncore_g.dpy);
- XConvertSelection(ioncore_g.dpy, XA_PRIMARY, a,
+ XConvertSelection(ioncore_g.dpy, CLIPATOM(ioncore_g.dpy), a,
ioncore_g.atom_selection, win, CurrentTime);
}
void *filt_data)
{
uint min_level=STACKING_LEVEL_BOTTOM;
- WStacking *st=NULL;
+ WStacking *st=NULL, *found=NULL;
if(stacking==NULL)
return NULL;
if(st->level<min_level)
break; /* no luck */
-
- if(st==to_try || cf(approve_filt, filt_data, st))
+
+ if(st==to_try)
return st;
+ if(found==NULL && cf(approve_filt, filt_data, st)){
+ found=st;
+ if(to_try==NULL)
+ break;
+ }
+
if(st->level>=STACKING_LEVEL_MODAL1)
min_level=maxof(min_level, st->level);
}while(st!=stacking);
- return NULL;
+ return found;
}
static WTimer *queue=NULL;
+int mainloop_gettime(struct timeval *val)
+{
+#ifdef _POSIX_MONOTONIC_CLOCK
+ struct timespec spec;
+ int ret;
+
+ ret=clock_gettime(CLOCK_MONOTONIC, &spec);
+
+ val->tv_sec=spec.tv_sec;
+ val->tv_usec=spec.tv_nsec/1000;
+
+ return ret;
+#else
+ return gettimeofday(&val, NULL);
+#endif
+}
+
+
#define TIMEVAL_LATER(a, b) \
((a.tv_sec > b.tv_sec) || \
((a.tv_sec == b.tv_sec) && \
}
/* Subtract queue time from current time, don't go below zero */
- gettimeofday(&(val.it_value), NULL);
+ mainloop_gettime(&(val.it_value));
if(TIMEVAL_LATER((queue)->when, val.it_value)){
if(queue->when.tv_usec<val.it_value.tv_usec){
queue->when.tv_usec+=USECS_IN_SEC;
/* Check for timer events in the queue */
while(had_tmr && queue!=NULL){
had_tmr=FALSE;
- gettimeofday(¤t_time, NULL);
+ mainloop_gettime(¤t_time);
while(queue!=NULL){
if(TIMEVAL_LATER(current_time, queue->when)){
q=queue;
{
long tmp_usec;
- gettimeofday(when, NULL);
+ mainloop_gettime(when);
tmp_usec=when->tv_usec + (msecs * 1000);
when->tv_usec=tmp_usec % 1000000;
when->tv_sec+=tmp_usec / 1000000;
extern WHook *mainloop_sigchld_hook;
extern WHook *mainloop_sigusr2_hook;
+/* Returns monotonic time if possible */
+extern int mainloop_gettime(struct timeval *val);
+
#endif /* ION_LIBMAINLOOP_SIGNAL_H */
.SH VIZ TAKÉ
Domovská stránka Ionu \fIhttp://iki.fi/tuomov/ion/\fP
.PP
-Dokument "Ion: Configuring and extending with Lua" k nalezení
+Dokument "Configuring and extending Ion3 with Lua" k nalezení
tamté¾.
.PP
.I DOCDIR/
.SH KATSO MYÖS
Ionin kotisivu, \fIhttp://iki.fi/tuomov/ion/\fP (englanniksi).
.PP
-Dokumentti "Ion: Configuring and extending with Lua" (englanniksi)
+Dokumentti "Configuring and extending Ion3 with Lua" (englanniksi)
nähtävissä Ionin kotisivulla.
.PP
.I DOCDIR/
.SH SEE ALSO
The Ion home page, \fIhttp://iki.fi/tuomov/ion/\fP
.PP
-The document "Ion: Configuring and extending with Lua" found on the
+The document "Configuring and extending Ion3 with Lua" found on the
Ion home page.
.PP
.I DOCDIR/
static void do_draw_listing(GrBrush *brush, const WRectangle *geom,
- WListing *l, GrAttr selattr)
+ WListing *l, GrAttr selattr, int mode)
{
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);
+ if(mode>=0 ||
+ l->selected_str==i ||
+ LISTING_DRAW_GET_SELECTED(mode)==i){
- if(i==l->selected_str)
- grbrush_unset_attr(brush, selattr);
+ 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);
+
+ if(i==l->selected_str)
+ grbrush_unset_attr(brush, selattr);
+ }
y+=l->itemh*ITEMROWS(l, i);
r+=ITEMROWS(l, i);
}
+static int prevsel=-1;
+
+static bool filteridx_sel(WListing *l, int i)
+{
+ return (i==prevsel || i==l->selected_str);
+}
+
+
void draw_listing(GrBrush *brush, const WRectangle *geom,
- WListing *l, bool complete, GrAttr selattr)
+ WListing *l, int mode, GrAttr selattr)
{
WRectangle geom2;
GrBorderWidths bdw;
grbrush_begin(brush, geom, GRBRUSH_AMEND|GRBRUSH_KEEP_ATTR
|GRBRUSH_NEED_CLIP);
- if(complete)
+ if(mode==LISTING_DRAW_COMPLETE)
grbrush_clear_area(brush, geom);
grbrush_draw_border(brush, geom);
geom2.w=geom->w-bdw.left-bdw.right;
geom2.h=geom->h-bdw.top-bdw.bottom;
- do_draw_listing(brush, &geom2, l, selattr);
+ do_draw_listing(brush, &geom2, l, selattr, mode);
grbrush_end(brush);
}
}
-bool listing_select(WListing *l, int i)
+int listing_select(WListing *l, int i)
{
int irow, frow, lrow;
- bool complredraw=FALSE;
+ int redraw;
+
+ redraw=LISTING_DRAW_SELECTED(l->selected_str);
if(i<0){
l->selected_str=-1;
- return FALSE;
+ return redraw;
}
assert(i<l->nstrs);
while(irow<frow){
one_row_up(l, &(l->firstitem), &(l->firstoff));
frow--;
- complredraw=TRUE;
+ redraw=LISTING_DRAW_COMPLETE;
}
irow+=ITEMROWS(l, i)-1;
while(irow>lrow){
one_row_down(l, &(l->firstitem), &(l->firstoff));
lrow++;
- complredraw=TRUE;
+ redraw=LISTING_DRAW_COMPLETE;
}
- return complredraw;
+ return redraw;
}
#include <ioncore/common.h>
#include <ioncore/gr.h>
#include <ioncore/rectangle.h>
+#include <libtu/minmax.h>
INTRSTRUCT(WListing);
INTRSTRUCT(WListingItemInfo);
bool onecol;
};
+
+#define LISTING_DRAW_COMPLETE 1
+#define LISTING_DRAW_ALL 0
+#define LISTING_DRAW_SELECTED(X) minof(-1, -(X)-2)
+#define LISTING_DRAW_GET_SELECTED(X) (-(X)-2)
+
+
extern void init_listing(WListing *l);
extern void setup_listing(WListing *l, char **strs, int nstrs, bool onecol);
extern void deinit_listing(WListing *l);
/*{{{ Draw */
-void wedln_draw_completions(WEdln *wedln, bool complete)
+void wedln_draw_completions(WEdln *wedln, int mode)
{
WRectangle geom;
get_completions_geom(wedln, G_CURRENT, &geom);
draw_listing(WEDLN_BRUSH(wedln), &geom, &(wedln->compl_list),
- complete, GR_ATTR(selection));
+ mode, GR_ATTR(selection));
}
}
: GR_ATTR(inactive));
if(completions)
- wedln_draw_completions(wedln, FALSE);
+ wedln_draw_completions(wedln, LISTING_DRAW_ALL);
wedln_draw_textarea(wedln);
input_refit((WInput*)wedln);
if(w==REGION_GEOM(wedln).w && h==REGION_GEOM(wedln).h)
- wedln_draw_completions(wedln, TRUE);
+ wedln_draw_completions(wedln, LISTING_DRAW_COMPLETE);
}
if(wedln->compl_list.strs==NULL)
return;
if(scrollup_listing(&(wedln->compl_list)))
- wedln_draw_completions(wedln, TRUE);
+ wedln_draw_completions(wedln, LISTING_DRAW_COMPLETE);
}
if(wedln->compl_list.strs==NULL)
return;
if(scrolldown_listing(&(wedln->compl_list)))
- wedln_draw_completions(wedln, TRUE);
+ wedln_draw_completions(wedln, LISTING_DRAW_COMPLETE);
}
static void wedln_do_select_completion(WEdln *wedln, int n)
{
- bool complredraw=listing_select(&(wedln->compl_list), n);
- wedln_draw_completions(wedln, complredraw);
+ bool redraw=listing_select(&(wedln->compl_list), n);
+ wedln_draw_completions(wedln, redraw);
update_nocompl++;
edln_set_completion(&(wedln->edln), wedln->compl_list.strs[n],
{
WRegion *reg;
WRegionAttachData data;
- WGroupAttachParams par;
+ WGroupAttachParams par=GROUPATTACHPARAMS_INIT;
WGroupWS *ws;
ws=create_groupws(parent, fp);
static WRegion *create(WMPlex *mplex, int flags)
{
WRegion *sp;
- WMPlexAttachParams par;
-
+ WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
+
par.flags=(flags
|MPLEX_ATTACH_UNNUMBERED
|MPLEX_ATTACH_SIZEPOLICY
return (double)(st.st_mtime>st.st_ctime ? st.st_mtime : st.st_ctime);
}
+
+EXTL_EXPORT
+ExtlTab statusd_getloadavg()
+{
+ ExtlTab t=extl_create_table();
+ double l[3];
+ int n;
+
+ n=getloadavg(l, 3);
+
+ if(n>=1)
+ extl_table_sets_d(t, "1min", l[0]);
+ if(n>=2)
+ extl_table_sets_d(t, "5min", l[1]);
+ if(n>=3)
+ extl_table_sets_d(t, "15min", l[2]);
+
+ return t;
+}
+
local defaults={
update_interval=10*1000,
- load_hint=1,
+ load_hint="1min",
important_threshold=1.5,
critical_threshold=4.0
}
local settings=table.join(statusd.get_config("load"), defaults)
-local loadpat='^(%d+%.%d+).*(%d+%.%d+).*(%d+%.%d+)'
+local load_timer
-local function get_load_proc()
- local f=io.open('/proc/loadavg', 'r')
- if not f then
- return ""
- end
- local s=f:read('*l')
- f:close()
- local st, en, load=string.find(s, '^(%d+%.%d+ %d+%.%d+ %d+%.%d+)')
-
- return string.gsub((load or ""), " ", ", ")
-end
-
-local function get_load_uptime()
- local f=io.popen('uptime', 'r')
- if not f then
- return "??"
- end
- local s=f:read('*l')
- f:close()
- local st, en, load=string.find(s, 'load averages?:%s*(.*)')
- return (load or "")
-end
-
-local function detect_load_fn()
- if get_load_proc()~="" then
- return get_load_proc
- else
- return get_load_uptime
- end
-end
-
-local get_load, load_timer
-
-local function get_hint(l)
- local v=tonumber(l)
+local function get_hint(v)
local i="normal"
if v then
if v>settings.critical_threshold then
return i
end
-local l1min, l5min, l15min=2+1, 2+2, 2+3
+local function fmt(l)
+ if not l then
+ return "?"
+ else
+ return string.format("%0.2f", l)
+ end
+end
local function update_load()
- local l = get_load()
- local lds={string.find(l, loadpat)}
- statusd.inform("load", l)
- statusd.inform("load_hint", get_hint(lds[settings.load_hint+2]))
- statusd.inform("load_1min", lds[l1min])
- statusd.inform("load_1min_hint", get_hint(lds[l1min]))
- statusd.inform("load_5min", lds[l5min])
- statusd.inform("load_5min_hint", get_hint(lds[l5min]))
- statusd.inform("load_15min", lds[l15min])
- statusd.inform("load_15min_hint", get_hint(lds[l15min]))
+ local lds = statusd.getloadavg()
+ f1, f5, f15 = fmt(lds["1min"]), fmt(lds["5min"]), fmt(lds["15min"])
+ statusd.inform("load", f1..", "..f5..", "..f15)
+ statusd.inform("load_hint", get_hint(lds[settings.load_hint]))
+ statusd.inform("load_1min", f1)
+ statusd.inform("load_1min_hint", get_hint(lds["1min"]))
+ statusd.inform("load_5min", f5)
+ statusd.inform("load_5min_hint", get_hint(lds["5min"]))
+ statusd.inform("load_15min", f15)
+ statusd.inform("load_15min_hint", get_hint(lds["15min"]))
load_timer:set(settings.update_interval, update_load)
end
-- Init
--statusd.inform("load_template", "0.00, 0.00, 0.00");
-get_load=detect_load_fn()
load_timer=statusd.create_timer()
update_load()
#include <libextl/readconfig.h>
#include <libmainloop/exec.h>
#include <libmainloop/select.h>
+#include <libmainloop/signal.h>
#include <ioncore/saveload.h>
#include <ioncore/bindmaps.h>
#include <ioncore/global.h>
+#include <ioncore/ioncore.h>
#include "statusbar.h"
#include "exports.h"
-#define CF_STATUSD_TIMEOUT_SEC 5
+#define CF_STATUSD_TIMEOUT_SEC 3
/*{{{ Module information */
int retval;
bool dummy, doneseen, eagain=FALSE;
- if(gettimeofday(&endtime, NULL)!=0){
+ if(mainloop_gettime(&endtime)!=0){
warn_err();
return FALSE;
}
goto timeout;
}
- if(gettimeofday(&now, NULL)!=0){
+ if(mainloop_gettime(&now)!=0){
warn_err();
return FALSE;
}
return TRUE;
timeout:
- warn(TR("ion-statusd timed out."));
- return FALSE;
+ /* Just complain to stderr, not startup error log, and do not fail.
+ * The system might just be a bit slow. We can continue, but without
+ * initial values for the meters, geometry adjustments may be necessary
+ * when we finally get that information.
+ */
+ ioncore_warn_nolog(TR("ion-statusd timed out."));
+ return TRUE;
}
end
end
+local tried_to_launch=false
--DOC
-- Load modules and launch \file{ion-statusd} with configuration
return
end
+ tried_to_launch=true
+
local mods=get_modules()
-- Load modules
end
-- Lookup ion-statusd
- local statusd=ioncore.lookup_script("ion-statusd")
+ local statusd_script="ion-statusd"
+ local statusd=ioncore.lookup_script(statusd_script)
if not statusd then
- ioncore.warn(TR("Could not find %s", script))
+ ioncore.warn(TR("Could not find %s", statusd_script))
return
end
local cfg=mod_statusbar.cfg_statusd(cfg or {})
local params=""
table.foreach(mods, function(k) params=params.." -m "..k end)
- local cmd=statusd.." -q -c "..cfg..params
+ local cmd=statusd.." -c "..cfg..params
local rcv=coroutine.wrap(mod_statusbar.rcv_statusd)
local rcverr=mod_statusbar.rcv_statusd_err
-- Variable & Type & Description \\
-- \var{template} & string & The template; see
-- Section \ref{sec:statusbar}. \\
--- \var{pos} & string & Position: \code{"tl"}, \code{"tr"},
--- \code{"bl"} or \code{"br"}
+-- \var{pos} & string & Position: \codestr{tl}, \codestr{tr},
+-- \codestr{bl} or \codestr{br}
-- (for the obvious combinations of
-- top/left/bottom/right). \\
-- \var{screen} & integer & Screen number to create the statusbar on. \\
dopath('cfg_statusbar', true)
-- Launch statusd if the user didn't launch it.
-if statusd_pid<=0 then
+if not tried_to_launch then
mod_statusbar.launch_statusd()
end
}
-static WSplitSplit *splittree_scan_stdisp_parent(WSplit *node_, bool set_saw)
+static WSplitST *splittree_scan_stdisp(WSplit *node_, bool set_saw)
{
- WSplitSplit *r, *node=OBJ_CAST(node_, WSplitSplit);
+ WSplitST *r=NULL;
+ WSplitSplit *node=OBJ_CAST(node_, WSplitSplit);
if(node==NULL)
return NULL;
- if(OBJ_IS(node->tl, WSplitST)){
- if(set_saw)
- saw_stdisp=(WSplitST*)node->tl;
- return node;
- }
-
- if(OBJ_IS(node->br, WSplitST)){
+ r=OBJ_CAST(node->tl, WSplitST);
+ if(r==NULL)
+ r=OBJ_CAST(node->br, WSplitST);
+
+ if(r!=NULL){
if(set_saw)
- saw_stdisp=(WSplitST*)node->br;
- return node;
+ saw_stdisp=r;
+ return r;
}
-
- r=splittree_scan_stdisp_parent(node->tl, set_saw);
+
+ r=splittree_scan_stdisp(node->tl, set_saw);
if(r==NULL)
- r=splittree_scan_stdisp_parent(node->br, set_saw);
+ r=splittree_scan_stdisp(node->br, set_saw);
+
return r;
}
}
-static WSplit *move_stdisp_out_of_way(WSplit *node)
+static WSplit *dodge_stdisp(WSplit *node, bool keep_within)
{
+ WSplitST *stdisp;
WSplitSplit *stdispp;
- if(!OBJ_IS(node, WSplitSplit))
+ stdisp=splittree_scan_stdisp(node, TRUE);
+
+ if(stdisp==NULL)
return node;
- stdispp=splittree_scan_stdisp_parent(node, TRUE);
-
+ stdispp=OBJ_CAST(((WSplit*)stdisp)->parent, WSplitSplit);
+
if(stdispp==NULL)
return node;
-
- while(stdispp->tl!=node && stdispp->br!=node){
+
+ if((WSplit*)stdispp==node){
+ /* Node itself immediately contains stdisp. Due to the way
+ * try_unsink works, stdisp this will not change, so another
+ * node must be used, if we want to fully dodge stdisp.
+ */
+ return (keep_within
+ ? node
+ : (stdispp->tl==(WSplit*)stdisp
+ ? stdispp->br
+ : stdispp->tl));
+ }
+
+ do{
if(!split_try_unsink_stdisp(stdispp, FALSE, TRUE)){
warn(TR("Unable to move the status display out of way."));
return NULL;
}
- }
+ }while(stdispp->tl!=node && stdispp->br!=node);
- return (WSplit*)stdispp;
+ return node;
}
assert(node!=NULL && parent!=NULL);
+ splittree_begin_resize();
+
+ node=dodge_stdisp(node, FALSE);
+
+ if(node==NULL)
+ return NULL;
+
if(OBJ_IS(node, WSplitST)){
warn(TR("Splitting the status display is not allowed."));
return NULL;
}
- splittree_begin_resize();
-
- if(!move_stdisp_out_of_way(node))
- return NULL;
-
if(primn!=PRIMN_TL && primn!=PRIMN_BR)
primn=PRIMN_BR;
if(dir!=SPLIT_HORIZONTAL && dir!=SPLIT_VERTICAL)
/*EXTL_DOC
- * Flip contents of \var{node}.
+ * Flip contents of \var{split}.
*/
EXTL_EXPORT_MEMBER
void splitsplit_flip(WSplitSplit *split)
{
splittree_begin_resize();
- if(!move_stdisp_out_of_way((WSplit*)split))
+ split=OBJ_CAST(dodge_stdisp((WSplit*)split, FALSE), WSplitSplit);
+
+ if(split==NULL)
return;
splitsplit_flip_(split);
* geometry calculation we move it immediately below node, and
* resize stdisp's fixed parent node instead.
*/
- node2=move_stdisp_out_of_way(node);
+ node2=dodge_stdisp(node, TRUE);
- if(node2==NULL)
+ if(node==NULL || node2!=node)
return FALSE;
- split_update_bounds(node2, TRUE);
+ split_update_bounds(node, TRUE);
- split_do_rqgeom_(node2, geom, PRIMN_ANY, PRIMN_ANY, &rg, FALSE);
+ split_do_rqgeom_(node, geom, PRIMN_ANY, PRIMN_ANY, &rg, FALSE);
- split_do_resize(node2, &rg, PRIMN_ANY, PRIMN_ANY, trans);
+ split_do_resize(node, &rg, PRIMN_ANY, PRIMN_ANY, trans);
if(flip!=FLIP_NONE)
- splittree_flip_dir(node2, flip);
+ splittree_flip_dir(node, flip);
splittree_end_resize();
}
region_unset_manager(reg, (WRegion*)ws);
+ splittree_set_node_of(reg, NULL);
}
if(other!=NULL){
node->reg=other;
+ splittree_set_node_of(other, node);
tiling_managed_add(ws, other);
reused=TRUE;
}else{
}
-void do_unsplit(WRegion *reg)
+/*EXTL_DOC
+ * Try to relocate regions managed by \var{reg} to another frame
+ * and, if possible, destroy it.
+ */
+EXTL_EXPORT_MEMBER
+void tiling_unsplit_at(WTiling *ws, WRegion *reg)
{
- WTiling *ws=REGION_MANAGER_CHK(reg, WTiling);
WPHolder *ph;
- bool res;
- if(ws==NULL)
+ if(reg==NULL || REGION_MANAGER(reg)!=(WRegion*)ws)
return;
ph=region_get_rescue_pholder_for((WRegion*)ws, reg);
- if(ph==NULL){
- res=!region_rescue_needed(reg);
- }else{
- res=region_rescue(reg, ph);
+ if(ph!=NULL){
+ region_rescue(reg, ph);
destroy_obj((Obj*)ph);
}
- if(!res){
- warn(TR("Unable to unsplit: Could not move client windows "
- "elsewhere within the tiling."));
- return;
- }
-
- destroy_obj((Obj*)reg);
-}
-
-
-/*EXTL_DOC
- * Try to relocate regions managed by \var{reg} to another frame
- * and, if possible, destroy it.
- */
-EXTL_EXPORT_MEMBER
-void tiling_unsplit_at(WTiling *ws, WRegion *reg)
-{
- if(reg==NULL || REGION_MANAGER(reg)!=(WRegion*)ws)
- return;
-
- mainloop_defer_action((Obj*)reg, (WDeferredAction*)do_unsplit);
+ region_defer_rqdispose(reg);
}
MSGCAT = msgcat
LXGETTEXT = lua-xgettext
-TRANSLATIONS := fi cs
+TRANSLATIONS := fi cs fr
MO_FILES := $(patsubst %,%.mo, $(TRANSLATIONS))
PO_FILES := $(patsubst %,%.po, $(TRANSLATIONS))
update_cs: pot
$(MSGMERGE) -U cs.po $(POTFILE)
+update_fr: pot
+ $(MSGMERGE) -U fr.po $(POTFILE)
+
--- /dev/null
+# translation of ion3.po to
+#
+# french language translations for Ion3.
+#
+# Copyright (c) Pierre-Henri RAMBOZ 2007.
+#
+# This file is distributed under the same license as the Ion3 package.
+#
+#cf ligne 770 pour welcome.fr.txt
+msgid ""
+msgstr ""
+"Project-Id-Version: ion3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-22 15:41+0200\n"
+"PO-Revision-Date: 2007-05-21 14:12+0200\n"
+"Last-Translator: Pierre-Henri RAMBOZ DidouPh@gmail.com\n"
+"Language-Team: <pclos-il8n-dev@lists.berlios.de>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../ioncore/conf-bindings.c:96
+msgid "Insane key combination."
+msgstr "Combinaison de touche démente"
+
+#: ../ioncore/conf-bindings.c:100
+msgid "Could not convert keysym to keycode."
+msgstr "Ne peut convertir keysym en keycode."
+
+#: ../ioncore/conf-bindings.c:111
+#, c-format
+msgid "Unknown button \"%s\"."
+msgstr "Bouton inconnu \"%s\"."
+
+#: ../ioncore/conf-bindings.c:116
+msgid "Insane button combination."
+msgstr "Combinaison de boutons démente."
+
+#: ../ioncore/conf-bindings.c:123 ../ioncore/conf-bindings.c:130
+msgid "Insane modifier combination."
+msgstr "Combinaison de modificateur démente."
+
+#: ../ioncore/conf-bindings.c:168
+#, c-format
+msgid "Can not wait on modifiers when no modifiers set in \"%s\"."
+msgstr "Ne peut attendre les modificateurs quand aucun modificateur définis dans \"%s\"."
+
+#: ../ioncore/conf-bindings.c:186
+#, c-format
+msgid "Unable to add binding %s."
+msgstr "Ne peut ajouter de liaison %s."
+
+#: ../ioncore/conf-bindings.c:191
+#, c-format
+msgid "Unable to remove binding %s."
+msgstr "Ne peut enlever une liaison %s."
+
+#: ../ioncore/conf-bindings.c:230
+#, c-format
+msgid "Unable to add submap for binding %s."
+msgstr "Ne peut ajouter de sousmappage pour la liaison %s."
+
+#
+#: ../ioncore/conf-bindings.c:260
+msgid "Binding type not set."
+msgstr "Type de liaison indéfinis."
+
+#: ../ioncore/conf-bindings.c:270
+#, c-format
+msgid "Unknown binding type \"%s\"."
+msgstr "Type de liaison inconnu \"%s\"."
+
+#: ../ioncore/conf-bindings.c:292
+#, c-format
+msgid "Unknown area \"%s\" for binding %s."
+msgstr "Zone inconnue \"%s\" pour la liaison %s."
+
+#: ../ioncore/conf-bindings.c:333
+#, c-format
+msgid "Unable to get bindmap entry %d."
+msgstr "Incapable d'obtenir la liaison de mappage pour %d."
+
+#: ../ioncore/conf-bindings.c:375
+msgid "Unable to convert keysym to string."
+msgstr "Incapable de convertir keysym en string."
+
+#: ../ioncore/conf-bindings.c:389
+msgid "Unable to convert button to string."
+msgstr "Incapable de convertir le bouton en string."
+
+#
+#: ../ioncore/event.c:113
+msgid "Time request from X server failed."
+msgstr "Requète temporelle pour le serveur X échouée."
+
+#
+#: ../ioncore/exec.c:186
+msgid "Not saving state: running under session manager."
+msgstr "Ne sauvegarde pas l'état : s'exécute dans le gestionnaire de session"
+
+#: ../ioncore/strings.c:107 ../ioncore/strings.c:143 ../ioncore/strings.c:176
+msgid "Invalid multibyte string."
+msgstr "String multibyte invalide."
+
+#: ../ioncore/strings.c:267
+#, c-format
+msgid "Error compiling regular expression: %s"
+msgstr "Erreur enc compilant l'expression régulière: %s"
+
+#: ../ioncore/modules.c:158
+msgid "Invalid module name."
+msgstr "Nom de module invalide."
+
+#
+#: ../ioncore/modules.c:170
+msgid "The module is already loaded."
+msgstr "Le module est déjà chargé."
+
+#: ../ioncore/modules.c:185
+msgid "Module version information not found or version mismatch. Refusing to use."
+msgstr "Information de version de module non trouvée ou erreur de version. Refus d'utilisation."
+
+#: ../ioncore/modules.c:196
+#, c-format
+msgid "Unable to initialise module %s."
+msgstr "Incapable d'initialiser le module %s."
+
+#: ../ioncore/modules.c:220 ../libextl/readconfig.c:388
+#, c-format
+msgid "Unable to find '%s' on search path."
+msgstr "Incapable de trouver '%s' dans le chemin de recherche."
+
+#: ../ioncore/modules.c:291
+msgid "Unknown module."
+msgstr "Module inconnu."
+
+#: ../ioncore/modules.c:299
+msgid "Unable to initialise module."
+msgstr "Incapable d'initialiser le module."
+
+#: ../ioncore/modules.c:344
+msgid "No module to load given."
+msgstr "Pas de module à charger spécifié"
+
+#: ../ioncore/property.c:355 ../ioncore/property.c:364
+msgid "Invalid arguments."
+msgstr "Argument invalide."
+
+#: ../ioncore/screen.c:385
+msgid "Only workspace may not be destroyed/detached."
+msgstr "Seuls les espace de travail ne peuvent être détruits/détachés"
+
+#: ../ioncore/screen.c:396
+msgid "Screens may not be destroyed."
+msgstr "Les écrans ne seront pas détruits."
+
+#: ../ioncore/screen.c:432
+msgid "Invalid offset."
+msgstr "Offset invalide"
+
+#: ../ioncore/screen.c:471
+#, c-format
+msgid "Unable to create a workspace on screen %d."
+msgstr "Incapable de créer un espace de travail sur l'écran %d."
+
+#: ../ioncore/sizehint.c:157
+msgid "Invalid client-supplied width/height increment."
+msgstr "Incrémentation de hauteur/largeur envoyée par le client invalide."
+
+#: ../ioncore/sizehint.c:165
+msgid "Invalid client-supplied aspect-ratio."
+msgstr "Rapport d'aspect envoyé par le client invalide."
+
+#: ../ioncore/ioncore.c:78
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU Lesser General Public\n"
+"License as published by the Free Software Foundation; either\n"
+"version 2.1 of the License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
+"Lesser General Public License for more details.\n"
+msgstr ""
+"Ce programme est un logiciel libre; vous pouvez le redistribuer et/ou\n"
+"le modifier sous les termes de la GNU Lesser General Public\n"
+"Licence comme publiée par la Free Software Foundation; soit\n"
+"en version 2.1 de la licence, ou (a votre convenance) une version ulterrieure.\n"
+"\n"
+"Ce programme est distribué dans l'espoir qu'il sera utile\n"
+"Mais sans aucune garantie; sans même la garantie implicite que\n"
+"celui-ci soit commercialisable ou adapté a un usage quelconque. référez vous\n"
+"à la GNU Lesser General Public Licence pour plus de détails.\n"
+
+#: ../ioncore/ioncore.c:159
+msgid "No encoding given in LC_CTYPE."
+msgstr "Pas d'encodage donné dans LC_CTYPE"
+
+#: ../ioncore/ioncore.c:470
+#, c-format
+msgid "Could not connect to X display '%s'"
+msgstr "Incapable de se connecter a l'affichage X \"%s\""
+
+#: ../ioncore/ioncore.c:522
+msgid "Could not find a screen to manage."
+msgstr "N'a pas trouvé d'écran à gérer."
+
+#: ../ioncore/xic.c:38
+msgid "Failed to open input method."
+msgstr "Echec d'ouverture d'une méthode d'entrée."
+
+#: ../ioncore/xic.c:43
+msgid "Input method doesn't support any style."
+msgstr "La méthode d'entrée ne suporte aucun style."
+
+#: ../ioncore/xic.c:58
+msgid "input method doesn't support my preedit type."
+msgstr "La méthode d'entrée ne suporte pas mes types preedit."
+
+#: ../ioncore/xic.c:86
+msgid "Failed to create input context."
+msgstr "Echec de création du contexte d'entrée."
+
+#: ../ioncore/clientwin.c:379
+#, c-format
+msgid "The transient_for hint for \"%s\" points to itself."
+msgstr "Le transcient_for hint vers \"%s\" pointe vers lui-même."
+
+#: ../ioncore/clientwin.c:383
+#, c-format
+msgid ""
+"Client window \"%s\" has broken transient_for hint. (\"Extended WM hints\" "
+"multi-parent brain damage?)"
+msgstr ""
+"La fenêtre de client \"%s\" a rompu le transient_for hint. (\"WM hints étendus\" "
+"domages cérébraux multi parents?)"
+
+#: ../ioncore/clientwin.c:388
+#, c-format
+msgid "The transient_for window for \"%s\" is not on the same screen."
+msgstr "La fenêtre transcient_for pour \"%s\" n'est pas sur le même écran."
+
+#: ../ioncore/clientwin.c:408 ../ioncore/clientwin.c:496
+#: ../ioncore/clientwin.c:1292
+#, c-format
+msgid "Window %#x disappeared."
+msgstr "la fenêtre %#x a disparue."
+
+#: ../ioncore/clientwin.c:516
+msgid "Unable to find a matching root window!"
+msgstr "Incapable de trouver une fenêtre racine correspondante!"
+
+#: ../ioncore/clientwin.c:555
+#, c-format
+msgid "Unable to manage client window %#x."
+msgstr "incapable de gérer la fenêtre du client %#x."
+
+#: ../ioncore/clientwin.c:604
+msgid "Changes is WM_TRANSIENT_FOR property are unsupported."
+msgstr "Le changement est WM_TRANSCIENT_FOR propriété non supportée."
+
+#
+#: ../ioncore/clientwin.c:776
+msgid "Client does not support the WM_DELETE protocol."
+msgstr "Le client ne supporte pas le protocole WM_DELETE."
+
+#: ../ioncore/clientwin.c:1298
+msgid "Saved client window does not want to be managed."
+msgstr "La fenêtre de client sauvegardée ne veut pas être gérée."
+
+#
+#: ../ioncore/colormap.c:96
+msgid "Unable to store colourmap watch info."
+msgstr "Incapable de stocker les infos de la palette de couleur"
+
+#: ../ioncore/region.c:47
+msgid "Creating region with negative width or height!"
+msgstr "Création de région avec une largeur ou hauteur négative!"
+
+#: ../ioncore/region.c:95
+#, c-format
+msgid "Destroying object \"%s\" with client windows as children."
+msgstr "Destruction de l'objet \"%s\" avec une fenêtre de client comme fille."
+
+#: ../ioncore/region.c:434
+#, c-format
+msgid "Can not destroy %s: contains client windows."
+msgstr "Ne peut détruire %s: contiend des fenêtres client."
+
+#: ../ioncore/region.c:435
+msgid "(unknown)"
+msgstr "(inconnu)"
+
+#: ../ioncore/region.c:498
+msgid "Failed to rescue some client windows - not closing."
+msgstr "Echec de sauvetage de quelques fenêtres de client - ne ferme pas."
+
+#: ../ioncore/attach.c:58 ../ioncore/frame-pointer.c:280
+#, c-format
+msgid "Attempt to make region %s manage its ancestor %s."
+msgstr "Temptative de faire que la région %s gère ses ancètres %s."
+
+#: ../ioncore/attach.c:83
+msgid "Unable to reparent."
+msgstr "Incapable de réaparenter."
+
+#: ../ioncore/attach.c:92
+msgid "Unexpected attach error: trying to recover by attaching to screen."
+msgstr "Erreur d'atachement inattendue: essai de récupération par attachement à l'écran."
+
+#: ../ioncore/attach.c:111
+msgid "Failed recovery."
+msgstr "Récupération échouée."
+
+#: ../ioncore/manage.c:193
+msgid "Unable to find a screen for a new client window."
+msgstr "Incapable de trouver un écran pour une nouvelle fenêtre de client."
+
+#: ../ioncore/rootwin.c:218
+#, c-format
+msgid "Unable to redirect root window events for screen %d."
+msgstr "Incapable de rediriger les évènement de la fenêtre racine pour l'écran %d."
+
+#: ../ioncore/names.c:91
+#, c-format
+msgid "Corrupt instance number %s."
+msgstr "Numéro d'instance corrompu %s."
+
+#: ../ioncore/saveload.c:98
+#, c-format
+msgid "Unknown class \"%s\", cannot create region."
+msgstr "classe inconnue \"%s\", ne peut créer de région."
+
+#: ../ioncore/saveload.c:202
+#, c-format
+msgid ""
+"There were errors loading layout. Backing up current layout savefile as\n"
+"%s.\n"
+"If you are _not_ running under a session manager and wish to restore your\n"
+"old layout, copy this backup file over the layout savefile found in the\n"
+"same directory while Ion is not running and after having fixed your other\n"
+"configuration files that are causing this problem. (Maybe a missing\n"
+"module?)"
+msgstr ""
+"Il y a eu des erreurs en changeant la mise en place. Sauvegarde de la \n"
+"mise en place courrante en tant que savefile %s.\n"
+"Si vous _n'utilisez_ pas de gestionnaire de session et voulez restaurer\n"
+"votre ancienne mise en place, copiez ce fichier de sauvegarde sur le\n"
+"savefile situé dans le même répertoire pendant que Ion ne fonctionne pas\n"
+"et après avoir fixé vos autresfichiers de configuration causant des\n"
+"problèmes. (peut-être un module manquant"
+
+#: ../ioncore/saveload.c:253
+msgid "Unable to get file for layout backup."
+msgstr "Incapable d'obtenir le fichier de sauvegarde de la mise en place."
+
+#: ../ioncore/saveload.c:257
+#, c-format
+msgid "Backup file %s already exists."
+msgstr "Le fichier de sauvegarde %s existe déjà."
+
+#: ../ioncore/saveload.c:263
+msgid "Failed backup."
+msgstr "Sauvegarde échouée."
+
+#
+#: ../ioncore/saveload.c:268
+msgid "Unable to initialise layout on any screen."
+msgstr "Incapable d'initialiser la mise en place sur aucun écran."
+
+#: ../ioncore/saveload.c:295
+#, c-format
+msgid "Unable to get configuration for screen %d."
+msgstr "Incapable d'obtenir la configuration pour l'écran %d."
+
+#: ../ioncore/saveload.c:308
+msgid "Unable to save layout."
+msgstr "Incapable de sauvegarder la mise en place"
+
+#: ../ioncore/conf.c:235
+msgid "User directory can not be set."
+msgstr "Le répertoire d'utilisateur ne peut être définis."
+
+#: ../ioncore/conf.c:309
+msgid "Some bindmaps were empty, loading ioncore_efbb."
+msgstr "Certaines bindmaps étaient vides, chargement de ioncore_efbb."
+
+#: ../ioncore/fullscreen.c:49
+msgid "Failed to enter full screen mode."
+msgstr "Echec d'entrée dans le mode plein écran."
+
+#: ../ioncore/fullscreen.c:83
+msgid ""
+"Failed to return from full screen mode; remaining manager or parent from "
+"previous location refused to manage us."
+msgstr ""
+"Echec de retour du mode plein écran; reliquat de gestionaire ou parent de "
+"la position précédente ayant refusé de nous gérer."
+
+#
+#: ../ioncore/mplex.c:1685
+msgid "Invalid position setting."
+msgstr "Réglages de position invalides."
+
+#
+#: ../ioncore/mplex.c:1725
+msgid "Invalid action setting."
+msgstr "Réglage d'action invalide."
+
+#: ../ioncore/gr.c:120
+#, c-format
+msgid "Drawing engine %s is not registered!"
+msgstr "Gestionnaire de rendu %s non enregistré!"
+
+#: ../ioncore/gr.c:139
+#, c-format
+msgid "Unable to find brush for style '%s'."
+msgstr "Incapable de trouver les pinceaux pour le style \"%s\"."
+
+#: ../ioncore/gr.c:646
+msgid "No drawing engines loaded, trying \"de\"."
+msgstr "Pas de moteur de rendu chagé, éssai avec \"de\"."
+
+#: ../ioncore/frame-draw.c:314
+msgid "<empty frame>"
+msgstr "<cadre vide>"
+
+#: ../ioncore/group.c:186 ../mod_tiling/tiling.c:92
+#, c-format
+msgid "Error reparenting %s."
+msgstr "Erreur de réapparissage %s."
+
+#: ../ioncore/group.c:711
+msgid "'bottom' already set."
+msgstr "'bottom' déjà définis."
+
+#: ../ioncore/navi.c:45
+msgid "Invalid parameter."
+msgstr "paramètre invalide"
+
+#: ../ioncore/navi.c:72
+msgid "Invalid direction parameter."
+msgstr "Paramètre de direction invalide."
+
+#: ../ioncore/group-ws.c:51
+#, c-format
+msgid "Unknown placement method \"%s\"."
+msgstr "Méthode de placement inconnue \"%s\"."
+
+#: ../ioncore/detach.c:176
+msgid "Failed to reattach."
+msgstr "Incapable de réattacher."
+
+#: ../ioncore/screen-notify.c:190
+msgid "act: "
+msgstr "acte: "
+
+#
+#: ../mod_tiling/tiling.c:73
+msgid "Split not on workspace."
+msgstr "Division hors de l'espace de travail."
+
+#: ../mod_tiling/tiling.c:348
+msgid "Unable to create a node for status display."
+msgstr "Incapable de créer un noeud pour l'affichage du status."
+
+#: ../mod_tiling/tiling.c:361
+msgid "Unable to create new split for status display."
+msgstr "Incapable de créer de nouvelles divisions pour l'affichage de status"
+
+#: ../mod_tiling/tiling.c:710
+msgid "Tiling in useless state."
+msgstr "Empilement en mode inutile."
+
+#: ../mod_tiling/tiling.c:924
+msgid "Invalid direction"
+msgstr "Direction invalide"
+
+#
+#: ../mod_tiling/tiling.c:957 ../mod_tiling/split.c:1018
+msgid "Invalid node."
+msgstr "Noeud invalide."
+
+#
+#: ../mod_tiling/tiling.c:976
+msgid "Unable to split."
+msgstr "Incapable de diviser."
+
+#: ../mod_tiling/tiling.c:1090
+msgid "Unable to unsplit: Could not move client windows elsewhere within the tiling."
+msgstr "Incapable de diviser : N'a pas pu déplacer la fenêtre cliente ailleur dans l'empilement."
+
+#: ../mod_tiling/tiling.c:1207
+msgid "Nil parameter."
+msgstr "Paramètre Nul."
+
+#: ../mod_tiling/tiling.c:1212
+msgid "Manager doesn't match."
+msgstr "Les gestionnaires ne correspondent pas"
+
+#: ../mod_tiling/tiling.c:1249
+msgid "The status display is not a valid parameter for this routine."
+msgstr "L'affichage du status n'est pas un paramètre valide pour cette routine."
+
+#: ../mod_tiling/tiling.c:1340
+msgid "Refusing to float split directly containing the status display."
+msgstr "Refus de rendre directement flotant la division contenant l'affichage du status."
+
+#: ../mod_tiling/tiling.c:1403
+msgid "No suitable split here."
+msgstr "Pas d'arbre de division acceptable ici."
+
+#
+#: ../mod_tiling/tiling.c:1439
+msgid "Could not get split tree."
+msgstr "N'a pus obtenir l'arbre de divisions"
+
+#: ../mod_tiling/tiling.c:1460
+msgid "Workspace already has a status display node."
+msgstr "L'Espace de travail a déja un noeud d'affichage de status."
+
+#
+#: ../mod_tiling/tiling.c:1498
+msgid "Missing region parameters."
+msgstr "Paramètre de région invalide."
+
+#: ../mod_tiling/tiling.c:1542 ../mod_tiling/splitfloat.c:780
+msgid "Invalid direction."
+msgstr "Direction invalide."
+
+#
+#: ../mod_tiling/tiling.c:1617
+msgid "No split type given."
+msgstr "Pas de typde de division donné."
+
+#: ../mod_tiling/tiling.c:1630
+msgid "Unknown split type."
+msgstr "Type de division inconnue."
+
+#
+#
+#: ../mod_tiling/tiling.c:1670
+msgid "The workspace is empty."
+msgstr "L'espace de travail est vide"
+
+#: ../mod_tiling/placement.c:104
+#, c-format
+msgid "Ooops... could not find a region to attach client window to on workspace %s."
+msgstr ""
+"Ooops... n'a pas trouvé de région pour atacher la fenêtre cliente sur l'espace"
+"de travail %s."
+
+#
+#: ../mod_tiling/split.c:524
+msgid "Unable to move the status display out of way."
+msgstr "Incapable d'enlever l'affichage du status du passage."
+
+#: ../mod_tiling/split.c:937
+msgid "REGION_RQGEOM_TRYONLY unsupported for status display."
+msgstr "REGION_RQGEOM_TRYONLY non suporté pour l'affichage de status."
+
+#
+#: ../mod_tiling/split.c:1083
+msgid "Splitting the status display is not allowed."
+msgstr "Diviser l'affichage de status n'est pas autorisé."
+
+#: ../mod_tiling/split.c:1114 ../mod_tiling/splitfloat.c:903
+msgid "Unable to split: not enough free space."
+msgstr "Incapable de diviser: pas assez d'espace libre."
+
+#: ../mod_tiling/split.c:1865
+#, c-format
+msgid "Unable to get configuration for %s."
+msgstr "Incapable d'obtenir la configuration pour %s."
+
+#: ../mod_tiling/split-stdisp.c:602 ../mod_tiling/split-stdisp.c:627
+msgid "Status display in bad split configuration."
+msgstr "Affichage de status dans une configuration divisée défectueuse"
+
+#: ../mod_tiling/split-stdisp.c:667
+msgid "Status display badly located in split tree."
+msgstr "Affichage de status mal situé dans l'arbre divisé"
+
+#: ../mod_tiling/ops.c:72 ../mod_tiling/ops.c:120
+msgid "Not member of a group"
+msgstr "N'est pas membre d'un groupe"
+
+#: ../mod_tiling/ops.c:77
+msgid "Manager group already has bottom"
+msgstr "Le groupe de gestion est déjà déscendu"
+
+#: ../mod_tiling/ops.c:154
+msgid "Unable to move a region from tiling to group."
+msgstr "Incapable de déplacer une région de l'empilement vers un groupe."
+
+#: ../mod_query/wedln.c:813
+msgid "history"
+msgstr "historique"
+
+#: ../mod_query/fwarn.c:35
+msgid "Error:\n"
+msgstr "Erreur:\n"
+
+#
+#: ../mod_menu/menu.c:601
+msgid "Empty menu."
+msgstr "Menu vide."
+
+#
+#: ../mod_sm/sm.c:111
+msgid "Failed to set session directory."
+msgstr "Echec de définition du répertoire de sessions"
+
+#: ../mod_sm/sm_session.c:86
+msgid "Too many ICE connections."
+msgstr "Trop de connexions ICE."
+
+#: ../mod_sm/sm_session.c:228
+msgid "Failed to save session state"
+msgstr "Echec de sauvegarde l'état de la session"
+
+#: ../mod_sm/sm_session.c:247
+msgid "Failed to request save-yourself-phase2 from session manager."
+msgstr "Echec de requète save-yourself-phase2 depuis le gestionnaire de sessions"
+
+#
+#: ../mod_sm/sm_session.c:296
+msgid "SESSION_MANAGER environment variable not set."
+msgstr "Variable d'environnement SESSION_MANAGER non définie."
+
+#: ../mod_sm/sm_session.c:301
+msgid "Session Manager: IceAddConnectionWatch failed."
+msgstr "Gestionnaire de session: IceAddConnectionWatch échoué."
+
+#
+#: ../mod_sm/sm_session.c:326
+msgid "Unable to connect to the session manager."
+msgstr "Incapable de se connecter au gestionnaire de sessions"
+
+#: ../mod_sp/main.c:126
+msgid "Unable to create scratchpad."
+msgstr "Incapable de créer le bloc note."
+
+#: ../mod_statusbar/main.c:75
+msgid "reading a pipe"
+msgstr "lecture du tunnel (pipe)"
+
+#: ../mod_statusbar/main.c:159
+msgid "ion-statusd timed out."
+msgstr "ion-statusd n'a pas répondu à temps."
+
+#: ../mod_statusbar/statusbar.c:1081
+#, c-format
+msgid "[ %date || load: %load ] %filler%systray"
+msgstr "[ %date || charge: %load ] %filler%systray"
+
+#: ../de/init.c:68
+#, c-format
+msgid "Border attribute %s sanity check failed."
+msgstr "Le test de salubrité de l'attribut de bordure %s a échoué."
+
+#: ../de/init.c:91
+#, c-format
+msgid "Unknown border style \"%s\"."
+msgstr "Style de bordure inconnu \"%s\"."
+
+#: ../de/init.c:111
+#, c-format
+msgid "Unknown border side configuration \"%s\"."
+msgstr "Configuration des côtés de bordure inconnue \"%s\"."
+
+#: ../de/init.c:144
+#, c-format
+msgid "Unable to allocate colour \"%s\"."
+msgstr "Incapable d'allouer la couleur \"%s\"."
+
+#: ../de/init.c:210
+#, c-format
+msgid "Corrupt substyle table %d."
+msgstr "Table de soustyle inconnue %d."
+
+#: ../de/init.c:243
+#, c-format
+msgid "Unknown text alignment \"%s\"."
+msgstr "Alignement de texte inconnu \"%s\"."
+
+#: ../de/init.c:319
+#, c-format
+msgid "'based_on' for %s points back to the style itself."
+msgstr "'based_on' pour %s pointe vers le style lui-même."
+
+#: ../de/init.c:322
+#, c-format
+msgid "Unknown base style. \"%s\""
+msgstr "Style de base inconnu. \"%s\""
+
+#: ../de/font.c:47
+#, c-format
+msgid ""
+"Fontset for font pattern '%s' implements context dependent drawing, which is "
+"unsupported. Expect clutter."
+msgstr ""
+"Fontset pour le modèle de police '%s' implémentant les dessins dépendant du contexte"
+"ce qui n'est pas supporté. Cafouillages attendus."
+
+#: ../de/font.c:59
+#, c-format
+msgid "Could not load font \"%s\", trying \"%s\""
+msgstr "N'a pu charger la police \"%s\", essai avec \"%s\"."
+
+#: ../de/font.c:63
+msgid "Failed to load fallback font."
+msgstr "Echec de chargement de la police de secours."
+
+#: ../de/style.c:315
+#, c-format
+msgid "Style is still in use [%d] but the module is being unloaded!"
+msgstr "Le style est toujours utilisé [%d], mais le module est déchargé!"
+
+#: ../ion/ion.c:42 ../pwm/pwm.c:42
+msgid "X display to use"
+msgstr "Affichage X a utiliser"
+
+#: ../ion/ion.c:45 ../pwm/pwm.c:45
+msgid "Configuration file"
+msgstr "Fichier de configuration"
+
+#: ../ion/ion.c:48 ../pwm/pwm.c:48
+msgid "Add directory to search path"
+msgstr "Ajouter le répertoire au chemin de la recherche"
+
+#: ../ion/ion.c:51 ../pwm/pwm.c:51
+msgid "Manage default screen only"
+msgstr "Gérer l'écra par défault seulement"
+
+#: ../ion/ion.c:54 ../pwm/pwm.c:54
+msgid "Name of session (affects savefiles)"
+msgstr "Nom de session (affecte les savefiles)"
+
+#: ../ion/ion.c:57 ../pwm/pwm.c:57
+msgid "Session manager client ID"
+msgstr "ID client du gestionnaire de sessions"
+
+#: ../ion/ion.c:60 ../pwm/pwm.c:60
+msgid "Do not create startup error log and display it with xmessage."
+msgstr "Ne pas crée de journal d'erreurs de démarrage et les afficher avec xmessage."
+
+#: ../ion/ion.c:64 ../pwm/pwm.c:64
+msgid "Show this help"
+msgstr "Affiche cette aide"
+
+#: ../ion/ion.c:67 ../pwm/pwm.c:67
+msgid "Show program version"
+msgstr "Afficher la version du programme"
+
+#: ../ion/ion.c:70 ../pwm/pwm.c:70
+msgid "Show about text"
+msgstr "Afficher le text à propos"
+
+#: ../ion/ion.c:85
+msgid "Could not get user configuration file directory."
+msgstr "N'a pas trouvé le répertoire de fichier de configuration utilisateur"
+
+#: ../ion/ion.c:99
+#, c-format
+msgid "%s/welcome.txt"
+msgstr "%s/welcome.txt"
+
+#: ../ion/ion.c:132 ../pwm/pwm.c:79
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"\n"
+msgstr ""
+"Usage: %s [options]\n"
+"\n"
+
+#
+#: ../ion/ion.c:200 ../pwm/pwm.c:150
+msgid "Invalid command line."
+msgstr "Ligne de commande invalide."
+
+#: ../ion/ion.c:222
+msgid "Ion startup error log:\n"
+msgstr "Registre d'erreurs Ion:\n"
+
+#: ../ion/ion.c:233 ../pwm/pwm.c:183
+msgid "Refusing to start due to encountered errors."
+msgstr "Refus de démarrage en raison des erreurs rencontrées."
+
+#: ../pwm/pwm.c:172
+msgid "PWM startup error log:\n"
+msgstr "Registre d'erreurs PWM:\n"
+
+#: ../libextl/readconfig.c:86
+msgid "$HOME not set"
+msgstr "$HOME non définis"
+
+#: ../libextl/readconfig.c:113
+msgid "User directory not set. Unable to set session directory."
+msgstr "Répertoire d'utilisateur non définis. Incapable de définir le répertoire de sessions"
+
+#: ../libextl/readconfig.c:254
+#, c-format
+msgid "Falling back to %s."
+msgstr "Retour forcé à %s"
+
+#: ../libextl/readconfig.c:474
+#, c-format
+msgid "Unable to create session directory \"%s\"."
+msgstr "Incapable de créer le répertoire de session \"%s\"."
+
+#: ../libextl/luaextl.c:117
+msgid "Lua stack full."
+msgstr "Pile Lua pleine."
+
+#
+#: ../libextl/luaextl.c:143
+msgid "Unknown Lua error."
+msgstr "Erreur Lua inconnue."
+
+#: ../libextl/luaextl.c:490
+msgid "Stack trace:"
+msgstr "tracage de pile:"
+
+#: ../libextl/luaextl.c:497
+#, c-format
+msgid ""
+"\n"
+"(Unable to get debug info for level %d)"
+msgstr ""
+"\n"
+"(Incapable d'obtenir les informations de déboggage pour le niveau %d)"
+
+#: ../libextl/luaextl.c:515
+msgid ""
+"\n"
+" [Skipping unnamed C functions.]"
+msgstr ""
+"\n"
+" [Evitement de la fonction C annonyme.]"
+
+#: ../libextl/luaextl.c:566
+msgid "Internal error."
+msgstr "Erreur interne"
+
+#: ../libextl/luaextl.c:585
+msgid "Unable to initialize Lua."
+msgstr "Incapable d'initialiser Lua."
+
+#: ../libextl/luaextl.c:1336
+msgid "Too many return values. Use a C compiler that has va_copy to support more."
+msgstr "Trop de valeurs renvoyées. Utilisez un compileur C qui a un va_copy pour en suporter plus"
+
+#: ../libextl/luaextl.c:1356
+msgid "Returned dead object."
+msgstr "A renvoyé un objet mort."
+
+#: ../libextl/luaextl.c:1359
+#, c-format
+msgid "Invalid return value (expected '%c', got lua type \"%s\")."
+msgstr "Valeur retournée invalide (attendu %c, de type lua \"%s\")."
+
+#: ../libextl/luaextl.c:1395 ../libextl/luaextl.c:1750
+msgid "Stack full."
+msgstr "Pile pleine."
+
+#: ../libextl/luaextl.c:1761
+#, c-format
+msgid "Argument %d to %s is a dead object."
+msgstr "Argument %d à %s est un objet mort."
+
+#: ../libextl/luaextl.c:1764
+#, c-format
+msgid ""
+"Argument %d to %s is of invalid type. (Argument template is '%s', got lua "
+"type %s)."
+msgstr ""
+"Argument %d à %s est de type invalide. (Le modèle d'argument est '%s', ave le "
+"type lua %s)."
+
+#: ../libextl/luaextl.c:1827
+msgid "L1 call handler upvalues corrupt."
+msgstr "upvalue niveau 1 de la pile d'appel corrompue"
+
+#: ../libextl/luaextl.c:1832
+msgid "Called function has been unregistered."
+msgstr "La fonction invoquée a été désenregistrée."
+
+#: ../libextl/luaextl.c:1843
+#, c-format
+msgid "Attempt to call an unsafe function \"%s\" in restricted mode."
+msgstr "Temptative d'appel d'une fonction non-sécurisée \"%s\" en mode restreint."
+
+#: ../libextl/luaextl.c:1956
+#, c-format
+msgid "Function '%s' has more parameters than the level 1 call handler can handle"
+msgstr "La fonction '%s' a plus de paramètres que le niveau 1 de la pile d'appel puisse supporter"
+
+#
+#: ../libextl/luaextl.c:2347
+msgid "Maximal serialisation depth reached."
+msgstr "Profondeur de sérialisation maximale atteinte."
+
+#: ../libextl/luaextl.c:2368
+#, c-format
+msgid "Unable to serialise type %s."
+msgstr "Incapable de sérialiser le type %s."
+
+#: ../libextl/luaextl.c:2399
+msgid "-- This file has been generated by Ion. Do not edit.\n"
+msgstr "-- Ce fichier a été généré par Ion, Ne pas éditer.\n"
+
+#: ../libextl/misc.c:17
+#, c-format
+msgid ""
+"Type checking failed in level 2 call handler for parameter %d (got %s, "
+"expected %s)."
+msgstr ""
+"Le contrôle de type a échoué au niveau 2 de la pile d'appel au paramètre %d "
+"(obtenu %s, attendu %s)."
+
+msgid "Scroll the message or completions up/down."
+msgstr "Parcourrir le message ou les complétions en haut/bas."
+
+msgid "Close the query/message box, not executing bound actions."
+msgstr "Fermer la boite de requètes/messages, ne pas exécuter les actions lièes."
+
+msgid "Close the query and execute bound action."
+msgstr "Fermer la requète et exécuter les actions liées."
+
+msgid "Complete from history"
+msgstr "Compléter depuis l'historique."
+
+msgid "Try to complete the entered text or cycle through completions."
+msgstr "Essayer de compléter le texte entré ou parcourrir les complétions."
+
+#
+msgid "Clear mark/cancel selection."
+msgstr "Effacer/annuler la sélection"
+
+#
+msgid "Copy selection."
+msgstr "Copier la sélection."
+
+#
+msgid "Cut selection."
+msgstr "Couper la sélection."
+
+#
+msgid "Set mark/begin selection."
+msgstr "Définir le début de la sélection."
+
+msgid "Paste from the clipboard."
+msgstr "Coller depuis le presse papier."
+
+msgid "Select next/previous (matching) history entry."
+msgstr "Sélectionner l'entrèe (correspondante) suivante/précédente dans l'historique"
+
+msgid "Transpose characters."
+msgstr "Transposer le caractère."
+
+msgid "Delete the whole line."
+msgstr "Effacer toute la ligne."
+
+msgid "Delete to end of line."
+msgstr "Effacer jusqu'a la fin de la ligne."
+
+msgid "Delete one word forward/backward."
+msgstr "Effacer un mot en avant/arrière."
+
+msgid "Delete previous character."
+msgstr "Effacer le caractère précédent."
+
+msgid "Delete next character."
+msgstr "Effacer le caractère suivant."
+
+msgid "Skip one word forward/backward."
+msgstr "Sauter un mot en avant/arrière."
+
+msgid "Go to end/beginning."
+msgstr "Aller au début / à la fin"
+
+msgid "Move one character forward/backward."
+msgstr "Déplacer d'un caractère en avant/arrière."
+
+msgid "Kill"
+msgstr "Tuer"
+
+msgid "Attach tagged"
+msgstr "Attacher Marqués"
+
+msgid "Rename"
+msgstr "Renommer"
+
+msgid "Close"
+msgstr "Fermer"
+
+msgid "De/reattach"
+msgstr "Dé/attacher"
+
+msgid "Toggle tag"
+msgstr "(dès)Activer le marquage"
+
+msgid "Window info"
+msgstr "Informations fenêtre"
+
+msgid "Clear tags"
+msgstr "Effacer les marqueurs"
+
+msgid "Exit"
+msgstr "Sortir"
+
+msgid "Restart TWM"
+msgstr "Redémarrer TWM"
+
+msgid "Restart"
+msgstr "Redémarrer"
+
+msgid "Save"
+msgstr "Sauvegarder"
+
+msgid "Session"
+msgstr "Sessions"
+
+msgid "Styles"
+msgstr "Styles"
+
+msgid "About Ion"
+msgstr "A Propos de Ion"
+
+msgid "Help"
+msgstr "Aide"
+
+msgid "Lock screen"
+msgstr "Vérouiller l'écran"
+
+msgid "Terminal"
+msgstr "Termial"
+
+#
+msgid "Run..."
+msgstr "Exécuter..."
+
+#
+msgid "Move in specified direction."
+msgstr "Déplacer dans la direction spécifiée."
+
+msgid "Shrink in specified direction."
+msgstr "Réduire dans la direction spécifiée."
+
+#
+msgid "Grow in specified direction."
+msgstr "Agrandir dans la dimension spécifiée."
+
+msgid "End the resize mode."
+msgstr "mettre fin au mode de redimensionnement."
+
+msgid "Cancel the resize mode."
+msgstr "Annuler le mode redimensionnement."
+
+msgid "Move the frame."
+msgstr "Déplacer le cadre."
+
+msgid "Lower the frame."
+msgstr "Descendre le cadre"
+
+#
+msgid "Raise the frame."
+msgstr "Monter le cadre"
+
+msgid "Toggle shade mode"
+msgstr "basculer l'état shade"
+
+msgid "Attach tagged objects to this frame."
+msgstr "Attacher les objets marqués à ce cadre."
+
+msgid "Maximize the frame horizontally/vertically."
+msgstr "Maximiser le cadre horizontalement/verticalement"
+
+msgid "Move current object within the frame left/right."
+msgstr "Déplacer l'objet courrant dans le cadre à gauche/droite."
+
+msgid "Switch to next/previous object within the frame."
+msgstr "Basculer vers l'objet suivan,t/précédent dans le cadre."
+
+msgid "Switch to n:th object within the frame."
+msgstr "Basculer vers l'objet n:th dans le cadre."
+
+#
+msgid "Query for a client window to attach."
+msgstr "Demande pour une fenêtre cliente a attacher."
+
+msgid "Move objects between frames by dragging and dropping the tab."
+msgstr "Déplacer les objets entre les cadres en glissant et déposant le signet."
+
+msgid "Resize the frame."
+msgstr "Redimensionner le cadre."
+
+msgid "Switch the frame to display the object indicated by the tab."
+msgstr "Activer le cadre pour afficher l'objet indiqué part le signet."
+
+msgid "Begin move/resize mode."
+msgstr "Démarrer le mode déplacer/redimensionner."
+
+msgid "Display context menu."
+msgstr "Afficher le menu contextuel."
+
+#
+msgid "Query for a client window to go to."
+msgstr "Demande pour une fençetre cliente vers laquelle aller."
+
+msgid "Query for workspace to go to or create a new one."
+msgstr "Demande d'un espace de travail vers lequel aller ou de cration d'un nouveau."
+
+msgid "Query for file to view."
+msgstr "Demande d'un fichier pour visualisation."
+
+msgid "Query for file to edit."
+msgstr "Demande d'un fichier pour l'édition."
+
+msgid "Query for host to connect to with SSH."
+msgstr "Demande de connexion de l'hôte via SSH."
+
+msgid "Query for Lua code to execute."
+msgstr "Demande d'exécution d'un code Lua."
+
+msgid "Query for command line to execute."
+msgstr "Demande d'exécution d'une ligne de commande."
+
+#
+msgid "Run a terminal emulator."
+msgstr "Lancer un émulateur de terminal."
+
+msgid "Show the Ion manual page."
+msgstr "Afficher la page de manuel de Ion."
+
+msgid "Query for manual page to be displayed."
+msgstr "Demande pour l'affichage de pages de manuel."
+
+msgid "Toggle tag of current object."
+msgstr "Basculer le marqueur de l'objet courrant."
+
+msgid "Detach (float) or reattach an object to its previous location."
+msgstr "Détacher (float) ou réattacher un objet à sa position précédente."
+
+msgid "Close current object."
+msgstr "Fermer l'objet courrant."
+
+msgid "Toggle client window group full-screen mode"
+msgstr "Basculer le groupe de fenêtre client en mode plein écran."
+
+#
+msgid ""
+"Send next key press to the client window. Some programs may not allow this "
+"by default."
+msgstr ""
+"Envoyer le prochain pressage de touche a la fenêtre de client. certains programmes"
+"n'autoriseront pas celà par default"
+
+#
+msgid "Kill client owning the client window."
+msgstr "Tuer le client qui gère la fenêtre de client."
+
+#
+msgid ""
+"Nudge the client window. This might help with some programs' resizing "
+"problems."
+msgstr ""
+"Secouer la fenêtre de client. Celà peut aider pour les problèmes de "
+"redimentionnement de certains programmes."
+
+msgid "Raise focused object, if possible."
+msgstr "Remonter l'objet ayant le focus, si possible."
+
+msgid "Backward-circulate focus."
+msgstr "Décrémenter le focus."
+
+msgid "Forward-circulate focus."
+msgstr "Incrémenter le focus."
+
+msgid "Display the window list menu."
+msgstr "Affiche le menu de listage des fenêtres."
+
+msgid "Display the main menu."
+msgstr "Affiche le menu principal."
+
+#
+#
+msgid "Create a new workspace of chosen default type."
+msgstr "Créer un nouvel espace de travail du type par défault choisis."
+
+#
+msgid "Go to next/previous screen on multihead setup."
+msgstr "Aller sur l'écran suivant/précédent sur une configuration multihead."
+
+#
+msgid "Go to n:th screen on multihead setup."
+msgstr "Aller sur l'écran n:th sur une configuration multihead."
+
+#
+msgid "Clear all tags."
+msgstr "Effacer tous les marqueurs."
+
+msgid "Go to first region demanding attention or previously active one."
+msgstr "Aller dans la première région qui demande de l'attention ou la dernière active."
+
+#
+msgid "Switch to next/previous object within current screen."
+msgstr "basculer vers l'objet suivant/précédent dans l'écran en cours."
+
+#
+msgid ""
+"Switch to n:th object (workspace, full screen client window) within current "
+"screen."
+msgstr ""
+"Basculer vers l'objet n:th (Espace de travail, fenêtre de clien plein écran) dans l'écran"
+"courrant."
+
+msgid "List"
+msgstr "Liste"
+
+msgid "New"
+msgstr "Nouveau"
+
+msgid "Dillo"
+msgstr "Dillo"
+
+msgid "Konqueror"
+msgstr "Konqueror"
+
+msgid "Links"
+msgstr "Links"
+
+msgid "Opera"
+msgstr "Opera"
+
+msgid "Rxvt"
+msgstr "Rxvt"
+
+msgid "W3M"
+msgstr "W3M"
+
+msgid "XTerm"
+msgstr "XTerm"
+
+#
+msgid "Workspaces"
+msgstr "Espaces de travail"
+
+msgid "Programs"
+msgstr "Programmes"
+
+msgid "Show the PWM manual page."
+msgstr "Afficher le manuel de PWM."
+
+msgid "Toggle scratchpad."
+msgstr "Basculer vers le Bloc note."
+
+msgid ""
+"\n"
+"%sClass: %s\n"
+"%sRole: %s\n"
+"%sInstance: %s\n"
+"%sXID: 0x%x"
+msgstr ""
+"\n"
+"%sClasse: %s\n"
+"%sRole: %s\n"
+"%sInstance: %s\n"
+"%sXID: 0x%x"
+
+msgid "No entry '%s'"
+msgstr "pas d'entrée '%s'"
+
+msgid "%s:"
+msgstr "%s:"
+
+msgid "Missing submenu "
+msgstr "Sous menu manquant"
+
+msgid "Unknown menu %s."
+msgstr "Menu Inconnu %s."
+
+msgid "Lua code:"
+msgstr "code Lua:"
+
+msgid "Manual page (%s):"
+msgstr "Page de manuel (%s):"
+
+msgid "SSH to:"
+msgstr "SSH vers:"
+
+msgid "Failed to open ~/.ssh/config"
+msgstr "Echec d'ouverture ~/.ssh/config"
+
+msgid "Failed to open ~/.ssh/known_hosts"
+msgstr "Echec d'ouverture ~/.ssh/known_hosts"
+
+msgid "Run:"
+msgstr "Exécuter:"
+
+msgid "View file:"
+msgstr "Voir le fichier:"
+
+msgid "Edit file:"
+msgstr "Editer le fichier:"
+
+msgid "Workspace name:"
+msgstr "Nom de l'espace de travail:"
+
+msgid "Frame name:"
+msgstr "Nom du cadre:"
+
+msgid "Restart Ion (y/n)?"
+msgstr "Redémarrer Ion (y/n)?"
+
+msgid "Exit Ion/Shutdown session (y/n)?"
+msgstr "Quiter Ion/Fermer la session (y/n)?"
+
+msgid "Go to or create workspace:"
+msgstr "Aller à ou créer l'espace de travail:"
+
+msgid "Attach window:"
+msgstr "Attacher la fenêtre:"
+
+msgid "Go to window:"
+msgstr "Aller à la fenêtre:"
+
+msgid "New workspace layout (default):"
+msgstr "Nouvelle disposition d'espace de travail (default):"
+
+msgid "Unknown error"
+msgstr "Erreur inconnue"
+
+msgid "Unknown layout"
+msgstr "Disposition inconnue"
+
+msgid "Cannot attach: different root windows."
+msgstr "Ne peut attacher: différentes fenêtres racine."
+
+msgid "Could not find client window %s."
+msgstr "Ne peut trouver la fenêtre de client %s."
+
+msgid "Too much result data"
+msgstr "Trop de donnée résultantes"
+
+msgid "Could not find %s"
+msgstr "Ne peut trouver %s"
+
+msgid "Not a directory."
+msgstr "N'est pas un répertoire."
+
+msgid "Invalid command"
+msgstr "Commande invalide"
+
+msgid "Error in command string: "
+msgstr "Erreur dans la ligne de commande: "
+
+msgid "Error compiling guard: %s"
+msgstr "Erreur de compilation du garde: %s"
+
+msgid "Invalid guard %s."
+msgstr "Garde invalide %s."
+
+msgid "Main menu:"
+msgstr "Menu Principal:"
+
+msgid "Context menu:"
+msgstr "Menu Contextuel:"
+
+msgid "Floating frame"
+msgstr "Cadre flottant"
+
+msgid "Tiled frame"
+msgstr "Cadre Empilé"
+
+msgid "Tiling"
+msgstr "Empilement"
+
+#
+msgid "Workspace"
+msgstr "Espace de travail"
+
+msgid "Screen"
+msgstr "Ecran"
+
+msgid "Frame"
+msgstr "Cadre"
+
+msgid "Recursive table - unable to deepcopy"
+msgstr "Table récursive - incapable de deepcopy"
+
+msgid ""
+"Making the following minimal emergency mappings:\n"
+" F2 -> xterm\n"
+" F11 -> restart\n"
+" F12 -> exit\n"
+" Mod1+C -> close\n"
+" Mod1+K P/N -> WFrame.switch_next/switch_prev\n"
+msgstr ""
+"Application des mappages d'urgence suivants:\n"
+" F2 -> xterm\n"
+" F11 -> restart\n"
+" F12 -> exit\n"
+" Mod1+C -> close\n"
+" Mod1+K P/N -> WFrame.switch_next/switch_prev\n"
+
+msgid "Unable to append to non-table menu"
+msgstr "Incapable d'associer a un menu non-table"
+
+msgid "Cannot save selection."
+msgstr "Ne peut sauver la sélection."
+
+msgid "Save look selection in %s?"
+msgstr "Sauvegarder la sélection de look dans %s?"
+
+msgid "ion-statusd quit."
+msgstr "ion-statusd quite."
+
+msgid "Errors starting ion-statusd:\n"
+msgstr "Erreur de lancement de ion-statusd:\n"
+
+msgid "Failed to start ion-statusd."
+msgstr "Echec de lancement de ion-statusd."
+
+msgid "Screen not found."
+msgstr "Ecran non trouvé."
+
+msgid "Screen already has an stdisp. Refusing to create a statusbar."
+msgstr "L'écra a déja un stdisp. Refus de création d'une barre de status."
+
+msgid "Failed to create statusbar."
+msgstr "Echec de la création de la barre de status."
+
+msgid "Split current frame vertically."
+msgstr "Scinder le cadre courrant verticalement"
+
+msgid "Go to frame above/below/right/left of current frame."
+msgstr "Aller au cadre sous/sur/droite/gauche du cadre courrant."
+
+msgid "Split current frame horizontally."
+msgstr "Sciender le cadre courrant horizontalement"
+
+msgid "Destroy current frame."
+msgstr "Detruire le cadre courrant."
+
+msgid "Tile frame, if no tiling exists on the workspace"
+msgstr "Empiler le cadre, si aucun empuilement n'existe sur l'espace de travail"
+
+msgid "Destroy frame"
+msgstr "Detruire le cadre"
+
+msgid "Split vertically"
+msgstr "Scinder Verticalement"
+
+msgid "Split horizontally"
+msgstr "Sciender Horizontalement"
+
+msgid "Flip"
+msgstr "Tourner"
+
+msgid "Transpose"
+msgstr "Transposer"
+
+msgid "Untile"
+msgstr "Désempiler"
+
+msgid "Float split"
+msgstr "Rupture flotante"
+
+msgid "At left"
+msgstr "A gauche"
+
+msgid "At right"
+msgstr "A droite"
+
+msgid "Above"
+msgstr "Dessus"
+
+msgid "Below"
+msgstr "Sous"
+
+msgid "At root"
+msgstr "A la racine"
+
+msgid "New tiling"
+msgstr "Nouvel empilement"
+
+msgid "Close the menu."
+msgstr "fermer le menu."
+
+#
+#
+msgid "Activate current menu entry."
+msgstr "Activer l'entrée courrante du menu."
+
+msgid "Select next/previous menu entry."
+msgstr "Choisir l'entrée suivante/précédente du menu."
+
+msgid "Clear the menu's typeahead find buffer."
+msgstr "Effacer le tampon d'autocomplétion du menu."
+
+msgid "Toggle floating dock."
+msgstr "(dès)activer le doc flottant."
+
+msgid "Pos-TL"
+msgstr "position HG"
+
+msgid "Pos-TR"
+msgstr "position HD"
+
+msgid "Pos-BL"
+msgstr "position BG"
+
+msgid "Pos-BR"
+msgstr "position BD"
+
+msgid "Grow-L"
+msgstr "Agrandir vers la gauche"
+
+msgid "Grow-R"
+msgstr "Agrandir vers le droite"
+
+msgid "Grow-U"
+msgstr "Agrandir vers le haut"
+
+msgid "Grow-D"
+msgstr "Agrandir vers le bas"
+
+msgid "press"
+msgstr "presser"
+
+msgid "click"
+msgstr "clic"
+
+msgid "drag"
+msgstr "glisser"
+
+msgid "double click"
+msgstr "double clic"
+
+msgid "%s %s"
+msgstr "%s %s"
+
+msgid "%s %s at %s"
+msgstr "%s %s na %s"
+
# what you want.
#LUA_LIBS=`pkg-config --libs lua5.1`
#LUA_INCLUDES=`pkg-config --cflags lua5.1`
-#LUA=`which lua5.1`
-#LUAC=`which luac5.1`
+#LUA=/usr/bin/lua5.1
+#LUAC=/usr/bin/luac5.1
##
#EXTRA_LIBS += -lintl
#EXTRA_INCLUDES +=
+# clock_gettime for monotonic time
+EXTRA_LIBS += -lrt
+
##
## C compiler
LIBS += $(LIBTU_LIBS)
INCLUDES += $(LIBTU_INCLUDES)
-CFLAGS += $(XOPEN_SOURCE)
+CFLAGS += $(XOPEN_SOURCE) $(C99_SOURCE)
SOURCES=ion-completefile.c
#include <sys/param.h>
#include <sys/types.h>
+#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
-#define ION_VERSION "3rc-20070506"
-#define ION_API_VERSION "3-"ION_VERSION
+#define ION_VERSION "3rc-20070608"
+#define ION_API_VERSION "3"