From bcbe744937e9928b242893f338d86529ae7e12b2 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 27 Aug 2020 17:22:28 +0900 Subject: [PATCH] e_info: add select window option in dump_buffers -w [Win_Id] : dump sepecific window -w server : dump only server -w client : dump only client Change-Id: I8e54ebe09b74dff8e45e61a623892fc8913d9c25 --- src/bin/e_info_client.c | 18 ++++++++-- src/bin/e_info_server.c | 80 +++++++++++++++++++++++++++++++---------- 2 files changed, 78 insertions(+), 20 deletions(-) diff --git a/src/bin/e_info_client.c b/src/bin/e_info_client.c index 1c867081d4..5fc10c9f34 100644 --- a/src/bin/e_info_client.c +++ b/src/bin/e_info_client.c @@ -2475,6 +2475,7 @@ _e_info_client_proc_transform_set(int argc, char **argv) " enlightenment_info -dump_buffers 1 -c 60 -p /test : start dump buffer with 60 buffers to '/test/dump_xxxx' folder\n" \ " enlightenment_info -dump_buffers 0 : stop dump buffer (store dump files to dump path)\n" \ " enlightenment_info -dump_buffers 1 -s 0.5 : start dump buffer with 0.5 scale factor\n" \ + " enlightenment_info -dump_buffers 1 -w Wind_ID or server or client : start dump buffer with specific window or server or client\n" \ " enlightenment_info -dump_selected_buffers Win_ID(from enlightenment_info -topvwins) : dump Win_ID(store dump files to dump path)\n" \ static char * @@ -2869,6 +2870,7 @@ finish: static void _e_info_client_proc_buffer_shot(int argc, char **argv) { + const char *win_id = ""; int dumprun = 0; int count = 100; int i; @@ -2942,12 +2944,24 @@ _e_info_client_proc_buffer_shot(int argc, char **argv) continue; } + if (eina_streq(argv[i], "-w")) + { + if (++i >= argc) + { + printf("Error: -w requires argument\n"); + goto err; + } + + win_id = argv[i]; + continue; + } + goto err; } if (!_e_info_client_eldbus_message_with_args_timeout("dump_buffers", _cb_buffer_shot, - ELDBUS_TIMEOUT_INFINITE, "iisdi", - dumprun, count, path, scale, mark)) + ELDBUS_TIMEOUT_INFINITE, "iisdis", + dumprun, count, path, scale, mark, win_id)) { printf("dump_buffers fail (%d)\n", dumprun); return; diff --git a/src/bin/e_info_server.c b/src/bin/e_info_server.c index c10957bd63..e7fc2ad93e 100644 --- a/src/bin/e_info_server.c +++ b/src/bin/e_info_server.c @@ -59,6 +59,8 @@ static int e_info_dump_count; static int e_info_dump_mark; static int e_info_dump_mark_count; static int e_info_dump_remote_surface = 0; +static int e_info_dump_server_or_client = 0; // 1: server 2: client +static uint64_t e_info_dump_win_id = 0; //FILE pointer for protocol_trace static FILE *log_fp_ptrace = NULL; @@ -4281,6 +4283,9 @@ _e_info_server_cb_buffer_change(void *data, int type, void *event) } } + if ((e_info_dump_win_id) && (e_info_dump_win_id != e_client_util_win_get(ec))) + return ECORE_CALLBACK_PASS_ON; + buffer = e_pixmap_resource_get(ec->pixmap); if (!buffer) return ECORE_CALLBACK_PASS_ON; @@ -4410,11 +4415,12 @@ _e_info_server_cb_buffer_dump(const Eldbus_Service_Interface *iface EINA_UNUSED, Eldbus_Message *reply; int start = 0; int count = 0; - const char *path = NULL; + const char *path = NULL, *win_id_s = NULL; + unsigned long tmp = 0; double scale; - int ret = 0; + Eina_Bool ret; - if (!eldbus_message_arguments_get(msg, "iisdi", &start, &count, &path, &scale, &e_info_dump_mark)) + if (!eldbus_message_arguments_get(msg, "iisdis", &start, &count, &path, &scale, &e_info_dump_mark, &win_id_s)) { return eldbus_message_error_new(msg, GET_CALL_MSG_ARG_ERR, "dump_buffers: an attempt to get arguments from method call message failed"); @@ -4426,50 +4432,86 @@ _e_info_server_cb_buffer_dump(const Eldbus_Service_Interface *iface EINA_UNUSED, { if (e_info_dump_running == 1) { - eldbus_message_arguments_append(reply, "is", ret, (e_info_dump_path ?: "nopath")); + eldbus_message_arguments_append(reply, "is", 0, (e_info_dump_path ?: "nopath")); return reply; } + + if (e_util_strcmp(win_id_s, "")) + { + if (!e_util_strcmp(win_id_s, "server")) + e_info_dump_server_or_client = 1; + else if (!e_util_strcmp(win_id_s, "client")) + e_info_dump_server_or_client = 2; + else + { + if (strlen(win_id_s) >= 2 && win_id_s[0] == '0' && win_id_s[1] == 'x') + ret = e_util_string_to_ulong(win_id_s, &tmp, 16); + else + ret = e_util_string_to_ulong(win_id_s, &tmp, 10); + if (!ret) + { + eldbus_message_arguments_append(reply, "is", -1, (e_info_dump_path ?: "nopath")); + return reply; + } + + e_info_dump_server_or_client = 2; + e_info_dump_win_id = (uint64_t)tmp; + } + } + e_info_dump_running = 1; e_info_dump_mark_count = 0; e_info_dump_count = 1; e_info_dump_path = _e_info_server_dump_directory_make(path); + if (e_info_dump_path == NULL) { e_info_dump_running = 0; e_info_dump_count = 0; + e_info_dump_win_id = 0; + e_info_dump_server_or_client = 0; ERR("dump_buffers start fail\n"); - ret = -1; + eldbus_message_arguments_append(reply, "is", -1, (e_info_dump_path ?: "nopath")); + return reply; } + + /* start dump */ + if (scale > 0.0) + tbm_surface_internal_dump_with_scale_start(e_info_dump_path, + e_comp->w, + e_comp->h, + count, scale); else + tbm_surface_internal_dump_start(e_info_dump_path, e_comp->w, e_comp->h, count); + + if (e_info_dump_server_or_client != 2) { - /* start dump */ - if (scale > 0.0) - tbm_surface_internal_dump_with_scale_start(e_info_dump_path, - e_comp->w, - e_comp->h, - count, scale); - else - tbm_surface_internal_dump_start(e_info_dump_path, e_comp->w, e_comp->h, count); tdm_helper_dump_start(e_info_dump_path, &e_info_dump_count); e_hwc_windows_debug_dump_start(); + } + + if (e_info_dump_server_or_client != 1) + { E_LIST_HANDLER_APPEND(e_info_dump_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, - _e_info_server_cb_buffer_change, NULL); + _e_info_server_cb_buffer_change, NULL); } - eldbus_message_arguments_append(reply, "is", ret, (e_info_dump_path ?: "nopath")); + + eldbus_message_arguments_append(reply, "is", 0, (e_info_dump_path ?: "nopath")); } else { if (e_info_dump_running == 0) { - eldbus_message_arguments_append(reply, "is", ret, (e_info_dump_path ?: "nopath")); + eldbus_message_arguments_append(reply, "is", 0, (e_info_dump_path ?: "nopath")); return reply; } + e_info_server_hook_call(E_INFO_SERVER_HOOK_BUFFER_DUMP_BEGIN); tdm_helper_dump_stop(); e_hwc_windows_debug_dump_stop(); tbm_surface_internal_dump_end(); - eldbus_message_arguments_append(reply, "is", ret, (e_info_dump_path ?: "nopath")); + eldbus_message_arguments_append(reply, "is", 0, (e_info_dump_path ?: "nopath")); E_FREE_LIST(e_info_dump_hdlrs, ecore_event_handler_del); e_info_dump_hdlrs = NULL; @@ -4481,6 +4523,8 @@ _e_info_server_cb_buffer_dump(const Eldbus_Service_Interface *iface EINA_UNUSED, e_info_dump_count = 0; e_info_dump_running = 0; e_info_dump_mark_count = 0; + e_info_dump_server_or_client = 0; + e_info_dump_win_id = 0; e_info_server_hook_call(E_INFO_SERVER_HOOK_BUFFER_DUMP_END); } @@ -6875,7 +6919,7 @@ static const Eldbus_Method methods[] = { { "bgcolor_set", ELDBUS_ARGS({"iiii", "bgcolor_set"}), NULL, _e_info_server_cb_bgcolor_set, 0}, { "punch", ELDBUS_ARGS({"iiiiiiiii", "punch_geometry"}), NULL, _e_info_server_cb_punch, 0}, { "transform_message", ELDBUS_ARGS({"siiiiiiii", "transform_message"}), NULL, e_info_server_cb_transform_message, 0}, - { "dump_buffers", ELDBUS_ARGS({"iisdi", "dump_buffers"}), ELDBUS_ARGS({"is", "dump_buffers reply"}), _e_info_server_cb_buffer_dump, 0 }, + { "dump_buffers", ELDBUS_ARGS({"iisdis", "dump_buffers"}), ELDBUS_ARGS({"is", "dump_buffers reply"}), _e_info_server_cb_buffer_dump, 0 }, { "dump_selected_buffers", ELDBUS_ARGS({"ss", "dump_selected_buffers"}), ELDBUS_ARGS({"s", "result of dump"}), _e_info_server_cb_selected_buffer_dump, 0 }, { "dump_screen", ELDBUS_ARGS({"s", "dump_screen"}), NULL, _e_info_server_cb_screen_dump, 0 }, { "output_mode", ELDBUS_ARGS({SIGNATURE_OUTPUT_MODE_CLIENT, "output mode"}), ELDBUS_ARGS({"a("SIGNATURE_OUTPUT_MODE_SERVER")", "array of ec"}), _e_info_server_cb_output_mode, 0 }, -- 2.34.1