patches that i said were in - commit. (see my reply emails)

also finish off a TODO item or 2


SVN revision: 23267
This commit is contained in:
Carsten Haitzler 2006-06-07 23:30:15 +00:00
parent a69bc7767c
commit 97eec41ad9
22 changed files with 873 additions and 348 deletions

25
TODO
View File

@ -8,6 +8,11 @@ Some of the things (in very short form) that need to be done to E17...
BUGS / FIXES BUGS / FIXES
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
* BUG: change exe name in basic mode in eap editor and icon vanishes (don't
extract existing icon and write out to tmp .png while rebuilding).
* BUG: resolution (xrandr) changes seem to screw the shelf up a bit.
* BUG: openoffice2's impress presentation fullscreen has sizing and
configuration issues.
* BUG: ghost windows happen if windows close when on another desktop or if * BUG: ghost windows happen if windows close when on another desktop or if
windows are very short-lived windows are very short-lived
* BUG: k3b has minimization issues when burning cds (it tries to unminimize * BUG: k3b has minimization issues when burning cds (it tries to unminimize
@ -40,6 +45,19 @@ Some of the things (in very short form) that need to be done to E17...
ESSENTIAL FEATURES ESSENTIAL FEATURES
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
* on xrandr screen res change e moves and resizes windows to fit in the new
resolution. this is good and bad. if some other app temporarily changes
res this means everything gets squeezed. we need a "temporary resize due to
res change" geometry state for apps where they get resized to a new pos/size
and the old size/pos stored. on a move or resize etc. by a user this old
geom is freed, but on a res change, e takes the old geom, if there, and
tries to use it (then limiting geom to the new screen res as it cuurently
does) otherwise it creates a new saved geom for the cur geom before
limiting it. maximized windows are reset to their old size/pos then
re-maximized too. old szie from unmaximize needs to have this check too
on unmaximize as do fullscreen windows. NB: what if app moves/resizes
itself during this - i assume for now all bets are off with prior geometry
then.
* language packs: need to have a tool to load/setup a language pack (which * language packs: need to have a tool to load/setup a language pack (which
means .mo compiled files from a .po, an optional font and a config file that means .mo compiled files from a .po, an optional font and a config file that
specifies the locale and font) and then install the font(s) either as a user specifies the locale and font) and then install the font(s) either as a user
@ -78,20 +96,17 @@ Some of the things (in very short form) that need to be done to E17...
"NICE TO HAVE" FEATURES "NICE TO HAVE" FEATURES
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
* option to allow flipping desktops to wrap at virtual desktop grid edges
* winlist and exebuf can let the mouse select items * winlist and exebuf can let the mouse select items
* option to NOT raise on focus in click to focus
* switch to desktop of a new window if it opens on another desktop than the * switch to desktop of a new window if it opens on another desktop than the
current one current one (optional too)
* emit signal to submenu entries if they have a submenu shown for them or not * emit signal to submenu entries if they have a submenu shown for them or not
* setup configs for gnome and kde (as options) if they are installed (eg * setup configs for gnome and kde (as options) if they are installed (eg
run gnome-settings-daemon). run gnome-settings-daemon).
* check engine can work on a given screen before using it * check evas engine can work on a given screen before using it
* non opaque move/resize * non opaque move/resize
* add "osd" subsystem for things like volume controls on keybboards, etc. * add "osd" subsystem for things like volume controls on keybboards, etc.
that overlay the screen that overlay the screen
* file icons on the desktop (people ask for it) - xdnd for these * file icons on the desktop (people ask for it) - xdnd for these
* "disable this gadget" menu option on gadcon clients
* improve drag/resize of gadget items * improve drag/resize of gadget items
* pager should be able to be configured to control more than the current zone * pager should be able to be configured to control more than the current zone
(select which zone they control) (select which zone they control)

View File

@ -1,12 +1,12 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML> <html>
<HEAD> <head>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
<TITLE>Enlightenment Developer Documentation</TITLE> <title>Enlightenment Developer Documentation</title>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.3 (Linux)"> <meta name="GENERATOR" content="OpenOffice.org 1.1.3 (Linux)">
<META NAME="CREATED" CONTENT="20041227;10170000"> <meta name="CREATED" content="20041227;10170000">
<META NAME="CHANGED" CONTENT="20041227;10253900"> <meta name="CHANGED" content="20041227;10253900">
<STYLE> <style>
<!-- <!--
@page { size: 8.5in 11in } @page { size: 8.5in 11in }
TD P.western { font-size: 8pt } TD P.western { font-size: 8pt }
@ -20,44 +20,52 @@
A.sdendnotesym-western { font-size: 8pt } A.sdendnotesym-western { font-size: 8pt }
A.sdendnotesym-cjk { font-family: "Bitstream Vera Sans"; font-size: 8pt } A.sdendnotesym-cjk { font-family: "Bitstream Vera Sans"; font-size: 8pt }
--> -->
</STYLE> </style>
</HEAD> </head>
<BODY LANG="en-US" DIR="LTR"> <body dir="ltr" lang="en-US">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always"> <table style="page-break-before: always;" border="0" cellpadding="0"
<COL WIDTH=256*> cellspacing="0" width="100%">
<TR> <col width="256*"> <tbody>
<TD WIDTH=100% VALIGN=TOP> <tr>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0in"><IMG SRC="enlightenment.png" NAME="Graphic1" ALIGN=LEFT WIDTH=320 HEIGHT=320 BORDER=0><FONT FACE="Bitstream Vera Sans"><FONT SIZE=5><B>Enlightenment</B></FONT></FONT></P> <td valign="top" width="100%">
<P CLASS="western" STYLE="margin-bottom: 0in"><BR> <p class="western" style="margin-bottom: 0in;" align="center"><img
</P> src="enlightenment.png" name="Graphic1" align="left" border="0"
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 6pt">Version height="320" width="320"><font face="Bitstream Vera Sans"><font
0.17.0 </FONT></FONT> size="5"><b>Enlightenment</b></font></font></p>
</P> <p class="western" style="margin-bottom: 0in;"><br>
<P CLASS="western" STYLE="margin-bottom: 0in"><BR> </p>
</P> <p class="western" style="margin-bottom: 0in;" align="center"><font
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>What style="font-size: 6pt; font-family: sans-serif;">Version
is Enlightenment?</B> </FONT></FONT> 0.17.0</font><big><big><big><font face="Bitstream Vera Sans"><font
</P> style="font-size: 6pt;" size="1"><big><big><big><big> </big></big></big></big></font></font>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Enlightenment </big></big></big></p>
is a Window Manager for X11. This is the latest incarnation of <p class="western" style="margin-bottom: 0in;"><br>
code of the Enlightenment window manager (often referred to in </p>
short as WM). This WM is built on the EFL (Enlightenment <p style="font-family: sans-serif;" class="western"><font
Foundation Libraries) that have been worked on very hard over the style="font-size: 8pt;"><b>What is Enlightenment?</b> </font> </p>
last few years. These libraries provide a sound base on which to <p style="font-family: sans-serif;" class="western"><font
build the WM and related tools, utilities, and applications.</FONT></FONT></P> style="font-size: 8pt;">Enlightenment is a Window
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Right Manager for X11. This is the latest incarnation of code of the
now if you are just a &quot;user&quot; this code is NOT for you. Enlightenment window manager (often referred to in short as WM). This
You're on your own. If you are a developer wanting to work on the WM is built on the EFL (Enlightenment Foundation Libraries) that have
code - read on. But first we should take a break for some been worked on very hard over the last few years. These libraries
history... </FONT></FONT> provide a sound base on which to build the WM and related tools,
</P> utilities, and applications.</font></p>
</TD> <p style="font-family: sans-serif;" class="western"><font
</TR> style="font-size: 8pt;">Right now if you are just a
</TABLE> "user" this code is NOT for you. You're on your own. If you are a
<HR> developer wanting to work on the code - read on. But first we should
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>A take a break for some history... </font> </p>
Brief History of Time... err Enlightenment</B></FONT></FONT></P> </td>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">In </tr>
</tbody>
</table>
<hr style="font-family: sans-serif;">
<p style="font-family: sans-serif;" class="western"><font
style="font-size: 8pt;"><b>A
Brief History of Time... err Enlightenment</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">In
the past E has undergone 1 major rewrite since release DR the past E has undergone 1 major rewrite since release DR
(Development Release) 0.1. This rewrite occurred for DR 0.14). DR (Development Release) 0.1. This rewrite occurred for DR 0.14). DR
0.17 heralds another major rewrite. We have to be honest here. The 0.17 heralds another major rewrite. We have to be honest here. The
@ -76,8 +84,9 @@ and we are proud enough to probably say it's some of the better API's
and code of any available in the world or used in any application or and code of any available in the world or used in any application or
WM. It's not the best, but it's pretty good. In doing this rewrite WM. It's not the best, but it's pretty good. In doing this rewrite
and split, we aim to not make those mistakes again that happened and split, we aim to not make those mistakes again that happened
before DR 0.17.0.</FONT></FONT></P> before DR 0.17.0.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">With <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">With
Enlightenment and EFL's massive break-up into smaller sized chunks, Enlightenment and EFL's massive break-up into smaller sized chunks,
many users will complain about “how hard it is to install” many users will complain about “how hard it is to install”
because there are so many libraries and inter-dependencies to handle. because there are so many libraries and inter-dependencies to handle.
@ -95,64 +104,72 @@ existing infrastructures - or extend them cleanly as needed. Just
because an infrastructure or system doesn't provide an accessor or because an infrastructure or system doesn't provide an accessor or
way of doing something does NOT mean you can't or chouldn't add it. way of doing something does NOT mean you can't or chouldn't add it.
Choose a clean “correct” implementation over a nasty hack, all Choose a clean “correct” implementation over a nasty hack, all
the time. You get the idea. Now, on to the style guide.</FONT></FONT></P> the time. You get the idea. Now, on to the style guide.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Enlightenment <p style="font-family: sans-serif;" class="western"><font
Stylin' straight from the top of ma dome</B></FONT></FONT></P> style="font-size: 8pt;"><b>Enlightenment
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Firstly Stylin' straight from the top of ma dome</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Firstly
comes naming. All functions are name spaced. The EFL libraries begin comes naming. All functions are name spaced. The EFL libraries begin
with library_something_something. It is object oriented naming so you with library_something_something. It is object oriented naming so you
will have system_subsystem_subsystem_object_verb() as a name. For will have system_subsystem_subsystem_object_verb() as a name. For
example: e_config_load() or e_border_move() etc. All functions are example: e_config_load() or e_border_move() etc. All functions are
all lower-case with underscores between &quot;words&quot;. All all lower-case with underscores between "words". All
functions that are accessed outside a file must have a prototype in functions that are accessed outside a file must have a prototype in
the file's header. All files have their code file (e_file.c) and a the file's header. All files have their code file (e_file.c) and a
header (e_file.h). The main &quot;master&quot; header (e.h) includes header (e_file.h). The main "master" header (e.h) includes
all the smaller ones. All functions within that file are the same all the smaller ones. All functions within that file are the same
name as the file. i.e. e_frog.c contains functions called name as the file. i.e. e_frog.c contains functions called
e_frog_something(). All internal functions only used within that file e_frog_something(). All internal functions only used within that file
should be declared as static and should begin with an underscore. should be declared as static and should begin with an underscore.
i.e. _e_frog_something(). All &quot;local&quot; globals (global to i.e. _e_frog_something(). All "local" globals (global to
that file only) should be declared static and beginning with _e_frog that file only) should be declared static and beginning with _e_frog
just like functions. All static local functions should be at the end just like functions. All static local functions should be at the end
of the file. All static function prototypes should be first at the of the file. All static function prototypes should be first at the
top of each file. All static local variables should come next, then top of each file. All static local variables should come next, then
followed by the accessible functions. Any system that has &quot;state&quot; followed by the accessible functions. Any system that has "state"
should have an init and shutdown function. The init and shutdown should have an init and shutdown function. The init and shutdown
functions should be called from e_main.c during startup and shutdown functions should be called from e_main.c during startup and shutdown
of the WM. It is encouraged that even systems that do not have state of the WM. It is encouraged that even systems that do not have state
have an init and shutdown call pair, just in case in future they will have an init and shutdown call pair, just in case in future they will
gain state internally.</FONT></FONT></P> gain state internally.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Any <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Any
system that returns objects (allocated structures) should probably system that returns objects (allocated structures) should probably
use the E_Object system as a parent. See examples on its use in the use the E_Object system as a parent. See examples on its use in the
code. E_Object provides a simple object wrapper with reference code. E_Object provides a simple object wrapper with reference
counting, object pointer and type checking and safety that should, counting, object pointer and type checking and safety that should,
runtime, trap a lot of potential problems and let the programmer know runtime, trap a lot of potential problems and let the programmer know
about them. Use the object type checking macros for checking if an about them. Use the object type checking macros for checking if an
object passed into a function as a parameter is a valid object.</FONT></FONT></P> object passed into a function as a parameter is a valid object.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Keep <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Keep
to the indentation and spacing style thats there - it makes it easier to the indentation and spacing style thats there - it makes it easier
to read if all the code matches. All functions called as &quot;callbacks&quot; to read if all the code matches. All functions called as "callbacks"
should be called _e_system_cb_something. The &quot;cb&quot; denotes should be called _e_system_cb_something. The "cb" denotes
that that function may get called by other code, maybe unpredictably, that that function may get called by other code, maybe unpredictably,
at any time in response to an event, timer, or something mostly out at any time in response to an event, timer, or something mostly out
of the control of the program itself. Functions such as the free of the control of the program itself. Functions such as the free
function for an object aren't the same kind of callback, since they function for an object aren't the same kind of callback, since they
are predictable and controllable, so they do not get &quot;cb&quot; are predictable and controllable, so they do not get "cb"
in their name.</FONT></FONT></P> in their name.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">So <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">So
that's the quick rundown on basic coding style. More will likely be that's the quick rundown on basic coding style. More will likely be
added to this list, but the best way to put it all is &quot;look at added to this list, but the best way to put it all is "look at
what's there and follow the same style&quot;.</FONT></FONT></P> what's there and follow the same style".</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Tree <p style="font-family: sans-serif;" class="western"><font
Layout</B></FONT></FONT></P> style="font-size: 8pt;"><b>Tree
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">The Layout</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">The
E17 source tree is well structured, with a location for everything. E17 source tree is well structured, with a location for everything.
In the top-level directory you will find a src directory that is the In the top-level directory you will find a src directory that is the
master directory for all the C source code for the WM and components. master directory for all the C source code for the WM and components.
You will also find a doc and data directories. The doc directory You will also find a doc and data directories. The doc directory
contains all documentation (this document for example).</FONT></FONT></P> contains all documentation (this document for example).</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">The <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">The
data directory contains all cross-platform data needed for the WM to data directory contains all cross-platform data needed for the WM to
run as well as a basic default theme that it also needs to run. run as well as a basic default theme that it also needs to run.
Currently the default theme is not complete at all and is no Currently the default theme is not complete at all and is no
@ -161,8 +178,9 @@ only just enough to make it work and demonstrate an example of how to
make a theme. There is also other data used for things like low-level make a theme. There is also other data used for things like low-level
error dialogs (used for example if the theme doesn't work) as well as error dialogs (used for example if the theme doesn't work) as well as
a default font and other system data such as data for the splash a default font and other system data such as data for the splash
screen displayed while Enlightenment starts up.</FONT></FONT></P> screen displayed while Enlightenment starts up.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">The <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">The
src directory contains 3 main repositories of code. They are bin, lib src directory contains 3 main repositories of code. They are bin, lib
and modules. The bin directory contains all the source code for the and modules. The bin directory contains all the source code for the
WM itself and any primary executables it uses during execution. The WM itself and any primary executables it uses during execution. The
@ -175,10 +193,12 @@ Enlightenment too, so if a feature isn't used it doesn't have to use
any resources at all. Each module lives in its own subdirectory with any resources at all. Each module lives in its own subdirectory with
the code and special module specific data like images, Edje .eet the code and special module specific data like images, Edje .eet
files etc. that are specific to that module. See further on for more files etc. that are specific to that module. See further on for more
information on modules.</FONT></FONT></P> information on modules.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Design <p style="font-family: sans-serif;" class="western"><font
Ethos</B></FONT></FONT></P> style="font-size: 8pt;"><b>Design
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">As Ethos</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">As
for design, Enlightenment doesn't strictly follow a conservative WM for design, Enlightenment doesn't strictly follow a conservative WM
design. It does some things quite differently, with the aim of design. It does some things quite differently, with the aim of
providing more features with simpler internal design to achieve more providing more features with simpler internal design to achieve more
@ -198,9 +218,11 @@ seamlessly and all in sync by using window gravity and resizing of
the virtual root container. It also allows the WM to simulate the virtual root container. It also allows the WM to simulate
different resolutions very easily since it can control the virtual different resolutions very easily since it can control the virtual
root window, which is not normally possible to do with the real root root window, which is not normally possible to do with the real root
window.</FONT></FONT></P> window.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Managers</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Managers style="font-size: 8pt;"><b>Managers</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Managers
are the basic unit of window management. One Manager object is are the basic unit of window management. One Manager object is
created per root window to manage. For more people, even if they run created per root window to manage. For more people, even if they run
Xinerama across multiple screens, there is only 1 root window, and Xinerama across multiple screens, there is only 1 root window, and
@ -214,9 +236,11 @@ client gets to perform them, thus enabling it to be a WM. A Manager
object actually creates a window the size of the root window it object actually creates a window the size of the root window it
manages and covers the root window up completely. Each Manager object manages and covers the root window up completely. Each Manager object
may contain 1 or more Container objects which in-turn create their may contain 1 or more Container objects which in-turn create their
own child windows of the Manager window.</FONT></FONT></P> own child windows of the Manager window.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Containers</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Container style="font-size: 8pt;"><b>Containers</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Container
objects create their own windows to CONTAIN managed window frames, objects create their own windows to CONTAIN managed window frames,
the desktop window (the desktop background is actually just a big the desktop window (the desktop background is actually just a big
window that is always kept below all frame windows that contains a window that is always kept below all frame windows that contains a
@ -234,8 +258,9 @@ using an EDJE object for the background, the desktop wallpaper can be
animated, react to events and input, scale intelligently (not just animated, react to events and input, scale intelligently (not just
“stretch” or “tile”), where the desktop wallpaper designer “stretch” or “tile”), where the desktop wallpaper designer
can specify what elements of the wallpaper scale, align, where and can specify what elements of the wallpaper scale, align, where and
how, if they tile, overlay, underlay each other, and how.</FONT></FONT></P> how, if they tile, overlay, underlay each other, and how.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Currently <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Currently
the Container only responds to configuration change events to change the Container only responds to configuration change events to change
the background, which needs to be a path to an Edje .eet file that the background, which needs to be a path to an Edje .eet file that
contains a Edje group of the key “desktop/background”. It will contains a Edje group of the key “desktop/background”. It will
@ -251,22 +276,27 @@ convert into a Edje .eet file, which now retains the scaling, tiling
and other preferences the user selected within the file. The user can and other preferences the user selected within the file. The user can
now give this file to others and it will retain the same information, now give this file to others and it will retain the same information,
without them needing to know if the wallpaper needs to tile as a without them needing to know if the wallpaper needs to tile as a
pattern, stretch etc.</FONT></FONT></P> pattern, stretch etc.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">The <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">The
desktop canvas is also shared by many modules that may display things desktop canvas is also shared by many modules that may display things
like battery meters, cpu load, launcher bars, drop shadows etc. on like battery meters, cpu load, launcher bars, drop shadows etc. on
the desktop background. The desktop canvas lets this be a bit more the desktop background. The desktop canvas lets this be a bit more
organized than it would be with a “free for all” drawing to the organized than it would be with a “free for all” drawing to the
root window under more conservative WM's.</FONT></FONT></P> root window under more conservative WM's.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Borders</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Borders style="font-size: 8pt;"><b>Borders</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Borders
are the frame outside an application window that is controlled by the are the frame outside an application window that is controlled by the
WM and that holds the application window within, and allows users to WM and that holds the application window within, and allows users to
move, resize, shade, lower, close and otherwise control windows. This move, resize, shade, lower, close and otherwise control windows. This
is currently buggy and not very useful and needs work in combination is currently buggy and not very useful and needs work in combination
with the Manager system.</FONT></FONT></P> with the Manager system.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Menus</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Enlightenment style="font-size: 8pt;"><b>Menus</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Enlightenment
has its own Menu widget code to allow for highly themable menus that has its own Menu widget code to allow for highly themable menus that
match your WM's theme. These menus are intended to act as ways to match your WM's theme. These menus are intended to act as ways to
launch programs, select actions to perform with context sensitive launch programs, select actions to perform with context sensitive
@ -277,9 +307,11 @@ let the user navigate with the keyboard, mouse wheel or mouse. It
currently needs work to support shaped menu windows, be able to add, currently needs work to support shaped menu windows, be able to add,
delete and modify menu items while the item is still realized, and a delete and modify menu items while the item is still realized, and a
set of other things listed in the TODO list at the top of the set of other things listed in the TODO list at the top of the
e_menu.c source file.</FONT></FONT></P> e_menu.c source file.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Modules</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Modules style="font-size: 8pt;"><b>Modules</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Modules
are a new and powerful way to extend E17 by being able to load and are a new and powerful way to extend E17 by being able to load and
execute code during runtime that may be shipped with E17 or even execute code during runtime that may be shipped with E17 or even
developed after installation as enhancements and additions. This developed after installation as enhancements and additions. This
@ -289,10 +321,12 @@ loaded etc. It is possible to have “dormant” modules that are
loaded but not enabled. They will use memory and resources for the loaded but not enabled. They will use memory and resources for the
module entry and the binary executable code loaded into memory, but module entry and the binary executable code loaded into memory, but
nothing else. An enabled module will also use resources for objects, nothing else. An enabled module will also use resources for objects,
images, etc. etc.</FONT></FONT></P> images, etc. etc.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Dropshadow <p style="font-family: sans-serif;" class="western"><font
Module</B></FONT></FONT></P> style="font-size: 8pt;"><b>Dropshadow
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This Module</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
module demonstrates the Container shape system allowing a module to module demonstrates the Container shape system allowing a module to
monitor obscuring shapes in a container. This lets the module, in monitor obscuring shapes in a container. This lets the module, in
this case, draw soft shadows under these obscuring shapes. It is a this case, draw soft shadows under these obscuring shapes. It is a
@ -301,10 +335,12 @@ visible elements on the screen you can click on or control directly
with the mouse or keyboard. It could do with some optimization work with the mouse or keyboard. It could do with some optimization work
with the blur algorithm, like clipping out the obscuring shape with the blur algorithm, like clipping out the obscuring shape
entirely from the blurring algorithm, and perhaps finding a way of entirely from the blurring algorithm, and perhaps finding a way of
blurring using a Gaussian blur that is faster.</FONT></FONT></P> blurring using a Gaussian blur that is faster.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>IBar <p style="font-family: sans-serif;" class="western"><font
Module</B></FONT></FONT></P> style="font-size: 8pt;"><b>IBar
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">The Module</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">The
IBar module is a template for doing a “launcher panel” in E17. It IBar module is a template for doing a “launcher panel” in E17. It
allows the user to manage a list of frequently used applications to allows the user to manage a list of frequently used applications to
go into the IBar's panel. It is an attempt to unify the configuration go into the IBar's panel. It is an attempt to unify the configuration
@ -317,8 +353,9 @@ in the list. It uses the Application interface to fetch a list of
applications and monitor this list for changes on disk. The IBar also applications and monitor this list for changes on disk. The IBar also
allows itself to be resized and dragged around the edges of the allows itself to be resized and dragged around the edges of the
screen, set to fill a edge, auto-size to fit its contents, or be a screen, set to fill a edge, auto-size to fit its contents, or be a
fixed size.</FONT></FONT></P> fixed size.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">It <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">It
needs work to be done on auto hide and auto show, so on an auto show needs work to be done on auto hide and auto show, so on an auto show
it could signal other parts of E17, for example, to slide all windows it could signal other parts of E17, for example, to slide all windows
out of the way, or other such features. It needs work to display out of the way, or other such features. It needs work to display
@ -326,15 +363,19 @@ application names, descriptions and other such information as well.
It also needs to support the icon size changing on the fly as well as It also needs to support the icon size changing on the fly as well as
saving and loading its configuration, On of the largest pieces of saving and loading its configuration, On of the largest pieces of
work is to support subdirectories in the bar's application list. How work is to support subdirectories in the bar's application list. How
best to do this is still up in the air. For now this isn't supported.</FONT></FONT></P> best to do this is still up in the air. For now this isn't supported.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Test <p style="font-family: sans-serif;" class="western"><font
Module</B></FONT></FONT></P> style="font-size: 8pt;"><b>Test
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This Module</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
is just a test module for playing with new module features. It will is just a test module for playing with new module features. It will
not make its way into a final E17 release, but can be used as a bare not make its way into a final E17 release, but can be used as a bare
skeleton for building a new module.</FONT></FONT></P> skeleton for building a new module.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Applications</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This style="font-size: 8pt;"><b>Applications</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
subsystem is responsible for being able to list applications held in subsystem is responsible for being able to list applications held in
E17 specific application directories. This system can inform other E17 specific application directories. This system can inform other
parts of E17 and modules of changes, such as an application being parts of E17 and modules of changes, such as an application being
@ -342,8 +383,9 @@ deleted or added, its name or icon changed, the order of applications
in a directory changing, an application being executed or displaying in a directory changing, an application being executed or displaying
its window, or finishing execution. It can share the application its window, or finishing execution. It can share the application
lists between multiple systems to save RAM and CPU and I/O in loading lists between multiple systems to save RAM and CPU and I/O in loading
them multiple times.</FONT></FONT></P> them multiple times.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">It <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">It
may be of surprise to find E17 is not loading the XML, .desktop may be of surprise to find E17 is not loading the XML, .desktop
entries etc. etc. than KDE and GNOME use. In all honesty that system entries etc. etc. than KDE and GNOME use. In all honesty that system
is a little overcomplicated and hard to keep up with. It also is not is a little overcomplicated and hard to keep up with. It also is not
@ -354,9 +396,11 @@ fully scalable and animated icons as well, with excellent compression
abilities. The intent is to have external tools that can import and abilities. The intent is to have external tools that can import and
create such files FROM existing system databases of applications and create such files FROM existing system databases of applications and
monitor these for changes, reflecting those changes in Enlightenments monitor these for changes, reflecting those changes in Enlightenments
application directories.</FONT></FONT></P> application directories.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>IPC</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">IPC style="font-size: 8pt;"><b>IPC</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">IPC
(inter process communication) is provided in E17 as a mechanism for (inter process communication) is provided in E17 as a mechanism for
another application to send commands and requests to Enlightenment another application to send commands and requests to Enlightenment
and receive responses with information. This mechanism is intended to and receive responses with information. This mechanism is intended to
@ -365,69 +409,89 @@ things via a communications channel built into the WM. E17 uses the
Ecore IPC system to do this. So far it support no commands at all, Ecore IPC system to do this. So far it support no commands at all,
but will accept clients connecting. Many commands need to be but will accept clients connecting. Many commands need to be
implemented here, such as being able to ask E17 to load or unload a implemented here, such as being able to ask E17 to load or unload a
module, change background, change focus mode, theme, restart etc.</FONT></FONT></P> module, change background, change focus mode, theme, restart etc.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Objects</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This style="font-size: 8pt;"><b>Objects</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
provides a basic Object Oriented handling system for E17. Any major provides a basic Object Oriented handling system for E17. Any major
“object” in E17 should use this system for handling reference “object” in E17 should use this system for handling reference
counting, destruction and creation of objects, as it provides safety counting, destruction and creation of objects, as it provides safety
mechanisms to check if an object has accidentally been destroyed and mechanisms to check if an object has accidentally been destroyed and
still has a pointer to it, keep references on objects intact etc. still has a pointer to it, keep references on objects intact etc.
This should be used as much as possible, as well as the macros it This should be used as much as possible, as well as the macros it
provides for checking on entry points into subsystem functions etc.</FONT></FONT></P> provides for checking on entry points into subsystem functions etc.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Pointers</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This style="font-size: 8pt;"><b>Pointers</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
subsystem handles setting of X mouse cursors in an abstract fashion. subsystem handles setting of X mouse cursors in an abstract fashion.
In theory E just looks at a cursor as RGBA pixel data. In future In theory E just looks at a cursor as RGBA pixel data. In future
Ecore will be expanded to be able to set full color cursors in X as Ecore will be expanded to be able to set full color cursors in X as
well as monochrome versions of them. Currently it is very simplistic well as monochrome versions of them. Currently it is very simplistic
loading a fixed PNG as a cursor. This needs to be improved.</FONT></FONT></P> loading a fixed PNG as a cursor. This needs to be improved.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Box</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This style="font-size: 8pt;"><b>Box</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
is a basic Evas Smart Object that acts as a horizontal or vertical is a basic Evas Smart Object that acts as a horizontal or vertical
box layout container. It needs more features for layout, like better box layout container. It needs more features for layout, like better
non homogeneous layout. This is a handy object that is sued by menus non homogeneous layout. This is a handy object that is sued by menus
and the IBar module for starters.</FONT></FONT></P> and the IBar module for starters.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Icons</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This style="font-size: 8pt;"><b>Icons</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
is an Evas Smart Object that creates a icon display object That is an Evas Smart Object that creates a icon display object That
handles scaling the icon sensibly within the object bounds, so the handles scaling the icon sensibly within the object bounds, so the
application doesn't have to handle trying to retain aspect ratio for application doesn't have to handle trying to retain aspect ratio for
the object. This is a simple smart object and indicative of possibly the object. This is a simple smart object and indicative of possibly
more in future to go into E17's code to save time and effort.</FONT></FONT></P> more in future to go into E17's code to save time and effort.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Paths</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This style="font-size: 8pt;"><b>Paths</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
helps E17 find files in a list of paths/directories. There isn't a helps E17 find files in a list of paths/directories. There isn't a
lot to say about this except that it works and may need some minimal lot to say about this except that it works and may need some minimal
expansion in future.</FONT></FONT></P> expansion in future.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>User <p style="font-family: sans-serif;" class="western"><font
Information</B></FONT></FONT></P> style="font-size: 8pt;"><b>User
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This Information</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
returns information about a user such as their home directory. This returns information about a user such as their home directory. This
will expand in future.</FONT></FONT></P> will expand in future.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Virtual <p style="font-family: sans-serif;" class="western"><font
and Multiple Desktops</B></FONT></FONT></P> style="font-size: 8pt;"><b>Virtual
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This and Multiple Desktops</b></font></p>
is not implemented yet.</FONT></FONT></P> <p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Error style="font-size: 8pt;">This
Dialogs</B></FONT></FONT></P> is not implemented yet.</font></p>
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This <p style="font-family: sans-serif;" class="western"><font
style="font-size: 8pt;"><b>Error
Dialogs</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
displays very basic error dialogs right now, either as text in the displays very basic error dialogs right now, either as text in the
console if E17 isn't ready to run graphically yet, or as text in a console if E17 isn't ready to run graphically yet, or as text in a
graphical dialog box. This needs to be made more robust, so it can graphical dialog box. This needs to be made more robust, so it can
display errors if it cannot find the font and images for the basic display errors if it cannot find the font and images for the basic
error dialog. It should also be expanded to support fully themed error dialog. It should also be expanded to support fully themed
dialogs if the theme loads properly and properly supports theming of dialogs if the theme loads properly and properly supports theming of
dialogs, so dialogs look good.</FONT></FONT></P> dialogs, so dialogs look good.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Initialization <p style="font-family: sans-serif;" class="western"><font
Splash Screen</B></FONT></FONT></P> style="font-size: 8pt;"><b>Initialization
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">This Splash Screen</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">This
keeps the user amused while E17 starts up and launches all programs. keeps the user amused while E17 starts up and launches all programs.
For now it is artificially fixed to stay up for 4 seconds so you can For now it is artificially fixed to stay up for 4 seconds so you can
enjoy its radiant splendor, as E17 starts so quickly you'd never see enjoy its radiant splendor, as E17 starts so quickly you'd never see
it, but in future it will stay up until the WM is all ready to go.</FONT></FONT></P> it, but in future it will stay up until the WM is all ready to go.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Configuration</B></FONT></FONT></P> <p style="font-family: sans-serif;" class="western"><font
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Loading style="font-size: 8pt;"><b>Configuration</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Loading
and saving configuration is a big task. E17 uses EET directly as its and saving configuration is a big task. E17 uses EET directly as its
underlying layer for saving and loading configuration. The E17 Config underlying layer for saving and loading configuration. The E17 Config
system simply loads all the initial configuration values, and saves system simply loads all the initial configuration values, and saves
@ -438,18 +502,22 @@ listener (the number of listeners needs to be reduced), so maybe
loading config values in sections/groups and deferring a reload in a loading config values in sections/groups and deferring a reload in a
Ecore Job would limit the reloading effects. Also declaring config Ecore Job would limit the reloading effects. Also declaring config
values and how to load and declare them is required. Maybe a big values and how to load and declare them is required. Maybe a big
table with default values, min, max, step, descriptions etc.</FONT></FONT></P> table with default values, min, max, step, descriptions etc.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>File <p style="font-family: sans-serif;" class="western"><font
Operations</B></FONT></FONT></P> style="font-size: 8pt;"><b>File
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Files Operations</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Files
need to be accessed, listed, found, examined as part of E17 running. need to be accessed, listed, found, examined as part of E17 running.
This file has simplified, easy-to-use functions for doing anything This file has simplified, easy-to-use functions for doing anything
related to files. This file will expand over time as more file related to files. This file will expand over time as more file
operations are needed.</FONT></FONT></P> operations are needed.</font></p>
<P CLASS="western"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt"><B>Miscellaneous <p style="font-family: sans-serif;" class="western"><font
Utilities</B></FONT></FONT></P> style="font-size: 8pt;"><b>Miscellaneous
<P CLASS="western" STYLE="margin-left: 0.79in"><FONT FACE="Bitstream Vera Sans"><FONT SIZE=1 STYLE="font-size: 8pt">Things Utilities</b></font></p>
<p class="western" style="margin-left: 0.79in; font-family: sans-serif;"><font
style="font-size: 8pt;">Things
that are useful in many places but do not have enough scope to have a that are useful in many places but do not have enough scope to have a
file of their own go into this file.</FONT></FONT></P> file of their own go into this file.</font></p>
</BODY> </body>
</HTML> </html>

View File

@ -1035,6 +1035,42 @@ ACT_FN_GO(zone_desk_linear_flip_to)
} }
} }
/***************************************************************************/
ACT_FN_GO(zone_deskshow_toggle)
{
E_Border *bd;
E_Border_List *bl;
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (!zone) zone = e_util_zone_current_get(e_manager_current_get());
if (zone)
{
bl = e_container_border_list_first(zone->container);
while ((bd = e_container_border_list_next(bl)))
{
if (bd->desk == e_desk_current_get(bd->zone))
{
if (zone->deskshow_toggle)
{
if (bd->deskshow) e_border_uniconify(bd);
bd->deskshow = 0;
}
else
{
if (bd->iconic) continue;
if (bd->client.netwm.state.skip_taskbar) continue;
if (bd->user_skip_winlist) continue;
e_border_iconify(bd);
bd->deskshow = 1;
}
}
}
zone->deskshow_toggle = zone->deskshow_toggle ? 0 : 1;
e_container_border_list_free(bl);
}
}
/***************************************************************************/ /***************************************************************************/
static void static void
_e_actions_cb_menu_end(void *data, E_Menu *m) _e_actions_cb_menu_end(void *data, E_Menu *m)
@ -1602,10 +1638,10 @@ e_actions_init(void)
/* zone_deskshow_toggle */ /* zone_deskshow_toggle */
ACT_GO(zone_deskshow_toggle); ACT_GO(zone_deskshow_toggle);
e_register_action_predef_name(_("Desktop"), _("Show the desktop"), e_register_action_predef_name(_("Desktop"), _("Show The Desktop"),
"zone_deskshow_toggle", NULL, "zone_deskshow_toggle", NULL,
EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS, 0); EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS, 0);
/* desk_linear_flip_to */ /* desk_linear_flip_to */
ACT_GO(desk_flip_to); ACT_GO(desk_flip_to);
e_register_action_predef_name(_("Desktop"), _("Flip Desktop To..."), e_register_action_predef_name(_("Desktop"), _("Flip Desktop To..."),

View File

@ -528,6 +528,8 @@ _e_app_list_prepend_relative(E_App *add, E_App *before, E_App *parent)
} }
if (before == NULL) fprintf(f, "%s\n", ecore_file_get_file(add->path)); if (before == NULL) fprintf(f, "%s\n", ecore_file_get_file(add->path));
fclose(f); fclose(f);
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", parent->path);
ecore_file_unlink(buf);
} }
static void static void
@ -572,6 +574,8 @@ _e_app_files_list_prepend_relative(Evas_List *files, E_App *before, E_App *paren
} }
} }
fclose(f); fclose(f);
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", parent->path);
ecore_file_unlink(buf);
} }
static void static void
@ -589,6 +593,8 @@ _e_app_files_download(Evas_List *files)
snprintf(buf, sizeof(buf), "%s/%s", _e_apps_path_all, snprintf(buf, sizeof(buf), "%s/%s", _e_apps_path_all,
ecore_file_get_file(file)); ecore_file_get_file(file));
if (!ecore_file_download(file, buf, NULL, NULL, NULL)) continue; if (!ecore_file_download(file, buf, NULL, NULL, NULL)) continue;
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", _e_apps_path_all);
ecore_file_unlink(buf);
} }
} }
@ -722,6 +728,8 @@ e_app_files_prepend_relative(Evas_List *files, E_App *before)
fprintf(f, "%s\n", ecore_file_get_file(a->path)); fprintf(f, "%s\n", ecore_file_get_file(a->path));
} }
fclose(f); fclose(f);
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", before->parent->path);
ecore_file_unlink(buf);
} }
} }
@ -762,6 +770,8 @@ e_app_files_append(Evas_List *files, E_App *parent)
fprintf(f, "%s\n", ecore_file_get_file(file)); fprintf(f, "%s\n", ecore_file_get_file(file));
} }
fclose(f); fclose(f);
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", parent->path);
ecore_file_unlink(buf);
} }
} }
@ -793,6 +803,8 @@ e_app_remove(E_App *a)
a2 = l->data; a2 = l->data;
e_app_remove(a2); e_app_remove(a2);
} }
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", a->parent->path);
ecore_file_unlink(buf);
_e_app_change(a, E_APP_DEL); _e_app_change(a, E_APP_DEL);
a->parent = NULL; a->parent = NULL;
e_object_unref(E_OBJECT(a)); e_object_unref(E_OBJECT(a));
@ -879,41 +891,51 @@ EAPI E_App *
e_app_window_name_class_title_role_find(const char *name, const char *class, e_app_window_name_class_title_role_find(const char *name, const char *class,
const char *title, const char *role) const char *title, const char *role)
{ {
Evas_List *l; Evas_List *l, *l_match = NULL;
int ok, match = 0;
E_App *a, *a_match = NULL;
if ((!name) && (!class) && (!title) && (!role)) if ((!name) && (!class) && (!title) && (!role))
return NULL; return NULL;
for (l = _e_apps_list; l; l = l->next) for (l = _e_apps_list; l; l = l->next)
{ {
E_App *a;
int ok;
a = l->data; a = l->data;
ok = 0; ok = 0;
if ((a->win_name) || (a->win_class) || (a->win_title) || (a->win_role)) if ((a->win_name) || (a->win_class) || (a->win_title) || (a->win_role))
{ {
if ((!a->win_name) || if ((a->win_name) && (a->win_class) && (name) && (class))
((a->win_name) && (name) && (e_util_glob_match(name, a->win_name)))) {
ok++; if ((e_util_glob_match(name, a->win_name)) &&
if ((!a->win_class) || (e_util_glob_match(class, a->win_class)))
((a->win_class) && (class) && (e_util_glob_match(class, a->win_class)))) ok += 2;
ok++; }
if ((!a->win_title) || else if ((a->win_class) && (class))
{
if (e_util_glob_match(class, a->win_class))
ok += 2;
}
if (//(!a->win_title) ||
((a->win_title) && (title) && (e_util_glob_match(title, a->win_title)))) ((a->win_title) && (title) && (e_util_glob_match(title, a->win_title))))
ok++; ok++;
if ((!a->win_role) || if (//(!a->win_role) ||
((a->win_role) && (role) && (e_util_glob_match(role, a->win_role)))) ((a->win_role) && (role) && (e_util_glob_match(role, a->win_role))))
ok++; ok++;
} }
if (ok >= 4) if (ok > match)
{ {
_e_apps_list = evas_list_remove_list(_e_apps_list, l); match = ok;
_e_apps_list = evas_list_prepend(_e_apps_list, a); a_match = a;
return a; l_match = l;
} }
} }
return NULL; if ((a_match) && (l_match))
{
_e_apps_list = evas_list_remove_list(_e_apps_list, l);
_e_apps_list = evas_list_prepend(_e_apps_list, a_match);
}
return a_match;
} }
EAPI E_App * EAPI E_App *
@ -1315,6 +1337,8 @@ e_app_fields_save(E_App *a)
{ {
Evas_List *l; Evas_List *l;
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", a->parent->path);
ecore_file_unlink(buf);
_e_app_change(a->parent, E_APP_CHANGE); _e_app_change(a->parent, E_APP_CHANGE);
_e_app_change(a, E_APP_CHANGE); _e_app_change(a, E_APP_CHANGE);
for (l = a->references; l; l = l->next) for (l = a->references; l; l = l->next)
@ -1529,6 +1553,13 @@ _e_app_new_save(E_App *a)
return 0; return 0;
} }
if (a->parent)
{
char buf[PATH_MAX];
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", a->parent->path);
ecore_file_unlink(buf);
}
ecore_file_unlink(tmpn); ecore_file_unlink(tmpn);
return 1; return 1;
} }
@ -2035,6 +2066,13 @@ _e_app_save_order(E_App *app)
fprintf(f, "%s\n", ecore_file_get_file(a->path)); fprintf(f, "%s\n", ecore_file_get_file(a->path));
} }
fclose(f); fclose(f);
if (app->parent)
{
char buf[PATH_MAX];
snprintf(buf, sizeof(buf), "%s/.eap.cache.cfg", app ->parent->path);
ecore_file_unlink(buf);
}
} }
static int static int

View File

@ -298,6 +298,16 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map, int internal)
bd->client.netwm.state.skip_pager = 0; bd->client.netwm.state.skip_pager = 0;
bd->client.netwm.state.fullscreen = 0; bd->client.netwm.state.fullscreen = 0;
bd->client.netwm.state.stacking = E_STACKING_NONE; bd->client.netwm.state.stacking = E_STACKING_NONE;
bd->client.netwm.action.move = 0;
bd->client.netwm.action.resize = 0;
bd->client.netwm.action.minimize = 0;
bd->client.netwm.action.shade = 0;
bd->client.netwm.action.stick = 0;
bd->client.netwm.action.maximized_h = 0;
bd->client.netwm.action.maximized_v = 0;
bd->client.netwm.action.fullscreen = 0;
bd->client.netwm.action.change_desktop = 0;
bd->client.netwm.action.close = 0;
bd->client.netwm.type = ECORE_X_WINDOW_TYPE_UNKNOWN; bd->client.netwm.type = ECORE_X_WINDOW_TYPE_UNKNOWN;
{ {
@ -305,6 +315,7 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map, int internal)
Ecore_X_Atom *atoms; Ecore_X_Atom *atoms;
atoms = ecore_x_window_prop_list(bd->client.win, &at_num); atoms = ecore_x_window_prop_list(bd->client.win, &at_num);
bd->client.icccm.fetch.command = 1;
if (atoms) if (atoms)
{ {
/* icccm */ /* icccm */
@ -2919,6 +2930,14 @@ _e_border_free(E_Border *bd)
if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name); if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name);
if (bd->client.icccm.machine) free(bd->client.icccm.machine); if (bd->client.icccm.machine) free(bd->client.icccm.machine);
if (bd->client.icccm.window_role) free(bd->client.icccm.window_role); if (bd->client.icccm.window_role) free(bd->client.icccm.window_role);
if ((bd->client.icccm.command.argc > 0) && (bd->client.icccm.command.argv))
{
int i;
for (i = 0; i < bd->client.icccm.command.argc; i++)
free(bd->client.icccm.command.argv[i]);
free(bd->client.icccm.command.argv);
}
if (bd->client.netwm.name) free(bd->client.netwm.name); if (bd->client.netwm.name) free(bd->client.netwm.name);
if (bd->client.netwm.icon_name) free(bd->client.netwm.icon_name); if (bd->client.netwm.icon_name) free(bd->client.netwm.icon_name);
e_object_del(E_OBJECT(bd->shape)); e_object_del(E_OBJECT(bd->shape));
@ -4500,6 +4519,11 @@ _e_border_eval(E_Border *bd)
int change_urgent = 0; int change_urgent = 0;
/* fetch any info queued to be fetched */ /* fetch any info queued to be fetched */
if (bd->client.icccm.fetch.client_leader)
{
bd->client.icccm.client_leader = ecore_x_icccm_client_leader_get(bd->client.win);
bd->client.icccm.fetch.client_leader = 0;
}
if (bd->client.icccm.fetch.title) if (bd->client.icccm.fetch.title)
{ {
if (bd->client.icccm.title) free(bd->client.icccm.title); if (bd->client.icccm.title) free(bd->client.icccm.title);
@ -4553,78 +4577,6 @@ _e_border_eval(E_Border *bd)
bd->changes.icon = 1; bd->changes.icon = 1;
bd->client.icccm.fetch.name_class = 0; bd->client.icccm.fetch.name_class = 0;
} }
if (bd->client.icccm.fetch.icon_name)
{
if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name);
bd->client.icccm.icon_name = ecore_x_icccm_icon_name_get(bd->client.win);
bd->client.icccm.fetch.icon_name = 0;
}
if (bd->client.netwm.fetch.icon_name)
{
if (bd->client.netwm.icon_name) free(bd->client.netwm.icon_name);
ecore_x_netwm_icon_name_get(bd->client.win, &bd->client.netwm.icon_name);
bd->client.netwm.fetch.icon_name = 0;
}
if (bd->client.netwm.fetch.icon)
{
if (bd->client.netwm.icons)
{
int i;
for (i = 0; i < bd->client.netwm.num_icons; i++)
free(bd->client.netwm.icons[i].data);
free(bd->client.netwm.icons);
}
if (!ecore_x_netwm_icons_get(bd->client.win,
&bd->client.netwm.icons, &bd->client.netwm.num_icons))
{
printf("ERROR: Fetch icon from client\n");
bd->client.netwm.icons = NULL;
bd->client.netwm.num_icons = 0;
}
else
bd->changes.icon = 1;
bd->client.netwm.fetch.icon = 0;
}
if (bd->client.netwm.fetch.user_time)
{
ecore_x_netwm_user_time_get(bd->client.win, &bd->client.netwm.user_time);
bd->client.netwm.fetch.user_time = 0;
}
if (bd->client.netwm.fetch.strut)
{
if (!ecore_x_netwm_strut_partial_get(bd->client.win,
&bd->client.netwm.strut.left,
&bd->client.netwm.strut.right,
&bd->client.netwm.strut.top,
&bd->client.netwm.strut.bottom,
&bd->client.netwm.strut.left_start_y,
&bd->client.netwm.strut.left_end_y,
&bd->client.netwm.strut.right_start_y,
&bd->client.netwm.strut.right_end_y,
&bd->client.netwm.strut.top_start_x,
&bd->client.netwm.strut.top_end_x,
&bd->client.netwm.strut.bottom_start_x,
&bd->client.netwm.strut.bottom_end_x))
{
ecore_x_netwm_strut_get(bd->client.win,
&bd->client.netwm.strut.left, &bd->client.netwm.strut.right,
&bd->client.netwm.strut.top, &bd->client.netwm.strut.bottom);
bd->client.netwm.strut.left_start_y = 0;
bd->client.netwm.strut.left_end_y = 0;
bd->client.netwm.strut.right_start_y = 0;
bd->client.netwm.strut.right_end_y = 0;
bd->client.netwm.strut.top_start_x = 0;
bd->client.netwm.strut.top_end_x = 0;
bd->client.netwm.strut.bottom_start_x = 0;
bd->client.netwm.strut.bottom_end_x = 0;
}
bd->client.netwm.fetch.strut = 0;
}
if (bd->client.icccm.fetch.state) if (bd->client.icccm.fetch.state)
{ {
bd->client.icccm.state = ecore_x_icccm_state_get(bd->client.win); bd->client.icccm.state = ecore_x_icccm_state_get(bd->client.win);
@ -4676,8 +4628,33 @@ _e_border_eval(E_Border *bd)
{ {
if (bd->client.icccm.machine) free(bd->client.icccm.machine); if (bd->client.icccm.machine) free(bd->client.icccm.machine);
bd->client.icccm.machine = ecore_x_icccm_client_machine_get(bd->client.win); bd->client.icccm.machine = ecore_x_icccm_client_machine_get(bd->client.win);
if ((bd->client.icccm.client_leader) &&
(!bd->client.icccm.machine))
ecore_x_icccm_client_machine_get(bd->client.icccm.client_leader);
bd->client.icccm.fetch.machine = 0; bd->client.icccm.fetch.machine = 0;
} }
if (bd->client.icccm.fetch.command)
{
if ((bd->client.icccm.command.argc > 0) && (bd->client.icccm.command.argv))
{
int i;
for (i = 0; i < bd->client.icccm.command.argc; i++)
free(bd->client.icccm.command.argv[i]);
free(bd->client.icccm.command.argv);
}
bd->client.icccm.command.argc = 0;
bd->client.icccm.command.argv = NULL;
ecore_x_icccm_command_get(bd->client.win,
&(bd->client.icccm.command.argc),
&(bd->client.icccm.command.argv));
if ((bd->client.icccm.client_leader) &&
(!bd->client.icccm.command.argv))
ecore_x_icccm_command_get(bd->client.icccm.client_leader,
&(bd->client.icccm.command.argc),
&(bd->client.icccm.command.argv));
bd->client.icccm.fetch.command = 0;
}
if (bd->client.icccm.fetch.hints) if (bd->client.icccm.fetch.hints)
{ {
int accepts_focus = 1; int accepts_focus = 1;
@ -4789,16 +4766,84 @@ _e_border_eval(E_Border *bd)
bd->client.icccm.transient_for = ecore_x_icccm_transient_for_get(bd->client.win); bd->client.icccm.transient_for = ecore_x_icccm_transient_for_get(bd->client.win);
bd->client.icccm.fetch.transient_for = 0; bd->client.icccm.fetch.transient_for = 0;
} }
if (bd->client.icccm.fetch.client_leader)
{
bd->client.icccm.client_leader = ecore_x_icccm_client_leader_get(bd->client.win);
bd->client.icccm.fetch.client_leader = 0;
}
if (bd->client.icccm.fetch.window_role) if (bd->client.icccm.fetch.window_role)
{ {
bd->client.icccm.window_role = ecore_x_icccm_window_role_get(bd->client.win); bd->client.icccm.window_role = ecore_x_icccm_window_role_get(bd->client.win);
bd->client.icccm.fetch.window_role = 0; bd->client.icccm.fetch.window_role = 0;
} }
if (bd->client.icccm.fetch.icon_name)
{
if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name);
bd->client.icccm.icon_name = ecore_x_icccm_icon_name_get(bd->client.win);
bd->client.icccm.fetch.icon_name = 0;
}
if (bd->client.netwm.fetch.icon_name)
{
if (bd->client.netwm.icon_name) free(bd->client.netwm.icon_name);
ecore_x_netwm_icon_name_get(bd->client.win, &bd->client.netwm.icon_name);
bd->client.netwm.fetch.icon_name = 0;
}
if (bd->client.netwm.fetch.icon)
{
if (bd->client.netwm.icons)
{
int i;
for (i = 0; i < bd->client.netwm.num_icons; i++)
free(bd->client.netwm.icons[i].data);
free(bd->client.netwm.icons);
}
if (!ecore_x_netwm_icons_get(bd->client.win,
&bd->client.netwm.icons, &bd->client.netwm.num_icons))
{
printf("ERROR: Fetch icon from client\n");
bd->client.netwm.icons = NULL;
bd->client.netwm.num_icons = 0;
}
else
bd->changes.icon = 1;
bd->client.netwm.fetch.icon = 0;
}
if (bd->client.netwm.fetch.user_time)
{
ecore_x_netwm_user_time_get(bd->client.win, &bd->client.netwm.user_time);
bd->client.netwm.fetch.user_time = 0;
}
if (bd->client.netwm.fetch.strut)
{
if (!ecore_x_netwm_strut_partial_get(bd->client.win,
&bd->client.netwm.strut.left,
&bd->client.netwm.strut.right,
&bd->client.netwm.strut.top,
&bd->client.netwm.strut.bottom,
&bd->client.netwm.strut.left_start_y,
&bd->client.netwm.strut.left_end_y,
&bd->client.netwm.strut.right_start_y,
&bd->client.netwm.strut.right_end_y,
&bd->client.netwm.strut.top_start_x,
&bd->client.netwm.strut.top_end_x,
&bd->client.netwm.strut.bottom_start_x,
&bd->client.netwm.strut.bottom_end_x))
{
ecore_x_netwm_strut_get(bd->client.win,
&bd->client.netwm.strut.left, &bd->client.netwm.strut.right,
&bd->client.netwm.strut.top, &bd->client.netwm.strut.bottom);
bd->client.netwm.strut.left_start_y = 0;
bd->client.netwm.strut.left_end_y = 0;
bd->client.netwm.strut.right_start_y = 0;
bd->client.netwm.strut.right_end_y = 0;
bd->client.netwm.strut.top_start_x = 0;
bd->client.netwm.strut.top_end_x = 0;
bd->client.netwm.strut.bottom_start_x = 0;
bd->client.netwm.strut.bottom_end_x = 0;
}
bd->client.netwm.fetch.strut = 0;
}
if (bd->changes.shape) if (bd->changes.shape)
{ {
Ecore_X_Rectangle *rects; Ecore_X_Rectangle *rects;
@ -5825,7 +5870,8 @@ _e_border_eval(E_Border *bd)
grabbed = 1; grabbed = 1;
e_object_ref(E_OBJECT(bd->cur_mouse_action)); e_object_ref(E_OBJECT(bd->cur_mouse_action));
bd->cur_mouse_action->func.go(E_OBJECT(bd), NULL); bd->cur_mouse_action->func.go(E_OBJECT(bd), NULL);
e_border_raise(bd); if (e_config->border_raise_on_mouse_action)
e_border_raise(bd);
e_border_focus_set(bd, 1, 1); e_border_focus_set(bd, 1, 1);
} }
bd->changes.visible = 0; bd->changes.visible = 0;
@ -6361,7 +6407,10 @@ _e_border_resize_begin(E_Border *bd)
int w, h; int w, h;
if (!bd->lock_user_stacking) if (!bd->lock_user_stacking)
e_border_raise(bd); {
if (e_config->border_raise_on_mouse_action)
e_border_raise(bd);
}
if ((bd->shaded) || (bd->shading) || if ((bd->shaded) || (bd->shading) ||
(((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN) && (!e_config->allow_manip)) || (((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN) && (!e_config->allow_manip)) ||
(bd->fullscreen) || (bd->lock_user_size)) (bd->fullscreen) || (bd->lock_user_size))
@ -6463,7 +6512,10 @@ static int
_e_border_move_begin(E_Border *bd) _e_border_move_begin(E_Border *bd)
{ {
if (!bd->lock_user_stacking) if (!bd->lock_user_stacking)
e_border_raise(bd); {
if (e_config->border_raise_on_mouse_action)
e_border_raise(bd);
}
if ((((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN) && (!e_config->allow_manip)) || if ((((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN) && (!e_config->allow_manip)) ||
(bd->fullscreen) || (bd->lock_user_location)) (bd->fullscreen) || (bd->lock_user_location))
return 0; return 0;

View File

@ -150,6 +150,7 @@ struct _E_Border
unsigned char shaped : 1; unsigned char shaped : 1;
unsigned char argb : 1; unsigned char argb : 1;
/* ICCCM */
struct { struct {
char *title; char *title;
char *name; char *name;
@ -177,6 +178,10 @@ struct _E_Border
unsigned char urgent : 1; unsigned char urgent : 1;
unsigned char delete_request : 1; unsigned char delete_request : 1;
unsigned char request_pos : 1; unsigned char request_pos : 1;
struct {
int argc;
char **argv;
} command;
struct { struct {
unsigned char title : 1; unsigned char title : 1;
unsigned char name_class : 1; unsigned char name_class : 1;
@ -189,8 +194,11 @@ struct _E_Border
unsigned char client_leader : 1; unsigned char client_leader : 1;
unsigned char window_role : 1; unsigned char window_role : 1;
unsigned char state : 1; unsigned char state : 1;
unsigned char command : 1;
} fetch; } fetch;
} icccm; } icccm;
/* MWM */
struct { struct {
Ecore_X_MWM_Hint_Func func; Ecore_X_MWM_Hint_Func func;
Ecore_X_MWM_Hint_Decor decor; Ecore_X_MWM_Hint_Decor decor;
@ -201,14 +209,16 @@ struct _E_Border
unsigned char hints : 1; unsigned char hints : 1;
} fetch; } fetch;
} mwm; } mwm;
/* NetWM */
struct { struct {
pid_t pid; pid_t pid;
unsigned int desktop; unsigned int desktop;
char *name; char *name;
char *icon_name; char *icon_name;
Ecore_X_Icon *icons; Ecore_X_Icon *icons;
int num_icons; int num_icons;
unsigned int user_time; unsigned int user_time;
struct { struct {
int left; int left;
int right; int right;
@ -247,6 +257,20 @@ struct _E_Border
E_Stacking stacking; E_Stacking stacking;
} state; } state;
/* NetWM Window allowed actions */
struct {
unsigned char move : 1;
unsigned char resize : 1;
unsigned char minimize : 1;
unsigned char shade : 1;
unsigned char stick : 1;
unsigned char maximized_h : 1;
unsigned char maximized_v : 1;
unsigned char fullscreen : 1;
unsigned char change_desktop : 1;
unsigned char close : 1;
} action;
Ecore_X_Window_Type type; Ecore_X_Window_Type type;
int startup_id; int startup_id;

View File

@ -466,6 +466,10 @@ e_config_init(void)
E_CONFIG_VAL(D, T, display_res_hz, INT); E_CONFIG_VAL(D, T, display_res_hz, INT);
E_CONFIG_VAL(D, T, display_res_rotation, INT); E_CONFIG_VAL(D, T, display_res_rotation, INT);
E_CONFIG_VAL(D, T, border_raise_on_mouse_action, INT);
E_CONFIG_VAL(D, T, border_raise_on_focus, INT);
E_CONFIG_VAL(D, T, desk_flip_wrap, INT);
e_config = e_config_domain_load("e", _e_config_edd); e_config = e_config_domain_load("e", _e_config_edd);
if (e_config) if (e_config)
{ {
@ -863,6 +867,9 @@ e_config_init(void)
CFG_KEYBIND(E_BINDING_CONTEXT_ANY, "l", CFG_KEYBIND(E_BINDING_CONTEXT_ANY, "l",
E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0,
"desk_lock", NULL); "desk_lock", NULL);
CFG_KEYBIND(E_BINDING_CONTEXT_ANY, "d",
E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0,
"zone_deskshow_toggle", NULL);
} }
{ {
E_Config_Binding_Signal *eb; E_Config_Binding_Signal *eb;
@ -1126,6 +1133,12 @@ e_config_init(void)
} }
IFCFGEND; IFCFGEND;
IFCFG(0x0094); /* the version # where this value(s) was introduced */
e_config->border_raise_on_mouse_action = 1;
e_config->border_raise_on_focus = 1;
e_config->desk_flip_wrap = 0;
IFCFGEND;
#if 0 /* example of new config */ #if 0 /* example of new config */
IFCFG(0x0090); /* the version # where this value(s) was introduced */ IFCFG(0x0090); /* the version # where this value(s) was introduced */
e_config->new_value = 10; /* set the value(s) */ e_config->new_value = 10; /* set the value(s) */
@ -1214,7 +1227,10 @@ e_config_init(void)
E_CONFIG_LIMIT(e_config->display_res_height, 1, 8192); E_CONFIG_LIMIT(e_config->display_res_height, 1, 8192);
E_CONFIG_LIMIT(e_config->display_res_hz, 0, 250); E_CONFIG_LIMIT(e_config->display_res_hz, 0, 250);
E_CONFIG_LIMIT(e_config->display_res_rotation, 0, 0xff); E_CONFIG_LIMIT(e_config->display_res_rotation, 0, 0xff);
E_CONFIG_LIMIT(e_config->border_raise_on_mouse_action, 0, 1);
E_CONFIG_LIMIT(e_config->border_raise_on_focus, 0, 1);
E_CONFIG_LIMIT(e_config->desk_flip_wrap, 0, 1);
/* FIXME: disabled auto apply because it causes problems */ /* FIXME: disabled auto apply because it causes problems */
e_config->cfgdlg_auto_apply = 0; e_config->cfgdlg_auto_apply = 0;

View File

@ -229,6 +229,9 @@ struct _E_Config
int display_res_height; // GUI int display_res_height; // GUI
int display_res_hz; // GUI int display_res_hz; // GUI
int display_res_rotation; // GUI int display_res_rotation; // GUI
int border_raise_on_mouse_action; // GUI
int border_raise_on_focus; // GUI
int desk_flip_wrap; // GUI
}; };
struct _E_Config_Module struct _E_Config_Module

View File

@ -263,8 +263,10 @@ e_desk_last_focused_focus(E_Desk *desk)
{ {
bd = l->data; bd = l->data;
if ((!bd->iconic) && (bd->visible) && if ((!bd->iconic) && (bd->visible) &&
(((bd->desk == desk) || (((bd->desk == desk)
((bd->sticky) && (bd->zone == desk->zone))))) // Don't focus sticky windows as last focused win
// || ((bd->sticky) && (bd->zone == desk->zone))
)))
{ {
/* this was the window last focused in this desktop */ /* this was the window last focused in this desktop */
e_border_focus_set(bd, 1, 1); e_border_focus_set(bd, 1, 1);

View File

@ -43,7 +43,10 @@ e_focus_event_mouse_in(E_Border* bd)
if (e_config->auto_raise_delay == 0.0) if (e_config->auto_raise_delay == 0.0)
{ {
if (!bd->lock_user_stacking) if (!bd->lock_user_stacking)
e_border_raise(bd); {
if (e_config->border_raise_on_focus)
e_border_raise(bd);
}
} }
else else
bd->raise_timer = ecore_timer_add(e_config->auto_raise_delay, _e_focus_raise_timer, bd); bd->raise_timer = ecore_timer_add(e_config->auto_raise_delay, _e_focus_raise_timer, bd);
@ -82,12 +85,18 @@ e_focus_event_mouse_down(E_Border* bd)
if (!bd->lock_focus_out) if (!bd->lock_focus_out)
e_border_focus_set(bd, 1, 1); e_border_focus_set(bd, 1, 1);
if (!bd->lock_user_stacking) if (!bd->lock_user_stacking)
e_border_raise(bd); {
if (e_config->border_raise_on_focus)
e_border_raise(bd);
}
} }
else if (e_config->always_click_to_raise) else if (e_config->always_click_to_raise)
{ {
if (!bd->lock_user_stacking) if (!bd->lock_user_stacking)
e_border_raise(bd); {
if (e_config->border_raise_on_focus)
e_border_raise(bd);
}
} }
else if (e_config->always_click_to_focus) else if (e_config->always_click_to_focus)
{ {
@ -194,8 +203,7 @@ _e_focus_raise_timer(void* data)
E_Border *bd; E_Border *bd;
bd = data; bd = data;
if (!bd->lock_user_stacking) if (!bd->lock_user_stacking) e_border_raise(bd);
e_border_raise(bd);
bd->raise_timer = NULL; bd->raise_timer = NULL;
return 0; return 0;
} }

View File

@ -906,6 +906,51 @@ _e_gadcon_client_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi)
e_gadcon_client_edit_begin(gcc); e_gadcon_client_edit_begin(gcc);
} }
static void
_e_gadcon_client_cb_menu_remove(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Gadcon_Client *gcc;
E_Config_Gadcon *cf_gc;
Evas_List *l;
gcc = data;
for (l = e_config->gadcons; l; l = l->next)
{
cf_gc = l->data;
if ((!cf_gc->name) || (!cf_gc->id) ||
(!gcc->gadcon->name) || (!gcc->gadcon->id)) continue;
if ((!strcmp(cf_gc->name, gcc->gadcon->name)) &&
(!strcmp(cf_gc->id, gcc->gadcon->id)))
{
for (l = cf_gc->clients; l; l = l->next)
{
E_Config_Gadcon_Client *cf_gcc;
cf_gcc = l->data;
if ((!cf_gcc->name) || (!cf_gcc->id) || (!gcc->name) ||
(!gcc->id)) continue;
if ((!strcmp(cf_gcc->name, gcc->name)) &&
(!strcmp(cf_gcc->id, gcc->id)))
{
E_Gadcon *gc;
gc = gcc->gadcon;
if (cf_gcc->name) evas_stringshare_del(cf_gcc->name);
if (cf_gcc->id) evas_stringshare_del(cf_gcc->id);
if (cf_gcc->style) evas_stringshare_del(cf_gcc->style);
free(cf_gcc);
cf_gc->clients = evas_list_remove_list(cf_gc->clients, l);
e_gadcon_unpopulate(gc);
e_gadcon_populate(gc);
e_config_save_queue();
return;
}
}
break;
}
}
}
EAPI void EAPI void
e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int flags) e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int flags)
{ {
@ -963,6 +1008,14 @@ e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int f
e_menu_item_label_set(mi, _("Begin editing")); e_menu_item_label_set(mi, _("Begin editing"));
e_util_menu_item_edje_icon_set(mi, "enlightenment/edit"); e_util_menu_item_edje_icon_set(mi, "enlightenment/edit");
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc); e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
mi = e_menu_item_new(menu);
e_menu_item_separator_set(mi, 1);
mi = e_menu_item_new(menu);
e_menu_item_label_set(mi, _("Remove this gadget"));
e_util_menu_item_edje_icon_set(mi, "enlightenment/remove");
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_remove, gcc);
} }
static void static void

View File

@ -430,7 +430,15 @@ e_hints_window_init(E_Border *bd)
/* It's ok not to have fetch flag, should only be set on startup /* It's ok not to have fetch flag, should only be set on startup
* and not changed. */ * and not changed. */
if (!ecore_x_netwm_pid_get(bd->client.win, &bd->client.netwm.pid)) if (!ecore_x_netwm_pid_get(bd->client.win, &bd->client.netwm.pid))
bd->client.netwm.pid = -1; {
if (bd->client.icccm.client_leader)
{
if (!ecore_x_netwm_pid_get(bd->client.icccm.client_leader, &bd->client.netwm.pid))
bd->client.netwm.pid = -1;
}
else
bd->client.netwm.pid = -1;
}
if (bd->client.netwm.state.sticky) if (bd->client.netwm.state.sticky)
{ {
@ -555,6 +563,36 @@ e_hints_window_state_set(E_Border *bd)
ecore_x_netwm_window_state_set(bd->client.win, state, num); ecore_x_netwm_window_state_set(bd->client.win, state, num);
} }
EAPI void
e_hints_allowed_action_set(E_Border *bd)
{
Ecore_X_Action action[10];
int num = 0;
if (bd->client.netwm.action.move)
action[num++] = ECORE_X_ACTION_MOVE;
if (bd->client.netwm.action.resize)
action[num++] = ECORE_X_ACTION_RESIZE;
if (bd->client.netwm.action.minimize)
action[num++] = ECORE_X_ACTION_MINIMIZE;
if (bd->client.netwm.action.shade)
action[num++] = ECORE_X_ACTION_SHADE;
if (bd->client.netwm.action.stick)
action[num++] = ECORE_X_ACTION_STICK;
if (bd->client.netwm.action.maximized_h)
action[num++] = ECORE_X_ACTION_MAXIMIZE_HORZ;
if (bd->client.netwm.action.maximized_v)
action[num++] = ECORE_X_ACTION_MAXIMIZE_VERT;
if (bd->client.netwm.action.fullscreen)
action[num++] = ECORE_X_ACTION_FULLSCREEN;
if (bd->client.netwm.action.change_desktop)
action[num++] = ECORE_X_ACTION_CHANGE_DESKTOP;
if (bd->client.netwm.action.close)
action[num++] = ECORE_X_ACTION_CLOSE;
ecore_x_netwm_allowed_action_set(bd->client.win, action, num);
}
EAPI void EAPI void
e_hints_window_type_set(E_Border *bd) e_hints_window_type_set(E_Border *bd)
{ {
@ -877,6 +915,98 @@ e_hints_window_state_get(E_Border *bd)
} }
} }
EAPI void
e_hints_allowed_action_update(E_Border *bd, Ecore_X_Action action)
{
switch (action)
{
case ECORE_X_ACTION_MOVE:
break;
case ECORE_X_ACTION_RESIZE:
break;
case ECORE_X_ACTION_MINIMIZE:
break;
case ECORE_X_ACTION_SHADE:
break;
case ECORE_X_ACTION_STICK:
break;
case ECORE_X_ACTION_MAXIMIZE_HORZ:
break;
case ECORE_X_ACTION_MAXIMIZE_VERT:
break;
case ECORE_X_ACTION_FULLSCREEN:
break;
case ECORE_X_ACTION_CHANGE_DESKTOP:
break;
case ECORE_X_ACTION_CLOSE:
break;
}
}
EAPI void
e_hints_allowed_action_get(E_Border *bd)
{
Ecore_X_Action *action;
unsigned int i;
unsigned int num;
bd->client.netwm.action.move = 0;
bd->client.netwm.action.resize = 0;
bd->client.netwm.action.minimize = 0;
bd->client.netwm.action.shade = 0;
bd->client.netwm.action.stick = 0;
bd->client.netwm.action.maximized_h = 0;
bd->client.netwm.action.maximized_v = 0;
bd->client.netwm.action.fullscreen = 0;
bd->client.netwm.action.change_desktop = 0;
bd->client.netwm.action.close = 0;
ecore_x_netwm_allowed_action_get(bd->client.win, &action, &num);
if (action)
{
for (i = 0; i < num; i++)
{
switch (action[i])
{
case ECORE_X_ACTION_MOVE:
bd->client.netwm.action.move = 1;
break;
case ECORE_X_ACTION_RESIZE:
bd->client.netwm.action.resize = 1;
break;
case ECORE_X_ACTION_MINIMIZE:
bd->client.netwm.action.minimize = 1;
break;
case ECORE_X_ACTION_SHADE:
bd->client.netwm.action.shade = 1;
break;
case ECORE_X_ACTION_STICK:
bd->client.netwm.action.stick = 1;
break;
case ECORE_X_ACTION_MAXIMIZE_HORZ:
bd->client.netwm.action.maximized_h = 1;
break;
case ECORE_X_ACTION_MAXIMIZE_VERT:
bd->client.netwm.action.maximized_v = 1;
break;
case ECORE_X_ACTION_FULLSCREEN:
bd->client.netwm.action.fullscreen = 1;
break;
case ECORE_X_ACTION_CHANGE_DESKTOP:
bd->client.netwm.action.change_desktop = 1;
break;
case ECORE_X_ACTION_CLOSE:
bd->client.netwm.action.close = 1;
break;
}
}
free(action);
}
}
EAPI void EAPI void
e_hints_window_visible_set(E_Border *bd) e_hints_window_visible_set(E_Border *bd)
{ {

View File

@ -42,7 +42,7 @@ struct _E_Config_Dialog_Data
int apply_shade; int apply_shade;
int apply_zone; int apply_zone;
int apply_skip_winlist; int apply_skip_winlist;
int apply_run; // unused atm int apply_run;
} remember; } remember;
}; };
@ -292,7 +292,8 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
(cfdata->remember.apply_locks) || (cfdata->remember.apply_layer) || (cfdata->remember.apply_locks) || (cfdata->remember.apply_layer) ||
(cfdata->remember.apply_border) || (cfdata->remember.apply_sticky) || (cfdata->remember.apply_border) || (cfdata->remember.apply_sticky) ||
(cfdata->remember.apply_desktop) || (cfdata->remember.apply_shade) || (cfdata->remember.apply_desktop) || (cfdata->remember.apply_shade) ||
(cfdata->remember.apply_zone) || (cfdata->remember.apply_skip_winlist))) (cfdata->remember.apply_zone) || (cfdata->remember.apply_skip_winlist) ||
(cfdata->remember.apply_run)))
{ {
if (cfdata->border->remember) if (cfdata->border->remember)
{ {
@ -486,9 +487,6 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_framelist_object_append(of, ob); e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5); e_widget_list_object_append(o, of, 1, 1, 0.5);
ob = e_widget_check_add(evas, _("Match only one window"), &(cfdata->remember.apply_first_only));
e_widget_list_object_append(o, ob, 1, 1, 0.5);
of = e_widget_frametable_add(evas, _("Properties to remember"), 0); of = e_widget_frametable_add(evas, _("Properties to remember"), 0);
ob = e_widget_check_add(evas, _("Position"), &(cfdata->remember.apply_pos)); ob = e_widget_check_add(evas, _("Position"), &(cfdata->remember.apply_pos));
e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1); e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
@ -512,5 +510,14 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_frametable_object_append(of, ob, 1, 4, 1, 1, 1, 1, 1, 1); e_widget_frametable_object_append(of, ob, 1, 4, 1, 1, 1, 1, 1, 1);
e_widget_list_object_append(o, of, 1, 1, 0.5); e_widget_list_object_append(o, of, 1, 1, 0.5);
ob = e_widget_check_add(evas, _("Match only one window"), &(cfdata->remember.apply_first_only));
e_widget_list_object_append(o, ob, 1, 1, 0.5);
if (cfdata->border->client.icccm.command.argv)
{
ob = e_widget_check_add(evas, _("Start this program on login"), &(cfdata->remember.apply_run));
e_widget_list_object_append(o, ob, 1, 1, 0.5);
}
return o; return o;
} }

View File

@ -17,10 +17,11 @@ struct _E_Config_Dialog_Data
/*- BASIC -*/ /*- BASIC -*/
int x; int x;
int y; int y;
int flip; // int flip;
/*- ADVANCED -*/ /*- ADVANCED -*/
int use_edge_flip; int use_edge_flip;
double edge_flip_timeout; double edge_flip_timeout;
int flip_wrap;
}; };
/* a nice easy setup function that does the dirty work */ /* a nice easy setup function that does the dirty work */
@ -52,6 +53,7 @@ _fill_data(E_Config_Dialog_Data *cfdata)
cfdata->y = e_config->zone_desks_y_count; cfdata->y = e_config->zone_desks_y_count;
cfdata->use_edge_flip = e_config->use_edge_flip; cfdata->use_edge_flip = e_config->use_edge_flip;
cfdata->edge_flip_timeout = e_config->edge_flip_timeout; cfdata->edge_flip_timeout = e_config->edge_flip_timeout;
cfdata->flip_wrap = e_config->desk_flip_wrap;
} }
static void * static void *
@ -131,6 +133,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
e_config->use_edge_flip = cfdata->use_edge_flip; e_config->use_edge_flip = cfdata->use_edge_flip;
e_config->edge_flip_timeout = cfdata->edge_flip_timeout; e_config->edge_flip_timeout = cfdata->edge_flip_timeout;
e_config->desk_flip_wrap = cfdata->flip_wrap;
e_zone_update_flip_all(); e_zone_update_flip_all();
e_config_save_queue(); e_config_save_queue();
@ -190,6 +193,9 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_framelist_object_append(of, ob); e_widget_framelist_object_append(of, ob);
ob = e_widget_slider_add(evas, 1, 0, _("%1.1f sec"), 0.0, 2.0, 0.05, 0, &(cfdata->edge_flip_timeout), NULL, 200); ob = e_widget_slider_add(evas, 1, 0, _("%1.1f sec"), 0.0, 2.0, 0.05, 0, &(cfdata->edge_flip_timeout), NULL, 200);
e_widget_framelist_object_append(of, ob); e_widget_framelist_object_append(of, ob);
ob = e_widget_check_add(evas, _("Wrap desktops around when flipping"), &(cfdata->flip_wrap));
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5); e_widget_list_object_append(o, of, 1, 1, 0.5);
return o; return o;

View File

@ -25,6 +25,8 @@ struct _E_Config_Dialog_Data
int window_resist; int window_resist;
int gadget_resist; int gadget_resist;
int allow_manip; int allow_manip;
int border_raise_on_mouse_action;
int border_raise_on_focus;
}; };
/* a nice easy setup function that does the dirty work */ /* a nice easy setup function that does the dirty work */
@ -65,6 +67,8 @@ _fill_data(E_Config_Dialog_Data *cfdata)
if (!cfdata->maximize_direction) if (!cfdata->maximize_direction)
cfdata->maximize_direction = E_MAXIMIZE_BOTH; cfdata->maximize_direction = E_MAXIMIZE_BOTH;
cfdata->allow_manip = e_config->allow_manip; cfdata->allow_manip = e_config->allow_manip;
cfdata->border_raise_on_mouse_action = e_config->border_raise_on_mouse_action;
cfdata->border_raise_on_focus = e_config->border_raise_on_focus;
} }
static void * static void *
@ -113,6 +117,8 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
e_config->gadget_resist = cfdata->gadget_resist; e_config->gadget_resist = cfdata->gadget_resist;
e_config->maximize_policy = cfdata->maximize_policy | cfdata->maximize_direction; e_config->maximize_policy = cfdata->maximize_policy | cfdata->maximize_direction;
e_config->allow_manip = cfdata->allow_manip; e_config->allow_manip = cfdata->allow_manip;
e_config->border_raise_on_mouse_action = cfdata->border_raise_on_mouse_action;
e_config->border_raise_on_focus = cfdata->border_raise_on_focus;
e_config_save_queue(); e_config_save_queue();
return 1; /* Apply was OK */ return 1; /* Apply was OK */
} }
@ -208,5 +214,12 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_list_object_append(o, of, 1, 1, 0.5); e_widget_list_object_append(o, of, 1, 1, 0.5);
of = e_widget_framelist_add(evas, _("Raise Window"), 0);
ob = e_widget_check_add(evas, _("Raise when starting to move or resize"), &(cfdata->border_raise_on_mouse_action));
e_widget_framelist_object_append(of, ob);
ob = e_widget_check_add(evas, _("Raise when clicking to focus"), &(cfdata->border_raise_on_focus));
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
return o; return o;
} }

View File

@ -57,6 +57,8 @@ _fill_data(E_Config_Dialog_Data *cfdata)
for (l = e_config->gadcons; l; l = l->next) for (l = e_config->gadcons; l; l = l->next)
{ {
cfdata->cf_gc = l->data; cfdata->cf_gc = l->data;
if ((!cfdata->cf_gc->name) || (!cfdata->cf_gc->id) ||
(!cfdata->gc->name) || (!cfdata->gc->id)) continue;
if ((!strcmp(cfdata->cf_gc->name, cfdata->gc->name)) && if ((!strcmp(cfdata->cf_gc->name, cfdata->gc->name)) &&
(!strcmp(cfdata->cf_gc->id, cfdata->gc->id))) (!strcmp(cfdata->cf_gc->id, cfdata->gc->id)))
{ {

View File

@ -25,6 +25,7 @@ static int _e_int_menus_main_run_defer_cb (void *data);
static void _e_int_menus_main_run (void *data, E_Menu *m, E_Menu_Item*mi); static void _e_int_menus_main_run (void *data, E_Menu *m, E_Menu_Item*mi);
static int _e_int_menus_main_lock_defer_cb (void *data); static int _e_int_menus_main_lock_defer_cb (void *data);
static void _e_int_menus_main_lock (void *data, E_Menu *m, E_Menu_Item*mi); static void _e_int_menus_main_lock (void *data, E_Menu *m, E_Menu_Item*mi);
static void _e_int_menus_main_lock_showhide (void *data, E_Menu *m, E_Menu_Item*mi);
static void _e_int_menus_main_restart (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_restart (void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_int_menus_main_exit (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_exit (void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_int_menus_apps_scan (E_Menu *m); static void _e_int_menus_apps_scan (E_Menu *m);
@ -375,6 +376,15 @@ _e_int_menus_main_lock(void *data, E_Menu *m, E_Menu_Item *mi)
ecore_idle_enterer_add(_e_int_menus_main_lock_defer_cb, m->zone); ecore_idle_enterer_add(_e_int_menus_main_lock_defer_cb, m->zone);
} }
static void
_e_int_menus_main_showhide(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Action *act;
act = e_action_find("zone_deskshow_toggle");
if (act) act->func.go(m->zone, NULL);
}
static void static void
_e_int_menus_main_fm(void *data, E_Menu *m, E_Menu_Item *mi) _e_int_menus_main_fm(void *data, E_Menu *m, E_Menu_Item *mi)
{ {
@ -520,6 +530,11 @@ _e_int_menus_desktops_pre_cb(void *data, E_Menu *m)
e_util_menu_item_edje_icon_set(mi, "enlightenment/lock"); e_util_menu_item_edje_icon_set(mi, "enlightenment/lock");
e_menu_item_callback_set(mi, _e_int_menus_main_lock, NULL); e_menu_item_callback_set(mi, _e_int_menus_main_lock, NULL);
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("Show/Hide All Windows"));
e_util_menu_item_edje_icon_set(mi, "enlightenment/showhide");
e_menu_item_callback_set(mi, _e_int_menus_main_showhide, NULL);
mi = e_menu_item_new(m); mi = e_menu_item_new(m);
e_menu_item_separator_set(mi, 1); e_menu_item_separator_set(mi, 1);

View File

@ -538,7 +538,7 @@ main(int argc, char **argv)
} }
_e_main_shutdown_push(e_app_shutdown); _e_main_shutdown_push(e_app_shutdown);
/* do remember stuff */ /* do remember stuff */
if (!e_remember_init()) if (!e_remember_init(after_restart ? E_STARTUP_RESTART: E_STARTUP_START))
{ {
e_error_message_show(_("Enlightenment cannot setup remember settings.")); e_error_message_show(_("Enlightenment cannot setup remember settings."));
_e_main_shutdown(-1); _e_main_shutdown(-1);

View File

@ -15,18 +15,25 @@ static void _e_remember_free(E_Remember *rem);
/* externally accessible functions */ /* externally accessible functions */
EAPI int EAPI int
e_remember_init(void) e_remember_init(E_Startup_Mode mode)
{ {
Evas_List *l; Evas_List *l;
int after_restart = 0;
for (l = e_config->remembers; l; l = l->next) if (mode == E_STARTUP_START)
{ {
E_Remember *rem; for (l = e_config->remembers; l; l = l->next)
{
rem = l->data; E_Remember *rem;
if ((rem->apply & E_REMEMBER_APPLY_RUN) &&
(rem->prop.command)) rem = l->data;
e_util_head_exec(rem->prop.head, rem->prop.command); if ((rem->apply & E_REMEMBER_APPLY_RUN) &&
(rem->prop.command))
{
printf("REMEMBER CMD: \"%s\"\n", rem->prop.command);
e_util_head_exec(rem->prop.head, rem->prop.command);
}
}
} }
return 1; return 1;
} }
@ -235,9 +242,44 @@ e_remember_update(E_Remember *rem, E_Border *bd)
rem->prop.zone = bd->zone->num; rem->prop.zone = bd->zone->num;
rem->prop.head = bd->zone->container->manager->num; rem->prop.head = bd->zone->container->manager->num;
/* FIXME: e17 doesn't fetch WM_COMMAND property yet
if (rem->prop.command) evas_stringshare_del(rem->prop.command); if ((bd->client.icccm.command.argc > 0) &&
*/ (bd->client.icccm.command.argv))
{
char buf[4096];
int i, j, k;
buf[0] = 0;
k = 0;
for (i = 0; i < bd->client.icccm.command.argc; i++)
{
for (j = 0; bd->client.icccm.command.argv[i][j]; j++)
{
if (k >= (sizeof(buf) - 10))
{
buf[k] = 0;
goto done;
}
if ((bd->client.icccm.command.argv == ' ') ||
(bd->client.icccm.command.argv == '\t') ||
(bd->client.icccm.command.argv == '\\') ||
(bd->client.icccm.command.argv == '\"') ||
(bd->client.icccm.command.argv == '\'') ||
(bd->client.icccm.command.argv == '$') ||
(bd->client.icccm.command.argv == '%'))
{
buf[k] = '\\';
k++;
}
buf[k] = bd->client.icccm.command.argv[i][j];
k++;
}
}
buf[k] = 0;
done:
rem->prop.command = evas_stringshare_add(buf);
}
e_config_save_queue(); e_config_save_queue();
} }

View File

@ -91,7 +91,7 @@ struct _E_Remember
} prop; } prop;
}; };
EAPI int e_remember_init(void); EAPI int e_remember_init(E_Startup_Mode mode);
EAPI int e_remember_shutdown(void); EAPI int e_remember_shutdown(void);
EAPI E_Remember *e_remember_new(void); EAPI E_Remember *e_remember_new(void);
EAPI int e_remember_usable_get(E_Remember *rem); EAPI int e_remember_usable_get(E_Remember *rem);

View File

@ -21,10 +21,10 @@ static void _e_zone_update_flip(E_Zone *zone);
EAPI int E_EVENT_ZONE_DESK_COUNT_SET = 0; EAPI int E_EVENT_ZONE_DESK_COUNT_SET = 0;
EAPI int E_EVENT_POINTER_WARP = 0; EAPI int E_EVENT_POINTER_WARP = 0;
#define E_ZONE_FLIP_UP(zone) ((zone)->desk_y_current > 0) #define E_ZONE_FLIP_LEFT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1)) || ((zone)->desk_x_current > 0))
#define E_ZONE_FLIP_RIGHT(zone) (((zone)->desk_x_current + 1) < (zone)->desk_x_count) #define E_ZONE_FLIP_RIGHT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1)) || (((zone)->desk_x_current + 1) < (zone)->desk_x_count))
#define E_ZONE_FLIP_DOWN(zone) (((zone)->desk_y_current + 1) < (zone)->desk_y_count) #define E_ZONE_FLIP_UP(zone) ((e_config->desk_flip_wrap && ((zone)->desk_y_count > 1)) || ((zone)->desk_y_current > 0))
#define E_ZONE_FLIP_LEFT(zone) ((zone)->desk_x_current > 0) #define E_ZONE_FLIP_DOWN(zone) ((e_config->desk_flip_wrap && ((zone)->desk_y_count > 1)) || (((zone)->desk_y_current + 1) < (zone)->desk_y_count))
static int startup_id = 0; static int startup_id = 0;
@ -472,11 +472,21 @@ e_zone_desk_flip_to(E_Zone *zone, int x, int y)
E_OBJECT_CHECK(zone); E_OBJECT_CHECK(zone);
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE); E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
if (x < 0) x = 0; if (e_config->desk_flip_wrap)
else if (x >= zone->desk_x_count) x = zone->desk_x_count - 1; {
if (y < 0) y = 0; x = x % zone->desk_x_count;
else if (y >= zone->desk_y_count) y = zone->desk_y_count - 1; y = y % zone->desk_y_count;
if (x < 0) x += zone->desk_x_count;
if (y < 0) y += zone->desk_y_count;
}
else
{
if (x < 0) x = 0;
else if (x >= zone->desk_x_count) x = zone->desk_x_count - 1;
if (y < 0) y = 0;
else if (y >= zone->desk_y_count) y = zone->desk_y_count - 1;
}
desk = e_desk_at_xy_get(zone, x, y); desk = e_desk_at_xy_get(zone, x, y);
if (desk) e_desk_show(desk); if (desk) e_desk_show(desk);
} }
@ -503,10 +513,8 @@ e_zone_desk_linear_flip_to(E_Zone *zone, int x)
E_OBJECT_CHECK(zone); E_OBJECT_CHECK(zone);
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE); E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
if (x < 0) return;
y = x / zone->desk_x_count; y = x / zone->desk_x_count;
x = x - (y * zone->desk_x_count); x = x - (y * zone->desk_x_count);
if (y >= zone->desk_y_count) return;
e_zone_desk_flip_to(zone, x, y); e_zone_desk_flip_to(zone, x, y);
} }
@ -927,53 +935,37 @@ _e_zone_cb_timer(void *data)
case E_DIRECTION_UP: case E_DIRECTION_UP:
if (E_ZONE_FLIP_UP(zone)) if (E_ZONE_FLIP_UP(zone))
{ {
current = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current - 1); e_zone_desk_flip_by(zone, 0, -1);
if (current) ecore_x_pointer_warp(zone->container->win, x, zone->h - 2);
{ ev->curr.x = x;
e_desk_show(current); ev->curr.y = zone->h - 2;
ecore_x_pointer_warp(zone->container->win, x, zone->h - 2);
ev->curr.x = x;
ev->curr.y = zone->h - 2;
}
} }
break; break;
case E_DIRECTION_RIGHT: case E_DIRECTION_RIGHT:
if (E_ZONE_FLIP_RIGHT(zone)) if (E_ZONE_FLIP_RIGHT(zone))
{ {
current = e_desk_at_xy_get(zone, zone->desk_x_current + 1, zone->desk_y_current); e_zone_desk_flip_by(zone, 1, 0);
if (current) ecore_x_pointer_warp(zone->container->win, 2, y);
{ ev->curr.y = y;
e_desk_show(current); ev->curr.x = 2;
ecore_x_pointer_warp(zone->container->win, 2, y);
ev->curr.y = y;
ev->curr.x = 2;
}
} }
break; break;
case E_DIRECTION_DOWN: case E_DIRECTION_DOWN:
if (E_ZONE_FLIP_DOWN(zone)) if (E_ZONE_FLIP_DOWN(zone))
{ {
current = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current + 1); e_zone_desk_flip_by(zone, 0, 1);
if (current) ecore_x_pointer_warp(zone->container->win, x, 2);
{ ev->curr.x = x;
e_desk_show(current); ev->curr.y = 2;
ecore_x_pointer_warp(zone->container->win, x, 2);
ev->curr.x = x;
ev->curr.y = 2;
}
} }
break; break;
case E_DIRECTION_LEFT: case E_DIRECTION_LEFT:
if (E_ZONE_FLIP_LEFT(zone)) if (E_ZONE_FLIP_LEFT(zone))
{ {
current = e_desk_at_xy_get(zone, zone->desk_x_current - 1, zone->desk_y_current); e_zone_desk_flip_by(zone, -1, 0);
if (current) ecore_x_pointer_warp(zone->container->win, zone->w - 2, y);
{ ev->curr.y = y;
e_desk_show(current); ev->curr.x = zone->w - 2;
ecore_x_pointer_warp(zone->container->win, zone->w - 2, y);
ev->curr.y = y;
ev->curr.x = zone->w - 2;
}
} }
break; break;
} }

View File

@ -337,9 +337,6 @@ _battery_cb_check(void *data)
_battery_face_level_set(inst, ret->level); _battery_face_level_set(inst, ret->level);
battery_config->battery_prev_battery = 0; battery_config->battery_prev_battery = 0;
} }
free(ret->reading);
free(ret->time);
free(ret);
} }
else else
{ {
@ -353,6 +350,12 @@ _battery_cb_check(void *data)
battery_config->battery_check_mode = CHECK_NONE; battery_config->battery_check_mode = CHECK_NONE;
} }
} }
if (ret)
{
free(ret->reading);
free(ret->time);
free(ret);
}
return 1; return 1;
} }