Browse Source

First patch for the Clouseau rewriting

- Removal of all old code
- Create the new directories tree
- Move to cmake
- Connection to daemon
devs/jackdanielz/clouseau2
Daniel Zaoui 5 years ago
parent
commit
03423ff979
  1. 1
      .gitignore
  2. 1
      AUTHORS
  3. 18
      CMakeLists.txt
  4. 25
      COPYING
  5. 1
      COPYING.icons
  6. 0
      ChangeLog
  7. 13
      Makefile.am
  8. 0
      NEWS
  9. 19
      README
  10. 18
      TODO
  11. 14
      autogen.sh
  12. 10
      clouseau.pc.in
  13. 40
      cmake/Modules/FindFfi.cmake
  14. 120
      configure.ac
  15. 2
      data/Makefile.am
  16. 12
      data/images/Makefile.am
  17. BIN
      data/images/background.png
  18. BIN
      data/images/clipper.png
  19. BIN
      data/images/hidden.png
  20. BIN
      data/images/screenshot-missing.png
  21. BIN
      data/images/take-screenshot.png
  22. 11
      data/units/Makefile.am
  23. 10
      data/units/clouseaud.service
  24. 8
      data/units/clouseaud.socket
  25. 0
      m4/A
  26. 56
      m4/efl_attribute.m4
  27. 5
      m4/efl_beta.m4
  28. 14
      m4/pkg_var.m4
  29. 4
      make.sh
  30. 4
      src/Makefile.am
  31. 43
      src/bin/CMakeLists.txt
  32. 21
      src/bin/Makefile.am
  33. 147
      src/bin/client/cfg.c
  34. 25
      src/bin/client/cfg.h
  35. 93
      src/bin/client/config_dialog.c
  36. 8
      src/bin/client/config_dialog.h
  37. 3135
      src/bin/clouseau_client.c
  38. 459
      src/bin/clouseaud.c
  39. 595
      src/bin/gui
  40. 400
      src/bin/gui.c
  41. 56
      src/bin/gui.h
  42. 56
      src/lib/Clouseau.h
  43. 120
      src/lib/Clouseau_Debug.h
  44. 42
      src/lib/Makefile.am
  45. 56
      src/lib/clouseau.c
  46. 505
      src/lib/clouseau_app.c
  47. 814
      src/lib/clouseau_data.c
  48. 295
      src/lib/clouseau_data_legacy.c
  49. 10
      src/lib/clouseau_data_legacy.h
  50. 373
      src/lib/clouseau_object_information.c
  51. 148
      src/lib/clouseau_preload.c
  52. 241
      src/lib/clouseau_private.h
  53. 133
      src/lib/clouseau_private2.h
  54. 20
      src/modules/Makefile.am
  55. 156
      src/modules/client/canvas_checker.c
  56. 11
      src/scripts/Makefile.am
  57. 8
      src/scripts/clouseau
  58. 7
      src/scripts/clouseau_start.in

1
.gitignore vendored

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

1
AUTHORS

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

18
CMakeLists.txt

@ -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

@ -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.

1
COPYING.icons

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

13
Makefile.am

@ -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

19
README

@ -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

@ -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?

14
autogen.sh

@ -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

10
clouseau.pc.in

@ -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@

40
cmake/Modules/FindFfi.cmake

@ -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)

120
configure.ac

@ -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

2
data/Makefile.am

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

12
data/images/Makefile.am

@ -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)

BIN
data/images/background.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

BIN
data/images/clipper.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

BIN
data/images/hidden.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

BIN
data/images/screenshot-missing.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

BIN
data/images/take-screenshot.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

11
data/units/Makefile.am

@ -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)

10
data/units/clouseaud.service

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

8
data/units/clouseaud.socket

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

56
m4/efl_attribute.m4

@ -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

5
m4/efl_beta.m4

@ -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])
])

14
m4/pkg_var.m4

@ -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

4
make.sh

@ -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`

4
src/Makefile.am

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

43
src/bin/CMakeLists.txt

@ -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)

21
src/bin/Makefile.am

@ -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@

147
src/bin/client/cfg.c

@ -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;
}

25
src/bin/client/cfg.h

@ -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

93
src/bin/client/config_dialog.c

@ -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);
}

8
src/bin/client/config_dialog.h

@ -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

3135
src/bin/clouseau_client.c

File diff suppressed because it is too large Load Diff

459
src/bin/clouseaud.c

@ -1,459 +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)
{
int ret = 0;
/* 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);
ret = 3;
goto shutdown_and_exit;
}
if (!(server = ecore_con_server_add(ECORE_CON_REMOTE_TCP | ECORE_CON_SOCKET_ACTIVATE,
LISTEN_IP, PORT, NULL)))
{
ret = 1;
goto shutdown_and_exit;
}
eet_svr = ecore_con_eet_server_new(server);
if (!eet_svr)
{
ret = 2;
goto shutdown_and_exit;
}
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();
shutdown_and_exit:
clouseau_data_shutdown();
ecore_con_shutdown();
ecore_shutdown();
eina_shutdown();
return ret;
}

595
src/bin/gui

@ -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":