@ -18,6 +18,7 @@
# define TSUITE_MAX_PATH 1024
# define IMAGE_FILENAME_EXT ".png"
# define OBJECTS_FILENAME_EXT ".eet"
struct _evas_hook_setting
{
@ -25,6 +26,7 @@ struct _evas_hook_setting
char * test_name ;
char * file_name ;
Eina_Bool verbose ;
Eina_Bool store_objects ;
} ;
typedef struct _evas_hook_setting evas_hook_setting ;
@ -34,6 +36,15 @@ static Tsuite_Data ts;
static Eina_List * evas_list = NULL ; /* List of Evas pointers */
static int ignore_evas_new = 0 ; /* Counter to know if we should ignore evas new or not. */
typedef struct
{
const char * kl_name ;
int last ;
} Main_Widget_Id ;
static Eina_List * _main_widget_ids = NULL ;
static Object_Info _widgets_list = { 0 } ;
static void _objects_snapshot_do ( ) ;
static void
_tsuite_verbosef ( const char * fmt , . . . )
{
@ -85,7 +96,6 @@ _shot_do(char *name, Evas *e)
filename = malloc ( strlen ( _hook_setting - > test_name ) + strlen ( IMAGE_FILENAME_EXT ) +
dir_name_len + 8 ) ; /* also space for serial */
ts . serial + + ;
if ( _hook_setting - > dest_dir )
sprintf ( filename , " %s/ " , _hook_setting - > dest_dir ) ;
@ -142,6 +152,7 @@ ecore_init(void)
_hook_setting - > dest_dir = getenv ( " TSUITE_DEST_DIR " ) ;
_hook_setting - > test_name = getenv ( " TSUITE_TEST_NAME " ) ;
_hook_setting - > file_name = getenv ( " TSUITE_FILE_NAME " ) ;
_hook_setting - > store_objects = ! ! getenv ( " TSUITE_STORE_OBJECTS " ) ;
tmp = getenv ( " TSUITE_VERBOSE " ) ;
if ( tmp )
_hook_setting - > verbose = atoi ( tmp ) ;
@ -459,10 +470,12 @@ tsuite_feed_event(void *data)
printf ( " %s take shot timestamp=<%u> t->n_evas=<%d> \n " , __func__ , t - > timestamp , t - > n_evas ) ;
# endif
if ( rect ) evas_object_color_set ( rect , 0 , 0 , 255 , 255 ) ;
ts . serial + + ;
if ( _hook_setting - > dest_dir )
{
_shot_do ( NULL ,
eina_list_nth ( evas_list , t - > n_evas ) ) ; /* Serial name based on test-name */
if ( _hook_setting - > store_objects ) _objects_snapshot_do ( ) ;
}
break ;
}
@ -547,3 +560,149 @@ ecore_main_loop_begin(void)
return _ecore_main_loop_begin ( ) ;
}
static void
_obj_del ( void * data EINA_UNUSED , const Efl_Event * event )
{
Eo * parent = efl_parent_get ( event - > object ) ;
Object_Info * info = efl_key_data_get ( event - > object , " exactness_info " ) ;
if ( parent )
{
Object_Info * parent_info = parent ? efl_key_data_get ( parent , " exactness_info " ) : NULL ;
if ( parent_info ) parent_info - > children = eina_list_remove ( parent_info - > children , info ) ;
}
else
{
_widgets_list . children = eina_list_remove ( _widgets_list . children , info ) ;
}
efl_key_data_set ( event - > object , " exactness_info " , NULL ) ;
eina_stringshare_del ( info - > kl_name ) ;
free ( info ) ;
}
EAPI Eo *
_efl_add_internal_start ( const char * file , int line , const Efl_Class * klass_id , Eo * parent_id , Eina_Bool ref , Eina_Bool is_fallback )
{
Eo * ( * foo ) ( const char * , int , const Efl_Class * , Eo * , Eina_Bool , Eina_Bool ) =
dlsym ( RTLD_NEXT , __FUNCTION__ ) ;
Eo * ret = foo ( file , line , klass_id , parent_id , ref , is_fallback ) ;
if ( ! efl_isa ( ret , EFL_CANVAS_INTERFACE ) & & ! efl_isa ( ret , EFL_CANVAS_OBJECT_CLASS ) ) goto end ;
efl_event_callback_add ( ret , EFL_EVENT_DEL , _obj_del , NULL ) ;
end :
return ret ;
}
EOAPI void
efl_parent_set ( Eo * obj , Efl_Object * new_parent )
{
void ( * foo ) ( Eo * , Efl_Object * ) = dlsym ( RTLD_NEXT , __FUNCTION__ ) ;
Object_Info * info = NULL ;
if ( ! efl_isa ( obj , EFL_CANVAS_INTERFACE ) & & ! efl_isa ( obj , EFL_CANVAS_OBJECT_CLASS ) ) goto end ;
info = efl_key_data_get ( obj , " exactness_info " ) ;
if ( ! info )
{
info = calloc ( 1 , sizeof ( * info ) ) ;
info - > object = obj ;
info - > kl_name = eina_stringshare_add ( efl_class_name_get ( obj ) ) ;
efl_key_data_set ( obj , " exactness_info " , info ) ;
}
Eo * old_parent = efl_parent_get ( obj ) ;
if ( info - > id & & old_parent = = new_parent ) goto end ;
if ( old_parent )
{
Object_Info * old_parent_info = efl_key_data_get ( old_parent , " exactness_info " ) ;
if ( old_parent_info )
old_parent_info - > children = eina_list_remove ( old_parent_info - > children , info ) ;
int last_parent_id = ( intptr_t ) efl_key_data_get ( old_parent , info - > kl_name ) ;
if ( info - > id & & last_parent_id = = info - > id )
efl_key_data_set ( old_parent , info - > kl_name , ( void * ) ( intptr_t ) ( last_parent_id - 1 ) ) ;
}
else
{
Eina_List * itr ;
Main_Widget_Id * wid ;
EINA_LIST_FOREACH ( _main_widget_ids , itr , wid )
{
if ( info - > kl_name = = wid - > kl_name ) goto found_old_parent ;
}
wid = NULL ;
found_old_parent :
if ( wid & & wid - > last = = info - > id ) wid - > last - - ;
_widgets_list . children = eina_list_remove ( _widgets_list . children , info ) ;
}
info - > id = 0 ;
info - > parent = new_parent ;
if ( new_parent )
{
int last_parent_id = ( intptr_t ) efl_key_data_get ( new_parent , info - > kl_name ) ;
info - > id = + + last_parent_id ;
efl_key_data_set ( new_parent , info - > kl_name , ( void * ) ( intptr_t ) last_parent_id ) ;
Object_Info * new_parent_info = efl_key_data_get ( new_parent , " exactness_info " ) ;
if ( new_parent_info )
new_parent_info - > children = eina_list_append ( new_parent_info - > children , info ) ;
}
else
{
Eina_List * itr ;
Main_Widget_Id * wid ;
EINA_LIST_FOREACH ( _main_widget_ids , itr , wid )
{
if ( info - > kl_name = = wid - > kl_name ) goto found_new_parent ;
}
wid = calloc ( 1 , sizeof ( * wid ) ) ;
wid - > kl_name = info - > kl_name ;
_main_widget_ids = eina_list_append ( _main_widget_ids , wid ) ;
found_new_parent :
info - > id = + + wid - > last ;
_widgets_list . children = eina_list_append ( _widgets_list . children , info ) ;
}
end :
foo ( obj , new_parent ) ;
}
static void
_info_fill ( Object_Info * info )
{
Eina_List * itr ;
if ( efl_isa ( info - > object , EFL_CANVAS_OBJECT_CLASS ) )
evas_object_geometry_get ( info - > object , & info - > x , & info - > y , & info - > w , & info - > h ) ;
EINA_LIST_FOREACH ( info - > children , itr , info )
{
_info_fill ( info ) ;
}
}
static void
_objects_snapshot_do ( )
{
Eina_List * itr ;
Object_Info * info ;
int dir_name_len = _hook_setting - > dest_dir ? strlen ( _hook_setting - > dest_dir ) + 1 : 0 ; /* includes space of a '/' */
char * filename = malloc ( strlen ( _hook_setting - > test_name ) + strlen ( OBJECTS_FILENAME_EXT ) +
dir_name_len + 8 ) ; /* also space for serial */
if ( _hook_setting - > dest_dir )
sprintf ( filename , " %s/ " , _hook_setting - > dest_dir ) ;
sprintf ( filename + dir_name_len , " %s%c%03d%s " , _hook_setting - > test_name ,
SHOT_DELIMITER , ts . serial , OBJECTS_FILENAME_EXT ) ;
printf ( " %d objects saved into %s \n " , eina_list_count ( _widgets_list . children ) , filename ) ;
EINA_LIST_FOREACH ( _widgets_list . children , itr , info )
{
_info_fill ( info ) ;
}
Eet_File * file = eet_open ( filename , EET_FILE_MODE_WRITE ) ;
eet_data_write ( file , object_info_desc_make ( ) , " entry " , & _widgets_list , EINA_TRUE ) ;
eet_close ( file ) ;
free ( filename ) ;
}