netstar pushed a commit to branch master. http://git.enlightenment.org/apps/edi.git/commit/?id=63f03c5ef54b4ee805378c7c7d893d45f87fb690
commit 63f03c5ef54b4ee805378c7c7d893d45f87fb690 Author: Alastair Poole <nets...@gmail.com> Date: Mon Aug 10 10:23:22 2020 +0100 listen: Move into own file. "Document" API. Move these helpers into their own file/namespace. There might be times we want to do additional communication. Also it keeps edi_main.c less cluttered. --- src/bin/edi_listen.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/bin/edi_listen.h | 63 ++++++++++++++++++++++ src/bin/edi_main.c | 124 +----------------------------------------- src/bin/meson.build | 2 + 4 files changed, 215 insertions(+), 123 deletions(-) diff --git a/src/bin/edi_listen.c b/src/bin/edi_listen.c new file mode 100644 index 0000000..b0ece66 --- /dev/null +++ b/src/bin/edi_listen.c @@ -0,0 +1,149 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <Eina.h> +#include <Ecore.h> + +#include "edi_listen.h" +#include "mainview/edi_mainview.h" + +#include "edi_private.h" + +#define LISTEN_SOCKET_NAME "edi_listener" + +typedef struct _Edi_Listen_Server { + Ecore_Event_Handler *handler; + Ecore_Con_Server *srv; +} Edi_Listen_Server; + +static void *_edi_listener = NULL; + +static Eina_Bool +_edi_listen_server_client_connect_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + Ecore_Con_Event_Client_Data *ev; + const char *path; + + ev = event; + path = ev->data; + + edi_mainview_open_path(path); + ecore_con_client_del(ev->client); + + return ECORE_CALLBACK_RENEW; +} + +void +edi_listen_shutdown(void) +{ + Edi_Listen_Server *server = _edi_listener; + if (!server) return; + + ecore_event_handler_del(server->handler); + ecore_con_server_del(server->srv); + free(server); +} + +Eina_Bool +edi_listen_init(void) +{ + Edi_Listen_Server *server = calloc(1, sizeof(Edi_Listen_Server)); + if (!server) return EINA_FALSE; + + server->srv = ecore_con_server_add(ECORE_CON_LOCAL_USER, LISTEN_SOCKET_NAME, 0, NULL); + if (!server->srv) return EINA_FALSE; + + server->handler = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, _edi_listen_server_client_connect_cb, NULL); + _edi_listener = server; + + return EINA_TRUE; +} + +typedef struct _Edi_Listen_Client { + Ecore_Con_Server *srv; + char *path; + Eina_Bool success; +} Edi_Listen_Client; + +static Eina_Bool +_edi_listen_client_closed_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) +{ + Ecore_Con_Event_Server_Del *ev; + Edi_Listen_Client *client = data; + + ev = event; + + if (client->srv != ev->server) return ECORE_CALLBACK_RENEW; + + client->success = EINA_TRUE; + + return ECORE_CALLBACK_DONE; +} + +static Eina_Bool +_edi_listen_client_check_timer_cb(void *data EINA_UNUSED) +{ + Edi_Listen_Client *client; + static double total = 0.0; + + client = data; + total += 0.1; + + if (total < 3.0) + return ECORE_CALLBACK_RENEW; + + if (client->success) + ecore_main_loop_quit(); + else + evas_object_show(edi_main_win_get()); + + free(client->path); + free(client); + + return ECORE_CALLBACK_DONE; +} + +static Eina_Bool +_edi_listen_client_connect_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) +{ + Ecore_Con_Event_Server_Add *ev; + Ecore_Con_Server *srv; + Edi_Listen_Client *client; + + ev = event; + srv = ev->server; + client = data; + + if (client->srv != srv) return ECORE_CALLBACK_RENEW; + + ecore_con_server_send(srv, client->path, 1 + strlen(client->path)); + ecore_con_server_flush(srv); + + return ECORE_CALLBACK_DONE; +} + +Eina_Bool +edi_listen_client_add(char *path) +{ + Edi_Listen_Client *client; + Ecore_Con_Server *srv = ecore_con_server_connect(ECORE_CON_LOCAL_USER, LISTEN_SOCKET_NAME, 0, NULL); + if (!srv) + { + free(path); + return EINA_FALSE; + } + + client = calloc(1, sizeof(Edi_Listen_Client)); + if (!client) return EINA_FALSE; + + client->path = path; + client->srv = srv; + + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _edi_listen_client_connect_cb, client); + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _edi_listen_client_closed_cb, client); + ecore_timer_add(0.1, _edi_listen_client_check_timer_cb, client); + + return EINA_TRUE; +} + diff --git a/src/bin/edi_listen.h b/src/bin/edi_listen.h new file mode 100644 index 0000000..1397e51 --- /dev/null +++ b/src/bin/edi_listen.h @@ -0,0 +1,63 @@ +#ifndef EDI_LISTEN_H +#define EDI_LISTEN_H + +#include <Eina.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file + * @brief Listening and sending to existing and new Edi sessions. + */ + +/** + * @brief Listen communication functions. + * @defgroup Listen + * + * @{ + * + * Communication between Edi sessions. + */ + +/** + * Initialise and begin a listening session. + * + * @return Boolean success of initialisation. + * + * @ingroup Listen + */ +Eina_Bool +edi_listen_init(); + +/** + * Shutdown the listening object and any connections, freeing the object. + * + * @ingroup Listen + */ +void +edi_listen_shutdown(void); + +/** + * Attempt to send a file name to an existing Edi session to open. + * + * @param path The path of the file to open. + * + * @return Boolean success of the operation. + * + * @ingroup Listen + */ +Eina_Bool +edi_listen_client_add(char *path); + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/bin/edi_main.c b/src/bin/edi_main.c index 6cf3899..31b0967 100644 --- a/src/bin/edi_main.c +++ b/src/bin/edi_main.c @@ -12,6 +12,7 @@ #include "edi_filepanel.h" #include "edi_file.h" #include "edi_process.h" +#include "edi_listen.h" #include "edi_logpanel.h" #include "edi_consolepanel.h" #include "edi_searchpanel.h" @@ -52,8 +53,6 @@ static Evas_Object *_edi_menu_init, *_edi_menu_commit, *_edi_menu_push, *_edi_me static Evas_Object *_edi_main_win, *_edi_main_box; static Eina_Bool _edi_toolbar_is_horizontal, _edi_toolbar_text_visible; -static void *_edi_listener = NULL; - int _edi_log_dom = -1; static void @@ -1752,127 +1751,6 @@ edi_main_win_get(void) return _edi_main_win; } -typedef struct _Edi_Listen_Server { - Ecore_Event_Handler *handler; - Ecore_Con_Server *srv; -} Edi_Listen_Server; - -static Eina_Bool -_edi_listen_server_client_connect_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) -{ - Ecore_Con_Event_Client_Data *ev; - const char *path; - - ev = event; - path = ev->data; - - edi_mainview_open_path(path); - ecore_con_client_del(ev->client); - - return ECORE_CALLBACK_RENEW; -} - -void -edi_listen_shutdown(void) -{ - Edi_Listen_Server *server = _edi_listener; - if (!server) return; - - ecore_event_handler_del(server->handler); - ecore_con_server_del(server->srv); - free(server); -} - -Eina_Bool -edi_listen_init(void) -{ - Edi_Listen_Server *server = calloc(1, sizeof(Edi_Listen_Server)); - if (!server) return EINA_FALSE; - - server->srv = ecore_con_server_add(ECORE_CON_LOCAL_USER, "listener", 0, NULL); - if (!server->srv) return EINA_FALSE; - - server->handler = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, _edi_listen_server_client_connect_cb, NULL); - _edi_listener = server; - - return EINA_TRUE; -} - -typedef struct Edi_Listen_Client { - char *path; - Eina_Bool success; -} Edi_Listen_Client; - -static Eina_Bool -_edi_listen_client_closed_cb(void *data, int type EINA_UNUSED, void *ev EINA_UNUSED) -{ - Edi_Listen_Client *client = data; - - client->success = EINA_TRUE; - - return ECORE_CALLBACK_RENEW; -} - -static Eina_Bool -_edi_listen_client_check_timer_cb(void *data EINA_UNUSED) -{ - Edi_Listen_Client *client; - static double total = 0.0; - - client = data; - total += 0.1; - - if (total < 3.0) - return ECORE_CALLBACK_RENEW; - - if (client->success) - ecore_main_loop_quit(); - else - evas_object_show(edi_main_win_get()); - - return ECORE_CALLBACK_DONE; -} - -static Eina_Bool -_edi_listen_client_connect_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) -{ - Ecore_Con_Event_Server_Add *ev; - Ecore_Con_Server *srv; - Edi_Listen_Client *client; - - ev = event; - srv = ev->server; - client = data; - - ecore_con_server_send(srv, client->path, 1 + strlen(client->path)); - ecore_con_server_flush(srv); - - return ECORE_CALLBACK_DONE; -} - -Eina_Bool -edi_listen_client_add(char *path) -{ - Edi_Listen_Client *client; - Ecore_Con_Server *srv = ecore_con_server_connect(ECORE_CON_LOCAL_USER, "listener", 0, NULL); - if (!srv) - { - free(path); - return EINA_FALSE; - } - - client = calloc(1, sizeof(Edi_Listen_Client)); - if (!client) return EINA_FALSE; - - client->path = path; - - ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _edi_listen_client_connect_cb, client); - ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _edi_listen_client_closed_cb, client); - ecore_timer_add(0.1, _edi_listen_client_check_timer_cb, client); - - return EINA_TRUE; -} - Eina_Bool edi_open(const char *inputpath) { diff --git a/src/bin/meson.build b/src/bin/meson.build index c6b6324..4611dcc 100644 --- a/src/bin/meson.build +++ b/src/bin/meson.build @@ -17,6 +17,8 @@ src = files([ 'edi_file.h', 'edi_filepanel.c', 'edi_filepanel.h', + 'edi_listen.c', + 'edi_listen.h', 'edi_logpanel.c', 'edi_logpanel.h', 'edi_main.c', --