diff --git a/src/lib/Clouseau_Debug.h b/src/lib/Clouseau_Debug.h index 9a798d6..671ce51 100644 --- a/src/lib/Clouseau_Debug.h +++ b/src/lib/Clouseau_Debug.h @@ -121,6 +121,14 @@ typedef struct { Evas_Object *vis; } Clouseau_Focus_Relation; +typedef struct { + uintptr_t ptr; + const char *helper_name; +} Clouseau_Focus_List_Item; + +typedef struct { + Eina_List *managers; +} Clouseau_Focus_Managers; EAPI void *eo_debug_eoids_request_prepare(int *size, ...); diff --git a/src/lib/clouseau_debug.c b/src/lib/clouseau_debug.c index 4d8bc16..7e94991 100644 --- a/src/lib/clouseau_debug.c +++ b/src/lib/clouseau_debug.c @@ -76,7 +76,7 @@ static int _focus_manager_detail_op = EINA_DEBUG_OPCODE_INVALID; static Eolian_State *eos = NULL; -static Eet_Data_Descriptor *manager_details = NULL; +static Eet_Data_Descriptor *manager_details = NULL, *manager_list = NULL; #include "clouseau_focus_serialization.x" enum { @@ -1000,19 +1000,31 @@ static void _main_loop_focus_manager_list_cb(Eina_Debug_Session *session, int srcid, void *buffer EINA_UNUSED, int size EINA_UNUSED) { Eina_Iterator *obj_iterator, *manager_iterator; - Eina_Array *array; + Clouseau_Focus_Managers *managers; Eo *obj; - array = eina_array_new(10); + if (!manager_list) _init_data_descriptors(); + + managers = alloca(sizeof(Clouseau_Focus_Managers)); + managers->managers = NULL; obj_iterator = eo_objects_iterator_new(); manager_iterator = eina_iterator_filter_new(obj_iterator, _only_manager, NULL, NULL); EINA_ITERATOR_FOREACH(manager_iterator, obj) { - eina_array_push(array, obj); + Clouseau_Focus_List_Item *item = alloca(sizeof(Clouseau_Focus_List_Item)); + + item->ptr = (uintptr_t)(void*)obj; + item->helper_name = efl_class_name_get(efl_ui_focus_manager_root_get(obj)); + + managers->managers = eina_list_append(managers->managers, item); } - eina_debug_session_send(session, srcid, _focus_manager_list_op, array->data, array->count * sizeof(void*)); + int blob_size; + void *blob = eet_data_descriptor_encode(manager_list, managers, &blob_size); + eina_debug_session_send(session, srcid, _focus_manager_list_op, blob, blob_size); + + managers->managers = eina_list_free(managers->managers); } WRAPPER_TO_XFER_MAIN_LOOP(_focus_manager_list_cb) diff --git a/src/lib/clouseau_focus_serialization.x b/src/lib/clouseau_focus_serialization.x index 6933035..fbcf15a 100644 --- a/src/lib/clouseau_focus_serialization.x +++ b/src/lib/clouseau_focus_serialization.x @@ -1,6 +1,6 @@ static void -_init_data_descriptors(void) +_init_manager_details_descriptors(void) { Eet_Data_Descriptor_Class klass; Eet_Data_Descriptor *relations_eed; @@ -35,4 +35,35 @@ _init_data_descriptors(void) EET_DATA_DESCRIPTOR_ADD_BASIC(manager_details, Clouseau_Focus_Manager_Data, "focused", focused, EET_T_UINT); EET_DATA_DESCRIPTOR_ADD_BASIC(manager_details, Clouseau_Focus_Manager_Data, "class_name", class_name, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_LIST(manager_details, Clouseau_Focus_Manager_Data, "relations", relations, relations_eed); + + +} + +static void +_init_manager_list_descriptors(void) +{ + Eet_Data_Descriptor_Class klass; + Eet_Data_Descriptor *detail_eed; + + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&klass, Clouseau_Focus_List_Item); + detail_eed = eet_data_descriptor_file_new(&klass); + #define BASIC(field, type) EET_DATA_DESCRIPTOR_ADD_BASIC(detail_eed, Clouseau_Focus_List_Item, #field , field, type) + + BASIC(helper_name, EET_T_STRING); + BASIC(ptr, EET_T_LONG_LONG); + + #undef BASIC + + + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&klass, Clouseau_Focus_Managers); + manager_list = eet_data_descriptor_file_new(&klass); + + EET_DATA_DESCRIPTOR_ADD_LIST(manager_list, Clouseau_Focus_Managers, "managers", managers, detail_eed); +} + +static void +_init_data_descriptors(void) +{ + _init_manager_list_descriptors(); + _init_manager_details_descriptors(); } diff --git a/src/lib/extensions/focus_inspector/gui.c b/src/lib/extensions/focus_inspector/gui.c index d96c76c..03f817f 100644 --- a/src/lib/extensions/focus_inspector/gui.c +++ b/src/lib/extensions/focus_inspector/gui.c @@ -8,10 +8,10 @@ static Elm_Genlist_Item_Class *itc; static char* _text_get(void *data, Elm_Genlist *list EINA_UNUSED, const char *part EINA_UNUSED) { - Efl_Ui_Focus_Manager *manager = data; + Clouseau_Focus_List_Item *it = data; Eina_Strbuf *res = eina_strbuf_new(); - eina_strbuf_append_printf(res, "%p", manager); + eina_strbuf_append_printf(res, "%s - %p", it->helper_name, (void*)it->ptr); return eina_strbuf_release(res); } @@ -97,17 +97,21 @@ ui_create(Instance *inst, Evas_Object *obj) static void _sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { - com_defailt_manager(data, elm_object_item_data_get(event_info)); + Clouseau_Focus_List_Item *it = elm_object_item_data_get(event_info); + com_defailt_manager(data, (void*)it->ptr); } EAPI void -ui_managers_add(Instance *inst, Efl_Ui_Focus_Manager **manager, int size) +ui_managers_add(Instance *inst, Clouseau_Focus_Managers *clouseau_managers) { + Clouseau_Focus_List_Item *it; + Eina_List *n; + elm_genlist_clear(managers); - for (int i = 0; i < size; ++i) + EINA_LIST_FOREACH(clouseau_managers->managers, n, it) { - elm_genlist_item_append(managers, itc, manager[i], NULL, 0, _sel, inst); + elm_genlist_item_append(managers, itc, it, NULL, 0, _sel, inst); } } diff --git a/src/lib/extensions/focus_inspector/gui.h b/src/lib/extensions/focus_inspector/gui.h index 82dfc9e..8e341c6 100644 --- a/src/lib/extensions/focus_inspector/gui.h +++ b/src/lib/extensions/focus_inspector/gui.h @@ -25,8 +25,7 @@ typedef enum { EAPI void tree_view_update(Instance *inst, Evas_Object *scroller); EAPI void tree_view_relation_display(Instance *inst, Relations rel); - -EAPI void ui_managers_add(Instance *inst, Efl_Ui_Focus_Manager **manager, int size); +EAPI void ui_managers_add(Instance *inst, Clouseau_Focus_Managers *clouseau_managers); EAPI void ui_manager_data_arrived(Instance *inst, Clouseau_Focus_Manager_Data *data); EAPI Evas_Object* ui_create(Instance *inst, Evas_Object *obj); diff --git a/src/lib/extensions/focus_inspector/main.c b/src/lib/extensions/focus_inspector/main.c index db69acd..19545f6 100644 --- a/src/lib/extensions/focus_inspector/main.c +++ b/src/lib/extensions/focus_inspector/main.c @@ -9,19 +9,19 @@ static Instance inst; static int _focus_manager_list_op = EINA_DEBUG_OPCODE_INVALID; static int _focus_manager_detail_op = EINA_DEBUG_OPCODE_INVALID; -static Eet_Data_Descriptor *manager_details = NULL; +static Eet_Data_Descriptor *manager_details = NULL, *manager_list = NULL; #include "../../clouseau_focus_serialization.x" static Eina_Bool _main_loop_focus_manager_list_cb(Eina_Debug_Session *session, int src EINA_UNUSED, void *buffer, int size) { - int nb_managers = size / sizeof(Efl_Ui_Focus_Manager*); - Efl_Ui_Focus_Manager *manager_arr[nb_managers]; Clouseau_Extension *ext = eina_debug_session_data_get(session); + Clouseau_Focus_Managers *managers; + if (!manager_list) _init_manager_list_descriptors(); - memcpy(manager_arr, buffer, size); + managers = eet_data_descriptor_decode(manager_list, buffer, size); - ui_managers_add(ext->data, manager_arr, nb_managers); + ui_managers_add(ext->data, managers); return EINA_TRUE; }