Compare commits

...

61 Commits

Author SHA1 Message Date
Daniel Zaoui eb3ddfea13 Adapt code to latest EFL changes 2015-12-27 16:16:46 +02:00
Daniel Zaoui d78598d7cd Normalize opcodes strings 2015-12-23 16:24:12 +02:00
Daniel Zaoui 3bf1b09eea Use int instead of uint32_t 2015-12-23 11:17:30 +02:00
Avi Levin 6635243951 Renaming elementary debug module to eo debug 2015-12-22 14:25:43 +02:00
Daniel Zaoui eddd35e669 Remove Debug Client 2015-12-22 10:26:34 +02:00
Daniel Zaoui ea503ffbad Fix script formatting when extracted from entry 2015-12-09 14:04:02 +02:00
Daniel Zaoui f178802f0b Revert "Adding screenshot support"
This reverts commit a517c9a522.

Screenshot feature has not been added in debug repository yet.
2015-12-06 14:10:52 +02:00
Daniel Zaoui 8cabd2b4fd Remote shell: add support to scripts 2015-12-06 14:07:30 +02:00
Avi Levin a517c9a522 Adding screenshot support 2015-12-03 13:32:38 +02:00
Daniel Zaoui eb055acb19 Use Base16 codec on shell remote 2015-12-02 18:43:16 +02:00
Daniel Zaoui 6908cd0f20 Support shell remote 2015-12-02 14:55:03 +02:00
Daniel Zaoui 6abb5cab36 Rewrite screenshot icon creation by using Erigo 2015-11-24 11:32:12 +02:00
Daniel Zaoui f1963435ba Profiles: add a new profile window
Two profiles are possible: local and shell remote.

Only local can work for the moment.
2015-11-24 09:44:22 +02:00
Daniel Zaoui 1b6255b4a2 Revert "TEMP: add ability to make screenshot"
This reverts commit 98487b5019.

This feature is not ready yet. Too much code has been copied from first
Clouseau but not adapted to this version (window creation from C code,
APIs wrongly named...).
2015-11-24 09:44:22 +02:00
Avi Levin 98487b5019 TEMP: add ability to make screenshot 2015-11-23 20:03:20 +02:00
Avi Levin 6aa70bfb1d Add new button in obj gen list for taking screenshot 2015-11-22 17:18:11 +02:00
Avi Levin 4436a1350b Show tooltip over func item in obj info genlist
The tooltip will show same data in the item and will add:
Value in Hex
type of param
2015-11-19 17:53:48 +02:00
Avi Levin 6535ef4cd8 Print full class name in eo info genlist 2015-11-19 17:23:59 +02:00
Avi Levin 0ab0160f34 Print params values in obj info genlist by their real type 2015-11-19 17:23:56 +02:00
Avi Levin 62d1fa87d9 Remove unnecassary operation 2015-11-19 13:08:58 +02:00
Avi Levin 2d23cb3c3b Dont show funcs items in obj info genlist as ITEM_TREE 2015-11-19 13:02:16 +02:00
Daniel Zaoui 8f0c6d63d0 Refactor GUI for profiles
Before, profiles window was created first and, when the profile was
selected, the window was deleted and the main window was created. The
problem was that the second window was created behind all the existing
windows of the desktop.
Now, the main and profile windows are generated. The profile one is set
as modal, so the main is not accessible.
2015-11-19 09:04:22 +02:00
Avi Levin d0128f01b3 Fixes 2015-11-18 17:31:50 +02:00
Avi Levin d9ffab2699 Print params in same line with func in obj info genlist 2015-11-18 17:29:57 +02:00
Daniel Zaoui 9f43b8c2d2 Revert "Printing values using new function from eolian debug"
This reverts commit 398d9facb6.
2015-11-17 16:43:17 +02:00
Avi Levin 398d9facb6 Printing values using new function from eolian debug
Printing values more accurate to their type
2015-11-17 16:21:54 +02:00
Avi Levin 2cb62129fe Improving finding type of params
No we use _eolian_type_to_string to get the eolian type.
It give the full rep of the type - even with const.
2015-11-17 15:45:40 +02:00
Daniel Zaoui 444b8401f4 Modify widgets names for a better readability 2015-11-17 15:27:39 +02:00
Daniel Zaoui 74a7e6af2a Connection profiles: modify GUI
Now, first window shows the available connections types. After selecting
one, the ok button can be clicked to show the regular window.
2015-11-17 15:07:20 +02:00
Daniel Zaoui ed6163eace Connection profiles: create local profile if missing 2015-11-17 11:00:21 +02:00
Daniel Zaoui abf6c901d8 Connection profiles: read profiles from local directory 2015-11-17 11:00:21 +02:00
Daniel Zaoui 918c7c21c4 Support highlight for Evas objects 2015-11-17 09:06:34 +02:00
Daniel Zaoui 9ba927933a Clear object info genlist on app and object update 2015-11-17 09:06:32 +02:00
Daniel Zaoui dfe69a8010 Prettify GUI 2015-11-17 09:06:30 +02:00
Daniel Zaoui d64e4669d1 Fix Valgrind issue where memory was not freed 2015-11-17 09:06:27 +02:00
Avi Levin ceb5ec1c79 Improving Eolian param handling
Instead of receiving class/func/param names as char * we now have
their Eolian type. That way we can easily get info as type and name of
params.
We now also have new type - CLOUSEAU_OBJ_RET. For Eolian funcs that dont
define "pram type" for their return value we dont have part of the info
that we have on normal Eolian param (such as name). For that case we use OBJ_RET.
2015-11-17 08:54:53 +02:00
Daniel Zaoui 3c912d4d52 Mode code cleaning 2015-11-15 16:58:59 +02:00
Daniel Zaoui a77bd649da Rename static member 2015-11-15 15:49:28 +02:00
Daniel Zaoui 4c2f99b572 Clean code 2015-11-15 15:48:08 +02:00
Daniel Zaoui fec134acba Remove unused code 2015-11-15 15:40:31 +02:00
Daniel Zaoui 4d76b6954c Clean label get function
Maximum length is not needed for classes and functions. More, strings
don't need to be cut.
2015-11-15 15:39:52 +02:00
Avi Levin 2af058297d TEMP: support Debug Eolian values in clouseau gui 2015-11-15 14:31:45 +02:00
Daniel Zaoui 481bdef39c Add command to install Clouseau 2015-11-15 10:31:10 +02:00
Daniel Zaoui 6bd8897feb Support Elementary module 2015-11-12 14:24:02 +02:00
Daniel Zaoui 4b628f199e Fix GUI layout 2015-11-12 08:53:47 +02:00
Daniel Zaoui 2f0627d912 Use only one debug client 2015-11-11 18:23:23 +02:00
Daniel Zaoui 34def6c0cb Fix indentation 2015-11-11 18:20:00 +02:00
Daniel Zaoui 53bee0201b Eolian: support request sending and decoding 2015-11-11 18:14:35 +02:00
Daniel Zaoui ff86dd67de Cmake: support edebug 2015-11-11 18:14:18 +02:00
Daniel Zaoui a934706910 Fix warnings 2015-11-10 10:48:18 +02:00
Avi Levin 748c228a4e TEMP: adding supportt in Eolian get object info
When choosing object from the objs genlist
2015-11-09 19:36:11 +02:00
Avi Levin 0e46a2e7f3 Expand object genlist hierarchically - by obj parent 2015-11-09 19:36:05 +02:00
Daniel Zaoui 937b22b0e1 Ignore build directory 2015-11-04 16:58:06 +02:00
Daniel Zaoui 840b73a3d9 Remove useless folder 2015-11-04 16:57:13 +02:00
Avi Levin e181565eb6 Clean up
Remove testing prints. remove args handling from old cli.
2015-11-03 16:02:02 +02:00
Avi Levin 1432e60e67 Expand object genlist hierarchically - by obj parent 2015-11-03 16:02:02 +02:00
Avi Levin e10deb0479 Fill objects genlist when selecting app 2015-11-03 16:02:02 +02:00
Avi Levin 99d3ca6b25 Save selected app from hoversel 2015-11-03 16:02:02 +02:00
Avi Levin 183599f90b Add support in elm list opcode 2015-11-03 16:02:01 +02:00
Avi Levin 1e22bc3d67 Init files structures 2015-11-03 16:02:01 +02:00
Avi Levin f1ca530cc0 Clean old clouseau files 2015-11-03 16:01:36 +02:00
58 changed files with 2049 additions and 6257 deletions

1
.gitignore vendored
View File

@ -45,3 +45,4 @@ INSTALL
src/bin/clouseaud
src/bin/clouseau_client
src/scripts/clouseau_start
build/

View File

@ -1 +0,0 @@
Tom Hacohen <tom@stosb.com>

18
CMakeLists.txt Normal file
View File

@ -0,0 +1,18 @@
cmake_minimum_required(VERSION 2.8.1)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
project(CLOUSEAU)
find_package(Efl REQUIRED)
find_package(Eina REQUIRED)
find_package(Eet REQUIRED)
find_package(Efreet REQUIRED)
find_package(Eolian REQUIRED)
find_package(Eo REQUIRED)
find_package(Elementary REQUIRED)
find_package(Ecore REQUIRED)
find_package(Evas REQUIRED)
find_package(Edebug REQUIRED)
add_subdirectory(src/bin)

25
COPYING
View File

@ -1,25 +0,0 @@
Copyright notice for Clouseau:
Copyright (C) 2000-2011 Tom Hacohen and various contributors (see AUTHORS)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1 +0,0 @@
The icons in this repository are herefore released into the Public Domain.

View File

View File

@ -1,13 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
config.h.in config.sub configure install-sh \
depcomp libtool missing
EXTRA_DIST = README AUTHORS COPYING autogen.sh
SUBDIRS = src data
ACLOCAL_AMFLAGS = -I m4
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = clouseau.pc

0
NEWS
View File

19
README
View File

@ -1,19 +0,0 @@
An UI inspection tool for the EFL. This tool lets you inspect UI elements and get a lot of their properties, e.g position, size and weight.
Clouseau consists of a client (clouseau_client) and launcher (clouseau_server). This design means we can:
1. Run the application we are debugging on one device and the clouseau_client itself on another.
2. Run the application we are debugging with a different environment/theme/etc compared to the clouseau client.
Clouseau provides a wrapper script that automatically launches the application with clouseau support, and launches the client, the script is called "clouseau".
Usage:
1. Using the wrapper script:
"clouseau elementary_test" or "clouseau elementary_test Entry".
2. Using the split client/server approach (different machines/environments/setups):
"clouseau_start elementary_test" and then "clouseau_client"
As mentioned above, this is done over the network, so it can be run from different machines
Using the clouseau client:
When the client opens you'll be asked to enter the server's IP address. That's the IP address of where you ran clouseau_start from. When in doubt, just use the default, 127.0.0.1.
Then press "Ok" to connect to the server, and the rest should be fairly straightforward.
TBD

18
TODO
View File

@ -1,18 +0,0 @@
* Make it possible to hide rects? or show only elm-widgets? or something similar? too much clutter atm.
* Add filter?
* Make it an elm module (or setting an env var without a module?) so I'll be able to remotely connect to elm apps.
* Split UI and actual program code (better to do the previous bullet first).
* Add "grab screenshot" button.
* Add a clipping range rectangle.
* Add special per object info, for example edje part names?
* When items are coloured, show the exact colour using a rect?
* Handle map/proxy
* add a way to filter object with some regexp on the name and also finding a specific object according to name.
* Add general info like hinting/whole interface scale/finger size and etc.
* Things to show per-object
* clipping info.
* callback list?
* Fix has_focus.
* Hook on feed events or something and let us see who gets what?

View File

@ -1,14 +0,0 @@
#!/bin/sh
rm -rf autom4te.cache
rm -f aclocal.m4 ltmain.sh
echo "Running aclocal..." ; aclocal -I m4 $ACLOCAL_FLAGS || exit 1
echo "Running autoheader..." ; autoheader || exit 1
echo "Running autoconf..." ; autoconf || exit 1
echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1
echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1
if [ -z "$NOCONFIGURE" ]; then
./configure "$@"
fi

View File

@ -1,10 +0,0 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: clouseau
Description: Clouseau lib for elm debug
Version: @VERSION@
Libs: -L${libdir} -llibclouseau
Cflags: -I${includedir}/clouseau-@VMAJ@

View File

@ -0,0 +1,40 @@
# - Try to find ffi
# Once done this will define
# FFI_FOUND - System has ffi
# FFI_INCLUDE_DIRS - The ffi include directories
# FFI_LIBRARIES - The libraries needed to use ffi
# FFI_LDFLAGS_OTHER - Other LDFLAGS needed te use ffi.
# FFI_DEFINITIONS - Compiler switches required for using ffi
find_package(PkgConfig)
if ("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_GREATER "2.8.1")
# "QUIET" was introduced in 2.8.2
set(_QUIET QUIET)
endif ()
pkg_check_modules(PC_LIBFFI ${_QUIET} libffi)
#set(FFI_DEFINITIONS ${PC_LIBFFI_CFLAGS_OTHER})
#set(FFI_LDFLAGS_OTHER ${PC_LIBFFI_LDFLAGS_OTHER})
# before verison 2.8.11 variable CMAKE_LIBRARY_ARCHITECTURE wasn't automatically added to search path
if ("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.11")
set(FIND_PATH_HINTS ${PC_LIBFFI_INCLUDEDIR}/${CMAKE_LIBRARY_ARCHITECTURE})
endif ()
find_path(FFI_INCLUDE_DIR ffi.h
HINTS ${PC_LIBFFI_INCLUDEDIR} ${PC_LIBFFI_INCLUDE_DIRS}
${FIND_PATH_HINTS}
)
find_library(FFI_LIBRARY NAMES ffi libffi
HINTS ${PC_LIBFFI_LIBDIR} ${PC_LIBFFI_LIBRARY_DIRS})
set(FFI_INCLUDE_DIRS ${FFI_INCLUDE_DIR})
set(FFI_LIBRARIES ${FFI_LIBRARY})
#include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set EINA_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(ffi DEFAULT_MSG
FFI_LIBRARY)
mark_as_advanced(FFI_INCLUDE_DIRS FFI_LIBRARY)

View File

@ -1,120 +0,0 @@
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
m4_define([v_maj], [0])
m4_define([v_min], [2])
m4_define([v_mic], [0])
m4_define([v_rev], m4_esyscmd([(git rev-list --count HEAD 2>/dev/null || echo 0) | tr -d '\n']))dnl
##-- When released, remove the dnl on the below line
dnl m4_undefine([v_rev])
##-- When doing snapshots - change soname. remove dnl on below line
dnl m4_define([relname], [ver-pre-svn-07])
dnl m4_define([v_rel], [-release relname])
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
m4_ifdef([v_rev], [m4_define([v_ver], [v_maj.v_min.v_mic.v_rev])], [m4_define([v_ver], [v_maj.v_min.v_mic])])
m4_define([lt_cur], m4_eval(v_maj + v_min))
m4_define([lt_rev], v_mic)
m4_define([lt_age], v_min)
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
AC_INIT(clouseau, [v_ver], tom@stosb.com)
AC_PREREQ(2.52)
AC_CONFIG_SRCDIR(configure.ac)
AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE(1.6 dist-bzip2)
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AC_CONFIG_HEADERS(config.h)
AC_GNU_SOURCE
AC_PROG_LIBTOOL
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
m4_ifdef([v_rev], , [m4_define([v_rev], [0])])
m4_ifdef([v_rel], , [m4_define([v_rel], [])])
AC_DEFINE_UNQUOTED(VMAJ, [v_maj], [Major version])
AC_DEFINE_UNQUOTED(VMIN, [v_min], [Minor version])
AC_DEFINE_UNQUOTED(VMIC, [v_mic], [Micro version])
AC_DEFINE_UNQUOTED(VREV, [v_rev], [Revison])
version_info="lt_cur:lt_rev:lt_age"
release_info="v_rel"
AC_SUBST(version_info)
AC_SUBST(release_info)
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
VMAJ=v_maj
AC_SUBST(VMAJ)
PKG_CHECK_MODULES([EFL],
[
eina >= 1.7.99
eet >= 1.7.99
elementary >= 1.7.99
evas >= 1.7.99
ecore >= 1.7.99
ecore-ipc >= 1.7.99
edje >= 1.7.99
eo >= 1.7.99
]
)
want_systemd="yes"
EFL_ENABLE_BETA_API_SUPPORT
AC_DEFINE([EFL_EO_API_SUPPORT], [1], [Enable access to unstable EFL EO API.])
AC_ARG_ENABLE([systemd],
[AC_HELP_STRING([--disable-systemd],
[disable systemd integration. @<:@default=enabled@:>@])],
[
if test "x${enableval}" = "xyes" ; then
want_systemd="yes"
else
want_systemd="no"
fi
])
if test "x${want_systemd}" = "xyes"; then
# Detect systemd user session directory properly
EFL_PKG_CHECK_VAR([USER_SESSION_DIR], [systemd], [systemduserunitdir],
[have_systemd_user_session="yes"], [have_systemd_user_session="no"])
AC_SUBST([USER_SESSION_DIR])
fi
AM_CONDITIONAL([HAVE_SYSTEMD_USER_SESSION], [test "x${have_systemd_user_session}" = "xyes"])
### Checks for linker characteristics
lt_enable_auto_import=""
case "${host_os}" in
mingw*)
lt_enable_auto_import="-Wl,--enable-auto-import"
;;
esac
case "$host_vendor" in
ps3*)
# Escape had already been checked to exist
;;
esac
AC_SUBST([lt_enable_auto_import])
EFL_ATTRIBUTE_UNUSED
AC_CHECK_LIB(dl,dlopen)
AC_CHECK_FUNCS(dlopen dlerror)
AC_CONFIG_FILES([
clouseau.pc
Makefile
src/Makefile
src/lib/Makefile
src/bin/Makefile
src/scripts/Makefile
src/modules/Makefile
data/Makefile
data/images/Makefile
data/units/Makefile
])
AC_OUTPUT

View File

@ -1,2 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
SUBDIRS = images units

View File

@ -1,12 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
filesdir = $(datadir)/clouseau/images
files_DATA = \
clipper.png \
hidden.png \
background.png \
screenshot-missing.png \
show-screenshot.png \
take-screenshot.png
EXTRA_DIST = $(files_DATA)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,11 +0,0 @@
AUTOMAKE_OPTIONS = 1.4 foreign
MAINTAINERCLEANFILES = Makefile.in
UNITS_FILES=clouseaud.service clouseaud.socket
if HAVE_SYSTEMD_USER_SESSION
unitsdir = $(USER_SESSION_DIR)
units_DATA = $(UNITS_FILES)
endif
EXTRA_DIST = $(UNITS_FILES)

View File

@ -1,10 +0,0 @@
[Unit]
Description=Clouseau system service
Requires=xorg.target
After=xorg.target
[Service]
ExecStart=/usr/bin/clouseaud
[Install]
Also=clouseaud.socket

View File

@ -1,8 +0,0 @@
[Unit]
Description=Clouseau Service Sockets
[Socket]
ListenStream=22522
[Install]
WantedBy=sockets.target

0
m4/A
View File

View File

@ -1,56 +0,0 @@
dnl Copyright (C) 2011 Vincent Torri <vtorri at univ-evry dot fr>
dnl That code is public domain and can be freely used or copied.
dnl Macros for checking if the compiler supports some __attribute__ uses
dnl Usage: EFL_ATTRIBUTE_UNUSED
dnl call AC_DEFINE for __UNUSED__ if __attribute__((unused)) is available
AC_DEFUN([EFL_ATTRIBUTE_UNUSED],
[
AC_MSG_CHECKING([for __attribute__ ((unused))])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[
void foo(int x __attribute__ ((unused))) {}
]],
[[
]])],
[have_attribute_unused="yes"],
[have_attribute_unused="no"])
AC_MSG_RESULT([${have_attribute_unused}])
if test "x${have_attribute_unused}" = "xyes" ; then
AC_DEFINE([__UNUSED__], [__attribute__ ((unused))], [Macro declaring a function argument to be unused.])
else
AC_DEFINE([__UNUSED__], [], [__attribute__ ((unused)) is not supported.])
fi
])
dnl Usage: EFL_ATTRIBUTE_VECTOR
dnl call AC_DEFINE for HAVE_GCC_ATTRIBUTE_VECTOR if __attribute__((vector)) is available
AC_DEFUN([EFL_ATTRIBUTE_VECTOR],
[
AC_MSG_CHECKING([for __attribute__ ((vector))])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[
typedef int v4si __attribute__ ((vector_size (16)));
]],
[[
if (sizeof(v4si) == 16)
return 0;
else
return -1;
]])],
[have_attribute_vector="yes"],
[have_attribute_vector="no"])
AC_MSG_RESULT([${have_attribute_vector}])
if test "x${have_attribute_vector}" = "xyes" ; then
AC_DEFINE([HAVE_GCC_ATTRIBUTE_VECTOR], [1], [Define to 1 if your compiler supports __attribute__ ((vector)).])
fi
])
dnl End of efl_attribute.m4

View File

@ -1,5 +0,0 @@
dnl use: EFL_ENABLE_BETA_API_SUPPORT
AC_DEFUN([EFL_ENABLE_BETA_API_SUPPORT],
[
AC_DEFINE([EFL_BETA_API_SUPPORT], [1], [Enable access to unstable EFL API that are still in beta])
])

View File

@ -1,14 +0,0 @@
# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
# -------------------------------------------
# Retrieves the value of the pkg-config variable for the given module.
AC_DEFUN([EFL_PKG_CHECK_VAR],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
_PKG_CONFIG([$1], [variable="][$3]["], [$2])
AS_VAR_COPY([$1], [pkg_cv_][$1])
AS_VAR_IF([$1], [""], [$5], [$4])dnl
])# PKG_CHECK_VAR

View File

@ -1,4 +0,0 @@
#!/bin/sh
gcc -Wall -Wextra -fPIC -rdynamic -g3 -O0 -c libclouseau.c `pkg-config --libs --cflags elementary ecore evas`
gcc -g3 -O0 -shared -Wl,-soname,libclouseau.so.1 -o libclouseau.so.1.0.1 libclouseau.o -lc -ldl `pkg-config --libs --cflags elementary`

20
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,20 @@
cmake_minimum_required(VERSION 2.8.1)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
project(CLOUSEAU)
#set(EA_GEN_COMMON_DEFINITIONS -DEFL_EO_API_SUPPORT -DEFL_BETA_API_SUPPORT)
#add_definitions(${EA_GEN_COMMON_DEFINITIONS})
find_package(Efl REQUIRED)
find_package(Ffi REQUIRED)
find_package(Eina REQUIRED)
find_package(Eet REQUIRED)
find_package(Eolian REQUIRED)
find_package(Eo REQUIRED)
find_package(Elementary REQUIRED)
find_package(Ecore REQUIRED)
find_package(Evas REQUIRED)
add_subdirectory(src/bin)

View File

@ -1,4 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
SUBDIRS = lib bin scripts modules

43
src/bin/CMakeLists.txt Normal file
View File

@ -0,0 +1,43 @@
set(CMAKE_BUILD_TYPE Debug)
LIST(APPEND SOURCES clouseau_client.c gui.c)
STRING(REGEX REPLACE "\n" "" EOLIAN_EO_DIR ${EOLIAN_EO_DIR})
STRING(REGEX REPLACE " " "" EOLIAN_EO_DIR ${EOLIAN_EO_DIR})
add_definitions(${CLI_COMMON_DEFINITIONS} -DEFL_EO_API_SUPPORT
-DEOLIAN_EO_DIR="${EOLIAN_EO_DIR}" -DGUI_IMAGES_PATH="${CMAKE_HOME_DIRECTORY}/data/images")
link_directories (${PC_LIBELEMENTARY_LIBRARY_DIRS})
include_directories(
${ELEMENTARY_INCLUDE_DIRS}
${EINA_INCLUDE_DIRS}
${EET_INCLUDE_DIRS}
${EFREET_INCLUDE_DIRS}
${EO_INCLUDE_DIRS}
${EOLIAN_INCLUDE_DIRS}
${ECORE_INCLUDE_DIRS}
${EVAS_INCLUDE_DIRS}
${EDEBUG_INCLUDE_DIRS}
)
set(EOLIAN_INCLUDE_FLAG -I \"${EOLIAN_EO_DIR}/eo-1\" -I${CMAKE_CURRENT_SOURCE_DIR})
add_executable(clouseau_client ${SOURCES})
target_link_libraries(clouseau_client
pthread
${EFL_LIBRARIES}
${ELEMENTARY_LIBRARIES}
${EINA_LIBRARIES}
${EET_LIBRARIES}
${EFREET_LIBRARIES}
${EO_LIBRARIES}
${EOLIAN_LIBRARIES}
${ECORE_LIBRARIES}
${EVAS_LIBRARIES}
${EDEBUG_LIBRARIES}
ecore_file
)
install(TARGETS clouseau_client DESTINATION bin)

View File

@ -1,21 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
bin_PROGRAMS = clouseaud clouseau_client
clouseaud_SOURCES = clouseaud.c
clouseau_client_SOURCES = \
clouseau_client.c \
client/cfg.c \
client/config_dialog.c
AM_CPPFLAGS = \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/include \
-I$(top_builddir)/src/include \
-DPACKAGE_BIN_DIR=\"$(bindir)\" \
-DPACKAGE_LIB_DIR=\"$(libdir)\" \
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
@EFL_CFLAGS@
clouseaud_LDADD = $(top_builddir)/src/lib/libclouseau.la @EFL_LIBS@
clouseau_client_LDADD = $(top_builddir)/src/lib/libclouseau.la @EFL_LIBS@

View File

@ -1,147 +0,0 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <Eet.h>
#include <Efreet.h>
#include "cfg.h"
#include "Clouseau.h"
Clouseau_Cfg *_clouseau_cfg = NULL;
static Eet_Data_Descriptor * _clouseau_cfg_descriptor;
#define _CONFIG_ENTRY "config"
static char *config_file = NULL;
static void
_clouseau_cfg_descriptor_init(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Cfg);
_clouseau_cfg_descriptor = eet_data_descriptor_stream_new(&eddc);
#define CFG_ADD_BASIC(member, eet_type)\
EET_DATA_DESCRIPTOR_ADD_BASIC\
(_clouseau_cfg_descriptor, Clouseau_Cfg, # member, member, eet_type)
CFG_ADD_BASIC(version, EET_T_UINT);
CFG_ADD_BASIC(show_hidden, EET_T_UCHAR);
CFG_ADD_BASIC(show_clippers, EET_T_UCHAR);
CFG_ADD_BASIC(show_elm_only, EET_T_UCHAR);
#undef CFG_ADD_BASIC
}
static void
_clouseau_cfg_descriptor_shutdown(void)
{
eet_data_descriptor_free(_clouseau_cfg_descriptor);
}
void
clouseau_cfg_shutdown(void)
{
if (config_file)
free(config_file);
_clouseau_cfg_descriptor_shutdown();
eet_shutdown();
efreet_shutdown();
}
void
clouseau_cfg_init(const char *file)
{
const char *ext = ".cfg";
const char *path;
size_t len;
efreet_init();
eet_init();
path = efreet_config_home_get();
if (!path || !file)
return;
if (config_file)
free(config_file);
len = strlen(path) + strlen(file) + strlen(ext) + 1; /* +1 for '/' */
config_file = malloc(len + 1);
snprintf(config_file, len + 1, "%s/%s%s", path, file, ext);
_clouseau_cfg_descriptor_init();
}
static Clouseau_Cfg *
_clouseau_cfg_new(void)
{
Clouseau_Cfg *ret;
ret = calloc(1, sizeof(*ret));
ret->version = _CLOUSEAU_CFG_VERSION;
/* Default values */
ret->show_elm_only = EINA_TRUE;
ret->show_clippers = EINA_TRUE;
ret->show_hidden = EINA_TRUE;
return ret;
}
/* Return false on error. */
Eina_Bool
clouseau_cfg_load(void)
{
Eet_File *ef;
if (!config_file)
goto end;
ef = eet_open(config_file, EET_FILE_MODE_READ);
if (!ef)
{
/* FIXME Info message? create new config? */
goto end;
}
_clouseau_cfg = eet_data_read(ef, _clouseau_cfg_descriptor, _CONFIG_ENTRY);
end:
if (!_clouseau_cfg)
{
_clouseau_cfg = _clouseau_cfg_new();
}
eet_close(ef);
return EINA_TRUE;
}
/* Return false on error. */
Eina_Bool
clouseau_cfg_save(void)
{
Eet_File *ef;
Eina_Bool ret;
if (!config_file)
return EINA_FALSE;
ef = eet_open(config_file, EET_FILE_MODE_WRITE);
if (!ef)
{
EINA_LOG_ERR("could not open '%s' for writing.", config_file);
return EINA_FALSE;
}
ret = eet_data_write
(ef, _clouseau_cfg_descriptor, _CONFIG_ENTRY, _clouseau_cfg, EINA_TRUE);
eet_close(ef);
return ret;
}

View File

@ -1,25 +0,0 @@
#ifndef _CFG_H
#define _CFG_H
#include <Elementary.h>
#define _CLOUSEAU_CFG_VERSION 1
void clouseau_cfg_init(const char *file);
void clouseau_cfg_shutdown(void);
Eina_Bool clouseau_cfg_save(void);
Eina_Bool clouseau_cfg_load(void);
typedef struct
{
unsigned int version;
Eina_Bool show_hidden;
Eina_Bool show_clippers;
Eina_Bool show_elm_only;
} Clouseau_Cfg;
extern Clouseau_Cfg *_clouseau_cfg;
#endif

View File

@ -1,93 +0,0 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <Elementary.h>
#include "Clouseau.h"
#include "client/cfg.h"
#include "client/config_dialog.h"
static Clouseau_Config_Changed_Cb _conf_changed_cb = NULL;
static void *_conf_changed_cb_data = NULL;
static Eina_Bool _cfg_changed;
static void
_close_btn_clicked(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *popup = data;
if (_cfg_changed)
_conf_changed_cb(_conf_changed_cb_data);
_conf_changed_cb = NULL;
_conf_changed_cb_data = NULL;
evas_object_del(popup);
}
static void
_config_check_changed(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
Eina_Bool *setting = data;
*setting = elm_check_state_get(obj);
_cfg_changed = EINA_TRUE;
}
void
clouseau_settings_dialog_open(Evas_Object *parent, Clouseau_Config_Changed_Cb callback, const void *callback_data)
{
Evas_Object *popup, *bx, *check, *btn;
_cfg_changed = EINA_FALSE;
_conf_changed_cb = callback;
_conf_changed_cb_data = (void *) callback_data;
popup = elm_popup_add(parent);
elm_object_part_text_set(popup, "title,text", "Clouseau Settings");
evas_object_show(popup);
bx = elm_box_add(popup);
elm_object_content_set(popup, bx);
evas_object_show(bx);
check = elm_check_add(bx);
elm_object_text_set(check, "Show Hidden");
elm_check_state_set(check, _clouseau_cfg->show_hidden);
evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(check, 0.0, 0.5);
elm_box_pack_end(bx, check);
evas_object_show(check);
evas_object_smart_callback_add(check, "changed",
_config_check_changed, &(_clouseau_cfg->show_hidden));
check = elm_check_add(bx);
elm_object_text_set(check, "Show Clippers");
elm_check_state_set(check, _clouseau_cfg->show_clippers);
evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(check, 0.0, 0.5);
elm_box_pack_end(bx, check);
evas_object_show(check);
evas_object_smart_callback_add(check, "changed",
_config_check_changed, &(_clouseau_cfg->show_clippers));
check = elm_check_add(bx);
elm_object_text_set(check, "Only show Elementary widgets");
elm_check_state_set(check, _clouseau_cfg->show_elm_only);
evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(check, 0.0, 0.5);
elm_box_pack_end(bx, check);
evas_object_show(check);
evas_object_smart_callback_add(check, "changed",
_config_check_changed, &(_clouseau_cfg->show_elm_only));
btn = elm_button_add(bx);
elm_object_text_set(btn, "Close");
elm_object_part_content_set(popup, "button1", btn);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked",
_close_btn_clicked, popup);
}

View File

@ -1,8 +0,0 @@
#ifndef _CONFIG_DIALOG_H
#define _CONFIG_DIALOG_H
typedef void (*Clouseau_Config_Changed_Cb)(void *data);
void clouseau_settings_dialog_open(Evas_Object *parent, Clouseau_Config_Changed_Cb callback, const void *callback_data);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,450 +0,0 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <fcntl.h>
#include <unistd.h>
#include <Ecore_Con_Eet.h>
#include "Clouseau.h"
#define LOCK_FILE "/tmp/clouseaud.pid"
static Eina_List *gui = NULL; /* List of app_info_st for gui clients */
static Eina_List *app = NULL; /* List of app_info_st for app clients */
static Ecore_Con_Eet *eet_svr = NULL;
static int _clouseaud_log_dom = -1;
#ifdef CRITICAL
#undef CRITICAL
#endif
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_clouseaud_log_dom, __VA_ARGS__)
#ifdef ERR
#undef ERR
#endif
#define ERR(...) EINA_LOG_DOM_ERR(_clouseaud_log_dom, __VA_ARGS__)
#ifdef WRN
#undef WRN
#endif
#define WRN(...) EINA_LOG_DOM_WARN(_clouseaud_log_dom, __VA_ARGS__)
#ifdef INF
#undef INF
#endif
#define INF(...) EINA_LOG_DOM_INFO(_clouseaud_log_dom, __VA_ARGS__)
#ifdef DBG
#undef DBG
#endif
#define DBG(...) EINA_LOG_DOM_DBG(_clouseaud_log_dom, __VA_ARGS__)
static void
_daemon_cleanup(void)
{ /* Free strings */
app_info_st *p;
DBG("Clients connected to this server when exiting: %d",
eina_list_count(app) + eina_list_count(gui));
EINA_LIST_FREE(gui, p)
{
if(p->file)
free(p->file);
if (p->ptr)
free((void *) (uintptr_t) p->ptr);
free(p->name);
free(p);
}
EINA_LIST_FREE(app, p)
{
if(p->file)
free(p->file);
if (p->ptr)
free((void *) (uintptr_t) p->ptr);
free(p->name);
free(p);
}
gui = app = NULL;
eet_svr = NULL;
}
/* START - Ecore communication callbacks */
static int
_client_ptr_cmp(const void *d1, const void *d2)
{
return (((app_info_st *) d1)->ptr - ((unsigned long long) (uintptr_t) d2));
}
static Eina_List *
_add_client(Eina_List *clients, connect_st *t, void *client, const char *type)
{
DBG("msg from <%p>", client);
if(!eina_list_search_unsorted(clients, _client_ptr_cmp, client))
{
app_info_st *st = calloc(1, sizeof(app_info_st));
st->name = strdup(t->name);
st->pid = t->pid;
st->ptr = (unsigned long long) (uintptr_t) client;
DBG("Added %s client <%p>", type, client);
return eina_list_append(clients, st);
}
return clients;
}
static Eina_List *
_remove_client(Eina_List *clients, void *client, const char *type)
{
app_info_st *p = eina_list_search_unsorted(clients, _client_ptr_cmp, client);
DBG("Msg from <%p>", client);
if (p)
{
free(p->name);
free(p);
DBG("Removed %s client <%p>", type, client);
return eina_list_remove(clients, p);
}
return clients;
}
Eina_Bool
_add(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED Ecore_Con_Client *conn)
{
/* TODO: ecore_ipc_client_data_size_max_set(ev->client, -1); */
DBG("msg from <%p>", reply);
return ECORE_CALLBACK_RENEW;
}
Eina_Bool
_del(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED Ecore_Con_Client *conn)
{
DBG("msg from <%p>", reply);
/* Now we need to find if its an APP or GUI client */
app_info_st *i = eina_list_search_unsorted(gui, _client_ptr_cmp, reply);
if (i) /* Only need to remove GUI client from list */
gui = _remove_client(gui, reply, "GUI");
i = eina_list_search_unsorted(app, _client_ptr_cmp, reply);
if (i)
{ /* Notify all GUI clients to remove this APP */
app_closed_st t = { (unsigned long long) (uintptr_t) reply };
Eina_List *l;
EINA_LIST_FOREACH(gui, l, i)
{
DBG("<%p> Sending APP_CLOSED to <%p>", reply,
(void *) (uintptr_t) i->ptr);
ecore_con_eet_send((void *) (uintptr_t) i->ptr,
CLOUSEAU_APP_CLOSED_STR, &t);
}
app = _remove_client(app, reply, "APP");
}
if (!(gui || app))
{ /* Trigger cleanup and exit when all clients disconneced */
/* ecore_con_eet_server_free(eet_svr); why this causes Segfault? */
ecore_con_server_del(data);
ecore_main_loop_quit();
}
return ECORE_CALLBACK_RENEW;
}
void
_gui_client_connect_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* Register GUI, then notify about all APP */
app_info_st *st;
Eina_List *l;
connect_st *t = value;
DBG("msg from <%p>", reply);
gui = _add_client(gui, t, reply, "GUI");
/* Add all registered apps to newly open GUI */
EINA_LIST_FOREACH(app, l, st)
{
DBG("<%p> Sending APP_ADD to <%p>",
(void *) (uintptr_t) st->ptr, reply);
ecore_con_eet_send(reply, CLOUSEAU_APP_ADD_STR, st);
}
}
void
_app_client_connect_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* Register APP then notify GUI about it */
app_info_st *st;
Eina_List *l;
connect_st *t = value;
app_info_st m = { t->pid, (char *) t->name, NULL,
(unsigned long long) (uintptr_t) reply, NULL, 0 };
DBG("msg from <%p>", reply);
app = _add_client(app, t, reply, "APP");
/* Notify all GUI clients to add APP */
EINA_LIST_FOREACH(gui, l, st)
{
DBG("<%p> Sending APP_ADD to <%p>",
reply, (void *) (uintptr_t) st->ptr);
ecore_con_eet_send((void *) (uintptr_t) st->ptr,
CLOUSEAU_APP_ADD_STR, &m);
}
}
void
_data_req_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* msg coming from GUI, FWD this to APP specified in REQ */
data_req_st *req = value;
DBG("msg from <%p>", reply);
if (req->app)
{ /* Requesting specific app data */
if(eina_list_search_unsorted(app,
_client_ptr_cmp,
(void *) (uintptr_t) req->app))
{ /* Do the req only of APP connected to daemon */
data_req_st t = {
(unsigned long long) (uintptr_t) reply,
(unsigned long long) (uintptr_t) req->app };
DBG("<%p> Sending DATA_REQ to <%p>",
reply, (void *) (uintptr_t) req->app);
ecore_con_eet_send((void *) (uintptr_t) req->app,
CLOUSEAU_DATA_REQ_STR, &t);
}
}
else
{ /* requesting ALL apps data */
Eina_List *l;
app_info_st *st;
data_req_st t = {
(unsigned long long) (uintptr_t) reply,
(unsigned long long) (uintptr_t) NULL };
EINA_LIST_FOREACH(app, l, st)
{
t.app = (unsigned long long) (uintptr_t) st->ptr;
DBG("<%p> Sending DATA_REQ to <%p>",
reply, (void *) (uintptr_t) st->ptr);
ecore_con_eet_send((void *) (uintptr_t) st->ptr, CLOUSEAU_DATA_REQ_STR, &t);
}
}
}
void
_tree_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* Tree Data comes from APP, GUI client specified in msg */
tree_data_st *td = value;
DBG("msg from <%p>", reply);
if (td->gui)
{ /* Sending tree data to specific GUI client */
if(eina_list_search_unsorted(gui,
_client_ptr_cmp,
(void *) (uintptr_t) td->gui))
{ /* Do the req only of GUI connected to daemon */
DBG("<%p> Sending TREE_DATA to <%p>",
reply, (void *) (uintptr_t) td->gui);
ecore_con_eet_send((void *) (uintptr_t) td->gui,
CLOUSEAU_TREE_DATA_STR, value);
}
}
else
{ /* Sending tree data to all GUI clients */
Eina_List *l;
app_info_st *info;
EINA_LIST_FOREACH(gui, l, info)
{
DBG("<%p> Sending TREE_DATA to <%p>",
reply, (void *) (uintptr_t) info->ptr);
ecore_con_eet_send((void *) (uintptr_t) info->ptr,
CLOUSEAU_TREE_DATA_STR, value);
}
}
clouseau_data_tree_free(td->tree);
}
void
_highlight_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* FWD this message to APP */
highlight_st *ht = value;
DBG("msg from <%p>", reply);
if(eina_list_search_unsorted(app,
_client_ptr_cmp, (void *) (uintptr_t) ht->app))
{ /* Do the REQ only of APP connected to daemon */
DBG("<%p> Sending HIGHLIGHT to <%p>",
reply, (void *) (uintptr_t) ht->app);
ecore_con_eet_send((void *) (uintptr_t) ht->app,
CLOUSEAU_HIGHLIGHT_STR, value);
}
}
void
_bmp_req_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* BMP data request coming from GUI to APP client */
bmp_req_st *req = value;
DBG("msg from <%p>", reply);
if(eina_list_search_unsorted(app,
_client_ptr_cmp, (void *) (uintptr_t) req->app))
{ /* Do the req only if APP connected to daemon */
bmp_req_st t = {
(unsigned long long) (uintptr_t) reply,
req->app, req->object, req->ctr };
DBG("<%p> Sending BMP_REQ to <%p>",
reply, (void *) (uintptr_t) req->app);
ecore_con_eet_send((void *) (uintptr_t) req->app,
CLOUSEAU_BMP_REQ_STR, &t);
}
}
void
_bmp_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, EINA_UNUSED const char *section,
void *value, EINA_UNUSED size_t length)
{ /* BMP Data comes from APP, GUI client specified in msg */
bmp_info_st *st = clouseau_data_packet_info_get(protocol_name,
value, length);
DBG("msg from <%p>", reply);
if (st->gui)
{ /* Sending BMP data to specific GUI client */
if(eina_list_search_unsorted(gui,
_client_ptr_cmp,
(void *) (uintptr_t) st->gui))
{ /* Do the req only of GUI connected to daemon */
DBG("<%p> Sending BMP_DATA to <%p>",
reply, (void *) (uintptr_t) st->gui);
ecore_con_eet_raw_send((void *) (uintptr_t) st->gui,
CLOUSEAU_BMP_DATA_STR, "BMP", value, length);
}
}
else
{ /* Sending BMP data to all GUI clients */
Eina_List *l;
app_info_st *info;
EINA_LIST_FOREACH(gui, l, info)
{
DBG("<%p> Sending BMP_DATA to <%p>",
reply, (void *) (uintptr_t) info->ptr);
ecore_con_eet_raw_send((void *) (uintptr_t) info->ptr,
CLOUSEAU_BMP_DATA_STR, "BMP", value, length);
}
}
if (st->bmp)
free(st->bmp);
free(st);
}
/* END - Ecore communication callbacks */
static void
_clouseaud_send_ready(void)
{
printf("%s", CLOUSEAUD_READY_STR);
printf("\n");
fflush(stdout);
}
int main(void)
{
/* Check single instance. */
{
int pid_file = open(LOCK_FILE, O_CREAT | O_RDWR, 0666);
int rc = lockf(pid_file, F_TLOCK, 0);
if ((pid_file == -1) || rc)
{
_clouseaud_send_ready();
exit(0);
}
}
/* End of check single instance. */
eina_init();
ecore_init();
ecore_con_init();
clouseau_data_init();
Ecore_Con_Server *server = NULL;
const char *log_dom = "clouseaud";
_clouseaud_log_dom = eina_log_domain_register(log_dom, EINA_COLOR_LIGHTBLUE);
if (_clouseaud_log_dom < 0)
{
EINA_LOG_ERR("Could not register log domain: %s", log_dom);
return EINA_FALSE;
}
if (!(server = ecore_con_server_add(ECORE_CON_REMOTE_TCP | ECORE_CON_SOCKET_ACTIVATE,
LISTEN_IP, PORT, NULL)))
exit(1);
eet_svr = ecore_con_eet_server_new(server);
if (!eet_svr)
exit(2);
clouseau_register_descs(eet_svr);
/* Register callbacks for ecore_con_eet */
ecore_con_eet_client_connect_callback_add(eet_svr, _add, NULL);
ecore_con_eet_client_disconnect_callback_add(eet_svr, _del, server);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_GUI_CLIENT_CONNECT_STR,
_gui_client_connect_cb, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_APP_CLIENT_CONNECT_STR,
_app_client_connect_cb, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_DATA_REQ_STR,
_data_req_cb, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_TREE_DATA_STR,
_tree_data_cb, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_HIGHLIGHT_STR,
_highlight_cb, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_BMP_REQ_STR,
_bmp_req_cb, NULL);
ecore_con_eet_raw_data_callback_add(eet_svr, CLOUSEAU_BMP_DATA_STR,
_bmp_data_cb, NULL);
/* Print to stdout which will be read by the monitoring app. */
_clouseaud_send_ready();
ecore_main_loop_begin();
_daemon_cleanup();
clouseau_data_shutdown();
ecore_con_shutdown();
ecore_shutdown();
eina_shutdown();
return 0;
}

595
src/bin/gui Normal file
View File

@ -0,0 +1,595 @@
{
"JSON_Version":"1",
"Settings":
{
"project":"gui",
"start_points":["main_win"]
},
"Resources":
{
"Images":
{
"SCREENSHOT_ICON":"../../data/images/show-screenshot.png"
},
"Eo_Callbacks":
{
"profile_close":"_profile_win_close_cb",
"new_profile_save":"_new_profile_save_cb",
"new_profile_cancel":"_new_profile_cancel_cb",
"profile_del":"_profile_del_cb",
"screenshot_request":"screenshot_req_cb"
}
},
"Widgets":
{
"main_win":
{
"Desc":
{
"parent":null,
"class":"Elm.Win",
"public":true
},
"Properties":
{
"Elm.Win.type":["ELM_WIN_BASIC"],
"Elm.Widget.part_text":[null, "Window"],
"Elm.Win.autodel":[true],
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[478, 484]
},
"Contains":["elm_bg1", "elm_box1"]
},
"elm_bg1":
{
"Desc":
{
"parent":"main_win",
"class":"Elm.Bg"
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.position":[0, 0]
}
},
"elm_box1":
{
"Desc":
{
"parent":"main_win",
"class":"Elm.Box"
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[643, 598],
"Efl.Gfx.Base.position":[-7, -2],
"Elm.Box.padding":[0, 0],
"Elm.Box.align":[0, 0]
},
"Contains":["apps_selector", "elm_panes1"]
},
"apps_selector":
{
"Desc":
{
"parent":"elm_box1",
"class":"Elm.Hoversel",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 0],
"Evas.Object.size_hint_align":[0.50, 0],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[1174, 643],
"Efl.Gfx.Base.position":[-8, -2],
"Elm.Widget.part_text":[null, "Select App"]
}
},
"elm_panes1":
{
"Desc":
{
"parent":"elm_box1",
"class":"Elm.Panes"
},
"Properties":
{
"Elm.Panes.content_right_size":[0.60],
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.size":[75, 75],
"Efl.Gfx.Base.visible":[true],
"Evas.Object.size_hint_weight":[1, 1],
"Evas.Object.size_hint_align":[-1, -1]
},
"Contains":
{
"objects_list":["left"],
"object_infos_list":["right"]
}
},
"object_infos_list":
{
"Desc":
{
"parent":"elm_panes1",
"class":"Elm.Genlist",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true]
}
},
"objects_list":
{
"Desc":
{
"parent":"elm_panes1",
"class":"Elm.Genlist",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true]
}
},
"profiles_win":
{
"Desc":
{
"parent":null,
"class":"Elm.Win",
"public":true
},
"Properties":
{
"Elm.Win.name":["Win"],
"Elm.Win.type":["ELM_WIN_BASIC"],
"Elm.Win.autodel":[true],
"Elm.Widget.part_text":[null, "Window"],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[347, 362],
"Evas.Object.size_hint_weight":[1, 1],
"Evas.Object.freeze_events":[false],
"Evas.Object.repeat_events":[false],
"Elm.Win.title":["Profiles"]
},
"Contains":["elm_bg2", "elm_box2"]
},
"elm_bg2":
{
"Desc":
{
"parent":"profiles_win",
"class":"Elm.Bg"
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true]
}
},
"elm_box2":
{
"Desc":
{
"parent":"profiles_win",
"class":"Elm.Box"
},
"Properties":
{
"Elm.Box.padding":[7, 0],
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.size":[200, 200],
"Efl.Gfx.Base.visible":[true]
},
"Contains":["profiles_list", "elm_box3"]
},
"elm_box3":
{
"Desc":
{
"parent":"elm_box2",
"class":"Elm.Box"
},
"Properties":
{
"Elm.Box.padding":[7, 0],
"Evas.Object.size_hint_align":[-1, -1],
"Efl.Gfx.Base.visible":[true],
"Elm.Box.horizontal":[true],
"Efl.Gfx.Base.size":[200, 139],
"Efl.Gfx.Base.position":[289, 742],
"Evas.Object.size_hint_weight":[1, 0.20]
},
"Contains":["profile_ok_button", "profile_cancel_button", "profile_new_button", "profile_delete_button"]
},
"profile_delete_button":
{
"Desc":
{
"parent":"elm_box3",
"class":"Elm.Button",
"public":true
},
"Properties":
{
"Efl.Gfx.Base.visible":[true],
"Elm.Widget.disabled":[true],
"Elm.Widget.part_text":[null, "Delete profile"],
"Efl.Gfx.Base.size":[115, 30],
"Efl.Gfx.Base.position":[-42, 0],
"Evas.Object.size_hint_align":[0.50, 0.50],
"Evas.Object.size_hint_weight":[1, 1]
},
"Callbacks":
{
"clicked":["Invoke", "profile_del", null]
}
},
"profile_ok_button":
{
"Desc":
{
"parent":"elm_box3",
"class":"Elm.Button",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[73, 30],
"Elm.Widget.part_text":[null, "Ok"],
"Elm.Widget.disabled":[true]
},
"Callbacks":
{
"clicked":["Invoke", "profile_close", null]
}
},
"profile_cancel_button":
{
"Desc":
{
"parent":"elm_box3",
"class":"Elm.Button",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[73, 30],
"Elm.Widget.part_text":[null, "Cancel"]
}
},
"profile_new_button":
{
"Desc":
{
"parent":"elm_box3",
"class":"Elm.Button"
},
"Properties":
{
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[73, 30],
"Elm.Widget.part_text":[null, "New profile"],
"Evas.Object.size_hint_weight":[1, 1],
"Evas.Object.size_hint_align":[0.50, 0.50]
},
"Callbacks":
{
"clicked":["Create", "new_profile_win", null]
}
},
"profiles_list":
{
"Desc":
{
"parent":"elm_box2",
"class":"Elm.Genlist",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Evas.Object.size_hint_align":[-1, -1]
}
},
"new_profile_win":
{
"Desc":
{
"parent":null,
"class":"Elm.Win",
"public":true
},
"Properties":
{
"Elm.Win.type":["ELM_WIN_BASIC"],
"Elm.Win.autodel":[true],
"Elm.Widget.part_text":[null, "Window"],
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[689, 390],
"Elm.Win.title":["New profile..."],
"Elm.Win.modal":[true]
},
"Contains":["elm_bg4", "elm_box5"]
},
"elm_bg4":
{
"Desc":
{
"parent":"new_profile_win",
"class":"Elm.Bg"
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true]
}
},
"elm_box5":
{
"Desc":
{
"parent":"new_profile_win",
"class":"Elm.Box"
},
"Properties":
{
"Elm.Box.padding":[7, 0],
"Evas.Object.size_hint_weight":[1, 1],
"Evas.Object.size_hint_align":[-1, -1],
"Efl.Gfx.Base.size":[200, 200],
"Efl.Gfx.Base.visible":[true]
},
"Contains":["elm_box6", "elm_label1", "new_profile_command", "elm_label2", "new_profile_script", "elm_box4"]
},
"elm_box4":
{
"Desc":
{
"parent":"elm_box5",
"class":"Elm.Box"
},
"Properties":
{
"Elm.Box.padding":[7, 0],
"Evas.Object.size_hint_weight":[1, 1],
"Evas.Object.size_hint_align":[-1, -1],
"Efl.Gfx.Base.size":[200, 200],
"Efl.Gfx.Base.visible":[true],
"Elm.Box.horizontal":[true]
},
"Contains":["new_profile_save_button", "new_profile_cancel_button"]
},
"new_profile_cancel_button":
{
"Desc":
{
"parent":"elm_box4",
"class":"Elm.Button",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[73, 30],
"Elm.Widget.part_text":[null, "Cancel"]
}
},
"new_profile_save_button":
{
"Desc":
{
"parent":"elm_box4",
"class":"Elm.Button",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[73, 30],
"Elm.Widget.part_text":[null, "Save"]
},
"Callbacks":
{
"clicked":["Invoke", "new_profile_save", null]
}
},
"elm_box6":
{
"Desc":
{
"parent":"elm_box5",
"class":"Elm.Box"
},
"Properties":
{
"Elm.Box.padding":[7, 0],
"Evas.Object.size_hint_weight":[1, 1],
"Evas.Object.size_hint_align":[-1, -1],
"Efl.Gfx.Base.size":[200, 200],
"Efl.Gfx.Base.visible":[true],
"Elm.Box.horizontal":[true]
},
"Contains":["new_profile_type_selector", "elm_label3", "new_profile_name"]
},
"new_profile_type_selector":
{
"Desc":
{
"parent":"elm_box6",
"class":"Elm.Hoversel",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[60, 40],
"Evas.Object.size_hint_align":[0, 0.50],
"Elm.Widget.part_text":[null, "Choose the profile type"]
}
},
"elm_label3":
{
"Desc":
{
"parent":"elm_box6",
"class":"Elm.Label"
},
"Properties":
{
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[60, 30],
"Evas.Object.size_hint_align":[1, -1],
"Elm.Widget.part_text":[null, "Name: "],
"Evas.Object.size_hint_weight":[0, 1]
}
},
"new_profile_name":
{
"Desc":
{
"parent":"elm_box6",
"class":"Elm.Entry",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_align":[-1, -1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[65, 35],
"Elm.Entry.scrollable":[true],
"Elm.Entry.single_line":[true],
"Evas.Object.size_hint_weight":[4, 1],
"Elm.Entry.editable":[true],
"Elm.Widget.part_text":[null, ""]
}
},
"elm_label1":
{
"Desc":
{
"parent":"elm_box5",
"class":"Elm.Label"
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[115, 30],
"Efl.Gfx.Base.position":[847, 0],
"Elm.Widget.part_text":[null, "Command: "],
"Evas.Object.size_hint_align":[0, 2]
}
},
"new_profile_command":
{
"Desc":
{
"parent":"elm_box5",
"class":"Elm.Entry",
"public":true
},
"Properties":
{
"Elm.Entry.scrollable":[true],
"Evas.Object.size_hint_align":[-1, -1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[65, 35],
"Elm.Entry.single_line":[true],
"Evas.Object.size_hint_weight":[1, 2],
"Elm.Widget.disabled":[true]
}
},
"elm_label2":
{
"Desc":
{
"parent":"elm_box5",
"class":"Elm.Label"
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[60, 30],
"Evas.Object.size_hint_align":[0, 1],
"Elm.Widget.part_text":[null, "Script: "]
}
},
"new_profile_script":
{
"Desc":
{
"parent":"elm_box5",
"class":"Elm.Entry",
"public":true
},
"Properties":
{
"Elm.Entry.scrollable":[true],
"Evas.Object.size_hint_align":[-1, -1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[65, 35],
"Evas.Object.size_hint_weight":[1, 8],
"Elm.Widget.disabled":[true]
}
},
"screenshot_button":
{
"Desc":
{
"parent":null,
"class":"Elm.Button",
"public":true
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[73, 30]
},
"Callbacks":
{
"clicked":["Invoke", "screenshot_request", null]
},
"Contains":
{
"elm_icon1":["icon"]
}
},
"elm_icon1":
{
"Desc":
{
"parent":"screenshot_button",
"class":"Elm.Icon"
},
"Properties":
{
"Evas.Object.size_hint_weight":[1, 1],
"Efl.Gfx.Base.visible":[true],
"Efl.Gfx.Base.size":[40, 40],
"Efl.File.file":["SCREENSHOT_ICON", null]
}
}
}
}

410
src/bin/gui.c Normal file
View File

@ -0,0 +1,410 @@
#ifndef EFL_BETA_API_SUPPORT
#define EFL_BETA_API_SUPPORT
#endif
#ifndef EFL_EO_API_SUPPORT
#define EFL_EO_API_SUPPORT
#endif
#ifndef ELM_INTERNAL_API_ARGESFSDFEFC
#define ELM_INTERNAL_API_ARGESFSDFEFC
#endif
#include <Elementary.h>
#include "elm_widget_container.h"
#include "elm_interface_scrollable.h"
#include "elm_interface_fileselector.h"
#include "gui.h"
static Gui_Widgets g_pub_widgets;
extern void gui_new_profile_win_create_done(Gui_New_Profile_Win_Widgets *wdgs);
#ifdef GUI_IMAGES_PATH
const char *SCREENSHOT_ICON = GUI_IMAGES_PATH"/show-screenshot.png";
#else
#error "Please define GUI_IMAGES_PATH"
#endif
extern Eina_Bool
_profile_win_close_cb(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
extern Eina_Bool
_new_profile_save_cb(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
extern Eina_Bool
_new_profile_cancel_cb(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
extern Eina_Bool
_profile_del_cb(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
extern Eina_Bool
screenshot_req_cb(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info);
static Eina_Bool
_pubs_free_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
{
free(data);
return EINA_TRUE;
}
Gui_Main_Win_Widgets *
gui_main_win_create(Eo *__main_parent)
{
Gui_Main_Win_Widgets *pub_widgets = calloc(1, sizeof(*pub_widgets));
Eo *main_win;
Eo *elm_bg1;
Eo *elm_box1;
Eo *apps_selector;
Eo *elm_panes1;
Eo *object_infos_list;
Eo *objects_list;
main_win = eo_add(ELM_WIN_CLASS, __main_parent, elm_obj_win_type_set(ELM_WIN_BASIC));
pub_widgets->main_win = main_win;
eo_do(main_win, elm_obj_widget_part_text_set(NULL, "Window"));
eo_do(main_win, elm_obj_win_autodel_set(EINA_TRUE));
eo_do(main_win, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(main_win, efl_gfx_size_set(478, 484));
elm_bg1 = eo_add(ELM_BG_CLASS, main_win);
eo_do(elm_bg1, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_bg1, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_bg1, efl_gfx_position_set(0, 0));
elm_box1 = eo_add(ELM_BOX_CLASS, main_win);
eo_do(elm_box1, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_box1, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_box1, efl_gfx_size_set(643, 598));
eo_do(elm_box1, efl_gfx_position_set(-7, -2));
eo_do(elm_box1, elm_obj_box_padding_set(0, 0));
eo_do(elm_box1, elm_obj_box_align_set(0.000000, 0.000000));
eo_do(main_win, elm_obj_win_resize_object_add(elm_bg1));
eo_do(main_win, elm_obj_win_resize_object_add(elm_box1));
apps_selector = eo_add(ELM_HOVERSEL_CLASS, elm_box1);
pub_widgets->apps_selector = apps_selector;
eo_do(apps_selector, evas_obj_size_hint_weight_set(1.000000, 0.000000));
eo_do(apps_selector, evas_obj_size_hint_align_set(0.500000, 0.000000));
eo_do(apps_selector, efl_gfx_visible_set(EINA_TRUE));
eo_do(apps_selector, efl_gfx_size_set(1174, 643));
eo_do(apps_selector, efl_gfx_position_set(-8, -2));
eo_do(apps_selector, elm_obj_widget_part_text_set(NULL, "Select App"));
elm_panes1 = eo_add(ELM_PANES_CLASS, elm_box1);
eo_do(elm_panes1, elm_obj_panes_content_right_size_set(0.600000));
eo_do(elm_panes1, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_panes1, efl_gfx_size_set(75, 75));
eo_do(elm_panes1, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_panes1, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_panes1, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(elm_box1, elm_obj_box_pack_end(apps_selector));
eo_do(elm_box1, elm_obj_box_pack_end(elm_panes1));
object_infos_list = eo_add(ELM_GENLIST_CLASS, elm_panes1);
pub_widgets->object_infos_list = object_infos_list;
eo_do(object_infos_list, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(object_infos_list, efl_gfx_visible_set(EINA_TRUE));
objects_list = eo_add(ELM_GENLIST_CLASS, elm_panes1);
pub_widgets->objects_list = objects_list;
eo_do(objects_list, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(objects_list, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_panes1, elm_obj_container_content_set("left", objects_list));
eo_do(elm_panes1, elm_obj_container_content_set("right", object_infos_list));
eo_do(main_win, efl_gfx_visible_set(EINA_TRUE));
eo_do(main_win, eo_event_callback_add(EO_BASE_EVENT_DEL, _pubs_free_cb, pub_widgets));
return pub_widgets;
}
static Eina_Bool
profile_delete_button_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
{
_profile_del_cb(data, obj, desc, event_info);
return EINA_TRUE;
}
static Eina_Bool
profile_new_button_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
{
Gui_New_Profile_Win_Widgets *wdgs = gui_new_profile_win_create(NULL);
gui_new_profile_win_create_done(wdgs);
return EINA_TRUE;
}
static Eina_Bool
profile_ok_button_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
{
_profile_win_close_cb(data, obj, desc, event_info);
return EINA_TRUE;
}
Gui_Profiles_Win_Widgets *
gui_profiles_win_create(Eo *__main_parent)
{
Gui_Profiles_Win_Widgets *pub_widgets = calloc(1, sizeof(*pub_widgets));
Eo *profiles_win;
Eo *elm_bg2;
Eo *elm_box2;
Eo *elm_box3;
Eo *profile_delete_button;
Eo *profile_ok_button;
Eo *profile_cancel_button;
Eo *profile_new_button;
Eo *profiles_list;
profiles_win = eo_add(ELM_WIN_CLASS, __main_parent, elm_obj_win_name_set("Win"),
elm_obj_win_type_set(ELM_WIN_BASIC));
pub_widgets->profiles_win = profiles_win;
eo_do(profiles_win, elm_obj_win_autodel_set(EINA_TRUE));
eo_do(profiles_win, elm_obj_widget_part_text_set(NULL, "Window"));
eo_do(profiles_win, efl_gfx_size_set(347, 362));
eo_do(profiles_win, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(profiles_win, evas_obj_freeze_events_set(EINA_FALSE));
eo_do(profiles_win, evas_obj_repeat_events_set(EINA_FALSE));
eo_do(profiles_win, elm_obj_win_title_set("Profiles"));
elm_bg2 = eo_add(ELM_BG_CLASS, profiles_win);
eo_do(elm_bg2, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_bg2, efl_gfx_visible_set(EINA_TRUE));
elm_box2 = eo_add(ELM_BOX_CLASS, profiles_win);
eo_do(elm_box2, elm_obj_box_padding_set(7, 0));
eo_do(elm_box2, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_box2, efl_gfx_size_set(200, 200));
eo_do(elm_box2, efl_gfx_visible_set(EINA_TRUE));
eo_do(profiles_win, elm_obj_win_resize_object_add(elm_bg2));
eo_do(profiles_win, elm_obj_win_resize_object_add(elm_box2));
elm_box3 = eo_add(ELM_BOX_CLASS, elm_box2);
eo_do(elm_box3, elm_obj_box_padding_set(7, 0));
eo_do(elm_box3, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(elm_box3, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_box3, elm_obj_box_horizontal_set(EINA_TRUE));
eo_do(elm_box3, efl_gfx_size_set(200, 139));
eo_do(elm_box3, efl_gfx_position_set(289, 742));
eo_do(elm_box3, evas_obj_size_hint_weight_set(1.000000, 0.200000));
profile_delete_button = eo_add(ELM_BUTTON_CLASS, elm_box3);
pub_widgets->profile_delete_button = profile_delete_button;
eo_do(profile_delete_button, efl_gfx_visible_set(EINA_TRUE));
eo_do(profile_delete_button, elm_obj_widget_disabled_set(EINA_TRUE));
eo_do(profile_delete_button, elm_obj_widget_part_text_set(NULL, "Delete profile"));
eo_do(profile_delete_button, efl_gfx_size_set(115, 30));
eo_do(profile_delete_button, efl_gfx_position_set(-42, 0));
eo_do(profile_delete_button, evas_obj_size_hint_align_set(0.500000, 0.500000));
eo_do(profile_delete_button, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(profile_delete_button, eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, profile_delete_button_clicked, NULL));
profile_ok_button = eo_add(ELM_BUTTON_CLASS, elm_box3);
pub_widgets->profile_ok_button = profile_ok_button;
eo_do(profile_ok_button, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(profile_ok_button, efl_gfx_visible_set(EINA_TRUE));
eo_do(profile_ok_button, efl_gfx_size_set(73, 30));
eo_do(profile_ok_button, elm_obj_widget_part_text_set(NULL, "Ok"));
eo_do(profile_ok_button, elm_obj_widget_disabled_set(EINA_TRUE));
eo_do(profile_ok_button, eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, profile_ok_button_clicked, NULL));
profile_cancel_button = eo_add(ELM_BUTTON_CLASS, elm_box3);
pub_widgets->profile_cancel_button = profile_cancel_button;
eo_do(profile_cancel_button, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(profile_cancel_button, efl_gfx_visible_set(EINA_TRUE));
eo_do(profile_cancel_button, efl_gfx_size_set(73, 30));
eo_do(profile_cancel_button, elm_obj_widget_part_text_set(NULL, "Cancel"));
profile_new_button = eo_add(ELM_BUTTON_CLASS, elm_box3);
eo_do(profile_new_button, efl_gfx_visible_set(EINA_TRUE));
eo_do(profile_new_button, efl_gfx_size_set(73, 30));
eo_do(profile_new_button, elm_obj_widget_part_text_set(NULL, "New profile"));
eo_do(profile_new_button, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(profile_new_button, evas_obj_size_hint_align_set(0.500000, 0.500000));
eo_do(profile_new_button, eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, profile_new_button_clicked, NULL));
eo_do(elm_box3, elm_obj_box_pack_end(profile_ok_button));
eo_do(elm_box3, elm_obj_box_pack_end(profile_cancel_button));
eo_do(elm_box3, elm_obj_box_pack_end(profile_new_button));
eo_do(elm_box3, elm_obj_box_pack_end(profile_delete_button));
profiles_list = eo_add(ELM_GENLIST_CLASS, elm_box2);
pub_widgets->profiles_list = profiles_list;
eo_do(profiles_list, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(profiles_list, efl_gfx_visible_set(EINA_TRUE));
eo_do(profiles_list, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(elm_box2, elm_obj_box_pack_end(profiles_list));
eo_do(elm_box2, elm_obj_box_pack_end(elm_box3));
eo_do(profiles_win, efl_gfx_visible_set(EINA_TRUE));
eo_do(profiles_win, eo_event_callback_add(EO_BASE_EVENT_DEL, _pubs_free_cb, pub_widgets));
return pub_widgets;
}
static Eina_Bool
new_profile_save_button_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
{
_new_profile_save_cb(data, obj, desc, event_info);
return EINA_TRUE;
}
Gui_New_Profile_Win_Widgets *
gui_new_profile_win_create(Eo *__main_parent)
{
Gui_New_Profile_Win_Widgets *pub_widgets = calloc(1, sizeof(*pub_widgets));
Eo *new_profile_win;
Eo *elm_bg4;
Eo *elm_box5;
Eo *elm_box4;
Eo *new_profile_cancel_button;
Eo *new_profile_save_button;
Eo *elm_box6;
Eo *new_profile_type_selector;
Eo *elm_label3;
Eo *new_profile_name;
Eo *elm_label1;
Eo *new_profile_command;
Eo *elm_label2;
Eo *new_profile_script;
new_profile_win = eo_add(ELM_WIN_CLASS, __main_parent, elm_obj_win_type_set(ELM_WIN_BASIC));
pub_widgets->new_profile_win = new_profile_win;
eo_do(new_profile_win, elm_obj_win_autodel_set(EINA_TRUE));
eo_do(new_profile_win, elm_obj_widget_part_text_set(NULL, "Window"));
eo_do(new_profile_win, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(new_profile_win, efl_gfx_size_set(689, 390));
eo_do(new_profile_win, elm_obj_win_title_set("New profile..."));
eo_do(new_profile_win, elm_obj_win_modal_set(EINA_TRUE));
elm_bg4 = eo_add(ELM_BG_CLASS, new_profile_win);
eo_do(elm_bg4, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_bg4, efl_gfx_visible_set(EINA_TRUE));
elm_box5 = eo_add(ELM_BOX_CLASS, new_profile_win);
eo_do(elm_box5, elm_obj_box_padding_set(7, 0));
eo_do(elm_box5, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_box5, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(elm_box5, efl_gfx_size_set(200, 200));
eo_do(elm_box5, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_win, elm_obj_win_resize_object_add(elm_bg4));
eo_do(new_profile_win, elm_obj_win_resize_object_add(elm_box5));
elm_box4 = eo_add(ELM_BOX_CLASS, elm_box5);
eo_do(elm_box4, elm_obj_box_padding_set(7, 0));
eo_do(elm_box4, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_box4, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(elm_box4, efl_gfx_size_set(200, 200));
eo_do(elm_box4, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_box4, elm_obj_box_horizontal_set(EINA_TRUE));
new_profile_cancel_button = eo_add(ELM_BUTTON_CLASS, elm_box4);
pub_widgets->new_profile_cancel_button = new_profile_cancel_button;
eo_do(new_profile_cancel_button, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(new_profile_cancel_button, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_cancel_button, efl_gfx_size_set(73, 30));
eo_do(new_profile_cancel_button, elm_obj_widget_part_text_set(NULL, "Cancel"));
new_profile_save_button = eo_add(ELM_BUTTON_CLASS, elm_box4);
pub_widgets->new_profile_save_button = new_profile_save_button;
eo_do(new_profile_save_button, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(new_profile_save_button, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_save_button, efl_gfx_size_set(73, 30));
eo_do(new_profile_save_button, elm_obj_widget_part_text_set(NULL, "Save"));
eo_do(new_profile_save_button, eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, new_profile_save_button_clicked, NULL));
eo_do(elm_box4, elm_obj_box_pack_end(new_profile_save_button));
eo_do(elm_box4, elm_obj_box_pack_end(new_profile_cancel_button));
elm_box6 = eo_add(ELM_BOX_CLASS, elm_box5);
eo_do(elm_box6, elm_obj_box_padding_set(7, 0));
eo_do(elm_box6, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_box6, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(elm_box6, efl_gfx_size_set(200, 200));
eo_do(elm_box6, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_box6, elm_obj_box_horizontal_set(EINA_TRUE));
new_profile_type_selector = eo_add(ELM_HOVERSEL_CLASS, elm_box6);
pub_widgets->new_profile_type_selector = new_profile_type_selector;
eo_do(new_profile_type_selector, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(new_profile_type_selector, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_type_selector, efl_gfx_size_set(60, 40));
eo_do(new_profile_type_selector, evas_obj_size_hint_align_set(0.000000, 0.500000));
eo_do(new_profile_type_selector, elm_obj_widget_part_text_set(NULL, "Choose the profile type"));
elm_label3 = eo_add(ELM_LABEL_CLASS, elm_box6);
eo_do(elm_label3, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_label3, efl_gfx_size_set(60, 30));
eo_do(elm_label3, evas_obj_size_hint_align_set(1.000000, -1.000000));
eo_do(elm_label3, elm_obj_widget_part_text_set(NULL, "Name: "));
eo_do(elm_label3, evas_obj_size_hint_weight_set(0.000000, 1.000000));
new_profile_name = eo_add(ELM_ENTRY_CLASS, elm_box6);
pub_widgets->new_profile_name = new_profile_name;
eo_do(new_profile_name, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(new_profile_name, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_name, efl_gfx_size_set(65, 35));
eo_do(new_profile_name, elm_obj_entry_scrollable_set(EINA_TRUE));
eo_do(new_profile_name, elm_obj_entry_single_line_set(EINA_TRUE));
eo_do(new_profile_name, evas_obj_size_hint_weight_set(4.000000, 1.000000));
eo_do(new_profile_name, elm_obj_entry_editable_set(EINA_TRUE));
eo_do(new_profile_name, elm_obj_widget_part_text_set(NULL, ""));
eo_do(elm_box6, elm_obj_box_pack_end(new_profile_type_selector));
eo_do(elm_box6, elm_obj_box_pack_end(elm_label3));
eo_do(elm_box6, elm_obj_box_pack_end(new_profile_name));
elm_label1 = eo_add(ELM_LABEL_CLASS, elm_box5);
eo_do(elm_label1, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_label1, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_label1, efl_gfx_size_set(115, 30));
eo_do(elm_label1, efl_gfx_position_set(847, 0));
eo_do(elm_label1, elm_obj_widget_part_text_set(NULL, "Command: "));
eo_do(elm_label1, evas_obj_size_hint_align_set(0.000000, 2.000000));
new_profile_command = eo_add(ELM_ENTRY_CLASS, elm_box5);
pub_widgets->new_profile_command = new_profile_command;
eo_do(new_profile_command, elm_obj_entry_scrollable_set(EINA_TRUE));
eo_do(new_profile_command, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(new_profile_command, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_command, efl_gfx_size_set(65, 35));
eo_do(new_profile_command, elm_obj_entry_single_line_set(EINA_TRUE));
eo_do(new_profile_command, evas_obj_size_hint_weight_set(1.000000, 2.000000));
eo_do(new_profile_command, elm_obj_widget_disabled_set(EINA_TRUE));
elm_label2 = eo_add(ELM_LABEL_CLASS, elm_box5);
eo_do(elm_label2, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_label2, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_label2, efl_gfx_size_set(60, 30));
eo_do(elm_label2, evas_obj_size_hint_align_set(0.000000, 1.000000));
eo_do(elm_label2, elm_obj_widget_part_text_set(NULL, "Script: "));
new_profile_script = eo_add(ELM_ENTRY_CLASS, elm_box5);
pub_widgets->new_profile_script = new_profile_script;
eo_do(new_profile_script, elm_obj_entry_scrollable_set(EINA_TRUE));
eo_do(new_profile_script, evas_obj_size_hint_align_set(-1.000000, -1.000000));
eo_do(new_profile_script, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_script, efl_gfx_size_set(65, 35));
eo_do(new_profile_script, evas_obj_size_hint_weight_set(1.000000, 8.000000));
eo_do(new_profile_script, elm_obj_widget_disabled_set(EINA_TRUE));
eo_do(elm_box5, elm_obj_box_pack_end(elm_box6));
eo_do(elm_box5, elm_obj_box_pack_end(elm_label1));
eo_do(elm_box5, elm_obj_box_pack_end(new_profile_command));
eo_do(elm_box5, elm_obj_box_pack_end(elm_label2));
eo_do(elm_box5, elm_obj_box_pack_end(new_profile_script));
eo_do(elm_box5, elm_obj_box_pack_end(elm_box4));
eo_do(new_profile_win, efl_gfx_visible_set(EINA_TRUE));
eo_do(new_profile_win, eo_event_callback_add(EO_BASE_EVENT_DEL, _pubs_free_cb, pub_widgets));
return pub_widgets;
}
static Eina_Bool
screenshot_button_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
{
screenshot_req_cb(data, obj, desc, event_info);
return EINA_TRUE;
}
Gui_Screenshot_Button_Widgets *
gui_screenshot_button_create(Eo *__main_parent)
{
Gui_Screenshot_Button_Widgets *pub_widgets = calloc(1, sizeof(*pub_widgets));
Eo *screenshot_button;
Eo *elm_icon1;
screenshot_button = eo_add(ELM_BUTTON_CLASS, __main_parent);
pub_widgets->screenshot_button = screenshot_button;
eo_do(screenshot_button, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(screenshot_button, efl_gfx_visible_set(EINA_TRUE));
eo_do(screenshot_button, efl_gfx_size_set(73, 30));
eo_do(screenshot_button, eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, screenshot_button_clicked, NULL));
elm_icon1 = eo_add(ELM_ICON_CLASS, screenshot_button);
eo_do(elm_icon1, evas_obj_size_hint_weight_set(1.000000, 1.000000));
eo_do(elm_icon1, efl_gfx_visible_set(EINA_TRUE));
eo_do(elm_icon1, efl_gfx_size_set(40, 40));
eo_do(elm_icon1, efl_file_set(SCREENSHOT_ICON, NULL));
eo_do(screenshot_button, elm_obj_container_content_set("icon", elm_icon1));
eo_do(screenshot_button, eo_event_callback_add(EO_BASE_EVENT_DEL, _pubs_free_cb, pub_widgets));
return pub_widgets;
}
Gui_Widgets *gui_gui_get()
{
static Eina_Bool initialized = EINA_FALSE;
if (!initialized)
{
g_pub_widgets.main_win = gui_main_win_create(NULL);
initialized = EINA_TRUE;
}
return &g_pub_widgets;
}

56
src/bin/gui.h Normal file
View File

@ -0,0 +1,56 @@
#ifndef _gui_h_
#define _gui_h_
#include <Eo.h>
#include <Elementary.h>
typedef struct
{
Eo *main_win;
Eo *apps_selector;
Eo *object_infos_list;
Eo *objects_list;
} Gui_Main_Win_Widgets;
typedef struct
{
Eo *profiles_win;
Eo *profile_delete_button;
Eo *profile_ok_button;
Eo *profile_cancel_button;
Eo *profiles_list;
} Gui_Profiles_Win_Widgets;
typedef struct
{
Eo *new_profile_win;
Eo *new_profile_cancel_button;
Eo *new_profile_save_button;
Eo *new_profile_type_selector;
Eo *new_profile_name;
Eo *new_profile_command;
Eo *new_profile_script;
} Gui_New_Profile_Win_Widgets;
typedef struct
{
Eo *screenshot_button;
} Gui_Screenshot_Button_Widgets;
typedef struct {
Gui_Main_Win_Widgets *main_win;
} Gui_Widgets;
Gui_Main_Win_Widgets *gui_main_win_create(Eo *parent);
Gui_Profiles_Win_Widgets *gui_profiles_win_create(Eo *parent);
Gui_New_Profile_Win_Widgets *gui_new_profile_win_create(Eo *parent);
Gui_Screenshot_Button_Widgets *gui_screenshot_button_create(Eo *parent);
Gui_Widgets *gui_gui_get();
#endif

View File

@ -1,56 +0,0 @@
#ifndef _CLOUSEAU_H
#define _CLOUSEAU_H
/* FIXME: This doesn't include anything yet.
* Still need to expose stuff for clouseaud and clouseau_client. Those will be
* added once the whole interface will be better defined.
* These functions will probably need to be renamed/change as well.
* We'll also remove the private include once things are done. */
#include <Eo.h>
#include <Eina.h>
#include <Evas.h>
typedef struct _Clouseau_Bitmap Clouseau_Bitmap;
typedef struct _Clouseau_Tree_Item Clouseau_Tree_Item;
/* Legacy type. */
typedef struct _Clouseau_Object Clouseau_Object;
struct _Clouseau_Bitmap
{
unsigned char *bmp;
int bmp_count; /* is (w * h), for EET_DATA_DESCRIPTOR_ADD_BASIC_VAR_ARRAY */
Evas_Coord w;
Evas_Coord h;
};
/* FIXME: Should name be a stringshare?
* FIXME: Should strip this structure to be half the size. Most of the stuff are
* not really needed. */
struct _Clouseau_Tree_Item
{
Eina_List *children;
Eina_List *eo_info; /* The intermediate type we use for eet. */
Eo_Dbg_Info *new_eo_info;
const char *name;
unsigned long long ptr; /* Just a ptr, we keep the value but not accessing mem */
Clouseau_Object *info; /* Legacy */
Eina_Bool is_obj;
Eina_Bool is_clipper;
Eina_Bool is_visible;
};
EAPI Eina_Bool clouseau_app_connect(const char *appname);
EAPI Eina_Bool clouseau_daemon_connect(void);
EAPI Eina_Bool clouseau_client_connect(void);
EAPI Eina_Bool clouseau_disconnect(void);
EAPI int clouseau_init(void);
EAPI int clouseau_shutdown(void);
/* FIXME: Remove. */
#include "clouseau_private.h"
#endif

View File

@ -1,42 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
AM_CPPFLAGS = \
-I$(top_srcdir)/src/include \
-I$(top_builddir)/src/include \
-DPACKAGE_BIN_DIR=\"$(bindir)\" \
-DPACKAGE_LIB_DIR=\"$(libdir)\" \
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
@EFL_CFLAGS@
EXTRA_DIST = \
clouseau_private.h \
clouseau_private2.h \
clouseau_data_legacy.h
includesdir = $(includedir)/clouseau-@VMAJ@
includes_HEADERS = \
Clouseau.h
pkgdir = $(libdir)/clouseau
pkg_LTLIBRARIES = libclouseau_preload.la
lib_LTLIBRARIES = libclouseau.la
libclouseau_la_SOURCES = clouseau_object_information.c \
clouseau_data_legacy.c \
clouseau.c \
clouseau_app.c \
clouseau_data.c
libclouseau_la_DEPENDENCIES = $(top_builddir)/config.h
libclouseau_la_LIBADD = @EFL_LIBS@
libclouseau_la_CFLAGS = @EFL_CFLAGS@ -DCLOUSEAUD_PATH=\"$(bindir)/clouseaud\"
libclouseau_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
libclouseau_preload_la_SOURCES = \
clouseau_preload.c
libclouseau_preload_la_LDFLAGS = -module -avoid-version -rdynamic
libclouseau_preload_la_DEPENDENCIES = $(top_builddir)/config.h libclouseau.la
libclouseau_preload_la_LIBADD = libclouseau.la @EFL_LIBS@
libclouseau_preload_la_CFLAGS = @EFL_CFLAGS@

View File

@ -1,56 +0,0 @@
#include "clouseau_private.h"
static int _clouseau_init_count = 0;
EAPI Eina_Bool
clouseau_daemon_connect(void)
{
return EINA_TRUE;
}
EAPI Eina_Bool
clouseau_client_connect(void)
{
return EINA_TRUE;
}
EAPI Eina_Bool
clouseau_disconnect(void)
{
clouseau_app_disconnect();
return EINA_TRUE;
}
EAPI int
clouseau_init(void)
{
if (++_clouseau_init_count == 1)
{
eina_init();
ecore_init();
ecore_con_init();
clouseau_data_init();
}
return _clouseau_init_count;
}
EAPI int
clouseau_shutdown(void)
{
if (--_clouseau_init_count == 0)
{
clouseau_disconnect();
clouseau_data_shutdown();
ecore_con_shutdown();
ecore_shutdown();
eina_shutdown();
}
else if (_clouseau_init_count < 0)
{
_clouseau_init_count = 0;
printf("Tried to shutdown although not initiated.\n");
}
return _clouseau_init_count;
}

View File

@ -1,552 +0,0 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "clouseau_private.h"
#include <Elementary.h>
#include <Ecore_X.h>
static Ecore_Con_Server *econ_server = NULL;
static Ecore_Con_Eet *eet_svr = NULL;
static Eina_Stringshare *_my_appname = NULL;
static Clouseau_Object *_clouseau_object_information_get(Clouseau_Tree_Item *treeit);
static void
libclouseau_item_add(Evas_Object *o, Clouseau_Tree_Item *parent)
{
Clouseau_Tree_Item *treeit;
Eina_List *children;
Evas_Object *child;
treeit = calloc(1, sizeof(Clouseau_Tree_Item));
if (!treeit) return ;
treeit->ptr = (uintptr_t) o;
treeit->is_obj = EINA_TRUE;
treeit->name = eina_stringshare_add(eo_class_name_get(o));
/* FIXME: Hack to work with old smart inheritance.
* Check if the class *is* (not just implements) Evas_Smart. */
if (eo_class_get(o) == EVAS_OBJECT_SMART_CLASS)
{
char buf[1024];
snprintf(buf, sizeof(buf), "%s (%s)", evas_object_type_get(o), treeit->name);
eina_stringshare_replace(&treeit->name, buf);
}
treeit->is_clipper = !!evas_object_clipees_get(o);
treeit->is_visible = evas_object_visible_get(o);
treeit->info = _clouseau_object_information_get(treeit);
parent->children = eina_list_append(parent->children, treeit);
/* if (!evas_object_smart_data_get(o)) return ; */
/* Do this only for smart object */
if (eo_isa(o, EVAS_OBJECT_SMART_CLASS))
{
children = evas_object_smart_members_get(o);
EINA_LIST_FREE(children, child)
libclouseau_item_add(child, treeit);
}
}
static void *
_canvas_bmp_get(Ecore_Evas *ee, Evas_Coord *w_out, Evas_Coord *h_out)
{
Ecore_X_Image *img;
Ecore_X_Window_Attributes att;
unsigned char *src;
unsigned int *dst;
int bpl = 0, rows = 0, bpp = 0;
Evas_Coord w, h;
/* Check that this window still exists */
Eina_List *eeitr, *ees = ecore_evas_ecore_evas_list_get();
Ecore_Evas *eel;
Eina_Bool found_evas = EINA_FALSE;
EINA_LIST_FOREACH(ees, eeitr, eel)
if (eel == ee)
{
found_evas = EINA_TRUE;
break;
}
Ecore_X_Window xwin = (found_evas) ?
(Ecore_X_Window) ecore_evas_window_get(ee) : 0;
if (!xwin)
{
printf("Can't grab X window.\n");
*w_out = *h_out = 0;
return NULL;
}
Evas *e = ecore_evas_get(ee);
evas_output_size_get(e, &w, &h);
memset(&att, 0, sizeof(Ecore_X_Window_Attributes));
ecore_x_window_attributes_get(xwin, &att);
img = ecore_x_image_new(w, h, att.visual, att.depth);
ecore_x_image_get(img, xwin, 0, 0, 0, 0, w, h);
src = ecore_x_image_data_get(img, &bpl, &rows, &bpp);
dst = malloc(w * h * sizeof(int)); /* Will be freed by the user */
if (!ecore_x_image_is_argb32_get(img))
{ /* Fill dst buffer with image convert */
ecore_x_image_to_argb_convert(src, bpp, bpl,
att.colormap, att.visual,
0, 0, w, h,
dst, (w * sizeof(int)), 0, 0);
}
else
{ /* Fill dst buffer by copy */
memcpy(dst, src, (w * h * sizeof(int)));
}
/* dst now holds window bitmap */
ecore_x_image_free(img);
*w_out = w;
*h_out = h;
return (void *) dst;
}
static Eina_List *
_load_list(void)
{
Eina_List *tree = NULL;
Eina_List *ees;
Ecore_Evas *ee;
ees = ecore_evas_ecore_evas_list_get();
EINA_LIST_FREE(ees, ee)
{
Eina_List *objs;
Evas_Object *obj;
Clouseau_Tree_Item *treeit;
Evas *e;
int w, h;
e = ecore_evas_get(ee);
evas_output_size_get(e, &w, &h);
treeit = calloc(1, sizeof(Clouseau_Tree_Item));
if (!treeit) continue ;
treeit->name = eina_stringshare_add(ecore_evas_title_get(ee));
treeit->ptr = (uintptr_t) ee;
tree = eina_list_append(tree, treeit);
objs = evas_objects_in_rectangle_get(e, SHRT_MIN, SHRT_MIN,
USHRT_MAX, USHRT_MAX, EINA_TRUE, EINA_TRUE);
EINA_LIST_FREE(objs, obj)
libclouseau_item_add(obj, treeit);
}
return tree; /* User has to call clouseau_tree_free() */
}
/* Highlight functions. */
static Eina_Bool
_clouseau_highlight_fade(void *_rect)
{
Evas_Object *rect = _rect;
int r, g, b, a;
double na;
evas_object_color_get(rect, &r, &g, &b, &a);
if (a < 20)
{
evas_object_del(rect);
/* The del callback of the object will destroy the animator */
return EINA_TRUE;
}
na = a - 5;
r = na / a * r;
g = na / a * g;
b = na / a * b;
evas_object_color_set(rect, r, g, b, na);
return EINA_TRUE;
}
static Evas_Object *
_clouseau_verify_e_children(Evas_Object *obj, Evas_Object *ptr)
{
/* Verify that obj still exists (can be found on evas canvas) */
Evas_Object *child;
Evas_Object *p = NULL;
Eina_List *children;
if (ptr == obj)
return ptr;
if (eo_isa(obj, EVAS_OBJECT_SMART_CLASS))
{
children = evas_object_smart_members_get(obj);
EINA_LIST_FREE(children, child)
{
p = _clouseau_verify_e_children(child, ptr);
if (p) break;
}
eina_list_free(children);
}
return p;
}
static Evas_Object *
_clouseau_verify_e_obj(Evas_Object *obj)
{
/* Verify that obj still exists (can be found on evas canvas) */
Evas_Object *o;
Eina_List *ees;
Ecore_Evas *ee;
Evas_Object *rt = NULL;
ees = ecore_evas_ecore_evas_list_get();
EINA_LIST_FREE(ees, ee)
{
Evas *e;
Eina_List *objs;
e = ecore_evas_get(ee);
objs = evas_objects_in_rectangle_get(e, SHRT_MIN, SHRT_MIN,
USHRT_MAX, USHRT_MAX,
EINA_TRUE, EINA_TRUE);
EINA_LIST_FREE(objs, o)
{
rt = _clouseau_verify_e_children(o, obj);
if (rt) break;
}
eina_list_free(objs);
if (rt) break;
}
eina_list_free(ees);
return rt;
}
static void
_clouseau_highlight_del(void *data,
EINA_UNUSED Evas *e,
EINA_UNUSED Evas_Object *obj,
EINA_UNUSED void *event_info)
{ /* Delete timer for this rect */
ecore_animator_del(data);
}
EAPI void
clouseau_data_object_highlight(Evas_Object *obj, Clouseau_Evas_Props *props, bmp_info_st *view)
{
Ecore_Animator *t;
Evas_Object *r;
int x, y, wd, ht;
Evas *e = NULL;
if (props)
{
e = evas_object_evas_get(view->win);
}
else
{
/* Check validity of object when working online */
if (!_clouseau_verify_e_obj(obj))
{
printf("<%s> Evas Object not found <%p> (probably deleted)\n",
__func__, obj);
return;
}
/* Take evas from object if working online */
e = evas_object_evas_get(obj);
if (!e) return;
}
/* Continue and do the Highlight */
r = evas_object_polygon_add(e);
evas_object_move(r, 0, 0);
if (props)
{
/* When working offline grab info from struct */
Evas_Coord x_bmp, y_bmp;
/* If there's a map, highlight the map coords, not the object's */
if (props->points_count > 0)
{
int i = props->points_count;
for ( ; i > 0 ; i--)
{
evas_object_polygon_point_add(r,
props->points[i].x, props->points[i].y);
}
}
else
{
evas_object_geometry_get(view->o, &x_bmp, &y_bmp, NULL, NULL);
x = (view->zoom_val * props->x) + x_bmp;
y = (view->zoom_val * props->y) + y_bmp;
wd = (view->zoom_val * props->w);
ht = (view->zoom_val * props->h);
evas_object_polygon_point_add(r, x, y);
evas_object_polygon_point_add(r, x + wd, y);
evas_object_polygon_point_add(r, x + wd, y + ht);
evas_object_polygon_point_add(r, x, y + ht);
}
}
else
{
const Evas_Map *map;
if ((map = evas_object_map_get(obj)))
{
int i = evas_map_count_get(map);
for ( ; i > 0 ; i--)
{
Evas_Coord mx, my;
evas_map_point_coord_get(map, i - 1, &mx, &my, NULL);
evas_object_polygon_point_add(r, mx, my);
}
}
else
{
evas_object_geometry_get(obj, &x, &y, &wd, &ht);
evas_object_polygon_point_add(r, x, y);
evas_object_polygon_point_add(r, x + wd, y);
evas_object_polygon_point_add(r, x + wd, y + ht);
evas_object_polygon_point_add(r, x, y + ht);
}
}
/* Put the object as high as possible. */
evas_object_layer_set(r, EVAS_LAYER_MAX);
evas_object_color_set(r,
HIGHLIGHT_R, HIGHLIGHT_G, HIGHLIGHT_B, HIGHLIGHT_A);
evas_object_show(r);
/* Add Timer for fade and a callback to delete timer on obj del */
t = ecore_animator_add(_clouseau_highlight_fade, r);
evas_object_event_callback_add(r, EVAS_CALLBACK_DEL,
_clouseau_highlight_del, t);
/* Print backtrace info, saved for future ref
tmp = evas_object_data_get(obj, ".clouseau.bt");
fprintf(stderr, "Creation backtrace :\n%s*******\n", tmp); */
}
static Clouseau_Object *
_clouseau_object_information_get(Clouseau_Tree_Item *treeit)
{
Evas_Object *obj = (void*) (uintptr_t) treeit->ptr;
Eo_Dbg_Info *eo_dbg_info;
if (!treeit->is_obj)
return NULL;
eo_dbg_info = EO_DBG_INFO_LIST_APPEND(NULL, "");
eo_do(obj, eo_dbg_info_get(eo_dbg_info));
/* XXX: Edje information that should be here because Evas objects can't
* depend on Edje. This should be removed in the future. */
{
const char *part_name = edje_object_part_object_name_get(obj);
if (part_name)
{
Eo_Dbg_Info *group = EO_DBG_INFO_LIST_APPEND(eo_dbg_info, "Edje_Part");
EO_DBG_INFO_APPEND(group, "Part name", EINA_VALUE_TYPE_STRING, part_name);
}
}
treeit->eo_info = clouseau_eo_to_legacy_convert(eo_dbg_info);
eo_dbg_info_free(eo_dbg_info); /* Free original list */
return NULL;
}
Eina_Bool
_add(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED Ecore_Con_Server *conn)
{
/* ecore_con_server_data_size_max_set(conn, -1); */
connect_st t = { getpid(), _my_appname };
ecore_con_eet_send(reply, CLOUSEAU_APP_CLIENT_CONNECT_STR, &t);
return ECORE_CALLBACK_RENEW;
}
Eina_Bool
_del(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
Ecore_Con_Server *conn)
{
if (!conn)
{
printf("Failed to establish connection to the server.\n");
}
printf("Lost server with ip <%s>\n", ecore_con_server_ip_get(conn));
ecore_con_server_del(conn);
return ECORE_CALLBACK_RENEW;
}
void
_data_req_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* data req includes ptr to GUI, to tell which client asking */
data_req_st *req = value;
tree_data_st t;
t.gui = req->gui; /* GUI client requesting data from daemon */
t.app = req->app; /* APP client sending data to daemon */
t.tree = _load_list();
if (t.tree)
{ /* Reply with tree data to data request */
ecore_con_eet_send(reply, CLOUSEAU_TREE_DATA_STR, &t);
clouseau_data_tree_free(t.tree);
}
}
void
_highlight_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* Highlight msg contains PTR of object to highlight */
highlight_st *ht = value;
Evas_Object *obj = (Evas_Object *) (uintptr_t) ht->object;
clouseau_data_object_highlight(obj, NULL, NULL);
}
void
_bmp_req_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
EINA_UNUSED const char *protocol_name, void *value)
{ /* Bitmap req msg contains PTR of Ecore Evas */
bmp_req_st *req = value;
Evas_Coord w, h;
unsigned int size = 0;
void *bmp = _canvas_bmp_get((Ecore_Evas *) (uintptr_t)
req->object, &w, &h);
bmp_info_st t = { req->gui,
req->app, req->object , req->ctr, w, h,
NULL,NULL, NULL, 1.0,
NULL, NULL, NULL, NULL, NULL, NULL };
void *p = clouseau_data_packet_compose(CLOUSEAU_BMP_DATA_STR,
&t, &size, bmp, (w * h * sizeof(int)));
if (p)
{
ecore_con_eet_raw_send(reply, CLOUSEAU_BMP_DATA_STR, "BMP", p, size);
free(p);
}
if (bmp)
free(bmp);
}
typedef struct
{
Ecore_Event_Handler *ee_handle;
Ecore_Exe *daemon_exe;
} Msg_From_Daemon_Data;
static void
_msg_from_daemon_data_free(Msg_From_Daemon_Data *msg_data)
{
ecore_event_handler_del(msg_data->ee_handle);
ecore_exe_free(msg_data->daemon_exe);
free(msg_data);
}
static Eina_Bool
_msg_from_daemon(void *data, int type EINA_UNUSED, void *event)
{
Ecore_Exe_Event_Data *msg = (Ecore_Exe_Event_Data *)event;
if (!strncmp(msg->data, CLOUSEAUD_READY_STR, sizeof(CLOUSEAUD_READY_STR)))
{
const char *address = LOCALHOST;
if (eet_svr)
{
fprintf(stderr, "Clouseau: Trying to connect to daemon although already supposedly connected. Error.\n");
return ECORE_CALLBACK_DONE;
}
econ_server = ecore_con_server_connect(ECORE_CON_REMOTE_TCP,
LOCALHOST, PORT, NULL);
if (!econ_server)
{
printf("could not connect to the server: %s, port %d.\n",
address, PORT);
return ECORE_CALLBACK_DONE;
}
eet_svr = ecore_con_eet_client_new(econ_server);
if (!eet_svr)
{
printf("could not create con_eet client.\n");
return ECORE_CALLBACK_DONE;
}
clouseau_register_descs(eet_svr);
/* Register callbacks for ecore_con_eet */
ecore_con_eet_server_connect_callback_add(eet_svr, _add, NULL);
ecore_con_eet_server_disconnect_callback_add(eet_svr, _del, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_DATA_REQ_STR,
_data_req_cb, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_HIGHLIGHT_STR,
_highlight_cb, NULL);
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_BMP_REQ_STR,
_bmp_req_cb, NULL);
_msg_from_daemon_data_free(data);
}
return ECORE_CALLBACK_DONE;
}
void
clouseau_app_disconnect(void)
{
ecore_con_eet_server_free(eet_svr);
eet_svr = NULL;
ecore_con_server_del(econ_server);
econ_server = NULL;
}
EAPI Eina_Bool
clouseau_app_connect(const char *appname)
{
Msg_From_Daemon_Data *msg_data = calloc(1, sizeof(*msg_data));
eina_stringshare_replace(&_my_appname, appname);
msg_data->ee_handle = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _msg_from_daemon, msg_data);
/* FIXME: Possibly have a better way to get rid of preload. */
msg_data->daemon_exe = ecore_exe_pipe_run("LD_PRELOAD='' " CLOUSEAUD_PATH,
ECORE_EXE_PIPE_READ_LINE_BUFFERED |
ECORE_EXE_PIPE_READ, NULL);
if (!msg_data->daemon_exe)
{
_msg_from_daemon_data_free(msg_data);
fprintf(stderr, "Could not start the daemon.!\n");
return EINA_FALSE;
}
return EINA_TRUE;
}

View File

@ -1,792 +0,0 @@
#include "clouseau_private.h"
#include "clouseau_data_legacy.h"
static int clouseau_init_count = 0;
static Eet_Data_Descriptor *clouseau_union_edd = NULL;
static Eet_Data_Descriptor *clouseau_connect_edd = NULL;
static Eet_Data_Descriptor *clouseau_app_add_edd = NULL;
static Eet_Data_Descriptor *clouseau_data_req_edd = NULL;
static Eet_Data_Descriptor *clouseau_bmp_info_edd = NULL;
static Eet_Data_Descriptor *clouseau_shot_list_edd = NULL;
static Eet_Data_Descriptor *clouseau_tree_data_edd = NULL;
static Eet_Data_Descriptor *clouseau_tree_edd = NULL;
static Eet_Data_Descriptor *clouseau_app_closed_edd = NULL;
static Eet_Data_Descriptor *clouseau_highlight_edd = NULL;
static Eet_Data_Descriptor *clouseau_bmp_req_edd = NULL;
static Eet_Data_Descriptor *clouseau_protocol_edd = NULL;
static Eet_Data_Descriptor *eo_string_edd = NULL;
static Eet_Data_Descriptor *eo_int_edd = NULL;
static Eet_Data_Descriptor *eo_bool_edd = NULL;
static Eet_Data_Descriptor *eo_ptr_edd = NULL;
static Eet_Data_Descriptor *eo_double_edd = NULL;
static Eet_Data_Descriptor *eo_list_edd = NULL;
static Eet_Data_Descriptor *eo_dbg_info_edd = NULL;
EAPI void
clouseau_eo_info_free(Clouseau_Eo_Dbg_Info *parent)
{
Clouseau_Eo_Dbg_Info *eo;
if (parent->type == CLOUSEAU_DBG_INFO_TYPE_LIST)
EINA_LIST_FREE(parent->un_dbg_info.dbg.list, eo)
clouseau_eo_info_free(eo);
else if (parent->type == CLOUSEAU_DBG_INFO_TYPE_STRING)
eina_stringshare_del(parent->un_dbg_info.text.s);
eina_stringshare_del(parent->name);
free(parent);
}
static void
_clouseau_tree_item_free(Clouseau_Tree_Item *parent)
{
Clouseau_Tree_Item *treeit;
Clouseau_Eo_Dbg_Info *eo;
if (parent->new_eo_info)
eo_dbg_info_free(parent->new_eo_info);
EINA_LIST_FREE(parent->eo_info, eo)
clouseau_eo_info_free(eo);
EINA_LIST_FREE(parent->children, treeit)
_clouseau_tree_item_free(treeit);
clouseau_object_information_free(parent->info);
eina_stringshare_del(parent->name);
free(parent);
}
EAPI void
clouseau_data_tree_free(Eina_List *tree)
{
Clouseau_Tree_Item *treeit;
EINA_LIST_FREE(tree, treeit)
_clouseau_tree_item_free(treeit);
}
static void
_clouseau_connect_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, connect_st);
clouseau_connect_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_connect_edd, connect_st,
"pid", pid, EET_T_UINT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_connect_edd, connect_st,
"name", name, EET_T_STRING);
}
static void
_clouseau_app_add_desc_make(void)
{ /* view field not transferred, will be loaded on user request */
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, app_info_st);
clouseau_app_add_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_app_add_edd, app_info_st,
"pid", pid, EET_T_UINT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_app_add_edd, app_info_st,
"name", name, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_app_add_edd, app_info_st,
"ptr", ptr, EET_T_ULONG_LONG);
}
static void
_clouseau_req_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, data_req_st);
clouseau_data_req_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_data_req_edd, data_req_st,
"gui", gui, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_data_req_edd, data_req_st,
"app", app, EET_T_ULONG_LONG);
}
static void
_clouseau_bmp_info_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, bmp_info_st);
clouseau_bmp_info_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_info_edd, bmp_info_st,
"gui", gui, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_info_edd, bmp_info_st,
"app", app, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_info_edd, bmp_info_st,
"object", object, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_info_edd, bmp_info_st,
"ctr", ctr, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_info_edd, bmp_info_st,
"w", w, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_info_edd, bmp_info_st,
"h", h, EET_T_ULONG_LONG);
}
static void
_clouseau_shot_list_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, shot_list_st);
clouseau_shot_list_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_LIST(clouseau_shot_list_edd, shot_list_st,
"view", view, clouseau_bmp_info_edd);
}
static void
_clouseau_tree_item_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Tree_Item);
clouseau_tree_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_LIST(clouseau_tree_edd, Clouseau_Tree_Item,
"children", children, clouseau_tree_edd);
EET_DATA_DESCRIPTOR_ADD_LIST(clouseau_tree_edd, Clouseau_Tree_Item,
"eo_info", eo_info, eo_dbg_info_edd);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_edd, Clouseau_Tree_Item,
"name", name, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_edd, Clouseau_Tree_Item,
"ptr", ptr, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_SUB(clouseau_tree_edd, Clouseau_Tree_Item,
"info", info, clouseau_object_edd);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_edd, Clouseau_Tree_Item,
"is_obj", is_obj, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_edd, Clouseau_Tree_Item,
"is_clipper", is_clipper, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_edd, Clouseau_Tree_Item,
"is_visible", is_visible, EET_T_UCHAR);
}
static void
_clouseau_tree_data_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, tree_data_st);
clouseau_tree_data_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_data_edd, tree_data_st,
"gui", gui, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_data_edd, tree_data_st,
"app", app, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_LIST(clouseau_tree_data_edd, tree_data_st,
"tree", tree, clouseau_tree_edd);
}
static void
_clouseau_app_closed_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, app_closed_st);
clouseau_app_closed_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_app_closed_edd, app_closed_st,
"ptr", ptr, EET_T_ULONG_LONG);
}
static void
_clouseau_highlight_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, highlight_st);
clouseau_highlight_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_highlight_edd, highlight_st,
"app", app, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_highlight_edd, highlight_st,
"object", object, EET_T_ULONG_LONG);
}
static void
_clouseau_bmp_req_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, bmp_req_st);
clouseau_bmp_req_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_req_edd, bmp_req_st,
"gui", gui, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_req_edd, bmp_req_st,
"app", app, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_req_edd, bmp_req_st,
"object", object, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_bmp_req_edd, bmp_req_st,
"ctr", ctr, EET_T_UINT);
}
/* START EO descs */
struct _Clouseau_Eo_Dbg_Info_Mapping
{
Clouseau_Dbg_Info_Type u;
const char *name;
};
typedef struct _Clouseau_Eo_Dbg_Info_Mapping Clouseau_Eo_Dbg_Info_Mapping;
/* It's init later. */
static Clouseau_Eo_Dbg_Info_Mapping eet_dbg_info_mapping[] =
{
{ CLOUSEAU_DBG_INFO_TYPE_STRING, EO_DBG_INFO_TYPE_STRING_STR },
{ CLOUSEAU_DBG_INFO_TYPE_INT, EO_DBG_INFO_TYPE_INT_STR },
{ CLOUSEAU_DBG_INFO_TYPE_BOOL, EO_DBG_INFO_TYPE_BOOL_STR },
{ CLOUSEAU_DBG_INFO_TYPE_PTR, EO_DBG_INFO_TYPE_PTR_STR },
{ CLOUSEAU_DBG_INFO_TYPE_DOUBLE, EO_DBG_INFO_TYPE_DOUBLE_STR },
{ CLOUSEAU_DBG_INFO_TYPE_LIST, EO_DBG_INFO_TYPE_LIST_STR },
{ CLOUSEAU_DBG_INFO_TYPE_UNKNOWN, NULL }
};
static const char *
_dbg_info_union_type_get(const void *data, Eina_Bool *unknow)
{ /* _union_type_get */
const Clouseau_Dbg_Info_Type *u = data;
int i;
if (unknow)
*unknow = EINA_FALSE;
for (i = 0; eet_dbg_info_mapping[i].name != NULL; ++i)
if (*u == eet_dbg_info_mapping[i].u)
return eet_dbg_info_mapping[i].name;
if (unknow)
*unknow = EINA_TRUE;
return NULL;
}
static Eina_Bool
_dbg_info_union_type_set(const char *type, void *data, Eina_Bool unknow)
{ /* same as _union_type_set */
Clouseau_Dbg_Info_Type *u = data;
int i;
if (unknow)
return EINA_FALSE;
for (i = 0; eet_dbg_info_mapping[i].name != NULL; ++i)
if (strcmp(eet_dbg_info_mapping[i].name, type) == 0)
{
*u = eet_dbg_info_mapping[i].u;
return EINA_TRUE;
}
return EINA_FALSE;
}
static Eet_Data_Descriptor *
clouseau_string_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_string);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_string, "s",
s, EET_T_STRING);
return d;
}
static Eet_Data_Descriptor *
clouseau_int_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_int);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_int, "i",
i, EET_T_INT);
return d;
}
static Eet_Data_Descriptor *
clouseau_bool_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_bool);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_bool, "b",
b, EET_T_UCHAR);
return d;
}
static Eet_Data_Descriptor *
clouseau_ptr_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_ptr);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_ptr, "p",
p, EET_T_ULONG_LONG);
return d;
}
static Eet_Data_Descriptor *
clouseau_double_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_double);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_double, "d",
d, EET_T_DOUBLE);
return d;
}
static Eet_Data_Descriptor *
clouseau_list_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_dbg_list);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_LIST (d, Clouseau_st_dbg_list,
"list", list, eo_dbg_info_edd); /* Carefull, has to be initiated */
return d;
}
static void
_clouseau_eo_descs_make(void)
{
Eet_Data_Descriptor_Class eddc;
eo_string_edd = clouseau_string_desc_make();
eo_int_edd = clouseau_int_desc_make();
eo_bool_edd = clouseau_bool_desc_make();
eo_ptr_edd = clouseau_ptr_desc_make();
eo_double_edd = clouseau_double_desc_make();
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Eo_Dbg_Info);
eo_dbg_info_edd = eet_data_descriptor_file_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (eo_dbg_info_edd, Clouseau_Eo_Dbg_Info,
"name", name, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC (eo_dbg_info_edd, Clouseau_Eo_Dbg_Info,
"type", type, EET_T_UINT);
/* Here because clouseau_list_desc_make() uses eo_dbg_info_edd */
eo_list_edd = clouseau_list_desc_make();
/* for union */
eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
eddc.func.type_get = _dbg_info_union_type_get;
eddc.func.type_set = _dbg_info_union_type_set;
clouseau_union_edd = eet_data_descriptor_file_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_MAPPING(
clouseau_union_edd, EO_DBG_INFO_TYPE_STRING_STR
,eo_string_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(
clouseau_union_edd, EO_DBG_INFO_TYPE_INT_STR
,eo_int_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(
clouseau_union_edd, EO_DBG_INFO_TYPE_BOOL_STR
,eo_bool_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(
clouseau_union_edd, EO_DBG_INFO_TYPE_PTR_STR
,eo_ptr_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(
clouseau_union_edd, EO_DBG_INFO_TYPE_DOUBLE_STR
,eo_double_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(
clouseau_union_edd, EO_DBG_INFO_TYPE_LIST_STR
,eo_list_edd);
EET_DATA_DESCRIPTOR_ADD_UNION(eo_dbg_info_edd,
Clouseau_Eo_Dbg_Info,
"un_dbg_info", un_dbg_info,
type, clouseau_union_edd);
}
/* END EO descs */
static void
_clouseau_data_descriptors_init(void)
{
clouseau_data_descriptors_legacy_init();
_clouseau_eo_descs_make();
_clouseau_bmp_req_desc_make();
_clouseau_bmp_info_desc_make();
_clouseau_shot_list_desc_make();
_clouseau_tree_item_desc_make();
_clouseau_connect_desc_make();
_clouseau_app_add_desc_make();
_clouseau_req_desc_make();
_clouseau_tree_data_desc_make();
_clouseau_app_closed_desc_make();
_clouseau_highlight_desc_make();
}
static void
_clouseau_data_descriptors_shutdown(void)
{
eet_data_descriptor_free(eo_string_edd);
eet_data_descriptor_free(eo_int_edd);
eet_data_descriptor_free(eo_bool_edd);
eet_data_descriptor_free(eo_ptr_edd);
eet_data_descriptor_free(eo_double_edd);
eet_data_descriptor_free(eo_list_edd);
eet_data_descriptor_free(eo_dbg_info_edd);
eet_data_descriptor_free(clouseau_union_edd);
eet_data_descriptor_free(clouseau_connect_edd);
eet_data_descriptor_free(clouseau_app_add_edd);
eet_data_descriptor_free(clouseau_data_req_edd);
eet_data_descriptor_free(clouseau_tree_edd);
eet_data_descriptor_free(clouseau_app_closed_edd);
eet_data_descriptor_free(clouseau_highlight_edd);
eet_data_descriptor_free(clouseau_bmp_req_edd);
eet_data_descriptor_free(clouseau_bmp_info_edd);
eet_data_descriptor_free(clouseau_shot_list_edd);
eet_data_descriptor_free(clouseau_protocol_edd);
clouseau_data_descriptors_legacy_shutdown();
}
static void *
_host_to_net_blob_get(void *blob, int *blob_size)
{
if (!blob)
return blob;
/* Complete blob_size to sizeof(uint32_t) */
int mod = (*blob_size) % sizeof(uint32_t);
if (mod)
*blob_size += (sizeof(uint32_t) - mod);
void *n_blob = malloc(*blob_size);
uint32_t *src = blob;
uint32_t *dst = n_blob;
int cnt = (*blob_size) / sizeof(uint32_t);
while (cnt)
{
*dst = htonl(*src);
src++;
dst++;
cnt--;
}
return n_blob;
}
static void *
_net_to_host_blob_get(void *blob, int blob_size)
{
if (!blob)
return blob;
void *h_blob = malloc(blob_size);
uint32_t *src = blob;
uint32_t *dst = h_blob;
int cnt = blob_size / sizeof(uint32_t);
while (cnt)
{
*dst = ntohl(*src);
src++;
dst++;
cnt--;
}
return h_blob;
}
EAPI void *
clouseau_data_packet_compose(const char *p_type, void *data,
unsigned int *size, void *blob, int blob_size)
{ /* Returns packet BLOB and size in size param, NULL on failure */
/* User has to free returned buffer */
/* Packet is composed of Message Type + packet data. */
void *net_blob = NULL;
if (!strcmp(p_type, CLOUSEAU_BMP_DATA_STR))
{ /* Builed Bitmap data as follows:
First uint32_t is encoding size of bmp_info_st
The next to come will be the encoded bmp_info_st itself
Then we have blob_size param (specifiying bmp-blob-size)
folloed by the Bitmap raw data. */
int t_size; /* total size */
int e_size;
uint32_t e_size32;
uint32_t tmp;
void *p;
char *b;
char *ptr;
/* First, we like to encode bmp_info_st from data */
p = eet_data_descriptor_encode(clouseau_bmp_info_edd, data, &e_size);
e_size32 = (uint32_t) e_size;
/* Allocate buffer to hold whole packet data */
t_size = sizeof(e_size32) + /* encoding size of bmp_info_st */
+ e_size /* Encoded bmp_info_st */
+ sizeof(e_size32) /* bmp-blob-size */
+ blob_size; /* The BMP blob data */
ptr = b = malloc(t_size);
/* START - Build BMP_RAW_DATA packet data */
/* Size of encoded bmp_info_st comes next in uint32 format */
memcpy(ptr, &e_size32, sizeof(e_size32));
ptr += sizeof(e_size32);
/* Encoded bmp_info_st comes next */
memcpy(ptr, p, e_size);
ptr += e_size;
/* Size of BMP blob comes next */
tmp = (uint32_t) blob_size;
memcpy(ptr, &tmp, sizeof(uint32_t));
ptr += sizeof(uint32_t);
if (blob && blob_size)
{ /* BMP blob info comes right after BMP blob_size */
memcpy(ptr, blob, blob_size);
}
/* Save encoded size in network format */
net_blob = _host_to_net_blob_get(b, &t_size);
*size = t_size; /* Update packet size */
/* All info now in net_blob, free allocated mem */
free(b);
free(p);
/* END - Build BMP_RAW_DATA packet data */
}
return net_blob;
}
EAPI void *
clouseau_data_packet_info_get(const char *p_type, void *data, size_t size)
{
bmp_info_st *st = NULL;
void *host_blob = NULL;
char *ptr = NULL;
if (size <= 0)
return NULL;
host_blob = _net_to_host_blob_get(data, size);
ptr = host_blob;
if (!strcmp(p_type, CLOUSEAU_BMP_DATA_STR))
{
uint32_t *e_size32 = (uint32_t *) ptr;
int e_size = (int) (*e_size32); /* First Encoded bmp_info_st size */
ptr += sizeof(uint32_t);
/* Get the encoded bmp_info_st */
st = eet_data_descriptor_decode(clouseau_bmp_info_edd
,ptr, e_size);
ptr += e_size;
st->bmp = NULL;
/* Next Get bmp-blob-size */
e_size32 = (uint32_t *) ptr;
e_size = (int) (*e_size32); /* Get bmp-blob size */
ptr += sizeof(uint32_t);
/* Now we need to get the bmp data */
if (e_size)
{ /* BMP data available, allocate and copy */
st->bmp = malloc(e_size); /* Freed by user */
memcpy(st->bmp, ptr, e_size);
}
} /* User has to free st, st->bmp */
free(host_blob);
return st;
}
EAPI Eina_Bool
clouseau_data_eet_info_save(const char *filename,
app_info_st *a, tree_data_st *ftd, Eina_List *ck_list)
{
Eina_List *shots = NULL;
Eina_List *l;
Eet_File *fp;
Evas_Object *ck;
fp = eet_open(filename, EET_FILE_MODE_WRITE);
if (!fp) return EINA_FALSE;
eet_data_write(fp, clouseau_app_add_edd, CLOUSEAU_APP_ADD_ENTRY,
a, EINA_TRUE);
eet_data_write(fp, clouseau_tree_data_edd, CLOUSEAU_TREE_DATA_ENTRY,
ftd, EINA_TRUE);
/* Build list of (bmp_info_st *) according to user selection */
EINA_LIST_FOREACH(ck_list, l , ck)
if (elm_check_state_get(ck))
{
void *data;
data = evas_object_data_get(ck, BMP_FIELD);
if (data)
shots = eina_list_append(shots, data);
}
if (shots)
{
/* Write list and bitmaps */
char buf[1024];
shot_list_st t;
bmp_info_st *st;
t.view = shots;
eet_data_write(fp, clouseau_shot_list_edd, CLOUSEAU_BMP_LIST_ENTRY,
&t, EINA_TRUE);
EINA_LIST_FREE(shots, st)
{
sprintf(buf, CLOUSEAU_BMP_DATA_ENTRY"/%llx", st->object);
eet_data_image_write(fp, buf, st->bmp,
st->w, st->h, 1, 0, 100, 0);
}
}
eet_close(fp);
return EINA_TRUE;
}
EAPI Eina_Bool
clouseau_data_eet_info_read(const char *filename,
app_info_st **a, tree_data_st **ftd)
{
bmp_info_st *st;
shot_list_st *t;
Eet_File *fp;
fp = eet_open(filename, EET_FILE_MODE_READ);
if (!fp) return EINA_FALSE;
*a = eet_data_read(fp, clouseau_app_add_edd, CLOUSEAU_APP_ADD_ENTRY);
*ftd = eet_data_read(fp, clouseau_tree_data_edd, CLOUSEAU_TREE_DATA_ENTRY);
t = eet_data_read(fp, clouseau_shot_list_edd, CLOUSEAU_BMP_LIST_ENTRY);
if (t)
{
EINA_LIST_FREE(t->view, st)
{
char buf[1024];
int alpha;
int compress;
int quality;
int lossy;
sprintf(buf, CLOUSEAU_BMP_DATA_ENTRY"/%llx", st->object);
st->bmp = eet_data_image_read(fp, buf,
(unsigned int *) &st->w,
(unsigned int *) &st->h,
&alpha, &compress, &quality, &lossy);
/* Add the bitmaps to the actuall app data struct */
(*a)->view = eina_list_append((*a)->view, st);
}
free(t);
}
eet_close(fp);
return EINA_TRUE;
}
EAPI int
clouseau_data_init(void)
{
if (clouseau_init_count++ != 0)
return clouseau_init_count;
eina_init();
eet_init();
ecore_init();
_clouseau_data_descriptors_init();
return clouseau_init_count;
}
int
clouseau_register_descs(Ecore_Con_Eet *eet_svr)
{ /* Register descriptors for ecore_con_eet */
if (clouseau_init_count)
{ /* MUST be called after clouseau_data_init */
ecore_con_eet_register(eet_svr, CLOUSEAU_GUI_CLIENT_CONNECT_STR,
clouseau_connect_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_APP_CLIENT_CONNECT_STR,
clouseau_connect_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_APP_ADD_STR,
clouseau_app_add_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_DATA_REQ_STR,
clouseau_data_req_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_TREE_DATA_STR,
clouseau_tree_data_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_APP_CLOSED_STR,
clouseau_app_closed_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_HIGHLIGHT_STR,
clouseau_highlight_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_BMP_REQ_STR,
clouseau_bmp_req_edd);
ecore_con_eet_register(eet_svr, CLOUSEAU_BMP_DATA_STR,
clouseau_bmp_info_edd);
}
return clouseau_init_count;
}
EAPI int
clouseau_data_shutdown(void)
{
if (--clouseau_init_count != 0)
return clouseau_init_count;
_clouseau_data_descriptors_shutdown();
ecore_shutdown();
eet_shutdown();
eina_shutdown();
return clouseau_init_count;
}

View File

@ -1,295 +0,0 @@
#include "clouseau_data_legacy.h"
Eet_Data_Descriptor *clouseau_object_edd = NULL;
static Eet_Data_Descriptor *clouseau_union_edd = NULL;
static Eet_Data_Descriptor *clouseau_textblock_edd = NULL;
static Eet_Data_Descriptor *clouseau_edje_edd = NULL;
static Eet_Data_Descriptor *clouseau_image_edd = NULL;
static Eet_Data_Descriptor *clouseau_text_edd = NULL;
static Eet_Data_Descriptor *clouseau_elm_edd = NULL;
static Eet_Data_Descriptor *clouseau_map_point_props_edd = NULL;
static struct {
Clouseau_Object_Type u;
const char *name;
} eet_props_mapping[] = {
/* As eet_mapping */
{ CLOUSEAU_OBJ_TYPE_OTHER, "CLOUSEAU_OBJ_TYPE_OTHER" },
{ CLOUSEAU_OBJ_TYPE_ELM, "CLOUSEAU_OBJ_TYPE_ELM" },
{ CLOUSEAU_OBJ_TYPE_TEXT, "CLOUSEAU_OBJ_TYPE_TEXT" },
{ CLOUSEAU_OBJ_TYPE_IMAGE, "CLOUSEAU_OBJ_TYPE_IMAGE" },
{ CLOUSEAU_OBJ_TYPE_EDJE, "CLOUSEAU_OBJ_TYPE_EDJE" },
{ CLOUSEAU_OBJ_TYPE_TEXTBLOCK, "CLOUSEAU_OBJ_TYPE_TEXTBLOCK" },
{ CLOUSEAU_OBJ_TYPE_UNKNOWN, NULL }
};
static const char *
_clouseau_props_union_type_get(const void *data, Eina_Bool *unknow)
{ /* _union_type_get */
const Clouseau_Object_Type *u = data;
int i;
if (unknow)
*unknow = EINA_FALSE;
for (i = 0; eet_props_mapping[i].name != NULL; ++i)
if (*u == eet_props_mapping[i].u)
return eet_props_mapping[i].name;
if (unknow)
*unknow = EINA_TRUE;
return NULL;
}
static Eina_Bool
_clouseau_props_union_type_set(const char *type, void *data, Eina_Bool unknow)
{ /* same as _union_type_set */
Clouseau_Object_Type *u = data;
int i;
if (unknow)
return EINA_FALSE;
for (i = 0; eet_props_mapping[i].name != NULL; ++i)
if (strcmp(eet_props_mapping[i].name, type) == 0)
{
*u = eet_props_mapping[i].u;
return EINA_TRUE;
}
return EINA_FALSE;
}
static void
_clouseau_elm_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Elm_Props);
clouseau_elm_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_elm_edd, Clouseau_Elm_Props,
"type", type, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_elm_edd, Clouseau_Elm_Props,
"style", style, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_elm_edd, Clouseau_Elm_Props,
"scale", scale, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_elm_edd, Clouseau_Elm_Props,
"has_focus", has_focus, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_elm_edd, Clouseau_Elm_Props,
"is_disabled", is_disabled, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_elm_edd, Clouseau_Elm_Props,
"is_mirrored", is_mirrored, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_elm_edd, Clouseau_Elm_Props,
"is_mirrored_automatic", is_mirrored_automatic, EET_T_UCHAR);
}
static void
_clouseau_text_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Evas_Text_Props);
clouseau_text_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_text_edd, Clouseau_Evas_Text_Props,
"font", font, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_text_edd, Clouseau_Evas_Text_Props,
"size", size, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_text_edd, Clouseau_Evas_Text_Props,
"source", source, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_text_edd, Clouseau_Evas_Text_Props,
"text", text, EET_T_STRING);
}
static void
_clouseau_image_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Evas_Image_Props);
clouseau_image_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_image_edd, Clouseau_Evas_Image_Props,
"file", file, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_image_edd, Clouseau_Evas_Image_Props,
"key", key, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_image_edd, Clouseau_Evas_Image_Props,
"source", source, EET_T_UINT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_image_edd, Clouseau_Evas_Image_Props,
"load_err", load_err, EET_T_STRING);
}
static void
_clouseau_edje_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Edje_Props);
clouseau_edje_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_edje_edd, Clouseau_Edje_Props,
"file", file, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_edje_edd, Clouseau_Edje_Props,
"group", group, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_edje_edd, Clouseau_Edje_Props,
"load_err", load_err, EET_T_STRING);
}
static void
_clouseau_textblock_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Evas_Textblock_Props);
clouseau_textblock_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_textblock_edd, Clouseau_Evas_Textblock_Props,
"style", style, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_textblock_edd, Clouseau_Evas_Textblock_Props,
"text", text, EET_T_STRING);
}
static void
_clouseau_map_point_props_desc_make(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc,
Clouseau_Evas_Map_Point_Props);
clouseau_map_point_props_edd = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_map_point_props_edd,
Clouseau_Evas_Map_Point_Props, "x", x, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_map_point_props_edd,
Clouseau_Evas_Map_Point_Props, "y", y, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_map_point_props_edd,
Clouseau_Evas_Map_Point_Props, "z", z, EET_T_INT);
}
void
clouseau_data_descriptors_legacy_init(void)
{
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Object);
clouseau_object_edd = eet_data_descriptor_stream_new(&eddc);
/* START - evas_props Struct desc */
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.name", evas_props.name, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.bt", evas_props.bt, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.layer", evas_props.layer, EET_T_SHORT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.x", evas_props.x, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.y", evas_props.y, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.w", evas_props.w, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.h", evas_props.h, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.scale", evas_props.scale, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.min_w", evas_props.min_w, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.min_h", evas_props.min_h, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.max_w", evas_props.max_w, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.max_h", evas_props.max_h, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.req_w", evas_props.req_w, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.req_h", evas_props.req_h, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.align_x", evas_props.align_x, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.align_y", evas_props.align_y, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.weight_x", evas_props.weight_x, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.weight_y", evas_props.weight_y, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.r", evas_props.r, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.g", evas_props.g, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.b", evas_props.b, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.a", evas_props.a, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.pass_events", evas_props.pass_events, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.repeat_events", evas_props.repeat_events, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.propagate_events", evas_props.propagate_events, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.has_focus", evas_props.has_focus, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.is_clipper", evas_props.is_clipper, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.is_visible", evas_props.is_visible, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.clipper", evas_props.clipper, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_object_edd, Clouseau_Object,
"evas_props.mode", evas_props.mode, EET_T_INT);
_clouseau_elm_desc_make();
_clouseau_text_desc_make();
_clouseau_image_desc_make();
_clouseau_edje_desc_make();
_clouseau_textblock_desc_make();
_clouseau_map_point_props_desc_make();
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(clouseau_object_edd, Clouseau_Object,
"evas_props.points", evas_props.points,
clouseau_map_point_props_edd);
/* for union */
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Extra_Props);
eddc.func.type_get = _clouseau_props_union_type_get;
eddc.func.type_set = _clouseau_props_union_type_set;
clouseau_union_edd = eet_data_descriptor_file_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_union_edd,
"CLOUSEAU_OBJ_TYPE_ELM", clouseau_elm_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_union_edd,
"CLOUSEAU_OBJ_TYPE_TEXT",
clouseau_text_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_union_edd,
"CLOUSEAU_OBJ_TYPE_IMAGE",
clouseau_image_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_union_edd,
"CLOUSEAU_OBJ_TYPE_EDJE",
clouseau_edje_edd);
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_union_edd,
"CLOUSEAU_OBJ_TYPE_TEXTBLOCK",
clouseau_textblock_edd);
EET_DATA_DESCRIPTOR_ADD_UNION(clouseau_object_edd, Clouseau_Object,
"u", extra_props.u,
extra_props.type, clouseau_union_edd);
}
void
clouseau_data_descriptors_legacy_shutdown(void)
{
eet_data_descriptor_free(clouseau_object_edd);
eet_data_descriptor_free(clouseau_elm_edd);
eet_data_descriptor_free(clouseau_text_edd);
eet_data_descriptor_free(clouseau_image_edd);
eet_data_descriptor_free(clouseau_edje_edd);
eet_data_descriptor_free(clouseau_textblock_edd);
eet_data_descriptor_free(clouseau_union_edd);
eet_data_descriptor_free(clouseau_map_point_props_edd);
}

View File

@ -1,10 +0,0 @@
#ifndef _CLOUSEAU_DATA_LEGACY_H
#define _CLOUSEAU_DATA_LEGACY_H
#include "clouseau_private.h"
extern Eet_Data_Descriptor *clouseau_object_edd;
void clouseau_data_descriptors_legacy_init(void);
void clouseau_data_descriptors_legacy_shutdown(void);
#endif

View File

@ -1,373 +0,0 @@
#include "clouseau_private.h"
EAPI void
clouseau_object_information_free(Clouseau_Object *oinfo)
{
if (!oinfo)
return;
eina_stringshare_del(oinfo->evas_props.name);
eina_stringshare_del(oinfo->evas_props.bt);
if (oinfo->evas_props.points)
free(oinfo->evas_props.points);
switch (oinfo->extra_props.type)
{
case CLOUSEAU_OBJ_TYPE_ELM:
eina_stringshare_del(oinfo->extra_props.u.elm.type);
eina_stringshare_del(oinfo->extra_props.u.elm.style);
break;
case CLOUSEAU_OBJ_TYPE_TEXT:
eina_stringshare_del(oinfo->extra_props.u.text.font);
eina_stringshare_del(oinfo->extra_props.u.text.source);
eina_stringshare_del(oinfo->extra_props.u.text.text);
break;
case CLOUSEAU_OBJ_TYPE_IMAGE:
eina_stringshare_del(oinfo->extra_props.u.image.file);
eina_stringshare_del(oinfo->extra_props.u.image.key);
eina_stringshare_del(oinfo->extra_props.u.image.load_err);
break;
case CLOUSEAU_OBJ_TYPE_EDJE:
eina_stringshare_del(oinfo->extra_props.u.edje.file);
eina_stringshare_del(oinfo->extra_props.u.edje.group);
eina_stringshare_del(oinfo->extra_props.u.edje.load_err);
break;
case CLOUSEAU_OBJ_TYPE_TEXTBLOCK:
eina_stringshare_del(oinfo->extra_props.u.textblock.style);
eina_stringshare_del(oinfo->extra_props.u.textblock.text);
break;
case CLOUSEAU_OBJ_TYPE_UNKNOWN:
case CLOUSEAU_OBJ_TYPE_OTHER:
break;
default:
break;
}
free(oinfo);
}
static void
_clouseau_eo_from_legacy_convert_helper(Eo_Dbg_Info *new_root, Clouseau_Eo_Dbg_Info *root)
{
switch (root->type)
{
case CLOUSEAU_DBG_INFO_TYPE_STRING:
EO_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_STRING, root->un_dbg_info.text.s);
break;
case CLOUSEAU_DBG_INFO_TYPE_INT:
EO_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_INT, root->un_dbg_info.intg.i);
break;
case CLOUSEAU_DBG_INFO_TYPE_BOOL:
EO_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_CHAR, root->un_dbg_info.bl.b);
break;
case CLOUSEAU_DBG_INFO_TYPE_PTR:
EO_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_UINT64, root->un_dbg_info.ptr.p);
break;
case CLOUSEAU_DBG_INFO_TYPE_DOUBLE:
EO_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_DOUBLE, root->un_dbg_info.dbl.d);
break;
case CLOUSEAU_DBG_INFO_TYPE_LIST:
{
Eina_List *l;
Clouseau_Eo_Dbg_Info *eo;
new_root = EO_DBG_INFO_LIST_APPEND(new_root, root->name);
EINA_LIST_FOREACH(root->un_dbg_info.dbg.list, l, eo)
_clouseau_eo_from_legacy_convert_helper(new_root, eo);
}
break;
default:
// FIXME
printf("Oops, wrong type.\n");
break;
}
}
EAPI void
clouseau_tree_item_from_legacy_convert(Clouseau_Tree_Item *treeit)
{
if (!treeit->eo_info)
return;
Eina_List *root = treeit->eo_info;
Eo_Dbg_Info *new_root = NULL;
Eina_List *l;
Clouseau_Eo_Dbg_Info *eo;
new_root = EO_DBG_INFO_LIST_APPEND(NULL, "");
EINA_LIST_FOREACH(root, l, eo)
{
_clouseau_eo_from_legacy_convert_helper(new_root, eo);
clouseau_eo_info_free(eo);
}
eina_list_free(treeit->eo_info);
treeit->eo_info = NULL;
treeit->new_eo_info = new_root;
}
static Clouseau_Dbg_Info_Type
_clouseau_eina_value_type_to_clouseau_type(const Eina_Value_Type *type)
{
if (type == EINA_VALUE_TYPE_STRING)
return CLOUSEAU_DBG_INFO_TYPE_STRING;
else if (type == EINA_VALUE_TYPE_INT)
return CLOUSEAU_DBG_INFO_TYPE_INT;
else if (type == EINA_VALUE_TYPE_CHAR)
return CLOUSEAU_DBG_INFO_TYPE_BOOL;
else if (type == EINA_VALUE_TYPE_UINT64)
return CLOUSEAU_DBG_INFO_TYPE_PTR;
else if (type == EINA_VALUE_TYPE_DOUBLE)
return CLOUSEAU_DBG_INFO_TYPE_DOUBLE;
else if (type == EINA_VALUE_TYPE_LIST)
return CLOUSEAU_DBG_INFO_TYPE_LIST;
return CLOUSEAU_DBG_INFO_TYPE_UNKNOWN;
}
/* This function converts a list of Eo_Dbg_Info
* to a list of Clouseau_Eo_Dbg_Info.
* This is required because we would like to keep the def of
* Eo_Dbg_Info in EO code. Thus, avoiding API/ABI error if user
* does not do a full update of Clouseau and EO */
EAPI Eina_List *
clouseau_eo_to_legacy_convert(Eo_Dbg_Info *root)
{
Eina_List *l;
Eina_List *new_list = NULL;
Eo_Dbg_Info *eo;
if (!root && (eina_value_type_get(&(root->value)) != EINA_VALUE_TYPE_LIST))
return new_list;
Eina_Value_List root_list;
eina_value_pget(&(root->value), &root_list);
EINA_LIST_FOREACH(root_list.list, l, eo)
{
Clouseau_Eo_Dbg_Info *info = calloc(1, sizeof(*info));
info->type = _clouseau_eina_value_type_to_clouseau_type(
eina_value_type_get(&(eo->value)));
info->name = eina_stringshare_add(eo->name);
switch (info->type)
{
case CLOUSEAU_DBG_INFO_TYPE_STRING:
{
const char *tmp;
eina_value_get(&(eo->value), &tmp);
info->un_dbg_info.text.s = eina_stringshare_add(tmp);
}
break;
case CLOUSEAU_DBG_INFO_TYPE_INT:
eina_value_get(&(eo->value), &(info->un_dbg_info.intg.i));
break;
case CLOUSEAU_DBG_INFO_TYPE_BOOL:
eina_value_get(&(eo->value), &(info->un_dbg_info.bl.b));
break;
case CLOUSEAU_DBG_INFO_TYPE_PTR:
{
uint64_t tmp;
eina_value_get(&(eo->value), &tmp);
info->un_dbg_info.ptr.p = tmp;
}
break;
case CLOUSEAU_DBG_INFO_TYPE_DOUBLE:
eina_value_get(&(eo->value), &(info->un_dbg_info.dbl.d));
break;
case CLOUSEAU_DBG_INFO_TYPE_LIST:
info->un_dbg_info.dbg.list =
clouseau_eo_to_legacy_convert(eo);
break;
default:
// FIXME
printf("Oops, wrong type.\n");
break;
}
new_list = eina_list_append(new_list, info);
}
return new_list;
}
static const struct {
const char *text;
Evas_Object_Pointer_Mode mode;
} pointer_mode[3] = {
# define POINTER_MODE(Value) { #Value, Value }
POINTER_MODE(EVAS_OBJECT_POINTER_MODE_AUTOGRAB),
POINTER_MODE(EVAS_OBJECT_POINTER_MODE_NOGRAB),
POINTER_MODE(EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
# undef POINTER_MODE
};
static const struct {
Clouseau_Object_Type type;
const char *name;
} _clouseau_types[] = {
{ CLOUSEAU_OBJ_TYPE_ELM, "Elementary" },
{ CLOUSEAU_OBJ_TYPE_TEXT, "Text" },
{ CLOUSEAU_OBJ_TYPE_IMAGE, "Image" },
{ CLOUSEAU_OBJ_TYPE_EDJE, "Edje" },
{ CLOUSEAU_OBJ_TYPE_TEXTBLOCK, "Textblock" }
};
EAPI void
clouseau_object_information_list_populate(Clouseau_Tree_Item *treeit)
{
Clouseau_Object *oinfo;
char buf[1024];
unsigned int i;
if (!treeit->is_obj)
return;
oinfo = treeit->info;
/* This code is here only for backward compatibility and will be removed soon */
if (!treeit->eo_info && !treeit->new_eo_info)
{
Eo_Dbg_Info *root = EO_DBG_INFO_LIST_APPEND(NULL, "");
/* Populate evas properties list */
Eo_Dbg_Info *group = EO_DBG_INFO_LIST_APPEND(root, "Evas");
Eo_Dbg_Info *node;
EO_DBG_INFO_APPEND(group, "Visibility", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.is_visible);
EO_DBG_INFO_APPEND(group, "Layer", EINA_VALUE_TYPE_INT, oinfo->evas_props.layer);
node = EO_DBG_INFO_LIST_APPEND(group, "Position");
EO_DBG_INFO_APPEND(node, "x", EINA_VALUE_TYPE_INT, oinfo->evas_props.x);
EO_DBG_INFO_APPEND(node, "y", EINA_VALUE_TYPE_INT, oinfo->evas_props.y);
node = EO_DBG_INFO_LIST_APPEND(group, "Size");
EO_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.w);
EO_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.h);
EO_DBG_INFO_APPEND(group, "Scale", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.scale);
#if 0
if (evas_object_clip_get(obj))
{
evas_object_geometry_get(evas_object_clip_get(obj), &x, &y, &w, &h);
_clouseau_information_geometry_to_tree(main_tit, "Clipper position", x, y);
_clouseau_information_geometry_to_tree(main_tit, "Clipper size", w, h);
}
#endif
node = EO_DBG_INFO_LIST_APPEND(group, "Min size");
EO_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.min_w);
EO_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.min_h);
node = EO_DBG_INFO_LIST_APPEND(group, "Max size");
EO_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.max_w);
EO_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.max_h);
node = EO_DBG_INFO_LIST_APPEND(group, "Request size");
EO_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.req_w);
EO_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.req_h);
node = EO_DBG_INFO_LIST_APPEND(group, "Align");
EO_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.align_x);
EO_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.align_y);
node = EO_DBG_INFO_LIST_APPEND(group, "Weight");
EO_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.weight_x);
EO_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.weight_y);
#if 0
evas_object_size_hint_aspect_get(obj, &w, &h);
_clouseau_information_geometry_to_tree(main_tit, "Aspect", w, h);
#endif
node = EO_DBG_INFO_LIST_APPEND(group, "Color");
EO_DBG_INFO_APPEND(node, "r", EINA_VALUE_TYPE_INT, oinfo->evas_props.r);
EO_DBG_INFO_APPEND(node, "g", EINA_VALUE_TYPE_INT, oinfo->evas_props.g);
EO_DBG_INFO_APPEND(node, "b", EINA_VALUE_TYPE_INT, oinfo->evas_props.b);
EO_DBG_INFO_APPEND(node, "a", EINA_VALUE_TYPE_INT, oinfo->evas_props.a);
EO_DBG_INFO_APPEND(group, "Has focus", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.has_focus);
for (i = 0; i < sizeof (pointer_mode) / sizeof (pointer_mode[0]); ++i)
if (pointer_mode[i].mode == oinfo->evas_props.mode)
{
EO_DBG_INFO_APPEND(group, "Pointer Mode", EINA_VALUE_TYPE_STRING, pointer_mode[i].text);
break;
}
EO_DBG_INFO_APPEND(group, "Pass Events", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.pass_events);
EO_DBG_INFO_APPEND(group, "Repeat Events", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.repeat_events);
EO_DBG_INFO_APPEND(group, "Propagate Events", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.propagate_events);
EO_DBG_INFO_APPEND(group, "Has clipees", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.is_clipper);
if (oinfo->evas_props.clipper)
{
snprintf(buf, sizeof(buf), "%llx", oinfo->evas_props.clipper);
EO_DBG_INFO_APPEND(group, "Clipper", EINA_VALUE_TYPE_STRING, buf);
}
if (oinfo->evas_props.points_count)
{
node = EO_DBG_INFO_LIST_APPEND(group, "Evas Map");
Clouseau_Evas_Map_Point_Props *p;
for(i = 0 ; (int) i < oinfo->evas_props.points_count; i++)
{
p = &oinfo->evas_props.points[i];
Eo_Dbg_Info *point = EO_DBG_INFO_LIST_APPEND(node, "Coords");
EO_DBG_INFO_APPEND(point, "x", EINA_VALUE_TYPE_INT, p->x);
EO_DBG_INFO_APPEND(point, "y", EINA_VALUE_TYPE_INT, p->y);
EO_DBG_INFO_APPEND(point, "z", EINA_VALUE_TYPE_INT, p->z);
}
}
if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_ELM)
{
group = EO_DBG_INFO_LIST_APPEND(root, "Elm");
EO_DBG_INFO_APPEND(group, "Wid-Type", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.elm.type);
#if 0
/* Extract actual data from theme? */
_clouseau_information_string_to_tree(main_tit, "Theme", elm_widget_theme_get(obj));
#endif
EO_DBG_INFO_APPEND(group, "Style", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.elm.style);
EO_DBG_INFO_APPEND(group, "Scale", EINA_VALUE_TYPE_DOUBLE, oinfo->extra_props.u.elm.scale);
EO_DBG_INFO_APPEND(group, "Disabled", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.is_disabled);
EO_DBG_INFO_APPEND(group, "Has focus", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.has_focus);
EO_DBG_INFO_APPEND(group, "Mirrored", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.is_mirrored);
EO_DBG_INFO_APPEND(group, "Automatic mirroring", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.is_mirrored_automatic);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_TEXT)
{ /* EVAS_OBJ_TEXT_CLASS */
group = EO_DBG_INFO_LIST_APPEND(root, "Text");
EO_DBG_INFO_APPEND(group, "Font", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.text.font);
EO_DBG_INFO_APPEND(group, "Size", EINA_VALUE_TYPE_INT, oinfo->extra_props.u.text.size);
EO_DBG_INFO_APPEND(group, "Source", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.text.source);
EO_DBG_INFO_APPEND(group, "Text", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.text.text);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_IMAGE)
{ /* EVAS_OBJ_IMAGE_CLASS */
group = EO_DBG_INFO_LIST_APPEND(root, "Image");
EO_DBG_INFO_APPEND(group, "Filename", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.image.file);
EO_DBG_INFO_APPEND(group, "File key", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.image.key);
EO_DBG_INFO_APPEND(group, "Source", EINA_VALUE_TYPE_UINT64, oinfo->extra_props.u.image.source);
if (oinfo->extra_props.u.image.load_err)
EO_DBG_INFO_APPEND(group, "Load error", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.image.load_err);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_EDJE)
{ /* EDJE_OBJ_CLASS */
group = EO_DBG_INFO_LIST_APPEND(root, "Edje");
EO_DBG_INFO_APPEND(group, "File", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.edje.file);
EO_DBG_INFO_APPEND(group, "Group", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.edje.group);
if (oinfo->extra_props.u.image.load_err)
EO_DBG_INFO_APPEND(group, "Load error", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.edje.load_err);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_TEXTBLOCK)
{ /* EVAS_OBJ_TEXTBLOCK_CLASS */
group = EO_DBG_INFO_LIST_APPEND(root, "Text Block");
EO_DBG_INFO_APPEND(group, "Style", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.textblock.style);
EO_DBG_INFO_APPEND(group, "Text", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.textblock.text);
}
/* Convert Old format to Clouseau_eo */
treeit->new_eo_info = root;
}
}

View File

@ -1,104 +0,0 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <dlfcn.h>
#include <execinfo.h>
#include "Clouseau.h"
static Eina_Bool _elm_is_init = EINA_FALSE;
static const char *_my_app_name = NULL;
/** PRELOAD functions. */
/* Hook on the elm_init
* We only do something here if we didn't already go into elm_init,
* which probably means we are not using elm. */
EAPI int
elm_init(int argc, char **argv)
{
int (*_elm_init)(int, char **) = dlsym(RTLD_NEXT, __func__);
setenv("ELM_CLOUSEAU", "0", 1);
if (!_elm_is_init)
{
_my_app_name = argv[0];
_elm_is_init = EINA_TRUE;
}
return _elm_init(argc, argv);
}
/* Hook on the main loop
* We only do something here if we didn't already go into elm_init,
* which probably means we are not using elm. */
EAPI void
ecore_main_loop_begin(void)
{
void (*_ecore_main_loop_begin)(void) = dlsym(RTLD_NEXT, __func__);
if (!_elm_is_init)
{
_my_app_name = "unknown";
}
clouseau_init();
if(!clouseau_app_connect(_my_app_name))
{
printf("Failed to connect to server.\n");
return;
}
_ecore_main_loop_begin();
clouseau_shutdown();
return;
}
#define EINA_LOCK_DEBUG_BT_NUM 64
typedef void (*Eina_Lock_Bt_Func) ();
EAPI Evas_Object *
evas_object_new(Evas *e)
{
Eina_Lock_Bt_Func lock_bt[EINA_LOCK_DEBUG_BT_NUM];
int lock_bt_num;
Evas_Object *(*_evas_object_new)(Evas *e) = dlsym(RTLD_NEXT, __func__);
Eina_Strbuf *str;
Evas_Object *r;
char **strings;
int i;
r = _evas_object_new(e);
if (!r) return NULL;
lock_bt_num = backtrace((void **)lock_bt, EINA_LOCK_DEBUG_BT_NUM);
strings = backtrace_symbols((void **)lock_bt, lock_bt_num);
str = eina_strbuf_new();
for (i = 1; i < lock_bt_num; ++i)
eina_strbuf_append_printf(str, "%s\n", strings[i]);
evas_object_data_set(r, ".clouseau.bt", eina_stringshare_add(eina_strbuf_string_get(str)));
free(strings);
eina_strbuf_free(str);
return r;
}
EAPI void
evas_object_free(Evas_Object *obj, int clean_layer)
{
void (*_evas_object_free)(Evas_Object *obj, int clean_layer) = dlsym(RTLD_NEXT, __func__);
const char *tmp;
tmp = evas_object_data_get(obj, ".clouseau.bt");
eina_stringshare_del(tmp);
_evas_object_free(obj, clean_layer);
}

View File

@ -1,239 +0,0 @@
#ifndef _CLOUSEAU_PRIVATE_H
#define _CLOUSEAU_PRIVATE_H
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <Eo.h>
#include <Ecore_Con_Eet.h>
#include "clouseau_private2.h"
/* Global constants */
#define BMP_FIELD "bmp"
#define PORT (22522)
#define MAX_LINE (1023)
#define LOCALHOST "127.0.0.1"
#define LISTEN_IP "0.0.0.0" /* Avail all, no mask */
#define CLOUSEAU_GUI_CLIENT_CONNECT_STR "CLOUSEAU_GUI_CLIENT_CONNECT"
#define CLOUSEAU_APP_CLIENT_CONNECT_STR "CLOUSEAU_APP_CLIENT_CONNECT"
#define CLOUSEAU_APP_ADD_STR "CLOUSEAU_APP_ADD"
#define CLOUSEAU_DATA_REQ_STR "CLOUSEAU_DATA_REQ"
#define CLOUSEAU_TREE_DATA_STR "CLOUSEAU_TREE_DATA"
#define CLOUSEAU_APP_CLOSED_STR "CLOUSEAU_APP_CLOSED"
#define CLOUSEAU_HIGHLIGHT_STR "CLOUSEAU_HIGHLIGHT"
#define CLOUSEAU_BMP_REQ_STR "CLOUSEAU_BMP_REQ"
#define CLOUSEAU_BMP_DATA_STR "CLOUSEAU_BMP_DATA"
/* Private function */
#define CLOUSEAU_APP_ADD_ENTRY "clouseau/app"
#define CLOUSEAU_TREE_DATA_ENTRY "clouseau/app/tree"
#define CLOUSEAU_BMP_LIST_ENTRY "clouseau/app/shot_list"
#define CLOUSEAU_BMP_DATA_ENTRY "clouseau/app/screenshot"
/* START - EO EET defs */
#define EO_DBG_INFO_TYPE_UNKNOWN_STR "EO_DBG_INFO_TYPE_UNKNOWN"
#define EO_DBG_INFO_TYPE_STRING_STR "EO_DBG_INFO_TYPE_STRING"
#define EO_DBG_INFO_TYPE_INT_STR "EO_DBG_INFO_TYPE_INT"
#define EO_DBG_INFO_TYPE_BOOL_STR "EO_DBG_INFO_TYPE_BOOL"
#define EO_DBG_INFO_TYPE_PTR_STR "EO_DBG_INFO_TYPE_PTR"
#define EO_DBG_INFO_TYPE_DOUBLE_STR "EO_DBG_INFO_TYPE_DOUBLE"
#define EO_DBG_INFO_TYPE_LIST_STR "EO_DBG_INFO_TYPE_LIST"
/* END - EO EET defs */
struct _connect_st
{ /* This will be used for APP, GUI client connect */
unsigned int pid;
const char *name;
};
typedef struct _connect_st connect_st;
struct _app_info_st
{ /* This will be used to register new APP in GUI client */
unsigned int pid;
char *name;
char *file; /* Valid only if was read from file in offline mode */
unsigned long long ptr; /* (void *) client ptr of app as saved by daemon */
Eina_List *view; /* Screen views pointers of (bmp_info_st *) */
unsigned int refresh_ctr; /* Counter of how many times down refresh */
};
typedef struct _app_info_st app_info_st;
struct _data_req_st
{ /* This will be used to ask for tree data by DAEMON or GUI */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr APP */
};
typedef struct _data_req_st data_req_st;
struct _tree_data_st
{ /* This will be used to send tree data to/from APP/DAEMON */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr APP */
Eina_List *tree; /* The actual (Tree_Item *) list */
};
typedef struct _tree_data_st tree_data_st;
struct _app_closed_st
{ /* This will be used to notify GUI of app closed */
unsigned long long ptr; /* (void *) client ptr APP */
};
typedef struct _app_closed_st app_closed_st;
struct _highlight_st
{ /* This will be used to highlight object in APP */
unsigned long long app; /* (void *) client ptr of APP */
unsigned long long object; /* (void *) object ptr of object to highlight */
};
typedef struct _highlight_st highlight_st;
struct _bmp_req_st
{ /* This will be used to send tree data to/from APP/DAEMON */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr APP */
unsigned long long object; /* (void *) object ptr of Evas */
unsigned int ctr; /* Reload counter to match */
};
typedef struct _bmp_req_st bmp_req_st;
struct _bmp_info_st
{ /* This will be used to send app window Bitmap */
/* We are using ULONGLONG because we send this as RAW data */
/* win, bt are NOT transferred. */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr of APP */
unsigned long long object; /* (void *) object ptr of evas */
unsigned long long ctr; /* Reload counter to match */
unsigned long long w; /* BMP width, make Evas_Coord */
unsigned long long h; /* BMP hight, make Evas_Coord */
/* All the following fields are NOT transferred in EET msg */
Evas_Object *win; /* Window of view if open */
Evas_Object *scr; /* Scroller holds view */
Evas_Object *o; /* Actuall object displays BMP */
double zoom_val; /* Current zoom value */
Evas_Object *lb_mouse; /* Label contains mouse cords */
Evas_Object *lb_rgba; /* Current mouse pos rgba val */
Evas_Object *bt; /* Button opening win */
Evas_Object *lx; /* Line on X axis */
Evas_Object *ly; /* Line on Y axis */
void *bmp; /* Bitmap BLOB, size (w * h * sizeof(int)) */
};
typedef struct _bmp_info_st bmp_info_st;
struct _shot_list_st
{ /* This will be used to write a shot list to eet file */
Eina_List *view; /* Screen views eahc is (bmp_info_st *) ptr */
};
typedef struct _shot_list_st shot_list_st;
struct _data_desc
{
Eet_Data_Descriptor *bmp_data;
Eet_Data_Descriptor *bmp_req;
Eet_Data_Descriptor *bmp_info;
Eet_Data_Descriptor *shot_list;
Eet_Data_Descriptor *connect;
Eet_Data_Descriptor *app_add;
Eet_Data_Descriptor *data_req;
Eet_Data_Descriptor *tree_data;
Eet_Data_Descriptor *app_closed;
Eet_Data_Descriptor *highlight;
Eet_Data_Descriptor *tree;
Eet_Data_Descriptor *obj_info;
};
typedef struct _data_desc data_desc;
/* START - EO - debug structs */
struct _Clouseau_st_string
{
const char *s;
};
struct _Clouseau_st_int
{
int i;
};
struct _Clouseau_st_bool
{
Eina_Bool b;
};
struct _Clouseau_st_ptr
{
unsigned long long p; /* For pointer value */
};
struct _Clouseau_st_double
{
double d;
};
struct _Clouseau_st_dbg_list
{
Eina_List *list; /* Sub-List of (Eo_Dbg_Info *) if needed */
};
/* START - EO - debug structs */
typedef struct _Clouseau_st_string Clouseau_st_string;
typedef struct _Clouseau_st_int Clouseau_st_int;
typedef struct _Clouseau_st_bool Clouseau_st_bool;
typedef struct _Clouseau_st_ptr Clouseau_st_ptr;
typedef struct _Clouseau_st_double Clouseau_st_double;
typedef struct _Clouseau_st_dbg_list Clouseau_st_dbg_list;
typedef struct _Clouseau_Eo_Dbg_Info Clouseau_Eo_Dbg_Info;
/* END - EO - debug structs */
typedef enum
{
CLOUSEAU_DBG_INFO_TYPE_STRING,
CLOUSEAU_DBG_INFO_TYPE_INT,
CLOUSEAU_DBG_INFO_TYPE_BOOL,
CLOUSEAU_DBG_INFO_TYPE_PTR,
CLOUSEAU_DBG_INFO_TYPE_DOUBLE,
CLOUSEAU_DBG_INFO_TYPE_LIST,
CLOUSEAU_DBG_INFO_TYPE_UNKNOWN
} Clouseau_Dbg_Info_Type;
struct _Clouseau_Eo_Dbg_Info
{ /* Debug info composed of a list of Eo_Dbg_Info */
const char *name;
Clouseau_Dbg_Info_Type type;
union _un_dbg_info
{
Clouseau_st_string text;
Clouseau_st_int intg;
Clouseau_st_bool bl;
Clouseau_st_ptr ptr;
Clouseau_st_double dbl;
Clouseau_st_dbg_list dbg; /* Sub-List of (Eo_Dbg_Info *) if needed */
} un_dbg_info;
};
/* END - EO - debug structs */
void clouseau_app_disconnect(void);
EAPI void clouseau_eo_info_free(Clouseau_Eo_Dbg_Info *parent);
EAPI void clouseau_tree_item_from_legacy_convert(Clouseau_Tree_Item *treeit);
EAPI Eina_List *clouseau_eo_to_legacy_convert(Eo_Dbg_Info *root);
/* Exported From Object information */
EAPI void clouseau_object_information_free(Clouseau_Object *oinfo);
EAPI Clouseau_Object * clouseau_object_information_get(Clouseau_Tree_Item *treeit);
/* Exported function */
EAPI void clouseau_data_tree_free(Eina_List *tree);
EAPI void *clouseau_data_packet_compose(const char *p_type, void *data, unsigned int *size, void *blob, int blob_size);
EAPI void *clouseau_data_packet_info_get(const char *p_type, void *data, size_t size);
EAPI void clouseau_data_object_highlight(Evas_Object *obj, Clouseau_Evas_Props *props, bmp_info_st *view);
EAPI Eina_Bool clouseau_data_eet_info_save(const char *filename, app_info_st *a, tree_data_st *ftd, Eina_List *ck_list);
EAPI Eina_Bool clouseau_data_eet_info_read(const char *filename, app_info_st **a, tree_data_st **ftd);
EAPI int clouseau_data_init(void);
EAPI int clouseau_register_descs(Ecore_Con_Eet *eet_svr);
EAPI int clouseau_data_shutdown(void);
#endif /* EET_DATA_H */

View File

@ -1,133 +0,0 @@
#ifndef _CLOUSEAU_PRIVATE2_H
#define _CLOUSEAU_PRIVATE2_H
#include <Elementary.h>
/* This header replaces the old Clouseau.h
* The contents here are not public by any means, and the name indicated as if
* they were.
* We will "whitelist" parts from here to the public header when we'll need
* it. */
#include "Clouseau.h"
#define CLOUSEAUD_READY_STR "READY"
typedef struct _Clouseau_Evas_Props Clouseau_Evas_Props;
typedef struct _Clouseau_Evas_Text_Props Clouseau_Evas_Text_Props;
typedef struct _Clouseau_Evas_Image_Props Clouseau_Evas_Image_Props;
typedef struct _Clouseau_Elm_Props Clouseau_Elm_Props;
typedef struct _Clouseau_Edje_Props Clouseau_Edje_Props;
typedef struct _Clouseau_Evas_Map_Point_Props Clouseau_Evas_Map_Point_Props;
typedef struct _Clouseau_Extra_Props Clouseau_Extra_Props;
/* The color of the highlight */
enum {
HIGHLIGHT_R = 255,
HIGHLIGHT_G = 128,
HIGHLIGHT_B = 128,
HIGHLIGHT_A = 255
};
typedef enum
{
CLOUSEAU_OBJ_TYPE_UNKNOWN,
CLOUSEAU_OBJ_TYPE_OTHER,
CLOUSEAU_OBJ_TYPE_ELM,
CLOUSEAU_OBJ_TYPE_TEXT,
CLOUSEAU_OBJ_TYPE_IMAGE,
CLOUSEAU_OBJ_TYPE_EDJE,
CLOUSEAU_OBJ_TYPE_TEXTBLOCK
} Clouseau_Object_Type;
struct _Clouseau_Evas_Map_Point_Props
{
Evas_Coord x, y, z;
};
struct _Clouseau_Evas_Props
{
const char *name;
const char *bt;
short layer;
Evas_Coord x, y, w, h;
double scale;
Evas_Coord min_w, min_h, max_w, max_h, req_w, req_h;
double align_x, align_y;
double weight_x, weight_y;
int r, g, b, a;
Eina_Bool pass_events;
Eina_Bool repeat_events;
Eina_Bool propagate_events;
Eina_Bool has_focus;
Eina_Bool is_clipper;
Eina_Bool is_visible;
Evas_Object_Pointer_Mode mode;
Clouseau_Evas_Map_Point_Props *points;
int points_count;
unsigned long long clipper;
};
struct _Clouseau_Evas_Text_Props
{
const char *font;
const char *source;
const char *text;
int size;
};
struct _Clouseau_Evas_Image_Props
{
const char *file, *key;
void *source;
const char *load_err;
};
struct _Clouseau_Evas_Textblock_Props
{
const char *style;
const char *text;
};
typedef struct _Clouseau_Evas_Textblock_Props Clouseau_Evas_Textblock_Props;
struct _Clouseau_Edje_Props
{
const char *file, *group;
const char *load_err;
};
struct _Clouseau_Elm_Props
{
const char *type;
const char *style;
double scale;
Eina_Bool has_focus;
Eina_Bool is_disabled;
Eina_Bool is_mirrored;
Eina_Bool is_mirrored_automatic;
};
struct _Clouseau_Extra_Props
{ /* as Example_Union */
Clouseau_Object_Type type;
union {
Clouseau_Elm_Props elm;
Clouseau_Evas_Text_Props text;
Clouseau_Evas_Image_Props image;
Clouseau_Edje_Props edje;
Clouseau_Evas_Textblock_Props textblock;
} u;
};
struct _Clouseau_Object
{
Clouseau_Evas_Props evas_props;
Clouseau_Extra_Props extra_props;
};
void clouseau_object_desc_shutdown(void);
/* Public */
EAPI void clouseau_object_information_list_populate(Clouseau_Tree_Item *treeit);
#endif

View File

@ -1,20 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
AM_CPPFLAGS = \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/include \
-I$(top_builddir)/src/include \
-DPACKAGE_BIN_DIR=\"$(bindir)\" \
-DPACKAGE_LIB_DIR=\"$(libdir)\" \
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
@EFL_CFLAGS@
client_modulesdir = $(libdir)/clouseau/modules/client
client_modules_LTLIBRARIES = canvas_checker.la
canvas_checker_la_SOURCES = client/canvas_checker.c
canvas_checker_la_LDFLAGS = -module -avoid-version -rdynamic
canvas_checker_la_DEPENDENCIES = $(top_builddir)/config.h
canvas_checker_la_LIBADD = @EFL_LIBS@

View File

@ -1,156 +0,0 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <Eina.h>
#include <stdio.h>
#include <Clouseau.h>
EAPI const char *clouseau_module_name = "Canvas Sanity Checker";
static Eina_Bool
_init(void)
{
return EINA_TRUE;
}
static void
_shutdown(void)
{
}
typedef struct {
Clouseau_Tree_Item *ptr;
Clouseau_Tree_Item *parent;
} Clipper_Info;
typedef struct {
Clouseau_Tree_Item *ptr;
Clouseau_Tree_Item *parent;
uint64_t clipper;
} Clippee_Info;
typedef struct {
Eina_Hash *clippers;
Eina_List *clippees;
} Context;
static void
_hash_clipper_free_cb(void *data)
{
free(data);
}
static uint64_t
_treeit_clipee_is(Clouseau_Tree_Item *treeit)
{
Eina_List *l;
Eo_Dbg_Info *eo_root, *eo;
Eina_Value_List eo_list;
clouseau_tree_item_from_legacy_convert(treeit);
eo_root = treeit->new_eo_info;
eina_value_pget(&(eo_root->value), &eo_list);
EINA_LIST_FOREACH(eo_list.list, l, eo)
{
if (!strcmp(eo->name, "Evas_Object"))
{
Eina_Value_List eo_list2;
Eina_List *l2;
eina_value_pget(&(eo->value), &eo_list2);
EINA_LIST_FOREACH(eo_list2.list, l2, eo)
{
if (!strcmp(eo->name, "Clipper"))
{
uint64_t ptr = 0;
eina_value_get(&(eo->value), &ptr);
return ptr;
}
}
return 0;
}
}
return 0;
}
static void
_treeit_clipper_clipee_recursively_add(Context *ctx, Clouseau_Tree_Item *parent)
{
Clouseau_Tree_Item *treeit;
Eina_List *l;
EINA_LIST_FOREACH(parent->children, l, treeit)
{
uint64_t ptr;
if (treeit->is_clipper)
{
Clipper_Info *info = calloc(1, sizeof(*info));
info->ptr = treeit;
info->parent = parent;
eina_hash_add(ctx->clippers, &info->ptr->ptr, info);
}
else if ((ptr = _treeit_clipee_is(treeit)))
{
Clippee_Info *info = calloc(1, sizeof(*info));
info->ptr = treeit;
info->parent = parent;
info->clipper = ptr;
ctx->clippees = eina_list_append(ctx->clippees, info);
}
_treeit_clipper_clipee_recursively_add(ctx, treeit);
}
}
EAPI void
clouseau_client_module_run(Eina_List *tree)
{
Context ctx;
ctx.clippers = eina_hash_int64_new(_hash_clipper_free_cb);
ctx.clippees = NULL;
/* Gather the information from the tree. */
Clouseau_Tree_Item *treeit;
Eina_List *l;
EINA_LIST_FOREACH(tree, l, treeit)
{
_treeit_clipper_clipee_recursively_add(&ctx, treeit);
}
/* Analyze the information. */
Clippee_Info *info;
EINA_LIST_FOREACH(ctx.clippees, l, info)
{
Clipper_Info *clipper = eina_hash_find(ctx.clippers, &info->clipper);
if (!clipper)
{
printf("Error! Object: %llx. Can't find clipper '%llx'\n", (unsigned long long) info->ptr->ptr, (unsigned long long) info->clipper);
}
else if (clipper->parent != info->parent)
{
printf("Error! Object's (%llx) parent (%llx) != Clipper's (%llx) parent (%llx)\n", info->ptr->ptr, info->parent->ptr, clipper->ptr->ptr, clipper->parent->ptr);
}
}
printf("Finished running '%s'\n", clouseau_module_name);
/* Clear the data. */
{
void *data;
eina_hash_free(ctx.clippers);
EINA_LIST_FREE(ctx.clippees, data)
free(data);
}
}
EINA_MODULE_INIT(_init);
EINA_MODULE_SHUTDOWN(_shutdown);

View File

@ -1,11 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
clouseau_start: clouseau_start.in
$(AM_V_GEN) $(SED) -e "s|\@libdir\@|$(libdir)|" $(srcdir)/clouseau_start.in > $(builddir)/clouseau_start
bin_SCRIPTS = clouseau clouseau_start
CLEAN_FILES = clouseau_start
# FIXME: I'm not even sure .in files should be included here.
EXTRA_DIST = clouseau_start.in

View File

@ -1,8 +0,0 @@
#!/bin/sh
clouseau_client &
if [ $# -gt 0 ]
then
# Start clouseau daemon (will start single instance), then run app
clouseau_start "$@"
fi

View File

@ -1,7 +0,0 @@
#!/bin/sh
if [ $# -lt 1 ]
then
echo "Usage: clouseau_start <executable> [executable parameters]"
else
LD_PRELOAD="@libdir@/clouseau/libclouseau_preload.so" "$@"
fi