Merge branch 'master' into devs/hermet/lottie

This commit is contained in:
Hermet Park 2020-03-13 10:26:14 +09:00
commit b932fe8430
55 changed files with 1078 additions and 864 deletions

View File

@ -666,7 +666,8 @@ EXCLUDE_PATTERNS = *_private* \
*/efl_*.eo.c \
*/efl_*.eo.h \
*/efl_*.eot.h \
*/Efl_*
*/Efl_* \
*/Eo.h
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the

View File

@ -120,11 +120,11 @@
*
* @section create_class_h_side How to create a class - H side?
* - If the object is new, establish the public APIs
* - #define \$(CLASS_NAME) \$(class_name)_class_get(): will be used to access data/inherit from this class...
* - \#define \$(CLASS_NAME) \$(class_name)_class_get(): will be used to access data/inherit from this class...
* - const Eo_Class *\$(class_name)_class_get(void) EINA_CONST: declaration of the function that will create the class (not the instance), i.e virtual table...
* - extern EAPI Eo_Op \$(CLASS_NAME)_BASE_ID: class id that will be essentially used to identify functions set of this class
* - enum of the function ids of the class in the form \$(CLASS_NAME)_SUB_ID: used to identify the function inside the class; function id is unique per class but (class id, function id) is unique per system..
* - #define \$(CLASS_NAME)_ID(sub_id) (\$(CLASS_NAME)_BASE_ID + sub_id): formula to calculate the system function id
* - \#define \$(CLASS_NAME)_ID(sub_id) (\$(CLASS_NAME)_BASE_ID + sub_id): formula to calculate the system function id
* - define of each function consists of:
* - the name of the function that will be used in eo_do
* - parameters without types

View File

@ -331,7 +331,7 @@ subprojects = [
['ethumb' ,[] , true, true, true, false, false, false, ['eina', 'efl', 'eo'], []],
['ethumb_client' ,[] , false, true, true, false, false, true, ['eina', 'efl', 'eo', 'ethumb'], []],
['elementary' ,[] , true, true, true, true, true, true, ['eina', 'efl', 'eo', 'eet', 'evas', 'ecore', 'ecore-evas', 'ecore-file', 'ecore-input', 'edje', 'ethumb-client', 'emotion', 'ecore-imf', 'ecore-con', 'eldbus', 'efreet', 'efreet-mime', 'efreet-trash', 'eio'], ['atspi']],
['efl_wl' ,['wl'] , false, true, true, false, false, false, ['evas', 'ecore'], []],
['efl_canvas_wl' ,['wl'] , false, true, true, false, false, false, ['eina', 'efl', 'eo', 'evas', 'ecore'], []],
['elua' ,['elua'] , false, true, true, false, true, false, ['eina', 'luajit'], []],
['ecore_wayland' ,['wl-deprecated'] , false, true, false, false, false, false, ['eina'], []],
['ecore_drm' ,['drm-deprecated'] , false, true, false, false, false, false, ['eina'], []],

View File

@ -4562,7 +4562,7 @@ st_collections_group_name(void)
This property can be inherited.
Defaults: 0
@warning Your edc file should always wrap this keyword with #ifdef HAVE_SKIP_NAMESPACE_VALIDATION
@warning Your edc file should always wrap this keyword with <tt>\#ifdef HAVE_SKIP_NAMESPACE_VALIDATION</tt>
@since 1.21
@endproperty
*/

View File

@ -744,7 +744,8 @@ check_program(Edje_Part_Collection *pc, Edje_Program *ep, Eet_File *ef)
if (et->id >= (int) pc->parts_count)
{
ERR("Target id '%d' greater than possible index '%d'.", et->id, (int) pc->parts_count - 1);
ERR("In group '%s' program '%s', target id '%d' greater than possible index '%d'.",
pc->part ? pc->part : "", ep->name ? ep->name : "", et->id, (int) pc->parts_count - 1);
exit(-1);
}

View File

@ -30,6 +30,7 @@
#define EDJE_1_21_SUPPORTED " -DEFL_VERSION_1_21=1 "
#define EDJE_1_22_SUPPORTED " -DEFL_VERSION_1_22=1 "
#define EDJE_1_23_SUPPORTED " -DEFL_VERSION_1_23=1 "
#define EDJE_1_24_SUPPORTED " -DEFL_VERSION_1_24=1 "
#define EDJE_CC_EFL_VERSION_SUPPORTED \
EDJE_1_18_SUPPORTED \
@ -37,7 +38,8 @@
EDJE_1_20_SUPPORTED \
EDJE_1_21_SUPPORTED \
EDJE_1_22_SUPPORTED \
EDJE_1_23_SUPPORTED
EDJE_1_23_SUPPORTED \
EDJE_1_24_SUPPORTED
static void new_object(void);
static void new_statement(void);

View File

@ -1,18 +1,17 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "Efl_Wl.h"
#include "Efl_Canvas_Wl.h"
#include "Elementary.h"
static Evas_Object *win;
static Eina_Strbuf *buf;
static Ecore_Exe *exe;
static Eo *exe;
static Eina_Bool
del_handler(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Exe_Event_Del *ev)
static void
del_handler(void *d EINA_UNUSED, const Efl_Event *ev)
{
if (ev->exe == exe) ecore_main_loop_quit();
return ECORE_CALLBACK_RENEW;
if (ev->object == exe) ecore_main_loop_quit();
}
static void
@ -24,8 +23,8 @@ focus_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev
static Eina_Bool
dostuff(void *data)
{
exe = efl_wl_run(data, eina_strbuf_string_get(buf));
ecore_event_handler_add(ECORE_EXE_EVENT_DEL, (Ecore_Event_Handler_Cb)del_handler, NULL);
exe = efl_canvas_wl_run(data, eina_strbuf_string_get(buf));
efl_event_callback_add(exe, EFL_TASK_EVENT_EXIT, del_handler, NULL);
evas_object_focus_set(data, 1);
return EINA_FALSE;
}
@ -63,9 +62,9 @@ main(int argc, char *argv[])
elm_win_autodel_set(win, 1);
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
o = efl_wl_add(evas_object_evas_get(win));
efl_wl_aspect_set(o, 1);
efl_wl_minmax_set(o, 1);
o = efl_add(EFL_CANVAS_WL_CLASS, win);
efl_canvas_wl_aspect_set(o, 1);
efl_canvas_wl_minmax_set(o, 1);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS, hints_changed, win);

View File

@ -1,7 +1,7 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "Efl_Wl.h"
#include "Efl_Canvas_Wl.h"
#include "Elementary.h"
static Evas_Object *win;
@ -18,7 +18,7 @@ static unsigned int n;
static Eina_Bool
dostuff(void *data)
{
efl_wl_run(data, cmds[n++]);
efl_canvas_wl_run(data, cmds[n++]);
evas_object_focus_set(data, 1);
return n != num_cmds;
}
@ -26,13 +26,13 @@ dostuff(void *data)
static void
prev_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
efl_wl_prev(data);
efl_canvas_wl_surface_prev(data);
}
static void
next_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
efl_wl_next(data);
efl_canvas_wl_surface_next(data);
}
int
@ -69,7 +69,7 @@ main(int argc, char *argv[])
evas_object_show(next);
elm_table_pack(o, next, 1, 0, 1, 1);
comp = efl_wl_add(evas_object_evas_get(win));
comp = efl_add(EFL_CANVAS_WL_CLASS, win);
evas_object_size_hint_min_set(comp, 640, 480);
elm_table_pack(o, comp, 0, 1, 2, 1);
evas_object_size_hint_align_set(comp, EVAS_HINT_FILL, EVAS_HINT_FILL);

View File

@ -0,0 +1,13 @@
executable('efl_canvas_wl_test',
'efl_canvas_wl_test.c',
include_directories : config_dir,
dependencies: [efl_canvas_wl, efl_canvas_wl_deps, efl_canvas_wl_pub_deps, elementary],
install: true,
)
executable('efl_canvas_wl_test_stack',
'efl_canvas_wl_test_stack.c',
include_directories : config_dir,
dependencies: [efl_canvas_wl, efl_canvas_wl_deps, efl_canvas_wl_pub_deps, elementary],
install: true,
)

View File

@ -1,13 +0,0 @@
executable('efl_wl_test',
'efl_wl_test.c',
include_directories : config_dir,
dependencies: [efl_wl, elementary],
install: true,
)
executable('efl_wl_test_stack',
'efl_wl_test_stack.c',
include_directories : config_dir,
dependencies: [efl_wl, elementary],
install: true,
)

View File

@ -0,0 +1,14 @@
#include "common.h"
static int _verbose = 0;
void
ex_printf(int verbose, const char *fmt, ...)
{
va_list ap;
if (!_verbose || verbose > _verbose) return;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}

100
src/bin/exactness/common.h Normal file
View File

@ -0,0 +1,100 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <Elementary.h>
#include <Exactness.h>
#include <exactness_private.h>
typedef struct
{
Eina_Debug_Session *session;
int srcid;
void *buffer;
unsigned int size;
} _Main_Loop_Info;
#define WRAPPER_TO_XFER_MAIN_LOOP(foo) \
static void \
_intern_main_loop ## foo(void *data) \
{ \
_Main_Loop_Info *info = data; \
_main_loop ## foo(info->session, info->srcid, info->buffer, info->size); \
free(info->buffer); \
free(info); \
} \
static Eina_Bool \
foo(Eina_Debug_Session *session, int srcid, void *buffer, int size) \
{ \
_Main_Loop_Info *info = calloc(1, sizeof(*info)); \
info->session = session; \
info->srcid = srcid; \
info->size = size; \
if (info->size) \
{ \
info->buffer = malloc(info->size); \
memcpy(info->buffer, buffer, info->size); \
} \
ecore_main_loop_thread_safe_call_async(_intern_main_loop ## foo, info); \
return EINA_TRUE; \
}
#ifndef WORDS_BIGENDIAN
#define SWAP_64(x) x
#define SWAP_32(x) x
#define SWAP_16(x) x
#define SWAP_DBL(x) x
#else
#define SWAP_64(x) eina_swap64(x)
#define SWAP_32(x) eina_swap32(x)
#define SWAP_16(x) eina_swap16(x)
#define SWAP_DBL(x) SWAP_64(x)
#endif
#define EXTRACT_INT(_buf) \
({ \
int __i; \
memcpy(&__i, _buf, sizeof(int)); \
_buf += sizeof(int); \
SWAP_32(__i); \
})
#define EXTRACT_DOUBLE(_buf) \
({ \
double __d; \
memcpy(&__d, _buf, sizeof(double)); \
_buf += sizeof(double); \
SWAP_DBL(__d); \
})
#define EXTRACT_STRING(_buf) \
({ \
char *__s = _buf ? strdup(_buf) : NULL; \
int __len = (__s ? strlen(__s) : 0) + 1; \
_buf += __len; \
__s; \
})
#define STORE_INT(_buf, __i) \
({ \
int __si = SWAP_32(__i); \
memcpy(_buf, &__si, sizeof(int)); \
_buf += sizeof(int); \
})
#define STORE_DOUBLE(_buf, __d) \
{ \
double __d2 = SWAP_DBL(__d); \
memcpy(_buf, &__d2, sizeof(double)); \
_buf += sizeof(double); \
}
#define STORE_STRING(_buf, __s) \
{ \
int __len = (__s ? strlen(__s) : 0) + 1; \
if (__s) memcpy(_buf, __s, __len); \
else *_buf = '\0'; \
_buf += __len; \
}
void ex_printf(int verbose, const char *fmt, ...);

View File

@ -8,6 +8,7 @@
#include <Ecore_File.h>
#include "exactness_private.h"
#include "common.h"
#ifdef _WIN32
# include <evil_private.h> /* mkdir */
@ -18,8 +19,6 @@
#define ORIG_SUBDIR "orig"
#define CURRENT_SUBDIR "current"
#define EXACTNESS_PATH_MAX 1024
#define BUF_SIZE 1024
typedef struct
@ -52,17 +51,6 @@ static Eina_List *_compare_errors;
static Eina_Bool _job_consume();
static void
_printf(int verbose, const char *fmt, ...)
{
va_list ap;
if (!_verbose || verbose > _verbose) return;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
static Exactness_Image *
_image_load(const char *filename)
{
@ -154,7 +142,7 @@ _exu_imgs_unpack(const char *exu_path, const char *dir, const char *ent_name)
{
Eo *o = evas_object_image_add(e);
char *filename = alloca(strlen(dir) + strlen(ent_name) + 20);
snprintf(filename, EXACTNESS_PATH_MAX, "%s/%s%c%.3d.png",
snprintf(filename, PATH_MAX, "%s/%s%c%.3d.png",
dir, ent_name, SHOT_DELIMITER, n++);
evas_object_image_size_set(o, img->w, img->h);
evas_object_image_data_set(o, img->pixels);
@ -171,7 +159,7 @@ _exu_imgs_unpack(const char *exu_path, const char *dir, const char *ent_name)
static void
_run_test_compare(const List_Entry *ent)
{
char *path = alloca(EXACTNESS_PATH_MAX);
char *path = alloca(PATH_MAX);
char *origdir = alloca(strlen(_dest_dir) + 20);
const char *base_dir;
Eina_List *itr;
@ -228,7 +216,7 @@ found:
static Eina_Bool
_run_command_prepare(const List_Entry *ent, char *buf)
{
char scn_path[EXACTNESS_PATH_MAX];
char scn_path[PATH_MAX];
Eina_Strbuf *sbuf;
const char *base_dir;
Eina_List *itr;
@ -283,7 +271,7 @@ ok:
}
strncpy(buf, eina_strbuf_string_get(sbuf), SCHEDULER_CMD_SIZE-1);
eina_strbuf_free(sbuf);
_printf(1, "Command: %s\n", buf);
ex_printf(1, "Command: %s\n", buf);
return EINA_TRUE;
}
@ -474,7 +462,7 @@ main(int argc, char *argv[])
const char *list_file;
Eina_List *itr;
const char *base_dir;
char tmp[EXACTNESS_PATH_MAX];
char tmp[PATH_MAX];
Eina_Bool mode_play = EINA_FALSE, mode_init = EINA_FALSE, mode_simulation = EINA_FALSE;
Eina_Bool want_quit = EINA_FALSE, scan_objs = EINA_FALSE;
Ecore_Getopt_Value values[] = {
@ -558,8 +546,8 @@ main(int argc, char *argv[])
if (mode_play)
{
_mode = RUN_PLAY;
if (snprintf(tmp, EXACTNESS_PATH_MAX, "%s/%s", _dest_dir, CURRENT_SUBDIR)
>= EXACTNESS_PATH_MAX)
if (snprintf(tmp, PATH_MAX, "%s/%s", _dest_dir, CURRENT_SUBDIR)
>= PATH_MAX)
{
fprintf(stderr, "Path too long: %s", tmp);
ret = 1;
@ -575,8 +563,8 @@ main(int argc, char *argv[])
else if (mode_init)
{
_mode = RUN_INIT;
if (snprintf(tmp, EXACTNESS_PATH_MAX, "%s/%s", _dest_dir, ORIG_SUBDIR)
>= EXACTNESS_PATH_MAX)
if (snprintf(tmp, PATH_MAX, "%s/%s", _dest_dir, ORIG_SUBDIR)
>= PATH_MAX)
{
fprintf(stderr, "Path too long: %s", tmp);
ret = 1;
@ -624,9 +612,9 @@ main(int argc, char *argv[])
if (_errors || _compare_errors)
{
FILE *report_file;
char report_filename[EXACTNESS_PATH_MAX] = "";
char report_filename[PATH_MAX] = "";
/* Generate the filename. */
snprintf(report_filename, EXACTNESS_PATH_MAX,
snprintf(report_filename, PATH_MAX,
"%s/%s/errors.html",
_dest_dir, mode_init ? ORIG_SUBDIR : CURRENT_SUBDIR);
report_file = fopen(report_filename, "w+");
@ -660,8 +648,8 @@ main(int argc, char *argv[])
EINA_LIST_FREE(_compare_errors, test_name)
{
Eina_Bool is_from_exu;
char origpath[EXACTNESS_PATH_MAX];
snprintf(origpath, EXACTNESS_PATH_MAX, "%s/%s/orig/%s",
char origpath[PATH_MAX];
snprintf(origpath, PATH_MAX, "%s/%s/orig/%s",
_dest_dir, CURRENT_SUBDIR, test_name);
is_from_exu = ecore_file_exists(origpath);
printf("\t* %s\n", test_name);

View File

@ -14,81 +14,7 @@
#include <Elementary.h>
#include <Exactness.h>
typedef struct
{
Eina_Debug_Session *session;
int srcid;
void *buffer;
unsigned int size;
} _Main_Loop_Info;
#define WRAPPER_TO_XFER_MAIN_LOOP(foo) \
static void \
_intern_main_loop ## foo(void *data) \
{ \
_Main_Loop_Info *info = data; \
_main_loop ## foo(info->session, info->srcid, info->buffer, info->size); \
free(info->buffer); \
free(info); \
} \
static Eina_Bool \
foo(Eina_Debug_Session *session, int srcid, void *buffer, int size) \
{ \
_Main_Loop_Info *info = calloc(1, sizeof(*info)); \
info->session = session; \
info->srcid = srcid; \
info->size = size; \
if (info->size) \
{ \
info->buffer = malloc(info->size); \
memcpy(info->buffer, buffer, info->size); \
} \
ecore_main_loop_thread_safe_call_async(_intern_main_loop ## foo, info); \
return EINA_TRUE; \
}
#ifndef WORDS_BIGENDIAN
#define SWAP_64(x) x
#define SWAP_32(x) x
#define SWAP_16(x) x
#define SWAP_DBL(x) x
#else
#define SWAP_64(x) eina_swap64(x)
#define SWAP_32(x) eina_swap32(x)
#define SWAP_16(x) eina_swap16(x)
#define SWAP_DBL(x) SWAP_64(x)
#endif
#define EXTRACT_INT(_buf) \
({ \
int __i; \
memcpy(&__i, _buf, sizeof(int)); \
_buf += sizeof(int); \
SWAP_32(__i); \
})
#define STORE_INT(_buf, __i) \
{ \
int __i2 = SWAP_32(__i); \
memcpy(_buf, &__i2, sizeof(int)); \
_buf += sizeof(int); \
}
#define STORE_DOUBLE(_buf, __d) \
{ \
double __d2 = SWAP_DBL(__d); \
memcpy(_buf, &__d2, sizeof(double)); \
_buf += sizeof(double); \
}
#define STORE_STRING(_buf, __s) \
{ \
int __len = (__s ? strlen(__s) : 0) + 1; \
if (__s) memcpy(_buf, __s, __len); \
else *_buf = '\0'; \
_buf += __len; \
}
#include "common.h"
static Eina_Stringshare *_src_filename = NULL;
static Exactness_Unit *_src_unit = NULL;
@ -134,17 +60,6 @@ EINA_DEBUG_OPCODES_ARRAY_DEFINE(_debug_ops,
{NULL, NULL, NULL}
);
static void
_printf(int verbose, const char *fmt, ...)
{
va_list ap;
if (!_verbose || verbose > _verbose) return;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
static void
_feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
{
@ -152,15 +67,15 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
{
case EXACTNESS_ACTION_MOUSE_IN:
{
_printf(1, "Mouse in\n");
_printf(2, "%s evas_event_feed_mouse_in n_evas=<%d>\n", __func__, n_evas);
ex_printf(1, "Mouse in\n");
ex_printf(2, "%s evas_event_feed_mouse_in n_evas=<%d>\n", __func__, n_evas);
eina_debug_session_send(_session, _cid, _mouse_in_op, &n_evas, sizeof(int));
break;
}
case EXACTNESS_ACTION_MOUSE_OUT:
{
_printf(1, "Mouse out\n");
_printf(2, "%s evas_event_feed_mouse_out n_evas=<%d>\n", __func__, n_evas);
ex_printf(1, "Mouse out\n");
ex_printf(2, "%s evas_event_feed_mouse_out n_evas=<%d>\n", __func__, n_evas);
eina_debug_session_send(_session, _cid, _mouse_out_op, &n_evas, sizeof(int));
break;
}
@ -169,8 +84,8 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
Exactness_Action_Mouse_Wheel *t = data;
int len = 3*sizeof(int);
char *buf = malloc(len), *tmp = buf;
_printf(1, "Mouse wheel\n");
_printf(2, "%s evas_event_feed_mouse_wheel n_evas=<%d>\n", __func__, n_evas);
ex_printf(1, "Mouse wheel\n");
ex_printf(2, "%s evas_event_feed_mouse_wheel n_evas=<%d>\n", __func__, n_evas);
STORE_INT(tmp, n_evas);
STORE_INT(tmp, t->direction);
STORE_INT(tmp, t->z);
@ -184,7 +99,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
Exactness_Action_Multi_Event *t = data;
int len = 5*sizeof(int)+7*sizeof(double)+sizeof(int);
char *buf = malloc(len), *tmp = buf;
_printf(2, "%s %s n_evas=<%d>\n", __func__,
ex_printf(2, "%s %s n_evas=<%d>\n", __func__,
type == EXACTNESS_ACTION_MULTI_DOWN ? "evas_event_feed_multi_down" :
"evas_event_feed_multi_up", n_evas);
STORE_INT(tmp, n_evas);
@ -211,7 +126,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
Exactness_Action_Multi_Move *t = data;
int len = 4*sizeof(int)+7*sizeof(double);
char *buf = malloc(len), *tmp = buf;
_printf(2, "%s evas_event_feed_multi_move n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s evas_event_feed_multi_move n_evas=<%d>\n", __func__, n_evas);
STORE_INT(tmp, n_evas);
STORE_INT(tmp, t->d);
STORE_INT(tmp, t->x);
@ -237,7 +152,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
len += t->string ? strlen(t->string) : 0;
len += t->compose ? strlen(t->compose) : 0;
char *buf = malloc(len), *tmp = buf;
_printf(2, "%s %s n_evas=<%d>\n", __func__,
ex_printf(2, "%s %s n_evas=<%d>\n", __func__,
type == EXACTNESS_ACTION_KEY_DOWN ? "evas_event_feed_key_down " :
"evas_event_feed_key_up", n_evas);
STORE_INT(tmp, n_evas);
@ -254,7 +169,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
}
case EXACTNESS_ACTION_TAKE_SHOT:
{
_printf(2, "%s take shot n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s take shot n_evas=<%d>\n", __func__, n_evas);
eina_debug_session_send(_session, _cid, _take_shot_op, &n_evas, sizeof(int));
break;
}
@ -265,7 +180,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
len += t->wdg_name ? strlen(t->wdg_name) : 0;
len += t->event_name ? strlen(t->event_name) : 0;
char *buf = malloc(len), *tmp = buf;
_printf(2, "%s %s\n", __func__, "EFL event");
ex_printf(2, "%s %s\n", __func__, "EFL event");
STORE_STRING(tmp, t->wdg_name);
STORE_STRING(tmp, t->event_name);
eina_debug_session_send(_session, _cid, _efl_event_op, buf, len);
@ -278,7 +193,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
int len = 0;
len += t->wdg_name ? strlen(t->wdg_name) : 0;
char *buf = malloc(len), *tmp = buf;
_printf(2, "%s %s\n", __func__, "Click On");
ex_printf(2, "%s %s\n", __func__, "Click On");
STORE_STRING(tmp, t->wdg_name);
eina_debug_session_send(_session, _cid, _click_on_op, buf, len);
free(buf);
@ -286,7 +201,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
}
case EXACTNESS_ACTION_STABILIZE:
{
_printf(2, "%s stabilize\n", __func__);
ex_printf(2, "%s stabilize\n", __func__);
eina_debug_session_send(_session, _cid, _stabilize_op, NULL, 0);
break;
}
@ -321,7 +236,7 @@ _src_open()
{
double diff_time = 0; /* Time to wait before feeding the first event */
_printf(2, "<%s> Source file is <%s>\n", __func__, _src_filename);
ex_printf(2, "<%s> Source file is <%s>\n", __func__, _src_filename);
if (!strcmp(_src_filename + strlen(_src_filename) - 4,".exu"))
{
_src_unit = exactness_unit_file_read(_src_filename);
@ -336,7 +251,7 @@ _src_open()
if (act->delay_ms)
{
_printf(2, " Waiting <%f>\n", diff_time);
ex_printf(2, " Waiting <%f>\n", diff_time);
ecore_timer_add(act->delay_ms / 1000.0, _feed_event_timer_cb, NULL);
}
else

View File

@ -9,6 +9,8 @@
#include <Exactness.h>
#include <Efl_Ui.h>
#include "common.h"
#define LDIFF(x) "<b><color=#F0F>"#x"</color></b>"
#define RDIFF(x) "<b><color=#0FF>"#x"</color></b>"

View File

@ -1,18 +1,21 @@
exactness_bin = executable('exactness',
[ 'exactness.c' ],
dependencies: [ ecore, ecore_evas, ecore_file, exactness ],
[ 'exactness.c', 'common.c', 'common.h' ],
dependencies: [ ecore, ecore_evas, ecore_file, elementary, exactness ],
c_args: '-DDATA_DIR="'+join_paths(dir_data, 'exactness')+'"',
install: true,
)
exactness_inject_bin = executable('exactness_inject',
[ 'injector.c' ],
[ 'injector.c', 'common.c', 'common.h' ],
dependencies: [ elementary, exactness ],
c_args: '-DDATA_DIR="'+join_paths(dir_data, 'exactness')+'"',
install: true,
)
exactness_inspect_bin = executable('exactness_inspect',
[ 'inspect.c' ],
[ 'inspect.c', 'common.c', 'common.h' ],
dependencies: [ elementary, exactness ],
c_args: '-DDATA_DIR="'+join_paths(dir_data, 'exactness')+'"',
install: true,
)
@ -28,15 +31,16 @@ edjs = custom_target('player_entry',
depends : edje_depends)
exactness_play_bin = executable('exactness_play',
[ 'player.c', edjs ],
[ 'player.c', 'common.c', 'common.h', edjs ],
dependencies: [ elementary, exactness ],
c_args: '-DDATA_DIR="'+join_paths(dir_data, 'exactness')+'"',
install: true,
)
exactness_record_bin = executable('exactness_record',
[ 'recorder.c' ],
[ 'recorder.c', 'common.c', 'common.h' ],
dependencies: [ elementary, exactness ],
c_args: '-DDATA_DIR="'+join_paths(dir_data, 'exactness')+'"',
install: true,
)

View File

@ -30,88 +30,12 @@
#include <Exactness.h>
#include "exactness_private.h"
#include "common.h"
#define PATH_ 1024
#define CMD_LINE_MAX 256
#define IMAGE_FILENAME_EXT ".png"
#define PAUSE_KEY_STR "F2"
typedef struct
{
Eina_Debug_Session *session;
int srcid;
void *buffer;
unsigned int size;
} _Main_Loop_Info;
#define WRAPPER_TO_XFER_MAIN_LOOP(foo) \
static void \
_intern_main_loop ## foo(void *data) \
{ \
_Main_Loop_Info *info = data; \
_main_loop ## foo(info->session, info->srcid, info->buffer, info->size); \
free(info->buffer); \
free(info); \
} \
static Eina_Bool \
foo(Eina_Debug_Session *session, int srcid, void *buffer, int size) \
{ \
_Main_Loop_Info *info = calloc(1, sizeof(*info)); \
info->session = session; \
info->srcid = srcid; \
info->size = size; \
if (info->size) \
{ \
info->buffer = malloc(info->size); \
memcpy(info->buffer, buffer, info->size); \
} \
ecore_main_loop_thread_safe_call_async(_intern_main_loop ## foo, info); \
return EINA_TRUE; \
}
#ifndef WORDS_BIGENDIAN
#define SWAP_64(x) x
#define SWAP_32(x) x
#define SWAP_16(x) x
#define SWAP_DBL(x) x
#else
#define SWAP_64(x) eina_swap64(x)
#define SWAP_32(x) eina_swap32(x)
#define SWAP_16(x) eina_swap16(x)
#define SWAP_DBL(x) SWAP_64(x)
#endif
#define EXTRACT_INT(_buf) \
({ \
int __i; \
memcpy(&__i, _buf, sizeof(int)); \
_buf += sizeof(int); \
SWAP_32(__i); \
})
#define EXTRACT_DOUBLE(_buf) \
({ \
double __d; \
memcpy(&__d, _buf, sizeof(double)); \
_buf += sizeof(double); \
SWAP_DBL(__d); \
})
#define EXTRACT_STRING(_buf) \
({ \
char *__s = _buf ? strdup(_buf) : NULL; \
int __len = (__s ? strlen(__s) : 0) + 1; \
_buf += __len; \
__s; \
})
#define STORE_INT(_buf, __i) \
({ \
int __si = SWAP_32(__i); \
memcpy(_buf, &__si, sizeof(int)); \
_buf += sizeof(int); \
})
typedef enum
{
FTYPE_UNKNOWN,
@ -152,17 +76,6 @@ static Eina_Bool _exit_required = EINA_FALSE;
static Eina_Bool _pause_request = EINA_FALSE;
static Eina_Bool _playing_status = EINA_FALSE;
static void
_printf(int verbose, const char *fmt, ...)
{
va_list ap;
if (!_verbose || verbose > _verbose) return;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
static Exactness_Image *
_snapshot_shot_get(Evas *e)
{
@ -226,7 +139,7 @@ _evas_render_post_cb(void *data EINA_UNUSED, const Efl_Event *event)
Eo *o = evas_object_image_add(event->object);
evas_object_image_size_set(o, ex_shot->w, ex_shot->h);
evas_object_image_data_set(o, ex_shot->pixels);
_printf(1, "Shot taken (%s).\n", filename);
ex_printf(1, "Shot taken (%s).\n", filename);
if (!evas_object_image_save(o, filename, NULL, NULL))
{
printf("Cannot save widget to <%s>\n", filename);
@ -238,7 +151,7 @@ _evas_render_post_cb(void *data EINA_UNUSED, const Efl_Event *event)
Exactness_Image *ex_img = e_data;
memcpy(ex_img, ex_shot, sizeof(Exactness_Image));
ex_shot->pixels = NULL;
_printf(1, "Shot taken (in %s).\n", _dest);
ex_printf(1, "Shot taken (in %s).\n", _dest);
}
else if (_dest_type == FTYPE_REMOTE)
{
@ -369,23 +282,23 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
{
case EXACTNESS_ACTION_MOUSE_IN:
{
_printf(1, "Mouse in\n");
_printf(2, "%s evas_event_feed_mouse_in n_evas=<%d>\n", __func__, n_evas);
ex_printf(1, "Mouse in\n");
ex_printf(2, "%s evas_event_feed_mouse_in n_evas=<%d>\n", __func__, n_evas);
if (e) evas_event_feed_mouse_in(e, time(NULL), NULL);
break;
}
case EXACTNESS_ACTION_MOUSE_OUT:
{
_printf(1, "Mouse out\n");
_printf(2, "%s evas_event_feed_mouse_out n_evas=<%d>\n", __func__, n_evas);
ex_printf(1, "Mouse out\n");
ex_printf(2, "%s evas_event_feed_mouse_out n_evas=<%d>\n", __func__, n_evas);
if (e) evas_event_feed_mouse_out(e, time(NULL), NULL);
break;
}
case EXACTNESS_ACTION_MOUSE_WHEEL:
{
Exactness_Action_Mouse_Wheel *t = data;
_printf(1, "Mouse wheel\n");
_printf(2, "%s evas_event_feed_mouse_wheel n_evas=<%d>\n", __func__, n_evas);
ex_printf(1, "Mouse wheel\n");
ex_printf(2, "%s evas_event_feed_mouse_wheel n_evas=<%d>\n", __func__, n_evas);
if (e) evas_event_feed_mouse_wheel(e, t->direction, t->z, time(NULL), NULL);
break;
@ -393,7 +306,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
case EXACTNESS_ACTION_MULTI_DOWN:
{
Exactness_Action_Multi_Event *t = data;
_printf(2, "%s evas_event_feed_multi_down n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s evas_event_feed_multi_down n_evas=<%d>\n", __func__, n_evas);
if (!t->d)
{
if (e) evas_event_feed_mouse_down(e, t->b, t->flags, time(NULL), NULL);
@ -412,7 +325,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
case EXACTNESS_ACTION_MULTI_UP:
{
Exactness_Action_Multi_Event *t = data;
_printf(2, "%s evas_event_feed_multi_up n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s evas_event_feed_multi_up n_evas=<%d>\n", __func__, n_evas);
if (!t->d)
{
if (e) evas_event_feed_mouse_up(e, t->b, t->flags, time(NULL), NULL);
@ -431,7 +344,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
case EXACTNESS_ACTION_MULTI_MOVE:
{
Exactness_Action_Multi_Move *t = data;
_printf(2, "%s evas_event_feed_multi_move n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s evas_event_feed_multi_move n_evas=<%d>\n", __func__, n_evas);
if (!t->d)
{
if (e) evas_event_feed_mouse_move(e, t->x, t->y, time(NULL), NULL);
@ -454,7 +367,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
case EXACTNESS_ACTION_KEY_DOWN:
{
Exactness_Action_Key_Down_Up *t = data;
_printf(2, "%s evas_event_feed_key_down n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s evas_event_feed_key_down n_evas=<%d>\n", __func__, n_evas);
if (e)
evas_event_feed_key_down_with_keycode(e,
t->keyname, t->key, t->string,
@ -464,7 +377,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
case EXACTNESS_ACTION_KEY_UP:
{
Exactness_Action_Key_Down_Up *t = data;
_printf(2, "%s evas_event_feed_key_up n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s evas_event_feed_key_up n_evas=<%d>\n", __func__, n_evas);
if (e) evas_event_feed_key_up_with_keycode(e,
t->keyname, t->key, t->string,
t->compose, time(NULL), NULL, t->keycode);
@ -473,7 +386,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
}
case EXACTNESS_ACTION_TAKE_SHOT:
{
_printf(2, "%s take shot n_evas=<%d>\n", __func__, n_evas);
ex_printf(2, "%s take shot n_evas=<%d>\n", __func__, n_evas);
if (rect) evas_object_color_set(rect, 0, 0, 255, 255);
_cur_shot_id++;
if (_dest_type != FTYPE_UNKNOWN && e) _shot_do(e);
@ -489,7 +402,7 @@ _feed_event(Exactness_Action_Type type, unsigned int n_evas, void *data)
Eo *o = efl_name_find(e, t->wdg_name);
if (o)
{
_printf(2, "%s EFL event invoke %s on %s\n",
ex_printf(2, "%s EFL event invoke %s on %s\n",
__func__, t->event_name, t->wdg_name);
Efl_Event_Description d;
found = EINA_TRUE;
@ -526,7 +439,7 @@ wdg_found:
Exactness_Action_Multi_Event *d_event = calloc(1, sizeof(*d_event));
Exactness_Action *act, *prev_act = eina_list_data_get(_cur_event_list);
_printf(2, "%s click on %s\n", __func__, t->wdg_name);
ex_printf(2, "%s click on %s\n", __func__, t->wdg_name);
act = calloc(1, sizeof(*act));
act->type = EXACTNESS_ACTION_MULTI_MOVE;
act->delay_ms = 100;
@ -563,7 +476,7 @@ wdg_found:
}
case EXACTNESS_ACTION_STABILIZE:
{
_printf(2, "%s stabilize\n", __func__);
ex_printf(2, "%s stabilize\n", __func__);
if (rect) evas_object_color_set(rect, 255, 165, 0, 255);
ecore_timer_add(0.1, _stabilization_timer_cb, NULL);
break;
@ -591,7 +504,7 @@ _feed_event_timer_cb(void *data EINA_UNUSED)
if (act->type != EXACTNESS_ACTION_STABILIZE)
{
act = eina_list_data_get(_cur_event_list);
_printf(2, " %s timer_time=<%f>\n", __func__, act->delay_ms / 1000.0);
ex_printf(2, " %s timer_time=<%f>\n", __func__, act->delay_ms / 1000.0);
ecore_timer_add(act->delay_ms / 1000.0, _feed_event_timer_cb, NULL);
}
}
@ -605,7 +518,7 @@ _stabilization_timer_cb(void *data EINA_UNUSED)
Evas *e;
#define STAB_MAX 5
static int need_more = STAB_MAX;
_printf(2, "Not stable yet!\n");
ex_printf(2, "Not stable yet!\n");
EINA_LIST_FOREACH(_evas_list, itr, e)
{
if (!e) continue;
@ -629,7 +542,7 @@ _stabilization_timer_cb(void *data EINA_UNUSED)
if (_src_type != FTYPE_REMOTE && !_pause_request)
{
Exactness_Action *act = eina_list_data_get(_cur_event_list);
_printf(2, " %s timer_time=<%f>\n", __func__, act->delay_ms / 1000.0);
ex_printf(2, " %s timer_time=<%f>\n", __func__, act->delay_ms / 1000.0);
ecore_timer_add(act->delay_ms / 1000.0, _feed_event_timer_cb, NULL);
}
need_more = STAB_MAX;
@ -836,7 +749,7 @@ _src_feed(void *data EINA_UNUSED)
if (act && act->delay_ms)
{
_printf(2, " Waiting <%f>\n", act->delay_ms / 1000.0);
ex_printf(2, " Waiting <%f>\n", act->delay_ms / 1000.0);
ecore_timer_add(act->delay_ms / 1000.0, _feed_event_timer_cb, NULL);
}
else
@ -853,7 +766,7 @@ _src_open()
{
Eina_List *itr, *itr2;
Exactness_Action *act;
_printf(2, "<%s> Source file is <%s>\n", __func__, _src_filename);
ex_printf(2, "<%s> Source file is <%s>\n", __func__, _src_filename);
if (_src_type == FTYPE_EXU)
{
_src_unit = exactness_unit_file_read(_src_filename);
@ -951,7 +864,7 @@ _prg_invoke(const char *full_path, int argc, char **argv)
static Eina_Stringshare *
_prg_full_path_guess(const char *prg)
{
char full_path[PATH_];
char full_path[PATH_MAX];
if (strchr(prg, '/')) return eina_stringshare_add(prg);
char *env_path = eina_strdup(getenv("PATH"));
Eina_Stringshare *ret = NULL;
@ -1035,10 +948,10 @@ _event_key_cb(void *data EINA_UNUSED, const Efl_Event *event)
if (!strcmp(key, PAUSE_KEY_STR) && efl_input_key_pressed_get(evk))
{
_pause_request = !_pause_request;
if (_pause_request) _printf(1, "Pausing scenario\n");
if (_pause_request) ex_printf(1, "Pausing scenario\n");
else
{
_printf(1, "Playing scenario\n");
ex_printf(1, "Playing scenario\n");
if (!_playing_status)
_feed_event_timer_cb(NULL);
}
@ -1060,7 +973,7 @@ _my_evas_new(int w EINA_UNUSED, int h EINA_UNUSED)
e = _evas_new();
if (e)
{
_printf(1, "New Evas\n");
ex_printf(1, "New Evas\n");
_evas_list = eina_list_append(_evas_list, e);
efl_event_callback_array_add(e, _evas_callbacks(), NULL);
}
@ -1242,7 +1155,7 @@ int main(int argc, char **argv)
if (!show_on_screen) setenv("ELM_ENGINE", "buffer", 1);
if (_src_unit && _src_unit->fonts_path)
{
char buf[PATH_];
char buf[PATH_MAX];
if (!fonts_dir) fonts_dir = "./fonts";
sprintf(buf, "%s/%s", fonts_dir, _src_unit->fonts_path);
if (!ecore_file_exists(buf))
@ -1297,9 +1210,9 @@ int main(int argc, char **argv)
{
argv[i - opt_args] = argv[0] + (argv[i] - argv[opt_args]);
}
_printf(1, "%s ", argv[i - opt_args]);
ex_printf(1, "%s ", argv[i - opt_args]);
}
_printf(1, "\n");
ex_printf(1, "\n");
}
else
{

View File

@ -23,8 +23,8 @@
#include <Exactness.h>
#include <exactness_private.h>
#include "common.h"
#define MAX_PATH 1024
#define STABILIZE_KEY_STR "F1"
#define SHOT_KEY_STR "F2"
#define SAVE_KEY_STR "F3"
@ -42,17 +42,6 @@ static Exactness_Unit *_unit = NULL;
static char *_shot_key = NULL;
static unsigned int _last_timestamp = 0.0;
static void
_printf(int verbose, const char *fmt, ...)
{
va_list ap;
if (!_verbose || verbose > _verbose) return;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
static Exactness_Action_Type
_event_pointer_type_get(Efl_Pointer_Action t)
{
@ -87,7 +76,7 @@ _add_to_list(Exactness_Action_Type type, unsigned int n_evas, unsigned int times
prev_v->n_evas == n_evas &&
(!len || !memcmp(prev_v->data, data, len))) return;
}
_printf(1, "Recording %s\n", _exactness_action_type_to_string_get(type));
ex_printf(1, "Recording %s\n", _exactness_action_type_to_string_get(type));
Exactness_Action *act = malloc(sizeof(*act));
act->type = type;
act->n_evas = n_evas;
@ -122,7 +111,7 @@ _event_pointer_cb(void *data, const Efl_Event *event)
if (!timestamp) return;
_printf(2, "Calling \"%s\" timestamp=<%u>\n", _exactness_action_type_to_string_get(evt), timestamp);
ex_printf(2, "Calling \"%s\" timestamp=<%u>\n", _exactness_action_type_to_string_get(evt), timestamp);
switch (action)
{
@ -182,20 +171,20 @@ _event_key_cb(void *data, const Efl_Event *event)
{
if (!strcmp(key, _shot_key))
{
_printf(2, "Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp);
ex_printf(2, "Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp);
_add_to_list(EXACTNESS_ACTION_TAKE_SHOT, n_evas, timestamp, NULL, 0);
return;
}
if (!strcmp(key, STABILIZE_KEY_STR))
{
_printf(2, "Stabilize: %s timestamp=<%u>\n", __func__, timestamp);
ex_printf(2, "Stabilize: %s timestamp=<%u>\n", __func__, timestamp);
_add_to_list(EXACTNESS_ACTION_STABILIZE, n_evas, timestamp, NULL, 0);
return;
}
if (!strcmp(key, SAVE_KEY_STR))
{
_output_write();
_printf(2, "Save events: %s timestamp=<%u>\n", __func__, timestamp);
ex_printf(2, "Save events: %s timestamp=<%u>\n", __func__, timestamp);
return;
}
evt = EXACTNESS_ACTION_KEY_DOWN;
@ -239,7 +228,7 @@ _my_evas_new(int w EINA_UNUSED, int h EINA_UNUSED)
e = _evas_new();
if (e)
{
_printf(1, "New Evas\n");
ex_printf(1, "New Evas\n");
_evas_list = eina_list_append(_evas_list, e);
efl_key_data_set(e, "__evas_id", (void *)(intptr_t)_last_evas_id++);
efl_event_callback_array_add(e, _event_pointer_callbacks(), e);
@ -303,7 +292,7 @@ _prg_invoke(const char *full_path, int argc, char **argv)
static Eina_Stringshare *
_prg_full_path_guess(const char *prg)
{
char full_path[MAX_PATH];
char full_path[PATH_MAX];
if (strchr(prg, '/')) return eina_stringshare_add(prg);
char *env_path = eina_strdup(getenv("PATH"));
Eina_Stringshare *ret = NULL;
@ -493,7 +482,7 @@ int main(int argc, char **argv)
/* Replace the current command line to hide the Exactness part */
int len = argv[argc - 1] + strlen(argv[argc - 1]) - argv[opt_args];
memcpy(argv[0], argv[opt_args], len);
memset(argv[0] + len, 0, MAX_PATH - len);
memset(argv[0] + len, 0, PATH_MAX - len);
int i;
for (i = opt_args; i < argc; i++)
@ -502,9 +491,9 @@ int main(int argc, char **argv)
{
argv[i - opt_args] = argv[0] + (argv[i] - argv[opt_args]);
}
_printf(1, "%s ", argv[i - opt_args]);
ex_printf(1, "%s ", argv[i - opt_args]);
}
_printf(1, "\n");
ex_printf(1, "\n");
if (!_shot_key) _shot_key = getenv("SHOT_KEY");
if (!_shot_key) _shot_key = SHOT_KEY_STR;

View File

@ -69,6 +69,7 @@ struct _Efl_Exe_Data
} fd;
#endif
Eina_Bool exit_called : 1;
Eina_Bool exit_signalled : 1;
Eina_Bool run : 1;
};
@ -269,10 +270,10 @@ _efl_exe_signal(Eo *obj EINA_UNUSED, Efl_Exe_Data *pd, Efl_Exe_Signal sig)
switch (sig)
{
case EFL_EXE_SIGNAL_INT: s = SIGINT; break;
case EFL_EXE_SIGNAL_QUIT: s = SIGQUIT; break;
case EFL_EXE_SIGNAL_TERM: s = SIGTERM; break;
case EFL_EXE_SIGNAL_KILL: s = SIGKILL; break;
case EFL_EXE_SIGNAL_INT: s = SIGINT; pd->exit_signalled = EINA_TRUE; break;
case EFL_EXE_SIGNAL_QUIT: s = SIGQUIT; pd->exit_signalled = EINA_TRUE; break;
case EFL_EXE_SIGNAL_TERM: s = SIGTERM; pd->exit_signalled = EINA_TRUE; break;
case EFL_EXE_SIGNAL_KILL: s = SIGKILL; pd->exit_signalled = EINA_TRUE; break;
case EFL_EXE_SIGNAL_CONT: s = SIGCONT; break;
case EFL_EXE_SIGNAL_STOP: s = SIGSTOP; break;
case EFL_EXE_SIGNAL_HUP: s = SIGHUP; break;
@ -552,7 +553,18 @@ _efl_exe_efl_task_run(Eo *obj, Efl_Exe_Data *pd)
int except[2] = { 0, -1 };
except[0] = pd->fd.exited_write;
eina_file_close_from(3, except);
#ifdef HAVE_PRCTL
if ((pd->flags & EFL_EXE_FLAGS_TERM_WITH_PARENT))
{
prctl(PR_SET_PDEATHSIG, SIGTERM);
}
#elif defined(HAVE_PROCCTL)
if ((pd->flags & EFL_EXE_FLAGS_TERM_WITH_PARENT))
{
int sig = SIGTERM;
procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &sig);
}
#endif
// actually execute!
_exec(cmd, pd->flags, td->flags);
// we couldn't exec... uh oh. HAAAAAAAALP!
@ -570,6 +582,7 @@ _efl_exe_efl_task_end(Eo *obj EINA_UNUSED, Efl_Exe_Data *pd)
#ifdef _WIN32
#else
if (pd->pid == -1) return;
pd->exit_signalled = EINA_TRUE;
kill(pd->pid, SIGINT);
#endif
}
@ -580,6 +593,16 @@ _efl_exe_exit_signal_get(const Eo *obj EINA_UNUSED, Efl_Exe_Data *pd)
return pd->exit_signal;
}
EOLIAN static int
_efl_exe_pid_get(const Eo *obj EINA_UNUSED, Efl_Exe_Data *pd)
{
#ifndef _WIN32
if (pd->pid != -1)
return pd->pid;
#endif
return 0;
}
EOLIAN static Efl_Object *
_efl_exe_efl_object_constructor(Eo *obj, Efl_Exe_Data *pd)
{
@ -602,7 +625,7 @@ _efl_exe_efl_object_destructor(Eo *obj, Efl_Exe_Data *pd)
{
#ifdef _WIN32
#else
if (!pd->exit_called)
if ((!pd->exit_called) && (!pd->exit_signalled))
ERR("Exe being destroyed while child has not exited yet.");
if (pd->fd.exited_read >= 0)
{

View File

@ -18,7 +18,8 @@ enum @beta Efl.Exe_Flags {
[[Flags to customize process behavior.]]
none = 0, [[No special flags.]]
group_leader = 1, [[Process will be executed in its own session.]]
hide_io = 4 [[All console IO will be hidden.]]
hide_io = 4, [[All console IO will be hidden.]]
term_with_parent = 8, [[Makes child receive SIGTERM when parent dies.]]
}
class @beta Efl.Exe extends Efl.Task implements Efl.Io.Reader, Efl.Io.Writer, Efl.Io.Closer, Efl.Core.Command_Line
@ -51,6 +52,15 @@ class @beta Efl.Exe extends Efl.Task implements Efl.Io.Reader, Efl.Io.Writer, Ef
sig: int; [[The exit signal, or -1 if no exit signal happened.]]
}
}
@property pid {
[[The pid of the process, which is only accessible after the object has been finalized.
@since 1.24
]]
get { }
values {
pid: int; [[The pid, or 0 on failure.]]
}
}
@property env {
[[If $env is $NULL then the process created by this object is
going to inherit the environment of this process.

View File

@ -493,6 +493,20 @@ _edje_part_textblock_style_text_set(Edje *ed,
return EINA_FALSE;
}
static char*
strrstr(const char* haystack, const char* violate)
{
char *s_ret = NULL;
char *tmp = NULL;
const char *_haystack = haystack;
size_t len = strlen(violate);
while((tmp = strstr(_haystack, violate))){
s_ret = tmp;
_haystack = tmp + len;
}
return s_ret;
}
void
_edje_part_recalc_single_textblock(FLOAT_T sc,
Edje *ed,
@ -522,11 +536,21 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
size_t size_array_len = 0;
Eina_List *l;
unsigned int *value;
Evas_Textblock_Style *st = _edje_textblock_style_get(ed, chosen_desc->text.style.str);
const char *text_style = evas_textblock_style_get(st);
char *s_font_size = (text_style) ? strrstr(text_style,"font_size=") : NULL;
if (s_font_size)
{
int font_size = strtol(&s_font_size[10], NULL, 10);
chosen_desc->text.size_range_max = font_size;
if (chosen_desc->text.size_range_min > chosen_desc->text.size_range_max)
chosen_desc->text.size_range_min = chosen_desc->text.size_range_max;
}
EINA_LIST_FOREACH(chosen_desc->text.fit_size_array, l, value)
{
size_array[size_array_len++] = *value;
}
unsigned int mode = TEXTBLOCK_FIT_MODE_NONE;
unsigned int mode = TEXTBLOCK_FIT_MODE_NONE;
if (chosen_desc->text.fit_x)
mode |= TEXTBLOCK_FIT_MODE_WIDTH;

View File

@ -326,6 +326,7 @@ edje_language_set(const char *locale)
char *loc;
int length;
if (!locale) return;
lookup = strstr(locale, ".");
length = lookup ? lookup - locale : (int)strlen(locale);
loc = alloca(length + 1);

View File

@ -52,6 +52,7 @@ extern "C" {
#define EFL_VERSION_1_21 1
#define EFL_VERSION_1_22 1
#define EFL_VERSION_1_23 1
#define EFL_VERSION_1_24 1
/* Add here all the required ifdef for any @protected method */
#ifdef EFL_BUILD
@ -252,7 +253,7 @@ efl_config_bool_get(const Efl_Config *obj, const char * name)
{
Eina_Value *v = efl_config_get(obj, name);
Eina_Bool b = 0;
if (eina_value_type_get(v) == EINA_VALUE_TYPE_UCHAR)
if (v && eina_value_type_get(v) == EINA_VALUE_TYPE_UCHAR)
eina_value_get(v, &b);
eina_value_free(v);
return b;
@ -274,7 +275,7 @@ efl_config_int_get(const Efl_Config *obj, const char * name)
{
Eina_Value *v = efl_config_get(obj, name);
int b = 0;
if (eina_value_type_get(v) == EINA_VALUE_TYPE_INT)
if (v && eina_value_type_get(v) == EINA_VALUE_TYPE_INT)
eina_value_get(v, &b);
eina_value_free(v);
return b;
@ -296,7 +297,7 @@ efl_config_double_get(const Efl_Config *obj, const char * name)
{
Eina_Value *v = efl_config_get(obj, name);
double b = 0;
if (eina_value_type_get(v) == EINA_VALUE_TYPE_DOUBLE)
if (v && eina_value_type_get(v) == EINA_VALUE_TYPE_DOUBLE)
eina_value_get(v, &b);
eina_value_free(v);
return b;
@ -318,7 +319,7 @@ efl_config_string_get(const Efl_Config *obj, const char *name)
{
Eina_Value *v = efl_config_get(obj, name);
Eina_Stringshare *s = 0;
if (eina_value_type_get(v) == EINA_VALUE_TYPE_STRING)
if (v && eina_value_type_get(v) == EINA_VALUE_TYPE_STRING)
{
const char *b = 0;
eina_value_get(v, &b);

View File

@ -1,24 +1,49 @@
#ifdef EFL_BETA_API_SUPPORT
#ifndef EFL_WL_H
# define EFL_WL_H
#ifndef EFL_CANVAS_WL_H
# define EFL_CANVAS_WL_H
#include <Evas.h>
#include <Ecore.h>
#include <Efl_Core.h>
#ifdef EAPI
# undef EAPI
#endif
#ifdef __GNUC__
# if __GNUC__ >= 4
# define EAPI __attribute__ ((visibility("default")))
# else
# define EAPI
# endif
#else
# define EAPI
#ifdef EAPI_WEAK
# undef EAPI_WEAK
#endif
# ifdef __GNUC__
# if __GNUC__ >= 4
# define EAPI __attribute__ ((visibility("default")))
# define EAPI_WEAK
# else
# define EAPI
# define EAPI_WEAK
# endif
# endif
#define EWAPI EAPI EAPI_WEAK
#ifdef WAYLAND_UTIL_H
typedef struct wl_surface Efl_Canvas_Wl_Wl_Surface;
typedef struct wl_global Efl_Canvas_Wl_Wl_Global;
typedef struct wl_interface Efl_Canvas_Wl_Wl_Interface;
typedef struct wl_array Efl_Canvas_Wl_Wl_Array;
typedef void Efl_Canvas_Wl_Wl_Interface_Data;
typedef void Efl_Canvas_Wl_Wl_Interface_Bind_Cb;
#else
typedef struct Efl_Canvas_Wl_Wl_Surface Efl_Canvas_Wl_Wl_Surface;
typedef struct Efl_Canvas_Wl_Wl_Global Efl_Canvas_Wl_Wl_Global;
typedef struct Efl_Canvas_Wl_Wl_Interface Efl_Canvas_Wl_Wl_Interface;
typedef struct Efl_Canvas_Wl_Wl_Array Efl_Canvas_Wl_Wl_Array;
typedef void * Efl_Canvas_Wl_Wl_Interface_Data;
typedef void * Efl_Canvas_Wl_Wl_Interface_Bind_Cb;
#endif
#ifdef _XKBCOMMON_H_
typedef struct xkb_state Efl_Canvas_Wl_Xkb_State;
#else
typedef struct Efl_Canvas_Wl_Xkb_State Efl_Canvas_Wl_Xkb_State;
#endif
#include <efl_canvas_wl_surface.eo.h>
#include <efl_canvas_wl.eo.h>
/**
* @defgroup Efl_Wl_Group EFL Wayland
*
@ -27,19 +52,7 @@
* @since 1.20
* @{
*/
/**
* @typedef Efl_Wl_Rotation
* The rotation to apply to the compositor's internal wl_output
*/
typedef enum
{
EFL_WL_ROTATION_0,
EFL_WL_ROTATION_90,
EFL_WL_ROTATION_180,
EFL_WL_ROTATION_270
} Efl_Wl_Rotation;
#if 0
/**
* Add a compositor widget to the given canvas.
*
@ -52,7 +65,7 @@ typedef enum
* @param e The canvas
* @return The compositor object, @c NULL on failure
*/
EAPI Evas_Object *efl_wl_add(Evas *e);
EAPI Evas_Object *efl_canvas_wl_add(Evas *e);
/**
* Run a command in the compositor widget.
@ -64,7 +77,7 @@ EAPI Evas_Object *efl_wl_add(Evas *e);
* @param cmd The command to run
* @return The Ecore_Exe from the executed process, @c NULL on failure
*/
EAPI Ecore_Exe *efl_wl_run(Evas_Object *obj, const char *cmd);
EAPI Ecore_Exe *efl_canvas_wl_run(Evas_Object *obj, const char *cmd);
/**
* Run a command in the compositor widget with specified flags.
@ -77,7 +90,7 @@ EAPI Ecore_Exe *efl_wl_run(Evas_Object *obj, const char *cmd);
* @param flags The flags to use
* @return The Ecore_Exe from the executed process, @c NULL on failure
*/
Ecore_Exe *efl_wl_flags_run(Evas_Object *obj, const char *cmd, Ecore_Exe_Flags flags);
Ecore_Exe *efl_canvas_wl_flags_run(Evas_Object *obj, const char *cmd, Ecore_Exe_Flags flags);
/**
* Add a process to the list of allowed clients for the compositor widget
@ -86,7 +99,7 @@ Ecore_Exe *efl_wl_flags_run(Evas_Object *obj, const char *cmd, Ecore_Exe_Flags f
* @param pid The process to allow
* @since 1.21
*/
EAPI void efl_wl_pid_add(Evas_Object *obj, int32_t pid);
EAPI void efl_canvas_wl_pid_add(Evas_Object *obj, int32_t pid);
/**
* Remove a process from the list of allowed clients for the compositor widget
@ -95,7 +108,7 @@ EAPI void efl_wl_pid_add(Evas_Object *obj, int32_t pid);
* @param pid The process to deny
* @since 1.21
*/
EAPI void efl_wl_pid_del(Evas_Object *obj, int32_t pid);
EAPI void efl_canvas_wl_pid_del(Evas_Object *obj, int32_t pid);
/**
* Put the bottom-most toplevel window on top and apply focus to it
@ -103,7 +116,7 @@ EAPI void efl_wl_pid_del(Evas_Object *obj, int32_t pid);
* @param obj The compositor widget
* @return EINA_TRUE if the window stacking was changed
*/
EAPI Eina_Bool efl_wl_next(Evas_Object *obj);
EAPI Eina_Bool efl_canvas_wl_surface_next(Evas_Object *obj);
/**
* Put the second top-most toplevel window on top and apply focus to it
@ -111,7 +124,7 @@ EAPI Eina_Bool efl_wl_next(Evas_Object *obj);
* @param obj The compositor widget
* @return EINA_TRUE if the window stacking was changed
*/
EAPI Eina_Bool efl_wl_prev(Evas_Object *obj);
EAPI Eina_Bool efl_canvas_wl_surface_prev(Evas_Object *obj);
/**
* Set rotation and flip for the compositor's output
@ -122,7 +135,7 @@ EAPI Eina_Bool efl_wl_prev(Evas_Object *obj);
* @note rtl is equivalent to WL_OUTPUT_TRANSFORM_FLIPPED and rotations are applied
* on top
*/
EAPI void efl_wl_rotate(Evas_Object *obj, Efl_Wl_Rotation rot, Eina_Bool rtl);
EAPI void efl_canvas_wl_rotate(Evas_Object *obj, Efl_Wl_Rotation rot, Eina_Bool rtl);
/**
* Set the scale factor for the compositor's output
@ -130,25 +143,25 @@ EAPI void efl_wl_rotate(Evas_Object *obj, Efl_Wl_Rotation rot, Eina_Bool rtl);
* @param obj The compositor widget
* @param scale The scale factor to set
*/
EAPI void efl_wl_scale_set(Evas_Object *obj, double scale);
EAPI void efl_canvas_wl_scale_set(Evas_Object *obj, double scale);
/**
* Transfer aspect hints from top-most surface onto the efl_wl object
* Transfer aspect hints from top-most surface onto the efl_canvas_wl object
*
* @param obj The compositor widget
* @param set Whether to enable aspect setting
* @since 1.21
*/
EAPI void efl_wl_aspect_set(Evas_Object *obj, Eina_Bool set);
EAPI void efl_canvas_wl_aspect_set(Evas_Object *obj, Eina_Bool set);
/**
* Transfer min/max hints from top-most surface onto the efl_wl object
* Transfer min/max hints from top-most surface onto the efl_canvas_wl object
*
* @param obj The compositor widget
* @param set Whether to enable min/max setting
* @since 1.21
*/
EAPI void efl_wl_minmax_set(Evas_Object *obj, Eina_Bool set);
EAPI void efl_canvas_wl_minmax_set(Evas_Object *obj, Eina_Bool set);
/**
* Add an externally-managed global to the compositor
@ -164,7 +177,7 @@ EAPI void efl_wl_minmax_set(Evas_Object *obj, Eina_Bool set);
* @return The created global (struct wl_global), or NULL on failure
* @since 1.21
*/
EAPI void *efl_wl_global_add(Evas_Object *obj, const void *interface, uint32_t version, void *data, void *bind_cb);
EAPI void *efl_canvas_wl_global_add(Evas_Object *obj, const void *interface, uint32_t version, void *data, void *bind_cb);
/**
* Extract a child surface from the compositor
@ -176,7 +189,7 @@ EAPI void *efl_wl_global_add(Evas_Object *obj, const void *interface, uint32_t v
* @return True if the surface was successfully extracted
* @since 1.21
*/
EAPI Eina_Bool efl_wl_surface_extract(Evas_Object *surface);
EAPI Eina_Bool efl_canvas_wl_surface_extract(Evas_Object *surface);
/**
* Return the pid for the surface's client
@ -187,19 +200,19 @@ EAPI Eina_Bool efl_wl_surface_extract(Evas_Object *surface);
* @return The pid of the surface, or -1 on failure
* @since 1.24
*/
EAPI int32_t efl_wl_surface_pid_get(Evas_Object *surface);
EAPI int32_t efl_canvas_wl_surface_pid_get(Evas_Object *surface);
#endif
/**
* Get the Evas_Object for an extracted wl_surface resource created by an efl_wl object
* Get the Evas_Object for an extracted wl_surface resource created by an efl_canvas_wl object
*
* @note Passing anything other than a valid wl_surface resource from an efl_wl object will guarantee a crash.
* @note Passing anything other than a valid wl_surface resource from an efl_canvas_wl object will guarantee a crash.
*
* @param surface_resource The wl_resource for a wl_surface
* @return The Evas_Object of the surface, NULL on failure
* @since 1.21
*/
EAPI Evas_Object *efl_wl_extracted_surface_object_find(void *surface_resource);
EAPI Evas_Object *efl_canvas_wl_extracted_surface_object_find(void *surface_resource);
#if 0
/**
* Get the Evas_Object for an extracted surface's parent, or NULL if the parent is not extracted
*
@ -209,7 +222,7 @@ EAPI Evas_Object *efl_wl_extracted_surface_object_find(void *surface_resource);
* @return The Evas_Object of the parent surface, NULL on failure or if there is no parent
* @since 1.21
*/
EAPI Evas_Object *efl_wl_extracted_surface_extracted_parent_get(Evas_Object *surface);
EAPI Evas_Object *efl_canvas_wl_extracted_surface_extracted_parent_get(Evas_Object *surface);
/**
* Set external xkbcommon resources to be used read-only by the compositor object
@ -227,7 +240,7 @@ EAPI Evas_Object *efl_wl_extracted_surface_extracted_parent_get(Evas_Object *sur
* @param wl_key_array A pointer to the wl_array in which keys are stored
* @since 1.21
*/
EAPI void efl_wl_seat_keymap_set(Evas_Object *obj, Eo *seat, void *state, char *str, void *wl_key_array);
EAPI void efl_canvas_wl_seat_keymap_set(Evas_Object *obj, Eo *seat, void *state, char *str, void *wl_key_array);
/**
* Set the key repeat rate for a seat in the compositor
@ -235,7 +248,10 @@ EAPI void efl_wl_seat_keymap_set(Evas_Object *obj, Eo *seat, void *state, char *
* @param obj The compositor widget
* @since 1.21
*/
EAPI void efl_wl_seat_key_repeat_set(Evas_Object *obj, Eo *seat, int repeat_rate, int repeat_delay);
EAPI void efl_canvas_wl_seat_key_repeat_set(Evas_Object *obj, Eo *seat, int repeat_rate, int repeat_delay);
#endif
#undef EAPI
#define EAPI
#undef EAPI_WEAK
#define EAPI_WEAK
#endif

View File

@ -0,0 +1,123 @@
import efl_exe;
import efl_input_device;
import efl_canvas_wl_surface;
struct @beta @extern Efl.Canvas.Wl_Wl_Surface; [[ struct wl_surface. @since 1.24 ]]
struct @beta @extern Efl.Canvas.Wl_Wl_Global; [[ struct wl_global. @since 1.24 ]]
struct @beta @extern Efl.Canvas.Wl_Wl_Interface; [[ A libwayland callback interface struct. @since 1.24 ]]
struct @beta @extern Efl.Canvas.Wl_Wl_Interface_Data; [[ A data pointer to send with the bind callback. @since 1.24 ]]
struct @beta @extern Efl.Canvas.Wl_Wl_Interface_Bind_Cb; [[ A callback with the type (*void)(struct wl_client *client, void *data, uint32_t version, uint32_t id). @since 1.24 ]]
struct @beta @extern Efl.Canvas.Wl_Xkb_State; [[ struct xkb_state. @since 1.24 ]]
struct @beta @extern Efl.Canvas.Wl_Wl_Array; [[ struct wl_array. @since 1.24 ]]
enum @beta Efl.Canvas.Wl.Rotation
{
[[Orientation of the internal compositor object in degrees. These values are COUNTER-CLOCKWISE.
]]
rotate_0 = 0,
rotate_90 = 1,
rotate_180 = 2,
rotate_270 = 3
}
class @beta Efl.Canvas.Wl extends Efl.Canvas.Group
{
[[
@since 1.24
]]
data: Comp;
methods {
run {
[[This runs a command in the compositor using the @Efl.Exe_Flags.term_with_parent flag.
]]
params {
cmd: string;
}
return: Efl.Exe;
}
@property exec_flags {
values {
flags: Efl.Exe_Flags;
}
}
allowed_pid_add {
params {
pid: int;
}
}
allowed_pid_del {
params {
pid: int;
}
}
surface_next {
return: Efl.Canvas.Wl.Surface;
}
surface_prev {
return: Efl.Canvas.Wl.Surface;
}
@property active_surface {
get {}
set {
return: bool;
}
values {
surface: Efl.Canvas.Wl.Surface;
}
}
@property aspect {
values {
set: bool;
}
}
@property minmax {
values {
set: bool;
}
}
@property rotation {
values {
rotation: Efl.Canvas.Wl.Rotation;
rtl: bool;
}
}
global_add {
params {
interface: const(Efl.Canvas.Wl_Wl_Interface) @by_ref;
version: uint;
data: Efl.Canvas.Wl_Wl_Interface_Data @by_ref;
bind_cb: Efl.Canvas.Wl_Wl_Interface_Bind_Cb @by_ref;
}
return: Efl.Canvas.Wl_Wl_Global @by_ref;
}
seat_keymap_set {
params {
seat: Efl.Input.Device;
state: Efl.Canvas.Wl_Xkb_State @by_ref;
keymap_str: string;
key_array: Efl.Canvas.Wl_Wl_Array @by_ref;
}
}
seat_key_repeat_set {
params {
seat: Efl.Input.Device;
repeat_rate: int;
repeat_delay: int;
}
}
}
implements {
Efl.Object.constructor;
Efl.Gfx.Entity.visible { set; }
Efl.Gfx.Entity.size { set; }
Efl.Gfx.Entity.position { set; }
Efl.Gfx.Entity.scale { get; set; }
}
events {
toplevel,added: Efl.Canvas.Wl.Surface; [[]]
child,added: Efl.Canvas.Wl.Surface; [[]]
popup,added: Efl.Canvas.Wl.Surface; [[]]
seat,added: Efl.Input.Device; [[The seat object added.]]
}
}

View File

@ -0,0 +1,34 @@
class @beta Efl.Canvas.Wl.Surface extends Efl.Canvas.Group
{
[[@since 1.24]]
data: Comp_Surface;
methods {
extract {
return: bool;
}
@property pid {
get {}
values {
pid: int;
}
}
@property parent_surface {
get {}
values {
parent: Efl.Canvas.Wl.Surface;
}
}
@property extracted {
get {}
values {
extracted: bool;
}
}
}
implements {
Efl.Object.constructor;
Efl.Gfx.Entity.visible { set; }
Efl.Gfx.Entity.size { set; }
Efl.Gfx.Entity.position { set; }
}
}

View File

@ -0,0 +1,60 @@
efl_canvas_wl_deps = [ecore_wl2, ecore_input, ecore, ecore_evas, evas, emile, eina]
efl_canvas_wl_pub_deps = [eo, efl, evas, dependency('wayland-server', version : '>= 1.11.0'), dependency('xkbcommon', version : '>= 0.6.0')]
if (get_option('x11'))
efl_canvas_wl_deps += [ecore_x]
efl_canvas_wl_pub_deps += [dependency('xkbcommon-x11')]
endif
pub_eo_files = [
'efl_canvas_wl.eo',
'efl_canvas_wl_surface.eo',
]
foreach eo_file : pub_eo_files
pub_eo_file_target += custom_target('eolian_gen_' + eo_file,
input : eo_file,
output : [eo_file + '.h'],
depfile : eo_file + '.d',
install : true,
install_dir : dir_package_include,
command : eolian_gen + [ '-I', meson.current_source_dir(), eolian_include_directories,
'-o', 'h:' + join_paths(meson.current_build_dir(), eo_file + '.h'),
'-o', 'c:' + join_paths(meson.current_build_dir(), eo_file + '.c'),
'-o', 'd:' + join_paths(meson.current_build_dir(), eo_file + '.d'),
'-gchd', '@INPUT@'])
endforeach
efl_canvas_wl_src = [
'dmabuf.c',
'efl_canvas_wl.c',
]
efl_canvas_wl_header_src = ['Efl_Canvas_Wl.h']
eolian_include_directories += ['-I', meson.current_source_dir()]
efl_canvas_wl_lib = library('efl_canvas_wl',
efl_canvas_wl_src, pub_eo_file_target,
dependencies: [m, dl] + efl_canvas_wl_deps + efl_canvas_wl_pub_deps,
include_directories : config_dir + [include_directories(join_paths('..','..'))],
install: true,
c_args : package_c_args,
version : meson.project_version()
)
efl_canvas_wl = declare_dependency(
include_directories: [include_directories('.')],
link_with: efl_canvas_wl_lib,
sources: pub_eo_file_target,
dependencies: efl_canvas_wl_pub_deps,
)
install_headers(efl_canvas_wl_header_src,
install_dir : dir_package_include,
)
eolian_efl_canvas_wl_dir = join_paths(eolian_include_dir, package_version_name)
if get_option('install-eo-files')
install_data(pub_eo_files,
install_dir: eolian_efl_canvas_wl_dir
)
endif

View File

@ -1,32 +0,0 @@
efl_wl_deps = [ecore_wl2, ecore_input, ecore, ecore_evas, evas, emile, eo, efl, eina]
efl_wl_pub_deps = [evas, dependency('wayland-server', version : '>= 1.11.0'), dependency('xkbcommon', version : '>= 0.6.0')]
if (get_option('x11'))
efl_wl_deps += [ecore_x]
efl_wl_pub_deps += [dependency('xkbcommon-x11')]
endif
efl_wl_src = [
'dmabuf.c',
'efl_wl.c'
]
efl_wl_header_src = ['Efl_Wl.h']
efl_wl_lib = library('efl_wl',
efl_wl_src,
dependencies: [m, dl] + efl_wl_deps + efl_wl_pub_deps,
include_directories : config_dir + [include_directories(join_paths('..','..'))],
install: true,
version : meson.project_version()
)
efl_wl = declare_dependency(
include_directories: [include_directories('.')],
link_with: efl_wl_lib,
dependencies: efl_wl_pub_deps,
)
install_headers(efl_wl_header_src,
install_dir : dir_package_include,
)

View File

@ -140,8 +140,11 @@ eina_content_new(Eina_Slice data, const char *type)
return content;
err:
free(content->data.mem);
content->data.mem = NULL;
if (content->data.mem)
{
free(content->data.mem);
content->data.mem = NULL;
}
free(content);
return NULL;
}

View File

@ -127,7 +127,7 @@ static int _abort_level_on_critical = EINA_LOG_LEVEL_CRITICAL;
# ifndef EINA_LOG_BACKTRACE_ENABLE
static int _backtrace_level = -1;
# else
static int _backtrace_level = 1;
static int _backtrace_level = EINA_LOG_LEVEL_ERR;
# endif
#endif

View File

@ -3256,7 +3256,7 @@ static inline Eina_Bool eina_value_struct_setup(Eina_Value *value,
*
* @param[in] value Value object
* @return structure description, with all members and size.
* on failure, #NULL is returned.
* on failure, @c NULL is returned.
*
* @since 1.21
*/
@ -3706,7 +3706,7 @@ EAPI const char *eina_value_type_name_get(const Eina_Value_Type *type) EINA_PURE
* @param[in] type Type reference.
* @return #EINA_TRUE if valid, #EINA_FALSE otherwise.
*
* A type is invalid if it's NULL or if version field is not the same
* A type is invalid if it's @c NULL or if version field is not the same
* as runtime #EINA_VALUE_TYPE_VERSION.
*
* @since 1.2

View File

@ -357,6 +357,7 @@ unwind = dependency('libunwind-generic', required: false)
if unwind.found()
config_h.set('HAVE_UNWIND', 1)
eina_deps += unwind
config_h.set('EINA_LOG_BACKTRACE_ENABLE', 1)
endif
#for the case that the iconv library is not part of libc but rather libiconv or smth. like that

View File

@ -576,6 +576,7 @@ _efl_ui_layout_base_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Layout_Data *sd)
Eina_Error theme_apply_ret, theme_apply_internal_ret;
Elm_Widget_Smart_Data *wd = NULL;
char buf[64];
Eina_Bool legacy;
static unsigned int version = 0;
sd->needs_theme_apply = EINA_FALSE;
@ -591,9 +592,10 @@ _efl_ui_layout_base_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Layout_Data *sd)
(theme_apply_internal_ret == EFL_UI_THEME_APPLY_ERROR_DEFAULT))
return EFL_UI_THEME_APPLY_ERROR_DEFAULT;
legacy = elm_widget_is_legacy(obj);
/* unset existing size hints to force accurate recalc */
efl_gfx_hint_size_restricted_min_set(obj, EINA_SIZE2D(0, 0));
if (elm_widget_is_legacy(obj))
if (legacy)
efl_gfx_hint_size_min_set(obj, EINA_SIZE2D(0, 0));
else
{
@ -623,6 +625,7 @@ _efl_ui_layout_base_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Layout_Data *sd)
}
if (sd->deferred_signals)
_deferred_signals_emit(sd);
if (legacy) return EFL_UI_THEME_APPLY_ERROR_NONE;
if (!version)
{

View File

@ -3233,6 +3233,148 @@ _efl_ui_textbox_item_factory_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data
return pd->item_factory;
}
/*Efl.Ui.Scrollable*/
EOLIAN static Eina_Size2D
_efl_ui_textbox_efl_ui_scrollable_content_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(sd->scroller, EINA_SIZE2D(0, 0));
return efl_ui_scrollable_content_size_get(sd->scroller);
}
EOLIAN static Eina_Rect
_efl_ui_textbox_efl_ui_scrollable_viewport_geometry_get(const Eo *obj EINA_UNUSED,
Efl_Ui_Textbox_Data *sd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(sd->scroller, EINA_RECT_EMPTY());
return efl_ui_scrollable_viewport_geometry_get(sd->scroller);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_match_content_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool w, Eina_Bool h)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
return efl_ui_scrollable_match_content_set(sd->scroller, !!w, !!h);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_step_size_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Position2D step)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_step_size_set(sd->scroller, step);
}
EOLIAN static Eina_Position2D
_efl_ui_textbox_efl_ui_scrollable_step_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(sd->scroller, EINA_POSITION2D(0, 0));
return efl_ui_scrollable_step_size_get(sd->scroller);
}
EOLIAN static Eina_Position2D
_efl_ui_textbox_efl_ui_scrollable_content_pos_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(sd->scroller, EINA_POSITION2D(0, 0));
return efl_ui_scrollable_content_pos_get(sd->scroller);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_content_pos_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Position2D pos)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_content_pos_set(sd->scroller, pos);
}
EOLIAN static Eina_Bool
_efl_ui_textbox_efl_ui_scrollable_scroll_hold_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(sd->scroller, EINA_FALSE);
return efl_ui_scrollable_scroll_hold_get(sd->scroller);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_scroll_hold_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool hold)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_scroll_hold_set(sd->scroller, !!hold);
}
EOLIAN static Eina_Bool
_efl_ui_textbox_efl_ui_scrollable_scroll_freeze_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(sd->scroller, EINA_FALSE);
return efl_ui_scrollable_scroll_freeze_get(sd->scroller);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_scroll_freeze_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool freeze)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_scroll_freeze_set(sd->scroller, !!freeze);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_bounce_enabled_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool horiz, Eina_Bool vert)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_bounce_enabled_set(sd->scroller, !!horiz, !!vert);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_bounce_enabled_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool *horiz, Eina_Bool *vert)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_bounce_enabled_get(sd->scroller, horiz, vert);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_scroll(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Rect rect, Eina_Bool animation)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_scroll(sd->scroller, rect, animation);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_gravity_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, double *x, double *y)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_gravity_get(sd->scroller, x, y);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_gravity_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, double x, double y)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_gravity_set(sd->scroller, x, y);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_movement_block_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Efl_Ui_Layout_Orientation block)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_movement_block_set(sd->scroller, block);
}
EOLIAN static Efl_Ui_Layout_Orientation
_efl_ui_textbox_efl_ui_scrollable_movement_block_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(sd->scroller, EFL_UI_LAYOUT_ORIENTATION_DEFAULT);
return efl_ui_scrollable_movement_block_get(sd->scroller);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_looping_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool loop_h, Eina_Bool loop_v)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_looping_set(sd->scroller, !!loop_h, !!loop_v);
}
EOLIAN static void
_efl_ui_textbox_efl_ui_scrollable_looping_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool *loop_h, Eina_Bool *loop_v)
{
EINA_SAFETY_ON_NULL_RETURN(sd->scroller);
efl_ui_scrollable_looping_get(sd->scroller, loop_h, loop_v);
}
/* Efl.Part begin */
static Eina_Bool

View File

@ -11,7 +11,7 @@ enum @beta Efl.Ui.Textbox_Cnp_Content {
}
class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Clickable,
Efl.Access.Text, Efl.Access.Editable.Text
Efl.Access.Text, Efl.Access.Editable.Text, Efl.Ui.Scrollable
composites
Efl.Text_Interactive, Efl.Text_Markup, Efl.Input_Text
{
@ -24,7 +24,11 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click
[[Enable or disable scrolling in the widget.
When scrolling is enabled scrollbars will appear if the text does
not fit the widget size.]]
not fit the widget size.
Direct control of the scroll through the @Efl.Ui.Scrollable interface
is only possible when this property is enabled.
]]
set {}
get {}
values {
@ -133,6 +137,18 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click
Efl.Access.Editable.Text.paste;
Efl.Text_Interactive.editable { set; }
Efl.Part.part_get;
Efl.Ui.Scrollable.content_pos { set; get; }
Efl.Ui.Scrollable.content_size{ get; }
Efl.Ui.Scrollable.viewport_geometry{ get; }
Efl.Ui.Scrollable.bounce_enabled { set; get; }
Efl.Ui.Scrollable.scroll_freeze { get; set; }
Efl.Ui.Scrollable.scroll_hold { get; set; }
Efl.Ui.Scrollable.looping { get; set; }
Efl.Ui.Scrollable.movement_block { get; set; }
Efl.Ui.Scrollable.gravity { get; set; }
Efl.Ui.Scrollable.match_content { set; }
Efl.Ui.Scrollable.step_size { set; get; }
Efl.Ui.Scrollable.scroll;
}
events {
selection,paste: void; [[Called when selection is pasted.]]

View File

@ -15,7 +15,7 @@
* It can act like a circular list with round mode and labels can be
* reduced for a defined length for side items.
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base @ref
* Scroller widget also work for diskselectors.
*

View File

@ -30,7 +30,7 @@
* This widget inherits from the @ref Elm_Layout one, so that all the
* functions acting on it also work for entry objects (since 1.8).
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base
* @ref Elm_Scroller widget also work for entries (since 1.8).
*

View File

@ -19,7 +19,7 @@
* This widget inherits from the @ref Layout one, so that all the
* functions acting on it also work for gengrid objects.
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base @ref
* Scroller widget also work for gengrids.
*

View File

@ -22,7 +22,7 @@
* This widget inherits from the @ref Layout one, so that all the
* functions acting on it also work for genlist objects.
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base @ref
* Scroller widget also work for genlists.
*

View File

@ -75,7 +75,7 @@
* @li @ref elm_object_item_del
* @li @ref elm_object_item_signal_emit
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base @ref
* Scroller widget also work for lists.
*

View File

@ -18,7 +18,7 @@
* @li group of markers and
* @li routes.
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base @ref
* Scroller widget also work for map objects.
*

View File

@ -42,7 +42,7 @@
* @li @c "focused" - When the photocam has received focus. (since 1.8)
* @li @c "unfocused" - When the photocam has lost focus. (since 1.8)
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base @ref
* Scroller widget also work for photocam objects.
*

View File

@ -19,7 +19,7 @@
*
* Items can have multiple states, or show menus when selected by the user.
*
* This widget implements the @b @ref elm-scrollable-interface
* This widget implements the @ref elm-scrollable-interface
* interface, so that all (non-deprecated) functions for the base
* @ref Scroller widget also work for toolbars (since 1.8)
*

View File

@ -402,7 +402,7 @@ evas_vg_shape_append_squadratic_to(Eo *obj, double x, double y)
EAPI void
evas_vg_shape_append_cubic_to(Eo *obj, double x, double y, double ctrl_x0, double ctrl_y0, double ctrl_x1, double ctrl_y1)
{
efl_gfx_path_append_cubic_to(obj, x, y, ctrl_x0, ctrl_y0, ctrl_x1, ctrl_y1);
efl_gfx_path_append_cubic_to(obj, ctrl_x0, ctrl_y0, ctrl_x1, ctrl_y1, x, y);
efl_canvas_vg_node_change(obj);
}

View File

@ -808,7 +808,7 @@ EOAPI int evas_canvas_coord_world_x_to_screen(const Eo *obj, int x) EINA_WARN_UN
* @param[in] obj The object.
*
* @return A newly allocated list of updated rectangles of the canvas
* (@Eina.Rect structs). Free this list with @ref evas_render_updates_free.
* (@ref Eina_Rect structs). Free this list with @ref evas_render_updates_free.
*
* @ingroup Evas_Canvas
*/

View File

@ -445,7 +445,9 @@ _evas_box_efl_gfx_entity_position_set(Eo *o, Evas_Object_Box_Data *_pd EINA_UNUS
if (_evas_object_intercept_call(o, EVAS_OBJECT_INTERCEPT_CB_MOVE , 0, pos.x, pos.y))
return;
efl_gfx_entity_position_set(cso->clipper, pos);
if (!evas_object_static_clip_get(cso->clipper))
efl_gfx_entity_position_set(cso->clipper, pos);
/* this skips the call to _evas_object_smart_clipped_smart_move_internal
* since box internals will automatically recalc all the child positions
* at a later point

View File

@ -557,24 +557,24 @@ static void evas_object_textblock_render(Evas_Object *eo_obj,
int x, int y, Eina_Bool do_async);
static void evas_object_textblock_free(Evas_Object *eo_obj);
static void evas_object_textblock_render_pre(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void evas_object_textblock_render_post(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
Evas_Object_Protected_Data *obj,
void *type_private_data);
static Evas_Object_Textblock_Node_Text *_evas_textblock_node_text_new(void);
static void *evas_object_textblock_engine_data_get(Evas_Object *eo_obj);
static int evas_object_textblock_is_opaque(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
Evas_Object_Protected_Data *obj,
void *type_private_data);
static int evas_object_textblock_was_opaque(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void evas_object_textblock_coords_recalc(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void _canvas_text_format_changed(Eo *eo_obj, Efl_Canvas_Textblock_Data *o);
static const Evas_Object_Func object_func =
@ -6350,7 +6350,7 @@ _layout_handle_ellipsis(Ctxt *c, Evas_Object_Textblock_Item *it, Eina_List *i)
/* Don't do much for the meanwhile. */
static inline void
_layout_paragraph_render(Efl_Canvas_Textblock_Data *o,
Evas_Object_Textblock_Paragraph *par)
Evas_Object_Textblock_Paragraph *par)
{
if (par->rendered)
return;
@ -14504,7 +14504,7 @@ evas_object_textblock_init(Evas_Object *eo_obj)
linebreak_init = EINA_TRUE;
init_linebreak();
init_wordbreak();
init_graphemebreak();
init_graphemebreak();
}
o = obj->private_data;
@ -15762,8 +15762,8 @@ evas_object_textblock_coords_recalc(Evas_Object *eo_obj,
static void
evas_object_textblock_render_pre(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data)
Evas_Object_Protected_Data *obj,
void *type_private_data)
{
Efl_Canvas_Textblock_Data *o = type_private_data;
ASYNC_BLOCK;

View File

@ -379,6 +379,9 @@ _evas_proxy_redraw_set(Evas_Public_Data *e, Evas_Object_Protected_Data *obj,
if (render)
{
/* Not good... but make it sure if the proxies have missed at update
if its sources are remained changed as pending objects in the prev frame. */
evas_object_change(eo_proxy, proxy);
proxy->func->render_pre(eo_proxy, proxy, proxy->private_data);
_evas_render_prev_cur_clip_cache_add(e, proxy);
}

View File

@ -60,7 +60,7 @@
as possible.
Note: Lua has been used since 1.10. The previous filters syntax is not
garanteed to be compatible with 1.10 and newer versions.
guaranteed to be compatible with 1.10 and newer versions.
Here are the available commands:
<ul>
@ -136,28 +136,28 @@
will be opaque (alpha = @c 0xFF), unless R=G=B=0 (invisible).
These colors are <b>not</b> premultiplied.
</li>
<li>Hexademical values: @c '#RRGGBB', @c '#RRGGBBAA', @c '#RGB', @c '#RGBA'</li>
<li>Hexadecimal values: @c '\#RRGGBB', @c '\#RRGGBBAA', @c '\#RGB', @c '\#RGBA'</li>
<li>The following string values are also accepted:</li>
<tt><ul>
<li>'white' == '#FFFFFF'</li>
<li>'black' == '#000000'</li>
<li>'red' == '#FF0000'</li>
<li>'green' == '#008000'</li>
<li>'blue' == '#0000FF'</li>
<li>'darkblue' == '#0000A0'</li>
<li>'yellow' == '#FFFF00'</li>
<li>'magenta' == '#FF00FF'</li>
<li>'cyan' == '#00FFFF'</li>
<li>'orange' == '#FFA500'</li>
<li>'purple' == '#800080'</li>
<li>'brown' == '#A52A2A'</li>
<li>'maroon' == '#800000'</li>
<li>'lime' == '#00FF00'</li>
<li>'gray' == '#808080'</li>
<li>'grey' == '#808080'</li>
<li>'silver' == '#C0C0C0'</li>
<li>'olive' == '#808000'</li>
<li>'invisible', 'transparent' == '#0000' -- (alpha is zero)</li>
<li>'white' == '\#FFFFFF'</li>
<li>'black' == '\#000000'</li>
<li>'red' == '\#FF0000'</li>
<li>'green' == '\#008000'</li>
<li>'blue' == '\#0000FF'</li>
<li>'darkblue' == '\#0000A0'</li>
<li>'yellow' == '\#FFFF00'</li>
<li>'magenta' == '\#FF00FF'</li>
<li>'cyan' == '\#00FFFF'</li>
<li>'orange' == '\#FFA500'</li>
<li>'purple' == '\#800080'</li>
<li>'brown' == '\#A52A2A'</li>
<li>'maroon' == '\#800000'</li>
<li>'lime' == '\#00FF00'</li>
<li>'gray' == '\#808080'</li>
<li>'grey' == '\#808080'</li>
<li>'silver' == '\#C0C0C0'</li>
<li>'olive' == '\#808000'</li>
<li>'invisible', 'transparent' == '\#0000' -- (alpha is zero)</li>
</ul></tt>
</ul>
<li>@c fillmode</li>
@ -1173,7 +1173,7 @@ _blur_instruction_prepare(Evas_Filter_Program *pgm, Evas_Filter_Instruction *ins
@param src Source buffer. This should be an alpha buffer.
@param dst Destination buffer. This should be an RGBA buffer (although alpha is supported). Must be of the same size as @a src.
@param black The shadows' color. Usually this will be black (@c #000).
@param white The specular light's color. Usually this will be white (@c #FFF).
@param white The specular light's color. Usually this will be white (@c \#FFF).
@param fillmode This specifies how to handle @a map when its dimensions don't match those of @a src and @a dst. Default is to @c repeat. See @ref evasfilter_fillmode "fillmodes".
@note As of 2014/02/11, the ALPHA to RGBA support is of much better quality than ALPHA only, but @b very slow. RGBA sources are not supported yet.

View File

@ -3,7 +3,6 @@
#include "efl_canvas_gesture_private.h"
#define MY_CLASS EFL_CANVAS_GESTURE_MANAGER_CLASS
#define EFL_GESTURE_RECOGNIZER_TYPE_TAP_FINGER_SIZE 10
typedef struct _Object_Gesture
{
@ -140,6 +139,7 @@ EOLIAN static Efl_Object *
_efl_canvas_gesture_manager_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_Manager_Data *pd)
{
Eo *config;
int finger_size = 0;
obj = efl_constructor(efl_super(obj, MY_CLASS));
pd->m_recognizers = eina_hash_pointer_new(EINA_FREE_CB(_hash_unref_cb));
@ -150,7 +150,6 @@ _efl_canvas_gesture_manager_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_M
/* this needs to always be present */
config = efl_provider_find(efl_main_loop_get(), EFL_CONFIG_INTERFACE);
efl_config_int_set(config, "glayer_tap_finger_size", EFL_GESTURE_RECOGNIZER_TYPE_TAP_FINGER_SIZE);
efl_event_callback_add(config, EFL_CONFIG_EVENT_CONFIG_CHANGED, _gesture_manager_config_changed, pd);
//Register all types of recognizers at very first time.
@ -162,7 +161,12 @@ _efl_canvas_gesture_manager_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_M
efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_FLICK_CLASS, obj));
efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_ROTATE_CLASS, obj));
efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_ZOOM_CLASS, obj));
_update_finger_sizes(pd, EFL_GESTURE_RECOGNIZER_TYPE_TAP_FINGER_SIZE);
/* realistically this will never fail, but the whole gesture layer breaks if this is 0 */
finger_size = efl_config_int_get(config, "glayer_tap_finger_size");
if (!getenv("EFL_RUN_IN_TREE"))
finger_size = efl_config_int_get(config, "glayer_tap_finger_size");
if (finger_size < 1) finger_size = 10;
_update_finger_sizes(pd, finger_size);
return obj;
}