yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=cd548b2917abfc023ea1f9d42bd8ec2ccc954856
commit cd548b2917abfc023ea1f9d42bd8ec2ccc954856 Author: Yakov Goldberg <[email protected]> Date: Thu Mar 5 15:24:32 2015 +0200 Add black list of classes and funcs --- data/config/CMakeLists.txt | 1 + data/config/black_list.json | 48 ++++++++++++++++++++ src/bin/main.c | 3 +- src/lib/database.c | 107 +++++++++++++++++++++++++++++++++++++++++--- src/lib/database.h | 2 +- src/lib/gui_widget.c | 4 +- src/lib/gui_widget.h | 2 +- 7 files changed, 155 insertions(+), 12 deletions(-) diff --git a/data/config/CMakeLists.txt b/data/config/CMakeLists.txt index 92faf77..93dee0c 100644 --- a/data/config/CMakeLists.txt +++ b/data/config/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8.1) LIST(APPEND CONFIG_FILES func_names.json + black_list.json egui_all.eo ) #always copy config files into build directory, so egui_cmd will be able to generate egui_auto diff --git a/data/config/black_list.json b/data/config/black_list.json new file mode 100644 index 0000000..ba52da8 --- /dev/null +++ b/data/config/black_list.json @@ -0,0 +1,48 @@ +{ + "Evas_3D_Texture": [], + "Evas_3D_Light": [], + "Evas_3D_Camera": [], + "Evas_3D_Material": [], + "Evas_3D_Node": [], + "Evas_3D_Mesh": [], + "Evas_3D_Object": [], + "Evas_3D_Scene": [], + + "Eo.Base": [], + "Edje.Object": [], + "Elm_Interface_Atspi_Text": [], + "Elm_Interface_Atspi_Action": [], + "Elm_Interface_Atspi_Accessible": [], + "Elm_Interface_Atspi_Widget_Action": [], + "Evas.Common_Interface": [], + "Elm_Container": ["content_swallow_list"], + "Elm_Interface_Fileselector": ["mode", "selected_paths", "sort_method", "custom_filter_append"], + "Elm_Interface_Scrollable":["edge_top_cb", "edge_bottom_cb", "edge_right_cb", "vbar_unpress_cb", "vbar_drag_cb", "edge_left_cb", "scroll_right_cb", "animate_stop_cb", "scroll_cb", "scroll_down_cb", "animate_start_cb", "page_change_cb", "drag_stop_cb", "hbae_unpress_cb", "hbar_press_cb", "hbar_unpress_cb", "vbar_press_cb", "scroll_left_cb", "content_viewport_resize_cb", "drag_start_cb", "hbar_drag_cb", "scroll_up_cb", "single_direction", "movement_block"], + "Evas.Object_Smart": ["data", "attach", "callback_description_find", "callbacks_descriptions_get", "callbacks_descriptions_set"], + "Evas.Object":["size_hint_display_mode", "map", "render_op", "pointer_mode", "key_grab", "key_ungrab"], + "Elm_Hoversel":["item_add"], + "Evas.Image":["orient", "filter_source", "scene", "data_copy", "mmap", "pixels_get_callback", "colorspace", "scale_hint", "native_surface", "border_center_fill", "fill_spread", "video_surface_caps", "video_surface", "content_hint", "pixels_import", "data_convert", "data_set"], + "Elm_Widget":["newest_focus_order_get","cursor_add","focus_next_object_get", "focus_next_object_set", "focus_highlight_geometry_get","activate","event","event_callback_add","cursor_del","event_callback_del","focus_cycle","focus_direction","event_propagate","signal_callback_add","focus_list_direction_get","tooltip_del","focus_next_get","focus_next","focus_list_next_get","focus_direction_get","signal_callback_del","tooltip_add","theme","focus_custom_chain","display_mode","on_show_region [...] + "Elm_Entry": ["context_menu_item_add","markup_filter_prepend","cnp_mode","input_panel_language","autocapital_type","file","input_hint","input_panel_layout","input_panel_return_key_type","line_wrap","input_panel_imdata_get","markup_filter_remove","item_provider_append","markup_filter_append","markup_filter_remove","markup_filter_append","item_provider_append","item_provider_prepend","item_provider_remove"], + "Elm_Image":["orient","mmap","memfile"], + "Elm_Label":["slide_mode", "line_wrap"], + "Elm_Icon":["order_lookup"], + "Elm_Genlist":["item_insert_before","item_insert_after","item_prepend","item_append","item_sorted_insert","mode","item_sorted_insert","search_by_text_item_get","multi_select_mode"], + "Elm_Flip":["interaction_direction_hitsize_get","interaction_direction_enabled_set","interaction","interaction_direction_hitsize_set","interaction_direction_enabled_get"], + "Elm_Dayselector":["weekdays_names_set","day_selected_set","day_selected_get","week_start","weekend_length","weekend_start"], + "Elm_Gengrid":["item_insert_before","item_insert_after","item_append","item_prepend","item_sorted_insert","search_by_text_item_get","multi_select_mode"], + "Elm_Toolbar":["icon_order_lookup"], + "Elm_Scroller":["page_scroll_limit_get"], + "Elm_Calendar":["displayed_time_get","first_day_of_week","selectable","weekdays_names","select_mode","format_function","selected_time_get","selected_time_set","mark_add"], + "Elm_Bubble":["pos"], + "Elm_Actionslider":["indicator_pos","magnet_pos","enabled_pos"], + "Elm_Radio":["value_pointer"], + "Elm_Check":["state_pointer"], + "Elm_Clock":["edit_mode"], + "Elm_Layout":["signal_callback_add","signal_callback_add","box_insert_before","box_insert_at","signal_callback_del","table_pack","text_aliases","content_aliases"], + "Elm_Colorselector":["mode"], + "Elm_Ctxpopup":["direction_priority"], + "Elm_Box":["layout"], + "Elm_Win": ["illume_command_send","wm_available_rotations","available_profiles","keyboard_mode","indicator_opacity","indicator_mode","trap_data","fake_canvas"], + "Elm_Bg":["option"] +} diff --git a/src/bin/main.c b/src/bin/main.c index 176b482..9e14ddb 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -243,7 +243,8 @@ main(int argc, char **argv) goto end; } - if (!egui_init(PACKAGE_DATA_DIR"/config/func_names.json", PACKAGE_DATA_DIR"/config/egui_all.eo")) + if (!egui_init(PACKAGE_DATA_DIR"/config/func_names.json", PACKAGE_DATA_DIR"/config/egui_all.eo", + PACKAGE_DATA_DIR"/config/black_list.json")) { EINA_LOG_ERR("Could not start Erigo"); egui_shutdown(); diff --git a/src/lib/database.c b/src/lib/database.c index 47bf6d4..e0b84d4 100644 --- a/src/lib/database.c +++ b/src/lib/database.c @@ -826,8 +826,6 @@ _op_settings_init(const char *db_path) return EINA_TRUE; } -/* Read operations settings file and save data in a list. -*/ static void _op_settings_shutdown() { @@ -941,8 +939,70 @@ _default_settings_shutdown() eina_hash_free(def_props_table); } +typedef struct +{ + Eina_Stringshare *cl_name; + Eina_List *black_funcs_lst; +} _Black_Class; + +Eina_List *_black_lst = NULL; + +static void +_black_list_init(const char *black_list) +{ + Eina_Json_Value *jv; + + /* Get JSON object from DB by path. */ + jv = _db_json_object_get(black_list); + + Eina_Json_Value *black_list_item = NULL; + + Eina_Iterator *it = eina_json_object_iterator_new(jv); + EINA_ITERATOR_FOREACH(it, black_list_item) + { + _Black_Class *blk = NULL; + const char *class_name = eina_json_pair_name_get(black_list_item); + blk = calloc(1, sizeof(_Black_Class)); + blk->cl_name = eina_stringshare_add(class_name); + _black_lst = eina_list_append(_black_lst, blk); + + Eina_Json_Value *black_funcs_arr = eina_json_pair_value_get(black_list_item); + Eina_Iterator *it_arr = eina_json_array_iterator_new(black_funcs_arr); + Eina_Json_Value *black_list_func = NULL; + + EINA_ITERATOR_FOREACH(it_arr, black_list_func) + { + const char *str = eina_json_string_get(black_list_func); + if (str && strlen(str)) + { + Eina_Stringshare *_str = eina_stringshare_add(str); + blk->black_funcs_lst = eina_list_append(blk->black_funcs_lst, _str); + } + } + eina_iterator_free(it_arr); + } + eina_iterator_free(it); + eina_json_value_free(jv); +} + +static void +_black_list_shutdown() +{ + _Black_Class *blk; + EINA_LIST_FREE(_black_lst, blk) + { + eina_stringshare_del(blk->cl_name); + Eina_Stringshare *_str; + EINA_LIST_FREE(blk->black_funcs_lst, _str) + { + eina_stringshare_del(_str); + } + free(blk); + } +} + Eina_Bool -db_init(const char *db_path, const char *all_eo_path) +db_init(const char *db_path, const char *all_eo_path, const char *black_list) { const char *log_dom = "egui_db"; const Eina_List *itr; @@ -965,6 +1025,7 @@ db_init(const char *db_path, const char *all_eo_path) return EINA_FALSE; if (!_op_settings_init(db_path)) return EINA_FALSE; + _black_list_init(black_list); typedef_table = eina_hash_string_superfast_new(NULL); eina_hash_add(typedef_table, "Evas_Coord", (void *) (uintptr_t) GUI_TYPE_SINT); @@ -995,9 +1056,27 @@ db_init(const char *db_path, const char *all_eo_path) Eolian_Class *_ekl; EINA_ITERATOR_FOREACH(_all_classes_list, _ekl) { - const char *class_name = eolian_class_full_name_get(_ekl); + Eina_Stringshare *class_name = eina_stringshare_add(eolian_class_full_name_get(_ekl)); const Eolian_Function *func; + _Black_Class *blk = NULL; + Eina_List *it; + Eina_Bool class_in_black_list = EINA_FALSE; + EINA_LIST_FOREACH(_black_lst, it, blk) + { + /* if current class is in black list break iterations */ + if (class_name == blk->cl_name) + { + /* Only if funcs list is empty exclude class. */ + if (!blk->black_funcs_lst) + { + class_in_black_list = EINA_TRUE; + } + break; + } + } + if (class_in_black_list) continue; + /* Looking for a record for current class*/ Class_Props *class_props = eina_hash_find(cl_table, class_name); if (!class_props) @@ -1015,6 +1094,7 @@ db_init(const char *db_path, const char *all_eo_path) funcs = eolian_class_functions_get(_ekl, *type_p); EINA_ITERATOR_FOREACH(funcs, func) { + Eina_Stringshare *func_name; Op_Desc *op_desc = NULL; char *func_set_name = NULL, *func_get_name = NULL; @@ -1022,6 +1102,15 @@ db_init(const char *db_path, const char *all_eo_path) if (f_type == EOLIAN_UNRESOLVED) continue; + func_name = eina_stringshare_add(eolian_function_name_get(func)); + + /* Check if this current func is in black list */ + if (blk && eina_list_data_find(blk->black_funcs_lst, func_name)) + { + eina_stringshare_del(func_name); + continue; + } + op_desc = calloc(1, sizeof(Op_Desc)); op_desc->func_type = f_type; @@ -1045,7 +1134,7 @@ db_init(const char *db_path, const char *all_eo_path) } op_desc->cl_name = eina_stringshare_add(class_name); - op_desc->op_name = eina_stringshare_add(eolian_function_name_get(func)); + op_desc->op_name = eina_stringshare_add(func_name); Op_Settings *_op_set = _op_settings_get(op_desc->cl_name, op_desc->op_name); @@ -1154,7 +1243,7 @@ db_init(const char *db_path, const char *all_eo_path) } void *p = eina_hash_find(typedef_table, c_type2); if (!p) - ERR("no typedef for type: %s, class: %s, func: %s", c_type2, op_desc->cl_name, (char *) op_desc->func_set_name); + ERR("no typedef for type: %s, class: %s, eolian func: %s", c_type2, op_desc->cl_name, func_name); Op_Param_Desc *param_desc = calloc(1, sizeof(Op_Param_Desc)); param_desc->gui_type = (Gui_Type) (uintptr_t) p; @@ -1176,10 +1265,12 @@ db_init(const char *db_path, const char *all_eo_path) } eina_list_free(params_list); } + eina_stringshare_del(func_name); } eina_iterator_free(funcs); type_p++; } + eina_stringshare_del(class_name); } eina_iterator_free(_all_classes_list); @@ -1234,9 +1325,11 @@ db_shutdown() op_id_op_desc_table = NULL; #endif eina_hash_free(container_table); - _op_settings_shutdown(); _default_settings_shutdown(); + _black_list_shutdown(); + _op_settings_shutdown(); + cl_table = enum_table = enum_types_table = container_table = def_props_table = NULL; eina_log_domain_unregister(_db_log_dom); diff --git a/src/lib/database.h b/src/lib/database.h index 33224c6..8cc8a66 100644 --- a/src/lib/database.h +++ b/src/lib/database.h @@ -130,7 +130,7 @@ typedef struct _Container_Desc Container_Desc; #define ITEM_PUSH "item_push" Eina_Bool -db_init(const char *db_path, const char *all_eo_path); +db_init(const char *db_path, const char *all_eo_path, const char *black_list); Eina_Bool db_shutdown(); diff --git a/src/lib/gui_widget.c b/src/lib/gui_widget.c index 27c9cba..480f900 100644 --- a/src/lib/gui_widget.c +++ b/src/lib/gui_widget.c @@ -822,7 +822,7 @@ gui_all_contexts_del() */ Eina_Bool -egui_init(const char *db_path, const char *all_eo_path) +egui_init(const char *db_path, const char *all_eo_path, const char *black_list) { const char *log_dom = "egui"; if (!db_path) @@ -855,7 +855,7 @@ egui_init(const char *db_path, const char *all_eo_path) eolian_directory_scan(EOLIAN_EO_DIR"/efl-1"); eolian_directory_scan(EOLIAN_EO_DIR"/elementary-1"); - if (!db_init(db_path, all_eo_path)) + if (!db_init(db_path, all_eo_path, black_list)) return EINA_FALSE; return EINA_TRUE; diff --git a/src/lib/gui_widget.h b/src/lib/gui_widget.h index 1880ed1..5af8349 100644 --- a/src/lib/gui_widget.h +++ b/src/lib/gui_widget.h @@ -105,7 +105,7 @@ enum }; Eina_Bool -egui_init(const char *db_path, const char *all_eo_path); +egui_init(const char *db_path, const char *all_eo_path, const char *black_list); Eina_Bool egui_shutdown(); --
