summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/benchmarks/eina/Ecore_Data.h75
-rw-r--r--src/benchmarks/eina/city.h14
-rw-r--r--src/benchmarks/eina/ecore_hash.c952
-rw-r--r--src/benchmarks/eina/ecore_strings.c164
-rw-r--r--src/benchmarks/eina/eina_bench.c3
-rw-r--r--src/benchmarks/eina/eina_bench.h3
-rw-r--r--src/benchmarks/eina/eina_bench_convert.c4
-rw-r--r--src/benchmarks/eina/eina_bench_hash.c551
-rw-r--r--src/benchmarks/eina/eina_bench_stringshare.c8
-rw-r--r--src/benchmarks/eina/eina_bench_stringshare_e17.c121
-rw-r--r--src/benchmarks/eina/meson.build4
-rw-r--r--src/bin/ecore_evas/ecore_evas_convert.c4
-rw-r--r--src/bin/ecore_evas/eetpack.c4
-rw-r--r--src/bin/edje/edje_cc_out.c27
-rw-r--r--src/bin/edje/edje_cc_parse.c4
-rw-r--r--src/bin/edje/edje_external_inspector.c7
-rw-r--r--src/bin/edje/meson.build2
-rw-r--r--src/bin/eet/eet_main.c22
-rw-r--r--src/bin/eeze/eeze_mount/eeze_mount.c2
-rw-r--r--src/bin/efl/efl_debug.c2
-rw-r--r--src/bin/efl/efl_debugd.c3
-rw-r--r--src/bin/efreet/efreetd.c10
-rw-r--r--src/bin/efreet/efreetd_cache.c34
-rw-r--r--src/bin/efreet/efreetd_ipc.c20
-rw-r--r--src/bin/elementary/config.c46
-rw-r--r--src/bin/elementary/meson.build2
-rw-r--r--src/bin/elementary/test.c4
-rw-r--r--src/bin/elementary/test_label.c118
-rw-r--r--src/bin/elementary/test_popup.c76
-rw-r--r--src/bin/embryo/embryo_cc_sc1.c16
-rw-r--r--src/bin/eolian/headers.c2
-rw-r--r--src/bin/eolian/sources.c23
-rw-r--r--src/bin/ethumb_client/ethumbd.c3
-rw-r--r--src/bin/ethumb_client/ethumbd_client.c2
-rw-r--r--src/bin/ethumb_client/ethumbd_slave.c13
-rw-r--r--src/bin/exactness/injector.c6
-rw-r--r--src/bin/exactness/recorder.c2
-rw-r--r--src/bindings/mono/eina_mono/eina_stringshare.cs10
-rw-r--r--src/examples/edje/edje-text.c4
-rw-r--r--src/examples/eldbus/dbusmodel.c2
-rw-r--r--src/examples/evas/evas-vg-batman.c8
-rw-r--r--src/examples/evas/evas-vg-simple.c14
-rw-r--r--src/lib/ecore/ecore_exe_eo.h2
-rw-r--r--src/lib/ecore/ecore_exe_posix.c90
-rw-r--r--src/lib/ecore/ecore_time.c32
-rw-r--r--src/lib/ecore/efl_exe.c144
-rw-r--r--src/lib/ecore/efl_thread.c4
-rw-r--r--src/lib/ecore_con/ecore_con_eet_base_eo.h2
-rw-r--r--src/lib/ecore_con/ecore_con_eet_client_obj_eo.h2
-rw-r--r--src/lib/ecore_con/ecore_con_eet_server_obj_eo.h2
-rw-r--r--src/lib/ecore_con/ecore_con_url.c2
-rw-r--r--src/lib/ecore_con/efl_net_dialer_http.c2
-rw-r--r--src/lib/ecore_drm2/ecore_drm2_fb.c2
-rw-r--r--src/lib/ecore_evas/ecore_evas.c39
-rw-r--r--src/lib/ecore_file/ecore_file.c88
-rw-r--r--src/lib/ecore_imf/Ecore_IMF.h4
-rw-r--r--src/lib/ecore_input/ecore_input_joystick.c2
-rw-r--r--src/lib/ecore_ipc/ecore_ipc.c2
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_display.c13
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_subsurf.c3
-rw-r--r--src/lib/ecore_x/Ecore_X.h20
-rw-r--r--src/lib/ecore_x/ecore_x_vsync.c5
-rw-r--r--src/lib/edje/Edje_Legacy.h322
-rw-r--r--src/lib/edje/edje_calc.c78
-rw-r--r--src/lib/edje/edje_edit.c11
-rw-r--r--src/lib/edje/edje_edit_eo.h2
-rw-r--r--src/lib/edje/edje_embryo.c18
-rw-r--r--src/lib/edje/edje_entry.c160
-rw-r--r--src/lib/edje/edje_legacy.c2
-rw-r--r--src/lib/edje/edje_part.c2
-rw-r--r--src/lib/edje/edje_program.c6
-rw-r--r--src/lib/edje/edje_textblock_styles.c62
-rw-r--r--src/lib/eet/Eet.h15
-rw-r--r--src/lib/eet/eet_cipher.c31
-rw-r--r--src/lib/eet/eet_lib.c2
-rw-r--r--src/lib/efl/Efl.h1
-rw-r--r--src/lib/efl/interfaces/efl_gfx_path.c12
-rw-r--r--src/lib/efl_canvas_wl/efl_canvas_wl.c1
-rw-r--r--src/lib/eina/eina_bezier.h11
-rw-r--r--src/lib/eina/eina_file.c243
-rw-r--r--src/lib/eina/eina_file_common.c2
-rw-r--r--src/lib/eina/eina_file_win32.c2
-rw-r--r--src/lib/eina/eina_log.c8
-rw-r--r--src/lib/eina/eina_matrix.c37
-rw-r--r--src/lib/eina/eina_quaternion.h10
-rw-r--r--src/lib/eina/eina_thread.c5
-rw-r--r--src/lib/eina/eina_types.h16
-rw-r--r--src/lib/eina/eina_vpath.c8
-rw-r--r--src/lib/eio/Eio_Legacy.h6
-rw-r--r--src/lib/elementary/Elementary.h5
-rw-r--r--src/lib/elementary/efl_ui_alert_popup.c2
-rw-r--r--src/lib/elementary/efl_ui_bg_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_button_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_check_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_collection.c6
-rw-r--r--src/lib/elementary/efl_ui_collection_view.c2
-rw-r--r--src/lib/elementary/efl_ui_exact_model.c2
-rw-r--r--src/lib/elementary/efl_ui_flip.c4
-rw-r--r--src/lib/elementary/efl_ui_flip_eo.legacy.c8
-rw-r--r--src/lib/elementary/efl_ui_flip_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_focus_manager.eo9
-rw-r--r--src/lib/elementary/efl_ui_focus_manager_calc.c35
-rw-r--r--src/lib/elementary/efl_ui_focus_manager_calc.eo1
-rw-r--r--src/lib/elementary/efl_ui_focus_manager_sub.c15
-rw-r--r--src/lib/elementary/efl_ui_focus_parent_provider_gen_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_frame_legacy.h2
-rw-r--r--src/lib/elementary/efl_ui_frame_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_image.c20
-rw-r--r--src/lib/elementary/efl_ui_image_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_image_zoomable.c8
-rw-r--r--src/lib/elementary/efl_ui_image_zoomable_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_internal_text_interactive.c24
-rw-r--r--src/lib/elementary/efl_ui_layout.c2
-rw-r--r--src/lib/elementary/efl_ui_layout_legacy_eo.h4
-rw-r--r--src/lib/elementary/efl_ui_panes_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_progressbar_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_radio_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_select_model.c6
-rw-r--r--src/lib/elementary/efl_ui_table.c22
-rw-r--r--src/lib/elementary/efl_ui_textbox.c34
-rw-r--r--src/lib/elementary/efl_ui_textbox.eo1
-rw-r--r--src/lib/elementary/efl_ui_textpath.c6
-rw-r--r--src/lib/elementary/efl_ui_textpath_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_timepicker.c4
-rw-r--r--src/lib/elementary/efl_ui_vg_animation_eo.legacy.h2
-rw-r--r--src/lib/elementary/efl_ui_video_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_widget.c9
-rw-r--r--src/lib/elementary/efl_ui_win.c15
-rw-r--r--src/lib/elementary/efl_ui_win_inlined_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_win_legacy_eo.h2
-rw-r--r--src/lib/elementary/efl_ui_win_socket_legacy_eo.h2
-rw-r--r--src/lib/elementary/elc_ctxpopup.h8
-rw-r--r--src/lib/elementary/elc_ctxpopup_legacy.h2
-rw-r--r--src/lib/elementary/elc_multibuttonentry.h2
-rw-r--r--src/lib/elementary/elc_naviframe.h4
-rw-r--r--src/lib/elementary/elc_naviframe_common.h2
-rw-r--r--src/lib/elementary/elc_naviframe_legacy.h4
-rw-r--r--src/lib/elementary/elc_popup.h2
-rw-r--r--src/lib/elementary/elc_popup_legacy.h4
-rw-r--r--src/lib/elementary/elm_access.c4
-rw-r--r--src/lib/elementary/elm_access_eo.h2
-rw-r--r--src/lib/elementary/elm_actionslider_eo.h2
-rw-r--r--src/lib/elementary/elm_atspi_app_object_eo.h2
-rw-r--r--src/lib/elementary/elm_atspi_bridge_eo.h2
-rw-r--r--src/lib/elementary/elm_box.h2
-rw-r--r--src/lib/elementary/elm_box_common.h2
-rw-r--r--src/lib/elementary/elm_box_eo.h42
-rw-r--r--src/lib/elementary/elm_box_legacy.h4
-rw-r--r--src/lib/elementary/elm_bubble_eo.h2
-rw-r--r--src/lib/elementary/elm_calendar_eo.h6
-rw-r--r--src/lib/elementary/elm_calendar_eo.legacy.h4
-rw-r--r--src/lib/elementary/elm_calendar_item_eo.h2
-rw-r--r--src/lib/elementary/elm_clock_eo.h2
-rw-r--r--src/lib/elementary/elm_cnp.c54
-rw-r--r--src/lib/elementary/elm_code_widget.c48
-rw-r--r--src/lib/elementary/elm_code_widget_legacy_eo.h2
-rw-r--r--src/lib/elementary/elm_color_item_eo.h2
-rw-r--r--src/lib/elementary/elm_colorselector_eo.h2
-rw-r--r--src/lib/elementary/elm_config.c21
-rw-r--r--src/lib/elementary/elm_config.h12
-rw-r--r--src/lib/elementary/elm_conformant_eo.h2
-rw-r--r--src/lib/elementary/elm_ctxpopup_eo.h48
-rw-r--r--src/lib/elementary/elm_ctxpopup_eo.legacy.h2
-rw-r--r--src/lib/elementary/elm_ctxpopup_item_eo.h24
-rw-r--r--src/lib/elementary/elm_dayselector_eo.h2
-rw-r--r--src/lib/elementary/elm_dayselector_item_eo.h2
-rw-r--r--src/lib/elementary/elm_deprecated.h12
-rw-r--r--src/lib/elementary/elm_diskselector_eo.h2
-rw-r--r--src/lib/elementary/elm_diskselector_item_eo.h2
-rw-r--r--src/lib/elementary/elm_dnd.c2
-rw-r--r--src/lib/elementary/elm_entry.h2
-rw-r--r--src/lib/elementary/elm_entry_common.h2
-rw-r--r--src/lib/elementary/elm_entry_eo.h246
-rw-r--r--src/lib/elementary/elm_entry_eo.legacy.h4
-rw-r--r--src/lib/elementary/elm_entry_legacy.h12
-rw-r--r--src/lib/elementary/elm_fileselector_button_eo.h2
-rw-r--r--src/lib/elementary/elm_fileselector_entry_eo.h2
-rw-r--r--src/lib/elementary/elm_fileselector_eo.h2
-rw-r--r--src/lib/elementary/elm_flipselector_eo.h4
-rw-r--r--src/lib/elementary/elm_flipselector_eo.legacy.h2
-rw-r--r--src/lib/elementary/elm_flipselector_item_eo.h2
-rw-r--r--src/lib/elementary/elm_focus_legacy.c10
-rw-r--r--src/lib/elementary/elm_frame.h2
-rw-r--r--src/lib/elementary/elm_general.h12
-rw-r--r--src/lib/elementary/elm_gengrid.c11
-rw-r--r--src/lib/elementary/elm_gengrid.h4
-rw-r--r--src/lib/elementary/elm_gengrid_common.h32
-rw-r--r--src/lib/elementary/elm_gengrid_eo.h116
-rw-r--r--src/lib/elementary/elm_gengrid_eo.legacy.h2
-rw-r--r--src/lib/elementary/elm_gengrid_item_eo.h48
-rw-r--r--src/lib/elementary/elm_gengrid_item_eo.legacy.h5
-rw-r--r--src/lib/elementary/elm_gengrid_legacy.h22
-rw-r--r--src/lib/elementary/elm_gengrid_pan_eo.h2
-rw-r--r--src/lib/elementary/elm_genlist.c9
-rw-r--r--src/lib/elementary/elm_genlist.h4
-rw-r--r--src/lib/elementary/elm_genlist_common.h32
-rw-r--r--src/lib/elementary/elm_genlist_eo.h160
-rw-r--r--src/lib/elementary/elm_genlist_item_eo.h74
-rw-r--r--src/lib/elementary/elm_genlist_item_eo.legacy.h5
-rw-r--r--src/lib/elementary/elm_genlist_legacy.h4
-rw-r--r--src/lib/elementary/elm_genlist_pan_eo.h2
-rw-r--r--src/lib/elementary/elm_gesture_layer.c4
-rw-r--r--src/lib/elementary/elm_gesture_layer.h2
-rw-r--r--src/lib/elementary/elm_gesture_layer_eo.h2
-rw-r--r--src/lib/elementary/elm_gesture_layer_legacy.h6
-rw-r--r--src/lib/elementary/elm_glview.h5
-rw-r--r--src/lib/elementary/elm_glview_common.h2
-rw-r--r--src/lib/elementary/elm_glview_eo.h4
-rw-r--r--src/lib/elementary/elm_glview_eo.legacy.h2
-rw-r--r--src/lib/elementary/elm_glview_legacy.h14
-rw-r--r--src/lib/elementary/elm_grid.h2
-rw-r--r--src/lib/elementary/elm_grid_eo.h2
-rw-r--r--src/lib/elementary/elm_grid_legacy.h8
-rw-r--r--src/lib/elementary/elm_hover_eo.h2
-rw-r--r--src/lib/elementary/elm_hoversel_eo.h2
-rw-r--r--src/lib/elementary/elm_hoversel_item_eo.h2
-rw-r--r--src/lib/elementary/elm_icon.c13
-rw-r--r--src/lib/elementary/elm_icon_eo.h2
-rw-r--r--src/lib/elementary/elm_index.h4
-rw-r--r--src/lib/elementary/elm_index_eo.h2
-rw-r--r--src/lib/elementary/elm_index_item_eo.h2
-rw-r--r--src/lib/elementary/elm_index_item_eo.legacy.h5
-rw-r--r--src/lib/elementary/elm_index_legacy.h6
-rw-r--r--src/lib/elementary/elm_interface_fileselector_eo.h2
-rw-r--r--src/lib/elementary/elm_interface_scrollable.h2
-rw-r--r--src/lib/elementary/elm_inwin.h4
-rw-r--r--src/lib/elementary/elm_inwin_eo.h2
-rw-r--r--src/lib/elementary/elm_inwin_legacy.h8
-rw-r--r--src/lib/elementary/elm_label.h2
-rw-r--r--src/lib/elementary/elm_label_eo.h2
-rw-r--r--src/lib/elementary/elm_label_eo.legacy.h2
-rw-r--r--src/lib/elementary/elm_label_legacy.h2
-rw-r--r--src/lib/elementary/elm_list.h4
-rw-r--r--src/lib/elementary/elm_list_eo.h2
-rw-r--r--src/lib/elementary/elm_list_item_eo.h2
-rw-r--r--src/lib/elementary/elm_list_legacy.h2
-rw-r--r--src/lib/elementary/elm_main.c4
-rw-r--r--src/lib/elementary/elm_map.h2
-rw-r--r--src/lib/elementary/elm_map_common.h6
-rw-r--r--src/lib/elementary/elm_map_eo.h4
-rw-r--r--src/lib/elementary/elm_map_eo.legacy.h8
-rw-r--r--src/lib/elementary/elm_map_legacy.h16
-rw-r--r--src/lib/elementary/elm_map_pan_eo.h2
-rw-r--r--src/lib/elementary/elm_mapbuf.h4
-rw-r--r--src/lib/elementary/elm_mapbuf_eo.h2
-rw-r--r--src/lib/elementary/elm_mapbuf_legacy.h4
-rw-r--r--src/lib/elementary/elm_menu_eo.h2
-rw-r--r--src/lib/elementary/elm_menu_item_eo.h2
-rw-r--r--src/lib/elementary/elm_multibuttonentry_eo.h2
-rw-r--r--src/lib/elementary/elm_multibuttonentry_item_eo.h2
-rw-r--r--src/lib/elementary/elm_naviframe_eo.h2
-rw-r--r--src/lib/elementary/elm_naviframe_item_eo.h2
-rw-r--r--src/lib/elementary/elm_notify.h2
-rw-r--r--src/lib/elementary/elm_notify_eo.h2
-rw-r--r--src/lib/elementary/elm_notify_legacy.h8
-rw-r--r--src/lib/elementary/elm_pan_eo.h2
-rw-r--r--src/lib/elementary/elm_panel.h2
-rw-r--r--src/lib/elementary/elm_panel_common.h2
-rw-r--r--src/lib/elementary/elm_panel_eo.h2
-rw-r--r--src/lib/elementary/elm_panel_eo.legacy.h2
-rw-r--r--src/lib/elementary/elm_panel_legacy.h4
-rw-r--r--src/lib/elementary/elm_photo_eo.h2
-rw-r--r--src/lib/elementary/elm_photocam.h2
-rw-r--r--src/lib/elementary/elm_photocam_legacy.h30
-rw-r--r--src/lib/elementary/elm_player_eo.h2
-rw-r--r--src/lib/elementary/elm_plug.h4
-rw-r--r--src/lib/elementary/elm_plug_eo.h2
-rw-r--r--src/lib/elementary/elm_plug_legacy.h4
-rw-r--r--src/lib/elementary/elm_popup_eo.h2
-rw-r--r--src/lib/elementary/elm_popup_eo.legacy.h2
-rw-r--r--src/lib/elementary/elm_popup_item_eo.h2
-rw-r--r--src/lib/elementary/elm_prefs.h2
-rw-r--r--src/lib/elementary/elm_prefs_eo.h10
-rw-r--r--src/lib/elementary/elm_prefs_eo.legacy.h8
-rw-r--r--src/lib/elementary/elm_priv.h4
-rw-r--r--src/lib/elementary/elm_radio.h2
-rw-r--r--src/lib/elementary/elm_radio_legacy.h6
-rw-r--r--src/lib/elementary/elm_removed.h2
-rw-r--r--src/lib/elementary/elm_route_eo.h2
-rw-r--r--src/lib/elementary/elm_scroller.c20
-rw-r--r--src/lib/elementary/elm_scroller.h2
-rw-r--r--src/lib/elementary/elm_scroller_eo.h2
-rw-r--r--src/lib/elementary/elm_scroller_legacy.h74
-rw-r--r--src/lib/elementary/elm_segment_control_eo.h2
-rw-r--r--src/lib/elementary/elm_segment_control_item_eo.h2
-rw-r--r--src/lib/elementary/elm_separator_eo.h2
-rw-r--r--src/lib/elementary/elm_slider_eo.h2
-rw-r--r--src/lib/elementary/elm_slider_part_indicator_eo.h2
-rw-r--r--src/lib/elementary/elm_slideshow_eo.h2
-rw-r--r--src/lib/elementary/elm_slideshow_item_eo.h2
-rw-r--r--src/lib/elementary/elm_spinner.h4
-rw-r--r--src/lib/elementary/elm_spinner_eo.h6
-rw-r--r--src/lib/elementary/elm_spinner_eo.legacy.h4
-rw-r--r--src/lib/elementary/elm_spinner_legacy.h18
-rw-r--r--src/lib/elementary/elm_sys_notify_dbus_eo.h2
-rw-r--r--src/lib/elementary/elm_sys_notify_eo.c6
-rw-r--r--src/lib/elementary/elm_sys_notify_eo.h2
-rw-r--r--src/lib/elementary/elm_sys_notify_interface_eo.h2
-rw-r--r--src/lib/elementary/elm_systray_eo.h2
-rw-r--r--src/lib/elementary/elm_table.h2
-rw-r--r--src/lib/elementary/elm_table_eo.h2
-rw-r--r--src/lib/elementary/elm_table_legacy.h8
-rw-r--r--src/lib/elementary/elm_textpath_legacy.h4
-rw-r--r--src/lib/elementary/elm_theme.c4
-rw-r--r--src/lib/elementary/elm_thumb.c13
-rw-r--r--src/lib/elementary/elm_thumb_eo.h2
-rw-r--r--src/lib/elementary/elm_thumb_legacy.h6
-rw-r--r--src/lib/elementary/elm_toolbar.c6
-rw-r--r--src/lib/elementary/elm_toolbar_eo.h2
-rw-r--r--src/lib/elementary/elm_toolbar_item_eo.h2
-rw-r--r--src/lib/elementary/elm_view_form_eo.h2
-rw-r--r--src/lib/elementary/elm_view_list_eo.h2
-rw-r--r--src/lib/elementary/elm_web_eo.h2
-rw-r--r--src/lib/elementary/elm_widget.h5
-rw-r--r--src/lib/elementary/elm_widget_combobox.h2
-rw-r--r--src/lib/elementary/elm_widget_item_container_eo.h2
-rw-r--r--src/lib/elementary/elm_widget_item_eo.h2
-rw-r--r--src/lib/elementary/elm_widget_item_static_focus.c56
-rw-r--r--src/lib/elementary/elm_widget_item_static_focus_eo.h2
-rw-r--r--src/lib/elementary/elm_win.h2
-rw-r--r--src/lib/elementary/elm_win_common.h2
-rw-r--r--src/lib/elementary/elm_win_eo.h2
-rw-r--r--src/lib/elementary/elm_win_legacy.h200
-rw-r--r--src/lib/elput/elput_logind.c49
-rw-r--r--src/lib/elua/elua.c109
-rw-r--r--src/lib/elua/elua_private.h2
-rw-r--r--src/lib/elua/meson.build4
-rw-r--r--src/lib/eo/eo.c12
-rw-r--r--src/lib/eo/eo_base_class.c77
-rw-r--r--src/lib/ethumb/ethumb.c8
-rw-r--r--src/lib/evas/Evas.h6
-rw-r--r--src/lib/evas/Evas_Common.h74
-rw-r--r--src/lib/evas/Evas_GL.h2
-rw-r--r--src/lib/evas/Evas_Legacy.h37
-rw-r--r--src/lib/evas/cache/evas_cache_image.c45
-rw-r--r--src/lib/evas/canvas/efl_canvas_image.c8
-rw-r--r--src/lib/evas/canvas/efl_canvas_proxy.c2
-rw-r--r--src/lib/evas/canvas/efl_canvas_textblock.eo8
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_container.c8
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_gradient.c4
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_node.c10
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_node_eo.legacy.h5
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_object.c14
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_shape.c8
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_shape_eo.legacy.h5
-rw-r--r--src/lib/evas/canvas/evas_box_eo.h2
-rw-r--r--src/lib/evas/canvas/evas_callbacks.c9
-rw-r--r--src/lib/evas/canvas/evas_canvas_eo.h2
-rw-r--r--src/lib/evas/canvas/evas_canvas_eo.legacy.c2
-rw-r--r--src/lib/evas/canvas/evas_device.c18
-rw-r--r--src/lib/evas/canvas/evas_events.c30
-rw-r--r--src/lib/evas/canvas/evas_events_legacy.c32
-rw-r--r--src/lib/evas/canvas/evas_grid_eo.h2
-rw-r--r--src/lib/evas/canvas/evas_image_eo.h2
-rw-r--r--src/lib/evas/canvas/evas_image_legacy.c4
-rw-r--r--src/lib/evas/canvas/evas_line_eo.h2
-rw-r--r--src/lib/evas/canvas/evas_main.c14
-rw-r--r--src/lib/evas/canvas/evas_object_main.c10
-rw-r--r--src/lib/evas/canvas/evas_object_smart.c5
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c682
-rw-r--r--src/lib/evas/canvas/evas_render.c29
-rw-r--r--src/lib/evas/canvas/evas_table_eo.h4
-rw-r--r--src/lib/evas/canvas/evas_text_eo.h2
-rw-r--r--src/lib/evas/canvas/evas_textblock_legacy.h6
-rw-r--r--src/lib/evas/canvas/evas_textgrid_eo.h2
-rw-r--r--src/lib/evas/canvas/evas_vg_private.h3
-rw-r--r--src/lib/evas/common/evas_font.h9
-rw-r--r--src/lib/evas/common/evas_font_main.c124
-rw-r--r--src/lib/evas/common/evas_font_ot.c2
-rw-r--r--src/lib/evas/common/evas_image_load.c6
-rw-r--r--src/lib/evas/common/evas_image_main.c1
-rw-r--r--src/lib/evas/common/evas_image_save.c2
-rw-r--r--src/lib/evas/common/evas_scale_smooth_scaler_downx_downy.c2
-rw-r--r--src/lib/evas/common/evas_text_utils.c4
-rw-r--r--src/lib/evas/file/evas_module.c8
-rw-r--r--src/lib/evas/filters/evas_filter_parser.c2
-rw-r--r--src/lib/evas/include/evas_common_private.h3
-rw-r--r--src/lib/evas/include/evas_private.h4
-rw-r--r--src/lib/evas/meson.build3
-rw-r--r--src/lib/evil/evil_dlfcn.h4
-rw-r--r--src/lib/evil/evil_macro_wrapper.h16
-rw-r--r--src/lib/evil/evil_main.c39
-rw-r--r--src/lib/evil/evil_main.h5
-rw-r--r--src/lib/evil/evil_time.c52
-rw-r--r--src/lib/evil/evil_time.h27
-rw-r--r--src/lib/evil/evil_unistd.c30
-rw-r--r--src/lib/evil/evil_util.c2
-rw-r--r--src/modules/ecore_evas/engines/extn/ecore_evas_extn.c4
-rw-r--r--src/modules/ecore_evas/engines/fb/ecore_evas_fb.c4
-rw-r--r--src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c2
-rw-r--r--src/modules/ecore_evas/engines/x/ecore_evas_x.c7
-rw-r--r--src/modules/ecore_imf/scim/meson.build2
-rw-r--r--src/modules/ecore_imf/xim/meson.build2
-rw-r--r--src/modules/elementary/web/none/elm_web_none_eo.h2
-rw-r--r--src/modules/ethumb/emotion/emotion.c5
-rw-r--r--src/modules/evas/engines/buffer/evas_outbuf.c6
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_common.h3
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_core.c8
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_font.c26
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_texture.c5
-rw-r--r--src/modules/evas/engines/gl_generic/evas_engine.c52
-rw-r--r--src/modules/evas/engines/software_generic/evas_ector_software_buffer.c2
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c139
-rw-r--r--src/modules/evas/engines/software_x11/meson.build2
-rw-r--r--src/modules/evas/engines/wayland_shm/evas_engine.c2
-rw-r--r--src/modules/evas/image_loaders/avif/evas_image_load_avif.c382
-rw-r--r--src/modules/evas/image_loaders/gif/evas_image_load_gif.c2
-rw-r--r--src/modules/evas/image_loaders/png/evas_image_load_png.c2
-rw-r--r--src/modules/evas/image_loaders/psd/evas_image_load_psd.c38
-rw-r--r--src/modules/evas/image_savers/avif/evas_image_save_avif.c181
-rw-r--r--src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c116
-rw-r--r--src/static_libs/vg_common/vg_common.h2
-rw-r--r--src/static_libs/vg_common/vg_common_svg.c3
-rw-r--r--src/tests/eet/eet_test_cache.c21
-rw-r--r--src/tests/eina/eina_test_file.c19
-rw-r--r--src/tests/eina/eina_test_lock.c19
-rw-r--r--src/tests/eio/eio_test_manager.c4
-rw-r--r--src/tests/eldbus/eldbus_fake_server.c4
-rw-r--r--src/tests/elementary/efl_ui_test_config.c6
-rw-r--r--src/tests/elementary/efl_ui_test_text.c24
-rw-r--r--src/tests/elementary/elm_test_entry.c47
-rw-r--r--src/tests/elementary/elm_test_slider.c2
-rw-r--r--src/tests/elementary/elm_test_spinner.c6
-rw-r--r--src/tests/eo/signals/signals_main.c31
-rw-r--r--src/tests/eo/suite/eo_test_event.c2
-rw-r--r--src/tests/eo/suite/eo_test_reflection_complex_class_structure.h6
-rw-r--r--src/tests/eolian/data/class_simple_ref_eo.h2
-rw-r--r--src/tests/eolian/data/docs_ref.h2
-rw-r--r--src/tests/eolian/data/function_as_argument_ref.h2
-rw-r--r--src/tests/eolian/data/struct_ref.h2
-rw-r--r--src/tests/eolian/data/typedef_ref.h2
-rw-r--r--src/tests/evas/evas_test_image.c10
-rw-r--r--src/tests/evas/evas_test_textblock.c99
433 files changed, 4732 insertions, 4463 deletions
diff --git a/src/benchmarks/eina/Ecore_Data.h b/src/benchmarks/eina/Ecore_Data.h
index a085401242..e959eb59fc 100644
--- a/src/benchmarks/eina/Ecore_Data.h
+++ b/src/benchmarks/eina/Ecore_Data.h
@@ -299,76 +299,6 @@ EAPI int ecore_dlist_free_cb_set(Ecore_DList *dlist,
299 Ecore_Free_Cb free_func); 299 Ecore_Free_Cb free_func);
300 300
301 301
302
303/*
304 * Hash Table Implementation:
305 *
306 * Traditional hash table implementation. I had tried a list of tables
307 * approach to save on the realloc's but it ended up being much slower than
308 * the traditional approach.
309 */
310
311typedef struct _ecore_hash_node Ecore_Hash_Node;
312# define ECORE_HASH_NODE(hash) ((Ecore_Hash_Node *)hash)
313
314struct _ecore_hash_node
315{
316 Ecore_Hash_Node *next; /* Pointer to the next node in the bucket list */
317 void *key; /* The key for the data node */
318 void *value; /* The value associated with this node */
319};
320
321typedef struct _ecore_hash Ecore_Hash;
322# define ECORE_HASH(hash) ((Ecore_Hash *)hash)
323
324struct _ecore_hash
325{
326 Ecore_Hash_Node **buckets;
327 int size; /* An index into the table of primes to
328 determine size */
329 int nodes; /* The number of nodes currently in the hash */
330
331 int index; /* The current index into the bucket table */
332
333 Ecore_Compare_Cb compare; /* The function used to compare node values */
334 Ecore_Hash_Cb hash_func; /* The callback function to determine hash */
335
336 Ecore_Free_Cb free_key; /* The callback function to free key */
337 Ecore_Free_Cb free_value; /* The callback function to free value */
338};
339
340/* Create and initialize a hash */
341EAPI Ecore_Hash *ecore_hash_new(Ecore_Hash_Cb hash_func,
342 Ecore_Compare_Cb compare);
343EAPI int ecore_hash_init(Ecore_Hash *hash,
344 Ecore_Hash_Cb hash_func,
345 Ecore_Compare_Cb compare);
346
347/* Functions related to freeing the data in the hash table */
348EAPI int ecore_hash_free_key_cb_set(Ecore_Hash *hash,
349 Ecore_Free_Cb function);
350EAPI int ecore_hash_free_value_cb_set(Ecore_Hash *hash,
351 Ecore_Free_Cb function);
352EAPI void ecore_hash_destroy(Ecore_Hash *hash);
353
354EAPI int ecore_hash_count(Ecore_Hash *hash);
355EAPI int ecore_hash_for_each_node(Ecore_Hash *hash,
356 Ecore_For_Each for_each_func,
357 void *user_data);
358EAPI Ecore_List *ecore_hash_keys(Ecore_Hash *hash);
359
360/* Retrieve and store data into the hash */
361EAPI void * ecore_hash_get(Ecore_Hash *hash, const void *key);
362EAPI int ecore_hash_set(Ecore_Hash *hash, void *key, void *value);
363EAPI int ecore_hash_hash_set(Ecore_Hash *hash, Ecore_Hash *set);
364EAPI void * ecore_hash_remove(Ecore_Hash *hash, const void *key);
365EAPI void * ecore_hash_find(Ecore_Hash *hash,
366 Ecore_Compare_Cb compare,
367 const void *value);
368EAPI void ecore_hash_dump_graph(Ecore_Hash *hash);
369EAPI void ecore_hash_dump_stats(Ecore_Hash *hash);
370
371
372typedef struct _ecore_heap Ecore_Sheap; 302typedef struct _ecore_heap Ecore_Sheap;
373# define ECORE_HEAP(heap) ((Ecore_Sheap *)heap) 303# define ECORE_HEAP(heap) ((Ecore_Sheap *)heap)
374 304
@@ -415,11 +345,6 @@ struct _ecore_string
415 int references; 345 int references;
416}; 346};
417 347
418EAPI int ecore_string_init();
419EAPI int ecore_string_shutdown();
420EAPI const char *ecore_string_instance(const char *string);
421EAPI void ecore_string_release(const char *string);
422
423typedef struct _Ecore_Tree_Node Ecore_Tree_Node; 348typedef struct _Ecore_Tree_Node Ecore_Tree_Node;
424# define ECORE_TREE_NODE(object) ((Ecore_Tree_Node *)object) 349# define ECORE_TREE_NODE(object) ((Ecore_Tree_Node *)object)
425struct _Ecore_Tree_Node 350struct _Ecore_Tree_Node
diff --git a/src/benchmarks/eina/city.h b/src/benchmarks/eina/city.h
index 90849a1dc6..3a2b06e26a 100644
--- a/src/benchmarks/eina/city.h
+++ b/src/benchmarks/eina/city.h
@@ -53,6 +53,13 @@ typedef uint32_t uint32;
53typedef uint64_t uint64; 53typedef uint64_t uint64;
54typedef std::pair<uint64, uint64> uint128; 54typedef std::pair<uint64, uint64> uint128;
55 55
56// Hash function for a byte array.
57uint128 CityHash128(const char *s, size_t len);
58
59// Hash function for a byte array. For convenience, a 128-bit seed is also
60// hashed into the result.
61uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed);
62
56#ifdef __cplusplus 63#ifdef __cplusplus
57extern "C" { 64extern "C" {
58#endif 65#endif
@@ -71,13 +78,6 @@ uint64 CityHash64WithSeed(const char *buf, size_t len, uint64 seed);
71uint64 CityHash64WithSeeds(const char *buf, size_t len, 78uint64 CityHash64WithSeeds(const char *buf, size_t len,
72 uint64 seed0, uint64 seed1); 79 uint64 seed0, uint64 seed1);
73 80
74// Hash function for a byte array.
75uint128 CityHash128(const char *s, size_t len);
76
77// Hash function for a byte array. For convenience, a 128-bit seed is also
78// hashed into the result.
79uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed);
80
81// Hash 128 input bits down to 64 bits of output. 81// Hash 128 input bits down to 64 bits of output.
82// This is intended to be a reasonably good hash function. 82// This is intended to be a reasonably good hash function.
83inline uint64 Hash128to64(const uint128& x) { 83inline uint64 Hash128to64(const uint128& x) {
diff --git a/src/benchmarks/eina/ecore_hash.c b/src/benchmarks/eina/ecore_hash.c
deleted file mode 100644
index 24ff219029..0000000000
--- a/src/benchmarks/eina/ecore_hash.c
+++ /dev/null
@@ -1,952 +0,0 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8
9#include "Ecore_Data.h"
10
11#define PRIME_TABLE_MAX 21
12#define PRIME_MIN 17
13#define PRIME_MAX 16777213
14
15#define ECORE_HASH_CHAIN_MAX 3
16
17#define ECORE_COMPUTE_HASH(hash, key) hash->hash_func(key) % \
18 ecore_prime_table[hash->size];
19
20#define ECORE_HASH_INCREASE(hash) ((hash && ecore_prime_table[hash->size] < \
21 PRIME_MAX) ? \
22 (hash->nodes / \
23 ecore_prime_table[hash->size]) > \
24 ECORE_HASH_CHAIN_MAX : FALSE)
25#define ECORE_HASH_REDUCE(hash) ((hash && ecore_prime_table[hash->size] > \
26 PRIME_MIN) ? \
27 (double)hash->nodes / \
28 (double)ecore_prime_table[hash->size - 1] \
29 < ((double)ECORE_HASH_CHAIN_MAX * \
30 0.375) : FALSE)
31
32
33static const unsigned int ecore_prime_table[] =
34{
35 17, 31, 61, 127, 257, 509, 1021,
36 2053, 4093, 8191, 16381, 32771, 65537, 131071, 262147, 524287, 1048573,
37 2097143, 4194301, 8388617, 16777213
38};
39
40
41/* Private hash manipulation functions */
42static int _ecore_hash_node_add(Ecore_Hash *hash,
43 Ecore_Hash_Node *node);
44static Ecore_Hash_Node * _ecore_hash_node_get(Ecore_Hash *hash,
45 const void *key);
46static int _ecore_hash_increase(Ecore_Hash *hash);
47static int _ecore_hash_decrease(Ecore_Hash *hash);
48static inline int _ecore_hash_rehash(Ecore_Hash *hash,
49 Ecore_Hash_Node **old_table,
50 int old_size);
51static int _ecore_hash_bucket_destroy(Ecore_Hash_Node *list,
52 Ecore_Free_Cb keyd,
53 Ecore_Free_Cb valued);
54static inline Ecore_Hash_Node *_ecore_hash_bucket_get(Ecore_Hash *hash,
55 Ecore_Hash_Node *bucket,
56 const void *key);
57
58static Ecore_Hash_Node * _ecore_hash_node_new(void *key, void *value);
59static int _ecore_hash_node_init(Ecore_Hash_Node *node,
60 void *key,
61 void *value);
62static int _ecore_hash_node_destroy(Ecore_Hash_Node *node,
63 Ecore_Free_Cb keyd,
64 Ecore_Free_Cb valued);
65
66/**
67 * @defgroup Ecore_Data_Hash_ADT_Creation_Group Hash Creation Functions
68 *
69 * Functions that create hash tables.
70 */
71
72/**
73 * Creates and initializes a new hash
74 * @param hash_func The function for determining hash position.
75 * @param compare The function for comparing node keys.
76 * @return @c NULL on error, a new hash on success.
77 * @ingroup Ecore_Data_Hash_ADT_Creation_Group
78 */
79EAPI Ecore_Hash *
80ecore_hash_new(Ecore_Hash_Cb hash_func, Ecore_Compare_Cb compare)
81{
82 Ecore_Hash *new_hash = (Ecore_Hash *)malloc(sizeof(Ecore_Hash));
83 if (!new_hash)
84 return NULL;
85
86 if (!ecore_hash_init(new_hash, hash_func, compare))
87 {
88 FREE(new_hash);
89 return NULL;
90 }
91
92 return new_hash;
93}
94
95/**
96 * Initializes the given hash.
97 * @param hash The given hash.
98 * @param hash_func The function used for hashing node keys.
99 * @param compare The function used for comparing node keys.
100 * @return @c TRUE on success, @c FALSE on an error.
101 * @ingroup Ecore_Data_Hash_ADT_Creation_Group
102 */
103EAPI int
104ecore_hash_init(Ecore_Hash *hash,
105 Ecore_Hash_Cb hash_func,
106 Ecore_Compare_Cb compare)
107{
108 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
109
110 memset(hash, 0, sizeof(Ecore_Hash));
111
112 hash->hash_func = hash_func;
113 hash->compare = compare;
114
115 hash->buckets = (Ecore_Hash_Node **)calloc(ecore_prime_table[0],
116 sizeof(Ecore_Hash_Node *));
117
118 return TRUE;
119}
120
121/**
122 * @defgroup Ecore_Data_Hash_ADT_Destruction_Group Hash Destruction Functions
123 *
124 * Functions that destroy hash tables and their contents.
125 */
126
127/**
128 * Sets the function to destroy the keys of the given hash.
129 * @param hash The given hash.
130 * @param function The function used to free the node keys. NULL is a
131 * valid value and means that no function will be called.
132 * @return @c TRUE on success, @c FALSE on error.
133 * @ingroup Ecore_Data_Hash_ADT_Destruction_Group
134 */
135EAPI int
136ecore_hash_free_key_cb_set(Ecore_Hash *hash, Ecore_Free_Cb function)
137{
138 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
139
140 hash->free_key = function;
141
142 return TRUE;
143}
144
145/**
146 * Sets the function to destroy the values in the given hash.
147 * @param hash The given hash.
148 * @param function The function that will free the node values. NULL is a
149 * valid value and means that no function will be called.
150 * @return @c TRUE on success, @c FALSE on error
151 * @ingroup Ecore_Data_Hash_ADT_Destruction_Group
152 */
153EAPI int
154ecore_hash_free_value_cb_set(Ecore_Hash *hash, Ecore_Free_Cb function)
155{
156 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
157
158 hash->free_value = function;
159
160 return TRUE;
161}
162
163/**
164 * @defgroup Ecore_Data_Hash_ADT_Data_Group Hash Data Functions
165 *
166 * Functions that set, access and delete values from the hash tables.
167 */
168
169/**
170 * Sets a key-value pair in the given hash table.
171 * @param hash The given hash table.
172 * @param key The key.
173 * @param value The value.
174 * @return @c TRUE if successful, @c FALSE if not.
175 * @ingroup Ecore_Data_Hash_ADT_Data_Group
176 */
177EAPI int
178ecore_hash_set(Ecore_Hash *hash, void *key, void *value)
179{
180 int ret = FALSE;
181 Ecore_Hash_Node *node;
182
183 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
184
185 node = _ecore_hash_node_get(hash, key);
186 if (node)
187 {
188 if (hash->free_key)
189 hash->free_key(key);
190
191 if (node->value && hash->free_value)
192 hash->free_value(node->value);
193
194 node->value = value;
195 ret = TRUE;
196 }
197 else
198 {
199 node = _ecore_hash_node_new(key, value);
200 if (node)
201 ret = _ecore_hash_node_add(hash, node);
202 }
203
204 return ret;
205}
206
207/**
208 * Sets all key-value pairs from set in the given hash table.
209 * @param hash The given hash table.
210 * @param set The hash table to import.
211 * @return @c TRUE if successful, @c FALSE if not.
212 * @ingroup Ecore_Data_Hash_ADT_Data_Group
213 */
214EAPI int
215ecore_hash_hash_set(Ecore_Hash *hash, Ecore_Hash *set)
216{
217 unsigned int i;
218 Ecore_Hash_Node *node, *old;
219
220 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
221 CHECK_PARAM_POINTER_RETURN("set", set, FALSE);
222
223 for (i = 0; i < ecore_prime_table[set->size]; i++)
224 {
225 /* Hash into a new list to avoid loops of rehashing the same nodes */
226 while ((old = set->buckets[i]))
227 {
228 set->buckets[i] = old->next;
229 old->next = NULL;
230 node = _ecore_hash_node_get(hash, old->key);
231 if (node)
232 {
233 /* This key already exists. Delete the old and add the new
234 * value */
235 if (hash->free_key)
236 hash->free_key(node->key);
237
238 if (hash->free_value)
239 hash->free_value(node->value);
240
241 node->key = old->key;
242 node->value = old->value;
243 free(old);
244 }
245 else
246 _ecore_hash_node_add(hash, old);
247 }
248 }
249 FREE(set->buckets);
250 ecore_hash_init(set, set->hash_func, set->compare);
251 return TRUE;
252}
253
254/**
255 * @brief Frees the hash table and the data contained inside it.
256 * @param hash: The hash table to destroy.
257 * @ingroup Ecore_Data_Hash_ADT_Destruction_Group
258 */
259EAPI void
260ecore_hash_destroy(Ecore_Hash *hash)
261{
262 unsigned int i = 0;
263
264 CHECK_PARAM_POINTER("hash", hash);
265
266 if (hash->buckets)
267 {
268 while (i < ecore_prime_table[hash->size])
269 {
270 if (hash->buckets[i])
271 {
272 Ecore_Hash_Node *bucket;
273
274 /*
275 * Remove the bucket list to avoid possible recursion
276 * on the free callbacks.
277 */
278 bucket = hash->buckets[i];
279 hash->buckets[i] = NULL;
280 _ecore_hash_bucket_destroy(bucket,
281 hash->free_key,
282 hash->free_value);
283 }
284
285 i++;
286 }
287
288 FREE(hash->buckets);
289 }
290
291 FREE(hash);
292
293 return;
294}
295
296/**
297 * @defgroup Ecore_Data_Hash_ADT_Traverse_Group Hash Traverse Functions
298 *
299 * Functions that iterate through hash tables.
300 */
301
302/**
303 * Counts the number of nodes in a hash table.
304 * @param hash The hash table to count current nodes.
305 * @return The number of nodes in the hash.
306 * @ingroup Ecore_Data_Hash_ADT_Destruction_Group
307 */
308EAPI int
309ecore_hash_count(Ecore_Hash *hash)
310{
311 CHECK_PARAM_POINTER_RETURN("hash", hash, 0);
312
313 return hash->nodes;
314}
315
316/**
317 * Runs the @p for_each_func function on each entry in the given hash.
318 * @param hash The given hash.
319 * @param for_each_func The function that each entry is passed to.
320 * @param user_data a pointer passed to calls of for_each_func
321 * @return TRUE on success, FALSE otherwise.
322 * @ingroup Ecore_Data_Hash_ADT_Traverse_Group
323 */
324EAPI int
325ecore_hash_for_each_node(Ecore_Hash *hash,
326 Ecore_For_Each for_each_func,
327 void *user_data)
328{
329 unsigned int i = 0;
330
331 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
332 CHECK_PARAM_POINTER_RETURN("for_each_func", for_each_func, FALSE);
333
334 while (i < ecore_prime_table[hash->size])
335 {
336 if (hash->buckets[i])
337 {
338 Ecore_Hash_Node *node;
339
340 for (node = hash->buckets[i]; node; node = node->next)
341 {
342 for_each_func(node, user_data);
343 }
344 }
345
346 i++;
347 }
348
349 return TRUE;
350}
351
352/**
353 * Retrieves an ecore_list of all keys in the given hash.
354 * @param hash The given hash.
355 * @return new ecore_list on success, NULL otherwise
356 * @ingroup Ecore_Data_Hash_ADT_Traverse_Group
357 */
358EAPI Ecore_List *
359ecore_hash_keys(Ecore_Hash *hash)
360{
361 unsigned int i = 0;
362 Ecore_List *keys;
363
364 CHECK_PARAM_POINTER_RETURN("hash", hash, NULL);
365
366 keys = ecore_list_new();
367 while (i < ecore_prime_table[hash->size])
368 {
369 if (hash->buckets[i])
370 {
371 Ecore_Hash_Node *node;
372
373 for (node = hash->buckets[i]; node; node = node->next)
374 {
375 ecore_list_append(keys, node->key);
376 }
377 }
378
379 i++;
380 }
381 ecore_list_first_goto(keys);
382
383 return keys;
384}
385
386/**
387 * Prints the distribution of the given hash table for graphing.
388 * @param hash The given hash table.
389 */
390EAPI void
391ecore_hash_dump_graph(Ecore_Hash *hash)
392{
393 unsigned int i;
394
395 for (i = 0; i < ecore_prime_table[hash->size]; i++)
396 if (hash->buckets[i])
397 {
398 unsigned int n = 0;
399 Ecore_Hash_Node *node;
400 for (node = hash->buckets[i]; node; node = node->next)
401 n++;
402 printf("%u\t%u", i, n);
403 }
404 else
405 printf("%u\t0", i);
406
407}
408
409/**
410 * Prints the distribution of the given hash table for graphing.
411 * @param hash The given hash table.
412 */
413EAPI void
414ecore_hash_dump_stats(Ecore_Hash *hash)
415{
416 unsigned int i;
417 double variance, sum_n_2 = 0, sum_n = 0;
418
419 if (!hash->size) return;
420 for (i = 0; i < ecore_prime_table[hash->size]; i++)
421 {
422 if (hash->buckets[i])
423 {
424 int n = 0;
425 Ecore_Hash_Node *node;
426 for (node = hash->buckets[i]; node; node = node->next)
427 n++;
428 sum_n_2 += ((double)n * (double)n);
429 sum_n += (double)n;
430 }
431 }
432 if (i)
433 {
434 variance = (sum_n_2 - ((sum_n * sum_n) / (double)i)) / (double)i;
435 printf("Average length: %f\n\tvariance^2: %f", (sum_n / (double)i),
436 variance);
437 }
438}
439
440static int
441_ecore_hash_bucket_destroy(Ecore_Hash_Node *list,
442 Ecore_Free_Cb keyd,
443 Ecore_Free_Cb valued)
444{
445 Ecore_Hash_Node *node;
446
447 CHECK_PARAM_POINTER_RETURN("list", list, FALSE);
448
449 for (node = list; node; node = list)
450 {
451 list = list->next;
452 _ecore_hash_node_destroy(node, keyd, valued);
453 }
454
455 return TRUE;
456}
457
458/*
459 * @brief Add the node to the hash table
460 * @param hash: the hash table to add the key
461 * @param node: the node to add to the hash table
462 * @return Returns FALSE on error, TRUE on success
463 */
464static int
465_ecore_hash_node_add(Ecore_Hash *hash, Ecore_Hash_Node *node)
466{
467 size_t hash_val;
468
469 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
470 CHECK_PARAM_POINTER_RETURN("node", node, FALSE);
471
472 /* Check to see if the hash needs to be resized */
473 if (ECORE_HASH_INCREASE(hash))
474 _ecore_hash_increase(hash);
475
476 /* Compute the position in the table */
477 if (!hash->hash_func)
478 hash_val = (size_t)node->key % ecore_prime_table[hash->size];
479 else
480 hash_val = ECORE_COMPUTE_HASH(hash, node->key);
481
482 /* Prepend the node to the list at the index position */
483 node->next = hash->buckets[hash_val];
484 hash->buckets[hash_val] = node;
485 hash->nodes++;
486
487 return TRUE;
488}
489
490/**
491 * Retrieves the value associated with the given key from the given hash
492 * table.
493 * @param hash The given hash table.
494 * @param key The key to search for.
495 * @return The value corresponding to key on success, @c NULL otherwise.
496 * @ingroup Ecore_Data_Hash_ADT_Data_Group
497 */
498EAPI void *
499ecore_hash_get(Ecore_Hash *hash, const void *key)
500{
501 void *data;
502 Ecore_Hash_Node *node;
503
504 CHECK_PARAM_POINTER_RETURN("hash", hash, NULL);
505
506 node = _ecore_hash_node_get(hash, key);
507 if (!node)
508 return NULL;
509
510 data = node->value;
511
512 return data;
513}
514
515/**
516 * Removes the value associated with the given key in the given hash
517 * table.
518 * @param hash The given hash table.
519 * @param key The key to search for.
520 * @return The value corresponding to the key on success. @c NULL is
521 * returned if there is an error.
522 * @ingroup Ecore_Data_Hash_ADT_Data_Group
523 */
524EAPI void *
525ecore_hash_remove(Ecore_Hash *hash, const void *key)
526{
527 Ecore_Hash_Node *node = NULL;
528 Ecore_Hash_Node *list;
529 size_t hash_val;
530 void *ret = NULL;
531
532 CHECK_PARAM_POINTER_RETURN("hash", hash, NULL);
533
534 /* Compute the position in the table */
535 if (!hash->hash_func)
536 hash_val = (size_t)key % ecore_prime_table[hash->size];
537 else
538 hash_val = ECORE_COMPUTE_HASH(hash, key);
539
540 /*
541 * If their is a list that could possibly hold the key/value pair
542 * traverse it and remove the hash node.
543 */
544 if (hash->buckets[hash_val])
545 {
546 list = hash->buckets[hash_val];
547
548 /*
549 * Traverse the list to find the specified key
550 */
551 node = list;
552 if (hash->compare)
553 while ((node) && (hash->compare(node->key, key) != 0))
554 {
555 list = node;
556 node = node->next;
557 }
558 else
559 while ((node) && (node->key != key))
560 {
561 list = node;
562 node = node->next;
563 }
564
565 /*
566 * Remove the node with the matching key and free it's memory
567 */
568 if (node)
569 {
570 if (list == node)
571 hash->buckets[hash_val] = node->next;
572 else
573 list->next = node->next;
574
575 ret = node->value;
576 node->value = NULL;
577 _ecore_hash_node_destroy(node, hash->free_key, NULL);
578 hash->nodes--;
579 }
580 }
581
582 if (ECORE_HASH_REDUCE(hash))
583 _ecore_hash_decrease(hash);
584
585 return ret;
586}
587
588/**
589 * Retrieves the first value that matches
590 * table.
591 * @param hash The given hash table.
592 * @param key The key to search for.
593 * @return The value corresponding to key on success, @c NULL otherwise.
594 * @ingroup Ecore_Data_Hash_ADT_Data_Group
595 */
596EAPI void *
597ecore_hash_find(Ecore_Hash *hash, Ecore_Compare_Cb compare, const void *value)
598{
599 unsigned int i = 0;
600
601 CHECK_PARAM_POINTER_RETURN("hash", hash, NULL);
602 CHECK_PARAM_POINTER_RETURN("compare", compare, NULL);
603 CHECK_PARAM_POINTER_RETURN("value", value, NULL);
604
605 while (i < ecore_prime_table[hash->size])
606 {
607 if (hash->buckets[i])
608 {
609 Ecore_Hash_Node *node;
610
611 for (node = hash->buckets[i]; node; node = node->next)
612 {
613 if (!compare(node->value, value))
614 return node->value;
615 }
616 }
617
618 i++;
619 }
620
621 return NULL;
622}
623
624/*
625 * @brief Retrieve the node associated with key
626 * @param hash: the hash table to search for the key
627 * @param key: the key to search for in the hash table
628 * @return Returns NULL on error, node corresponding to key on success
629 */
630static Ecore_Hash_Node *
631_ecore_hash_node_get(Ecore_Hash *hash, const void *key)
632{
633 size_t hash_val;
634 Ecore_Hash_Node *node = NULL;
635
636 CHECK_PARAM_POINTER_RETURN("hash", hash, NULL);
637
638 if (!hash->buckets)
639 return NULL;
640
641 /* Compute the position in the table */
642 if (!hash->hash_func)
643 hash_val = (size_t)key % ecore_prime_table[hash->size];
644 else
645 hash_val = ECORE_COMPUTE_HASH(hash, key);
646
647 /* Grab the bucket at the specified position */
648 if (hash->buckets[hash_val])
649 {
650 node = _ecore_hash_bucket_get(hash, hash->buckets[hash_val], key);
651 /*
652 * Move matched node to the front of the list as it's likely
653 * to be searched for again soon.
654 */
655 if (node && node != hash->buckets[hash_val])
656 {
657 node->next = hash->buckets[hash_val];
658 hash->buckets[hash_val] = node;
659 }
660 }
661
662 return node;
663}
664
665/*
666 * @brief Search the hash bucket for a specified key
667 * @param hash: the hash table to retrieve the comparison function
668 * @param bucket: the list to search for the key
669 * @param key: the key to search for in the list
670 * @return Returns NULL on error or not found, the found node on success
671 */
672static inline Ecore_Hash_Node *
673_ecore_hash_bucket_get(Ecore_Hash *hash,
674 Ecore_Hash_Node *bucket,
675 const void *key)
676{
677 Ecore_Hash_Node *prev = NULL;
678 Ecore_Hash_Node *node = NULL;
679
680 /*
681 * Traverse the list to find the desired node, if the node is in the
682 * list, then return the node.
683 */
684 if (hash->compare)
685 for (node = bucket; node; node = node->next)
686 {
687 if (hash->compare(node->key, key) == 0)
688 break;
689
690 prev = node;
691 }
692 else
693 for (node = bucket; node; node = node->next)
694 {
695 if (node->key == key)
696 break;
697
698 prev = node;
699 }
700
701 /*
702 * Remove node from the list to replace it at the beginning.
703 */
704 if (node && prev)
705 {
706 prev->next = node->next;
707 node->next = NULL;
708 }
709
710 return node;
711}
712
713/*
714 * @brief Increase the size of the hash table by approx. 2 * current size
715 * @param hash: the hash table to increase the size of
716 * @return Returns TRUE on success, FALSE on error
717 */
718static int
719_ecore_hash_increase(Ecore_Hash *hash)
720{
721 void *old;
722
723 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
724
725 /* Max size reached so return FALSE */
726 if ((ecore_prime_table[hash->size] == PRIME_MAX) ||
727 (hash->size == PRIME_TABLE_MAX))
728 return FALSE;
729
730 /*
731 * Increase the size of the hash and save a pointer to the old data
732 */
733 hash->size++;
734 old = hash->buckets;
735
736 /*
737 * Allocate a new bucket area, of the new larger size
738 */
739 hash->buckets =
740 calloc(ecore_prime_table[hash->size], sizeof(Ecore_Hash_Node *));
741
742 /*
743 * Make sure the allocation succeeded, if not replace the old data and
744 * return a failure.
745 */
746 if (!hash->buckets)
747 {
748 hash->buckets = old;
749 hash->size--;
750 return FALSE;
751 }
752
753 hash->nodes = 0;
754
755 /*
756 * Now move all of the old data into the new bucket area
757 */
758 if (_ecore_hash_rehash(hash, old, hash->size - 1))
759 {
760 FREE(old);
761 return TRUE;
762 }
763
764 /*
765 * Free the old buckets regardless of success.
766 */
767 FREE(old);
768
769 return FALSE;
770}
771
772/*
773 * @brief Decrease the size of the hash table by < 1/2 * current size
774 * @param hash: the hash table to decrease the size of
775 * @return Returns TRUE on success, FALSE on error
776 */
777static int
778_ecore_hash_decrease(Ecore_Hash *hash)
779{
780 Ecore_Hash_Node **old;
781
782 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
783
784 if (ecore_prime_table[hash->size] == PRIME_MIN)
785 return FALSE;
786
787 /*
788 * Decrease the hash size and store a pointer to the old data
789 */
790 hash->size--;
791 old = hash->buckets;
792
793 /*
794 * Allocate a new area to store the data
795 */
796 hash->buckets = (Ecore_Hash_Node **)calloc(ecore_prime_table[hash->size],
797 sizeof(Ecore_Hash_Node *));
798
799 /*
800 * Make sure allocation succeeded otherwise rreturn to the previous
801 * state
802 */
803 if (!hash->buckets)
804 {
805 hash->buckets = old;
806 hash->size++;
807 return FALSE;
808 }
809
810 hash->nodes = 0;
811
812 if (_ecore_hash_rehash(hash, old, hash->size + 1))
813 {
814 FREE(old);
815 return TRUE;
816 }
817
818 return FALSE;
819}
820
821/*
822 * @brief Rehash the nodes of a table into the hash table
823 * @param hash: the hash to place the nodes of the table
824 * @param table: the table to remove the nodes from and place in hash
825 * @return Returns TRUE on success, FALSE on error
826 */
827static inline int
828_ecore_hash_rehash(Ecore_Hash *hash, Ecore_Hash_Node **old_table, int old_size)
829{
830 unsigned int i;
831 Ecore_Hash_Node *old;
832
833 CHECK_PARAM_POINTER_RETURN("hash", hash, FALSE);
834 CHECK_PARAM_POINTER_RETURN("old_table", old_table, FALSE);
835
836 for (i = 0; i < ecore_prime_table[old_size]; i++)
837 {
838 /* Hash into a new list to avoid loops of rehashing the same nodes */
839 while ((old = old_table[i]))
840 {
841 old_table[i] = old->next;
842 old->next = NULL;
843 _ecore_hash_node_add(hash, old);
844 }
845 }
846
847 return TRUE;
848}
849
850/*
851 * @brief Create a new hash node for key and value storage
852 * @param key: the key for this node
853 * @param value: the value that the key references
854 * @return Returns NULL on error, a new hash node on success
855 */
856static Ecore_Hash_Node *
857_ecore_hash_node_new(void *key, void *value)
858{
859 Ecore_Hash_Node *node;
860
861 node = (Ecore_Hash_Node *)malloc(sizeof(Ecore_Hash_Node));
862 if (!node)
863 return NULL;
864
865 if (!_ecore_hash_node_init(node, key, value))
866 {
867 FREE(node);
868 return NULL;
869 }
870
871 return node;
872}
873
874/*
875 * @brief Initialize a hash node to some sane default values
876 * @param node: the node to set the values
877 * @param key: the key to reference this node
878 * @param value: the value that key refers to
879 * @return Returns TRUE on success, FALSE on error
880 */
881static int
882_ecore_hash_node_init(Ecore_Hash_Node *node, void *key, void *value)
883{
884 CHECK_PARAM_POINTER_RETURN("node", node, FALSE);
885
886 node->key = key;
887 node->value = value;
888
889 return TRUE;
890}
891
892/*
893 * @brief Destroy a node and call the specified callbacks to free data
894 * @param node: the node to be destroyed
895 * @param keyd: the function to free the key
896 * @param valued: the function to free the value
897 * @return Returns TRUE on success, FALSE on error
898 */
899static int
900_ecore_hash_node_destroy(Ecore_Hash_Node *node,
901 Ecore_Free_Cb keyd,
902 Ecore_Free_Cb valued)
903{
904 CHECK_PARAM_POINTER_RETURN("node", node, FALSE);
905
906 if (keyd)
907 keyd(node->key);
908
909 if (valued)
910 valued(node->value);
911
912 FREE(node);
913
914 return TRUE;
915}
916
917int
918ecore_str_compare(const void *key1, const void *key2)
919{
920 const char *k1, *k2;
921
922 if (!key1 || !key2)
923 return ecore_direct_compare(key1, key2);
924 else if (key1 == key2)
925 return 0;
926
927 k1 = key1;
928 k2 = key2;
929
930 return strcmp(k1, k2);
931}
932
933unsigned int
934ecore_str_hash(const void *key)
935{
936 int i;
937 unsigned int mask;
938 unsigned int value = 0;
939 const char *k = key;
940
941 if (!k)
942 return 0;
943
944 mask = (sizeof(unsigned int) * 8) - 1;
945
946 for (i = 0; k[i] != '\0'; i++)
947 {
948 value ^= ((unsigned int)k[i] << ((i * 5) & mask));
949 }
950
951 return value;
952}
diff --git a/src/benchmarks/eina/ecore_strings.c b/src/benchmarks/eina/ecore_strings.c
deleted file mode 100644
index e56235226c..0000000000
--- a/src/benchmarks/eina/ecore_strings.c
+++ /dev/null
@@ -1,164 +0,0 @@
1#include <stdlib.h>
2#include <string.h>
3
4#include "Ecore_Data.h"
5
6static void ecore_string_free_cb(void *data);
7
8static Ecore_Hash *ecore_strings = NULL;
9static int ecore_string_init_count = 0;
10
11/**
12 * @defgroup Ecore_String_Group String Instance Functions
13 *
14 * These functions allow you to store one copy of a string, and use it
15 * throughout your program.
16 *
17 * This is a method to reduce the number of duplicated strings kept in
18 * memory. It's pretty common for the same strings to be dynamically
19 * allocated repeatedly between applications and libraries, especially in
20 * circumstances where you could have multiple copies of a structure that
21 * allocates the string. So rather than duplicating and freeing these
22 * strings, you request a read-only pointer to an existing string and
23 * only incur the overhead of a hash lookup.
24 *
25 * It sounds like micro-optimizing, but profiling has shown this can have
26 * a significant impact as you scale the number of copies up. It improves
27 * string creation/destruction speed, reduces memory use and decreases
28 * memory fragmentation, so a win all-around.
29 */
30
31/**
32 * Initialize the ecore string internal structure.
33 * @return Zero on failure, non-zero on successful initialization.
34 */
35EAPI int
36ecore_string_init(void)
37{
38 /*
39 * No strings have been loaded at this point, so create the hash
40 * table for storing string info for later.
41 */
42 if (!ecore_string_init_count)
43 {
44 ecore_strings = ecore_hash_new(ecore_str_hash, ecore_str_compare);
45 if (!ecore_strings)
46 return 0;
47
48 ecore_hash_free_value_cb_set(ecore_strings, ecore_string_free_cb);
49 }
50
51 ecore_string_init_count++;
52
53 return 1;
54}
55
56/**
57 * Retrieves an instance of a string for use in an ecore program.
58 * @param string The string to retrieve an instance of.
59 * @return A pointer to an instance of the string on success.
60 * @c NULL on failure.
61 * @ingroup Ecore_String_Group
62 */
63EAPI const char *
64ecore_string_instance(const char *string)
65{
66 Ecore_String *str;
67
68 CHECK_PARAM_POINTER_RETURN("string", string, NULL);
69
70 /*
71 * Check for a previous instance of the string, if not found, create
72 * it.
73 */
74 str = ecore_hash_get(ecore_strings, string);
75 if (!str)
76 {
77 int length;
78
79 /*
80 * Allocate and initialize a new string reference.
81 */
82 length = strlen(string) + 1;
83
84 str =
85 (Ecore_String *)malloc(sizeof(Ecore_String) + length * sizeof(char));
86 if (!str) return NULL;
87
88 str->string = (char *)(str + 1);
89 str->references = 0;
90
91 memcpy(str->string, string, length);
92
93 ecore_hash_set(ecore_strings, str->string, str);
94 }
95
96 str->references++;
97
98 return str->string;
99}
100
101/**
102 * Notes that the given string has lost an instance.
103 *
104 * It will free the string if no other instances are left.
105 *
106 * @param string The given string.
107 * @ingroup Ecore_String_Group
108 */
109EAPI void
110ecore_string_release(const char *string)
111{
112 Ecore_String *str;
113
114 CHECK_PARAM_POINTER("string", string);
115
116 str = ecore_hash_get(ecore_strings, (char *)string);
117 if (!str)
118 return;
119
120 str->references--;
121 if (str->references < 1)
122 {
123 ecore_hash_remove(ecore_strings, (char *)string);
124 FREE(str);
125 }
126}
127
128EAPI void
129ecore_string_hash_dump_graph(void)
130{
131 ecore_hash_dump_graph(ecore_strings);
132}
133
134EAPI void
135ecore_string_hash_dump_stats(void)
136{
137 ecore_hash_dump_stats(ecore_strings);
138}
139
140/**
141 * Shutdown the ecore string internal structures
142 * @return 0 when the module is completely shut down, 1 or
143 * greater otherwise.
144 */
145EAPI int
146ecore_string_shutdown(void)
147{
148 --ecore_string_init_count;
149 if (!ecore_string_init_count)
150 {
151 ecore_hash_destroy(ecore_strings);
152 ecore_strings = NULL;
153 }
154 return ecore_string_init_count;
155}
156
157static void
158ecore_string_free_cb(void *data)
159{
160 Ecore_String *str;
161
162 str = data;
163 FREE(str);
164}
diff --git a/src/benchmarks/eina/eina_bench.c b/src/benchmarks/eina/eina_bench.c
index 1ca7e51c18..5d758485f6 100644
--- a/src/benchmarks/eina/eina_bench.c
+++ b/src/benchmarks/eina/eina_bench.c
@@ -36,7 +36,6 @@ struct _Eina_Benchmark_Case
36}; 36};
37 37
38static const Eina_Benchmark_Case etc[] = { 38static const Eina_Benchmark_Case etc[] = {
39 { "Hash", eina_bench_hash, EINA_TRUE },
40 { "Hash_Short_Key", eina_bench_crc_hash_short, EINA_TRUE }, 39 { "Hash_Short_Key", eina_bench_crc_hash_short, EINA_TRUE },
41 { "Hash_Medium_Key", eina_bench_crc_hash_medium, EINA_TRUE }, 40 { "Hash_Medium_Key", eina_bench_crc_hash_medium, EINA_TRUE },
42 { "Hash_Large_key", eina_bench_crc_hash_large, EINA_TRUE }, 41 { "Hash_Large_key", eina_bench_crc_hash_large, EINA_TRUE },
@@ -129,8 +128,6 @@ main(int argc, char **argv)
129 break; 128 break;
130 } 129 }
131 130
132 eina_bench_e17();
133
134 eina_shutdown(); 131 eina_shutdown();
135 132
136 _mempool_shutdown(); 133 _mempool_shutdown();
diff --git a/src/benchmarks/eina/eina_bench.h b/src/benchmarks/eina/eina_bench.h
index 747ac6f39f..053bbba793 100644
--- a/src/benchmarks/eina/eina_bench.h
+++ b/src/benchmarks/eina/eina_bench.h
@@ -36,7 +36,4 @@ void eina_bench_rectangle_pool(Eina_Benchmark *bench);
36void eina_bench_quadtree(Eina_Benchmark *bench); 36void eina_bench_quadtree(Eina_Benchmark *bench);
37void eina_bench_promise(Eina_Benchmark *bench); 37void eina_bench_promise(Eina_Benchmark *bench);
38 38
39/* Specific benchmark. */
40void eina_bench_e17(void);
41
42#endif 39#endif
diff --git a/src/benchmarks/eina/eina_bench_convert.c b/src/benchmarks/eina/eina_bench_convert.c
index aafe9ea3ba..a34ca80f4b 100644
--- a/src/benchmarks/eina/eina_bench_convert.c
+++ b/src/benchmarks/eina/eina_bench_convert.c
@@ -109,8 +109,8 @@ static void
109eina_bench_convert_dtoa(int request) 109eina_bench_convert_dtoa(int request)
110{ 110{
111 char tmp[128]; 111 char tmp[128];
112 long long m; 112 long long m = 0;
113 long e; 113 long e = 0;
114 double r; 114 double r;
115 int i; 115 int i;
116 116
diff --git a/src/benchmarks/eina/eina_bench_hash.c b/src/benchmarks/eina/eina_bench_hash.c
deleted file mode 100644
index 96748183e0..0000000000
--- a/src/benchmarks/eina/eina_bench_hash.c
+++ /dev/null
@@ -1,551 +0,0 @@
1/* EINA - EFL data type library
2 * Copyright (C) 2008 Cedric Bail
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library;
16 * if not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifdef HAVE_CONFIG_H
20# include "config.h"
21#endif
22
23#include <stdlib.h>
24#include <stdio.h>
25#include <string.h>
26#include <time.h>
27
28#ifdef EINA_BENCH_HAVE_GLIB
29# include <glib.h>
30#endif
31
32#include "Evas_Data.h"
33#include "Ecore_Data.h"
34
35#include "eina_hash.h"
36#include "eina_array.h"
37#include "eina_bench.h"
38#include "eina_rbtree.h"
39#include "eina_convert.h"
40
41#ifdef CITYHASH_BENCH
42// Hash function for a byte array.
43uint64_t CityHash64(const char *buf, size_t len);
44
45static int
46city_hash(const char *buf, int len)
47{
48 return (int)CityHash64(buf, len);
49}
50
51static unsigned int
52_eina_string_key_length(const char *key)
53{
54 if (!key)
55 return 0;
56
57 return (int)strlen(key) + 1;
58}
59
60static int
61_eina_string_key_cmp(const char *key1, EINA_UNUSED int key1_length,
62 const char *key2, EINA_UNUSED int key2_length)
63{
64 return strcmp(key1, key2);
65}
66#endif
67
68
69typedef struct _Eina_Bench_Rbtree Eina_Bench_Rbtree;
70struct _Eina_Bench_Rbtree
71{
72 Eina_Rbtree node;
73 char key[10];
74 int value;
75};
76
77static Eina_Rbtree_Direction
78_eina_bench_rbtree_cmp(const Eina_Bench_Rbtree *left,
79 const Eina_Bench_Rbtree *right,
80 EINA_UNUSED void *data)
81{
82 if (!left)
83 return EINA_RBTREE_RIGHT;
84
85 if (!right)
86 return EINA_RBTREE_LEFT;
87
88 return strcmp(left->key,
89 right->key) < 0 ? EINA_RBTREE_LEFT : EINA_RBTREE_RIGHT;
90}
91
92static inline int
93_eina_bench_rbtree_key(const Eina_Bench_Rbtree *node,
94 const char *key,
95 int length,
96 EINA_UNUSED void *data)
97{
98 return strncmp(node->key, key, length);
99}
100
101static void
102_eina_bench_rbtree_free(Eina_Rbtree *node, EINA_UNUSED void *data)
103{
104 free(node);
105}
106
107static void
108eina_bench_lookup_rbtree(int request)
109{
110 Eina_Rbtree *root = NULL;
111 int i;
112 int j;
113
114 for (i = 0; i < request; ++i)
115 {
116 Eina_Bench_Rbtree *tmp;
117
118 tmp = malloc(sizeof (Eina_Bench_Rbtree));
119 if (!tmp)
120 continue;
121
122 tmp->value = i;
123 eina_convert_itoa(i, tmp->key);
124
125 root = eina_rbtree_inline_insert(root,
126 &tmp->node,
127 EINA_RBTREE_CMP_NODE_CB(
128 _eina_bench_rbtree_cmp),
129 NULL);
130 }
131
132 srand(time(NULL));
133
134 for (j = 0; j < 200; ++j)
135 for (i = 0; i < request; ++i)
136 {
137 Eina_Rbtree *tmp;
138 char tmp_key[10];
139
140 eina_convert_itoa(rand() % request, tmp_key);
141
142 tmp = eina_rbtree_inline_lookup(root,
143 tmp_key,
144 10,
145 EINA_RBTREE_CMP_KEY_CB(
146 _eina_bench_rbtree_key),
147 NULL);
148 /* Suppress warnings as we really don't want to do anything. */
149 (void) tmp;
150 }
151
152 eina_rbtree_delete(root, EINA_RBTREE_FREE_CB(_eina_bench_rbtree_free), NULL);
153}
154
155static void
156eina_bench_lookup_murmur(int request)
157{
158 Eina_Hash *hash = NULL;
159 int *tmp_val;
160 unsigned int i;
161 unsigned int j;
162
163 hash = eina_hash_new(EINA_KEY_LENGTH(_eina_string_key_length),
164 EINA_KEY_CMP(_eina_string_key_cmp),
165 EINA_KEY_HASH(eina_hash_murmur3),
166 free,
167 8);
168
169 for (i = 0; i < (unsigned int)request; ++i)
170 {
171 char tmp_key[10];
172
173 tmp_val = malloc(sizeof (int));
174
175 if (!tmp_val)
176 continue;
177
178 eina_convert_itoa(i, tmp_key);
179 *tmp_val = i;
180
181 eina_hash_add(hash, tmp_key, tmp_val);
182 }
183
184 srand(time(NULL));
185
186 for (j = 0; j < 200; ++j)
187 for (i = 0; i < (unsigned int)request; ++i)
188 {
189 char tmp_key[10];
190
191 eina_convert_itoa(rand() % request, tmp_key);
192 tmp_val = eina_hash_find(hash, tmp_key);
193 }
194
195 eina_hash_free(hash);
196}
197
198#ifdef CITYHASH_BENCH
199static void
200eina_bench_lookup_cityhash(int request)
201{
202 Eina_Hash *hash = NULL;
203 int *tmp_val;
204 unsigned int i;
205 unsigned int j;
206
207 hash = eina_hash_new(EINA_KEY_LENGTH(_eina_string_key_length),
208 EINA_KEY_CMP(_eina_string_key_cmp),
209 EINA_KEY_HASH(city_hash),
210 free,
211 8);
212
213 for (i = 0; i < (unsigned int)request; ++i)
214 {
215 char tmp_key[10];
216
217 tmp_val = malloc(sizeof (int));
218
219 if (!tmp_val)
220 continue;
221
222 eina_convert_itoa(i, tmp_key);
223 *tmp_val = i;
224
225 eina_hash_add(hash, tmp_key, tmp_val);
226 }
227
228 srand(time(NULL));
229
230 for (j = 0; j < 200; ++j)
231 for (i = 0; i < (unsigned int)request; ++i)
232 {
233 char tmp_key[10];
234
235 eina_convert_itoa(rand() % request, tmp_key);
236 tmp_val = eina_hash_find(hash, tmp_key);
237 }
238
239 eina_hash_free(hash);
240}
241#endif
242
243static void
244eina_bench_lookup_superfast(int request)
245{
246 Eina_Hash *hash = NULL;
247 int *tmp_val;
248 unsigned int i;
249 unsigned int j;
250
251 hash = eina_hash_string_superfast_new(free);
252
253 for (i = 0; i < (unsigned int)request; ++i)
254 {
255 char tmp_key[10];
256
257 tmp_val = malloc(sizeof (int));
258
259 if (!tmp_val)
260 continue;
261
262 eina_convert_itoa(i, tmp_key);
263 *tmp_val = i;
264
265 eina_hash_add(hash, tmp_key, tmp_val);
266 }
267
268 srand(time(NULL));
269
270 for (j = 0; j < 200; ++j)
271 for (i = 0; i < (unsigned int)request; ++i)
272 {
273 char tmp_key[10];
274
275 eina_convert_itoa(rand() % request, tmp_key);
276 tmp_val = eina_hash_find(hash, tmp_key);
277 }
278
279 eina_hash_free(hash);
280}
281
282static void
283eina_bench_lookup_djb2(int request)
284{
285 Eina_Hash *hash = NULL;
286 int *tmp_val;
287 unsigned int i;
288 unsigned int j;
289
290 hash = eina_hash_string_djb2_new(free);
291
292 for (i = 0; i < (unsigned int)request; ++i)
293 {
294 char tmp_key[10];
295
296 tmp_val = malloc(sizeof (int));
297
298 if (!tmp_val)
299 continue;
300
301 eina_convert_itoa(i, tmp_key);
302 *tmp_val = i;
303
304 eina_hash_add(hash, tmp_key, tmp_val);
305 }
306
307 srand(time(NULL));
308
309 for (j = 0; j < 200; ++j)
310 for (i = 0; i < (unsigned int)request; ++i)
311 {
312 char tmp_key[10];
313
314 eina_convert_itoa(rand() % request, tmp_key);
315
316 tmp_val = eina_hash_find(hash, tmp_key);
317 }
318
319 eina_hash_free(hash);
320}
321
322typedef struct _Eina_Bench_DJB2 Eina_Bench_DJB2;
323struct _Eina_Bench_DJB2
324{
325 char *key;
326 int value;
327};
328
329static void
330eina_bench_lookup_djb2_inline(int request)
331{
332 Eina_Hash *hash = NULL;
333 Eina_Bench_DJB2 *elm;
334 unsigned int i;
335 unsigned int j;
336
337 hash = eina_hash_string_djb2_new(free);
338
339 for (i = 0; i < (unsigned int)request; ++i)
340 {
341 int length;
342
343 elm = malloc(sizeof (Eina_Bench_DJB2) + 10);
344 if (!elm)
345 continue;
346
347 elm->key = (char *)(elm + 1);
348
349 length = eina_convert_itoa(i, elm->key) + 1;
350 elm->value = i;
351
352 eina_hash_direct_add_by_hash(hash, elm->key, length,
353 eina_hash_djb2(elm->key, length), elm);
354 }
355
356 srand(time(NULL));
357
358 for (j = 0; j < 200; ++j)
359 for (i = 0; i < (unsigned int)request; ++i)
360 {
361 char tmp_key[10];
362 int length = eina_convert_itoa(rand() % request, tmp_key) + 1;
363
364 elm =
365 eina_hash_find_by_hash(hash, tmp_key, length,
366 eina_hash_djb2(tmp_key, length));
367 }
368
369 eina_hash_free(hash);
370}
371
372#ifdef EINA_BENCH_HAVE_GLIB
373typedef struct _Eina_Bench_Glib Eina_Bench_Glib;
374struct _Eina_Bench_Glib
375{
376 char *key;
377 int value;
378};
379
380static void
381eina_bench_lookup_ghash(int request)
382{
383 Eina_Bench_Glib *elm;
384 GHashTable *hash;
385 unsigned int i;
386 unsigned int j;
387
388 hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, free);
389
390 for (i = 0; i < (unsigned int)request; ++i)
391 {
392 elm = malloc(sizeof (Eina_Bench_Glib) + 10);
393 if (!elm)
394 continue;
395
396 elm->key = (char *)(elm + 1);
397
398 eina_convert_itoa(i, elm->key);
399 elm->value = i;
400
401 g_hash_table_insert(hash, elm->key, elm);
402 }
403
404 srand(time(NULL));
405
406 for (j = 0; j < 200; ++j)
407 for (i = 0; i < (unsigned int)request; ++i)
408 {
409 char tmp_key[10];
410
411 eina_convert_itoa(rand() % request, tmp_key);
412
413 elm = g_hash_table_lookup(hash, tmp_key);
414 }
415
416 g_hash_table_destroy(hash);
417}
418#endif
419
420static void
421eina_bench_lookup_evas(int request)
422{
423 Evas_Hash *hash = NULL;
424 Eina_Array *array = NULL;
425 int *tmp_val;
426 Eina_Array_Iterator it;
427 unsigned int i;
428 unsigned int j;
429
430 array = eina_array_new(10000);
431
432 for (i = 0; i < (unsigned int)request; ++i)
433 {
434 char tmp_key[10];
435
436 tmp_val = malloc(sizeof (int));
437
438 if (!tmp_val)
439 continue;
440
441 eina_convert_itoa(i, tmp_key);
442 *tmp_val = i;
443
444 hash = evas_hash_add(hash, tmp_key, tmp_val);
445
446 eina_array_push(array, tmp_val);
447 }
448
449 srand(time(NULL));
450
451 for (j = 0; j < 200; ++j)
452 for (i = 0; i < (unsigned int)request; ++i)
453 {
454 char tmp_key[10];
455
456 eina_convert_itoa(rand() % request, tmp_key);
457
458 tmp_val = evas_hash_find(hash, tmp_key);
459 }
460
461 evas_hash_free(hash);
462
463 EINA_ARRAY_ITER_NEXT(array, i, tmp_val, it)
464 free(tmp_val);
465
466 eina_array_free(array);
467}
468
469typedef struct _Eina_Bench_Ecore Eina_Bench_Ecore;
470struct _Eina_Bench_Ecore
471{
472 char *key;
473 int value;
474};
475
476static void
477eina_bench_lookup_ecore(int request)
478{
479 Ecore_Hash *hash = NULL;
480 Eina_Bench_Ecore *elm;
481 unsigned int i;
482 unsigned int j;
483
484 hash = ecore_hash_new(ecore_str_hash, ecore_str_compare);
485
486 ecore_hash_free_key_cb_set(hash, NULL);
487 ecore_hash_free_value_cb_set(hash, free);
488
489 for (i = 0; i < (unsigned int)request; ++i)
490 {
491 elm = malloc(sizeof (Eina_Bench_Ecore) + 10);
492 if (!elm)
493 continue;
494
495 elm->key = (char *)(elm + 1);
496 eina_convert_itoa(i, elm->key);
497 elm->value = i;
498
499 ecore_hash_set(hash, elm->key, elm);
500 }
501
502 srand(time(NULL));
503
504 for (j = 0; j < 200; ++j)
505 for (i = 0; i < (unsigned int)request; ++i)
506 {
507 char tmp_key[10];
508
509 eina_convert_itoa(rand() % request, tmp_key);
510
511 elm = ecore_hash_get(hash, tmp_key);
512 }
513
514 ecore_hash_destroy(hash);
515}
516
517void eina_bench_hash(Eina_Benchmark *bench)
518{
519 eina_benchmark_register(bench, "superfast-lookup",
520 EINA_BENCHMARK(
521 eina_bench_lookup_superfast), 10, 10000, 10);
522 eina_benchmark_register(bench, "djb2-lookup",
523 EINA_BENCHMARK(
524 eina_bench_lookup_djb2), 10, 10000, 10);
525 eina_benchmark_register(bench, "djb2-lookup-inline",
526 EINA_BENCHMARK(
527 eina_bench_lookup_djb2_inline), 10, 10000, 10);
528 eina_benchmark_register(bench, "murmur",
529 EINA_BENCHMARK(
530 eina_bench_lookup_murmur), 10, 10000, 10);
531#ifdef CITYHASH_BENCH
532 eina_benchmark_register(bench, "cityhash",
533 EINA_BENCHMARK(
534 eina_bench_lookup_cityhash), 10, 10000, 10);
535#endif
536 eina_benchmark_register(bench, "rbtree",
537 EINA_BENCHMARK(
538 eina_bench_lookup_rbtree), 10, 10000, 10);
539#ifdef EINA_BENCH_HAVE_GLIB
540 eina_benchmark_register(bench, "ghash-lookup",
541 EINA_BENCHMARK(
542 eina_bench_lookup_ghash), 10, 10000, 10);
543#endif
544 eina_benchmark_register(bench, "evas-lookup",
545 EINA_BENCHMARK(
546 eina_bench_lookup_evas), 10, 10000, 10);
547 eina_benchmark_register(bench, "ecore-lookup",
548 EINA_BENCHMARK(
549 eina_bench_lookup_ecore), 10, 10000, 10);
550
551}
diff --git a/src/benchmarks/eina/eina_bench_stringshare.c b/src/benchmarks/eina/eina_bench_stringshare.c
index 22d18fa485..1b19154493 100644
--- a/src/benchmarks/eina/eina_bench_stringshare.c
+++ b/src/benchmarks/eina/eina_bench_stringshare.c
@@ -139,14 +139,14 @@ eina_bench_ecore_job(int request)
139 unsigned int j; 139 unsigned int j;
140 int i; 140 int i;
141 141
142 ecore_string_init(); 142 //ecore_string_init();
143 143
144 for (i = 0; i < request; ++i) 144 for (i = 0; i < request; ++i)
145 { 145 {
146 char build[64] = "string_"; 146 char build[64] = "string_";
147 147
148 eina_convert_xtoa(i, build + 7); 148 eina_convert_xtoa(i, build + 7);
149 tmp = ecore_string_instance(build); 149 //tmp = ecore_string_instance(build);
150 } 150 }
151 151
152 srand(time(NULL)); 152 srand(time(NULL));
@@ -157,13 +157,13 @@ eina_bench_ecore_job(int request)
157 char build[64] = "string_"; 157 char build[64] = "string_";
158 158
159 eina_convert_xtoa(rand() % request, build + 7); 159 eina_convert_xtoa(rand() % request, build + 7);
160 tmp = ecore_string_instance(build); 160 //tmp = ecore_string_instance(build);
161 } 161 }
162 162
163 /* Suppress warnings as we really don't want to do anything. */ 163 /* Suppress warnings as we really don't want to do anything. */
164 (void) tmp; 164 (void) tmp;
165 165
166 ecore_string_shutdown(); 166 //ecore_string_shutdown();
167} 167}
168 168
169void eina_bench_stringshare(Eina_Benchmark *bench) 169void eina_bench_stringshare(Eina_Benchmark *bench)
diff --git a/src/benchmarks/eina/eina_bench_stringshare_e17.c b/src/benchmarks/eina/eina_bench_stringshare_e17.c
deleted file mode 100644
index 2b2b45cb34..0000000000
--- a/src/benchmarks/eina/eina_bench_stringshare_e17.c
+++ /dev/null
@@ -1,121 +0,0 @@
1/* EINA - EFL data type library
2 * Copyright (C) 2008 Cedric Bail
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library;
16 * if not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifdef HAVE_CONFIG_H
20# include "config.h"
21#endif
22
23#include <stdlib.h>
24#include <stdio.h>
25#include <time.h>
26
27#ifdef EINA_BENCH_HAVE_GLIB
28# include <glib.h>
29#endif
30
31#include "Evas_Data.h"
32#include "Ecore_Data.h"
33
34#include "Eina.h"
35
36#if EINA_ENABLE_BENCH_E17
37
38typedef struct _Eina_Stringshare_Test Eina_Stringshare_Test;
39struct _Eina_Stringshare_Test
40{
41 const char *name;
42
43 int (*init)(void);
44 const char *(*add)(const char *str);
45 void (*del)(const char *str);
46 int (*shutdown)(void);
47};
48
49static Eina_Stringshare_Test eina_str = {
50 "eina",
51 eina_init,
52 eina_stringshare_add,
53 eina_stringshare_del,
54 eina_shutdown
55};
56
57static Eina_Stringshare_Test evas_str = {
58 "evas",
59 NULL,
60 evas_stringshare_add,
61 evas_stringshare_del,
62 NULL
63};
64
65static Eina_Stringshare_Test ecore_str = {
66 "ecore",
67 ecore_string_init,
68 ecore_string_instance,
69 ecore_string_release,
70 ecore_string_shutdown
71};
72
73static Eina_Stringshare_Test *tests[] = {
74 &eina_str,
75 &evas_str,
76 &ecore_str,
77 NULL
78};
79
80static void
81eina_bench_e17_stringshare(Eina_Stringshare_Test *str)
82{
83 Eina_Counter *cnt;
84 char *result;
85
86 cnt = eina_counter_new(str->name);
87
88 eina_counter_start(cnt);
89
90 if (str->init)
91 str->init();
92
93//#include "strlog"
94
95 if (str->shutdown)
96 str->shutdown();
97
98 eina_counter_stop(cnt, 1);
99
100 result = eina_counter_dump(cnt);
101 fprintf(stderr, "For `%s`:\n%s\n", str->name, result);
102 free(result);
103
104 eina_counter_free(cnt);
105}
106#endif
107
108void
109eina_bench_e17(void)
110{
111#if EINA_ENABLE_BENCH_E17
112 int i;
113
114 eina_init();
115
116 for (i = 0; tests[i]; ++i)
117 eina_bench_e17_stringshare(tests[i]);
118
119 eina_shutdown();
120#endif
121}
diff --git a/src/benchmarks/eina/meson.build b/src/benchmarks/eina/meson.build
index ba126987fb..8243511d6e 100644
--- a/src/benchmarks/eina/meson.build
+++ b/src/benchmarks/eina/meson.build
@@ -1,17 +1,13 @@
1eina_bench_src = files( 1eina_bench_src = files(
2'eina_bench.c', 2'eina_bench.c',
3'eina_bench_sort.c', 3'eina_bench_sort.c',
4'eina_bench_hash.c',
5'eina_bench_crc_hash.c', 4'eina_bench_crc_hash.c',
6'eina_bench_stringshare.c', 5'eina_bench_stringshare.c',
7'eina_bench_convert.c', 6'eina_bench_convert.c',
8'eina_bench_mempool.c', 7'eina_bench_mempool.c',
9'eina_bench_stringshare_e17.c',
10'eina_bench_array.c', 8'eina_bench_array.c',
11'eina_bench_rectangle_pool.c', 9'eina_bench_rectangle_pool.c',
12'ecore_list.c', 10'ecore_list.c',
13'ecore_strings.c',
14'ecore_hash.c',
15'ecore_sheap.c', 11'ecore_sheap.c',
16'evas_hash.c', 12'evas_hash.c',
17'evas_list.c', 13'evas_list.c',
diff --git a/src/bin/ecore_evas/ecore_evas_convert.c b/src/bin/ecore_evas/ecore_evas_convert.c
index 8b4f19ab2f..cefc16cc84 100644
--- a/src/bin/ecore_evas/ecore_evas_convert.c
+++ b/src/bin/ecore_evas/ecore_evas_convert.c
@@ -128,7 +128,6 @@ main(int argc, char *argv[])
128 eina_init(); 128 eina_init();
129 _log_dom = eina_log_domain_register(argv[0], EINA_COLOR_CYAN); 129 _log_dom = eina_log_domain_register(argv[0], EINA_COLOR_CYAN);
130 130
131 ecore_init();
132 ecore_evas_init(); 131 ecore_evas_init();
133 132
134 arg_index = ecore_getopt_parse(&optdesc, values, argc, argv); 133 arg_index = ecore_getopt_parse(&optdesc, values, argc, argv);
@@ -211,7 +210,8 @@ main(int argc, char *argv[])
211 end: 210 end:
212 if (flags) eina_strbuf_free(flags); 211 if (flags) eina_strbuf_free(flags);
213 ecore_evas_shutdown(); 212 ecore_evas_shutdown();
214 ecore_shutdown(); 213 eina_log_domain_unregister(_log_dom);
214 eina_shutdown();
215 215
216 return r; 216 return r;
217} 217}
diff --git a/src/bin/ecore_evas/eetpack.c b/src/bin/ecore_evas/eetpack.c
index 6e7616d189..9be4c2f77a 100644
--- a/src/bin/ecore_evas/eetpack.c
+++ b/src/bin/ecore_evas/eetpack.c
@@ -274,9 +274,7 @@ main(int argc, char **argv)
274 274
275 return -1; 275 return -1;
276 } 276 }
277 eina_init();
278 eet_init(); 277 eet_init();
279 evas_init();
280 ecore_evas_init(); 278 ecore_evas_init();
281 279
282 scratch_canvas_init(); 280 scratch_canvas_init();
@@ -285,8 +283,6 @@ main(int argc, char **argv)
285 if (ef) eet_close(ef); 283 if (ef) eet_close(ef);
286 284
287 ecore_evas_shutdown(); 285 ecore_evas_shutdown();
288 evas_shutdown();
289 eet_shutdown(); 286 eet_shutdown();
290 eina_shutdown();
291 return 0; 287 return 0;
292} 288}
diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c
index 3c60bea810..c2bfb82fd1 100644
--- a/src/bin/edje/edje_cc_out.c
+++ b/src/bin/edje/edje_cc_out.c
@@ -1717,7 +1717,7 @@ data_thread_mo(void *data, Ecore_Thread *thread EINA_UNUSED)
1717 Eina_List *ll; 1717 Eina_List *ll;
1718 1718
1719 char *dir_path = NULL; 1719 char *dir_path = NULL;
1720 char mo_path[PATH_MAX]; 1720 char mo_path[PATH_MAX] = {0};
1721 char moid_str[50]; 1721 char moid_str[50];
1722 Eina_File *f = NULL; 1722 Eina_File *f = NULL;
1723 void *m = NULL; 1723 void *m = NULL;
@@ -3506,7 +3506,7 @@ _data_image_h_size_compare_cb(const void *data1, const void *data2)
3506} 3506}
3507 3507
3508static void 3508static void
3509_data_image_sets_size_set() 3509_data_image_sets_size_set(void)
3510{ 3510{
3511 Evas *evas; 3511 Evas *evas;
3512 Edje_Image_Directory_Set *set; 3512 Edje_Image_Directory_Set *set;
@@ -4014,7 +4014,7 @@ free_group:
4014 if (edje_file->image_dir && !is_lua) 4014 if (edje_file->image_dir && !is_lua)
4015 { 4015 {
4016 Edje_Image_Directory_Entry *de, *de_last, *img; 4016 Edje_Image_Directory_Entry *de, *de_last, *img;
4017 Edje_Image_Directory_Set *set, *set_last, *set_realloc; 4017 Edje_Image_Directory_Set *set;
4018 Edje_Image_Directory_Set_Entry *set_e; 4018 Edje_Image_Directory_Set_Entry *set_e;
4019 Eina_List *images_unused_list = NULL; 4019 Eina_List *images_unused_list = NULL;
4020 unsigned int i; 4020 unsigned int i;
@@ -4026,11 +4026,12 @@ free_group:
4026 if (de->entry && eina_hash_find(images_in_use, de->entry)) 4026 if (de->entry && eina_hash_find(images_in_use, de->entry))
4027 continue; 4027 continue;
4028 4028
4029 printf("Warning: Image '%s' not used\n", de->entry);
4029 INF("Image '%s' in resource 'edje/image/%i' will not be included as it is unused.", 4030 INF("Image '%s' in resource 'edje/image/%i' will not be included as it is unused.",
4030 de->entry, de->id); 4031 de->entry, de->id);
4031 4032
4032 /* so as not to write the unused images, moved last image in the 4033 // so as not to write the unused images, moved last image in the
4033 list to unused image position and check it */ 4034 // list to unused image position and check it
4034 free((void *)de->entry); 4035 free((void *)de->entry);
4035 de->entry = NULL; 4036 de->entry = NULL;
4036 de_last = edje_file->image_dir->entries + edje_file->image_dir->entries_count - 1; 4037 de_last = edje_file->image_dir->entries + edje_file->image_dir->entries_count - 1;
@@ -4039,8 +4040,8 @@ free_group:
4039 images_unused_list = eina_list_append(images_unused_list, iui); 4040 images_unused_list = eina_list_append(images_unused_list, iui);
4040 iui->new_id = i; 4041 iui->new_id = i;
4041 de_last->id = i; 4042 de_last->id = i;
4042 memcpy(de, de_last, sizeof (Edje_Image_Directory_Entry)); 4043 memcpy(de, de_last, sizeof(Edje_Image_Directory_Entry));
4043 --i; /* need to check a moved image on this index */ 4044 --i; // need to check a moved image on this index
4044 edje_file->image_dir->entries_count--; 4045 edje_file->image_dir->entries_count--;
4045 img = realloc(edje_file->image_dir->entries, 4046 img = realloc(edje_file->image_dir->entries,
4046 sizeof (Edje_Image_Directory_Entry) * edje_file->image_dir->entries_count); 4047 sizeof (Edje_Image_Directory_Entry) * edje_file->image_dir->entries_count);
@@ -4054,6 +4055,17 @@ free_group:
4054 if (set->name && eina_hash_find(images_in_use, set->name)) 4055 if (set->name && eina_hash_find(images_in_use, set->name))
4055 continue; 4056 continue;
4056 4057
4058 printf("Warning: Image set '%s' not used\n", set->name);
4059 EINA_LIST_FOREACH(set->entries, l, set_e)
4060 {
4061 printf(" Contains '%s' size %ix%i -> %ix%i\n",
4062 set_e->name,
4063 set_e->size.min.w, set_e->size.min.h,
4064 set_e->size.max.w, set_e->size.max.h);
4065 }
4066/* No need to redo id's - we will warn of unused images - fix in src
4067 * Also .. this is broken and messes up id's ... so easyer - complain
4068 * to develoepr to clean up the theme...
4057 INF("Set '%s' will not be included as it is unused.", set->name); 4069 INF("Set '%s' will not be included as it is unused.", set->name);
4058 4070
4059 free((void *)set->name); 4071 free((void *)set->name);
@@ -4075,6 +4087,7 @@ free_group:
4075 set_realloc = realloc(edje_file->image_dir->sets, 4087 set_realloc = realloc(edje_file->image_dir->sets,
4076 sizeof(Edje_Image_Directory_Set) * edje_file->image_dir->sets_count); 4088 sizeof(Edje_Image_Directory_Set) * edje_file->image_dir->sets_count);
4077 edje_file->image_dir->sets = set_realloc; 4089 edje_file->image_dir->sets = set_realloc;
4090 */
4078 } 4091 }
4079 4092
4080 /* update image id in parts */ 4093 /* update image id in parts */
diff --git a/src/bin/edje/edje_cc_parse.c b/src/bin/edje/edje_cc_parse.c
index a656fb6783..32d06350e3 100644
--- a/src/bin/edje/edje_cc_parse.c
+++ b/src/bin/edje/edje_cc_parse.c
@@ -32,6 +32,7 @@
32#define EDJE_1_23_SUPPORTED " -DEFL_VERSION_1_23=1 " 32#define EDJE_1_23_SUPPORTED " -DEFL_VERSION_1_23=1 "
33#define EDJE_1_24_SUPPORTED " -DEFL_VERSION_1_24=1 " 33#define EDJE_1_24_SUPPORTED " -DEFL_VERSION_1_24=1 "
34#define EDJE_1_25_SUPPORTED " -DEFL_VERSION_1_25=1 " 34#define EDJE_1_25_SUPPORTED " -DEFL_VERSION_1_25=1 "
35#define EDJE_1_26_SUPPORTED " -DEFL_VERSION_1_26=1 "
35 36
36#define EDJE_CC_EFL_VERSION_SUPPORTED \ 37#define EDJE_CC_EFL_VERSION_SUPPORTED \
37 EDJE_1_18_SUPPORTED \ 38 EDJE_1_18_SUPPORTED \
@@ -41,7 +42,8 @@
41 EDJE_1_22_SUPPORTED \ 42 EDJE_1_22_SUPPORTED \
42 EDJE_1_23_SUPPORTED \ 43 EDJE_1_23_SUPPORTED \
43 EDJE_1_24_SUPPORTED \ 44 EDJE_1_24_SUPPORTED \
44 EDJE_1_25_SUPPORTED 45 EDJE_1_25_SUPPORTED \
46 EDJE_1_26_SUPPORTED
45 47
46static void new_object(void); 48static void new_object(void);
47static void new_statement(void); 49static void new_statement(void);
diff --git a/src/bin/edje/edje_external_inspector.c b/src/bin/edje/edje_external_inspector.c
index 3a4f937b06..718c02fc74 100644
--- a/src/bin/edje/edje_external_inspector.c
+++ b/src/bin/edje/edje_external_inspector.c
@@ -614,9 +614,7 @@ main(int argc, char **argv)
614 614
615 ecore_app_no_system_modules(); 615 ecore_app_no_system_modules();
616 616
617 ecore_init();
618 eina_init(); 617 eina_init();
619 edje_init();
620 618
621 _log_dom = eina_log_domain_register 619 _log_dom = eina_log_domain_register
622 ("edje_external_inspector", EINA_COLOR_YELLOW); 620 ("edje_external_inspector", EINA_COLOR_YELLOW);
@@ -628,6 +626,8 @@ main(int argc, char **argv)
628 goto error_log; 626 goto error_log;
629 } 627 }
630 628
629 edje_init();
630
631 arg_index = ecore_getopt_parse(&optdesc, values, argc, argv); 631 arg_index = ecore_getopt_parse(&optdesc, values, argc, argv);
632 if (arg_index < 0) 632 if (arg_index < 0)
633 { 633 {
@@ -670,10 +670,9 @@ main(int argc, char **argv)
670 free(module_patterns_str); 670 free(module_patterns_str);
671 671
672error_getopt: 672error_getopt:
673 edje_shutdown();
673 eina_log_domain_unregister(_log_dom); 674 eina_log_domain_unregister(_log_dom);
674error_log: 675error_log:
675 edje_shutdown();
676 ecore_shutdown();
677 eina_shutdown(); 676 eina_shutdown();
678 677
679 return ret; 678 return ret;
diff --git a/src/bin/edje/meson.build b/src/bin/edje/meson.build
index 82d51c7a77..e715571852 100644
--- a/src/bin/edje/meson.build
+++ b/src/bin/edje/meson.build
@@ -45,7 +45,6 @@ else
45 if sys_windows == true 45 if sys_windows == true
46 edje_cc_exe = [edje_cc.full_path()] 46 edje_cc_exe = [edje_cc.full_path()]
47 else 47 else
48 env = find_program('env', native: true)
49 edje_cc_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', edje_cc.full_path()] 48 edje_cc_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', edje_cc.full_path()]
50 endif 49 endif
51 edje_depends = [edje_cc, epp, evas_engine_buffer_mod, embryo_cc] 50 edje_depends = [edje_cc, epp, evas_engine_buffer_mod, embryo_cc]
@@ -98,7 +97,6 @@ if meson.is_cross_build()
98 edje_codegen_path = _edje_codegen.path() 97 edje_codegen_path = _edje_codegen.path()
99 edje_codegen_exe = [_edje_codegen] 98 edje_codegen_exe = [_edje_codegen]
100else 99else
101 env = find_program('env', native: true)
102 edje_codegen_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', edje_codegen.full_path()] 100 edje_codegen_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', edje_codegen.full_path()]
103endif 101endif
104 102
diff --git a/src/bin/eet/eet_main.c b/src/bin/eet/eet_main.c
index 7da5cfd4d3..8061dd956e 100644
--- a/src/bin/eet/eet_main.c
+++ b/src/bin/eet/eet_main.c
@@ -440,17 +440,6 @@ int
440main(int argc, 440main(int argc,
441 char **argv) 441 char **argv)
442{ 442{
443 if (!eet_init())
444 return -1;
445
446 _eet_main_log_dom = eina_log_domain_register("eet_main", EINA_COLOR_CYAN);
447 if(_eet_main_log_dom < -1)
448 {
449 EINA_LOG_ERR("Impossible to create a log domain for eet_main.");
450 eet_shutdown();
451 return -1;
452 }
453
454 if (argc < 2) 443 if (argc < 2)
455 { 444 {
456help: 445help:
@@ -468,6 +457,17 @@ help:
468 " eet -h print out this help message\n" 457 " eet -h print out this help message\n"
469 " eet -V [--version] show program version\n" 458 " eet -V [--version] show program version\n"
470 ); 459 );
460
461 return -1;
462 }
463
464 if (!eet_init())
465 return -1;
466
467 _eet_main_log_dom = eina_log_domain_register("eet_main", EINA_COLOR_CYAN);
468 if(_eet_main_log_dom < -1)
469 {
470 EINA_LOG_ERR("Impossible to create a log domain for eet_main.");
471 eet_shutdown(); 471 eet_shutdown();
472 return -1; 472 return -1;
473 } 473 }
diff --git a/src/bin/eeze/eeze_mount/eeze_mount.c b/src/bin/eeze/eeze_mount/eeze_mount.c
index 04c644f4ef..9e9dd16cdd 100644
--- a/src/bin/eeze/eeze_mount/eeze_mount.c
+++ b/src/bin/eeze/eeze_mount/eeze_mount.c
@@ -109,7 +109,7 @@ main(int argc, char *argv[])
109 if (argc - args > 1) 109 if (argc - args > 1)
110 { 110 {
111 eeze_disk_mount_point_set(disk, mount_point); 111 eeze_disk_mount_point_set(disk, mount_point);
112 if (eina_str_has_extension(dev, "iso")) 112 if (eina_str_has_extension(dev, ".iso"))
113 { 113 {
114 int f; 114 int f;
115 f = eeze_disk_mountopts_get(disk); 115 f = eeze_disk_mountopts_get(disk);
diff --git a/src/bin/efl/efl_debug.c b/src/bin/efl/efl_debug.c
index f7829c6545..7cf9768115 100644
--- a/src/bin/efl/efl_debug.c
+++ b/src/bin/efl/efl_debug.c
@@ -254,7 +254,6 @@ EINA_DEBUG_OPCODES_ARRAY_DEFINE(ops,
254int 254int
255main(int argc EINA_UNUSED, char **argv EINA_UNUSED) 255main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
256{ 256{
257 eina_init();
258 ecore_init(); 257 ecore_init();
259 258
260 my_argc = argc; 259 my_argc = argc;
@@ -271,7 +270,6 @@ main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
271 ecore_main_loop_begin(); 270 ecore_main_loop_begin();
272 271
273 ecore_shutdown(); 272 ecore_shutdown();
274 eina_shutdown();
275 273
276 return 0; 274 return 0;
277} 275}
diff --git a/src/bin/efl/efl_debugd.c b/src/bin/efl/efl_debugd.c
index b23db7544c..84f789254b 100644
--- a/src/bin/efl/efl_debugd.c
+++ b/src/bin/efl/efl_debugd.c
@@ -663,11 +663,11 @@ main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
663 ecore_app_no_system_modules(); 663 ecore_app_no_system_modules();
664 664
665 eina_init(); 665 eina_init();
666 _log_dom = eina_log_domain_register("efl_debugd", EINA_COLOR_CYAN);
666 ecore_init(); 667 ecore_init();
667 ecore_con_init(); 668 ecore_con_init();
668 669
669 _retval = EXIT_SUCCESS; 670 _retval = EXIT_SUCCESS;
670 _log_dom = eina_log_domain_register("efl_debugd", EINA_COLOR_CYAN);
671 671
672 _string_to_opcode_hash = eina_hash_string_superfast_new(NULL); 672 _string_to_opcode_hash = eina_hash_string_superfast_new(NULL);
673 _opcode_register("Daemon/opcode_register", EINA_DEBUG_OPCODE_REGISTER, _opcode_register_cb); 673 _opcode_register("Daemon/opcode_register", EINA_DEBUG_OPCODE_REGISTER, _opcode_register_cb);
@@ -683,6 +683,7 @@ main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
683 683
684 ecore_con_shutdown(); 684 ecore_con_shutdown();
685 ecore_shutdown(); 685 ecore_shutdown();
686 eina_log_domain_unregister(_log_dom);
686 eina_shutdown(); 687 eina_shutdown();
687 688
688 return _retval; 689 return _retval;
diff --git a/src/bin/efreet/efreetd.c b/src/bin/efreet/efreetd.c
index 1ef7d339c2..fbff09b58f 100644
--- a/src/bin/efreet/efreetd.c
+++ b/src/bin/efreet/efreetd.c
@@ -21,6 +21,7 @@
21 21
22int efreetd_log_dom = -1; 22int efreetd_log_dom = -1;
23Eina_Mempool *efreetd_mp_stat = NULL; 23Eina_Mempool *efreetd_mp_stat = NULL;
24FILE *efreetd_log_file = NULL;
24 25
25void 26void
26quit(void) 27quit(void)
@@ -32,7 +33,7 @@ int
32main(int argc, char *argv[]) 33main(int argc, char *argv[])
33{ 34{
34 char path[PATH_MAX + 128], buf[PATH_MAX]; 35 char path[PATH_MAX + 128], buf[PATH_MAX];
35 FILE *log; 36 FILE *logf;
36 int fd; 37 int fd;
37 const char *log_file_dir = NULL; 38 const char *log_file_dir = NULL;
38 const char *hostname_str = NULL; 39 const char *hostname_str = NULL;
@@ -69,9 +70,10 @@ main(int argc, char *argv[])
69 ERR("Can't create log file '%s'\b", path); 70 ERR("Can't create log file '%s'\b", path);
70 goto tmp_error; 71 goto tmp_error;
71 } 72 }
72 log = fdopen(fd, "wb"); 73 logf = fdopen(fd, "wb");
73 if (!log) goto tmp_error; 74 if (!logf) goto tmp_error;
74 eina_log_print_cb_set(eina_log_print_cb_file, log); 75 eina_log_print_cb_set(eina_log_print_cb_file, logf);
76 efreetd_log_file = logf;
75 efreetd_log_dom = eina_log_domain_register("efreetd", EFREETD_DEFAULT_LOG_COLOR); 77 efreetd_log_dom = eina_log_domain_register("efreetd", EFREETD_DEFAULT_LOG_COLOR);
76 if (efreetd_log_dom < 0) 78 if (efreetd_log_dom < 0)
77 { 79 {
diff --git a/src/bin/efreet/efreetd_cache.c b/src/bin/efreet/efreetd_cache.c
index 2659a8d8c4..d7a7f2539f 100644
--- a/src/bin/efreet/efreetd_cache.c
+++ b/src/bin/efreet/efreetd_cache.c
@@ -19,6 +19,8 @@
19#include <sys/stat.h> 19#include <sys/stat.h>
20#include <unistd.h> 20#include <unistd.h>
21 21
22extern FILE *efreetd_log_file;
23
22static Eina_Hash *icon_change_monitors = NULL; 24static Eina_Hash *icon_change_monitors = NULL;
23static Eina_Hash *icon_change_monitors_mon = NULL; 25static Eina_Hash *icon_change_monitors_mon = NULL;
24static Eina_Hash *desktop_change_monitors = NULL; 26static Eina_Hash *desktop_change_monitors = NULL;
@@ -376,10 +378,13 @@ icon_cache_update_cache_cb(void *data EINA_UNUSED)
376 if (icon_flush) 378 if (icon_flush)
377 eina_strbuf_append(file, " -f"); 379 eina_strbuf_append(file, " -f");
378 icon_flush = EINA_FALSE; 380 icon_flush = EINA_FALSE;
379 icon_cache_exe = 381 fprintf(efreetd_log_file, "[%09.3f] Run:\n %s\n", ecore_time_get(),
380 ecore_exe_pipe_run(eina_strbuf_string_get(file), ECORE_EXE_PIPE_READ | 382 eina_strbuf_string_get(file));
381 ECORE_EXE_PIPE_READ_LINE_BUFFERED, 383 fflush(efreetd_log_file);
382 NULL); 384 icon_cache_exe = ecore_exe_pipe_run
385 (eina_strbuf_string_get(file),
386 ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_READ_LINE_BUFFERED,
387 NULL);
383 388
384 eina_strbuf_free(file); 389 eina_strbuf_free(file);
385 390
@@ -424,10 +429,13 @@ desktop_cache_update_cache_cb(void *data EINA_UNUSED)
424 } 429 }
425 } 430 }
426 INF("Run desktop cache creation: %s", eina_strbuf_string_get(file)); 431 INF("Run desktop cache creation: %s", eina_strbuf_string_get(file));
432 fprintf(efreetd_log_file, "[%09.3f] Run:\n %s\n", ecore_time_get(),
433 eina_strbuf_string_get(file));
434 fflush(efreetd_log_file);
427 desktop_cache_exe = ecore_exe_pipe_run 435 desktop_cache_exe = ecore_exe_pipe_run
428 (eina_strbuf_string_get(file), ECORE_EXE_PIPE_READ | 436 (eina_strbuf_string_get(file),
429 ECORE_EXE_PIPE_READ_LINE_BUFFERED, 437 ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_READ_LINE_BUFFERED,
430 NULL); 438 NULL);
431 439
432 eina_strbuf_free(file); 440 eina_strbuf_free(file);
433 441
@@ -802,6 +810,8 @@ cache_exe_data_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
802 { 810 {
803 Eina_Bool update = EINA_FALSE; 811 Eina_Bool update = EINA_FALSE;
804 812
813 fprintf(efreetd_log_file, "[%09.3f] Data desktop_cache_create\n", ecore_time_get());
814 fflush(efreetd_log_file);
805 if ((ev->lines) && (*ev->lines->line == 'c')) update = EINA_TRUE; 815 if ((ev->lines) && (*ev->lines->line == 'c')) update = EINA_TRUE;
806 if (!desktop_exists) 816 if (!desktop_exists)
807 send_signal_desktop_cache_build(); 817 send_signal_desktop_cache_build();
@@ -812,11 +822,15 @@ cache_exe_data_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
812 { 822 {
813 Eina_Bool update = EINA_FALSE; 823 Eina_Bool update = EINA_FALSE;
814 824
825 fprintf(efreetd_log_file, "[%09.3f] Data icon_cache_create\n", ecore_time_get());
826 fflush(efreetd_log_file);
815 if ((ev->lines) && (*ev->lines->line == 'c')) update = EINA_TRUE; 827 if ((ev->lines) && (*ev->lines->line == 'c')) update = EINA_TRUE;
816 send_signal_icon_cache_update(update); 828 send_signal_icon_cache_update(update);
817 } 829 }
818 else if (ev->exe == mime_cache_exe) 830 else if (ev->exe == mime_cache_exe)
819 { 831 {
832 fprintf(efreetd_log_file, "[%09.3f] Data mime_cache_create\n", ecore_time_get());
833 fflush(efreetd_log_file);
820 // XXX: ZZZ: handle stdout here from cache updater... if needed 834 // XXX: ZZZ: handle stdout here from cache updater... if needed
821 } 835 }
822 return ECORE_CALLBACK_RENEW; 836 return ECORE_CALLBACK_RENEW;
@@ -829,16 +843,22 @@ cache_exe_del_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
829 843
830 if (ev->exe == desktop_cache_exe) 844 if (ev->exe == desktop_cache_exe)
831 { 845 {
846 fprintf(efreetd_log_file, "[%09.3f] Exit desktop_cache_create\n", ecore_time_get());
847 fflush(efreetd_log_file);
832 desktop_cache_exe = NULL; 848 desktop_cache_exe = NULL;
833 if (desktop_queue) cache_desktop_update(); 849 if (desktop_queue) cache_desktop_update();
834 } 850 }
835 else if (ev->exe == icon_cache_exe) 851 else if (ev->exe == icon_cache_exe)
836 { 852 {
853 fprintf(efreetd_log_file, "[%09.3f] Exit icon_cache_create\n", ecore_time_get());
854 fflush(efreetd_log_file);
837 icon_cache_exe = NULL; 855 icon_cache_exe = NULL;
838 if (icon_queue) cache_icon_update(EINA_FALSE); 856 if (icon_queue) cache_icon_update(EINA_FALSE);
839 } 857 }
840 else if (ev->exe == mime_cache_exe) 858 else if (ev->exe == mime_cache_exe)
841 { 859 {
860 fprintf(efreetd_log_file, "[%09.3f] Exit mime_cache_create\n", ecore_time_get());
861 fflush(efreetd_log_file);
842 mime_cache_exe = NULL; 862 mime_cache_exe = NULL;
843 send_signal_mime_cache_build(); 863 send_signal_mime_cache_build();
844 } 864 }
diff --git a/src/bin/efreet/efreetd_ipc.c b/src/bin/efreet/efreetd_ipc.c
index 0992345d3f..129f886f34 100644
--- a/src/bin/efreet/efreetd_ipc.c
+++ b/src/bin/efreet/efreetd_ipc.c
@@ -12,6 +12,8 @@
12#include "efreetd.h" 12#include "efreetd.h"
13#include "efreetd_cache.h" 13#include "efreetd_cache.h"
14 14
15extern FILE *efreetd_log_file;
16
15static int init = 0; 17static int init = 0;
16static Ecore_Ipc_Server *ipc = NULL; 18static Ecore_Ipc_Server *ipc = NULL;
17static Ecore_Event_Handler *hnd_add = NULL; 19static Ecore_Event_Handler *hnd_add = NULL;
@@ -47,6 +49,8 @@ _broadcast(Ecore_Ipc_Server *svr, int major, int minor, void *data, int size)
47 49
48 EINA_LIST_FOREACH(ipc_clients, l, cl) 50 EINA_LIST_FOREACH(ipc_clients, l, cl)
49 { 51 {
52 fprintf(efreetd_log_file, "[%09.3f] Client broadcast %i.%i\n", ecore_time_get(), major, minor);
53 fflush(efreetd_log_file);
50 ecore_ipc_client_send(cl, major, minor, 0, 0, 0, data, size); 54 ecore_ipc_client_send(cl, major, minor, 0, 0, 0, data, size);
51 } 55 }
52} 56}
@@ -117,6 +121,9 @@ _cb_client_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
117 quit_timer_start = NULL; 121 quit_timer_start = NULL;
118 } 122 }
119 clients++; 123 clients++;
124 fprintf(efreetd_log_file, "[%09.3f] Add client (count=%i)\n", ecore_time_get(),
125 clients);
126 fflush(efreetd_log_file);
120 return ECORE_CALLBACK_DONE; 127 return ECORE_CALLBACK_DONE;
121} 128}
122 129
@@ -125,6 +132,9 @@ _cb_client_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
125{ 132{
126 IPC_HEAD(Del); 133 IPC_HEAD(Del);
127 clients--; 134 clients--;
135 fprintf(efreetd_log_file, "[%09.3f] Del client (count=%i)\n", ecore_time_get(),
136 clients);
137 fflush(efreetd_log_file);
128 if (clients == 0) 138 if (clients == 0)
129 { 139 {
130 if (quit_timer) ecore_timer_del(quit_timer); 140 if (quit_timer) ecore_timer_del(quit_timer);
@@ -141,6 +151,8 @@ _cb_client_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
141 IPC_HEAD(Data); 151 IPC_HEAD(Data);
142 if (e->major == 1) // register lang 152 if (e->major == 1) // register lang
143 { // input: str -> lang 153 { // input: str -> lang
154 fprintf(efreetd_log_file, "[%09.3f] Client register lang\n", ecore_time_get());
155 fflush(efreetd_log_file);
144 if ((s = _parse_str(e->data, e->size))) 156 if ((s = _parse_str(e->data, e->size)))
145 { 157 {
146 setenv("LANG", s, 1); 158 setenv("LANG", s, 1);
@@ -152,6 +164,8 @@ _cb_client_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
152 } 164 }
153 else if (e->major == 2) // add desktop dirs 165 else if (e->major == 2) // add desktop dirs
154 { // input: array of str -> dirs 166 { // input: array of str -> dirs
167 fprintf(efreetd_log_file, "[%09.3f] Client add desktop dirs\n", ecore_time_get());
168 fflush(efreetd_log_file);
155 strs = _parse_strs(e->data, e->size); 169 strs = _parse_strs(e->data, e->size);
156 EINA_LIST_FREE(strs, s) 170 EINA_LIST_FREE(strs, s)
157 { 171 {
@@ -161,6 +175,8 @@ _cb_client_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
161 } 175 }
162 else if (e->major == 3) // build desktop cache 176 else if (e->major == 3) // build desktop cache
163 { // input: str -> lang 177 { // input: str -> lang
178 fprintf(efreetd_log_file, "[%09.3f] Client update desktop cache\n", ecore_time_get());
179 fflush(efreetd_log_file);
164 if ((s = _parse_str(e->data, e->size))) 180 if ((s = _parse_str(e->data, e->size)))
165 { 181 {
166 setenv("LANG", s, 1); 182 setenv("LANG", s, 1);
@@ -170,6 +186,8 @@ _cb_client_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
170 } 186 }
171 else if (e->major == 4) // add icon dirs 187 else if (e->major == 4) // add icon dirs
172 { // input: array of str -> dirs 188 { // input: array of str -> dirs
189 fprintf(efreetd_log_file, "[%09.3f] Client add icon dirs\n", ecore_time_get());
190 fflush(efreetd_log_file);
173 strs = _parse_strs(e->data, e->size); 191 strs = _parse_strs(e->data, e->size);
174 EINA_LIST_FREE(strs, s) 192 EINA_LIST_FREE(strs, s)
175 { 193 {
@@ -179,6 +197,8 @@ _cb_client_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
179 } 197 }
180 else if (e->major == 5) // add icon exts 198 else if (e->major == 5) // add icon exts
181 { // input: array of str -> exts 199 { // input: array of str -> exts
200 fprintf(efreetd_log_file, "[%09.3f] Client add icon exts\n", ecore_time_get());
201 fflush(efreetd_log_file);
182 strs = _parse_strs(e->data, e->size); 202 strs = _parse_strs(e->data, e->size);
183 EINA_LIST_FREE(strs, s) 203 EINA_LIST_FREE(strs, s)
184 { 204 {
diff --git a/src/bin/elementary/config.c b/src/bin/elementary/config.c
index 17d1376f54..ff05307700 100644
--- a/src/bin/elementary/config.c
+++ b/src/bin/elementary/config.c
@@ -942,7 +942,7 @@ transition_duration_change(void *data EINA_UNUSED,
942 void *event_info EINA_UNUSED) 942 void *event_info EINA_UNUSED)
943{ 943{
944 double val = elm_slider_value_get(obj); 944 double val = elm_slider_value_get(obj);
945 Eina_Bool scale = elm_config_transition_duration_factor_get(); 945 double scale = elm_config_transition_duration_factor_get();
946 946
947 if (EINA_DBL_EQ(scale, val)) return; 947 if (EINA_DBL_EQ(scale, val)) return;
948 elm_config_transition_duration_factor_set(val); 948 elm_config_transition_duration_factor_set(val);
@@ -950,6 +950,20 @@ transition_duration_change(void *data EINA_UNUSED,
950} 950}
951 951
952static void 952static void
953tooltip_delay_change(void *data EINA_UNUSED,
954 Evas_Object *obj,
955 void *event_info EINA_UNUSED)
956{
957 double val = elm_slider_value_get(obj);
958 double delay = elm_config_tooltip_delay_get();
959
960 if (EINA_DBL_EQ(delay, val)) return;
961 elm_config_tooltip_delay_set(val);
962 elm_config_all_flush();
963}
964
965
966static void
953_status_basic(Evas_Object *win, 967_status_basic(Evas_Object *win,
954 Evas_Object *bx0) 968 Evas_Object *bx0)
955{ 969{
@@ -1307,7 +1321,7 @@ _config_display_update(Evas_Object *win)
1307 ts_sensitivity_friction, ts_acceleration_threshold, 1321 ts_sensitivity_friction, ts_acceleration_threshold,
1308 ts_acceleration_time_limit, ts_acceleration_weight, page_friction, 1322 ts_acceleration_time_limit, ts_acceleration_weight, page_friction,
1309 bring_in_friction, zoom_friction, transition_duration, 1323 bring_in_friction, zoom_friction, transition_duration,
1310 smooth_amount, smooth_time_window; 1324 smooth_amount, smooth_time_window, tooltip_delay;
1311 const char *curr_theme; 1325 const char *curr_theme;
1312 Eina_Bool s_bounce, ts, smooth_start; 1326 Eina_Bool s_bounce, ts, smooth_start;
1313 Elm_Theme *th; 1327 Elm_Theme *th;
@@ -1319,6 +1333,7 @@ _config_display_update(Evas_Object *win)
1319 font_c = elm_config_cache_font_cache_size_get(); 1333 font_c = elm_config_cache_font_cache_size_get();
1320 image_c = elm_config_cache_image_cache_size_get(); 1334 image_c = elm_config_cache_image_cache_size_get();
1321 transition_duration = elm_config_transition_duration_factor_get(); 1335 transition_duration = elm_config_transition_duration_factor_get();
1336 tooltip_delay = elm_config_tooltip_delay_get();
1322 edje_file_c = elm_config_cache_edje_file_cache_size_get(); 1337 edje_file_c = elm_config_cache_edje_file_cache_size_get();
1323 edje_col_c = elm_config_cache_edje_collection_cache_size_get(); 1338 edje_col_c = elm_config_cache_edje_collection_cache_size_get();
1324 1339
@@ -1423,6 +1438,7 @@ _config_display_update(Evas_Object *win)
1423 elm_object_theme_set(evas_object_data_get(win, "theme_preview"), th); 1438 elm_object_theme_set(evas_object_data_get(win, "theme_preview"), th);
1424 elm_theme_free(th); 1439 elm_theme_free(th);
1425 elm_config_transition_duration_factor_set(transition_duration); 1440 elm_config_transition_duration_factor_set(transition_duration);
1441 elm_config_tooltip_delay_set(tooltip_delay);
1426 eina_stringshare_del(curr_theme); 1442 eina_stringshare_del(curr_theme);
1427} 1443}
1428 1444
@@ -2023,6 +2039,32 @@ _status_config_etc(Evas_Object *win,
2023 CHECK_ADD("Enable ATSPI support", "Set atspi mode", atspi_change, NULL); 2039 CHECK_ADD("Enable ATSPI support", "Set atspi mode", atspi_change, NULL);
2024 elm_check_state_set(ck, elm_config_atspi_mode_get()); 2040 elm_check_state_set(ck, elm_config_atspi_mode_get());
2025 2041
2042 // tooltip delay
2043 fr = elm_frame_add(bx);
2044 elm_object_text_set(fr, "Tooltip delay");
2045 evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
2046 evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
2047 elm_box_pack_end(bx, fr);
2048 evas_object_show(fr);
2049
2050 bx2 = elm_box_add(fr);
2051 elm_object_content_set(fr, bx2);
2052 evas_object_show(bx2);
2053
2054 sl = elm_slider_add(bx2);
2055 evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2056 evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2057 elm_slider_span_size_set(sl, 120);
2058 elm_slider_unit_format_set(sl, "%1.1f");
2059 elm_slider_indicator_format_set(sl, "%1.1f");
2060 elm_slider_min_max_set(sl, 0, 20.0);
2061 elm_slider_value_set(sl, elm_config_tooltip_delay_get());
2062 elm_box_pack_end(bx2, sl);
2063 evas_object_show(sl);
2064 evas_object_smart_callback_add(sl, "changed", sc_round, NULL);
2065 evas_object_smart_callback_add(sl, "delay,changed", tooltip_delay_change, NULL);
2066
2067
2026 // transition duration in edje 2068 // transition duration in edje
2027 fr = elm_frame_add(bx); 2069 fr = elm_frame_add(bx);
2028 elm_object_text_set(fr, "Edje Transition Duration Factor"); 2070 elm_object_text_set(fr, "Edje Transition Duration Factor");
diff --git a/src/bin/elementary/meson.build b/src/bin/elementary/meson.build
index f31ed793e3..1d7aa75057 100644
--- a/src/bin/elementary/meson.build
+++ b/src/bin/elementary/meson.build
@@ -234,7 +234,6 @@ endif
234if meson.is_cross_build() 234if meson.is_cross_build()
235 elementary_codegen_exe = [find_program('elementary_codegen', native: true)] 235 elementary_codegen_exe = [find_program('elementary_codegen', native: true)]
236else 236else
237 env = find_program('env', native: true)
238 elementary_codegen_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', elementary_codegen.full_path()] 237 elementary_codegen_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', elementary_codegen.full_path()]
239endif 238endif
240 239
@@ -260,7 +259,6 @@ if meson.is_cross_build()
260 elm_prefs_cc_path = _elm_prefs_cc.path() 259 elm_prefs_cc_path = _elm_prefs_cc.path()
261 elm_prefs_cc_exe = [_elm_prefs_cc] 260 elm_prefs_cc_exe = [_elm_prefs_cc]
262else 261else
263 env = find_program('env', native: true)
264 elm_prefs_cc_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', elm_prefs_cc.full_path()] 262 elm_prefs_cc_exe = [env, asan_option, 'EFL_RUN_IN_TREE=1', elm_prefs_cc.full_path()]
265endif 263endif
266 264
diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c
index 1bcf69e9cd..d0d374ece4 100644
--- a/src/bin/elementary/test.c
+++ b/src/bin/elementary/test.c
@@ -241,6 +241,7 @@ void test_label(void *data, Evas_Object *obj, void *event_info);
241void test_label_slide(void *data, Evas_Object *obj, void *event_info); 241void test_label_slide(void *data, Evas_Object *obj, void *event_info);
242void test_label_wrap(void *data, Evas_Object *obj, void *event_info); 242void test_label_wrap(void *data, Evas_Object *obj, void *event_info);
243void test_textblock_fit(void *data, Evas_Object *obj, void *event_info); 243void test_textblock_fit(void *data, Evas_Object *obj, void *event_info);
244void test_text_memory(void *data, Evas_Object *obj, void *event_info);
244void test_label_ellipsis(void *data, Evas_Object *obj, void *event_info); 245void test_label_ellipsis(void *data, Evas_Object *obj, void *event_info);
245void test_label_colors(void *data, Evas_Object *obj, void *event_info); 246void test_label_colors(void *data, Evas_Object *obj, void *event_info);
246void test_label_emoji(void *data, Evas_Object *obj, void *event_info); 247void test_label_emoji(void *data, Evas_Object *obj, void *event_info);
@@ -1220,10 +1221,11 @@ add_tests:
1220 ADD_TEST(NULL, "Text", "Label Slide", test_label_slide); 1221 ADD_TEST(NULL, "Text", "Label Slide", test_label_slide);
1221 ADD_TEST(NULL, "Text", "Label Wrap", test_label_wrap); 1222 ADD_TEST(NULL, "Text", "Label Wrap", test_label_wrap);
1222 ADD_TEST(NULL, "Text", "Textblock Fit", test_textblock_fit); 1223 ADD_TEST(NULL, "Text", "Textblock Fit", test_textblock_fit);
1224 ADD_TEST(NULL, "Text", "Text Memory", test_text_memory);
1223 ADD_TEST(NULL, "Text", "Label Ellipsis", test_label_ellipsis); 1225 ADD_TEST(NULL, "Text", "Label Ellipsis", test_label_ellipsis);
1224 ADD_TEST(NULL, "Text", "Label Colors", test_label_colors); 1226 ADD_TEST(NULL, "Text", "Label Colors", test_label_colors);
1225 ADD_TEST(NULL, "Text", "Label Emoji", test_label_emoji); 1227 ADD_TEST(NULL, "Text", "Label Emoji", test_label_emoji);
1226 ADD_TEST(NULL, "Text", "Label Variation Sequnece", test_label_variation_sequence); 1228 ADD_TEST(NULL, "Text", "Label Variation Sequence", test_label_variation_sequence);
1227 ADD_TEST_EO(NULL, "Text", "Efl.Ui.Textpath", test_ui_textpath); 1229 ADD_TEST_EO(NULL, "Text", "Efl.Ui.Textpath", test_ui_textpath);
1228 ADD_TEST_EO(NULL, "Text", "Efl.Canvas.Textblock style", test_canvas_textblock); 1230 ADD_TEST_EO(NULL, "Text", "Efl.Canvas.Textblock style", test_canvas_textblock);
1229 1231
diff --git a/src/bin/elementary/test_label.c b/src/bin/elementary/test_label.c
index 414058d9ad..de7c2bcf32 100644
--- a/src/bin/elementary/test_label.c
+++ b/src/bin/elementary/test_label.c
@@ -543,6 +543,124 @@ test_textblock_fit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e
543 evas_object_show(app->win); 543 evas_object_show(app->win);
544} 544}
545 545
546/*** Text Memory Configuration **************************************************************/
547enum BUTTON_MEM{
548 BUTTON_MEM_SET_TEXT = 0,
549 BUTTON_MEM_APPLY_MEM = 1,
550 BUTTON_MEM_APPLY_FONT_SIZE = 2,
551 BUTTON_MEM_ALL = BUTTON_MEM_APPLY_FONT_SIZE+1,
552};
553
554char* BUTTON_MEM_STR[BUTTON_MEM_ALL] ={
555 "Load Emojis Text",
556 "Memory Limit(MB)",
557 "Font Size"
558};
559
560char *content = "<align=center>๐Ÿ˜€๐Ÿ˜๐Ÿ˜‚๐Ÿคฃ๐Ÿ˜ƒ๐Ÿ˜„๐Ÿ˜…๐Ÿ˜†๐Ÿ˜‰๐Ÿ˜Š๐Ÿ˜‹๐Ÿ˜Ž๐Ÿ˜๐Ÿ˜˜๐Ÿ˜—๐Ÿ˜™๐Ÿ˜šโ˜บ๐Ÿ™‚๐Ÿค—๐Ÿค”๐Ÿ˜๐Ÿ˜‘๐Ÿ˜ถ๐Ÿ™„๐Ÿ˜๐Ÿ˜ฃ๐Ÿ˜ฅ๐Ÿ˜ฎ๐Ÿค๐Ÿ˜ฏ๐Ÿ˜ช๐Ÿ˜ซ๐Ÿ˜ด๐Ÿ˜Œ๐Ÿค“๐Ÿ˜›๐Ÿ˜œ๐Ÿ˜๐Ÿคค๐Ÿ˜’๐Ÿ˜“๐Ÿ˜”๐Ÿ˜•๐Ÿ™ƒ๐Ÿค‘๐Ÿ˜ฒโ˜น๐Ÿ™๐Ÿ˜–๐Ÿ˜ž๐Ÿ˜Ÿ๐Ÿ˜ค๐Ÿ˜ข๐Ÿ˜ญ๐Ÿ˜ฆ๐Ÿ˜ง๐Ÿ˜จ๐Ÿ˜ฉ๐Ÿ˜ฌ๐Ÿ˜ฐ๐Ÿ˜ฑ๐Ÿ˜ณ๐Ÿ˜ต๐Ÿ˜ก๐Ÿ˜ ๐Ÿ˜‡๐Ÿค ๐Ÿคก๐Ÿคฅ๐Ÿ˜ท๐Ÿค’๐Ÿค•๐Ÿคข๐Ÿคงโ˜ป๐Ÿ˜ˆ๐Ÿ‘ฟ๐Ÿ‘น๐Ÿ‘บ๐Ÿ’€โ˜ ๐Ÿ‘ป๐Ÿ‘ฝ๐Ÿ‘พ๐Ÿค–๐Ÿ’ฉ๐Ÿ˜บ๐Ÿ˜ธ๐Ÿ˜น๐Ÿ˜ป๐Ÿ˜ผ๐Ÿ˜ฝ๐Ÿ™€๐Ÿ˜ฟ๐Ÿ˜พ๐Ÿ™ˆ๐Ÿ™‰๐Ÿ™Š๐Ÿ‘ฆ๐Ÿ‘ง๐Ÿ‘จ๐Ÿ‘ฉ๐Ÿ‘ต๐Ÿ‘ถ๐Ÿ‘ผ๐Ÿ‘จโ€โš•๏ธ๐Ÿ‘ฉโ€โš•๏ธ๐Ÿ‘จโ€๐ŸŽ“๐Ÿ‘ฉโ€๐ŸŽ“๐Ÿ‘จโ€๐Ÿซ๐Ÿ‘ฉโ€๐Ÿซ๐Ÿ‘จโ€โš–๐Ÿ‘ฉโ€โš–๐Ÿ‘จโ€๐ŸŒพ๐Ÿ‘ฉโ€๐ŸŒพ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿ”ง๐Ÿ‘ฉโ€๐Ÿ”ง๐Ÿ‘จโ€๐Ÿญ๐Ÿ‘ฉโ€๐Ÿญ๐Ÿ‘จโ€๐Ÿ’ผ๐Ÿ‘ฉโ€๐Ÿ’ผ๐Ÿ‘จโ€๐Ÿ”ฌ๐Ÿ‘ฉโ€๐Ÿ”ฌ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐ŸŽค๐Ÿ‘ฉโ€๐ŸŽค๐Ÿ‘จโ€๐ŸŽจ๐Ÿ‘ฉโ€๐ŸŽจ๐Ÿ‘จโ€โœˆ๏ธ๐Ÿ‘ฉโ€โœˆ๏ธ๐Ÿ‘จโ€๐Ÿš€๐Ÿ‘ฉโ€๐Ÿš€๐Ÿ‘จโ€๐Ÿš’๐Ÿ‘ฉโ€๐Ÿš’๐Ÿ‘ฎโ€โ™‚๏ธ๐Ÿ‘ฎโ€โ™€๏ธ๐Ÿ•ต๏ธโ€โ™‚๏ธ๐Ÿ•ต๏ธโ€โ™€๏ธ๐Ÿ’‚โ€โ™‚๏ธ๐Ÿ’‚โ€โ™€๏ธ๐Ÿ‘ทโ€โ™‚๏ธ๐Ÿ‘ทโ€โ™€๏ธ๐Ÿ‘ณโ€โ™‚๏ธ๐Ÿ‘ณโ€โ™€๏ธ๐Ÿ‘ฑโ€โ™‚๏ธ๐Ÿ‘ฑโ€โ™€๏ธ๐ŸŽ…๐Ÿคถ๐Ÿ‘ธ๐Ÿคด๐Ÿ‘ฐ๐Ÿคต๐Ÿคฐ๐Ÿ‘ฒ๐Ÿ™โ€โ™‚๏ธ๐Ÿ™โ€โ™€๏ธ๐Ÿ™Žโ€โ™‚๏ธ๐Ÿ™Žโ€โ™€๏ธ๐Ÿ™…โ€โ™‚๏ธ๐Ÿ™…โ€โ™€๏ธ๐Ÿ™†โ€โ™‚๏ธ๐Ÿ™†โ€โ™€๏ธ๐Ÿ’โ€โ™‚๏ธ๐Ÿ’โ€โ™€๏ธ๐Ÿ™‹โ€โ™‚๏ธ๐Ÿ™‹โ€โ™€๏ธ๐Ÿ™‡โ€โ™‚๏ธ๐Ÿ™‡โ€โ™€๏ธ๐Ÿคฆโ€โ™‚๏ธ๐Ÿคฆโ€โ™€๏ธ๐Ÿคทโ€โ™‚๏ธ๐Ÿคทโ€โ™€๏ธ๐Ÿ’†โ€โ™‚๏ธ๐Ÿ’†โ€โ™€๏ธ๐Ÿ’‡โ€โ™‚๏ธ๐Ÿ’‡โ€โ™€๏ธ๐Ÿšถโ€โ™‚๏ธ๐Ÿšถโ€โ™€๏ธ๐Ÿƒโ€โ™‚๏ธ๐Ÿƒโ€โ™€๏ธ๐Ÿ’ƒ๐Ÿ•บ๐Ÿ‘ฏโ€โ™‚๏ธ๐Ÿ‘ฏโ€โ™€๏ธ๐Ÿ•ด๐Ÿ—ฃ๐Ÿ‘ค๐Ÿ‘ฅ๐Ÿ‘ซ๐Ÿ‘ฌ๐Ÿ‘ญ๐Ÿ’๐Ÿ’‘๐Ÿ‘ช๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง๐Ÿ‘จโ€๐Ÿ‘ฆ๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ๐Ÿ‘จโ€๐Ÿ‘ง๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง๐Ÿ‘ฉโ€๐Ÿ‘ฆ๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ๐Ÿ‘ฉโ€๐Ÿ‘ง๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง๐Ÿ’ช๐Ÿคณ๐Ÿ‘ˆ๐Ÿ‘‰โ˜๏ธ๐Ÿ‘†๐Ÿ–•๐Ÿ‘‡โœŒ๐Ÿคž๐Ÿ––๐Ÿค˜๐Ÿ‘Š๐Ÿ–โœ‹๐Ÿ‘Œ๐Ÿ‘๐Ÿ‘ŽโœŠ๐Ÿ‘Š๐Ÿค›๐Ÿคœ๐Ÿคš๐Ÿ‘‹๐Ÿ‘โœ๐Ÿ‘๐Ÿ™Œ๐Ÿ™๐Ÿค๐Ÿ’…๐Ÿ‘‚๐Ÿ‘ƒ๐Ÿ‘ฃ๐Ÿ‘€๐Ÿ‘๐Ÿ‘…๐Ÿ‘„๐Ÿ’‹๐Ÿ’˜โค๐Ÿ’“๐Ÿ’”๐Ÿ’•๐Ÿ’–๐Ÿ’—๐Ÿ’™๐Ÿ’š๐Ÿ’›๐Ÿ’œ๐Ÿ–ค๐Ÿ’๐Ÿ’ž๐Ÿ’Ÿโฃ๐Ÿ’Œ๐Ÿ’ค๐Ÿ’ข๐Ÿ’ฃ๐Ÿ’ฅ๐Ÿ’ฆ๐Ÿ’จ๐Ÿ’ซ๐Ÿ’ฌ๐Ÿ—จ๐Ÿ—ฏ๐Ÿ’ญ๐Ÿ•ณ๐Ÿ‘“๐Ÿ•ถ๐Ÿ‘”๐Ÿ‘•๐Ÿ‘–๐Ÿ‘—๐Ÿ‘˜๐Ÿ‘™๐Ÿ‘š๐Ÿ‘›๐Ÿ‘œ๐Ÿ‘๐Ÿ›๐ŸŽ’๐Ÿ‘ž๐Ÿ‘Ÿ๐Ÿ‘ ๐Ÿ‘ก๐Ÿ‘ข๐Ÿ‘‘๐Ÿ‘’๐ŸŽฉ๐ŸŽ“โ›‘๐Ÿ“ฟ๐Ÿ’„๐Ÿ’๐Ÿ’Ž๐Ÿต๐Ÿ’๐Ÿฆ๐Ÿถ๐Ÿ•๐Ÿฉ๐Ÿบ๐ŸฆŠ๐Ÿฑ๐Ÿˆ๐Ÿฆ๐Ÿฏ๐Ÿ…๐Ÿ†๐Ÿด๐ŸŽ๐ŸฆŒ๐Ÿฆ„๐Ÿฎ๐Ÿ‚๐Ÿƒ๐Ÿ„๐Ÿท๐Ÿ–๐Ÿ—๐Ÿฝ๐Ÿ๐Ÿ‘๐Ÿ๐Ÿช๐Ÿซ๐Ÿ˜๐Ÿฆ๐Ÿญ๐Ÿ๐Ÿ€๐Ÿน๐Ÿฐ๐Ÿ‡๐Ÿฟ๐Ÿฆ‡๐Ÿป๐Ÿจ๐Ÿผ๐Ÿพ๐Ÿฆƒ๐Ÿ”๐Ÿ“๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿ•Š๐Ÿฆ…๐Ÿฆ†๐Ÿฆ‰๐Ÿธ๐ŸŠ๐Ÿข๐ŸฆŽ๐Ÿ๐Ÿฒ๐Ÿ‰๐Ÿณ๐Ÿ‹๐Ÿฌ๐ŸŸ๐Ÿ ๐Ÿก๐Ÿฆˆ๐Ÿ™๐Ÿš๐Ÿฆ€๐Ÿฆ๐Ÿฆ‘๐Ÿฆ‹๐ŸŒ๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐Ÿ•ท๐Ÿ•ธ๐Ÿฆ‚๐Ÿ’๐ŸŒธ๐Ÿ’ฎ๐Ÿต๐ŸŒน๐Ÿฅ€๐ŸŒบ๐ŸŒป๐ŸŒผ๐ŸŒทโš˜๐ŸŒฑ๐ŸŒฒ๐ŸŒณ๐ŸŒด๐ŸŒต๐ŸŒพ๐ŸŒฟโ˜˜๐Ÿ€๐Ÿ๐Ÿ‚๐Ÿƒ๐Ÿ‡๐Ÿˆ๐Ÿ‰๐ŸŠ๐Ÿ‹๐ŸŒ๐Ÿ๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ…๐Ÿฅ๐Ÿฅ‘๐Ÿ†๐Ÿฅ”๐Ÿฅ•๐ŸŒฝ๐ŸŒถ๐Ÿฅ’๐Ÿ„๐Ÿฅœ๐ŸŒฐ๐Ÿž๐Ÿฅ๐Ÿฅ–๐Ÿฅž๐Ÿง€๐Ÿ–๐Ÿ—๐Ÿฅ“๐Ÿ”๐ŸŸ๐Ÿ•๐ŸŒญ๐ŸŒฎ๐ŸŒฏ๐Ÿฅ™๐Ÿฅš๐Ÿณ๐Ÿฅ˜๐Ÿฒ๐Ÿฅ—๐Ÿฟ๐Ÿฑ๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿ ๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿก๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐ŸŽ‚๐Ÿฐ๐Ÿซ๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿผ๐Ÿฅ›โ˜•๐Ÿต๐Ÿถ๐Ÿพ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿฅ‚๐Ÿฝ๐Ÿด๐Ÿฅ„๐Ÿ”ช๐Ÿบ๐ŸŽƒ๐ŸŽ„๐ŸŽ†๐ŸŽ‡โœจ๐ŸŽˆ๐ŸŽ‰๐ŸŽŠ๐ŸŽ‹๐ŸŽ๐ŸŽŽ๐ŸŽ๐ŸŽ๐ŸŽ‘๐ŸŽ€๐ŸŽ๐ŸŽ—๐ŸŽŸ๐ŸŽซ๐ŸŽ–๐Ÿ†๐Ÿ…๐Ÿฅ‡๐Ÿฅˆ๐Ÿฅ‰โšฝ๏ธโšพ๏ธ๐Ÿ€๐Ÿ๐Ÿˆ๐Ÿ‰๐ŸŽพ๐ŸŽฑ๐ŸŽณ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿธ๐ŸฅŠ๐Ÿฅ‹๐Ÿฅ…๐ŸŽฏโ›ณ๐ŸŒ๏ธโ€โ™‚๏ธ๐ŸŒ๏ธโ€โ™€๏ธโ›ธ๐ŸŽฃ๐ŸŽฝ๐ŸŽฟโ›ท๐Ÿ‚๐Ÿ„โ€โ™‚๏ธ๐Ÿ„โ€โ™€๏ธ๐Ÿ‡๐ŸŠโ€โ™‚๏ธ๐ŸŠโ€โ™€๏ธโ›น๏ธโ€โ™‚๏ธโ›น๏ธโ€โ™€๏ธ๐Ÿ‹๏ธโ€โ™‚๏ธ๐Ÿ‹๏ธโ€โ™€๏ธ๐Ÿšดโ€โ™‚๏ธ๐Ÿšดโ€โ™€๏ธ๐Ÿšตโ€โ™‚๏ธ๐Ÿšตโ€โ™€๏ธ๐ŸŽ๐Ÿ๐Ÿคธโ€โ™‚๏ธ๐Ÿคธโ€โ™€๏ธ๐Ÿคผโ€โ™‚๏ธ๐Ÿคผโ€โ™€๏ธ๐Ÿคฝโ€โ™‚๏ธ๐Ÿคฝโ€โ™€๏ธ๐Ÿคพโ€โ™‚๏ธ๐Ÿคพโ€โ™€๏ธ๐Ÿคบ๐Ÿคนโ€โ™‚๏ธ๐Ÿคนโ€โ™€๏ธ๐ŸŽฎ๐Ÿ•น๐ŸŽฒโ™ ๏ธโ™ฅ๏ธโ™ฆ๏ธโ™ฃ๏ธ๐Ÿƒ๐Ÿ€„๐ŸŽด๐ŸŒ๐ŸŒŽ๐ŸŒ๐ŸŒ๐Ÿ—บ๐Ÿ”โ›ฐ๐ŸŒ‹๐Ÿ—ป๐Ÿ•๐Ÿ–๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ›๐Ÿ—๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ ๐Ÿก๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ๐Ÿฌ๐Ÿญ๐Ÿฏ๐Ÿฐ๐Ÿ’’๐Ÿ—ผ๐Ÿ—ฝโ›ช๐Ÿ•Œ๐Ÿ•โ›ฉ๐Ÿ•‹โ›ฒโ›บ๐ŸŒ๐ŸŒƒ๐ŸŒ„๐ŸŒ…๐ŸŒ†๐ŸŒ‡๐ŸŒ‰โ›ผโ™จ๏ธ๐ŸŒŒ๐ŸŽ ๐ŸŽก๐ŸŽข๐Ÿ’ˆ๐ŸŽช๐ŸŽญ๐Ÿ–ผ๐ŸŽจ๐ŸŽฐ๐Ÿš‚๐Ÿšƒ๐Ÿš„๐Ÿš…๐Ÿš†๐Ÿš‡๐Ÿšˆ๐Ÿš‰๐ŸšŠ๐Ÿš๐Ÿšž๐Ÿš‹๐ŸšŒ๐Ÿš๐ŸšŽ๐Ÿš๐Ÿš‘๐Ÿš’๐Ÿš“๐Ÿš”๐Ÿš•๐Ÿš–๐Ÿš—๐Ÿš˜๐Ÿš™๐Ÿšš๐Ÿš›โ›Ÿ๐Ÿšœ๐Ÿšฒ๐Ÿ›ด๐Ÿ›ต๐Ÿš๐Ÿ›ฃ๐Ÿ›คโ›ฝ๐Ÿšจ๐Ÿšฅ๐Ÿšฆ๐Ÿšง๐Ÿ›‘โš“โ›ต๐Ÿšฃโ€โ™‚๏ธ๐Ÿšฃโ€โ™€๏ธ๐Ÿ›ถ๐Ÿšค๐Ÿ›ณโ›ด๐Ÿ›ฅ๐Ÿšขโœˆ๐Ÿ›ฉ๐Ÿ›ซ๐Ÿ›ฌ๐Ÿ’บ๐Ÿš๐ŸšŸ๐Ÿš ๐Ÿšก๐Ÿš€๐Ÿ›ฐ๐Ÿ›Ž๐Ÿšช๐Ÿ›Œ๐Ÿ›๐Ÿ›‹๐Ÿšฝ๐Ÿšฟ๐Ÿ›€๐Ÿ›โŒ›โณโŒšโฐโฑโฒ๐Ÿ•ฐ๐Ÿ•›๐Ÿ•ง๐Ÿ•๐Ÿ•œ๐Ÿ•‘๐Ÿ•๐Ÿ•’๐Ÿ•ž๐Ÿ•“๐Ÿ•Ÿ๐Ÿ•”๐Ÿ• ๐Ÿ••๐Ÿ•ก๐Ÿ•–๐Ÿ•ข๐Ÿ•—๐Ÿ•ฃ๐Ÿ•˜๐Ÿ•ค๐Ÿ•™๐Ÿ•ฅ๐Ÿ•š๐Ÿ•ฆ๐ŸŒ‘๐ŸŒ’๐ŸŒ“๐ŸŒ”๐ŸŒ•๐ŸŒ–๐ŸŒ—๐ŸŒ˜๐ŸŒ™๐ŸŒš๐ŸŒ›๐ŸŒœ๐ŸŒกโ˜€๏ธ๐ŸŒ๐ŸŒžโญ๐ŸŒŸ๐ŸŒ โ˜๏ธโ›…โ›ˆ๐ŸŒค๐ŸŒฅ๐ŸŒฆ๐ŸŒง๐ŸŒจ๐ŸŒฉ๐ŸŒช๐ŸŒซ๐ŸŒฌ๐ŸŒ€๐ŸŒˆ๐ŸŒ‚โ˜‚๏ธโ˜”โ›ฑโšกโ„โ˜ƒ๏ธโ›„โ˜„๐Ÿ”ฅ๐Ÿ’ง๐ŸŒŠ๐Ÿ”‡๐Ÿ”ˆ๐Ÿ”‰๐Ÿ”Š๐Ÿ“ข๐Ÿ“ฃ๐Ÿ“ฏ๐Ÿ””๐Ÿ”•๐ŸŽผ๐ŸŽต๐ŸŽถ๐ŸŽ™๐ŸŽš๐ŸŽ›๐ŸŽค๐ŸŽง๐Ÿ“ป๐ŸŽท๐ŸŽธ๐ŸŽน๐ŸŽบ๐ŸŽป๐Ÿฅ๐Ÿ“ฑ๐Ÿ“ฒโ˜Ž๏ธ๐Ÿ“ž๐Ÿ“Ÿ๐Ÿ“ ๐Ÿ”‹๐Ÿ”Œ๐Ÿ’ป๐Ÿ–ฅ๐Ÿ–จโŒจ๐Ÿ–ฑ๐Ÿ–ฒ๐Ÿ’ฝ๐Ÿ’พ๐Ÿ’ฟ๐Ÿ“€๐ŸŽฅ๐ŸŽž๐Ÿ“ฝ๐ŸŽฌ๐Ÿ“บ๐Ÿ“ท๐Ÿ“ธ๐Ÿ“น๐Ÿ“ผ๐Ÿ”๐Ÿ”Ž๐Ÿ”ฌ๐Ÿ”ญ๐Ÿ“ก๐Ÿ•ฏ๐Ÿ’ก๐Ÿ”ฆ๐Ÿฎ๐Ÿ“”๐Ÿ“•๐Ÿ“–๐Ÿ“—๐Ÿ“˜๐Ÿ“™๐Ÿ“š๐Ÿ““๐Ÿ“’๐Ÿ“ƒ๐Ÿ“œ๐Ÿ“„๐Ÿ“ฐ๐Ÿ—ž๐Ÿ“‘๐Ÿ”–๐Ÿท๐Ÿ’ฐ๐Ÿ’ด๐Ÿ’ต๐Ÿ’ถ๐Ÿ’ท๐Ÿ’ธ๐Ÿ’ณ๐Ÿ’ฑ๐Ÿ’ฒโœ‰๐Ÿ“ง๐Ÿ“จ๐Ÿ“ฉ๐Ÿ“ค๐Ÿ“ฅ๐Ÿ“ฆ๐Ÿ“ซ๐Ÿ“ช๐Ÿ“ฌ๐Ÿ“ญ๐Ÿ“ฎ๐Ÿ—ณโœโœ’๐Ÿ–‹๐Ÿ–Š๐Ÿ–Œ๐Ÿ–๐Ÿ“๐Ÿ’ผ๐Ÿ“๐Ÿ“‚๐Ÿ—‚๐Ÿ“…๐Ÿ“†๐Ÿ—’๐Ÿ—“๐Ÿ“‡๐Ÿ“ˆ๐Ÿ“‰๐Ÿ“Š๐Ÿ“‹๐Ÿ“Œ๐Ÿ“๐Ÿ“Ž๐Ÿ–‡๐Ÿ“๐Ÿ“โœ‚๏ธ๐Ÿ—ƒ๐Ÿ—„๐Ÿ—‘๐Ÿ”’๐Ÿ”“๐Ÿ”๐Ÿ”๐Ÿ”‘๐Ÿ—๐Ÿ”จโ›โš’๐Ÿ› ๐Ÿ—กโš”๐Ÿ”ซ๐Ÿน๐Ÿ›ก๐Ÿ”ง๐Ÿ”ฉโš™๐Ÿ—œโš—โš–๐Ÿ”—โ›“๐Ÿ’‰๐Ÿ’Š๐Ÿšฌโšฐโšฑ๐Ÿ—ฟ๐Ÿ›ข๐Ÿ”ฎ๐Ÿ”ฎ๐Ÿง๐Ÿšฎ๐Ÿšฐโ™ฟ๐Ÿšน๐Ÿšบ๐Ÿšป๐Ÿšผ๐Ÿšพ๐Ÿ›‚๐Ÿ›ƒ๐Ÿ›„๐Ÿ›…โš ๏ธ๐Ÿšธโ›”๐Ÿšซ๐Ÿšณ๐Ÿšญ๐Ÿšฏ๐Ÿšฑ๐Ÿšท๐Ÿ“ต๐Ÿ”žโ˜ขโ˜ฃโฌ†๏ธโ†—๏ธโžก๏ธโ†˜๏ธโฌ‡๏ธโ†™๏ธโฌ…๏ธโ†–๏ธโ†•๏ธโ†”๏ธโ†ฉโ†ชโคด๏ธโคต๏ธ๐Ÿ”ƒ๐Ÿ”„๐Ÿ”™๐Ÿ”š๐Ÿ”›๐Ÿ”œ๐Ÿ”๐Ÿ›โš›๐Ÿ•‰โœกโ˜ธโ˜ฏ๏ธโ˜ฆโ˜ฎ๐Ÿ•Ž๐Ÿ”ฏโ™ˆโ™‰โ™Šโ™‹โ™Œโ™โ™Žโ™โ™โ™‘โ™’โ™“โ›Ž๐Ÿ”€๐Ÿ”๐Ÿ”‚โ–ถ๏ธโฉโญโฏโ—€๏ธโชโฎ๐Ÿ”ผโซ๐Ÿ”ฝโฌโธโนโบโ๐ŸŽฆ๐Ÿ”…๐Ÿ”†๐Ÿ“ถ๐Ÿ“ณ๐Ÿ“ดโ™ป๏ธ๐Ÿ“›โšœ๐Ÿ”ฐ๐Ÿ”ฑโญ•โœ…โ˜‘โœ”โœ–โŒโŽโž•โ™€๏ธโ™‚๏ธโš•โž–โž—โžฐโžฟใ€ฝโœณโœดโ‡โ‰๏ธโ“โ”โ•โ—ใ€ฐ๐Ÿ”Ÿ๐Ÿ’ฏ๐Ÿ” ๐Ÿ”ก๐Ÿ”ข๐Ÿ”ฃ๐Ÿ”ค๐Ÿ…ฐ๏ธ๐Ÿ†Ž๏ธ๐Ÿ…ฑ๏ธ๐Ÿ†‘๏ธ๐Ÿ†’๏ธ๐Ÿ†“๏ธโ„น๐Ÿ†”๏ธโ“‚๏ธ๐Ÿ†•๏ธ๐Ÿ†–๏ธ๐Ÿ…พ๏ธ๐Ÿ†—๏ธ๐Ÿ…ฟ๏ธ๐Ÿ†˜๏ธ๐Ÿ†™๏ธ๐Ÿ†š๏ธ๐Ÿˆ๐Ÿˆ‚๐Ÿˆท๐Ÿˆถ๐Ÿˆฏ๐Ÿ‰๐Ÿˆน๐Ÿˆš๐Ÿˆฒ๐Ÿ‰‘๐Ÿˆธ๐Ÿˆด๐ŸˆณใŠ—ใŠ™๐Ÿˆบ๐Ÿˆตโ–ซ๏ธโ—ปโ—ผโ—ฝโ—พโฌ›โฌœ๐Ÿ”ถ๏ธ๐Ÿ”ท๏ธ๐Ÿ”ธ๏ธ๐Ÿ”น๏ธ๐Ÿ”บ๏ธ๐Ÿ”ป๐Ÿ’ ๐Ÿ”˜๐Ÿ”ฒ๐Ÿ”ณโšชโšซ๐Ÿ”ด๐Ÿ”ต๐Ÿ๐Ÿšฉ๐Ÿด๐Ÿณ๐Ÿณ๏ธโ€๐ŸŒˆโš€โšโš‚โšƒโš„โš…โ›พโ™พ๐Ÿ‡ฆ๐Ÿ‡จ๐Ÿ‡ฆ๐Ÿ‡ฉ๐Ÿ‡ฆ๐Ÿ‡ช๐Ÿ‡ฆ๐Ÿ‡ซ๐Ÿ‡ฆ๐Ÿ‡ฌ๐Ÿ‡ฆ๐Ÿ‡ฎ๐Ÿ‡ฆ๐Ÿ‡ฑ๐Ÿ‡ฆ๐Ÿ‡ฒ๐Ÿ‡ฆ๐Ÿ‡ด๐Ÿ‡ฆ๐Ÿ‡ถ๐Ÿ‡ฆ๐Ÿ‡ท๐Ÿ‡ฆ๐Ÿ‡ธ๐Ÿ‡ฆ๐Ÿ‡น๐Ÿ‡ฆ๐Ÿ‡บ๐Ÿ‡ฆ๐Ÿ‡ผ๐Ÿ‡ฆ๐Ÿ‡ฝ๐Ÿ‡ฆ๐Ÿ‡ฟ๐Ÿ‡ง๐Ÿ‡ฆ๐Ÿ‡ง๐Ÿ‡ง๐Ÿ‡ง๐Ÿ‡ฉ๐Ÿ‡ง๐Ÿ‡ช๐Ÿ‡ง๐Ÿ‡ซ๐Ÿ‡ง๐Ÿ‡ฌ๐Ÿ‡ง๐Ÿ‡ญ๐Ÿ‡ง๐Ÿ‡ฎ๐Ÿ‡ง๐Ÿ‡ฏ๐Ÿ‡ง๐Ÿ‡ฑ๐Ÿ‡ง๐Ÿ‡ฒ๐Ÿ‡ง๐Ÿ‡ณ๐Ÿ‡ง๐Ÿ‡ด๐Ÿ‡ง๐Ÿ‡ถ๐Ÿ‡ง๐Ÿ‡ท๐Ÿ‡ง๐Ÿ‡ธ๐Ÿ‡ง๐Ÿ‡น๐Ÿ‡ง๐Ÿ‡ผ๐Ÿ‡ง๐Ÿ‡พ๐Ÿ‡ง๐Ÿ‡ฟ๐Ÿ‡จ๐Ÿ‡ฆ๐Ÿ‡จ๐Ÿ‡จ๐Ÿ‡จ๐Ÿ‡ฉ๐Ÿ‡จ๐Ÿ‡ซ๐Ÿ‡จ๐Ÿ‡ฌ๐Ÿ‡จ๐Ÿ‡ญ๐Ÿ‡จ๐Ÿ‡ฎ๐Ÿ‡จ๐Ÿ‡ฐ๐Ÿ‡จ๐Ÿ‡ฑ๐Ÿ‡จ๐Ÿ‡ฒ๐Ÿ‡จ๐Ÿ‡ณ๐Ÿ‡จ๐Ÿ‡ด๐Ÿ‡จ๐Ÿ‡ท๐Ÿ‡จ๐Ÿ‡บ๐Ÿ‡จ๐Ÿ‡ป๐Ÿ‡จ๐Ÿ‡ผ๐Ÿ‡จ๐Ÿ‡ฝ๐Ÿ‡จ๐Ÿ‡พ๐Ÿ‡จ๐Ÿ‡ฟ๐Ÿ‡ฉ๐Ÿ‡ช๐Ÿ‡ฉ๐Ÿ‡ฏ๐Ÿ‡ฉ๐Ÿ‡ฐ๐Ÿ‡ฉ๐Ÿ‡ฒ๐Ÿ‡ฉ๐Ÿ‡ด๐Ÿ‡ฉ๐Ÿ‡ฟ๐Ÿ‡ช๐Ÿ‡จ๐Ÿ‡ช๐Ÿ‡ช๐Ÿ‡ช๐Ÿ‡ฌ๐Ÿ‡ช๐Ÿ‡ญ๐Ÿ‡ช๐Ÿ‡ท๐Ÿ‡ช๐Ÿ‡ธ๐Ÿ‡ช๐Ÿ‡น๐Ÿ‡ช๐Ÿ‡บ๐Ÿ‡ซ๐Ÿ‡ฎ๐Ÿ‡ซ๐Ÿ‡ฏ๐Ÿ‡ซ๐Ÿ‡ฐ๐Ÿ‡ซ๐Ÿ‡ฒ๐Ÿ‡ซ๐Ÿ‡ด๐Ÿ‡ซ๐Ÿ‡ท๐Ÿ‡ฌ๐Ÿ‡ฆ๐Ÿ‡ฌ๐Ÿ‡ง๐Ÿ‡ฌ๐Ÿ‡ฉ๐Ÿ‡ฌ๐Ÿ‡ช๐Ÿ‡ฌ๐Ÿ‡ซ๐Ÿ‡ฌ๐Ÿ‡ฌ๐Ÿ‡ฌ๐Ÿ‡ญ๐Ÿ‡ฌ๐Ÿ‡ฎ๐Ÿ‡ฌ๐Ÿ‡ฑ๐Ÿ‡ฌ๐Ÿ‡ฒ๐Ÿ‡ฌ๐Ÿ‡ณ๐Ÿ‡ฌ๐Ÿ‡ต๐Ÿ‡ฌ๐Ÿ‡ถ๐Ÿ‡ฌ๐Ÿ‡ท๐Ÿ‡ฌ๐Ÿ‡ธ๐Ÿ‡ฌ๐Ÿ‡น๐Ÿ‡ฌ๐Ÿ‡บ๐Ÿ‡ฌ๐Ÿ‡ผ๐Ÿ‡ฌ๐Ÿ‡พ๐Ÿ‡ญ๐Ÿ‡ฐ๐Ÿ‡ญ๐Ÿ‡ฒ๐Ÿ‡ญ๐Ÿ‡ณ๐Ÿ‡ญ๐Ÿ‡ท๐Ÿ‡ญ๐Ÿ‡น๐Ÿ‡ญ๐Ÿ‡บ๐Ÿ‡ฎ๐Ÿ‡จ๐Ÿ‡ฎ๐Ÿ‡ฉ๐Ÿ‡ฎ๐Ÿ‡ช๐Ÿ‡ฎ๐Ÿ‡ฑ๐Ÿ‡ฎ๐Ÿ‡ฒ๐Ÿ‡ฎ๐Ÿ‡ณ๐Ÿ‡ฎ๐Ÿ‡ด๐Ÿ‡ฎ๐Ÿ‡ถ๐Ÿ‡ฎ๐Ÿ‡ท๐Ÿ‡ฎ๐Ÿ‡ธ๐Ÿ‡ฎ๐Ÿ‡น๐Ÿ‡ฏ๐Ÿ‡ช๐Ÿ‡ฏ๐Ÿ‡ฒ๐Ÿ‡ฏ๐Ÿ‡ด๐Ÿ‡ฏ๐Ÿ‡ต๐Ÿ‡ฐ๐Ÿ‡ช๐Ÿ‡ฐ๐Ÿ‡ฌ๐Ÿ‡ฐ๐Ÿ‡ญ๐Ÿ‡ฐ๐Ÿ‡ฎ๐Ÿ‡ฐ๐Ÿ‡ฒ๐Ÿ‡ฐ๐Ÿ‡ณ๐Ÿ‡ฐ๐Ÿ‡ต๐Ÿ‡ฐ๐Ÿ‡ท๐Ÿ‡ฐ๐Ÿ‡ผ๐Ÿ‡ฐ๐Ÿ‡พ๐Ÿ‡ฐ๐Ÿ‡ฟ๐Ÿ‡ฑ๐Ÿ‡ฆ๐Ÿ‡ฑ๐Ÿ‡ง๐Ÿ‡ฑ๐Ÿ‡จ๐Ÿ‡ฑ๐Ÿ‡ฎ๐Ÿ‡ฑ๐Ÿ‡ฐ๐Ÿ‡ฑ๐Ÿ‡ท๐Ÿ‡ฑ๐Ÿ‡ธ๐Ÿ‡ฑ๐Ÿ‡น๐Ÿ‡ฑ๐Ÿ‡บ๐Ÿ‡ฑ๐Ÿ‡ป๐Ÿ‡ฑ๐Ÿ‡พ๐Ÿ‡ฒ๐Ÿ‡ฆ๐Ÿ‡ฒ๐Ÿ‡จ๐Ÿ‡ฒ๐Ÿ‡ฉ๐Ÿ‡ฒ๐Ÿ‡ช๐Ÿ‡ฒ๐Ÿ‡ฌ๐Ÿ‡ฒ๐Ÿ‡ญ๐Ÿ‡ฒ๐Ÿ‡ฐ๐Ÿ‡ฒ๐Ÿ‡ฑ๐Ÿ‡ฒ๐Ÿ‡ฒ๐Ÿ‡ฒ๐Ÿ‡ณ๐Ÿ‡ฒ๐Ÿ‡ด๐Ÿ‡ฒ๐Ÿ‡ต๐Ÿ‡ฒ๐Ÿ‡ถ๐Ÿ‡ฒ๐Ÿ‡ท๐Ÿ‡ฒ๐Ÿ‡ธ๐Ÿ‡ฒ๐Ÿ‡น๐Ÿ‡ฒ๐Ÿ‡บ๐Ÿ‡ฒ๐Ÿ‡ป๐Ÿ‡ฒ๐Ÿ‡ผ๐Ÿ‡ฒ๐Ÿ‡ฝ๐Ÿ‡ฒ๐Ÿ‡พ๐Ÿ‡ฒ๐Ÿ‡ฟ๐Ÿ‡ณ๐Ÿ‡ฆ๐Ÿ‡ณ๐Ÿ‡จ๐Ÿ‡ณ๐Ÿ‡ช๐Ÿ‡ณ๐Ÿ‡ซ๐Ÿ‡ณ๐Ÿ‡ฌ๐Ÿ‡ณ๐Ÿ‡ฎ๐Ÿ‡ณ๐Ÿ‡ฑ๐Ÿ‡ณ๐Ÿ‡ด๐Ÿ‡ณ๐Ÿ‡ต๐Ÿ‡ณ๐Ÿ‡ท๐Ÿ‡ณ๐Ÿ‡บ๐Ÿ‡ณ๐Ÿ‡ฟ๐Ÿ‡ด๐Ÿ‡ฒ๐Ÿ‡ต๐Ÿ‡ฆ๐Ÿ‡ต๐Ÿ‡ช๐Ÿ‡ต๐Ÿ‡ซ๐Ÿ‡ต๐Ÿ‡ฌ๐Ÿ‡ต๐Ÿ‡ญ๐Ÿ‡ต๐Ÿ‡ฐ๐Ÿ‡ต๐Ÿ‡ฑ๐Ÿ‡ต๐Ÿ‡ฒ๐Ÿ‡ต๐Ÿ‡ณ๐Ÿ‡ต๐Ÿ‡ท๐Ÿ‡ต๐Ÿ‡ธ๐Ÿ‡ต๐Ÿ‡น๐Ÿ‡ต๐Ÿ‡ผ๐Ÿ‡ต๐Ÿ‡พ๐Ÿ‡ถ๐Ÿ‡ฆ๐Ÿ‡ท๐Ÿ‡ช๐Ÿ‡ท๐Ÿ‡ด๐Ÿ‡ท๐Ÿ‡ธ๐Ÿ‡ท๐Ÿ‡บ๐Ÿ‡ท๐Ÿ‡ผ๐Ÿ‡ธ๐Ÿ‡ฆ๐Ÿ‡ธ๐Ÿ‡ง๐Ÿ‡ธ๐Ÿ‡จ๐Ÿ‡ธ๐Ÿ‡ฉ๐Ÿ‡ธ๐Ÿ‡ช๐Ÿ‡ธ๐Ÿ‡ฌ๐Ÿ‡ธ๐Ÿ‡ญ๐Ÿ‡ธ๐Ÿ‡ฎ๐Ÿ‡ธ๐Ÿ‡ฐ๐Ÿ‡ธ๐Ÿ‡ฑ๐Ÿ‡ธ๐Ÿ‡ฒ๐Ÿ‡ธ๐Ÿ‡ณ๐Ÿ‡ธ๐Ÿ‡ด๐Ÿ‡ธ๐Ÿ‡ท๐Ÿ‡ธ๐Ÿ‡ธ๐Ÿ‡ธ๐Ÿ‡น๐Ÿ‡ธ๐Ÿ‡ป๐Ÿ‡ธ๐Ÿ‡ฝ๐Ÿ‡ธ๐Ÿ‡พ๐Ÿ‡ธ๐Ÿ‡ฟ๐Ÿ‡น๐Ÿ‡ฆ๐Ÿ‡น๐Ÿ‡จ๐Ÿ‡น๐Ÿ‡ฉ๐Ÿ‡น๐Ÿ‡ซ๐Ÿ‡น๐Ÿ‡ฌ๐Ÿ‡น๐Ÿ‡ญ๐Ÿ‡น๐Ÿ‡ฏ๐Ÿ‡น๐Ÿ‡ฐ๐Ÿ‡น๐Ÿ‡ฑ๐Ÿ‡น๐Ÿ‡ฒ๐Ÿ‡น๐Ÿ‡ณ๐Ÿ‡น๐Ÿ‡ด๐Ÿ‡น๐Ÿ‡ท๐Ÿ‡น๐Ÿ‡น๐Ÿ‡น๐Ÿ‡ป๐Ÿ‡น๐Ÿ‡ผ๐Ÿ‡น๐Ÿ‡ฟ๐Ÿ‡บ๐Ÿ‡ฆ๐Ÿ‡บ๐Ÿ‡ฌ๐Ÿ‡บ๐Ÿ‡ณ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ‡บ๐Ÿ‡พ๐Ÿ‡บ๐Ÿ‡ฟ๐Ÿ‡ป๐Ÿ‡ฆ๐Ÿ‡ป๐Ÿ‡จ๐Ÿ‡ป๐Ÿ‡ช๐Ÿ‡ป๐Ÿ‡ฌ๐Ÿ‡ป๐Ÿ‡ฎ๐Ÿ‡ป๐Ÿ‡ณ๐Ÿ‡ป๐Ÿ‡บ๐Ÿ‡ผ๐Ÿ‡ซ๐Ÿ‡ผ๐Ÿ‡ธ๐Ÿ‡ฝ๐Ÿ‡ฐ๐Ÿ‡พ๐Ÿ‡ช๐Ÿ‡พ๐Ÿ‡น๐Ÿ‡ฟ๐Ÿ‡ฆ๐Ÿ‡ฟ๐Ÿ‡ฒ๐Ÿ‡ฟ๐Ÿ‡ผ</align>";
561
562typedef struct _APP_MEM
563{
564 Evas_Object *win, *box, *main_entry;
565 Eo *btn[BUTTON_MEM_ALL];
566 Eo *entry[BUTTON_MEM_ALL];
567} APP_MEM;
568APP_MEM *app_mem;
569
570static void _btn_clicked_mem(void *data EINA_UNUSED, Eo *obj, void *eventInfo EINA_UNUSED){
571 if (obj == app_mem->btn[BUTTON_MEM_SET_TEXT])
572 {
573 elm_object_text_set(app_mem->main_entry, content);
574 }
575 else if (obj == app_mem->btn[BUTTON_MEM_APPLY_MEM])
576 {
577 int size = atoi(elm_object_text_get(app_mem->entry[BUTTON_MEM_APPLY_MEM]));
578 if (size > 0 && size < 4000)
579 {
580 evas_font_data_cache_set(EVAS_FONT_DATA_CACHE_TEXTURE, size * 1024 * 1024);
581 }
582 else
583 {
584 elm_object_text_set(app_mem->entry[BUTTON_MEM_APPLY_MEM], "NAN");
585 }
586 }
587 else if (obj == app_mem->btn[BUTTON_MEM_APPLY_FONT_SIZE])
588 {
589 int font_size = atoi(elm_object_text_get(app_mem->entry[BUTTON_MEM_APPLY_FONT_SIZE]));
590 if (font_size > 0 && font_size < 1000)
591 {
592 char sfont_size[256] = {0};
593 sprintf(sfont_size,"DEFAULT='font_size=%i'", font_size);
594 elm_entry_text_style_user_push(app_mem->main_entry, sfont_size);
595 }
596 else
597 {
598 elm_object_text_set(app_mem->entry[BUTTON_MEM_APPLY_FONT_SIZE], "NAN");
599 }
600 }
601}
602
603void
604test_text_memory(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
605{
606 app_mem = calloc(sizeof(APP_MEM), 1);
607
608 elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
609
610 app_mem->win = elm_win_util_standard_add("Main", "App");
611 elm_win_autodel_set(app_mem->win, EINA_TRUE);
612
613 app_mem->box = elm_box_add(app_mem->win);
614 app_mem->main_entry = elm_entry_add(app_mem->box);
615
616 evas_object_size_hint_weight_set(app_mem->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
617 evas_object_size_hint_align_set(app_mem->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
618
619 app_mem->btn[BUTTON_MEM_SET_TEXT] = elm_button_add(app_mem->box);
620 evas_object_smart_callback_add(app_mem->btn[BUTTON_MEM_SET_TEXT], "clicked", _btn_clicked_mem, NULL);
621 elm_object_text_set(app_mem->btn[BUTTON_MEM_SET_TEXT], BUTTON_MEM_STR[BUTTON_MEM_SET_TEXT]);
622 evas_object_size_hint_align_set(app_mem->btn[BUTTON_MEM_SET_TEXT], EVAS_HINT_FILL, EVAS_HINT_FILL);
623 elm_box_pack_end(app_mem->box, app_mem->btn[BUTTON_MEM_SET_TEXT]);
624 evas_object_show(app_mem->btn[BUTTON_MEM_SET_TEXT]);
625
626 elm_entry_scrollable_set(app_mem->main_entry, EINA_TRUE);
627 evas_object_show(app_mem->main_entry);
628 evas_object_show(app_mem->box);
629
630 elm_box_pack_end(app_mem->box, app_mem->main_entry);
631 evas_object_smart_callback_add(app_mem->btn[BUTTON_MEM_SET_TEXT], "clicked", _btn_clicked_mem, NULL);
632 evas_object_show(app_mem->btn[BUTTON_MEM_SET_TEXT]);
633
634 elm_win_resize_object_add(app_mem->win, app_mem->box);
635 evas_object_resize(app_mem->win, 320, 320);
636
637 elm_entry_text_style_user_push(app_mem->main_entry, "DEFAULT='font_size=20'");
638
639 for(int i = BUTTON_MEM_APPLY_MEM ; i < BUTTON_MEM_ALL ; i++)
640 {
641 app_mem->btn[i] = elm_button_add(app_mem->box);
642 app_mem->entry[i] = elm_entry_add(app_mem->box);
643 evas_object_smart_callback_add(app_mem->btn[i], "clicked", _btn_clicked_mem, NULL);
644 elm_object_text_set(app_mem->btn[i], BUTTON_MEM_STR[i]);
645 elm_box_pack_end(app_mem->box, app_mem->btn[i]);
646 elm_box_pack_end(app_mem->box, app_mem->entry[i]);
647
648 evas_object_size_hint_align_set(app_mem->btn[i], EVAS_HINT_FILL, EVAS_HINT_FILL);
649 evas_object_size_hint_align_set(app_mem->entry[i], EVAS_HINT_FILL, EVAS_HINT_FILL);
650
651 evas_object_show(app_mem->btn[i]);
652 evas_object_show(app_mem->entry[i]);
653 }
654
655 elm_object_text_set(app_mem->entry[BUTTON_MEM_APPLY_MEM],"Texture limit in MB");
656 elm_object_text_set(app_mem->entry[BUTTON_MEM_APPLY_FONT_SIZE],"20");
657
658 evas_object_size_hint_weight_set(app_mem->main_entry, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
659 evas_object_size_hint_align_set(app_mem->main_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
660
661 evas_object_show(app_mem->win);
662}
663
546/*** Label Wrap **************************************************************/ 664/*** Label Wrap **************************************************************/
547void 665void
548test_label_wrap(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) 666test_label_wrap(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
diff --git a/src/bin/elementary/test_popup.c b/src/bin/elementary/test_popup.c
index 747b8432fe..da9bbca934 100644
--- a/src/bin/elementary/test_popup.c
+++ b/src/bin/elementary/test_popup.c
@@ -845,80 +845,6 @@ _popup_scroll_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA
845 is_popup_scroll = elm_check_state_get(obj); 845 is_popup_scroll = elm_check_state_get(obj);
846} 846}
847 847
848static void
849_popup_scrollable_scroller_content_list_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
850{
851 Evas_Object *win, *popup, *box, *btn, *scroller, *table, *list, *ic;
852 Evas_Object *box2, *label;
853 Elm_Object_Item *ex1;
854
855 win = data;
856
857 popup = elm_popup_add(win);
858 elm_popup_scrollable_set(popup, EINA_TRUE);
859 elm_object_part_text_set(popup, "title,text", "Title");
860 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
861 evas_object_show(popup);
862
863 box = elm_box_add(popup);
864 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
865 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
866 evas_object_size_hint_min_set(box, 200 * elm_config_scale_get(), 200 * elm_config_scale_get());
867 evas_object_show(box);
868
869 scroller = elm_scroller_add(box);
870 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
871 evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
872 elm_box_pack_end(box, scroller);
873 evas_object_show(scroller);
874
875 table = elm_table_add(scroller);
876 elm_table_homogeneous_set(table, EINA_FALSE);
877 evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
878 evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
879 evas_object_show(table);
880
881 list = elm_list_add(table);
882 elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS);
883 elm_scroller_content_min_limit(list, 1, 1);
884 evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
885 evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
886 elm_table_pack(table, list, 0, 0, 1, 1);
887 evas_object_show(list);
888
889 box2 = elm_box_add(table);
890 evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
891 evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
892 elm_table_pack(table, box2, 1, 0, 2, 1);
893 evas_object_show(box2);
894
895 label = elm_label_add(popup);
896 elm_object_text_set(label, "Wash the soap<br>rub it on your<br>hands.");
897 evas_object_show(label);
898 elm_box_pack_end(box2, label);
899
900 ic = elm_icon_add(list);
901 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
902 elm_icon_standard_set(ic, "input-keyboard");
903 evas_object_show(ic);
904
905 ex1 = elm_list_item_append(list, "Jambalaya", ic, NULL, NULL, NULL);
906 elm_list_item_append(list, "Mississippi", ic, NULL, NULL, NULL);
907
908 elm_list_go(list);
909 elm_list_item_selected_set(ex1, EINA_TRUE);
910
911 btn = elm_button_add(popup);
912 elm_object_text_set(btn, "Close");
913 evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
914 elm_object_part_content_set(popup, "button1", btn);
915
916 elm_object_content_set(scroller, table);
917 elm_object_content_set(popup, box);
918
919 evas_object_show(popup);
920}
921
922void 848void
923test_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 849test_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
924 void *event_info EINA_UNUSED) 850 void *event_info EINA_UNUSED)
@@ -985,8 +911,6 @@ test_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
985 win); 911 win);
986 elm_list_item_append(list, "popup-center-title + text + 1 button + hide effect", NULL, 912 elm_list_item_append(list, "popup-center-title + text + 1 button + hide effect", NULL,
987 NULL, _popup_center_title_text_1button_hide_effect_cb, win); 913 NULL, _popup_center_title_text_1button_hide_effect_cb, win);
988 elm_list_item_append(list, "popup-scrollable-with-scroller-as-content-and-list",
989 NULL, NULL, _popup_scrollable_scroller_content_list_cb, win);
990 elm_list_go(list); 914 elm_list_go(list);
991 evas_object_show(list); 915 evas_object_show(list);
992 916
diff --git a/src/bin/embryo/embryo_cc_sc1.c b/src/bin/embryo/embryo_cc_sc1.c
index 1189ce807b..8f25be75b5 100644
--- a/src/bin/embryo/embryo_cc_sc1.c
+++ b/src/bin/embryo/embryo_cc_sc1.c
@@ -266,7 +266,7 @@ sc_compile(int argc, char *argv[])
266 void *inpfmark; 266 void *inpfmark;
267 char lcl_ctrlchar; 267 char lcl_ctrlchar;
268 int lcl_packstr, lcl_needsemicolon, lcl_tabsize; 268 int lcl_packstr, lcl_needsemicolon, lcl_tabsize;
269 Eina_Tmpstr *outfname; 269 Eina_Tmpstr *outfname = NULL;
270 270
271 /* set global variables to their initial value */ 271 /* set global variables to their initial value */
272 binf = NULL; 272 binf = NULL;
@@ -398,8 +398,11 @@ sc_compile(int argc, char *argv[])
398 } /* if */ 398 } /* if */
399 if (outf) 399 if (outf)
400 sc_closeasm(outf); 400 sc_closeasm(outf);
401 unlink(outfname); 401 if (outfname)