[Pkg-e-commits] [SCM] Enlightenment DR17 graphical layout and animation library branch, master, updated. debian/0.9.9.050+svn20081206-1-1093-g0f4d7fb

Albin Tonnerre albin.tonnerre at gmail.com
Fri Feb 6 15:02:35 UTC 2009


The following commit has been merged in the master branch:
commit bd26a573b4419416f6edaa68e0671123713a6479
Author: Albin Tonnerre <albin.tonnerre at gmail.com>
Date:   Wed Feb 4 00:46:50 2009 +0100

    Import new SVN snapshot

diff --git a/COPYING b/COPYING
index 474fcc5..9690c3f 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,3 @@
-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
@@ -10,15 +9,20 @@ 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 and its Copyright notices. In addition publicly
 documented acknowledgment must be given that this software has been used if no
-source code of this software is made available publicly. This includes
-acknowledgments in either Copyright notices, Manuals, Publicity and Marketing
-documents or any documentation provided with any product containing this
-software. This License does not apply to any software that links to the
-libraries provided by this software (statically or dynamically), but only to
-the software provided.
+source code of this software is made available publicly. Making the source
+available publicly means including the source for this software with the
+distribution, or a method to get this software via some reasonable mechanism
+(electronic transfer via a network or media) as well as making an offer to
+supply the source on request. This Copyright notice serves as an offer to
+supply the source on on request as well. Instead of this, supplying
+acknowledgments of use of this software in either Copyright notices, Manuals,
+Publicity and Marketing documents or any documentation provided with any
+product containing this software. This License does not apply to any software
+that links to the libraries provided by this software (statically or
+dynamically), but only to the software provided.
 
-Please see the COPYING.PLAIN for a plain-english explanation of this notice
-and it's intent.
+Please see the COPYING-PLAIN for a plain-english explanation of this notice
+and its intent.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
diff --git a/Makefile.in b/Makefile.in
index 12504c5..5dae151 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -95,7 +95,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -105,7 +104,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -182,6 +180,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
diff --git a/config.h.in b/config.h.in
index e67e516..0882fbb 100644
--- a/config.h.in
+++ b/config.h.in
@@ -96,7 +96,7 @@
 /* Version number of package */
 #undef VERSION
 
-/* Define to nothing if your compiler does not support __attribute__ */
+/* Macro declaring a function argument to be unused */
 #undef __UNUSED__
 
 /* Define to empty if `const' does not conform to ANSI C. */
diff --git a/configure b/configure
index 6747a0b..a331335 100755
--- a/configure
+++ b/configure
@@ -883,8 +883,8 @@ ECORE_FILE_CFLAGS
 ECORE_FILE_LIBS
 ECORE_EVAS_CFLAGS
 ECORE_EVAS_LIBS
-BUILD_DOCS
-DOXYGEN
+efl_have_doxygen
+efl_doxygen
 EFL_BUILD_DOC_TRUE
 EFL_BUILD_DOC_FALSE
 PYTHON
@@ -1512,7 +1512,7 @@ Optional Features:
   --enable-edje-program-cache
                           enable EDJE_PROGRAM_CACHE support.
                           [[default=disabled]]
-  --disable-doc           Disable the build of the documentation
+  --disable-doc           Disable documentation build [default=enabled]
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -15217,34 +15217,39 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-DOXYGEN="doxygen"
-
 # Check whether --enable-doc was given.
 if test "${enable_doc+set}" = set; then
-  enableval=$enable_doc; if test "${disable_doc}" = "yes" ; then
-       enable_doc="no"
+  enableval=$enable_doc;
+    if test "x${enableval}" = "xyes" ; then
+       efl_enable_doc="yes"
     else
-       enable_doc="yes"
+       efl_enable_doc="no"
     fi
+
 else
-  enable_doc="yes"
+  efl_enable_doc="yes"
 
 fi
 
 
+if test "x${efl_enable_doc}" = "xyes" ; then
+
+
+   efl_doxygen="doxygen"
+
 
 # Check whether --with-doxygen was given.
 if test "${with_doxygen+set}" = set; then
-  withval=$with_doxygen;          DOXYGEN=${withval}
-    # Extract the first word of "${DOXYGEN}", so it can be a program name with args.
-set dummy ${DOXYGEN}; ac_word=$2
+  withval=$with_doxygen;       efl_doxygen=${withval}
+       # Extract the first word of "${efl_doxygen}", so it can be a program name with args.
+set dummy ${efl_doxygen}; ac_word=$2
 { echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_BUILD_DOCS+set}" = set; then
+if test "${ac_cv_prog_efl_have_doxygen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$BUILD_DOCS"; then
-  ac_cv_prog_BUILD_DOCS="$BUILD_DOCS" # Let the user override the test.
+  if test -n "$efl_have_doxygen"; then
+  ac_cv_prog_efl_have_doxygen="$efl_have_doxygen" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -15253,7 +15258,7 @@ do
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_BUILD_DOCS="yes"
+    ac_cv_prog_efl_have_doxygen="yes"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -15261,39 +15266,39 @@ done
 done
 IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_BUILD_DOCS" && ac_cv_prog_BUILD_DOCS="no"
+  test -z "$ac_cv_prog_efl_have_doxygen" && ac_cv_prog_efl_have_doxygen="no"
 fi
 fi
-BUILD_DOCS=$ac_cv_prog_BUILD_DOCS
-if test -n "$BUILD_DOCS"; then
-  { echo "$as_me:$LINENO: result: $BUILD_DOCS" >&5
-echo "${ECHO_T}$BUILD_DOCS" >&6; }
+efl_have_doxygen=$ac_cv_prog_efl_have_doxygen
+if test -n "$efl_have_doxygen"; then
+  { echo "$as_me:$LINENO: result: $efl_have_doxygen" >&5
+echo "${ECHO_T}$efl_have_doxygen" >&6; }
 else
   { echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6; }
 fi
 
 
-    if test "x${BUILD_DOCS}" = "xno" ; then
-       echo "WARNING:"
-       echo "The doxygen program you specified:"
-       echo "$DOXYGEN"
-       echo "was not found.  Please check the path and make sure "
-       echo "the program exists and is executable."
-       { echo "$as_me:$LINENO: WARNING: Warning: no doxygen detected. Documentation will not be built" >&5
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program you specified:"
+          echo "$efl_doxygen"
+          echo "was not found.  Please check the path and make sure "
+          echo "the program exists and is executable."
+          { echo "$as_me:$LINENO: WARNING: Warning: no doxygen detected. Documentation will not be built" >&5
 echo "$as_me: WARNING: Warning: no doxygen detected. Documentation will not be built" >&2;}
-    fi
+       fi
 
 else
-  # Extract the first word of "${DOXYGEN}", so it can be a program name with args.
-set dummy ${DOXYGEN}; ac_word=$2
+  # Extract the first word of "${efl_doxygen}", so it can be a program name with args.
+set dummy ${efl_doxygen}; ac_word=$2
 { echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_BUILD_DOCS+set}" = set; then
+if test "${ac_cv_prog_efl_have_doxygen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$BUILD_DOCS"; then
-  ac_cv_prog_BUILD_DOCS="$BUILD_DOCS" # Let the user override the test.
+  if test -n "$efl_have_doxygen"; then
+  ac_cv_prog_efl_have_doxygen="$efl_have_doxygen" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -15302,7 +15307,7 @@ do
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_BUILD_DOCS="yes"
+    ac_cv_prog_efl_have_doxygen="yes"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -15310,39 +15315,44 @@ done
 done
 IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_BUILD_DOCS" && ac_cv_prog_BUILD_DOCS="no"
+  test -z "$ac_cv_prog_efl_have_doxygen" && ac_cv_prog_efl_have_doxygen="no"
 fi
 fi
-BUILD_DOCS=$ac_cv_prog_BUILD_DOCS
-if test -n "$BUILD_DOCS"; then
-  { echo "$as_me:$LINENO: result: $BUILD_DOCS" >&5
-echo "${ECHO_T}$BUILD_DOCS" >&6; }
+efl_have_doxygen=$ac_cv_prog_efl_have_doxygen
+if test -n "$efl_have_doxygen"; then
+  { echo "$as_me:$LINENO: result: $efl_have_doxygen" >&5
+echo "${ECHO_T}$efl_have_doxygen" >&6; }
 else
   { echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6; }
 fi
 
 
-    if test "x${BUILD_DOCS}" = "xno" ; then
-       echo "WARNING:"
-       echo "The doxygen program was not found in your execute"
-       echo "You may have doxygen installed somewhere not covered by your path."
-       echo ""
-       echo "If this is the case make sure you have the packages installed, AND"
-       echo "that the doxygen program is in your execute path (see your"
-       echo "shell manual page on setting the \$PATH environment variable), OR"
-       echo "alternatively, specify the program to use with --with-doxygen."
-       { echo "$as_me:$LINENO: WARNING: Warning: no doxygen detected. Documentation will not be built" >&5
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program was not found in your execute"
+          echo "You may have doxygen installed somewhere not covered by your path."
+          echo ""
+          echo "If this is the case make sure you have the packages installed, AND"
+          echo "that the doxygen program is in your execute path (see your"
+          echo "shell manual page on setting the \$PATH environment variable), OR"
+          echo "alternatively, specify the program to use with --with-doxygen."
+          { echo "$as_me:$LINENO: WARNING: Warning: no doxygen detected. Documentation will not be built" >&5
 echo "$as_me: WARNING: Warning: no doxygen detected. Documentation will not be built" >&2;}
-    fi
+       fi
+
 
+fi
 
 fi
 
 
 
+if ! test "x${efl_have_doxygen}" = "xyes" ; then
+   efl_enable_doc="no"
+fi
 
- if test "x${BUILD_DOCS}" = "xyes"; then
+ if test "x${efl_enable_doc}" = "xyes"; then
   EFL_BUILD_DOC_TRUE=
   EFL_BUILD_DOC_FALSE='#'
 else
@@ -15351,7 +15361,7 @@ else
 fi
 
 
-if test "x${BUILD_DOCS}" = "xyes" ; then
+if test "x${efl_enable_doc}" = "xyes" ; then
   build_doc="yes"
 else
   build_doc="no"
@@ -16328,16 +16338,16 @@ cat >>conftest.$ac_ext <<_ACEOF
 
 #include <stdlib.h>
 
-int
-main ()
-{
-
 int func(int x);
 int foo(int x __attribute__ ((unused)))
 {
    exit(1);
 }
 
+int
+main ()
+{
+
   ;
   return 0;
 }
@@ -17733,8 +17743,8 @@ ECORE_FILE_CFLAGS!$ECORE_FILE_CFLAGS$ac_delim
 ECORE_FILE_LIBS!$ECORE_FILE_LIBS$ac_delim
 ECORE_EVAS_CFLAGS!$ECORE_EVAS_CFLAGS$ac_delim
 ECORE_EVAS_LIBS!$ECORE_EVAS_LIBS$ac_delim
-BUILD_DOCS!$BUILD_DOCS$ac_delim
-DOXYGEN!$DOXYGEN$ac_delim
+efl_have_doxygen!$efl_have_doxygen$ac_delim
+efl_doxygen!$efl_doxygen$ac_delim
 EFL_BUILD_DOC_TRUE!$EFL_BUILD_DOC_TRUE$ac_delim
 EFL_BUILD_DOC_FALSE!$EFL_BUILD_DOC_FALSE$ac_delim
 PYTHON!$PYTHON$ac_delim
diff --git a/data/Makefile.in b/data/Makefile.in
index 742b844..2e9d029 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -65,7 +65,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -75,7 +74,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -152,6 +150,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
diff --git a/data/include/Makefile.in b/data/include/Makefile.in
index 6f59e07..dafa8c8 100644
--- a/data/include/Makefile.in
+++ b/data/include/Makefile.in
@@ -63,7 +63,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -73,7 +72,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -150,6 +148,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
diff --git a/doc/Makefile.am b/doc/Makefile.am
index e6df3fb..a72dd04 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -13,7 +13,7 @@ doc-clean:
 doc: all doc-clean
 	cat ../src/lib/Edje.h >> ./edje.dox
 	cat `find ../src/lib -name "*.c" -fprint /dev/stdout | grep -v edje_edit.c` >> edje.dox
-	$(DOXYGEN)
+	$(efl_doxygen)
 	cp img/* html/
 	rm -rf $(PACKAGE_DOCNAME).tar*
 	mkdir -p $(PACKAGE_DOCNAME)/doc
@@ -32,4 +32,4 @@ doc:
 
 endif
 
-EXTRA_DIST = Doxyfile e.css foot.html head.html img/ edje.dox.in
+EXTRA_DIST = Doxyfile e.css foot.html head.html img edje.dox.in
diff --git a/doc/Makefile.in b/doc/Makefile.in
index 3f3796d..3da464b 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -54,7 +54,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -64,7 +63,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -141,6 +139,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
@@ -179,7 +179,7 @@ version_info = @version_info@
 vimdir = @vimdir@
 MAINTAINERCLEANFILES = Makefile.in edje.dox
 PACKAGE_DOCNAME = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-doc
-EXTRA_DIST = Doxyfile e.css foot.html head.html img/ edje.dox.in
+EXTRA_DIST = Doxyfile e.css foot.html head.html img edje.dox.in
 all: all-am
 
 .SUFFIXES:
@@ -360,7 +360,7 @@ uninstall-am:
 @EFL_BUILD_DOC_TRUE at doc: all doc-clean
 @EFL_BUILD_DOC_TRUE@	cat ../src/lib/Edje.h >> ./edje.dox
 @EFL_BUILD_DOC_TRUE@	cat `find ../src/lib -name "*.c" -fprint /dev/stdout | grep -v edje_edit.c` >> edje.dox
- at EFL_BUILD_DOC_TRUE@	$(DOXYGEN)
+ at EFL_BUILD_DOC_TRUE@	$(efl_doxygen)
 @EFL_BUILD_DOC_TRUE@	cp img/* html/
 @EFL_BUILD_DOC_TRUE@	rm -rf $(PACKAGE_DOCNAME).tar*
 @EFL_BUILD_DOC_TRUE@	mkdir -p $(PACKAGE_DOCNAME)/doc
diff --git a/doc/img/.svn/all-wcprops b/doc/img/.svn/all-wcprops
deleted file mode 100644
index 15ebada..0000000
--- a/doc/img/.svn/all-wcprops
+++ /dev/null
@@ -1,83 +0,0 @@
-K 25
-svn:wc:ra_dav:version-url
-V 40
-/svn/e/!svn/ver/35554/trunk/edje/doc/img
-END
-n.png
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/n.png
-END
-hilite.png
-K 25
-svn:wc:ra_dav:version-url
-V 51
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/hilite.png
-END
-n.gif
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/e/!svn/ver/35525/trunk/edje/doc/img/n.gif
-END
-_.gif
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/e/!svn/ver/35525/trunk/edje/doc/img/_.gif
-END
-edje_small.png
-K 25
-svn:wc:ra_dav:version-url
-V 55
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/edje_small.png
-END
-tl.png
-K 25
-svn:wc:ra_dav:version-url
-V 47
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/tl.png
-END
-tl.gif
-K 25
-svn:wc:ra_dav:version-url
-V 47
-/svn/e/!svn/ver/35525/trunk/edje/doc/img/tl.gif
-END
-b.png
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/b.png
-END
-edje_mini.png
-K 25
-svn:wc:ra_dav:version-url
-V 54
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/edje_mini.png
-END
-t.png
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/t.png
-END
-t.gif
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/e/!svn/ver/35525/trunk/edje/doc/img/t.gif
-END
-edje.png
-K 25
-svn:wc:ra_dav:version-url
-V 49
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/edje.png
-END
-edje_big.png
-K 25
-svn:wc:ra_dav:version-url
-V 53
-/svn/e/!svn/ver/35554/trunk/edje/doc/img/edje_big.png
-END
diff --git a/doc/img/.svn/entries b/doc/img/.svn/entries
deleted file mode 100644
index a5daacb..0000000
--- a/doc/img/.svn/entries
+++ /dev/null
@@ -1,470 +0,0 @@
-9
-
-dir
-37947
-http://svn.enlightenment.org/svn/e/trunk/edje/doc/img
-http://svn.enlightenment.org/svn/e
-
-
-
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-
-
-svn:special svn:externals svn:needs-lock
-
-
-
-
-
-
-
-
-
-
-
-7cbeb6ba-43b4-40fd-8cce-4c39aea84d33
-
-n.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-97b082a5b85bcebdd9e40243341abd1a
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2059
-
-hilite.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-6b81960a8b3aac36fc23edc2b49521f1
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-6127
-
-n.gif
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-11382cd2537e4e82b5a4917be0f93885
-2008-08-18T00:02:26.845227Z
-35525
-raster
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1700
-
-_.gif
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-deba11790ee42504e196a23ba7c46629
-2008-08-18T00:02:26.845227Z
-35525
-raster
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-266
-
-edje_small.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-c58186fe796c5d9dbe53b5279dbd02cc
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3755
-
-tl.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-3cd2211783c0debdf97c3aaa5f63d378
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-88380
-
-tl.gif
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-4465d3058bbfac6eaa7eba0f82dea8b8
-2008-08-18T00:02:26.845227Z
-35525
-raster
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-74210
-
-b.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-5ffc744540139b7b98c3dfadab7f60d2
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-40325
-
-edje_mini.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-960dd6157e871522120d3ad941014e03
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-753
-
-t.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-083721350aa102487d85772117a29604
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-317
-
-t.gif
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-3c38505146414e60e383513b572adc47
-2008-08-18T00:02:26.845227Z
-35525
-raster
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-979
-
-edje.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-f5d6487eff9f183f458ca942a7fb8545
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-74944
-
-edje_big.png
-file
-
-
-
-
-2008-12-07T12:38:32.000000Z
-28c2954de7aee253cc1dffb92dfdb9bc
-2008-08-18T16:42:08.490845Z
-35554
-barbieri
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-937116
-
diff --git a/doc/img/.svn/format b/doc/img/.svn/format
deleted file mode 100644
index ec63514..0000000
--- a/doc/img/.svn/format
+++ /dev/null
@@ -1 +0,0 @@
-9
diff --git a/doc/img/.svn/prop-base/_.gif.svn-base b/doc/img/.svn/prop-base/_.gif.svn-base
deleted file mode 100644
index 5e9587e..0000000
--- a/doc/img/.svn/prop-base/_.gif.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 24
-application/octet-stream
-END
diff --git a/doc/img/.svn/prop-base/b.png.svn-base b/doc/img/.svn/prop-base/b.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/b.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/edje.png.svn-base b/doc/img/.svn/prop-base/edje.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/edje.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/edje_big.png.svn-base b/doc/img/.svn/prop-base/edje_big.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/edje_big.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/edje_mini.png.svn-base b/doc/img/.svn/prop-base/edje_mini.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/edje_mini.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/edje_small.png.svn-base b/doc/img/.svn/prop-base/edje_small.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/edje_small.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/hilite.png.svn-base b/doc/img/.svn/prop-base/hilite.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/hilite.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/n.gif.svn-base b/doc/img/.svn/prop-base/n.gif.svn-base
deleted file mode 100644
index 5e9587e..0000000
--- a/doc/img/.svn/prop-base/n.gif.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 24
-application/octet-stream
-END
diff --git a/doc/img/.svn/prop-base/n.png.svn-base b/doc/img/.svn/prop-base/n.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/n.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/t.gif.svn-base b/doc/img/.svn/prop-base/t.gif.svn-base
deleted file mode 100644
index 5e9587e..0000000
--- a/doc/img/.svn/prop-base/t.gif.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 24
-application/octet-stream
-END
diff --git a/doc/img/.svn/prop-base/t.png.svn-base b/doc/img/.svn/prop-base/t.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/t.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/prop-base/tl.gif.svn-base b/doc/img/.svn/prop-base/tl.gif.svn-base
deleted file mode 100644
index 5e9587e..0000000
--- a/doc/img/.svn/prop-base/tl.gif.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 24
-application/octet-stream
-END
diff --git a/doc/img/.svn/prop-base/tl.png.svn-base b/doc/img/.svn/prop-base/tl.png.svn-base
deleted file mode 100644
index 6f145ce..0000000
--- a/doc/img/.svn/prop-base/tl.png.svn-base
+++ /dev/null
@@ -1,5 +0,0 @@
-K 13
-svn:mime-type
-V 9
-image/png
-END
diff --git a/doc/img/.svn/text-base/_.gif.svn-base b/doc/img/.svn/text-base/_.gif.svn-base
deleted file mode 100644
index 60fa7a1..0000000
Binary files a/doc/img/.svn/text-base/_.gif.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/b.png.svn-base b/doc/img/.svn/text-base/b.png.svn-base
deleted file mode 100644
index 6fbfc2b..0000000
Binary files a/doc/img/.svn/text-base/b.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/edje.png.svn-base b/doc/img/.svn/text-base/edje.png.svn-base
deleted file mode 100644
index 47597a8..0000000
Binary files a/doc/img/.svn/text-base/edje.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/edje_big.png.svn-base b/doc/img/.svn/text-base/edje_big.png.svn-base
deleted file mode 100644
index cd818f7..0000000
Binary files a/doc/img/.svn/text-base/edje_big.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/edje_mini.png.svn-base b/doc/img/.svn/text-base/edje_mini.png.svn-base
deleted file mode 100644
index f4f99f0..0000000
Binary files a/doc/img/.svn/text-base/edje_mini.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/edje_small.png.svn-base b/doc/img/.svn/text-base/edje_small.png.svn-base
deleted file mode 100644
index 8bea367..0000000
Binary files a/doc/img/.svn/text-base/edje_small.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/hilite.png.svn-base b/doc/img/.svn/text-base/hilite.png.svn-base
deleted file mode 100644
index 88a4381..0000000
Binary files a/doc/img/.svn/text-base/hilite.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/n.gif.svn-base b/doc/img/.svn/text-base/n.gif.svn-base
deleted file mode 100644
index 8c3148f..0000000
Binary files a/doc/img/.svn/text-base/n.gif.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/n.png.svn-base b/doc/img/.svn/text-base/n.png.svn-base
deleted file mode 100644
index 6d80004..0000000
Binary files a/doc/img/.svn/text-base/n.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/t.gif.svn-base b/doc/img/.svn/text-base/t.gif.svn-base
deleted file mode 100644
index cff3068..0000000
Binary files a/doc/img/.svn/text-base/t.gif.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/t.png.svn-base b/doc/img/.svn/text-base/t.png.svn-base
deleted file mode 100644
index 5a40479..0000000
Binary files a/doc/img/.svn/text-base/t.png.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/tl.gif.svn-base b/doc/img/.svn/text-base/tl.gif.svn-base
deleted file mode 100644
index c5e973a..0000000
Binary files a/doc/img/.svn/text-base/tl.gif.svn-base and /dev/null differ
diff --git a/doc/img/.svn/text-base/tl.png.svn-base b/doc/img/.svn/text-base/tl.png.svn-base
deleted file mode 100644
index b14a7f1..0000000
Binary files a/doc/img/.svn/text-base/tl.png.svn-base and /dev/null differ
diff --git a/m4/ac_attribute.m4 b/m4/ac_attribute.m4
index e0df55d..3926d23 100644
--- a/m4/ac_attribute.m4
+++ b/m4/ac_attribute.m4
@@ -1,7 +1,9 @@
+dnl Copyright (C) 2004-2008 Kim Woelders
 dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
 dnl That code is public domain and can be freely used or copied.
+dnl Originally snatched from somewhere...
 
-dnl Macro that check if the compiler supports __atribute__
+dnl Macro for checking if the compiler supports __attribute__
 
 dnl Usage: AC_C___ATTRIBUTE__
 dnl call AC_DEFINE for HAVE___ATTRIBUTE__ and __UNUSED__
@@ -19,14 +21,14 @@ AC_CACHE_VAL([ac_cv___attribute__],
    [AC_TRY_COMPILE(
        [
 #include <stdlib.h>
-       ],
-       [
+
 int func(int x);
 int foo(int x __attribute__ ((unused)))
 {
    exit(1);
 }
        ],
+       [],
        [ac_cv___attribute__="yes"],
        [ac_cv___attribute__="no"]
     )]
@@ -36,9 +38,9 @@ AC_MSG_RESULT($ac_cv___attribute__)
 
 if test "x${ac_cv___attribute__}" = "xyes" ; then
    AC_DEFINE([HAVE___ATTRIBUTE__], [1], [Define to 1 if your compiler has __attribute__])
-   AC_DEFINE([__UNUSED__], [__attribute__((unused))], [Define to __attribute__((unused)) if your compiler has __attribute__])
+   AC_DEFINE([__UNUSED__], [__attribute__((unused))], [Macro declaring a function argument to be unused])
   else
-    AC_DEFINE([__UNUSED__], [], [Define to nothing if your compiler does not support __attribute__])
+    AC_DEFINE([__UNUSED__], [], [Macro declaring a function argument to be unused])
 fi
 
 ])
diff --git a/m4/efl_doxygen.m4 b/m4/efl_doxygen.m4
index 49a3dfa..0c1452f 100644
--- a/m4/efl_doxygen.m4
+++ b/m4/efl_doxygen.m4
@@ -5,79 +5,89 @@ dnl Macro that check if doxygen is available or not.
 
 dnl EFL_CHECK_DOXYGEN([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
 dnl Test for the doxygen program
-dnl Defines DOXYGEN
+dnl Defines efl_doxygen
 dnl Defines the automake conditionnal EFL_BUILD_DOC
 dnl
 AC_DEFUN([EFL_CHECK_DOXYGEN],
 [
 
-DOXYGEN="doxygen"
-
 dnl
 dnl Disable the build of the documentation
 dnl
 AC_ARG_ENABLE([doc],
-   AC_HELP_STRING(
-      [--disable-doc],
-      [Disable the build of the documentation]),
-   [if test "${disable_doc}" = "yes" ; then
-       enable_doc="no"
+   [AC_HELP_STRING(
+       [--disable-doc],
+       [Disable documentation build @<:@default=enabled@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       efl_enable_doc="yes"
     else
-       enable_doc="yes"
-    fi],
-   [enable_doc="yes"]
+       efl_enable_doc="no"
+    fi
+   ],
+   [efl_enable_doc="yes"]
 )
 
+if test "x${efl_enable_doc}" = "xyes" ; then
+
 dnl
 dnl Specify the full file name, with path
 dnl
-AC_ARG_WITH([doxygen],
-   AC_HELP_STRING(
-      [--with-doxygen=FILE],
-      [doxygen program to use @<:@default=doxygen@:>@]),
-   dnl
-   dnl Check the given doxygen program.
-   dnl
-   [DOXYGEN=${withval}
-    AC_CHECK_PROG([BUILD_DOCS],
-       [${DOXYGEN}],
-       [yes],
-       [no])
-    if test "x${BUILD_DOCS}" = "xno" ; then
-       echo "WARNING:"
-       echo "The doxygen program you specified:"
-       echo "$DOXYGEN"
-       echo "was not found.  Please check the path and make sure "
-       echo "the program exists and is executable."
-       AC_MSG_WARN([Warning: no doxygen detected. Documentation will not be built])
-    fi
-   ],
-   [AC_CHECK_PROG([BUILD_DOCS],
-       [${DOXYGEN}],
-       [yes],
-       [no])
-    if test "x${BUILD_DOCS}" = "xno" ; then
-       echo "WARNING:"
-       echo "The doxygen program was not found in your execute"
-       echo "You may have doxygen installed somewhere not covered by your path."
-       echo ""
-       echo "If this is the case make sure you have the packages installed, AND"
-       echo "that the doxygen program is in your execute path (see your"
-       echo "shell manual page on setting the \$PATH environment variable), OR"
-       echo "alternatively, specify the program to use with --with-doxygen."
-       AC_MSG_WARN([Warning: no doxygen detected. Documentation will not be built])
-    fi
-   ]
-)
+
+   efl_doxygen="doxygen"
+
+   AC_ARG_WITH([doxygen],
+      [AC_HELP_STRING(
+          [--with-doxygen=FILE],
+          [doxygen program to use @<:@default=doxygen@:>@])],
+dnl
+dnl Check the given doxygen program.
+dnl
+      [efl_doxygen=${withval}
+       AC_CHECK_PROG([efl_have_doxygen],
+          [${efl_doxygen}],
+          [yes],
+          [no])
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program you specified:"
+          echo "$efl_doxygen"
+          echo "was not found.  Please check the path and make sure "
+          echo "the program exists and is executable."
+          AC_MSG_WARN([Warning: no doxygen detected. Documentation will not be built])
+       fi
+      ],
+      [AC_CHECK_PROG([efl_have_doxygen],
+          [${efl_doxygen}],
+          [yes],
+          [no])
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program was not found in your execute"
+          echo "You may have doxygen installed somewhere not covered by your path."
+          echo ""
+          echo "If this is the case make sure you have the packages installed, AND"
+          echo "that the doxygen program is in your execute path (see your"
+          echo "shell manual page on setting the \$PATH environment variable), OR"
+          echo "alternatively, specify the program to use with --with-doxygen."
+          AC_MSG_WARN([Warning: no doxygen detected. Documentation will not be built])
+       fi
+      ]
+   )
+fi
 
 dnl
 dnl Substitution
 dnl
-AC_SUBST([DOXYGEN])
+AC_SUBST([efl_doxygen])
+
+if ! test "x${efl_have_doxygen}" = "xyes" ; then
+   efl_enable_doc="no"
+fi
 
-AM_CONDITIONAL(EFL_BUILD_DOC, test "x${BUILD_DOCS}" = "xyes")
+AM_CONDITIONAL(EFL_BUILD_DOC, test "x${efl_enable_doc}" = "xyes")
 
-if test "x${BUILD_DOCS}" = "xyes" ; then
+if test "x${efl_enable_doc}" = "xyes" ; then
   ifelse([$1], , :, [$1])
 else
   ifelse([$2], , :, [$2])
diff --git a/src/Makefile.in b/src/Makefile.in
index a52c049..8346e15 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -65,7 +65,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -75,7 +74,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -152,6 +150,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
diff --git a/src/bin/Makefile.in b/src/bin/Makefile.in
index 7e8e7eb..fd2aa2c 100644
--- a/src/bin/Makefile.in
+++ b/src/bin/Makefile.in
@@ -97,7 +97,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -107,7 +106,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -184,6 +182,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
diff --git a/src/bin/edje_cc_handlers.c b/src/bin/edje_cc_handlers.c
index 3cfa028..44a1d94 100644
--- a/src/bin/edje_cc_handlers.c
+++ b/src/bin/edje_cc_handlers.c
@@ -110,6 +110,7 @@ static void st_collections_group_parts_part_dragable_y(void);
 static void st_collections_group_parts_part_dragable_confine(void);
 static void st_collections_group_parts_part_dragable_events(void);
 
+/* box and table items share these */
 static void ob_collections_group_parts_part_box_items_item(void);
 static void st_collections_group_parts_part_box_items_item_type(void);
 static void st_collections_group_parts_part_box_items_item_name(void);
@@ -123,6 +124,9 @@ static void st_collections_group_parts_part_box_items_item_weight(void);
 static void st_collections_group_parts_part_box_items_item_aspect(void);
 static void st_collections_group_parts_part_box_items_item_aspect_mode(void);
 static void st_collections_group_parts_part_box_items_item_options(void);
+/* but these are only for table */
+static void st_collections_group_parts_part_table_items_item_position(void);
+static void st_collections_group_parts_part_table_items_item_span(void);
 
 static void ob_collections_group_parts_part_description(void);
 static void st_collections_group_parts_part_description_inherit(void);
@@ -183,6 +187,9 @@ static void st_collections_group_parts_part_description_gradient_rel2_offset(voi
 static void st_collections_group_parts_part_description_box_layout(void);
 static void st_collections_group_parts_part_description_box_align(void);
 static void st_collections_group_parts_part_description_box_padding(void);
+static void st_collections_group_parts_part_description_table_homogeneous(void);
+static void st_collections_group_parts_part_description_table_align(void);
+static void st_collections_group_parts_part_description_table_padding(void);
 
 static void ob_collections_group_programs_program(void);
 static void st_collections_group_programs_program_name(void);
@@ -299,6 +306,20 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.parts.part.box.items.item.aspect", st_collections_group_parts_part_box_items_item_aspect},
      {"collections.group.parts.part.box.items.item.aspect_mode", st_collections_group_parts_part_box_items_item_aspect_mode},
      {"collections.group.parts.part.box.items.item.options", st_collections_group_parts_part_box_items_item_options},
+     {"collections.group.parts.part.table.items.item.type", st_collections_group_parts_part_box_items_item_type}, /* dup */
+     {"collections.group.parts.part.table.items.item.name", st_collections_group_parts_part_box_items_item_name}, /* dup */
+     {"collections.group.parts.part.table.items.item.source", st_collections_group_parts_part_box_items_item_source}, /* dup */
+     {"collections.group.parts.part.table.items.item.min", st_collections_group_parts_part_box_items_item_min}, /* dup */
+     {"collections.group.parts.part.table.items.item.prefer", st_collections_group_parts_part_box_items_item_prefer}, /* dup */
+     {"collections.group.parts.part.table.items.item.max", st_collections_group_parts_part_box_items_item_max}, /* dup */
+     {"collections.group.parts.part.table.items.item.padding", st_collections_group_parts_part_box_items_item_padding}, /* dup */
+     {"collections.group.parts.part.table.items.item.align", st_collections_group_parts_part_box_items_item_align}, /* dup */
+     {"collections.group.parts.part.table.items.item.weight", st_collections_group_parts_part_box_items_item_weight}, /* dup */
+     {"collections.group.parts.part.table.items.item.aspect", st_collections_group_parts_part_box_items_item_aspect}, /* dup */
+     {"collections.group.parts.part.table.items.item.aspect_mode", st_collections_group_parts_part_box_items_item_aspect_mode}, /* dup */
+     {"collections.group.parts.part.table.items.item.options", st_collections_group_parts_part_box_items_item_options}, /* dup */
+     {"collections.group.parts.part.table.items.item.position", st_collections_group_parts_part_table_items_item_position},
+     {"collections.group.parts.part.table.items.item.span", st_collections_group_parts_part_table_items_item_span},
      {"collections.group.parts.part.description.inherit", st_collections_group_parts_part_description_inherit},
      {"collections.group.parts.part.description.state", st_collections_group_parts_part_description_state},
      {"collections.group.parts.part.description.visible", st_collections_group_parts_part_description_visible},
@@ -361,6 +382,9 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.parts.part.description.box.layout", st_collections_group_parts_part_description_box_layout},
      {"collections.group.parts.part.description.box.align", st_collections_group_parts_part_description_box_align},
      {"collections.group.parts.part.description.box.padding", st_collections_group_parts_part_description_box_padding},
+     {"collections.group.parts.part.description.table.homogeneous", st_collections_group_parts_part_description_table_homogeneous},
+     {"collections.group.parts.part.description.table.align", st_collections_group_parts_part_description_table_align},
+     {"collections.group.parts.part.description.table.padding", st_collections_group_parts_part_description_table_padding},
      {"collections.group.parts.part.description.images.image", st_images_image}, /* dup */
      {"collections.group.parts.part.description.font", st_fonts_font}, /* dup */
      {"collections.group.parts.part.description.fonts.font", st_fonts_font}, /* dup */
@@ -498,6 +522,9 @@ New_Object_Handler object_handlers[] =
      {"collections.group.parts.part.box", NULL},
      {"collections.group.parts.part.box.items", NULL},
      {"collections.group.parts.part.box.items.item", ob_collections_group_parts_part_box_items_item},
+     {"collections.group.parts.part.table", NULL},
+     {"collections.group.parts.part.table.items", NULL},
+     {"collections.group.parts.part.table.items.item", ob_collections_group_parts_part_box_items_item}, /* dup */
      {"collections.group.parts.part.description", ob_collections_group_parts_part_description},
      {"collections.group.parts.part.description.rel1", NULL},
      {"collections.group.parts.part.description.rel2", NULL},
@@ -516,6 +543,7 @@ New_Object_Handler object_handlers[] =
      {"collections.group.parts.part.description.gradient.rel1", NULL},
      {"collections.group.parts.part.description.gradient.rel2", NULL},
      {"collections.group.parts.part.description.box", NULL},
+     {"collections.group.parts.part.description.table", NULL},
      {"collections.group.parts.part.description.color_classes", NULL}, /* dup */
      {"collections.group.parts.part.description.color_classes.color_class", ob_color_class}, /* dup */
      {"collections.group.parts.part.description.program", ob_collections_group_programs_program}, /* dup */
@@ -1593,6 +1621,7 @@ st_collections_group_parts_part_name(void)
             @li GRADIENT
             @li GROUP
             @li BOX
+            @li TABLE
     @endproperty
 */
 static void
@@ -1615,6 +1644,7 @@ st_collections_group_parts_part_type(void)
 			 "GRADIENT", EDJE_PART_TYPE_GRADIENT,
 			 "GROUP", EDJE_PART_TYPE_GROUP,
 			 "BOX", EDJE_PART_TYPE_BOX,
+			 "TABLE", EDJE_PART_TYPE_TABLE,
 			 NULL);
 }
 
@@ -2081,7 +2111,7 @@ st_collections_group_parts_part_entry_mode(void)
 			       "NONE", EDJE_ENTRY_EDIT_MODE_NONE,
 			       "PLAIN", EDJE_ENTRY_EDIT_MODE_SELECTABLE,
 			       "EDITABLE", EDJE_ENTRY_EDIT_MODE_EDITABLE,
-			       "PASSOWRD", EDJE_ENTRY_EDIT_MODE_PASSWORD,
+			       "PASSWORD", EDJE_ENTRY_EDIT_MODE_PASSWORD,
 			       NULL);
 }
 
@@ -2294,10 +2324,10 @@ static void ob_collections_group_parts_part_box_items_item(void)
    pc = eina_list_data_get(eina_list_last(edje_collections));
    ep = eina_list_data_get(eina_list_last(pc->parts));
 
-   if (ep->type != EDJE_PART_TYPE_BOX)
+   if ((ep->type != EDJE_PART_TYPE_BOX) && (ep->type != EDJE_PART_TYPE_TABLE))
      {
 	fprintf(stderr, "%s: Error. parse error %s:%i. "
-		"box attributes in non-BOX part.\n",
+		"box attributes in non-BOX or TABLE part.\n",
 		progname, file_in, line - 1);
 	exit(-1);
      }
@@ -2325,6 +2355,10 @@ static void ob_collections_group_parts_part_box_items_item(void)
    item->aspect.h = 0;
    item->aspect.mode = EDJE_ASPECT_PREFER_NONE;
    item->options = NULL;
+   item->col = -1;
+   item->row = -1;
+   item->colspan = 1;
+   item->rowspan = 1;
 }
 
 /**
@@ -2657,6 +2691,76 @@ static void st_collections_group_parts_part_box_items_item_options(void)
 
 /**
     @page edcref
+    @property
+        position
+    @parameters
+        [col] [row]
+    @effect
+        Sets the position this item will have in the table.
+        This is required for parts of type TABLE.
+    @endproperty
+*/
+static void st_collections_group_parts_part_table_items_item_position(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Pack_Element *item;
+
+   check_arg_count(2);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->parts));
+
+   if (ep->type != EDJE_PART_TYPE_TABLE)
+     {
+	fprintf(stderr, "%s: Error. parse error %s:%i. "
+		"table attributes in non-TABLE part.\n",
+		progname, file_in, line - 1);
+	exit(-1);
+     }
+
+   item = eina_list_data_get(eina_list_last(ep->items));
+   item->col = parse_int_range(0, 0, 0xffff);
+   item->row = parse_int_range(1, 0, 0xffff);
+}
+
+/**
+    @page edcref
+    @property
+        span
+    @parameters
+        [col] [row]
+    @effect
+        Sets how many columns/rows this item will use.
+        Defaults to 1 1.
+    @endproperty
+*/
+static void st_collections_group_parts_part_table_items_item_span(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Pack_Element *item;
+
+   check_arg_count(2);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->parts));
+
+   if (ep->type != EDJE_PART_TYPE_TABLE)
+     {
+	fprintf(stderr, "%s: Error. parse error %s:%i. "
+		"table attributes in non-TABLE part.\n",
+		progname, file_in, line - 1);
+	exit(-1);
+     }
+
+   item = eina_list_data_get(eina_list_last(ep->items));
+   item->colspan = parse_int_range(0, 1, 0xffff);
+   item->rowspan = parse_int_range(1, 1, 0xffff);
+}
+
+/**
+    @page edcref
     @block
         description
     @context
@@ -2764,6 +2868,11 @@ ob_collections_group_parts_part_description(void)
    ed->box.align.y = 0.5;
    ed->box.padding.x = 0;
    ed->box.padding.y = 0;
+   ed->table.homogeneous = EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE;
+   ed->table.align.x = 0.5;
+   ed->table.align.y = 0.5;
+   ed->table.padding.x = 0;
+   ed->table.padding.y = 0;
 }
 
 /**
@@ -2787,7 +2896,8 @@ st_collections_group_parts_part_description_inherit(void)
    Edje_Part_Description *ed, *parent = NULL;
    Eina_List *l;
    Edje_Part_Image_Id *iid;
-   char *parent_name, *state_name;
+   char *parent_name;
+   const char *state_name;
    double parent_val, state_val;
 
    check_arg_count(2);
@@ -5057,6 +5167,135 @@ static void st_collections_group_parts_part_description_box_padding(void)
 
 /**
     @page edcref
+
+    @block
+        table
+    @context
+        part {
+            description {
+                ..
+                table {
+                    homogeneous: TABLE;
+                    padding: 0 2;
+                    align: 0.5 0.5;
+                }
+                ..
+            }
+        }
+    @description
+        A table block can contain other objects packed in multiple columns
+        and rows, and each item can span across more than one column and/or
+        row.
+    @endblock
+
+    @property
+        homogeneous
+    @parameters
+        [homogeneous mode]
+    @effect
+        Sets the homogeneous mode for the table:
+            @li NONE (default)
+            @li TABLE
+            @li ITEM
+    @endproperty
+
+    @property
+        align
+    @parameters
+        [horizontal] [vertical]
+    @effect
+        Change the position of the point of balance inside the container. The
+        default value is 0.5 0.5.
+    @endproperty
+
+    @property
+        padding
+    @parameters
+        [horizontal] [vertical]
+    @effect
+        Sets the space between cells in pixels. Defaults to 0 0.
+    @endproperty
+*/
+static void st_collections_group_parts_part_description_table_homogeneous(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description *ed;
+
+   check_min_arg_count(1);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->parts));
+
+   if (ep->type != EDJE_PART_TYPE_TABLE)
+     {
+	fprintf(stderr, "%s: Error. parse error %s:%i. "
+		"table attributes in non-TABLE part.\n",
+		progname, file_in, line - 1);
+	exit(-1);
+     }
+
+   ed = ep->default_desc;
+   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed->table.homogeneous = parse_enum(0,
+				     "NONE", EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE,
+				     "TABLE", EDJE_OBJECT_TABLE_HOMOGENEOUS_TABLE,
+				     "ITEM", EDJE_OBJECT_TABLE_HOMOGENEOUS_ITEM,
+				     NULL);
+}
+
+static void st_collections_group_parts_part_description_table_align(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description *ed;
+
+   check_arg_count(2);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->parts));
+
+   if (ep->type != EDJE_PART_TYPE_TABLE)
+     {
+	fprintf(stderr, "%s: Error. parse error %s:%i. "
+		"table attributes in non-TABLE part.\n",
+		progname, file_in, line - 1);
+	exit(-1);
+     }
+
+   ed = ep->default_desc;
+   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed->table.align.x = parse_float_range(0, -1.0, 1.0);
+   ed->table.align.y = parse_float_range(1, -1.0, 1.0);
+}
+
+static void st_collections_group_parts_part_description_table_padding(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description *ed;
+
+   check_arg_count(2);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->parts));
+
+   if (ep->type != EDJE_PART_TYPE_TABLE)
+     {
+	fprintf(stderr, "%s: Error. parse error %s:%i. "
+		"table attributes in non-TABLE part.\n",
+		progname, file_in, line - 1);
+	exit(-1);
+     }
+
+   ed = ep->default_desc;
+   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed->table.padding.x = parse_int_range(0, 0, 0x7fffffff);
+   ed->table.padding.y = parse_int_range(1, 0, 0x7fffffff);
+}
+
+/**
+    @page edcref
     @block
         program
     @context
diff --git a/src/bin/edje_cc_out.c b/src/bin/edje_cc_out.c
index d74a2a7..347bef1 100644
--- a/src/bin/edje_cc_out.c
+++ b/src/bin/edje_cc_out.c
@@ -151,7 +151,7 @@ check_image_part_desc (Edje_Part_Collection *pc, Edje_Part *ep,
 }
 
 static void
-check_packed_items(Edje_Part_Collection *pc, Edje_Part *ep, Edje_File *ef)
+check_packed_items(Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
 {
    Eina_List *l;
    Edje_Pack_Element *it;
@@ -162,6 +162,10 @@ check_packed_items(Edje_Part_Collection *pc, Edje_Part *ep, Edje_File *ef)
 	  error_and_abort(ef, "Collection %i: missing source on packed item "
 			  "of type GROUP in part \"%s\"\n",
 			  pc->id, ep->name);
+	if (ep->type == EDJE_PART_TYPE_TABLE && (it->col < 0 || it->row < 0))
+	  error_and_abort(ef, "Collection %i: missing col/row on packed item "
+			  "for part \"%s\" of type TABLE\n",
+			  pc->id, ep->name);
      }
 }
 
@@ -183,7 +187,8 @@ check_part (Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
 	EINA_LIST_FOREACH(ep->other_desc, l, data)
 	  check_image_part_desc (pc, ep, data, ef);
      }
-   else if (ep->type == EDJE_PART_TYPE_BOX)
+   else if ((ep->type == EDJE_PART_TYPE_BOX) ||
+	    (ep->type == EDJE_PART_TYPE_TABLE))
      check_packed_items(pc, ep, ef);
 }
 
diff --git a/src/bin/edje_cc_sources.c b/src/bin/edje_cc_sources.c
index 1e80fb6..e25d63a 100644
--- a/src/bin/edje_cc_sources.c
+++ b/src/bin/edje_cc_sources.c
@@ -30,6 +30,19 @@ _edje_str_direct_free(const char *str)
 {
 }
 
+static void *
+_edje_eina_hash_add_alloc(void *hash, const char *key, void *data)
+{
+   Eina_Hash *result = hash;
+
+   if (!result) result = eina_hash_string_small_new(NULL);
+   if (!result) return NULL;
+
+   eina_hash_add(result, key, data);
+
+   return result;
+}
+
 void
 source_edd(void)
 {
@@ -44,9 +57,9 @@ source_edd(void)
    eddc.func.list_append = eina_list_append;
    eddc.func.list_data = eina_list_data_get;
    eddc.func.list_free = eina_list_free;
-   eddc.func.hash_foreach = evas_hash_foreach;
-   eddc.func.hash_add = evas_hash_add;
-   eddc.func.hash_free = evas_hash_free;
+   eddc.func.hash_foreach = eina_hash_foreach;
+   eddc.func.hash_add = _edje_eina_hash_add_alloc;
+   eddc.func.hash_free = eina_hash_free;
    eddc.func.str_direct_alloc = _edje_str_direct_alloc;
    eddc.func.str_direct_free = _edje_str_direct_free;
 
diff --git a/src/bin/edje_prefix.c b/src/bin/edje_prefix.c
index 2241fef..18f45b9 100644
--- a/src/bin/edje_prefix.c
+++ b/src/bin/edje_prefix.c
@@ -62,23 +62,23 @@ e_prefix_determine(char *argv0)
 
    /* if user provides E_PREFIX - then use that or also more specific sub
     * dirs for bin, lib, data and locale */
-   if (getenv("E_PREFIX"))
+   if (getenv("EDJE_PREFIX"))
      {
-	_prefix_path = strdup(getenv("E_PREFIX"));
-	if (getenv("E_BIN_DIR"))
-	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S "bin", getenv("E_BIN_DIR"));
+	_prefix_path = strdup(getenv("EDJE_PREFIX"));
+	if (getenv("EDJE_BIN_DIR"))
+	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S "bin", getenv("EDJE_BIN_DIR"));
 	else
 	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S "bin", _prefix_path);
 	_prefix_path_bin = strdup(buf);
 
-	if (getenv("E_LIB_DIR"))
-	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S "lib", getenv("E_LIB_DIR"));
+	if (getenv("EDJE_LIB_DIR"))
+	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S "lib", getenv("EDJE_LIB_DIR"));
 	else
 	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S "lib", _prefix_path);
 	_prefix_path_lib = strdup(buf);
 
-	if (getenv("E_DATA_DIR"))
-	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S SHARE_D, getenv("E_DATA_DIR"));
+	if (getenv("EDJE_DATA_DIR"))
+	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S SHARE_D, getenv("EDJE_DATA_DIR"));
 	else
 	  snprintf(buf, sizeof(buf), "%s" EDJE_DIR_SEPARATOR_S SHARE_D, _prefix_path);
 	_prefix_path_data = strdup(buf);
@@ -301,12 +301,12 @@ _e_prefix_fallbacks(void)
 	  "         and is falling back on the compiled in default:\n"
 	  "           %s\n"
 	  "         You might like to try setting the following environment variables:\n"
-	  "           E_PREFIX     - points to the base prefix of install\n"
-	  "           E_BIN_DIR    - optional in addition to E_PREFIX to provide\n"
+	  "           EDJE_PREFIX  - points to the base prefix of install\n"
+	  "           EDJE_BIN_DIR - optional in addition to E_PREFIX to provide\n"
 	  "                          a more specific binary directory\n"
-	  "           E_LIB_DIR    - optional in addition to E_PREFIX to provide\n"
+	  "           EDJE_LIB_DIR - optional in addition to E_PREFIX to provide\n"
 	  "                          a more specific library dir\n"
-	  "           E_DATA_DIR   - optional in addition to E_PREFIX to provide\n"
+	  "           EDJE_DATA_DIR- optional in addition to E_PREFIX to provide\n"
 	  "                          a more specific location for shared data\n"
 	  ,
 	  _prefix_path);
diff --git a/src/lib/Edje.h b/src/lib/Edje.h
index 0335861..717cc02 100644
--- a/src/lib/Edje.h
+++ b/src/lib/Edje.h
@@ -62,6 +62,14 @@ enum _Edje_Aspect_Control
 };
 typedef enum _Edje_Aspect_Control Edje_Aspect_Control;
 
+enum _Edje_Object_Table_Homogeneous_Mode
+{
+   EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE = 0,
+   EDJE_OBJECT_TABLE_HOMOGENEOUS_TABLE = 1,
+   EDJE_OBJECT_TABLE_HOMOGENEOUS_ITEM = 2
+};
+typedef enum _Edje_Object_Table_Homogeneous_Mode Edje_Object_Table_Homogeneous_Mode;
+
 typedef struct _Edje_Message_String           Edje_Message_String;
 typedef struct _Edje_Message_Int              Edje_Message_Int;
 typedef struct _Edje_Message_Float            Edje_Message_Float;
@@ -173,7 +181,9 @@ extern "C" {
    EAPI const char  *edje_fontset_append_get         (void);
    EAPI void         edje_scale_set                  (double scale);
    EAPI double       edje_scale_get                  (void);
-
+   EAPI void         edje_object_scale_set           (Evas_Object *obj, double scale);
+   EAPI double       edje_object_scale_get           (const Evas_Object *obj);
+       
    /* edje_load.c */
    EAPI Eina_List   *edje_file_collection_list       (const char *file);
    EAPI void         edje_file_collection_list_free  (Eina_List *lst);
@@ -209,6 +219,7 @@ extern "C" {
    EAPI int          edje_object_file_set            (Evas_Object *obj, const char *file, const char *group);
    EAPI void         edje_object_file_get            (const Evas_Object *obj, const char **file, const char **group);
    EAPI int          edje_object_load_error_get      (const Evas_Object *obj);
+   EAPI const char  *edje_load_error_str             (int error);
 
    /* edje_program.c */
    EAPI void         edje_object_signal_callback_add (Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *obj, const char *emission, const char *source), void *data);
@@ -240,10 +251,10 @@ extern "C" {
    EAPI void         edje_object_part_text_select_none(const Evas_Object *obj, const char *part);
    EAPI void         edje_object_part_text_select_all(const Evas_Object *obj, const char *part);
        
-   EAPI void         edje_object_part_text_insert    (Evas_Object *obj, const char *part, const char *text);
-   EAPI Eina_List   *edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part);
-   EAPI Eina_List   *edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor);
-   EAPI void         edje_object_part_text_cursor_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
+   EAPI void             edje_object_part_text_insert    (Evas_Object *obj, const char *part, const char *text);
+   EAPI const Eina_List *edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part);
+   EAPI const Eina_List *edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor);
+   EAPI void             edje_object_part_text_cursor_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
        
    EAPI void         edje_object_part_swallow        (Evas_Object *obj, const char *part, Evas_Object *obj_swallow);
    EAPI void         edje_object_part_unswallow      (Evas_Object *obj, Evas_Object *obj_swallow);
@@ -267,6 +278,10 @@ extern "C" {
    EAPI Evas_Object *edje_object_part_box_remove     (Evas_Object *obj, const char *part, Evas_Object *child);
    EAPI Evas_Object *edje_object_part_box_remove_at  (Evas_Object *obj, const char *part, unsigned int pos);
    EAPI Evas_Bool    edje_object_part_box_remove_all (Evas_Object *obj, const char *part, Evas_Bool clear);
+   EAPI Evas_Bool    edje_object_part_table_pack     (Evas_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan);
+   EAPI Evas_Bool    edje_object_part_table_unpack   (Evas_Object *obj, const char *part, Evas_Object *child_obj);
+   EAPI Evas_Bool    edje_object_part_table_col_row_size_get (const Evas_Object *obj, const char *part, int *cols, int *rows);
+   EAPI Evas_Bool    edje_object_part_table_clear    (Evas_Object *obj, const char *part, Evas_Bool clear);
 
    /* edje_message_queue.c */
    EAPI void         edje_object_message_send           (Evas_Object *obj, Edje_Message_Type type, int id, void *msg);
diff --git a/src/lib/Makefile.in b/src/lib/Makefile.in
index 5be1235..b3f220d 100644
--- a/src/lib/Makefile.in
+++ b/src/lib/Makefile.in
@@ -92,7 +92,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -102,7 +101,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -179,6 +177,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
diff --git a/src/lib/edje_cache.c b/src/lib/edje_cache.c
index b0bd0c8..f74abf8 100644
--- a/src/lib/edje_cache.c
+++ b/src/lib/edje_cache.c
@@ -69,7 +69,9 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
 
    edc->part = eina_stringshare_add(coll);
    edc->references = 1;
-   edf->collection_hash = evas_hash_add(edf->collection_hash, coll, edc);
+   if (!edf->collection_hash)
+     edf->collection_hash = eina_hash_string_small_new(NULL);
+   eina_hash_add(edf->collection_hash, coll, edc);
    return edc;
 }
 
@@ -78,6 +80,9 @@ _edje_font_hash(Edje_File *edf)
 {
    int	count = 0;
 
+   if (!edf->font_hash)
+     edf->font_hash = eina_hash_string_small_new(NULL);
+
    if (edf->font_dir)
      {
 	Eina_List *l;
@@ -96,7 +101,7 @@ _edje_font_hash(Edje_File *edf)
              if (edf->free_strings)
                eina_stringshare_del(fnt->entry);
 	     fnt->entry = fnt->path + 6;
-	     edf->font_hash = evas_hash_direct_add(edf->font_hash, fnt->entry, fnt);
+	     eina_hash_direct_add(edf->font_hash, fnt->entry, fnt);
 
 	     count++;
 	  }
@@ -156,8 +161,11 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
 
    _edje_textblock_style_parse_and_fix(edf);
 
+   if (!edf->data_cache)
+     edf->data_cache = eina_hash_string_small_new(NULL);
+
    EINA_LIST_FOREACH(edf->data, l, di)
-     edf->data_cache = evas_hash_add(edf->data_cache, eina_stringshare_add(di->key), di->value);
+     eina_hash_add(edf->data_cache, di->key, di->value);
 
    if (coll)
      {
@@ -184,7 +192,10 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
    Edje_Part_Collection *edc;
    Edje_Part *ep;
 
-   edf = evas_hash_find(_edje_file_hash, file);
+   if (!_edje_file_hash)
+     _edje_file_hash = eina_hash_string_small_new(NULL);
+   edf = eina_hash_find(_edje_file_hash, file);
+
    if (edf)
      {
 	edf->references++;
@@ -197,7 +208,7 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
 	       {
 		  edf->references = 1;
 		  _edje_file_cache = eina_list_remove_list(_edje_file_cache, l);
-		  _edje_file_hash = evas_hash_add(_edje_file_hash, file, edf);
+		  eina_hash_add(_edje_file_hash, file, edf);
 		  break;
 	       }
 	     edf = NULL;
@@ -207,13 +218,16 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
      {
 	edf = _edje_file_open(file, coll, error_ret, edc_ret);
 	if (!edf) return NULL;
-	_edje_file_hash = evas_hash_add(_edje_file_hash, file, edf);
+	eina_hash_add(_edje_file_hash, file, edf);
 	return edf;
      }
 
+   if (!edf->collection_hash)
+     edf->collection_hash = eina_hash_string_small_new(NULL);
+
    if (!coll) return edf;
 
-   edc = evas_hash_find(edf->collection_hash, coll);
+   edc = eina_hash_find(edf->collection_hash, coll);
    if (edc)
      {
 	edc->references++;
@@ -226,7 +240,7 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
 	       {
 		  edc->references = 1;
 		  edf->collection_cache = eina_list_remove_list(edf->collection_cache, l);
-		  edf->collection_hash = evas_hash_add(edf->collection_hash, coll, edc);
+		  eina_hash_add(edf->collection_hash, coll, edc);
 		  break;
 	       }
 	     edc = NULL;
@@ -345,7 +359,12 @@ _edje_cache_coll_unref(Edje_File *edf, Edje_Part_Collection *edc)
 {
    edc->references--;
    if (edc->references != 0) return;
-   edf->collection_hash = evas_hash_del(edf->collection_hash, edc->part, edc);
+   eina_hash_del(edf->collection_hash, edc->part, edc);
+   if (!eina_hash_population(edf->collection_hash))
+     {
+       eina_hash_free(edf->collection_hash);
+       edf->collection_hash = NULL;
+     }
    edf->collection_cache = eina_list_prepend(edf->collection_cache, edc);
    _edje_cache_coll_clean(edf);
 }
@@ -372,7 +391,13 @@ _edje_cache_file_unref(Edje_File *edf)
 {
    edf->references--;
    if (edf->references != 0) return;
-   _edje_file_hash = evas_hash_del(_edje_file_hash, edf->path, edf);
+
+   eina_hash_del(_edje_file_hash, edf->path, edf);
+   if (!eina_hash_population(_edje_file_hash))
+     {
+       eina_hash_free(_edje_file_hash);
+       _edje_file_hash = NULL;
+     }
    _edje_file_cache = eina_list_prepend(_edje_file_cache, edf);
    _edje_cache_file_clean();
 }
diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c
index 3ad853e..8b1a580 100644
--- a/src/lib/edje_calc.c
+++ b/src/lib/edje_calc.c
@@ -157,10 +157,12 @@ _edje_recalc_do(Edje *ed)
    int i;
 
    ed->postponed = 0;
+   evas_object_smart_need_recalculate_set(ed->obj, 0);
    if (!ed->dirty)
      {
 	return;
      }
+   ed->dirty = 0;
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *ep;
@@ -178,7 +180,6 @@ _edje_recalc_do(Edje *ed)
 	  _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY);
      }
    if (!ed->calc_only) ed->recalc = 0;
-   ed->dirty = 0;
    ed->calc_only = 0;
 }
 
@@ -269,13 +270,16 @@ _edje_part_recalc_single(Edje *ed,
 			 int flags)
 {
    int minw = 0, minh = 0, maxw = 0, maxh = 0;
+   double sc;
 
    flags = FLAG_XY;
 
+   sc = ed->scale;
+   if (sc == 0.0) sc = _edje_scale;
 //   if (flags & FLAG_X)
      {
 	minw = desc->min.w;
-	if (ep->part->scale) minw = (int)(((double)minw) * _edje_scale);
+	if (ep->part->scale) minw = (int)(((double)minw) * sc);
 	if (ep->swallow_params.min.w > desc->min.w)
 	  minw = ep->swallow_params.min.w;
 
@@ -286,7 +290,7 @@ _edje_part_recalc_single(Edje *ed,
 	     maxw = desc->max.w;
 	     if (maxw > 0)
 	       {
-		  if (ep->part->scale) maxw = (int)(((double)maxw) * _edje_scale);
+		  if (ep->part->scale) maxw = (int)(((double)maxw) * sc);
 		  if (maxw < 1) maxw = 1;
 	       }
 	  }
@@ -299,7 +303,7 @@ _edje_part_recalc_single(Edje *ed,
 		  maxw = desc->max.w;
 		  if (maxw > 0)
 		    {
-		       if (ep->part->scale) maxw = (int)(((double)maxw) * _edje_scale);
+		       if (ep->part->scale) maxw = (int)(((double)maxw) * sc);
 		       if (maxw < 1) maxw = 1;
 		    }
 		  if (ep->swallow_params.max.w < maxw)
@@ -314,7 +318,7 @@ _edje_part_recalc_single(Edje *ed,
 //   if (flags & FLAG_Y)
      {
 	minh = desc->min.h;
-	if (ep->part->scale) minh = (int)(((double)minh) * _edje_scale);
+	if (ep->part->scale) minh = (int)(((double)minh) * sc);
 	if (ep->swallow_params.min.h > desc->min.h)
 	  minh = ep->swallow_params.min.h;
 
@@ -325,7 +329,7 @@ _edje_part_recalc_single(Edje *ed,
 	     maxh = desc->max.h;
 	     if (maxh > 0)
 	       {
-		  if (ep->part->scale) maxh = (int)(((double)maxh) * _edje_scale);
+		  if (ep->part->scale) maxh = (int)(((double)maxh) * sc);
 		  if (maxh < 1) maxh = 1;
 	       }
 	  }
@@ -338,7 +342,7 @@ _edje_part_recalc_single(Edje *ed,
 		  maxh = desc->max.h;
 		  if (maxh > 0)
 		    {
-		       if (ep->part->scale) maxh = (int)(((double)maxh) * _edje_scale);
+		       if (ep->part->scale) maxh = (int)(((double)maxh) * sc);
 		       if (maxh < 1) maxh = 1;
 		    }
 		  if (ep->swallow_params.max.h < maxh)
@@ -646,7 +650,7 @@ _edje_part_recalc_single(Edje *ed,
 	  }
 
 	if (ep->part->scale)
-	  evas_object_scale_set(ep->object, _edje_scale);
+	  evas_object_scale_set(ep->object, sc);
 	
 	if (stl)
 	  {
@@ -776,7 +780,7 @@ _edje_part_recalc_single(Edje *ed,
 	  {
 	     Edje_Font_Directory_Entry *fnt;
 
-	     fnt = evas_hash_find(ed->file->font_hash, font);
+	     fnt = eina_hash_find(ed->file->font_hash, font);
 
 	     if (fnt)
 	       {
@@ -785,7 +789,7 @@ _edje_part_recalc_single(Edje *ed,
 	       }
 	  }
 	if (ep->part->scale)
-	  evas_object_scale_set(ep->object, _edje_scale);
+	  evas_object_scale_set(ep->object, sc);
 	if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
 	else evas_object_text_font_source_set(ep->object, NULL);
 
@@ -1219,6 +1223,14 @@ _edje_box_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_
 }
 
 static void
+_edje_table_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc)
+{
+   evas_object_table_homogeneous_set(ep->object, chosen_desc->table.homogeneous);
+   evas_object_table_align_set(ep->object, chosen_desc->table.align.x, chosen_desc->table.align.y);
+   evas_object_table_padding_set(ep->object, chosen_desc->table.padding.x, chosen_desc->table.padding.y);
+}
+
+static void
 _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc, double pos)
 {
    int image_id;
@@ -1506,6 +1518,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 	   case EDJE_PART_TYPE_TEXTBLOCK:
 	   case EDJE_PART_TYPE_GRADIENT:
 	   case EDJE_PART_TYPE_BOX:
+	   case EDJE_PART_TYPE_TABLE:
 	      evas_object_color_set(ep->object,
 				    (pf->color.r * pf->color.a) / 255,
 				    (pf->color.g * pf->color.a) / 255,
@@ -1546,6 +1559,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 	   case EDJE_PART_TYPE_BOX:
 	      _edje_box_recalc_apply(ed, ep, pf, chosen_desc);
 	      break;
+	   case EDJE_PART_TYPE_TABLE:
+	      _edje_table_recalc_apply(ed, ep, pf, chosen_desc);
+	      break;
 	   case EDJE_PART_TYPE_RECTANGLE:
 	   case EDJE_PART_TYPE_SWALLOW:
 	   case EDJE_PART_TYPE_GROUP:
diff --git a/src/lib/edje_data.c b/src/lib/edje_data.c
index 2847514..e238f10 100644
--- a/src/lib/edje_data.c
+++ b/src/lib/edje_data.c
@@ -75,6 +75,16 @@ _edje_str_direct_free(const char *str)
 {
 }
 
+static Eina_Hash *
+_edje_eina_hash_add_alloc(Eina_Hash *hash, const char *key, void *data)
+{
+   if (!hash) hash = eina_hash_string_small_new(NULL);
+   if (!hash) return NULL;
+
+   eina_hash_add(hash, key, data);
+   return hash;
+}
+
 void
 _edje_edd_setup(void)
 {
@@ -89,9 +99,9 @@ _edje_edd_setup(void)
    eddc.func.list_append = (void *(*)(void *, void *))eina_list_append;
    eddc.func.list_data = (void *(*)(void *))eina_list_data_get;
    eddc.func.list_free = (void *(*)(void *))eina_list_free;
-   eddc.func.hash_foreach = (void (*)(void *, int (*)(void *, const char *, void *, void *), void *))evas_hash_foreach;
-   eddc.func.hash_add = (void *(*)(void *, const char *, void *))evas_hash_add;
-   eddc.func.hash_free = (void (*)(void *))evas_hash_free;
+   eddc.func.hash_foreach = (void (*)(const Eina_Hash *, Eina_Bool (*)(const Eina_Hash *, const void *, void *, void *), void *))eina_hash_foreach;
+   eddc.func.hash_add = (Eina_Hash* (*)(Eina_Hash *, const char *, void *)) _edje_eina_hash_add_alloc;
+   eddc.func.hash_free = (void (*)(void *))eina_hash_free;
    eddc.func.str_direct_alloc = _edje_str_direct_alloc;
    eddc.func.str_direct_free = _edje_str_direct_free;
 
@@ -359,6 +369,11 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.align.y", box.align.y, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.padding.x", box.padding.x, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.padding.y", box.padding.y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.homogeneous", table.homogeneous, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.align.x", table.align.x, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.align.y", table.align.y, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.x", table.padding.x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.y", table.padding.y, EET_T_INT);
 
    NEWD("Edje_Pack_Element",
 	 Edje_Pack_Element);
@@ -385,6 +400,10 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "aspect.h", aspect.h, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "aspect.mode", aspect.mode, EET_T_UCHAR);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "options", options, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "col", col, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "row", row, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "colspan", colspan, EET_T_USHORT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "rowspan", rowspan, EET_T_USHORT);
 
    NEWD("Edje_Part",
 	Edje_Part);
diff --git a/src/lib/edje_edit.c b/src/lib/edje_edit.c
index af016b6..628851d 100644
--- a/src/lib/edje_edit.c
+++ b/src/lib/edje_edit.c
@@ -716,7 +716,9 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
    //cd = mem_alloc(SZ(Code));
    //codes = eina_list_append(codes, cd);
 
-   ed->file->collection_hash = evas_hash_add(ed->file->collection_hash, name, pc);
+   if (!ed->file->collection_hash)
+     ed->file->collection_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(ed->file->collection_hash, name, pc);
 
    return 1;
 }
@@ -828,10 +830,12 @@ edje_edit_group_name_set(Evas_Object *obj, const char *new_name)
      {
 	if (pc->id == pce->id)
 	  {
-	     ed->file->collection_hash = evas_hash_del(ed->file->collection_hash,
-						       pce->entry, NULL);
-	     ed->file->collection_hash = evas_hash_add(ed->file->collection_hash,
-						       new_name, pc);
+	     eina_hash_del(ed->file->collection_hash,
+			   pce->entry, NULL);
+	     if (!ed->file->collection_hash)
+	       ed->file->collection_hash = eina_hash_string_superfast_new(NULL);
+	     eina_hash_add(ed->file->collection_hash,
+			   new_name, pc);
 
 	     //if (pce->entry &&  //TODO Also this cause segv
 	     //    !eet_dictionary_string_check(eet_dictionary_get(ed->file->ef), pce->entry))
@@ -3310,7 +3314,9 @@ edje_edit_font_add(Evas_Object *obj, const char* path)
 	fnt->path = mem_strdup(buf);
 
 	ed->file->font_dir->entries = eina_list_append(ed->file->font_dir->entries, fnt);
-	ed->file->font_hash = evas_hash_direct_add(ed->file->font_hash, fnt->entry, fnt);
+	if (!ed->file->font_hash)
+	  ed->file->font_hash = eina_hash_string_superfast_new(NULL);
+	eina_hash_direct_add(ed->file->font_hash, fnt->entry, fnt);
      }
 
    return 1;
@@ -5222,9 +5228,13 @@ _edje_generate_source_of_group(Edje *ed, const char *group, FILE *f)
       
    fprintf(f, I1"group { name: \"%s\";\n", group);
    //TODO Support alias:
-   if ((w = edje_edit_group_min_w_get(obj)) || (h = edje_edit_group_min_h_get(obj)))
+   w = edje_edit_group_min_w_get(obj);
+   h = edje_edit_group_min_h_get(obj);
+   if ((w > 0) || (h > 0))
       fprintf(f, I2"min: %d %d;\n", w, h);
-   if ((w = edje_edit_group_max_w_get(obj)) || (h = edje_edit_group_max_h_get(obj)))
+   w = edje_edit_group_max_w_get(obj);
+   h = edje_edit_group_max_h_get(obj);
+   if ((w > -1) || (h > -1))
       fprintf(f, I2"max: %d %d;\n", w, h);
    //TODO Support data
    //TODO Support script
@@ -5393,6 +5403,20 @@ _edje_edit_str_direct_free(const char *str)
 {
 }
 
+static void *
+_edje_eina_hash_add_alloc(void *hash, const void *key, void *data)
+{
+   Eina_Hash *result = hash;
+
+   if (!result) result = eina_hash_string_small_new(NULL);
+   if (!result) return NULL;
+
+   eina_hash_add(result, key, data);
+
+   return result;
+}
+
+
 static Eet_Data_Descriptor *_srcfile_edd = NULL;
 static Eet_Data_Descriptor *_srcfile_list_edd = NULL;
 
@@ -5410,9 +5434,9 @@ source_edd(void)
    eddc.func.list_append = eina_list_append;
    eddc.func.list_data = eina_list_data_get;
    eddc.func.list_free = eina_list_free;
-   eddc.func.hash_foreach = evas_hash_foreach;
-   eddc.func.hash_add = evas_hash_add;
-   eddc.func.hash_free = evas_hash_free;
+   eddc.func.hash_foreach = eina_hash_foreach;
+   eddc.func.hash_add = _edje_eina_hash_add_alloc;
+   eddc.func.hash_free = eina_hash_free;
    eddc.func.str_direct_alloc = _edje_edit_str_direct_alloc;
    eddc.func.str_direct_free = _edje_edit_str_direct_free;
 
diff --git a/src/lib/edje_embryo.c b/src/lib/edje_embryo.c
index 24ea7ca..d8d44b3 100644
--- a/src/lib/edje_embryo.c
+++ b/src/lib/edje_embryo.c
@@ -902,6 +902,7 @@ _edje_embryo_fn_set_tween_state(Embryo_Program *ep, Embryo_Cell *params)
 	if (rp->program) _edje_program_end(ed, rp->program);
 	_edje_part_description_apply(ed, rp, state1, value1, state2, value2);
 	_edje_part_pos_set(ed, rp, EDJE_TWEEN_MODE_LINEAR, tween);
+	_edje_recalc(ed);
      }
    return 0;
 }
diff --git a/src/lib/edje_entry.c b/src/lib/edje_entry.c
index c86a255..8107c3b 100644
--- a/src/lib/edje_entry.c
+++ b/src/lib/edje_entry.c
@@ -636,7 +636,7 @@ _anchors_get(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
    evas_textblock_cursor_node_first(c1);
    do 
      {
-	char *s;
+	const char *s;
 	
 	s = evas_textblock_cursor_node_format_get(c1);
 	if (s)
@@ -839,6 +839,7 @@ _edje_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 	  }
 	_sel_clear(en->cursor, rp->object, en);
 	_curs_update_from_curs(en->cursor, rp->object, en);
+	_edje_emit(ed, "entry,changed", rp->part->name);
         _edje_emit(ed, "entry,key,backspace", rp->part->name);
 	ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
      }
@@ -1032,7 +1033,6 @@ static void
 _edje_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Edje *ed = data;
-   Evas_Event_Key_Up *ev = event_info;
    Edje_Real_Part *rp = ed->focused_part;
    Entry *en;
    if (!rp) return;
@@ -1061,7 +1061,7 @@ _edje_part_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
 	_edje_emit(rp->edje, "entry,paste,request", rp->part->name);
         return;
      }
-   if (ev->button != 2) return;
+   if (ev->button != 1) return;
    // double click -> select word
    // triple click -> select line
    tc = evas_object_textblock_cursor_new(rp->object);
diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c
index 7d90676..34ebc65 100644
--- a/src/lib/edje_load.c
+++ b/src/lib/edje_load.c
@@ -7,9 +7,9 @@
 #include "edje_private.h"
 
 void _edje_collection_free_part_description_free(Edje_Part_Description *desc, unsigned int free_strings);
-static Evas_Bool _edje_file_collection_hash_foreach(const Evas_Hash *hash, const char *key, void *data, void *fdata);
+static Eina_Bool _edje_file_collection_hash_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
 #ifdef EDJE_PROGRAM_CACHE
-static Evas_Bool  _edje_collection_free_prog_cache_matches_free_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata);
+static Eina_Bool  _edje_collection_free_prog_cache_matches_free_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
 #endif
 static int _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *group, Eina_List *group_path);
 static void _edje_object_pack_item_hints_set(Evas_Object *obj, Edje_Pack_Element *it);
@@ -91,6 +91,37 @@ edje_object_load_error_get(const Evas_Object *obj)
    return ed->load_error;
 }
 
+EAPI const char *
+edje_load_error_str(int error)
+{
+   switch (error)
+     {
+      case EDJE_LOAD_ERROR_NONE:
+	 return "No Error";
+      case EDJE_LOAD_ERROR_GENERIC:
+	 return "Generic Error";
+      case EDJE_LOAD_ERROR_DOES_NOT_EXIST:
+	 return "File Does Not Exist";
+      case EDJE_LOAD_ERROR_PERMISSION_DENIED:
+	 return "Permission Denied";
+      case EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED:
+	 return "Resource Allocation Failed";
+      case EDJE_LOAD_ERROR_CORRUPT_FILE:
+	 return "Corrupt File";
+      case EDJE_LOAD_ERROR_UNKNOWN_FORMAT:
+	 return "Unknown Format";
+      case EDJE_LOAD_ERROR_INCOMPATIBLE_FILE:
+	 return "Incompatible File";
+      case EDJE_LOAD_ERROR_UNKNOWN_COLLECTION:
+	 return "Unknown Collection";
+      case EDJE_LOAD_ERROR_RECURSIVE_REFERENCE:
+	 return "Recursive Reference";
+      default:
+	 return "Unknown Error";
+     }
+}
+
+
 /** Get a list of groups in an edje file
  * @param file The path to the edje file
  *
@@ -203,7 +234,7 @@ edje_file_data_get(const char *file, const char *key)
 	  {
 	     if (edf->data_cache != NULL)
 	       {
-		  str = evas_hash_find(edf->data_cache, key);
+		  str = eina_hash_find(edf->data_cache, key);
 		  if (str) str = strdup(str);
 	       }
 	     _edje_cache_file_unref(edf);
@@ -349,6 +380,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 		    {
 		       rp->object = evas_object_box_add(ed->evas);
 		    }
+		  else if (ep->type == EDJE_PART_TYPE_TABLE)
+		    rp->object = evas_object_table_add(ed->evas);
 		  else
 		    printf("EDJE ERROR: wrong part type %i!\n", ep->type);
 		  if (rp->object)
@@ -491,16 +524,23 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 	     for (i = 0; i < ed->table_parts_size; i++)
 	       {
 		  Edje_Real_Part *rp;
-		  Eina_List *curr_item;
-		  Edje_Pack_Element *pack_it;
+		  /* XXX: curr_item and pack_it don't require to be NULL since
+		   * XXX: they are just used when source != NULL and type == BOX,
+		   * XXX: and they're always set in this case, but GCC fails to
+		   * XXX: notice that, so let's shut it up
+		   */
+		  Eina_List *curr_item = NULL;
+		  Edje_Pack_Element *pack_it = NULL;
 		  const char *source = NULL;
 		  
 		  rp = ed->table_parts[i];
 		  if (rp->part->type != EDJE_PART_TYPE_GROUP &&
-		      rp->part->type != EDJE_PART_TYPE_BOX) continue;
+		      rp->part->type != EDJE_PART_TYPE_BOX &&
+		      rp->part->type != EDJE_PART_TYPE_TABLE) continue;
 		  if (rp->part->type == EDJE_PART_TYPE_GROUP)
 		    source = rp->part->source;
-		  else if (rp->part->type == EDJE_PART_TYPE_BOX)
+		  else if (rp->part->type == EDJE_PART_TYPE_BOX ||
+			   rp->part->type == EDJE_PART_TYPE_TABLE)
 		    {
 		       if (rp->part->items)
 			 {
@@ -574,15 +614,22 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 			    _edje_real_part_swallow(rp, child_obj);
 			    source = NULL;
 			 }
-		       else if (rp->part->type == EDJE_PART_TYPE_BOX)
+		       else
 			 {
 			    _edje_object_pack_item_hints_set(child_obj, pack_it);
 			    evas_object_show(child_obj);
-
-			    _edje_real_part_box_append(rp, child_obj);
-			    evas_object_data_set(child_obj, "\377 edje.box_item", curr_item->data);
 			    if (pack_it->name)
 			      evas_object_name_set(child_obj, pack_it->name);
+			    if (rp->part->type == EDJE_PART_TYPE_BOX)
+			      {
+				 _edje_real_part_box_append(rp, child_obj);
+				 evas_object_data_set(child_obj, "\377 edje.box_item", pack_it);
+			      }
+			    else if(rp->part->type == EDJE_PART_TYPE_TABLE)
+			      {
+				 _edje_real_part_table_pack(rp, child_obj, pack_it->col, pack_it->row, pack_it->colspan, pack_it->rowspan);
+				 evas_object_data_set(child_obj, "\377 edje.table_item", pack_it);
+			      }
 			    rp->items = eina_list_append(rp->items, child_obj);
 			    if (!(curr_item = curr_item->next))
 			      source = NULL;
@@ -712,20 +759,6 @@ _edje_file_del(Edje *ed)
    _edje_programs_patterns_clean(ed);
 
    if (!((ed->file) && (ed->collection))) return;
-   if ((ed->file) && (ed->collection))
-     {
-	Eina_List *l;
-	Edje_Part *ep;
-
-	_edje_textblock_styles_del(ed);
-	EINA_LIST_FOREACH(ed->collection->parts, l, ep)
-	  {
-	     _edje_text_part_on_del(ed, ep);
-	     _edje_color_class_on_del(ed, ep);
-	  }
-	_edje_cache_coll_unref(ed->file, ed->collection);
-	ed->collection = NULL;
-     }
    if (ed->table_parts)
      {
 	int i;
@@ -765,7 +798,7 @@ _edje_file_del(Edje *ed)
 		  /* all internal, for now */
 		  while (rp->items)
 		    {
-		       /* evas_box handles deletion of objects */
+		       /* evas_box/table handles deletion of objects */
 		       /*evas_object_del(rp->items->data);*/
 		       rp->items = eina_list_remove_list(rp->items, rp->items);
 		    }
@@ -782,6 +815,20 @@ _edje_file_del(Edje *ed)
 	     free(rp);
 	  }
      }
+   if ((ed->file) && (ed->collection))
+     {
+	Eina_List *l;
+	Edje_Part *ep;
+
+	_edje_textblock_styles_del(ed);
+	EINA_LIST_FOREACH(ed->collection->parts, l, ep)
+	  {
+	     _edje_text_part_on_del(ed, ep);
+	     _edje_color_class_on_del(ed, ep);
+	  }
+	_edje_cache_coll_unref(ed->file, ed->collection);
+	ed->collection = NULL;
+     }
    if (ed->file)
      {
 	_edje_cache_file_unref(ed->file);
@@ -823,7 +870,7 @@ _edje_file_del(Edje *ed)
  * Used to free the cached data values that are stored in the data_cache
  * hash table.
  */
-static Evas_Bool data_cache_free(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool data_cache_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Edje_File    *edf;
 
@@ -844,12 +891,17 @@ _edje_file_free(Edje_File *edf)
 	     fe = eina_list_data_get(edf->font_dir->entries);
 	     edf->font_dir->entries =
 	       eina_list_remove_list(edf->font_dir->entries, edf->font_dir->entries);
-	     edf->font_hash = evas_hash_del(edf->font_hash, fe->entry, edf);
+	     eina_hash_del(edf->font_hash, fe->entry, edf);
 	     if (edf->free_strings && fe->path) eina_stringshare_del(fe->path);
 	     free(fe);
 	  }
 	free(edf->font_dir);
      }
+   if (edf->font_hash)
+     {
+	eina_hash_free(edf->font_hash);
+	edf->font_hash = NULL;
+     }
    if (edf->image_dir)
      {
 	while (edf->image_dir->entries)
@@ -917,8 +969,8 @@ _edje_file_free(Edje_File *edf)
      }
    if (edf->data_cache)
      {
-	evas_hash_foreach(edf->data_cache, data_cache_free, edf);
-	evas_hash_free(edf->data_cache);
+	eina_hash_foreach(edf->data_cache, data_cache_free, edf);
+	eina_hash_free(edf->data_cache);
 	edf->data_cache = NULL;
      }
 
@@ -946,9 +998,9 @@ _edje_file_free(Edje_File *edf)
 	       "before calling edje_shutdown().\n"
 	       "The following errors are the edje object files and parts that are still\n"
 	       "hanging around, with their reference counts\n");
-	evas_hash_foreach(edf->collection_hash,
+	eina_hash_foreach(edf->collection_hash,
                           _edje_file_collection_hash_foreach, edf);
-	evas_hash_free(edf->collection_hash);
+	eina_hash_free(edf->collection_hash);
      }
    if (edf->path) eina_stringshare_del(edf->path);
    if (edf->free_strings && edf->compiler) eina_stringshare_del(edf->compiler);
@@ -1033,13 +1085,13 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
      }
    if (edf->free_strings && ec->part) eina_stringshare_del(ec->part);
 #ifdef EDJE_PROGRAM_CACHE
-   if (ec->prog_cache.no_matches) evas_hash_free(ec->prog_cache.no_matches);
+   if (ec->prog_cache.no_matches) eina_hash_free(ec->prog_cache.no_matches);
    if (ec->prog_cache.matches)
      {
-	evas_hash_foreach(ec->prog_cache.matches,
+	eina_hash_foreach(ec->prog_cache.matches,
 			  _edje_collection_free_prog_cache_matches_free_cb,
 			  NULL);
-	evas_hash_free(ec->prog_cache.matches);
+	eina_hash_free(ec->prog_cache.matches);
      }
 #endif
    if (ec->script) embryo_program_free(ec->script);
@@ -1070,8 +1122,8 @@ _edje_collection_free_part_description_free(Edje_Part_Description *desc, unsigne
    free(desc);
 }
 
-static Evas_Bool
-_edje_file_collection_hash_foreach(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+_edje_file_collection_hash_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Edje_File *edf;
    Edje_Part_Collection *coll;
@@ -1087,11 +1139,12 @@ _edje_file_collection_hash_foreach(const Evas_Hash *hash, const char *key, void
 }
 
 #ifdef EDJE_PROGRAM_CACHE
-static Evas_Bool
-_edje_collection_free_prog_cache_matches_free_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+_edje_collection_free_prog_cache_matches_free_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    eina_list_free((Eina_List *)data);
    return 1;
+   key = NULL;
    hash = NULL;
    fdata = NULL;
 }
diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h
index 315d6c8..7a16007 100644
--- a/src/lib/edje_private.h
+++ b/src/lib/edje_private.h
@@ -153,7 +153,8 @@ typedef struct _Edje_Patterns                        Edje_Patterns;
 #define EDJE_PART_TYPE_GRADIENT  6
 #define EDJE_PART_TYPE_GROUP     7
 #define EDJE_PART_TYPE_BOX       8
-#define EDJE_PART_TYPE_LAST      9
+#define EDJE_PART_TYPE_TABLE     9
+#define EDJE_PART_TYPE_LAST     10
 
 #define EDJE_TEXT_EFFECT_NONE                0
 #define EDJE_TEXT_EFFECT_PLAIN               1
@@ -255,10 +256,10 @@ struct _Edje_File
    int                             version;
    int                             feature_ver;
 
-   Evas_Hash                      *collection_hash;
-   Evas_Hash			  *font_hash;
+   Eina_Hash                      *collection_hash;
+   Eina_Hash			  *font_hash;
    Eina_List                      *collection_cache;
-   Evas_Hash                      *data_cache;
+   Eina_Hash                      *data_cache;
 
    Eet_File                       *ef;
 
@@ -414,6 +415,9 @@ struct _Edje_Pack_Element
    Edje_Alignment   weight;
    Edje_Aspect      aspect;
    const char      *options; /* extra options for custom objects */
+   /* table specific follows */
+   int              col, row;
+   unsigned short   colspan, rowspan;
 };
 
 /*----------*/
@@ -433,8 +437,8 @@ struct _Edje_Part_Collection
    int        references;
 #ifdef EDJE_PROGRAM_CACHE
    struct {
-      Evas_Hash                   *no_matches;
-      Evas_Hash                   *matches;
+      Eina_Hash                   *no_matches;
+      Eina_Hash                   *matches;
    } prog_cache;
 #endif
 
@@ -583,6 +587,13 @@ struct _Edje_Part_Description
 	      int x, y;
       } padding;
    } box;
+   struct {
+      unsigned char  homogeneous;
+      Edje_Alignment align;
+      struct {
+	      int x, y;
+      } padding;
+   } table;
 
    Edje_Color color, color2, color3;  /* color for rect or text, shadow etc. */
 
@@ -673,6 +684,7 @@ struct _Edje
    int                   block;
    int                   load_error;
    int                   freeze;
+   double                scale;
 
    struct {
       void (*func) (void *data, Evas_Object *obj, const char *part);
@@ -880,7 +892,7 @@ struct _Edje_Var_List
 
 struct _Edje_Var_Hash
 {
-   Evas_Hash *v;
+   Eina_Hash *v;
 };
 
 struct _Edje_Var_Timer
@@ -1129,6 +1141,9 @@ Evas_Bool         _edje_real_part_box_insert_at(Edje_Real_Part *rp, Evas_Object
 Evas_Object      *_edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj);
 Evas_Object      *_edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos);
 Evas_Bool         _edje_real_part_box_remove_all(Edje_Real_Part *rp, Evas_Bool clear);
+Evas_Bool         _edje_real_part_table_pack(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan);
+Evas_Bool         _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj);
+void              _edje_real_part_table_clear(Edje_Real_Part *rp, Evas_Bool clear);
 
 void          _edje_embryo_script_init      (Edje *ed);
 void          _edje_embryo_script_shutdown  (Edje *ed);
diff --git a/src/lib/edje_program.c b/src/lib/edje_program.c
index 608cb86..df867dd 100644
--- a/src/lib/edje_program.c
+++ b/src/lib/edje_program.c
@@ -933,11 +933,11 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src)
 	     Eina_List *l;
 	     Edje_Program *pr;
 
-	     if (evas_hash_find(ec->prog_cache.no_matches, tmps))
+	     if (eina_hash_find(ec->prog_cache.no_matches, tmps))
 	       {
 		  done = 1;
 	       }
-	     else if ((matches = evas_hash_find(ec->prog_cache.matches, tmps)))
+	     else if ((matches = eina_hash_find(ec->prog_cache.matches, tmps)))
 	       {
 		 EINA_LIST_FOREACH(matches, l, pr)
 		    {
@@ -988,11 +988,17 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src)
 	     if (tmps)
 	       {
 		  if (data.matched == 0)
-		    ec->prog_cache.no_matches =
-		    evas_hash_add(ec->prog_cache.no_matches, tmps, ed);
+		    {
+		      if (!ec->prog_cache.no_matches)
+			ec->prog_cache.no_matches = eina_hash_string_superfast_new(NULL);
+		      eina_hash_add(ec->prog_cache.no_matches, tmps, ed);
+		    }
 		  else
-		    ec->prog_cache.matches =
-		    evas_hash_add(ec->prog_cache.matches, tmps, data.matches);
+		    {
+		      if (!ec->prog_cache.matches)
+			ec->prog_cache.matches = eina_hash_string_superfast_new(NULL);
+		      eina_hash_add(ec->prog_cache.matches, tmps, data.matches);
+		    }
 	       }
 #endif
 	  }
diff --git a/src/lib/edje_script_only.c b/src/lib/edje_script_only.c
index cfc1c82..e8835c4 100644
--- a/src/lib/edje_script_only.c
+++ b/src/lib/edje_script_only.c
@@ -90,7 +90,7 @@ struct _Sinfo
    } job;
    struct {
       int id;
-      Evas_Hash *hash; // FIXME: hash -> bad. too big. one-way lookup etc.
+      Eina_Hash *hash; // FIXME: hash -> bad. too big. one-way lookup etc.
    } oid;
 };
 
@@ -122,7 +122,7 @@ struct _Oid
    int oid;
 };
 
-/* FIXME: using evas_hash and strings is just nasty! make a custom int hash */
+/* FIXME: using eina_hash and strings is just nasty! make a custom int hash */
 static int
 _oid_alloc(Edje *ed)
 {
@@ -153,7 +153,8 @@ _oid_track(Edje *ed, Evas_Object *o)
    evas_object_clip_set(oi->obj, oi->ed->clipper);
    evas_object_geometry_get(oi->obj, &(oi->x), &(oi->y), &(oi->w), &(oi->h));
    snprintf(buf, sizeof(buf), "%i", oi->oid);
-   si->oid.hash = evas_hash_add(si->oid.hash, buf, oi);
+   if (!si->oid.hash) si->oid.hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(si->oid.hash, buf, oi);
    return oi;
 }
 
@@ -164,7 +165,7 @@ _oid_find(Edje *ed, int oid)
    SI_RETURN(NULL);
 
    snprintf(buf, sizeof(buf), "%i", oid);
-   return evas_hash_find(si->oid.hash, buf);
+   return eina_hash_find(si->oid.hash, buf);
 }
 
 static void
@@ -174,7 +175,7 @@ _oid_del(Edje *ed, int oid)
    SI;
 
    snprintf(buf, sizeof(buf), "%i", oid);
-   si->oid.hash = evas_hash_del(si->oid.hash, buf, NULL);
+   eina_hash_del(si->oid.hash, buf, NULL);
 }
 
 static void
@@ -183,8 +184,8 @@ _oid_free(Oid *oid)
    free(oid);
 }
 
-static Evas_Bool
-_oid_freeall_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+_oid_freeall_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Oid *oid = data;
    evas_object_del(oid->obj);
@@ -197,13 +198,13 @@ _oid_freeall(Edje *ed)
 {
    SI;
    if (!si->oid.hash) return;
-   evas_hash_foreach(si->oid.hash, _oid_freeall_cb, ed);
-   evas_hash_free(si->oid.hash);
+   eina_hash_foreach(si->oid.hash, _oid_freeall_cb, ed);
+   eina_hash_free(si->oid.hash);
    si->oid.hash = NULL;
 }
 
-static Evas_Bool
-_oid_moveall_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+_oid_moveall_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Oid *oid = data;
    evas_object_move(oid->obj, oid->ed->x + oid->x, oid->ed->y + oid->y);
@@ -215,7 +216,7 @@ _oid_moveall(Edje *ed)
 {
    SI;
    if (!si->oid.hash) return;
-   evas_hash_foreach(si->oid.hash, _oid_moveall_cb, ed);
+   eina_hash_foreach(si->oid.hash, _oid_moveall_cb, ed);
 }
 
 /**********/
diff --git a/src/lib/edje_text.c b/src/lib/edje_text.c
index 356c7ab..673ff95 100644
--- a/src/lib/edje_text.c
+++ b/src/lib/edje_text.c
@@ -147,11 +147,15 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
    char *buf;
    int c1 = -1, c2 = -1, loop = 0, extra;
    size_t orig_len;
+   double sc;
 
+   sc = ed->scale;
+   if (sc == 0.0) sc = _edje_scale;
+   
    *free_text = 0;
    if (sw <= 1) return "";
 
-   if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+   if (ep->part->scale) evas_object_scale_set(ep->object, sc);
    evas_object_text_font_set(ep->object, font, size);
    evas_object_text_text_set(ep->object, text);
 
@@ -331,8 +335,10 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
    Evas_Coord	 tw, th;
    Evas_Coord	 sw, sh;
    int		 inlined_font = 0, free_text = 0;
+   double        sc;
 
-
+   sc = ed->scale;
+   if (sc == 0.0) sc = _edje_scale;
    text = chosen_desc->text.text;
    font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont);
 
@@ -359,7 +365,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
    /* check if the font is embedded in the .eet */
    if (ed->file->font_hash)
      {
-	Edje_Font_Directory_Entry *fnt = evas_hash_find(ed->file->font_hash, font);
+	Edje_Font_Directory_Entry *fnt = eina_hash_find(ed->file->font_hash, font);
 
 	if (fnt)
 	  {
@@ -413,7 +419,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
         if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
 	else evas_object_text_font_source_set(ep->object, NULL);
 
-	if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+	if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 	evas_object_text_font_set(ep->object, font, size);
 	evas_object_text_text_set(ep->object, text);
 	part_get_geometry(ep, &tw, &th);
@@ -430,7 +436,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 		  if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
 		  else evas_object_text_font_source_set(ep->object, NULL);
 
-		  if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+		  if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 		  evas_object_text_font_set(ep->object, font, size);
 		  part_get_geometry(ep, &tw, &th);
 		  if ((size > 0) && (tw == 0)) break;
@@ -449,7 +455,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 		  if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
 		  else evas_object_text_font_source_set(ep->object, NULL);
 
-		  if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+		  if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 		  evas_object_text_font_set(ep->object, font, size);
 		  part_get_geometry(ep, &tw, &th);
 		  if ((size > 0) && (tw == 0)) break;
@@ -467,7 +473,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
         if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
 	else evas_object_text_font_source_set(ep->object, NULL);
 
-	if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+	if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 	evas_object_text_font_set(ep->object, font, size);
 	evas_object_text_text_set(ep->object, text);
 	part_get_geometry(ep, &tw, &th);
@@ -488,7 +494,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 		  if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
 		  else evas_object_text_font_source_set(ep->object, NULL);
 
-		  if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+		  if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 		  evas_object_text_font_set(ep->object, font, size);
 		  part_get_geometry(ep, &tw, &th);
 		  if ((size > 0) && (th == 0)) break;
@@ -499,7 +505,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 	  {
 	     int current;
 
-	     if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+	     if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 	     evas_object_text_font_set(ep->object, font, 10);
 	     part_get_geometry(ep, &tw, &th);
 
@@ -516,6 +522,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 		       bottom = 1;
 		       top = 10;
 		    }
+		  else bottom = 0; /* XXX shut up GCC, th == sh is handled before! */
 
 		  top = size;
 		  /* search one that fits (binary search) */
@@ -523,7 +530,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 		    {
 		       current = (top + bottom) / 2;
 
-		       if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+		       if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 		       evas_object_text_font_set(ep->object, font, current);
 		       part_get_geometry(ep, &tw, &th);
 
@@ -537,7 +544,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 	       {
 		  current++;
 
-		  if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+		  if (ep->part->scale) evas_object_scale_set(ep->object, sc);
 		  evas_object_text_font_set(ep->object, font, current);
 		  part_get_geometry(ep, &tw, &th);
 	       } while (th <= sh);
@@ -569,7 +576,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
    if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
    else evas_object_text_font_source_set(ep->object, NULL);
 
-   if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
+   if (ep->part->scale) evas_object_scale_set(ep->object, sc);
    evas_object_text_font_set(ep->object, font, size);
    evas_object_text_text_set(ep->object, text);
    part_get_geometry(ep, &tw, &th);
diff --git a/src/lib/edje_util.c b/src/lib/edje_util.c
index 81cdc9d..85ea21d 100644
--- a/src/lib/edje_util.c
+++ b/src/lib/edje_util.c
@@ -40,8 +40,8 @@ struct _Edje_List_Foreach_Data
    Eina_List *list;
 };
 
-static Evas_Bool _edje_color_class_list_foreach(const Evas_Hash *hash, const char *key, void *data, void *fdata);
-static Evas_Bool _edje_text_class_list_foreach(const Evas_Hash *hash, const char *key, void *data, void *fdata);
+static Evas_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
+static Evas_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
 
 Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);
 
@@ -163,6 +163,28 @@ edje_scale_get(void)
    return _edje_scale;
 }
 
+EAPI void
+edje_object_scale_set(Evas_Object *obj, double scale)
+{
+   Edje *ed;
+
+   ed = _edje_fetch(obj);
+   if (!ed) return;
+   if (ed->scale == scale) return;
+   ed->scale = scale;
+   edje_object_calc_force(obj);
+}
+
+EAPI double
+edje_object_scale_get(const Evas_Object *obj)
+{
+   Edje *ed;
+
+   ed = _edje_fetch(obj);
+   if (!ed) return 0.0;
+   return ed->scale;
+}
+
 /* FIXDOC: Verify/Expand */
 /** Get Edje object data
  * @param obj A valid Evas_Object handle
@@ -287,7 +309,7 @@ edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2
 
    if (!color_class) return;
 
-   cc = evas_hash_find(_edje_color_class_hash, color_class);
+   cc = eina_hash_find(_edje_color_class_hash, color_class);
    if (!cc)
      {
         cc = calloc(1, sizeof(Edje_Color_Class));
@@ -298,15 +320,8 @@ edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2
 	     free(cc);
 	     return;
 	  }
-	_edje_color_class_hash =
-          evas_hash_add(_edje_color_class_hash, color_class, cc);
-	if (evas_hash_alloc_error())
-	  {
-	     eina_stringshare_del(cc->name);
-	     free(cc);
-	     return;
-	  }
-
+	if (!_edje_color_class_hash) _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
+        eina_hash_add(_edje_color_class_hash, color_class, cc);
      }
 
    if (r < 0)   r = 0;
@@ -337,7 +352,7 @@ edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2
    cc->b3 = b3;
    cc->a3 = a3;
 
-   members = evas_hash_find(_edje_color_class_member_hash, color_class);
+   members = eina_hash_find(_edje_color_class_member_hash, color_class);
    while (members)
      {
 	Edje *ed;
@@ -362,15 +377,14 @@ edje_color_class_del(const char *color_class)
 
    if (!color_class) return;
 
-   cc = evas_hash_find(_edje_color_class_hash, color_class);
+   cc = eina_hash_find(_edje_color_class_hash, color_class);
    if (!cc) return;
 
-   _edje_color_class_hash =
-     evas_hash_del(_edje_color_class_hash, color_class, cc);
+   eina_hash_del(_edje_color_class_hash, color_class, cc);
    eina_stringshare_del(cc->name);
    free(cc);
 
-   members = evas_hash_find(_edje_color_class_member_hash, color_class);
+   members = eina_hash_find(_edje_color_class_member_hash, color_class);
    while (members)
      {
 	Edje *ed;
@@ -394,14 +408,14 @@ edje_color_class_list(void)
    Edje_List_Foreach_Data fdata;
 
    memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
-   evas_hash_foreach(_edje_color_class_member_hash,
+   eina_hash_foreach(_edje_color_class_member_hash,
                      _edje_color_class_list_foreach, &fdata);
 
    return fdata.list;
 }
 
-static Evas_Bool
-_edje_color_class_list_foreach(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+_edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Edje_List_Foreach_Data *fd;
 
@@ -570,7 +584,7 @@ edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size siz
    if (!text_class) return;
    if (!font) font = "";
 
-   tc = evas_hash_find(_edje_text_class_hash, text_class);
+   tc = eina_hash_find(_edje_text_class_hash, text_class);
    /* Create new text class */
    if (!tc)
      {
@@ -582,14 +596,8 @@ edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size siz
 	     free(tc);
 	     return;
 	  }
-	_edje_text_class_hash =
-          evas_hash_add(_edje_text_class_hash, text_class, tc);
-	if (evas_hash_alloc_error())
-	  {
-	     eina_stringshare_del(tc->name);
-	     free(tc);
-	     return;
-	  }
+	if (!_edje_text_class_hash) _edje_text_class_hash = eina_hash_string_superfast_new(NULL);
+        eina_hash_add(_edje_text_class_hash, text_class, tc);
 
 	tc->font = eina_stringshare_add(font);
 	tc->size = size;
@@ -605,15 +613,14 @@ edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size siz
    tc->font = eina_stringshare_add(font);
    if (!tc->font)
      {
-	_edje_text_class_hash =
-          evas_hash_del(_edje_text_class_hash, text_class, tc);
+        eina_hash_del(_edje_text_class_hash, text_class, tc);
 	free(tc);
 	return;
      }
    tc->size = size;
 
    /* Tell all members of the text class to recalc */
-   members = evas_hash_find(_edje_text_class_member_hash, text_class);
+   members = eina_hash_find(_edje_text_class_member_hash, text_class);
    while (members)
      {
 	Edje *ed;
@@ -639,16 +646,15 @@ edje_text_class_del(const char *text_class)
 
    if (!text_class) return;
 
-   tc = evas_hash_find(_edje_text_class_hash, text_class);
+   tc = eina_hash_find(_edje_text_class_hash, text_class);
    if (!tc) return;
 
-   _edje_text_class_hash =
-     evas_hash_del(_edje_text_class_hash, text_class, tc);
+   eina_hash_del(_edje_text_class_hash, text_class, tc);
    eina_stringshare_del(tc->name);
    eina_stringshare_del(tc->font);
    free(tc);
 
-   members = evas_hash_find(_edje_text_class_member_hash, text_class);
+   members = eina_hash_find(_edje_text_class_member_hash, text_class);
    while (members)
      {
 	Edje *ed;
@@ -673,14 +679,14 @@ edje_text_class_list(void)
    Edje_List_Foreach_Data fdata;
 
    memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
-   evas_hash_foreach(_edje_text_class_member_hash,
+   eina_hash_foreach(_edje_text_class_member_hash,
                      _edje_text_class_list_foreach, &fdata);
 
    return fdata.list;
 }
 
-static Evas_Bool
-_edje_text_class_list_foreach(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+_edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Edje_List_Foreach_Data *fd;
 
@@ -1026,9 +1032,9 @@ edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *tex
 /** Returns a list of char * anchor names
  * @param obj A valid Evas_Object handle
  * @param part The part name
- * @return The list of anchors (const char *)
+ * @return The list of anchors (const char *), do not modify!
  */
-EAPI Eina_List *
+EAPI const Eina_List *
 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
 {
    Edje *ed;
@@ -1047,9 +1053,9 @@ edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param anchor The anchor name
- * @return The list of anchor rects (const Evas_Textblock_Rectangle *)
+ * @return The list of anchor rects (const Evas_Textblock_Rectangle *), do not modify!
  */
-EAPI Eina_List *
+EAPI const Eina_List *
 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
 {
    Edje *ed;
@@ -1117,6 +1123,13 @@ edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_sw
    if ((!ed) || (!part)) return;
 
    /* Need to recalc before providing the object. */
+   // XXX: I guess this is not required, removing for testing purposes
+   // XXX: uncomment if you see glitches in e17 or others.
+   // XXX: by Gustavo, January 21th 2009.
+   // XXX: I got a backtrace with over 30000 calls without this,
+   // XXX: only with 32px shelves. The problem is probably somewhere else,
+   // XXX: but until it's found, leave this here.
+   // XXX: by Sachiel, January 21th 2009, 19:30 UTC
    _edje_recalc_do(ed);
 
    rp = _edje_real_part_recursive_get(ed, (char *)part);
@@ -1148,7 +1161,6 @@ _recalc_extern_parent(Evas_Object *obj)
 EAPI void
 edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
 {
-   int mw, mh;
    Edje_Real_Part *rp;
 
    evas_object_size_hint_min_set(obj, minw, minh);
@@ -1225,27 +1237,26 @@ edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas
      }
 }
 
-
-static const struct edje_box_layout_builtin {
+struct edje_box_layout_builtin {
    const char *name;
    Evas_Object_Box_Layout cb;
-} _edje_box_layout_builtin[] = {
-  /* KEEP SORTED AND UPDATE OFFSETS BELOW AT _edje_box_layout_builtin_find() */
-  {"horizontal", evas_object_box_layout_horizontal},
-  {"horizontal_flow", evas_object_box_layout_flow_horizontal},
-  {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
-  {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
-  {"stack", evas_object_box_layout_stack},
-  {"vertical", evas_object_box_layout_vertical},
-  {"vertical_flow", evas_object_box_layout_flow_vertical},
-  {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
-  {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
-  {NULL, NULL}
 };
 
 static Evas_Object_Box_Layout
 _edje_box_layout_builtin_find(const char *name)
 {
+   const struct edje_box_layout_builtin _edje_box_layout_builtin[] = {
+     {"horizontal", evas_object_box_layout_horizontal},
+     {"horizontal_flow", evas_object_box_layout_flow_horizontal},
+     {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
+     {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
+     {"stack", evas_object_box_layout_stack},
+     {"vertical", evas_object_box_layout_vertical},
+     {"vertical_flow", evas_object_box_layout_flow_vertical},
+     {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
+     {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
+     {NULL, NULL}
+   };
    const struct edje_box_layout_builtin *base;
 
    switch (name[0])
@@ -2336,11 +2347,11 @@ edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Evas_Bool cl
    Edje_Real_Part *rp;
 
    ed = _edje_fetch(obj);
-   if ((!ed) || (!part)) return NULL;
+   if ((!ed) || (!part)) return 0;
 
    rp = _edje_real_part_recursive_get(ed, part);
-   if (!rp) return NULL;
-   if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
+   if (!rp) return 0;
+   if (rp->part->type != EDJE_PART_TYPE_BOX) return 0;
 
    return _edje_real_part_box_remove_all(rp, clear);
 
@@ -2419,33 +2430,178 @@ _edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos)
 Evas_Bool
 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Evas_Bool clear)
 {
-   Evas_Object_Box_Data *priv;
-   Eina_List *l, *l_next;
+   Eina_List *children;
    int i;
 
    if (eina_list_count(rp->items) == 0)
      return evas_object_box_remove_all(rp->object, clear);
-   priv = evas_object_smart_data_get(rp->object);
    i = 0;
-   for (l = priv->children; l != NULL; l = l_next)
+   children = evas_object_box_children_get(rp->object);
+   while (children)
      {
-	Evas_Object_Box_Option *opt = l->data;
-	Evas_Object *child_obj;
-	l_next = l->next;
-	child_obj = opt->obj;
+	Evas_Object *child_obj = children->data;
 	if (evas_object_data_get(child_obj, "\377 edje.box_item"))
+	  i++;
+	else
 	  {
-	     i++;
-	     continue;
+	     if (!evas_object_box_remove_at(rp->object, i))
+	       return 0;
+	     if (clear)
+	       evas_object_del(child_obj);
 	  }
-	if (!evas_object_box_remove_at(rp->object, i))
-	  return 0;
-	if (clear)
-	  evas_object_del(child_obj);
+	children = eina_list_remove_list(children, children);
      }
    return 1;
 }
 
+/** Packs an object into the table
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ * @param child The object to pack in
+ * @param col The column to place it in
+ * @param row The row to place it in
+ * @param colspan Columns the child will take
+ * @param rowspan Rows the child will take
+ *
+ * @return 1: Successfully added.\n
+ * 0: An error occured.
+ *
+ * Packs an object into the table indicated by part.\n
+ */
+EAPI Evas_Bool
+edje_object_part_table_pack(Evas_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+
+   rp = _edje_real_part_recursive_get(ed, part);
+   if (!rp) return 0;
+   if (rp->part->type != EDJE_PART_TYPE_TABLE) return 0;
+
+   return _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
+}
+
+/** Removes an object from the table
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ * @param child The object to pack in
+ *
+ * @return 1: Successfully removed.\n
+ * 0: An error occured.
+ *
+ * Removes an object from the table indicated by part.\n
+ */
+EAPI Evas_Bool
+edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+
+   rp = _edje_real_part_recursive_get(ed, part);
+   if (!rp) return 0;
+   if (rp->part->type != EDJE_PART_TYPE_TABLE) return 0;
+
+   return _edje_real_part_table_unpack(rp, child_obj);
+}
+
+/** Gets the number of columns and rows the table has
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ * @param cols Pointer where to store number of columns (can be NULL)
+ * @param rows Pointer where to store number of rows (can be NULL)
+ *
+ * @return 1: Successfully get some data.\n
+ * 0: An error occured.
+ *
+ * Retrieves the size of the table in number of columns and rows.\n
+ */
+EAPI Evas_Bool
+edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+
+   rp = _edje_real_part_recursive_get(ed, part);
+   if (!rp) return 0;
+   if (rp->part->type != EDJE_PART_TYPE_TABLE) return 0;
+
+   evas_object_table_col_row_size_get(rp->object, cols, rows);
+   return 1;
+}
+
+/** Removes all object from the table
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ * @param clear If set, will delete subobjs on remove
+ *
+ * @return 1: Successfully clear table.\n
+ * 0: An error occured.
+ *
+ * Removes all object from the table indicated by part, except
+ * the internal ones set from the theme.\n
+ */
+EAPI Evas_Bool
+edje_object_part_table_clear(Evas_Object *obj, const char *part, Evas_Bool clear)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+
+   rp = _edje_real_part_recursive_get(ed, part);
+   if (!rp) return 0;
+   if (rp->part->type != EDJE_PART_TYPE_TABLE) return 0;
+
+   _edje_real_part_table_clear(rp, clear);
+   return 1;
+}
+
+Evas_Bool
+_edje_real_part_table_pack(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
+{
+   return evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
+}
+
+Evas_Bool
+_edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj)
+{
+   return evas_object_table_unpack(rp->object, child_obj);
+}
+
+void
+_edje_real_part_table_clear(Edje_Real_Part *rp, Evas_Bool clear)
+{
+   Eina_List *children;
+
+   if (eina_list_count(rp->items) == 0)
+     {
+	evas_object_table_clear(rp->object, clear);
+	return;
+     }
+   children = evas_object_table_children_get(rp->object);
+   while (children)
+     {
+	Evas_Object *child_obj = children->data;
+	if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
+	  {
+	     evas_object_table_unpack(rp->object, child_obj);
+	     if (clear)
+	       evas_object_del(child_obj);
+	  }
+	children = eina_list_remove_list(children, children);
+     }
+}
+
 Edje_Real_Part *
 _edje_real_part_recursive_get(Edje *ed, const char *part)
 {
@@ -2511,7 +2667,7 @@ _edje_color_class_find(Edje *ed, const char *color_class)
      if ((cc->name) && (!strcmp(color_class, cc->name))) return cc;
 
    /* next look through the global scope */
-   cc = evas_hash_find(_edje_color_class_hash, color_class);
+   cc = eina_hash_find(_edje_color_class_hash, color_class);
    if (cc) return cc;
 
    /* finally, look through the file scope */
@@ -2527,16 +2683,15 @@ _edje_color_class_member_add(Edje *ed, const char *color_class)
    Eina_List *members;
 
    if ((!ed) || (!color_class)) return;
-   members = evas_hash_find(_edje_color_class_member_hash, color_class);
+   members = eina_hash_find(_edje_color_class_member_hash, color_class);
    if (members)
      {
-        _edje_color_class_member_hash =
-          evas_hash_del(_edje_color_class_member_hash, color_class, members);
+        eina_hash_del(_edje_color_class_member_hash, color_class, members);
      }
 
    members = eina_list_prepend(members, ed);
-   _edje_color_class_member_hash =
-     evas_hash_add(_edje_color_class_member_hash, color_class, members);
+   if (!_edje_color_class_member_hash) _edje_color_class_member_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(_edje_color_class_member_hash, color_class, members);
 }
 
 void
@@ -2545,16 +2700,14 @@ _edje_color_class_member_del(Edje *ed, const char *color_class)
    Eina_List *members;
 
    if ((!ed) || (!color_class)) return;
-   members = evas_hash_find(_edje_color_class_member_hash, color_class);
+   members = eina_hash_find(_edje_color_class_member_hash, color_class);
    if (!members) return;
 
-   _edje_color_class_member_hash =
-     evas_hash_del(_edje_color_class_member_hash, color_class, members);
+   eina_hash_del(_edje_color_class_member_hash, color_class, members);
    members = eina_list_remove(members, ed);
    if (members)
      {
-        _edje_color_class_member_hash =
-          evas_hash_add(_edje_color_class_member_hash, color_class, members);
+	eina_hash_add(_edje_color_class_member_hash, color_class, members);
      }
 }
 
@@ -2562,8 +2715,8 @@ _edje_color_class_member_del(Edje *ed, const char *color_class)
  * Used to free the member lists that are stored in the text_class
  * and color_class hashtables.
  */
-static Evas_Bool
-member_list_free(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+member_list_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    eina_list_free(data);
    return 1;
@@ -2573,13 +2726,13 @@ void
 _edje_color_class_members_free(void)
 {
    if (!_edje_color_class_member_hash) return;
-   evas_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
-   evas_hash_free(_edje_color_class_member_hash);
+   eina_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
+   eina_hash_free(_edje_color_class_member_hash);
    _edje_color_class_member_hash = NULL;
 }
 
-static Evas_Bool
-color_class_hash_list_free(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+color_class_hash_list_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Edje_Color_Class *cc;
 
@@ -2593,8 +2746,8 @@ void
 _edje_color_class_hash_free(void)
 {
    if (!_edje_color_class_hash) return;
-   evas_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
-   evas_hash_free(_edje_color_class_hash);
+   eina_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
+   eina_hash_free(_edje_color_class_hash);
    _edje_color_class_hash = NULL;
 }
 
@@ -2621,7 +2774,7 @@ _edje_text_class_find(Edje *ed, const char *text_class)
    if ((!ed) || (!text_class)) return NULL;
    EINA_LIST_FOREACH(ed->text_classes, l, tc)
      if ((tc->name) && (!strcmp(text_class, tc->name))) return tc;
-   return evas_hash_find(_edje_text_class_hash, text_class);
+   return eina_hash_find(_edje_text_class_hash, text_class);
 }
 
 void
@@ -2632,21 +2785,20 @@ _edje_text_class_member_add(Edje *ed, const char *text_class)
    if ((!ed) || (!text_class)) return;
 
    /* Get members list */
-   members = evas_hash_find(_edje_text_class_member_hash, text_class);
+   members = eina_hash_find(_edje_text_class_member_hash, text_class);
 
    /* Remove members list */
    if (members)
      {
-        _edje_text_class_member_hash =
-          evas_hash_del(_edje_text_class_member_hash, text_class, members);
+        eina_hash_del(_edje_text_class_member_hash, text_class, members);
      }
 
    /* Update the member list */
    members = eina_list_prepend(members, ed);
 
    /* Add the member list back */
-   _edje_text_class_member_hash =
-     evas_hash_add(_edje_text_class_member_hash, text_class, members);
+   if (!_edje_text_class_member_hash) _edje_text_class_member_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(_edje_text_class_member_hash, text_class, members);
 }
 
 void
@@ -2655,17 +2807,15 @@ _edje_text_class_member_del(Edje *ed, const char *text_class)
    Eina_List *members;
 
    if ((!ed) || (!text_class)) return;
-   members = evas_hash_find(_edje_text_class_member_hash, text_class);
+   members = eina_hash_find(_edje_text_class_member_hash, text_class);
    if (!members) return;
 
-   _edje_text_class_member_hash =
-     evas_hash_del(_edje_text_class_member_hash, text_class, members);
+   eina_hash_del(_edje_text_class_member_hash, text_class, members);
 
    members = eina_list_remove(members, ed);
    if (members)
      {
-        _edje_text_class_member_hash =
-          evas_hash_add(_edje_text_class_member_hash, text_class, members);
+        eina_hash_add(_edje_text_class_member_hash, text_class, members);
      }
 }
 
@@ -2673,13 +2823,13 @@ void
 _edje_text_class_members_free(void)
 {
    if (!_edje_text_class_member_hash) return;
-   evas_hash_foreach(_edje_text_class_member_hash, member_list_free, NULL);
-   evas_hash_free(_edje_text_class_member_hash);
+   eina_hash_foreach(_edje_text_class_member_hash, member_list_free, NULL);
+   eina_hash_free(_edje_text_class_member_hash);
    _edje_text_class_member_hash = NULL;
 }
 
-static Evas_Bool
-text_class_hash_list_free(const Evas_Hash *hash, const char *key, void *data, void *fdata)
+static Eina_Bool
+text_class_hash_list_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
    Edje_Text_Class *tc;
 
@@ -2694,8 +2844,8 @@ void
 _edje_text_class_hash_free(void)
 {
    if (!_edje_text_class_hash) return;
-   evas_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
-   evas_hash_free(_edje_text_class_hash);
+   eina_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
+   eina_hash_free(_edje_text_class_hash);
    _edje_text_class_hash = NULL;
 }
 
diff --git a/utils/Makefile.in b/utils/Makefile.in
index 37c204c..ea97d68 100644
--- a/utils/Makefile.in
+++ b/utils/Makefile.in
@@ -57,7 +57,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_DOCS = @BUILD_DOCS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -67,7 +66,6 @@ CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
 DSYMUTIL = @DSYMUTIL@
 ECHO = @ECHO@
 ECHO_C = @ECHO_C@
@@ -144,6 +142,8 @@ datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
+efl_doxygen = @efl_doxygen@
+efl_have_doxygen = @efl_have_doxygen@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@

-- 
Enlightenment DR17 graphical layout and animation library



More information about the Pkg-e-commits mailing list