211 lines
6.1 KiB
C
211 lines
6.1 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include "elementary_config.h"
|
|
#endif
|
|
#include <Elementary.h>
|
|
|
|
|
|
typedef struct {
|
|
Evas_Object *win, *label;
|
|
Eina_Stringshare *view_name;
|
|
} App_View_Context;
|
|
|
|
static Elm_App_Server *phone_server = NULL, *msg_server = NULL;
|
|
|
|
static void _text_update(App_View_Context *ctx, const char *state)
|
|
{
|
|
char buffer[1024];
|
|
|
|
if (!ctx->label)
|
|
return;
|
|
snprintf(buffer, sizeof(buffer), "%s - state=%s", ctx->view_name, state);
|
|
elm_object_text_set(ctx->label, buffer);
|
|
}
|
|
|
|
static void
|
|
_window_create(App_View_Context *ctx)
|
|
{
|
|
ctx->win = elm_win_util_standard_add("app_view", ctx->view_name);
|
|
|
|
ctx->label = elm_label_add(ctx->win);
|
|
evas_object_size_hint_weight_set(ctx->label, EVAS_HINT_EXPAND,
|
|
EVAS_HINT_EXPAND);
|
|
evas_object_data_set(ctx->win, "label", ctx->label);
|
|
|
|
_text_update(ctx, "alive");
|
|
|
|
elm_win_resize_object_add(ctx->win, ctx->label);
|
|
evas_object_show(ctx->label);
|
|
|
|
evas_object_resize(ctx->win, 400, 300);
|
|
evas_object_show(ctx->win);
|
|
}
|
|
|
|
static Eina_Bool
|
|
_close_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
{
|
|
App_View_Context *ctx = data;
|
|
if (ctx->win)
|
|
evas_object_del(ctx->win);
|
|
eo_del(obj);
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
static Eina_Bool
|
|
_pause_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
{
|
|
App_View_Context *ctx = data;
|
|
_text_update(ctx, "paused");
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
static Eina_Bool
|
|
_resume_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
{
|
|
App_View_Context *ctx = data;
|
|
|
|
//shallow state
|
|
if (!ctx->win)
|
|
{
|
|
_window_create(ctx);
|
|
eo_do(obj, elm_app_server_view_window_set(ctx->win));
|
|
}
|
|
|
|
_text_update(ctx, "alive");
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
static Eina_Bool
|
|
_view_del_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
{
|
|
App_View_Context *ctx = data;
|
|
|
|
if (ctx->win)
|
|
evas_object_del(ctx->win);
|
|
eo_do(obj, elm_app_server_view_window_set(NULL));
|
|
eina_stringshare_del(ctx->view_name);
|
|
free(ctx);
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
static Elm_App_Server_View *
|
|
_create_view_cb(Elm_App_Server *app_server, const Eina_Value *args EINA_UNUSED, Eina_Stringshare **error_name, Eina_Stringshare **error_message EINA_UNUSED)
|
|
{
|
|
Elm_App_Server_View *view;
|
|
const char *id, *pkg;
|
|
App_View_Context *ctx;
|
|
|
|
ctx = calloc(1, sizeof(App_View_Context));
|
|
if (!ctx)
|
|
{
|
|
*error_name = eina_stringshare_add("No memory available");
|
|
return NULL;
|
|
}
|
|
|
|
view = eo_add_custom(ELM_APP_SERVER_VIEW_CLASS, app_server,
|
|
elm_app_server_view_constructor(NULL));
|
|
|
|
eo_do(view, elm_app_server_view_id_get(&id));
|
|
eo_do(app_server, elm_app_server_package_get(&pkg));
|
|
ctx->view_name = eina_stringshare_printf("%s %s", pkg, id);
|
|
|
|
_window_create(ctx);
|
|
|
|
eo_do(view, elm_app_server_view_title_set(ctx->view_name),
|
|
elm_app_server_view_new_events_set(5),
|
|
elm_app_server_view_window_set(ctx->win),
|
|
elm_app_server_view_resume(),
|
|
eo_event_callback_add(ELM_APP_SERVER_VIEW_EV_CLOSED, _close_cb, ctx),
|
|
eo_event_callback_add(ELM_APP_SERVER_VIEW_EV_PAUSED, _pause_cb, ctx),
|
|
eo_event_callback_add(ELM_APP_SERVER_VIEW_EV_RESUMED, _resume_cb, ctx),
|
|
eo_event_callback_add(EO_EV_DEL, _view_del_cb, ctx));
|
|
|
|
return view;
|
|
}
|
|
|
|
static Eina_Bool
|
|
_terminate_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
{
|
|
const char *title;
|
|
|
|
printf("terminate cb\n");
|
|
eo_do(obj, elm_app_server_save(),
|
|
elm_app_server_title_get(&title));
|
|
|
|
printf("Closing: %s\n", title);
|
|
eo_unref(obj);
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Elm_App_Server *
|
|
test_application_server_common(const char *pkg)
|
|
{
|
|
Eina_Iterator *views_iter;
|
|
Elm_App_Server_View *view;
|
|
Elm_App_Server *server;
|
|
|
|
server = eo_add_custom(ELM_APP_SERVER_CLASS, NULL,
|
|
elm_app_server_constructor(pkg, _create_view_cb));
|
|
eo_do(server, elm_app_server_title_set(pkg),
|
|
elm_app_server_views_get(&views_iter),
|
|
eo_event_callback_add(ELM_APP_SERVER_EV_TERMINATE, _terminate_cb, NULL));
|
|
|
|
//views create in shallow state
|
|
EINA_ITERATOR_FOREACH(views_iter, view)
|
|
{
|
|
App_View_Context *ctx;
|
|
const char *id;
|
|
|
|
ctx = calloc(1, sizeof(App_View_Context));
|
|
|
|
eo_do(view, elm_app_server_view_id_get(&id));
|
|
ctx->view_name = eina_stringshare_printf("%s %s", pkg, id);
|
|
|
|
eo_do(view,
|
|
eo_event_callback_add(ELM_APP_SERVER_VIEW_EV_CLOSED, _close_cb, ctx),
|
|
eo_event_callback_add(ELM_APP_SERVER_VIEW_EV_PAUSED, _pause_cb, ctx),
|
|
eo_event_callback_add(ELM_APP_SERVER_VIEW_EV_RESUMED, _resume_cb, ctx),
|
|
eo_event_callback_add(EO_EV_DEL, _view_del_cb, ctx));
|
|
}
|
|
eina_iterator_free(views_iter);
|
|
|
|
return server;
|
|
}
|
|
|
|
static Eina_Bool
|
|
_server_del_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
{
|
|
Elm_App_Server **server = data;
|
|
*server = NULL;
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
void
|
|
test_application_server_phone(void *data EINA_UNUSED,
|
|
Evas_Object *obj EINA_UNUSED,
|
|
void *event_info EINA_UNUSED)
|
|
{
|
|
if (phone_server)
|
|
{
|
|
printf("Phone already running\n");
|
|
return;
|
|
}
|
|
printf("Starting phone\n");
|
|
phone_server = test_application_server_common("org.enlightenment.phone");
|
|
eo_do(phone_server, eo_event_callback_add(EO_EV_DEL, _server_del_cb, &phone_server));
|
|
}
|
|
|
|
void
|
|
test_application_server_message(void *data EINA_UNUSED,
|
|
Evas_Object *obj EINA_UNUSED,
|
|
void *event_info EINA_UNUSED)
|
|
{
|
|
if (msg_server)
|
|
{
|
|
printf("Message already running\n");
|
|
return;
|
|
}
|
|
printf("Starting message\n");
|
|
msg_server = test_application_server_common( "org.enlightenment.message");
|
|
eo_do(msg_server, eo_event_callback_add(EO_EV_DEL, _server_del_cb, &msg_server));
|
|
}
|