e 0.17 ...... :)

SVN revision: 3961
This commit is contained in:
Carsten Haitzler 2000-12-08 22:54:42 +00:00
commit dfe5d7091a
23 changed files with 4521 additions and 0 deletions

1
AUTHORS Normal file
View File

@ -0,0 +1 @@
The Rasterman <raster@rasterman.com>

20
COPYING Normal file
View File

@ -0,0 +1,20 @@
Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies of the Software, its documentation and marketing & publicity
materials, and acknowledgment shall be given in the documentation, materials
and software packages that this Software was used.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

0
ChangeLog Normal file
View File

14
INSTALL Normal file
View File

@ -0,0 +1,14 @@
COMPILING and INSTALLING:
If you got a official release tar archive do:
./configure
( otherwise if you got this from enlightenment cvs do: ./autogen.sh )
Then to compile:
make
To install (run this as root, or the user who handles installs):
make install
NOTE: You MUST make install Etcher for it to run properly.

31
Makefile.am Normal file
View File

@ -0,0 +1,31 @@
## Process this file with automake to produce Makefile.in
SUBDIRS = intl po src
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
config.h.in config.sub configure install-sh \
ltconfig ltmain.sh missing mkinstalldirs \
stamp-h.in
install-data-local:
@$(NORMAL_INSTALL)
if test -d $(srcdir)/data; then \
$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/data; \
for d in $(srcdir)/data/*; do \
if test -f $$d; then \
$(INSTALL_DATA) $$d $(DESTDIR)$(pkgdatadir)/data; \
fi \
done \
fi
dist-hook:
if test -d data; then \
mkdir $(distdir)/data; \
for d in data/*; do \
if test -f $$d; then \
cp -p $$d $(distdir)/d; \
fi \
done \
fi
EXTRA_DIST = README AUTHORS COPYING e.spec

0
NEWS Normal file
View File

3
README Normal file
View File

@ -0,0 +1,3 @@
-------------------------------------------------------------------------------
Enlightenment 0.17.0 PRE-RELEASE....
-------------------------------------------------------------------------------

148
autogen.sh Executable file
View File

@ -0,0 +1,148 @@
#!/bin/sh
# Run this to generate all the initial makefiles, etc.
srcdir=`dirname $0`
PKG_NAME="the package."
DIE=0
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`autoconf' installed to."
echo "Download the appropriate package for your distribution,"
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && {
(libtool --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`libtool' installed."
echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
}
grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && {
grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
(gettext --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`gettext' installed."
echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
}
grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && {
grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
(gettext --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`gettext' installed."
echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
}
(automake --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`automake' installed."
echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
NO_AUTOMAKE=yes
}
# if no automake, don't bother testing for aclocal
test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: Missing \`aclocal'. The version of \`automake'"
echo "installed doesn't appear recent enough."
echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
if test "$DIE" -eq 1; then
exit 1
fi
if test -z "$*"; then
echo "**Warning**: I am going to run \`configure' with no arguments."
echo "If you wish to pass any to it, please specify them on the"
echo \`$0\'" command line."
echo
fi
case $CC in
xlc )
am_opt=--include-deps;;
esac
for coin in `find $srcdir -name configure.in -print`
do
dr=`dirname $coin`
if test -f $dr/NO-AUTO-GEN; then
echo skipping $dr -- flagged as no auto-gen
else
echo processing $dr
macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
( cd $dr
aclocalinclude="$ACLOCAL_FLAGS"
for k in $macrodirs; do
if test -d $k; then
aclocalinclude="$aclocalinclude -I $k"
##else
## echo "**Warning**: No such directory \`$k'. Ignored."
fi
done
if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
if grep "sed.*POTFILES" configure.in >/dev/null; then
: do nothing -- we still have an old unmodified configure.in
else
echo "Creating $dr/aclocal.m4 ..."
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
echo "Running gettextize... Ignore non-fatal messages."
echo "no" | gettextize --force --copy
echo "Making $dr/aclocal.m4 writable ..."
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
fi
fi
if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
echo "Creating $dr/aclocal.m4 ..."
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
echo "Running gettextize... Ignore non-fatal messages."
echo "no" | gettextize --force --copy
echo "Making $dr/aclocal.m4 writable ..."
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
fi
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
echo "Running libtoolize..."
libtoolize --force --copy
fi
echo "Running aclocal $aclocalinclude ..."
aclocal $aclocalinclude
if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
echo "Running autoheader..."
autoheader
fi
echo "Running automake --gnu $am_opt ..."
automake --add-missing --gnu $am_opt
echo "Running autoconf ..."
autoconf
)
fi
done
#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
if test x$NOCONFIGURE = x; then
echo Running $srcdir/configure $conf_flags "$@" ...
$srcdir/configure $conf_flags "$@" \
&& echo Now type \`make\' to compile $PKG_NAME
else
echo Skipping configure process.
fi

133
config.h.in Normal file
View File

@ -0,0 +1,133 @@
/* config.h.in. Generated automatically from configure.in by autoheader. */
/* Define if using alloca.c. */
#undef C_ALLOCA
/* Define to empty if the keyword does not work. */
#undef const
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
This function is required for alloca.c support on those systems. */
#undef CRAY_STACKSEG_END
/* Define if you have alloca, as a function or macro. */
#undef HAVE_ALLOCA
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
#undef HAVE_ALLOCA_H
/* Define if you have a working `mmap' system call. */
#undef HAVE_MMAP
/* Define as __inline if that's what the C compiler calls it. */
#undef inline
/* Define to `long' if <sys/types.h> doesn't define. */
#undef off_t
/* Define if you need to in order for stat and other things to work. */
#undef _POSIX_SOURCE
/* Define to `unsigned' if <sys/types.h> doesn't define. */
#undef size_t
/* If using the C implementation of alloca, define if you know the
direction of stack growth for your system; otherwise it will be
automatically deduced at run-time.
STACK_DIRECTION > 0 => grows toward higher addresses
STACK_DIRECTION < 0 => grows toward lower addresses
STACK_DIRECTION = 0 => direction of growth unknown
*/
#undef STACK_DIRECTION
/* Define if you have the ANSI C header files. */
#undef STDC_HEADERS
#undef ENABLE_NLS
#undef HAVE_CATGETS
#undef HAVE_GETTEXT
#undef HAVE_LC_MESSAGES
#undef HAVE_STPCPY
#undef HAVE_LIBSM
#undef PACKAGE_LOCALE_DIR
#undef PACKAGE_DATA_DIR
#undef PACKAGE_SOURCE_DIR
/* Define if you have the __argz_count function. */
#undef HAVE___ARGZ_COUNT
/* Define if you have the __argz_next function. */
#undef HAVE___ARGZ_NEXT
/* Define if you have the __argz_stringify function. */
#undef HAVE___ARGZ_STRINGIFY
/* Define if you have the dcgettext function. */
#undef HAVE_DCGETTEXT
/* Define if you have the getcwd function. */
#undef HAVE_GETCWD
/* Define if you have the getpagesize function. */
#undef HAVE_GETPAGESIZE
/* Define if you have the munmap function. */
#undef HAVE_MUNMAP
/* Define if you have the putenv function. */
#undef HAVE_PUTENV
/* Define if you have the setenv function. */
#undef HAVE_SETENV
/* Define if you have the setlocale function. */
#undef HAVE_SETLOCALE
/* Define if you have the stpcpy function. */
#undef HAVE_STPCPY
/* Define if you have the strcasecmp function. */
#undef HAVE_STRCASECMP
/* Define if you have the strchr function. */
#undef HAVE_STRCHR
/* Define if you have the strdup function. */
#undef HAVE_STRDUP
/* Define if you have the <argz.h> header file. */
#undef HAVE_ARGZ_H
/* Define if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
/* Define if you have the <locale.h> header file. */
#undef HAVE_LOCALE_H
/* Define if you have the <malloc.h> header file. */
#undef HAVE_MALLOC_H
/* Define if you have the <nl_types.h> header file. */
#undef HAVE_NL_TYPES_H
/* Define if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define if you have the <sys/param.h> header file. */
#undef HAVE_SYS_PARAM_H
/* Define if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define if you have the i library (-li). */
#undef HAVE_LIBI
/* Name of package */
#undef PACKAGE
/* Version number of package */
#undef VERSION
/* Define if using the dmalloc debugging malloc package */
#undef WITH_DMALLOC

74
configure.in Normal file
View File

@ -0,0 +1,74 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(configure.in)
AM_INIT_AUTOMAKE(enlightenment, 0.17.0)
AM_CONFIG_HEADER(config.h)
AC_ISC_POSIX
AC_PROG_CC
AM_PROG_CC_STDC
AC_HEADER_STDC
AM_WITH_DMALLOC
dnl Add the languages which your application supports here.
ALL_LINGUAS=""
AM_GNU_GETTEXT
dnl Set PACKAGE_LOCALE_DIR in config.h.
if test "x${prefix}" = "xNONE"; then
AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
else
AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
fi
dnl Set PACKAGE_DATA_DIR in config.h.
if test "x${datadir}" = 'x${prefix}/share'; then
if test "x${prefix}" = "xNONE"; then
AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}")
else
AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}")
fi
else
AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}")
fi
dnl Set PACKAGE_SOURCE_DIR in config.h.
packagesrcdir=`cd $srcdir && pwd`
AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}")
dnl Use -Wall if we have gcc.
changequote(,)dnl
if test "x$GCC" = "xyes"; then
case " $CFLAGS " in
*[\ \ ]-Wall[\ \ ]*) ;;
*) CFLAGS="$CFLAGS -Wall" ;;
esac
fi
changequote([,])dnl
evas_cflags=`evas-config --cflags`
evas_libs=`evas-config --libs`
edb_cflags=`edb-config --cflags`
edb_libs=`edb-config --libs`
ebits_cflags=`ebits-config --cflags`
ebits_libs=`ebits-config --libs`
ecore_cflags=`ecore-config --cflags`
ecore_libs=`ecore-config --libs`
AC_SUBST(evas_cflags)
AC_SUBST(evas_libs)
AC_SUBST(edb_cflags)
AC_SUBST(edb_libs)
AC_SUBST(ebits_cflags)
AC_SUBST(ebits_libs)
AC_SUBST(ecore_cflags)
AC_SUBST(ecore_libs)
AC_OUTPUT([
Makefile
src/Makefile
intl/Makefile
po/Makefile.in
])

66
e.spec Normal file
View File

@ -0,0 +1,66 @@
# Note that this is NOT a relocatable package
%define ver 1.0
%define rel 1
%define prefix /usr/local
Summary: Enlightenment DR0.17's new "bit" editor
Name: etcher
Version: %ver
Release: %rel
Copyright: BSD
Group: X11/Libraries
Source: ftp://ftp.enlightenment.org/pub/enlightenment/etcher-%{ver}.tar.gz
BuildRoot: /var/tmp/etcher-root
Packager: Term <kempler@utdallas.edu>
URL: http://www.enlightenment.org/
Requires: evas >= 0.0.1
Requires: edb >= 1.0.0
Requires: imlib2 >= 1.0.0
Docdir: %{prefix}/doc
%description
Etcher is a new application devised to assist would-be theme developers in
designin "bits", that is, window borders, icons, whatever, for
Enlightenment. Since Enlightenment DR0.17 uses drag-and-drop instead of
texual configuration files, this application will become instrumental for
themeing under the new Enlightenment version.
%prep
%setup
%build
./configure --prefix=%prefix
if [ "$SMP" != "" ]; then
(make "MAKE=make -k -j $SMP"; exit 0)
make
else
make
fi
###########################################################################
%install
rm -rf $RPM_BUILD_ROOT
make prefix=$RPM_BUILD_ROOT%{prefix} install
%clean
rm -rf $RPM_BUILD_ROOT
%post
%postun
%files
%defattr(-,root,root)
%doc README COPYING ChangeLog
%attr(755,root,root) %{prefix}/bin/etcher
%{prefix}/share/etcher/*
%doc AUTHORS
%doc COPYING
%doc README
%changelog
* Mon Aug 28 2000 Lyle Kempler <kempler@utdallas.edu>
- Created spec file

0
po/ChangeLog Normal file
View File

3
po/POTFILES.in Normal file
View File

@ -0,0 +1,3 @@
# List of source files containing translatable strings.
src/main.c

15
po/e.pot Normal file
View File

@ -0,0 +1,15 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2000-11-02 16:32-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"

20
src/Makefile.am Normal file
View File

@ -0,0 +1,20 @@
## Process this file with automake to produce Makefile.in
INCLUDES = \
-I$(top_srcdir)/intl \
@evas_cflags@ @edb_cflags@ @ebits_cflags@ @ecore_cflags@
bin_PROGRAMS = e
e_SOURCES = \
actions.c \
border.c \
desktops.c \
icccm.c \
main.c \
resist.c \
util.c \
e.h
e_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ -lecore -lm $(INTLLIBS)

748
src/actions.c Normal file
View File

@ -0,0 +1,748 @@
#include "e.h"
static Evas_List action_protos = NULL;
static Evas_List current_actions = NULL;
static void _e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o);
static void _e_action_free(E_Action *a);
static void e_act_move_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_move_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_move_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy);
static void e_act_resize_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_resize_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_resize_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy);
static void e_act_resize_h_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_resize_h_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_resize_h_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy);
static void e_act_resize_v_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_resize_v_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_resize_v_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy);
static void e_act_close_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_kill_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_shade_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_raise_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_lower_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_raise_lower_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_exec_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_menu_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_exit_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_restart_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_stick_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_sound_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_iconify_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_max_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_snap_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void e_act_zoom_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
static void
_e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o)
{
char *actions_db = "./actions.db";
E_DB_File *db;
int i, num;
char *a_name = NULL;
char *a_action = NULL;
char *a_params = NULL;
int a_event = 0;
int a_button = 0;
char *a_key = NULL;
int a_modifiers = 0;
E_Action *a;
db = e_db_open_read(actions_db);
if (!db) return;
if (!e_db_int_get(db, "/actions/count", &num)) goto error;
for (i = 0; i < num; i++)
{
char buf[4096];
Evas_List l;
a = NULL;
a = NULL;
sprintf(buf, "/actions/%i/name", i);
a_name = e_db_str_get(db, buf);
sprintf(buf, "/actions/%i/action", i);
a_action = e_db_str_get(db, buf);
sprintf(buf, "/actions/%i/params", i);
a_params = e_db_str_get(db, buf);
sprintf(buf, "/actions/%i/event", i);
e_db_int_get(db, buf, &a_event);
sprintf(buf, "/actions/%i/button", i);
e_db_int_get(db, buf, &a_button);
sprintf(buf, "/actions/%i/key", i);
a_key = e_db_str_get(db, buf);
sprintf(buf, "/actions/%i/modifiers", i);
e_db_int_get(db, buf, &a_modifiers);
if (act != a_event) goto next;
if (!((a_name) &&
(action) &&
(!strcmp(a_name, action)))) goto next;
if ((act >= ACT_MOUSE_CLICK) &&
(act <= ACT_MOUSE_CLICKED) &&
(!((a_button == -1) ||
(a_button == button)))) goto next;
if ((act >= ACT_KEY_DOWN) &&
(act <= ACT_KEY_UP) &&
(!((a_key) && (key) &&
(!strcmp(a_key, key))))) goto next;
if ((act >= ACT_MOUSE_CLICK) &&
(act <= ACT_KEY_UP) &&
(!((a_modifiers == -1) ||
(a_modifiers == (int)mods)))) goto next;
for (l = action_protos; l; l = l->next)
{
E_Action_Proto *ap;
ap = l->data;
if (!strcmp(ap->action, a_action))
{
a = NEW(E_Action, 1);
ZERO(a, E_Action, 1);
OBJ_INIT(a, _e_action_free);
a->name = a_name;
a->action = a_action;
a->params = a_params;
a->event = a_event;
a->button = a_button;
a->key = a_key;
a->modifiers = a_modifiers;
a->action_proto = ap;
a->object = o;
a->started = 0;
current_actions = evas_list_append(current_actions, a);
}
}
next:
if (!a)
{
IF_FREE(a_name);
IF_FREE(a_action);
IF_FREE(a_params);
IF_FREE(a_key);
}
}
error:
e_db_close(db);
}
static void
_e_action_free(E_Action *a)
{
IF_FREE(a->name);
IF_FREE(a->action);
IF_FREE(a->params);
IF_FREE(a->key);
FREE(a);
}
void
e_action_start(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry)
{
Evas_List l;
_e_action_find(action, act, button, key, mods, o);
again:
for (l = current_actions; l; l = l->next)
{
E_Action *a;
a = l->data;
if (!a->started)
{
if (a->action_proto->func_stop)
a->started = 1;
if (a->action_proto->func_start)
{
E_Object *obj;
if (a->object)
{
obj = a->object;
if (a->started)
OBJ_REF(obj);
}
a->action_proto->func_start(a->object, a, data, x, y, rx, ry);
}
}
if (!a->started)
{
current_actions = evas_list_remove(current_actions, a);
OBJ_DO_FREE(a);
goto again;
}
}
}
void
e_action_stop(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry)
{
Evas_List l;
again:
for (l = current_actions; l; l = l->next)
{
E_Action *a;
a = l->data;
if ((a->started) && (a->action_proto->func_stop))
{
int ok = 0;
if ((a->event == ACT_MOUSE_IN) &&
(act == ACT_MOUSE_OUT))
ok = 1;
if ((a->event == ACT_MOUSE_OUT) &&
(act == ACT_MOUSE_IN))
ok = 1;
if ((a->event >= ACT_MOUSE_CLICK) &&
(a->event <= ACT_MOUSE_TRIPLE) &&
(act >= ACT_MOUSE_UP) &&
(act <= ACT_MOUSE_CLICKED) &&
(a->button == button))
ok = 1;
if ((a->event == ACT_MOUSE_MOVE) &&
((act == ACT_MOUSE_OUT) ||
(act == ACT_MOUSE_IN) ||
((act >= ACT_MOUSE_CLICK) &&
(act <= ACT_MOUSE_TRIPLE)) ||
(act >= ACT_MOUSE_UP)))
ok = 1;
if ((a->event == ACT_KEY_DOWN) &&
(act == ACT_KEY_UP) &&
(key) && (a->key) && (!strcmp(key, a->key)))
ok = 1;
if ((a->event == ACT_KEY_UP) &&
(act == ACT_KEY_DOWN))
ok = 1;
if (ok)
{
E_Object *obj;
if (a->object)
{
obj = a->object;
OBJ_UNREF(obj);
}
a->action_proto->func_stop(a->object, a, data, x, y, rx, ry);
a->started = 0;
}
}
if (!a->started)
{
current_actions = evas_list_remove(current_actions, a);
OBJ_DO_FREE(a);
goto again;
}
}
}
void
e_action_go(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry, int dx, int dy)
{
Evas_List l;
for (l = current_actions; l; l = l->next)
{
E_Action *a;
a = l->data;
if ((a->started) && (a->action_proto->func_go))
a->action_proto->func_go(a->object, a, data, x, y, rx, ry, dx, dy);
}
}
void
e_action_stop_by_object(void *o, void *data, int x, int y, int rx, int ry)
{
Evas_List l;
again:
for (l = current_actions; l; l = l->next)
{
E_Action *a;
a = l->data;
if ((a->started) && (o == a->object))
{
E_Object *obj;
if (a->object)
{
obj = a->object;
OBJ_UNREF(obj);
}
if (a->action_proto->func_stop)
a->action_proto->func_stop(a->object, a, data, x, y, rx, ry);
a->started = 0;
current_actions = evas_list_remove(current_actions, a);
OBJ_DO_FREE(a);
goto again;
}
}
}
void
e_action_add_proto(char *action,
void (*func_start) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry),
void (*func_stop) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry),
void (*func_go) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy))
{
E_Action_Proto *ap;
ap = NEW(E_Action_Proto, 1);
OBJ_INIT(ap, NULL);
ap->action = strdup(action);
ap->func_start = func_start;
ap->func_stop = func_stop;
ap->func_go = func_go;
action_protos = evas_list_append(action_protos, ap);
}
void
e_actions_init(void)
{
e_action_add_proto("Window_Move", e_act_move_start, e_act_move_stop, e_act_move_go);
e_action_add_proto("Window_Resize", e_act_resize_start, e_act_resize_stop, e_act_resize_go);
e_action_add_proto("Window_Resize_Horizontal", e_act_resize_h_start, e_act_resize_h_stop, e_act_resize_h_go);
e_action_add_proto("Window_Resize_Vertical", e_act_resize_v_start, e_act_resize_v_stop, e_act_resize_v_go);
e_action_add_proto("Window_Close", e_act_close_start, NULL, NULL);
e_action_add_proto("Window_Kill", e_act_kill_start, NULL, NULL);
e_action_add_proto("Window_Shade", e_act_shade_start, NULL, NULL);
e_action_add_proto("Window_Raise", e_act_raise_start, NULL, NULL);
e_action_add_proto("Window_Lower", e_act_lower_start, NULL, NULL);
e_action_add_proto("Window_Raise_Lower", e_act_raise_lower_start, NULL, NULL);
e_action_add_proto("Execute", e_act_exec_start, NULL, NULL);
e_action_add_proto("Menu", e_act_menu_start, NULL, NULL);
e_action_add_proto("Exit", e_act_exit_start, NULL, NULL);
e_action_add_proto("Restart", e_act_restart_start, NULL, NULL);
e_action_add_proto("Window_Stick", e_act_stick_start, NULL, NULL);
e_action_add_proto("Sound", e_act_sound_start, NULL, NULL);
e_action_add_proto("Window_Iconify", e_act_iconify_start, NULL, NULL);
e_action_add_proto("Window_Max_Size", e_act_max_start, NULL, NULL);
e_action_add_proto("Winodw_Snap", e_act_snap_start, NULL, NULL);
e_action_add_proto("Window_Zoom", e_act_zoom_start, NULL, NULL);
}
static void
e_act_move_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
b->mode.move = 1;
b->current.requested.dx = 0;
b->current.requested.dy = 0;
b->previous.requested.dx = 0;
b->previous.requested.dy = 0;
}
static void
e_act_move_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
b->current.requested.x = b->current.x;
b->current.requested.y = b->current.y;
b->changed = 1;
b->mode.move = 0;
b->current.requested.dx = 0;
b->current.requested.dy = 0;
b->previous.requested.dx = 0;
b->previous.requested.dy = 0;
e_border_adjust_limits(b);
}
static void
e_act_move_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy)
{
E_Border *b;
b = o;
b->current.requested.x += dx;
b->current.requested.y += dy;
if (dx != 0) b->current.requested.dx = dx;
if (dy != 0) b->current.requested.dy = dy;
b->changed = 1;
e_border_adjust_limits(b);
}
static void
e_act_resize_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
/* 0 | 1 */
/* --+-- */
/* 2 | 3 */
if (x > (b->current.w / 2))
{
if (y > (b->current.h / 2))
{
b->mode.resize = 3;
SET_BORDER_GRAVITY(b, NorthWestGravity);
}
else
{
b->mode.resize = 1;
SET_BORDER_GRAVITY(b, SouthWestGravity);
}
}
else
{
if (y > (b->current.h / 2))
{
b->mode.resize = 2;
SET_BORDER_GRAVITY(b, NorthEastGravity);
}
else
{
b->mode.resize = 0;
SET_BORDER_GRAVITY(b, SouthEastGravity);
}
}
}
static void
e_act_resize_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
b->current.requested.x = b->current.x;
b->current.requested.y = b->current.y;
b->current.requested.w = b->current.w;
b->current.requested.h = b->current.h;
b->mode.resize = 0;
b->changed = 1;
e_border_adjust_limits(b);
}
static void
e_act_resize_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy)
{
E_Border *b;
b = o;
if (b->mode.resize == 0)
{
b->current.requested.w -= dx;
b->current.requested.h -= dy;
b->current.requested.x += dx;
b->current.requested.y += dy;
}
else if (b->mode.resize == 1)
{
b->current.requested.w += dx;
b->current.requested.h -= dy;
b->current.requested.y += dy;
}
else if (b->mode.resize == 2)
{
b->current.requested.w -= dx;
b->current.requested.h += dy;
b->current.requested.x += dx;
}
else if (b->mode.resize == 3)
{
b->current.requested.w += dx;
b->current.requested.h += dy;
}
b->changed = 1;
e_border_adjust_limits(b);
}
static void
e_act_resize_h_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
/* 4 | 5 */
if (x > (b->current.w / 2))
{
b->mode.resize = 5;
SET_BORDER_GRAVITY(b, NorthWestGravity);
}
else
{
b->mode.resize = 4;
SET_BORDER_GRAVITY(b, NorthEastGravity);
}
}
static void
e_act_resize_h_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
b->current.requested.x = b->current.x;
b->current.requested.y = b->current.y;
b->current.requested.w = b->current.w;
b->current.requested.h = b->current.h;
b->mode.resize = 0;
b->changed = 1;
e_border_adjust_limits(b);
}
static void
e_act_resize_h_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy)
{
E_Border *b;
b = o;
if (b->mode.resize == 4)
{
b->current.requested.w -= dx;
b->current.requested.x += dx;
}
else if (b->mode.resize == 5)
{
b->current.requested.w += dx;
}
b->changed = 1;
e_border_adjust_limits(b);
}
static void
e_act_resize_v_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
/* 6 */
/* - */
/* 7 */
if (y > (b->current.h / 2))
{
b->mode.resize = 7;
SET_BORDER_GRAVITY(b, NorthWestGravity);
}
else
{
b->mode.resize = 6;
SET_BORDER_GRAVITY(b, SouthWestGravity);
}
}
static void
e_act_resize_v_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
b->current.requested.x = b->current.x;
b->current.requested.y = b->current.y;
b->current.requested.w = b->current.w;
b->current.requested.h = b->current.h;
b->mode.resize = 0;
e_border_adjust_limits(b);
b->changed = 1;
}
static void
e_act_resize_v_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy)
{
E_Border *b;
b = o;
if (b->mode.resize == 6)
{
b->current.requested.h -= dy;
b->current.requested.y += dy;
}
else if (b->mode.resize == 7)
{
b->current.requested.h += dy;
}
e_border_adjust_limits(b);
b->changed = 1;
}
static void
e_act_close_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
if (b->win.client) e_icccm_delete(b->win.client);
}
static void
e_act_kill_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
if (b->win.client) e_window_kill_client(b->win.client);
}
static void
e_act_shade_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_raise_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
e_border_raise(b);
}
static void
e_act_lower_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
e_border_lower(b);
}
static void
e_act_raise_lower_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_exec_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_menu_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_exit_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
exit(0);
}
static void
e_act_restart_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_stick_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_sound_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_iconify_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_max_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_snap_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}
static void
e_act_zoom_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry)
{
E_Border *b;
b = o;
}

1803
src/border.c Normal file

File diff suppressed because it is too large Load Diff

508
src/desktops.c Normal file
View File

@ -0,0 +1,508 @@
#include "e.h"
static Evas_List desktops = NULL;
static Window e_base_win = 0;
static int screen_w, screen_h;
static int current_desk = 0;
static void e_idle(void *data);
static void e_mouse_down(Eevent * ev);
static void e_mouse_up(Eevent * ev);
static void e_mouse_in(Eevent * ev);
static void e_mouse_out(Eevent * ev);
static void e_window_expose(Eevent * ev);
static void
e_idle(void *data)
{
Evas_List l;
for (l = desktops; l; l = l->next)
{
E_Desktop *desk;
desk = l->data;
e_desktops_update(desk);
}
e_db_runtime_flush();
}
/* handling mouse down events */
static void
e_mouse_down(Eevent * ev)
{
Ev_Mouse_Down *e;
e = ev->event;
{
Evas_List l;
for (l = desktops; l; l = l->next)
{
E_Desktop *desk;
desk = l->data;
if (desk->win.desk == e->win)
{
Evas evas;
int x, y;
evas = desk->evas.desk;
e_window_get_root_relative_location(evas_get_window(evas),
&x, &y);
x = e->rx - x;
y = e->ry - y;
evas_event_button_down(evas, x, y, e->button);
return;
}
}
}
}
/* handling mouse up events */
static void
e_mouse_up(Eevent * ev)
{
Ev_Mouse_Up *e;
e = ev->event;
{
Evas_List l;
for (l = desktops; l; l = l->next)
{
E_Desktop *desk;
desk = l->data;
if (desk->win.desk == e->win)
{
Evas evas;
int x, y;
evas = desk->evas.desk;
e_window_get_root_relative_location(evas_get_window(evas),
&x, &y);
x = e->rx - x;
y = e->ry - y;
evas_event_button_up(evas, x, y, e->button);
return;
}
}
}
}
/* handling mouse move events */
static void
e_mouse_move(Eevent * ev)
{
Ev_Mouse_Move *e;
e = ev->event;
{
Evas_List l;
for (l = desktops; l; l = l->next)
{
E_Desktop *desk;
desk = l->data;
if (desk->win.desk == e->win)
{
Evas evas;
int x, y;
evas = desk->evas.desk;
e_window_get_root_relative_location(evas_get_window(evas),
&x, &y);
x = e->rx - x;
y = e->ry - y;
evas_event_move(evas, x, y);
return;
}
}
}
}
/* handling mouse enter events */
static void
e_mouse_in(Eevent * ev)
{
Ev_Window_Enter *e;
e = ev->event;
{
Evas_List l;
for (l = desktops; l; l = l->next)
{
E_Desktop *desk;
desk = l->data;
if (desk->win.desk == e->win)
{
Evas evas;
int x, y;
evas = desk->evas.desk;
e_window_get_root_relative_location(evas_get_window(evas),
&x, &y);
x = e->rx - x;
y = e->ry - y;
evas_event_move(evas, x, y);
evas_event_enter(evas);
return;
}
}
}
}
/* handling mouse leave events */
static void
e_mouse_out(Eevent * ev)
{
Ev_Window_Leave *e;
e = ev->event;
{
Evas_List l;
for (l = desktops; l; l = l->next)
{
E_Desktop *desk;
desk = l->data;
if (desk->win.desk == e->win)
{
Evas evas;
int x, y;
evas = desk->evas.desk;
e_window_get_root_relative_location(evas_get_window(evas),
&x, &y);
x = e->rx - x;
y = e->ry - y;
evas_event_move(evas, x, y);
evas_event_leave(evas);
return;
}
}
}
}
/* handling expose events */
static void
e_window_expose(Eevent * ev)
{
Ev_Window_Expose *e;
e = ev->event;
{
Evas_List l;
for (l = desktops; l; l = l->next)
{
E_Desktop *desk;
desk = l->data;
if (!desk->evas.pmap)
{
if (evas_get_window(desk->evas.desk) == e->win)
evas_update_rect(desk->evas.desk, e->x, e->y, e->w, e->h);
}
}
}
}
void
e_desktops_init(void)
{
E_Desktop *desk;
e_window_get_geometry(0, NULL, NULL, &screen_w, &screen_h);
e_base_win = e_window_override_new(0, 0, 0, screen_w, screen_h);
e_window_show(e_base_win);
desk = e_desktops_new();
e_desktops_show(desk);
e_event_filter_handler_add(EV_MOUSE_DOWN, e_mouse_down);
e_event_filter_handler_add(EV_MOUSE_UP, e_mouse_up);
e_event_filter_handler_add(EV_MOUSE_MOVE, e_mouse_move);
e_event_filter_handler_add(EV_MOUSE_IN, e_mouse_in);
e_event_filter_handler_add(EV_MOUSE_OUT, e_mouse_out);
e_event_filter_handler_add(EV_WINDOW_EXPOSE, e_window_expose);
e_event_filter_idle_handler_add(e_idle, NULL);
e_icccm_advertise_e_compat();
e_icccm_advertise_mwm_compat();
e_icccm_advertise_gnome_compat();
e_icccm_advertise_kde_compat();
e_icccm_advertise_net_compat();
e_icccm_set_desk_area_size(0, 1, 1);
e_icccm_set_desk_area(0, 0, 0);
e_icccm_set_desk(0, 0);
}
void
e_desktops_scroll(E_Desktop *desk, int dx, int dy)
{
Evas_List l;
int xd, yd, wd, hd;
int grav, grav_stick;
/* set grav */
if ((dx ==0) && (dy == 0)) return;
desk->x -= dx;
desk->y -= dy;
xd = yd = wd = hd = 0;
grav = NorthWestGravity;
grav_stick= SouthEastGravity;
if ((dx <= 0) && (dy <= 0))
{
grav = NorthWestGravity;
grav_stick = SouthEastGravity;
xd = dx;
yd = dy;
wd = -dx;
hd = -dy;
}
else if ((dx >= 0) && (dy <= 0))
{
grav = NorthEastGravity;
grav_stick = SouthWestGravity;
xd = 0;
yd = dy;
wd = dx;
hd = -dy;
}
else if ((dx >= 0) && (dy >= 0))
{
grav = SouthEastGravity;
grav_stick = NorthWestGravity;
xd = 0;
yd = 0;
wd = dx;
hd = dy;
}
else if ((dx <= 0) && (dy >= 0))
{
grav = SouthWestGravity;
grav_stick = NorthEastGravity;
xd = dx;
yd = 0;
wd = -dx;
hd = dy;
}
for (l = desk->windows; l; l = l->next)
{
E_Border *b;
b = l->data;
/* if sticky */
/* e_window_gravity_set(b->win.main, StaticGravity); */
e_window_gravity_set(b->win.main, grav);
}
grav_stick = StaticGravity;
e_window_gravity_set(desk->win.desk, grav_stick);
/* scroll */
e_window_move_resize(desk->win.container,
xd, yd,
screen_w + wd, screen_h + hd);
/* reset */
for (l = desk->windows; l; l = l->next)
{
E_Border *b;
b = l->data;
e_window_gravity_set(b->win.main, grav_stick);
}
e_window_move_resize(desk->win.container, 0, 0, screen_w, screen_h);
e_window_gravity_reset(desk->win.desk);
for (l = desk->windows; l; l = l->next)
{
E_Border *b;
b = l->data;
e_window_gravity_reset(b->win.main);
b->current.requested.x += dx;
b->current.requested.y += dy;
b->current.x = b->current.requested.x;
b->current.y = b->current.requested.y;
b->previous.requested.x = b->current.requested.x;
b->previous.requested.y = b->current.requested.y;
b->previous.x = b->current.x;
b->previous.y = b->current.y;
b->changed = 1;
}
e_sync();
}
void
e_desktops_free(E_Desktop *desk)
{
e_window_destroy(desk->win.main);
IF_FREE(desk->name);
IF_FREE(desk->dir);
FREE(desk);
}
void
e_desktops_init_file_display(E_Desktop *desk)
{
int max_colors = 216;
int font_cache = 1024 * 1024;
int image_cache = 8192 * 1024;
char *font_dir = "./fnt";
/* software */
desk->evas.desk = evas_new_all(e_display_get(),
desk->win.container,
0, 0, screen_w, screen_h,
RENDER_METHOD_ALPHA_SOFTWARE,
max_colors,
font_cache,
image_cache,
font_dir);
desk->win.desk = evas_get_window(desk->evas.desk);
e_add_child(desk->win.container, desk->win.desk);
/* pixmap backing for desktop */
desk->evas.pmap = e_pixmap_new(desk->win.desk, screen_w, screen_h, 0);
evas_set_output(desk->evas.desk, e_display_get(), desk->evas.pmap,
evas_get_visual(desk->evas.desk), evas_get_colormap(desk->evas.desk));
e_window_set_background_pixmap(desk->win.desk, desk->evas.pmap);
/* normal stuff */
e_window_set_events(desk->win.desk, XEV_EXPOSE | XEV_MOUSE_MOVE | XEV_BUTTON | XEV_IN_OUT);
e_window_show(desk->win.desk);
{
Evas_Object o;
Evas e;
e = desk->evas.desk;
o = evas_add_image_from_file(e, "../data/bg.png");
evas_move(e, o, 0, 0);
evas_resize(e, o, screen_w, screen_h);
evas_show(e, o);
o = evas_add_image_from_file(e, "../data/e_logo.png");
evas_move(e, o, 0, 0);
evas_show(e, o);
}
}
E_Desktop *
e_desktops_new(void)
{
E_Desktop *desk;
desk = NEW(E_Desktop, 1);
ZERO(desk, E_Desktop, 1);
OBJ_INIT(desk, e_desktops_free);
desk->win.main = e_window_override_new(e_base_win, 0, 0, screen_w, screen_h);
desk->win.container = e_window_override_new(desk->win.main, 0, 0, screen_w, screen_h);
e_window_show(desk->win.container);
desk->x = 0;
desk->y = 0;
desk->real.w = screen_w;
desk->real.h = screen_h;
desk->virt.w = screen_w;
desk->virt.h = screen_h;
desktops = evas_list_append(desktops, desk);
e_desktops_init_file_display(desk);
return desk;
}
void
e_desktops_add_border(E_Desktop *d, E_Border *b)
{
if ((!d) || (!b)) return;
b->desk = d;
e_border_raise(b);
}
void
e_desktops_del_border(E_Desktop *d, E_Border *b)
{
if ((!d) || (!b)) return;
d->windows = evas_list_remove(d->windows, b);
b->desk = NULL;
}
void
e_desktops_delete(E_Desktop *d)
{
OBJ_DO_FREE(d);
}
void
e_desktops_show(E_Desktop *d)
{
e_window_show(d->win.main);
}
void
e_desktops_hide(E_Desktop *d)
{
e_window_hide(d->win.main);
}
int
e_desktops_get_num(void)
{
Evas_List l;
int i;
for (i = 0, l = desktops; l; l = l->next, i++);
return i;
}
E_Desktop *
e_desktops_get(int d)
{
Evas_List l;
int i;
for (i = 0, l = desktops; l; l = l->next, i++)
{
if (i == d) return (E_Desktop *)l->data;
}
return NULL;
}
int
e_desktops_get_current(void)
{
return current_desk;
}
void
e_desktops_update(E_Desktop *desk)
{
Imlib_Updates up;
up = evas_render_updates(desk->evas.desk);
if (up)
{
Imlib_Updates u;
printf("rendered desktop\n");
for (u = up; u; u = imlib_updates_get_next(u))
{
int x, y, w, h;
imlib_updates_get_coordinates(u, &x, &y, &w, &h);
e_window_clear_area(desk->win.desk, x, y, w, h);
}
imlib_updates_free(up);
}
if (desk->changed)
{
desk->changed = 0;
}
}

337
src/e.h Normal file
View File

@ -0,0 +1,337 @@
#include <X11/Xlib.h>
#include <Imlib2.h>
#include <Evas.h>
#include <Ebits.h>
#include <Ecore.h>
#include <Edb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <dirent.h>
#include <errno.h>
#include <signal.h>
#define E_PROF 1
#ifdef E_PROF
extern Evas_List __e_profiles;
typedef struct _e_prof
{
char *func;
double total;
double t1, t2;
} E_Prof;
#define E_PROF_START(_prof_func) \
{ \
E_Prof __p, *__pp; \
Evas_List __pl; \
__p.func = _prof_func; \
__p.total = 0.0; \
__p.t1 = e_get_time(); \
__p.t2 = 0.0;
#define E_PROF_STOP \
__p.t2 = e_get_time(); \
for (__pl = __e_profiles; __pl; __pl = __pl->next) \
{ \
__pp = __pl->data; \
if (!strcmp(__p.func, __pp->func)) \
{ \
__pp->total += (__p.t2 - __p.t1); \
break; \
} \
} \
if (!__pl) \
{ \
__pp = NEW(E_Prof, 1); \
__pp->func = __p.func; \
__pp->total = __p.t2 - __p.t1; \
__pp->t1 = 0.0; \
__pp->t2 = 0.0; \
__e_profiles = evas_list_append(__e_profiles, __pp); \
} \
}
#define E_PROF_DUMP \
{ \
Evas_List __pl; \
for (__pl = __e_profiles; __pl; __pl = __pl->next) \
{ \
E_Prof *__p; \
__p = __pl->data; \
printf("%3.3f : %s()\n", __p->total, __p->func); \
} \
}
#else
#define E_PROF_START(_prof_func)
#define E_PROF_STOP
#define E_PROF_DUMP
#endif
#define OBJ_REF(_e_obj) _e_obj->references++
#define OBJ_UNREF(_e_obj) _e_obj->references--;
#define OBJ_IF_FREE(_e_obj) if (_e_obj->references == 0)
#define OBJ_FREE(_e_obj) _e_obj->e_obj_free(_e_obj)
#define OBJ_DO_FREE(_e_obj) \
OBJ_UNREF(_e_obj); \
OBJ_IF_FREE(_e_obj) \
{ \
OBJ_FREE(_e_obj); \
}
#define OBJ_PROPERTIES \
int references; \
void (*e_obj_free) (void *e_obj);
#define OBJ_INIT(_e_obj, _e_obj_free_func) \
{ \
_e_obj->references = 1; \
_e_obj->e_obj_free = (void *) _e_obj_free_func; \
}
#define SPANS_COMMON(x1, w1, x2, w2) \
(!((((x2) + (w2)) <= (x1)) || ((x2) >= ((x1) + (w1)))))
#define ACT_MOUSE_IN 0
#define ACT_MOUSE_OUT 1
#define ACT_MOUSE_CLICK 2
#define ACT_MOUSE_DOUBLE 3
#define ACT_MOUSE_TRIPLE 4
#define ACT_MOUSE_UP 5
#define ACT_MOUSE_CLICKED 6
#define ACT_MOUSE_MOVE 7
#define ACT_KEY_DOWN 8
#define ACT_KEY_UP 9
#define SET_BORDER_GRAVITY(_b, _grav) \
e_window_gravity_set(_b->win.container, _grav); \
e_window_gravity_set(_b->win.input, _grav); \
e_window_gravity_set(_b->win.l, _grav); \
e_window_gravity_set(_b->win.r, _grav); \
e_window_gravity_set(_b->win.t, _grav); \
e_window_gravity_set(_b->win.b, _grav);
typedef struct _E_Object E_Object;
typedef struct _E_Border E_Border;
typedef struct _E_Grab E_Grab;
typedef struct _E_Action E_Action;
typedef struct _E_Action_Proto E_Action_Proto;
typedef struct _E_Desktop E_Desktop;
typedef struct _E_Rect E_Rect;
struct _E_Object
{
OBJ_PROPERTIES;
};
struct _E_Border
{
OBJ_PROPERTIES;
struct {
Window main;
Window l, r, t, b;
Window input;
Window container;
Window client;
} win;
struct {
Evas l, r, t, b;
} evas;
struct {
Pixmap l, r, t, b;
} pixmap;
struct {
int new;
Ebits_Object l, r, t, b;
} bits;
struct {
struct {
int x, y, w, h;
int visible;
int dx, dy;
} requested;
int x, y, w, h;
int visible;
int selected;
} current, previous;
struct {
struct {
int w, h;
double aspect;
} base, min, max, step;
int layer;
int shaped;
char *title;
char *name;
char *class;
char *command;
Window group;
int sticky;
Colormap colormap;
int fixed;
int arrange_ignore;
int shaded;
int hidden;
int borderless;
int titlebar;
int border;
int handles;
} client;
struct {
int move, resize;
} mode;
int has_shape;
int shape_changes;
int ignore_unmap;
Evas_List grabs;
E_Desktop *desk;
int changed;
};
struct _E_Grab
{
int button;
Ev_Key_Modifiers mods;
int any_mod;
int remove_after;
int allow;
};
struct _E_Action
{
OBJ_PROPERTIES;
char *name;
char *action;
char *params;
int event;
int button;
char *key;
int modifiers;
E_Action_Proto *action_proto;
void *object;
int started;
};
struct _E_Action_Proto
{
OBJ_PROPERTIES;
char *action;
void (*func_start) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
void (*func_stop) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry);
void (*func_go) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy);
};
struct _E_Desktop
{
OBJ_PROPERTIES;
char *name;
char *dir;
struct {
Window main;
Window container;
Window desk;
} win;
struct {
Pixmap pmap;
Evas desk;
} evas;
int x, y;
struct {
int w, h;
} real, virt;
Evas_List windows;
int changed;
};
struct _E_Rect
{
int x, y, w, h;
int v1, v2, v3, v4;
};
void e_action_add_proto(char *action,
void (*func_start) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry),
void (*func_stop) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry),
void (*func_go) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry, int dx, int dy));
void e_actions_init(void);
void e_action_start(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry);
void e_action_stop(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry);
void e_action_go(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry, int dx, int dy);
void e_action_stop_by_object(void *o, void *data, int x, int y, int rx, int ry);
void e_border_apply_border(E_Border *b);
E_Border * e_border_new(void);
E_Border * e_border_adopt(Window win, int use_client_pos);
void e_border_free(E_Border *b);
void e_border_remove_mouse_grabs(E_Border *b);
void e_border_attach_mouse_grabs(E_Border *b);
void e_border_remove_all_mouse_grabs(void);
void e_border_attach_all_mouse_grabs(void);
void e_border_redo_grabs(void);
E_Border * e_border_find_by_window(Window win);
void e_border_set_bits(E_Border *b, char *file);
void e_border_set_color_class(E_Border *b, char *class, int rr, int gg, int bb, int aa);
void e_border_adjust_limits(E_Border *b);
void e_border_update(E_Border *b);
void e_border_set_layer(E_Border *b, int layer);
void e_border_raise(E_Border *b);
void e_border_lower(E_Border *b);
void e_border_raise_above(E_Border *b, E_Border *above);
void e_border_lower_below(E_Border *b, E_Border *below);
void e_border_init(void);
void e_icccm_move_resize(Window win, int x, int y, int w, int h);
void e_icccm_delete(Window win);
void e_icccm_state_mapped(Window win);
void e_icccm_state_iconified(Window win);
void e_icccm_state_withdrawn(Window win);
void e_icccm_adopt(Window win);
void e_icccm_release(Window win);
void e_icccm_get_size_info(Window win, E_Border *b);
void e_icccm_get_mwm_hints(Window win, E_Border *b);
void e_icccm_get_layer(Window win, E_Border *b);
void e_icccm_set_frame_size(Window win, int l, int r, int t, int b);
void e_icccm_set_desk_area(Window win, int ax, int ay);
void e_icccm_set_desk_area_size(Window win, int ax, int ay);
void e_icccm_set_desk(Window win, int d);
void e_icccm_advertise_e_compat(void);
void e_icccm_advertise_mwm_compat(void);
void e_icccm_advertise_gnome_compat(void);
void e_icccm_advertise_kde_compat(void);
void e_icccm_advertise_net_compat(void);
void e_desktops_init(void);
void e_desktops_scroll(E_Desktop *desk, int dx, int dy);
void e_desktops_free(E_Desktop *desk);
void e_desktops_init_file_display(E_Desktop *desk);
E_Desktop * e_desktops_new(void);
void e_desktops_add_border(E_Desktop *d, E_Border *b);
void e_desktops_del_border(E_Desktop *d, E_Border *b);
void e_desktops_delete(E_Desktop *d);
void e_desktops_show(E_Desktop *d);
void e_desktops_hide(E_Desktop *d);
int e_desktops_get_num(void);
E_Desktop * e_desktops_get(int d);
int e_desktops_get_current(void);
void e_desktops_update(E_Desktop *desk);
void e_resist_border(E_Border *b);
time_t e_file_modified_time(char *file);

403
src/icccm.c Normal file
View File

@ -0,0 +1,403 @@
#include "e.h"
/* Motif window hints */
#define MWM_HINTS_FUNCTIONS (1L << 0)
#define MWM_HINTS_DECORATIONS (1L << 1)
#define MWM_HINTS_INPUT_MODE (1L << 2)
#define MWM_HINTS_STATUS (1L << 3)
/* bit definitions for MwmHints.functions */
#define MWM_FUNC_ALL (1L << 0)
#define MWM_FUNC_RESIZE (1L << 1)
#define MWM_FUNC_MOVE (1L << 2)
#define MWM_FUNC_MINIMIZE (1L << 3)
#define MWM_FUNC_MAXIMIZE (1L << 4)
#define MWM_FUNC_CLOSE (1L << 5)
/* bit definitions for MwmHints.decorations */
#define MWM_DECOR_ALL (1L << 0)
#define MWM_DECOR_BORDER (1L << 1)
#define MWM_DECOR_RESIZEH (1L << 2)
#define MWM_DECOR_TITLE (1L << 3)
#define MWM_DECOR_MENU (1L << 4)
#define MWM_DECOR_MINIMIZE (1L << 5)
#define MWM_DECOR_MAXIMIZE (1L << 6)
/* bit definitions for MwmHints.inputMode */
#define MWM_INPUT_MODELESS 0
#define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
#define MWM_INPUT_SYSTEM_MODAL 2
#define MWM_INPUT_FULL_APPLICATION_MODAL 3
#define PROP_MWM_HINTS_ELEMENTS 5
/* Motif window hints */
typedef struct _mwmhints
{
int flags;
int functions;
int decorations;
int inputMode;
int status;
}
MWMHints;
void
e_icccm_move_resize(Window win, int x, int y, int w, int h)
{
e_window_send_event_move_resize(win, x, y, w, h);
}
void
e_icccm_delete(Window win)
{
static Atom a_wm_delete_window = 0;
static Atom a_wm_protocols = 0;
int *props;
int size;
int del_win = 0;
E_ATOM(a_wm_delete_window, "WM_DELETE_WINDOW");
E_ATOM(a_wm_protocols, "WM_PROTOCOLS");
props = e_window_property_get(win, a_wm_protocols, XA_ATOM, &size);
if (props)
{
int i, num;
num = size / sizeof(int);
for (i = 0; i < num; i++)
{
if (props[i] == (int)a_wm_delete_window) del_win = 1;
}
FREE(props);
}
if (del_win)
{
unsigned int data[5];
data[0] = a_wm_delete_window;
data[1] = CurrentTime;
e_window_send_client_message(win, a_wm_protocols, 32, data);
}
else
{
e_window_kill_client(win);
}
}
void
e_icccm_state_mapped(Window win)
{
static Atom a_wm_state = 0;
unsigned int data[2];
E_ATOM(a_wm_state, "WM_STATE");
data[0] = NormalState;
data[1] = 0;
e_window_property_set(win, a_wm_state, a_wm_state, 32, data, 2);
}
void
e_icccm_state_iconified(Window win)
{
static Atom a_wm_state = 0;
unsigned int data[2];
E_ATOM(a_wm_state, "WM_STATE");
data[0] = IconicState;
data[1] = 0;
e_window_property_set(win, a_wm_state, a_wm_state, 32, data, 2);
}
void
e_icccm_state_withdrawn(Window win)
{
static Atom a_wm_state = 0;
unsigned int data[2];
E_ATOM(a_wm_state, "WM_STATE");
data[0] = WithdrawnState;
data[1] = 0;
e_window_property_set(win, a_wm_state, a_wm_state, 32, data, 2);
}
void
e_icccm_adopt(Window win)
{
e_window_add_to_save_set(win);
}
void
e_icccm_release(Window win)
{
e_window_del_from_save_set(win);
}
void
e_icccm_get_size_info(Window win, E_Border *b)
{
int x, y, w, h;
int base_w, base_h, min_w, min_h, max_w, max_h, grav, step_w, step_h;
double aspect_min, aspect_max;
int mask;
XSizeHints hint;
x = 0; y = 0; w = 0; h = 0;
e_window_get_geometry(win, &x, &y, &w, &h);
printf("window at %i %i\n", x, y);
grav = NorthWestGravity;
mask = 0;
min_w = 0;
min_h = 0;
max_w = 65535;
max_h = 65535;
aspect_min = 0.0;
aspect_max = 999999.0;
step_w = 1;
step_h = 1;
base_w = 0;
base_h = 0;
if (e_window_get_wm_size_hints(win, &hint, &mask))
{
if (hint.flags & PWinGravity) grav = hint.win_gravity;
if ((hint.flags & USPosition) || ((hint.flags & PPosition)))
{
}
else
{
x = rand()%640;
y = rand()%480;
}
if (hint.flags & PMinSize)
{
min_w = hint.min_width;
min_h = hint.min_height;
}
if (hint.flags & PMaxSize)
{
max_w = hint.max_width;
max_h = hint.max_height;
if (max_w < min_w) max_w = min_w;
if (max_h < min_h) max_h = min_h;
}
if (hint.flags & PResizeInc)
{
step_w = hint.width_inc;
step_h = hint.height_inc;
if (step_w < 1) step_w = 1;
if (step_h < 1) step_h = 1;
}
if (hint.flags & PBaseSize)
{
base_w = hint.base_width;
base_h = hint.base_height;
if (base_w > max_w) max_w = base_w;
if (base_h > max_h) max_h = base_h;
}
else
{
base_w = min_w;
base_h = min_h;
}
if (hint.flags & PAspect)
{
if (hint.min_aspect.y > 0)
aspect_min = ((double)hint.min_aspect.x) / ((double)hint.min_aspect.y);
if (hint.max_aspect.y > 0)
aspect_max = ((double)hint.max_aspect.x) / ((double)hint.max_aspect.y);
}
}
else
{
/* get x,y location of client */
x = rand()%640;
y = rand()%480;
}
{
int pl, pr, pt, pb;
pl = pr = pt = pb = 0;
if (b->bits.l) ebits_get_insets(b->bits.l, &pl, &pr, &pt, &pb);
b->current.requested.x = x - pl;
b->current.requested.y = y - pt;
b->current.requested.w = w + pl + pr;
b->current.requested.h = h + pt + pb;
b->client.min.w = min_w;
b->client.min.h = min_h;
b->client.max.w = max_w;
b->client.max.h = max_h;
b->client.base.w = base_w;
b->client.base.h = base_h;
b->client.step.w = step_w;
b->client.step.h = step_h;
b->client.min.aspect = aspect_min;
b->client.max.aspect = aspect_max;
b->changed = 1;
}
}
void
e_icccm_get_mwm_hints(Window win, E_Border *b)
{
static Atom a_motif_wm_hints = 0;
MWMHints *mwmhints;
int size;
E_ATOM(a_motif_wm_hints, "_MOTIF_WM_HINTS");
mwmhints = e_window_property_get(win, a_motif_wm_hints, a_motif_wm_hints, &size);
if (mwmhints)
{
int i, num;
num = size / sizeof(int);
if (num < PROP_MWM_HINTS_ELEMENTS)
{
FREE(mwmhints);
return;
}
if (mwmhints->flags & MWM_HINTS_DECORATIONS)
{
b->client.border = 0;
b->client.handles = 0;
b->client.titlebar = 0;
if (mwmhints->decorations & MWM_DECOR_ALL)
{
b->client.border = 1;
b->client.handles = 1;
b->client.titlebar = 1;
}
if (mwmhints->decorations & MWM_DECOR_BORDER) b->client.border = 1;
if (mwmhints->decorations & MWM_DECOR_RESIZEH) b->client.handles = 1;
if (mwmhints->decorations & MWM_DECOR_TITLE) b->client.titlebar = 1;
}
FREE(mwmhints);
}
}
void
e_icccm_get_layer(Window win, E_Border *b)
{
static Atom a_win_layer = 0;
int *props;
int size;
E_ATOM(a_win_layer, "_WIN_LAYER");
props = e_window_property_get(win, a_win_layer, XA_CARDINAL, &size);
if (props)
{
int i, num;
num = size / sizeof(int);
if (num > 0) b->client.layer = props[0];
FREE(props);
}
}
void
e_icccm_set_frame_size(Window win, int l, int r, int t, int b)
{
static Atom a_e_frame_size = 0;
int props[4];
E_ATOM(a_e_frame_size, "_E_FRAME_SIZE");
props[0] = l;
props[1] = r;
props[2] = t;
props[3] = b;
e_window_property_set(win, a_e_frame_size, XA_CARDINAL, 32, props, 4);
}
void
e_icccm_set_desk_area(Window win, int ax, int ay)
{
static Atom a_win_area = 0;
int props[2];
E_ATOM(a_win_area, "_WIN_AREA");
props[0] = ax;
props[1] = ay;
e_window_property_set(win, a_win_area, XA_CARDINAL, 32, props, 2);
}
void
e_icccm_set_desk_area_size(Window win, int ax, int ay)
{
static Atom a_win_area_count = 0;
int props[2];
E_ATOM(a_win_area_count, "_WIN_AREA_COUNT");
props[0] = ax;
props[1] = ay;
e_window_property_set(win, a_win_area_count, XA_CARDINAL, 32, props, 2);
}
void
e_icccm_set_desk(Window win, int d)
{
static Atom a_win_workspace = 0;
int props[2];
E_ATOM(a_win_workspace, "_WIN_WORKSPACE");
props[0] = d;
e_window_property_set(win, a_win_workspace, XA_CARDINAL, 32, props, 1);
}
void
e_icccm_advertise_e_compat(void)
{
}
void
e_icccm_advertise_mwm_compat(void)
{
static Atom a_motif_wm_info = 0;
int props[2];
E_ATOM(a_motif_wm_info, "_MOTIF_WM_INFO");
props[0] = 2;
props[0] = e_window_root();
e_window_property_set(0, a_motif_wm_info, a_motif_wm_info, 32, props, 2);
}
void
e_icccm_advertise_gnome_compat(void)
{
static Atom a_win_supporting_wm_check = 0;
static Atom a_win_protocols = 0;
static Atom a_win_wm_name = 0;
static Atom a_win_wm_version = 0;
static Atom a_win_layer = 0;
int props[32];
Window win;
E_ATOM(a_win_protocols, "_WIN_PROTOCOLS");
E_ATOM(a_win_protocols, "_WIN_LAYER");
props[0] = a_win_protocols;
e_window_property_set(0, a_win_protocols, XA_ATOM, 32, props, 1);
E_ATOM(a_win_wm_name, "_WIN_WM_NAME");
e_window_property_set(win, a_win_wm_name, XA_STRING, 8, "Enlightenment", strlen("Enlightenment"));
E_ATOM(a_win_wm_version, "_WIN_WM_VERSION");
e_window_property_set(win, a_win_wm_version, XA_STRING, 8, "0.17.0", strlen("0.17.0"));
E_ATOM(a_win_supporting_wm_check, "_WIN_SUPPORTING_WM_CHECK");
win = e_window_override_new(0, 0, 0, 7, 7);
props[0] = win;
e_window_property_set(win, a_win_supporting_wm_check, XA_CARDINAL, 32, props, 1);
e_window_property_set(0, a_win_supporting_wm_check, XA_CARDINAL, 32, props, 1);
}
void
e_icccm_advertise_kde_compat(void)
{
}
void
e_icccm_advertise_net_compat(void)
{
}

55
src/main.c Normal file
View File

@ -0,0 +1,55 @@
#include "e.h"
#ifdef E_PROF
Evas_List __e_profiles = NULL;
#endif
static void cb_exit(void);
static void cb_exit(void)
{
printf("cb_exit\n");
E_PROF_DUMP;
}
static void ch_col(int val, void *data);
static void ch_col(int val, void *data)
{
E_Desktop *desk;
double v;
v = (double)val / 10;
desk = e_desktops_get(e_desktops_get_current());
e_desktops_scroll(desk, (int)(8 * sin(v)), (int)(8 * cos(v)));
e_add_event_timer("time", 0.02, ch_col, val + 1, NULL);
}
void setup(void);
void
setup(void)
{
e_grab();
e_window_set_events(0, XEV_CHILD_REDIRECT | XEV_PROPERTY | XEV_COLORMAP);
e_border_adopt_children(0);
e_ungrab();
/* e_add_event_timer("timer", 0.02, ch_col, 0, NULL);*/
}
int
main(int argc, char **argv)
{
atexit(cb_exit);
e_display_init(NULL);
e_ev_signal_init();
e_event_filter_init();
e_ev_x_init();
e_desktops_init();
e_border_init();
e_actions_init();
setup();
e_event_loop();
return 0;
}

129
src/resist.c Normal file
View File

@ -0,0 +1,129 @@
#include "e.h"
void
e_resist_border(E_Border *b)
{
int resist = 1;
int desk_resist = 32;
int win_resist = 12;
int ok;
int dx, dy, d;
int resist_x = 0, resist_y = 0;
char *settings_db = "./settings.db";
Evas_List l, rects = NULL;
E_Rect *r;
E_DB_INT_GET(settings_db, "/move/resist", resist, ok);
if (!ok) resist = 1;
if (!resist)
{
b->current.x = b->current.requested.x;
b->current.y = b->current.requested.y;
return;
}
E_DB_INT_GET(settings_db, "/move/resist/desk", desk_resist, ok);
if (!ok) desk_resist = 32;
E_DB_INT_GET(settings_db, "/move/resist/win", win_resist, ok);
if (!ok) win_resist = 12;
if (!b->desk) return;
dx = b->current.requested.x - b->previous.requested.x;
dy = b->current.requested.y - b->previous.requested.y;
/* edges of screen */
#define OBSTACLE(_x, _y, _w, _h, _resist) \
{ \
r = NEW(E_Rect, 1); \
r->x = _x; r->y = _y; r->w = _w; r->h = _h; r->v1 = _resist; \
rects = evas_list_append(rects, r); \
}
OBSTACLE(-1000000, -1000000, 2000000 + b->desk->real.w, 1000000, desk_resist);
OBSTACLE(-1000000, -1000000, 1000000, 2000000 + b->desk->real.h, desk_resist);
OBSTACLE(-1000000, b->desk->real.h, 2000000 + b->desk->real.w, 1000000, desk_resist);
OBSTACLE(b->desk->real.w, -1000000, 1000000, 2000000 + b->desk->real.h, desk_resist);
for (l = b->desk->windows; l; l = l->next)
{
E_Border *bd;
bd = l->data;
if (bd != b)
{
r = NEW(struct _E_Rect, 1);
r->x = bd->current.x;
r->y = bd->current.y;
r->w = bd->current.w;
r->h = bd->current.h;
r->v1 = win_resist;
rects = evas_list_append(rects, r);
}
}
for (l = rects; l; l = l->next)
{
r = l->data;
if (SPANS_COMMON(r->y, r->h, b->current.requested.y, b->current.h))
{
if (dx > 0)
{
/* moving right - check left edge of windows against right */
d = r->x - (b->current.requested.x + b->current.w);
if ((d < 0) && (d >= - r->v1))
{
if (resist_x > d) resist_x = d;
}
}
else if (dx < 0)
{
/* moving left - check right edge of windows against left */
d = b->current.requested.x - (r->x + r->w);
if ((d < 0) && (d >= - r->v1))
{
if (resist_x > d) resist_x = -d;
}
}
}
if (SPANS_COMMON(r->x, r->w, b->current.requested.x, b->current.w))
{
if (dy > 0)
{
/* moving down - check top edge of windows against bottom */
d = r->y - (b->current.requested.y + b->current.h);
if ((d < 0) && (d >=2 - r->v1))
{
if (resist_y > d) resist_y = d;
}
}
else if (dy < 0)
{
/* moving up - check bottom edge of windows against top */
d = b->current.requested.y - (r->y + r->h);
if ((d < 0) && (d >= - r->v1))
{
if (resist_y > d) resist_y = -d;
}
}
}
}
if (rects)
{
for (l = rects; l; l = l->next)
{
FREE(l->data);
}
evas_list_free(rects);
}
if (dx != 0)
{
if (((b->previous.requested.dx < 0) && (b->current.requested.dx > 0)) ||
((b->previous.requested.dx > 0) && (b->current.requested.dx < 0)))
b->current.requested.x = b->current.x;
else
b->current.x = b->current.requested.x + resist_x;
}
if (dy != 0)
{
if (((b->previous.requested.dy < 0) && (b->current.requested.dy > 0)) ||
((b->previous.requested.dy > 0) && (b->current.requested.dy < 0)))
b->current.requested.y = b->current.y;
else
b->current.y = b->current.requested.y + resist_y;
}
}

10
src/util.c Normal file
View File

@ -0,0 +1,10 @@
#include "e.h"
time_t
e_file_modified_time(char *file)
{
struct stat st;
if (stat(file, &st) < 0) return 0;
return st.st_mtime;
}