exactness/src/lib/tsuite_hook_recorder.c

796 lines
25 KiB
C
Raw Normal View History

#define _GNU_SOURCE 1
#define EFL_EO_API_SUPPORT
#define EFL_BETA_API_SUPPORT
#include <Eo.h>
#include <Eet.h>
#include <Evas.h>
#include <Ecore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/sysinfo.h>
#include <dlfcn.h>
#include "tsuite_file_data.h"
#include "exactness_private.h"
#define TSUITE_MAX_PATH 1024
#define SHOT_KEY_STR "F2"
#define SAVE_KEY_STR "F3"
#define IMAGE_FILENAME_EXT ".png"
struct _evas_hook_setting
{
char *dest_dir;
char *test_name;
char *file_name;
Eina_Bool verbose;
};
typedef struct _evas_hook_setting evas_hook_setting;
static char *shot_key = SHOT_KEY_STR;
static Lists_st *vr_list = NULL;
static evas_hook_setting *_hook_setting = NULL;
static Tsuite_Data ts;
static Eina_List *evas_list = NULL; /* List of Evas pointers */
static Tsuite_Event_Type
tsuite_event_pointer_type_get(Efl_Pointer_Action t)
{
switch(t)
{
case EFL_POINTER_ACTION_IN: return TSUITE_EVENT_MOUSE_IN;
case EFL_POINTER_ACTION_OUT: return TSUITE_EVENT_MOUSE_OUT;
case EFL_POINTER_ACTION_DOWN: return TSUITE_EVENT_MULTI_DOWN;
case EFL_POINTER_ACTION_UP: return TSUITE_EVENT_MULTI_UP;
case EFL_POINTER_ACTION_MOVE: return TSUITE_EVENT_MULTI_MOVE;
case EFL_POINTER_ACTION_WHEEL: return TSUITE_EVENT_MOUSE_WHEEL;
default:
return TSUITE_EVENT_NOT_SUPPORTED;
}
}
#ifdef DEBUG_TSUITE
static const char *
_event_name_get(Tsuite_Event_Type type)
{
switch(type)
{
case TSUITE_EVENT_MOUSE_IN: return "Mouse In";
case TSUITE_EVENT_MOUSE_OUT: return "Mouse Out";
case TSUITE_EVENT_MOUSE_DOWN: return "Mouse Down";
case TSUITE_EVENT_MOUSE_UP: return "Mouse Up";
case TSUITE_EVENT_MOUSE_MOVE: return "Mouse Move";
case TSUITE_EVENT_MOUSE_WHEEL: return "Mouse Wheel";
case TSUITE_EVENT_MULTI_DOWN: return "Multi Down";
case TSUITE_EVENT_MULTI_UP: return "Multi Up";
case TSUITE_EVENT_MULTI_MOVE: return "Multi Move";
case TSUITE_EVENT_KEY_DOWN: return "Key Down";
case TSUITE_EVENT_KEY_UP: return "Key Up";
case TSUITE_EVENT_KEY_DOWN_WITH_KEYCODE: return "Key Down with Keycode";
case TSUITE_EVENT_KEY_UP_WITH_KEYCODE: return "Key Up with Keycode";
case TSUITE_EVENT_TAKE_SHOT: return "Take shot";
default: return NULL;
}
}
#endif
static Eina_Bool
_is_hook_duplicate(const Variant_st *v, Tsuite_Event_Type ev_type, const void *info, int len)
{
if (v->t.type == tsuite_event_mapping_type_str_get(ev_type) &&
!memcmp(v->data, info, len)) return EINA_TRUE;
return EINA_FALSE;
}
/* Adding variant to list, this list is later written to EET file */
#define ADD_TO_LIST(EVT_TYPE, INFO) \
do { /* This macro will add event to EET data list */ \
if (vr_list) \
{ \
const Variant_st *prev_v = eina_list_last_data_get(vr_list->variant_list); \
if (!prev_v || !_is_hook_duplicate(prev_v, EVT_TYPE, &INFO, sizeof(INFO))) \
{ \
printf("Recording %s\n", tsuite_event_mapping_type_str_get(EVT_TYPE)); \
Variant_st *v = malloc(sizeof(Variant_st)); \
v->data = malloc(sizeof(INFO)); \
_variant_type_set(tsuite_event_mapping_type_str_get(EVT_TYPE), \
&v->t, EINA_FALSE); \
memcpy(v->data, &INFO, sizeof(INFO)); \
vr_list->variant_list = eina_list_append(vr_list->variant_list, v); \
} \
} \
} while (0)
static int
evas_list_find(void *ptr)
{ /* We just compare the pointers */
Eina_List *l;
void *data;
int n = 0;
EINA_LIST_FOREACH(evas_list, l, data)
{ /* Get the nuber of Evas Pointer */
if (ptr == data)
{
return n;
}
n++;
}
return -1;
}
static void
_evas_hook_init(void)
{ /* Pointer taken from tsuite.c */
shot_key = getenv("TSUITE_SHOT_KEY");
if (!shot_key) shot_key = SHOT_KEY_STR;
if (!vr_list)
{
struct sysinfo s_info;
sysinfo(&s_info);
vr_list = calloc(1, sizeof(*vr_list));
vr_list->first_timestamp = s_info.uptime * 1000;
#ifdef DEBUG_TSUITE
printf("Uptime=<%u>\n", vr_list->first_timestamp);
#endif
}
}
static int _ecore_init_count = 0;
EAPI int
ecore_init(void)
{
Eina_Bool initing = EINA_FALSE;
int ret;
int (*_ecore_init)(void) =
dlsym(RTLD_NEXT, "ecore_init");
_ecore_init_count++;
if ((_ecore_init_count == 1) && (!_hook_setting))
{
const char *tmp;
_hook_setting = calloc(1, sizeof(evas_hook_setting));
_hook_setting->dest_dir = getenv("TSUITE_DEST_DIR");
_hook_setting->test_name = getenv("TSUITE_TEST_NAME");
_hook_setting->file_name = getenv("TSUITE_FILE_NAME");
tmp = getenv("TSUITE_VERBOSE");
if (tmp)
_hook_setting->verbose = atoi(tmp);
#ifdef DEBUG_TSUITE
printf("<%s> test_name=<%s>\n", __func__, _hook_setting->test_name);
printf("<%s> dest_dir=<%s>\n", __func__, _hook_setting->dest_dir);
printf("<%s> rec file is <%s>\n", __func__, _hook_setting->file_name);
#endif
initing = EINA_TRUE;
}
ret = _ecore_init();
eet_init();
if (initing)
{
_evas_hook_init();
}
return ret;
}
EAPI int
ecore_shutdown(void)
{
int (*_ecore_shutdown)(void) =
dlsym(RTLD_NEXT, "ecore_shutdown");
_ecore_init_count--;
if (_ecore_init_count == 0)
{
if (_hook_setting)
{
if (vr_list)
write_events(_hook_setting->file_name, vr_list);
vr_list = free_events(vr_list, EINA_TRUE);
free(_hook_setting);
_hook_setting = NULL;
}
if (ts.td)
free(ts.td);
evas_list = eina_list_free(evas_list);
memset(&ts, 0, sizeof(Tsuite_Data));
}
eet_shutdown();
return _ecore_shutdown();
}
static void
_event_pointer_cb(void *data, const Efl_Event *event)
{
Eo *eo_e = data;
Eo *evp = event->info;
if (!evp) return;
int timestamp = efl_input_timestamp_get(evp);
int n_evas = evas_list_find(eo_e);
Efl_Pointer_Action action = efl_input_pointer_action_get(evp);
Tsuite_Event_Type evt = tsuite_event_pointer_type_get(action);
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling \"%s\" timestamp=<%u>\n", _event_name_get(evt), timestamp);
#endif
switch (action)
{
case EFL_POINTER_ACTION_MOVE:
{
double rad = 0, radx = 0, rady = 0, pres = 0, ang = 0, fx = 0, fy = 0;
int tool = efl_input_pointer_tool_get(evp);
int x = 0, y = 0;
efl_input_pointer_position_get(evp, &x, &y);
multi_move t = { tool, x, y, rad, radx, rady, pres, ang, fx, fy, timestamp, n_evas };
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
break;
}
case EFL_POINTER_ACTION_DOWN: case EFL_POINTER_ACTION_UP:
{
double rad = 0, radx = 0, rady = 0, pres = 0, ang = 0, fx = 0, fy = 0;
int b = efl_input_pointer_button_get(evp);
int tool = efl_input_pointer_tool_get(evp);
int x = 0, y = 0;
efl_input_pointer_position_get(evp, &x, &y);
Efl_Pointer_Flags flags = efl_input_pointer_button_flags_get(evp);
multi_event t = { tool, b, x, y, rad, radx, rady, pres, ang,
fx, fy, flags, timestamp, n_evas };
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
break;
}
case EFL_POINTER_ACTION_IN: case EFL_POINTER_ACTION_OUT:
{
mouse_in_mouse_out t = { timestamp, n_evas };
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
break;
}
case EFL_POINTER_ACTION_WHEEL:
{
int direction = efl_input_pointer_wheel_direction_get(evp);
int z = efl_input_pointer_wheel_delta_get(evp);
mouse_wheel t = { direction, z, timestamp, n_evas };
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
break;
}
default:
break;
}
}
static void
_event_key_cb(void *data, const Efl_Event *event)
{
Efl_Input_Key *evk = event->info;
Eo *eo_e = data;
if (!evk) return;
const char *key = efl_input_key_name_get(evk);
int timestamp = efl_input_timestamp_get(evk);
int n_evas = evas_list_find(eo_e);
Tsuite_Event_Type evt = TSUITE_EVENT_KEY_UP_WITH_KEYCODE;
if (efl_input_key_pressed_get(evk))
{
if (!strcmp(key, shot_key))
{
#ifdef DEBUG_TSUITE
printf("Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp);
#endif
take_screenshot t = { timestamp, n_evas };
if (t.n_evas >= 0) ADD_TO_LIST(TSUITE_EVENT_TAKE_SHOT, t);
return;
}
if (!strcmp(key, SAVE_KEY_STR))
{
if (_hook_setting)
{
if (vr_list)
write_events(_hook_setting->file_name, vr_list);
#ifdef DEBUG_TSUITE
printf("Save events: %s timestamp=<%u>\n", __func__, timestamp);
#endif
}
return;
}
evt = TSUITE_EVENT_KEY_DOWN_WITH_KEYCODE;
}
else
{
if (!strcmp(key, shot_key) || !strcmp(key, SAVE_KEY_STR)) return;
}
if (vr_list)
{ /* Construct duplicate strings, free them when list if freed */
key_down_key_up_with_keycode t;
t.timestamp = timestamp;
t.keyname = eina_stringshare_add(key);
t.key = eina_stringshare_add(efl_input_key_get(evk));
t.string = eina_stringshare_add(efl_input_key_string_get(evk));
t.compose = eina_stringshare_add(efl_input_key_compose_get(evk));
t.keycode = efl_input_key_code_get(evk);
t.n_evas = n_evas;
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
}
}
// note: "hold" event comes from above (elm), not below (ecore)
EFL_CALLBACKS_ARRAY_DEFINE(_event_pointer_callbacks,
{ EFL_EVENT_POINTER_MOVE, _event_pointer_cb },
{ EFL_EVENT_POINTER_DOWN, _event_pointer_cb },
{ EFL_EVENT_POINTER_UP, _event_pointer_cb },
{ EFL_EVENT_POINTER_IN, _event_pointer_cb },
{ EFL_EVENT_POINTER_OUT, _event_pointer_cb },
{ EFL_EVENT_POINTER_WHEEL, _event_pointer_cb },
{ EFL_EVENT_FINGER_MOVE, _event_pointer_cb },
{ EFL_EVENT_FINGER_DOWN, _event_pointer_cb },
{ EFL_EVENT_FINGER_UP, _event_pointer_cb },
{ EFL_EVENT_KEY_DOWN, _event_key_cb },
{ EFL_EVENT_KEY_UP, _event_key_cb }
)
EAPI Evas *
evas_new(void)
{
Evas * (*_evas_new)(void) = dlsym(RTLD_NEXT, __FUNCTION__);
Evas *evas = _evas_new();
evas_list = eina_list_append(evas_list, evas);
efl_event_callback_array_add(evas, _event_pointer_callbacks(), evas);
#ifdef DEBUG_TSUITE
printf("Appended EVAS=<%p> list size=<%d>\n", evas, eina_list_count(evas_list));
#endif
return evas;
}
static Tsuite_Event_Type
tsuite_event_type_get(Evas_Callback_Type t)
{
switch(t)
{
case EVAS_CALLBACK_MOUSE_IN:
return TSUITE_EVENT_MOUSE_IN;
case EVAS_CALLBACK_MOUSE_OUT:
return TSUITE_EVENT_MOUSE_OUT;
case EVAS_CALLBACK_MOUSE_DOWN:
return TSUITE_EVENT_MOUSE_DOWN;
case EVAS_CALLBACK_MOUSE_UP:
return TSUITE_EVENT_MOUSE_UP;
case EVAS_CALLBACK_MOUSE_MOVE:
return TSUITE_EVENT_MOUSE_MOVE;
case EVAS_CALLBACK_MOUSE_WHEEL:
return TSUITE_EVENT_MOUSE_WHEEL;
case EVAS_CALLBACK_MULTI_DOWN:
return TSUITE_EVENT_MULTI_DOWN;
case EVAS_CALLBACK_MULTI_UP:
return TSUITE_EVENT_MULTI_UP;
case EVAS_CALLBACK_MULTI_MOVE:
return TSUITE_EVENT_MULTI_MOVE;
case EVAS_CALLBACK_KEY_DOWN:
return TSUITE_EVENT_KEY_DOWN;
case EVAS_CALLBACK_KEY_UP:
return TSUITE_EVENT_KEY_UP;
default:
return TSUITE_EVENT_NOT_SUPPORTED;
}
}
EAPI void
evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
mouse_in_mouse_out t = { timestamp, evas_list_find(e) };
int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_IN);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
orig(e, timestamp, data);
}
EAPI void
evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
mouse_in_mouse_out t = { timestamp, evas_list_find(e) };
int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_OUT);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
orig(e, timestamp, data);
}
EAPI void
evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags,
unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
mouse_down_mouse_up t = { b, flags, timestamp, evas_list_find(e) };
int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_DOWN);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int b, Evas_Button_Flags flags,
unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
orig(e, b, flags, timestamp, data);
}
EAPI void
evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags,
unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
mouse_down_mouse_up t = { b, flags, timestamp, evas_list_find(e) };
int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_UP);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int b, Evas_Button_Flags flags,
unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
orig(e, b, flags, timestamp, data);
}
EAPI void
evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp,
const void *data)
{
if (!timestamp) return;
mouse_move t = { x, y, timestamp, evas_list_find(e) };
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_MOVE);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int x, int y, unsigned int timestamp,
const void *data) = dlsym(RTLD_NEXT, __func__);
orig(e, x, y, timestamp, data);
}
/* FIXME: Handle framespace. */
EAPI void
evas_event_input_mouse_move(Evas *e, int x, int y, unsigned int timestamp,
const void *data)
{
if (!timestamp) return;
mouse_move t = { x, y, timestamp, evas_list_find(e) };
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_MOVE);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int x, int y, unsigned int timestamp,
const void *data) = dlsym(RTLD_NEXT, __func__);
orig(e, x, y, timestamp, data);
}
EAPI void
evas_event_feed_mouse_wheel(Evas *e, int direction, int z,
unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
mouse_wheel t = { direction, z, timestamp, evas_list_find(e) };
int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_WHEEL);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int direction, int z, unsigned int timestamp,
const void *data) = dlsym(RTLD_NEXT, __func__);
orig(e, direction, z, timestamp, data);
}
EAPI void
evas_event_feed_multi_down(Evas *e, int d, int x, int y,
double rad, double radx, double rady, double pres, double ang,
double fx, double fy, Evas_Button_Flags flags,
unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
multi_event t = { d, 0, x, y, rad, radx, rady, pres, ang,
fx, fy, flags, timestamp, evas_list_find(e)};
int evt = tsuite_event_type_get(EVAS_CALLBACK_MULTI_DOWN);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int d, int x, int y, double rad,
double radx, double rady, double pres, double ang,
double fx, double fy, Evas_Button_Flags flags,
unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
orig(e, d, x, y, rad, radx, rady, pres, ang, fx, fy, flags, timestamp, data);
}
EAPI void
evas_event_feed_multi_up(Evas *e, int d, int x, int y,
double rad, double radx, double rady, double pres, double ang,
double fx, double fy, Evas_Button_Flags flags,
unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
multi_event t = { d, 0, x, y, rad, radx, rady, pres, ang, fx, fy, flags, timestamp, evas_list_find(e) };
int evt = tsuite_event_type_get(EVAS_CALLBACK_MULTI_UP);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int d, int x, int y, double rad,
double radx, double rady, double pres, double ang,
double fx, double fy, Evas_Button_Flags flags,
unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
orig(e, d, x, y, rad, radx, rady, pres, ang, fx, fy, flags, timestamp, data);
}
EAPI void
evas_event_feed_multi_move(Evas *e, int d, int x, int y, double rad,
double radx, double rady, double pres, double ang,
double fx, double fy, unsigned int timestamp, const void *data)
{
if (!timestamp) return;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
multi_move t = { d, x, y, rad, radx, rady, pres, ang, fx, fy, timestamp, evas_list_find(e) };
int evt = tsuite_event_type_get(EVAS_CALLBACK_MULTI_MOVE);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
void (*orig) (Evas *e, int d, int x, int y, double rad,
double radx, double rady, double pres, double ang,
double fx, double fy, unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
orig(e, d, x, y, rad, radx, rady, pres, ang, fx, fy, timestamp, data);
}
EAPI void
evas_event_feed_key_down(Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data)
{
if (!timestamp) return;
int evt = tsuite_event_type_get(EVAS_CALLBACK_KEY_DOWN);
void (*orig) (Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
if (!strcmp(key, shot_key))
{
#ifdef DEBUG_TSUITE
printf("Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp);
#endif
take_screenshot t = { timestamp, evas_list_find(e) };
if (t.n_evas >= 0) ADD_TO_LIST(TSUITE_EVENT_TAKE_SHOT, t);
orig(e, keyname, key, string, compose, timestamp, data);
return;
}
if (!strcmp(key, SAVE_KEY_STR))
{
if (_hook_setting)
{
if (vr_list)
write_events(_hook_setting->file_name, vr_list);
#ifdef DEBUG_TSUITE
printf("Save events: %s timestamp=<%u>\n", __func__, timestamp);
#endif
}
return;
}
if (vr_list)
{ /* Construct duplicate strings, free them when list if freed */
key_down_key_up t;
t.timestamp = timestamp;
t.keyname = eina_stringshare_add(keyname);
t.key = eina_stringshare_add(key);
t.string = eina_stringshare_add(string);
t.compose = eina_stringshare_add(compose);
t.n_evas = evas_list_find(e);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
}
orig(e, keyname, key, string, compose, timestamp, data);
}
EAPI void
evas_event_feed_key_up(Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data)
{
if (!timestamp) return;
void (*orig) (Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data) =
dlsym(RTLD_NEXT, __func__);
if (!strcmp(key, shot_key))
{
#ifdef DEBUG_TSUITE
printf("Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp);
#endif
orig(e, keyname, key, string, compose, timestamp, data);
return; /* Take screenshot done on key-down */
}
if (!strcmp(key, SAVE_KEY_STR))
{
#ifdef DEBUG_TSUITE
printf("Save events: %s timestamp=<%u>\n", __func__, timestamp);
#endif
orig(e, keyname, key, string, compose, timestamp, data);
return; /* Save events done on key-down */
}
int evt = { tsuite_event_type_get(EVAS_CALLBACK_KEY_UP) };
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
if (vr_list)
{ /* Construct duplicate strings, free them when list if freed */
key_down_key_up t;
t.timestamp = timestamp;
t.keyname = eina_stringshare_add(keyname);
t.key = eina_stringshare_add(key);
t.string = eina_stringshare_add(string);
t.compose = eina_stringshare_add(compose);
t.n_evas = evas_list_find(e);
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
}
orig(e, keyname, key, string, compose, timestamp, data);
}
EAPI void
evas_event_feed_key_down_with_keycode(Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data, unsigned int keycode)
{
if (!timestamp) return;
int evt = TSUITE_EVENT_KEY_DOWN_WITH_KEYCODE;
void (*orig) (Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data, unsigned int keycode) =
dlsym(RTLD_NEXT, __func__);
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
if (!strcmp(key, shot_key))
{
#ifdef DEBUG_TSUITE
printf("Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp);
#endif
take_screenshot t = { timestamp, evas_list_find(e) };
if (t.n_evas >= 0) ADD_TO_LIST(TSUITE_EVENT_TAKE_SHOT, t);
orig(e, keyname, key, string, compose, timestamp, data, keycode);
return;
}
if (!strcmp(key, SAVE_KEY_STR))
{
if (_hook_setting)
{
if (vr_list)
write_events(_hook_setting->file_name, vr_list);
#ifdef DEBUG_TSUITE
printf("Save events: %s timestamp=<%u>\n", __func__, timestamp);
#endif
}
return;
}
if (vr_list)
{ /* Construct duplicate strings, free them when list if freed */
key_down_key_up_with_keycode t;
t.timestamp = timestamp;
t.keyname = eina_stringshare_add(keyname);
t.key = eina_stringshare_add(key);
t.string = eina_stringshare_add(string);
t.compose = eina_stringshare_add(compose);
t.n_evas = evas_list_find(e);
t.keycode = keycode;
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
}
orig(e, keyname, key, string, compose, timestamp, data, keycode);
}
EAPI void
evas_event_feed_key_up_with_keycode(Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data, unsigned int keycode)
{
if (!timestamp) return;
void (*orig) (Evas *e, const char *keyname, const char *key,
const char *string, const char *compose,
unsigned int timestamp, const void *data, unsigned int keycode) =
dlsym(RTLD_NEXT, __func__);
if (!strcmp(key, shot_key))
{
#ifdef DEBUG_TSUITE
printf("Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp);
#endif
orig(e, keyname, key, string, compose, timestamp, data, keycode);
return; /* Take screenshot done on key-down */
}
if (!strcmp(key, SAVE_KEY_STR))
{
#ifdef DEBUG_TSUITE
printf("Save events: %s timestamp=<%u>\n", __func__, timestamp);
#endif
orig(e, keyname, key, string, compose, timestamp, data, keycode);
return; /* Save events done on key-down */
}
int evt = TSUITE_EVENT_KEY_UP_WITH_KEYCODE;
#ifdef DEBUG_TSUITE
printf("Calling %s timestamp=<%u>\n", __func__, timestamp);
#endif
if (vr_list)
{ /* Construct duplicate strings, free them when list if freed */
key_down_key_up_with_keycode t;
t.timestamp = timestamp;
t.keyname = eina_stringshare_add(keyname);
t.key = eina_stringshare_add(key);
t.string = eina_stringshare_add(string);
t.compose = eina_stringshare_add(compose);
t.n_evas = evas_list_find(e);
t.keycode = keycode;
if (t.n_evas >= 0) ADD_TO_LIST(evt, t);
}
orig(e, keyname, key, string, compose, timestamp, data, keycode);
}