use ecore_on url - nuke warnings and use mouse up for popup

This commit is contained in:
Carsten Haitzler 2021-02-20 20:16:38 +00:00
parent d91f0a6c0f
commit d1486a92a0
3 changed files with 93 additions and 201 deletions

View File

@ -77,7 +77,7 @@ _create_data(E_Config_Dialog *cfd)
}
static void
_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
_free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
{
if (!forecasts_config)
return;
@ -102,7 +102,7 @@ _poll_time_slider_changed_cb(void *data, Evas_Object *obj,
}
static void
_radio_changed_cb(void *data, Evas_Object *obj,
_radio_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
E_Config_Dialog *cfd = data;
@ -123,7 +123,7 @@ _text_location_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
}
static void
_item_location_del(void *data, Evas_Object *obj)
_item_location_del(void *data, Evas_Object *obj EINA_UNUSED)
{
Places_Location *location = data;
@ -131,7 +131,7 @@ _item_location_del(void *data, Evas_Object *obj)
}
static void
_locations_selected_cb(void *data, Evas_Object *obj,
_locations_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
E_Config_Dialog_Data *cfdata;
@ -186,7 +186,7 @@ _locations_fill(E_Config_Dialog_Data *cfdata)
}
static void
_categories_selected_cb(void *data, Evas_Object *obj,
_categories_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
E_Config_Dialog_Data *cfdata;
@ -206,7 +206,7 @@ _categories_selected_cb(void *data, Evas_Object *obj,
}
static void
_item_location_id_del(void *data, Evas_Object *obj)
_item_location_id_del(void *data, Evas_Object *obj EINA_UNUSED)
{
Places_Category *category = data;
free(category);

View File

@ -2,8 +2,7 @@
#include "e_mod_main.h"
#include <json-c/json.h>
#define _XOPEN_SOURCE
#include <time.h>
char *strptime(const char *s, const char *format, struct tm *tm);
#define FORECASTS 2
#define KM_TO_MI 1.609344
@ -42,10 +41,9 @@ struct _Instance
Evas_Object *forecasts_obj;
Forecasts *forecasts;
Ecore_Timer *check_timer;
Ecore_Con_Server *server;
Ecore_Event_Handler *add_handler;
Ecore_Event_Handler *del_handler;
Ecore_Event_Handler *data_handler;
Ecore_Con_Url *url;
Ecore_Event_Handler *url_data_handler;
Ecore_Event_Handler *url_complete_handler;
struct
{
@ -99,16 +97,8 @@ struct _Forecasts
Evas_Object *icon_obj;
};
struct
{
const char *host;
int port;
} proxy = {
NULL, 0
};
/* Module Function Protos */
static void _forecasts_cb_mouse_down(void *data, Evas *e, Evas_Object *obj,
static void _forecasts_cb_mouse_up(void *data, Evas *e, Evas_Object *obj,
void *event_info);
static void _forecasts_menu_cb_configure(void *data, E_Menu *m,
E_Menu_Item *mi);
@ -117,10 +107,8 @@ static Eina_Bool _forecasts_cb_check(void *data);
static Config_Item *_forecasts_config_item_get(const char *id);
static Forecasts *_forecasts_new(Evas *evas);
static void _forecasts_free(Forecasts *w);
static void _forecasts_get_proxy(void);
static Eina_Bool _forecasts_server_add(void *data, int type, void *event);
static Eina_Bool _forecasts_server_del(void *data, int type, void *event);
static Eina_Bool _forecasts_server_data(void *data, int type, void *event);
static Eina_Bool _forecasts_url_data(void *data, int type, void *event);
static Eina_Bool _forecasts_url_complete(void *data, int type, void *event);
static int _forecasts_parse(void *data);
static void _forecasts_converter(Instance *inst);
static void _forecasts_convert_degrees(int *value, int dir);
@ -128,7 +116,7 @@ static void _forecasts_convert_distances(int *value, int dir);
static void _forecasts_convert_pressures(float *value, int dir);
static void _forecasts_display_set(Instance *inst, int ok);
static void _forecasts_popup_content_create(Instance *inst);
static void _cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info);
static Evas_Object *_forecasts_popup_icon_create(Evas *evas, const char *code);
@ -159,28 +147,24 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
inst->gcc = gcc;
inst->popup = NULL;
inst->forecasts_obj = o;
evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_DOWN,
_cb_mouse_down, inst);
evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_UP,
_cb_mouse_up, inst);
evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_IN,
_cb_mouse_in, inst);
evas_object_event_callback_add(inst->forecasts_obj, EVAS_CALLBACK_MOUSE_OUT,
_cb_mouse_out, inst);
if (!inst->add_handler)
inst->add_handler =
ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
_forecasts_server_add, inst);
if (!inst->del_handler)
inst->del_handler =
ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
_forecasts_server_del, inst);
if (!inst->data_handler)
inst->data_handler =
ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
_forecasts_server_data, inst);
if (!inst->url_data_handler)
inst->url_data_handler =
ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA,
_forecasts_url_data, inst);
if (!inst->url_complete_handler)
inst->url_complete_handler =
ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE,
_forecasts_url_complete, inst);
evas_object_event_callback_add(w->forecasts_obj, EVAS_CALLBACK_MOUSE_DOWN,
_forecasts_cb_mouse_down, inst);
evas_object_event_callback_add(w->forecasts_obj, EVAS_CALLBACK_MOUSE_UP,
_forecasts_cb_mouse_up, inst);
forecasts_config->instances =
eina_list_append(forecasts_config->instances, inst);
@ -202,24 +186,22 @@ _gc_shutdown(E_Gadcon_Client *gcc)
if (inst->popup) _forecasts_popup_destroy(inst);
if (inst->check_timer)
ecore_timer_del(inst->check_timer);
if (inst->add_handler)
ecore_event_handler_del(inst->add_handler);
if (inst->data_handler)
ecore_event_handler_del(inst->data_handler);
if (inst->del_handler)
ecore_event_handler_del(inst->del_handler);
if (inst->server)
ecore_con_server_del(inst->server);
if (inst->url_data_handler)
ecore_event_handler_del(inst->url_data_handler);
if (inst->url_complete_handler)
ecore_event_handler_del(inst->url_complete_handler);
if (inst->url)
ecore_con_url_free(inst->url);
if (inst->area)
eina_stringshare_del(inst->area);
eina_strbuf_free(inst->buffer);
inst->server = NULL;
inst->url = NULL;
forecasts_config->instances =
eina_list_remove(forecasts_config->instances, inst);
evas_object_event_callback_del(w->forecasts_obj, EVAS_CALLBACK_MOUSE_DOWN,
_forecasts_cb_mouse_down);
evas_object_event_callback_del(w->forecasts_obj, EVAS_CALLBACK_MOUSE_UP,
_forecasts_cb_mouse_up);
_forecasts_free(w);
E_FREE(inst);
@ -249,13 +231,13 @@ _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient)
}
static const char *
_gc_label(const E_Gadcon_Client_Class *client_class)
_gc_label(const E_Gadcon_Client_Class *client_class EINA_UNUSED)
{
return D_("Forecasts");
}
static Evas_Object *
_gc_icon(const E_Gadcon_Client_Class *client_class, Evas *evas)
_gc_icon(const E_Gadcon_Client_Class *client_class EINA_UNUSED, Evas *evas)
{
Evas_Object *o;
char buf[4096];
@ -268,7 +250,7 @@ _gc_icon(const E_Gadcon_Client_Class *client_class, Evas *evas)
}
static const char *
_gc_id_new(const E_Gadcon_Client_Class *client_class)
_gc_id_new(const E_Gadcon_Client_Class *client_class EINA_UNUSED)
{
Config_Item *ci;
@ -277,14 +259,14 @@ _gc_id_new(const E_Gadcon_Client_Class *client_class)
}
static void
_forecasts_cb_mouse_down(void *data, Evas *e, Evas_Object *obj,
_forecasts_cb_mouse_up(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED,
void *event_info)
{
Instance *inst;
Evas_Event_Mouse_Down *ev;
Instance *inst = data;
Evas_Event_Mouse_Up *ev = event_info;
inst = data;
ev = event_info;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
if ((ev->button == 3) && (!forecasts_config->menu))
{
E_Menu *m;
@ -312,7 +294,7 @@ _forecasts_cb_mouse_down(void *data, Evas *e, Evas_Object *obj,
}
static void
_forecasts_menu_cb_post(void *data, E_Menu *m)
_forecasts_menu_cb_post(void *data EINA_UNUSED, E_Menu *m EINA_UNUSED)
{
if (!forecasts_config->menu)
return;
@ -321,7 +303,7 @@ _forecasts_menu_cb_post(void *data, E_Menu *m)
}
static void
_forecasts_menu_cb_configure(void *data, E_Menu *m, E_Menu_Item *mi)
_forecasts_menu_cb_configure(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
{
Instance *inst;
@ -367,7 +349,6 @@ _forecasts_config_item_get(const char *id)
ci->id = eina_stringshare_add(id);
ci->poll_time = 60.0;
ci->degrees = DEGREES_C;
ci->host = eina_stringshare_add("www.enlightenment.org");
ci->lat = ci->lon = 0;
ci->show_text = 1;
ci->popup_on_hover = 1;
@ -385,6 +366,7 @@ E_API E_Module_Api e_modapi = {
E_API void *
e_modapi_init(E_Module *m)
{
ecore_con_url_init();
bindtextdomain(PACKAGE, LOCALE_DIR);
bind_textdomain_codeset(PACKAGE, "UTF-8");
@ -396,7 +378,6 @@ e_modapi_init(E_Module *m)
E_CONFIG_VAL(D, T, id, STR);
E_CONFIG_VAL(D, T, poll_time, DOUBLE);
E_CONFIG_VAL(D, T, degrees, INT);
E_CONFIG_VAL(D, T, host, STR);
E_CONFIG_VAL(D, T, show_text, INT);
E_CONFIG_VAL(D, T, popup_on_hover, INT);
E_CONFIG_VAL(D, T, location_id, INT);
@ -421,7 +402,6 @@ e_modapi_init(E_Module *m)
ci = E_NEW(Config_Item, 1);
ci->poll_time = 60.0;
ci->degrees = DEGREES_C;
ci->host = eina_stringshare_add("www.enlightenment.org");
ci->lat = ci->lon = 0;
ci->id = eina_stringshare_add("0");
ci->show_text = 1;
@ -429,7 +409,6 @@ e_modapi_init(E_Module *m)
forecasts_config->items = eina_list_append(forecasts_config->items, ci);
}
_forecasts_get_proxy();
forecasts_config->module = m;
e_gadcon_provider_register(&_gadcon_class);
@ -437,7 +416,7 @@ e_modapi_init(E_Module *m)
}
E_API int
e_modapi_shutdown(E_Module *m)
e_modapi_shutdown(E_Module *m EINA_UNUSED)
{
forecasts_config->module = NULL;
e_gadcon_provider_unregister(&_gadcon_class);
@ -458,8 +437,6 @@ e_modapi_shutdown(E_Module *m)
ci = forecasts_config->items->data;
if (ci->id)
eina_stringshare_del(ci->id);
if (ci->host)
eina_stringshare_del(ci->host);
if (ci->location)
eina_stringshare_del(ci->location);
@ -472,11 +449,12 @@ e_modapi_shutdown(E_Module *m)
E_FREE(forecasts_config);
E_CONFIG_DD_FREE(conf_item_edd);
E_CONFIG_DD_FREE(conf_edd);
ecore_con_url_shutdown();
return 1;
}
E_API int
e_modapi_save(E_Module *m)
e_modapi_save(E_Module *m EINA_UNUSED)
{
e_config_domain_save("module.forecasts", conf_edd, forecasts_config);
return 1;
@ -529,101 +507,47 @@ _forecasts_free(Forecasts *w)
w = NULL;
}
static void
_forecasts_get_proxy(void)
{
const char *env;
const char *host = NULL;
const char *p;
int port = 0;
env = getenv("http_proxy");
if ((!env) || (!*env)) env = getenv("HTTP_PROXY");
if ((!env) || (!*env)) return;
if (strncmp(env, "http://", 7)) return;
host = strchr(env, ':');
host += 3;
p = strchr(host, ':');
if (p)
{
if (sscanf(p + 1, "%d", &port) != 1)
port = 0;
}
if ((host) && (port))
{
if (proxy.host) eina_stringshare_del(proxy.host);
proxy.host = eina_stringshare_add_length(host, p - host);
proxy.port = port;
}
}
static Eina_Bool
_forecasts_cb_check(void *data)
{
Instance *inst;
/* check that data is valid */
if (!(inst = data)) return EINA_FALSE;
Instance *inst = data;
char buf[256];
/* if we have a previous server, delete it */
if (inst->server) ecore_con_server_del(inst->server);
/* server deleted, set variable to NULL */
inst->server = NULL;
if (proxy.port != 0)
inst->server =
ecore_con_server_connect(ECORE_CON_REMOTE_NODELAY,
proxy.host, proxy.port, inst);
else
inst->server =
ecore_con_server_connect(ECORE_CON_REMOTE_NODELAY | ECORE_CON_USE_MIXED, inst->ci->host, 443, inst);
if (!inst->server) return EINA_FALSE;
if (inst->url) ecore_con_url_free(inst->url);
snprintf(buf, sizeof(buf),
"https://www.enlightenment.org/weather.php?lat=%s&lon=%s",
inst->ci->lat, inst->ci->lon);
DEBUG("FC: URL: %s", buf);
inst->url = ecore_con_url_new(buf);
if (!inst->url) return EINA_FALSE;
ecore_con_url_http_version_set(inst->url, ECORE_CON_URL_HTTP_VERSION_1_0);
ecore_con_url_get(inst->url);
return EINA_TRUE;
}
static Eina_Bool
_forecasts_server_add(void *data, int type, void *event)
_forecasts_url_data(void *data, int type EINA_UNUSED, void *event)
{
Instance *inst;
Ecore_Con_Event_Server_Add *ev;
char buf[1024];
char forecast[1024];
Instance *inst = data;
Ecore_Con_Event_Url_Data *ev = event;
inst = data;
if (!inst)
return EINA_TRUE;
ev = event;
if ((!inst->server) || (inst->server != ev->server))
return EINA_TRUE;
snprintf(forecast, sizeof(forecast), "/weather.php?lat=%s&lon=%s", inst->ci->lat, inst->ci->lon);
snprintf(buf, sizeof(buf)-strlen(forecast)-(strlen(inst->ci->host)*2), "GET https://%s%s HTTP/1.1\r\n"
"Host: %s\r\n"
"Connection: close\r\n\r\n",
inst->ci->host, forecast, inst->ci->host);
DEBUG("Server: %s", buf);
ecore_con_server_send(inst->server, buf, strlen(buf));
if ((!inst->url) || (inst->url != ev->url_con)) return EINA_TRUE;
eina_strbuf_append_length(inst->buffer, (const char *)ev->data, ev->size);
return EINA_FALSE;
}
static Eina_Bool
_forecasts_server_del(void *data, int type, void *event)
_forecasts_url_complete(void *data, int type EINA_UNUSED, void *event)
{
Instance *inst;
Ecore_Con_Event_Server_Del *ev;
Instance *inst = data;
Ecore_Con_Event_Url_Complete *ev = event;
int ret;
inst = data;
ev = event;
if ((!inst->server) || (inst->server != ev->server))
return EINA_TRUE;
ecore_con_server_del(inst->server);
inst->server = NULL;
if ((!inst->url) || (inst->url != ev->url_con)) return EINA_TRUE;
DEBUG("FC: status: %i %s", ev->status, eina_strbuf_string_get(inst->buffer));
ecore_con_url_free(inst->url);
inst->url = NULL;
eina_stringshare_replace(&inst->location, inst->ci->location);
ret = _forecasts_parse(inst);
@ -631,22 +555,6 @@ _forecasts_server_del(void *data, int type, void *event)
_forecasts_display_set(inst, ret);
eina_strbuf_string_free(inst->buffer);
return EINA_FALSE;
}
static Eina_Bool
_forecasts_server_data(void *data, int type, void *event)
{
Instance *inst;
Ecore_Con_Event_Server_Data *ev;
inst = data;
ev = event;
if ((!inst->server) || (inst->server != ev->server))
return EINA_TRUE;
eina_strbuf_append_length(inst->buffer, ev->data, ev->size);
return EINA_FALSE;
}
@ -678,8 +586,8 @@ _epoch_days(struct tm *tm_in)
static int
_forecasts_parse(void *data)
{
Instance *inst;
char *needle;
Instance *inst = data;
const char *result;
const char *timestamp, *code;
time_t now;
struct tm *tm_local, *tm_data;
@ -695,11 +603,7 @@ _forecasts_parse(void *data)
"Sat",
};
inst = data;
if (!inst)
return 0;
if (!inst->buffer)
return 0;
if (!inst->buffer) return 0;
for (int i = 0; i < FORECASTS; i++)
{
@ -710,11 +614,10 @@ _forecasts_parse(void *data)
tm_local = localtime(&now);
days_prev = _epoch_days(tm_local);
needle = strstr(eina_strbuf_string_get(inst->buffer), "\r\n\r\n");
if (!needle) goto error;
needle += 4;
result = eina_strbuf_string_get(inst->buffer);
if (!result) goto error;
json_object *o_root = json_tokener_parse(needle);
json_object *o_root = json_tokener_parse(result);
if (!o_root) goto error;
json_object *o_properties = json_object_object_get(o_root, "properties");
if (!o_properties) goto error;
@ -805,7 +708,7 @@ _forecasts_parse(void *data)
return 1;
error:
fprintf(stderr, "ERROR: Couldn't parse info from %s\n", inst->ci->host);
printf("FC: ERROR: Couldn't parse info\n");
return 0;
}
@ -871,13 +774,12 @@ _forecasts_convert_pressures(float *value, int dir)
}
static void
_forecasts_display_set(Instance *inst, int ok)
_forecasts_display_set(Instance *inst, int ok EINA_UNUSED)
{
char buf[4096];
char m[4096];
if (!inst)
return;
if (!inst) return;
snprintf(m, sizeof(m), "%s/forecasts.edj",
e_module_dir_get(forecasts_config->module));
@ -1175,13 +1077,12 @@ _forecasts_popup_destroy(Instance *inst)
}
static void
_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Instance *inst;
Evas_Event_Mouse_Down *ev;
if (!(inst = data)) return;
Instance *inst = data;
Evas_Event_Mouse_Up *ev = event_info;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
if (!inst->ci->popup_on_hover)
{
if (!inst->popup) _forecasts_popup_content_create(inst);
@ -1189,33 +1090,25 @@ _cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
return;
}
ev = event_info;
if (ev->button == 1)
{
e_gadcon_popup_toggle_pinned(inst->popup);
}
if (ev->button == 1) e_gadcon_popup_toggle_pinned(inst->popup);
}
static void
_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info)
_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Instance *inst;
Instance *inst = data;
if (!(inst = data)) return;
if (!inst->ci->popup_on_hover) return;
if (!inst->popup) _forecasts_popup_content_create(inst);
e_gadcon_popup_show(inst->popup);
}
static void
_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info)
_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Instance *inst;
Instance *inst = data;
if (!(inst = data)) return;
if (!(inst->popup)) return;
if (inst->popup->pinned) return;
e_gadcon_popup_hide(inst->popup);
}

View File

@ -34,7 +34,6 @@ struct _Config_Item
double poll_time;
int degrees;
const char *host;
int show_text;
int popup_on_hover;