summaryrefslogtreecommitdiff
path: root/src/bin/test_task_switcher.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/test_task_switcher.c')
-rw-r--r--src/bin/test_task_switcher.c408
1 files changed, 408 insertions, 0 deletions
diff --git a/src/bin/test_task_switcher.c b/src/bin/test_task_switcher.c
new file mode 100644
index 000000000..7cb908493
--- /dev/null
+++ b/src/bin/test_task_switcher.c
@@ -0,0 +1,408 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+#include <Eina.h>
+#ifndef ELM_LIB_QUICKLAUNCH
+
+#define APPS_COL 0
+#define VIEWS_COL 1
+#define PROPS_VIEW_COL 2
+
+static Evas_Object *table = NULL;
+static Elm_App_Client *app_selected = NULL;
+static Eina_List *apps_list = NULL;
+
+static void _app_view_clicked(void *data, Evas_Object *obj, void *event_info);
+static void _apps_list_update(void);
+
+static void _btn_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ eo_do(view, elm_app_client_view_close(NULL, NULL));
+}
+
+static void _btn_pause_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ eo_do(view, elm_app_client_view_pause(NULL, NULL));
+}
+
+static void _btn_resume_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ eo_do(view, elm_app_client_view_resume(NULL, NULL));
+}
+
+static Eina_Bool
+_app_view_prop_changed_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_View_State state;
+
+ eo_do(obj, elm_app_client_view_state_get(&state));
+
+ if (state == ELM_APP_VIEW_STATE_CLOSED)
+ {
+ Evas_Object *props = elm_table_child_get(table, PROPS_VIEW_COL, 0);
+ elm_table_unpack(table, props);
+ evas_object_del(props);
+ }
+ else
+ _app_view_clicked(obj, NULL, NULL);
+
+ return EINA_TRUE;
+}
+
+static void
+_app_view_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ Evas_Object *view_props, *close_btn, *resume_btn, *pause_btn;
+ const char *title, *icon;
+ int new_events, window;
+ unsigned short progress;
+ Elm_App_View_State state;
+ char buffer[1024];
+
+ view_props = elm_table_child_get(table, PROPS_VIEW_COL, 0);
+ if (view_props)
+ {
+ Elm_App_Client_View *old_view;
+
+ old_view = evas_object_data_del(view_props, "view");
+ eo_do(old_view,
+ eo_event_callback_del(ELM_APP_CLIENT_VIEW_EV_PROPERTY_CHANGED,
+ _app_view_prop_changed_cb, table));
+ elm_list_clear(view_props);
+ }
+ else
+ {
+ view_props = elm_list_add(table);
+ evas_object_size_hint_align_set(view_props, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_show(view_props);
+ elm_table_pack(table, view_props, PROPS_VIEW_COL, 0, 1, 1);
+ }
+
+ evas_object_data_set(view_props, "view", view);
+
+ eo_do(view, elm_app_client_view_title_get(&title),
+ elm_app_client_view_icon_get(&icon),
+ elm_app_client_view_progress_get(&progress),
+ elm_app_client_view_new_events_get(&new_events),
+ elm_app_client_view_window_get(&window),
+ eo_event_callback_add(ELM_APP_CLIENT_VIEW_EV_PROPERTY_CHANGED,
+ _app_view_prop_changed_cb, table));
+
+ snprintf(buffer, sizeof(buffer), "Title=%s", title);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "Icon=%s", icon);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "Progress=%d", progress);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "New events=%d", new_events);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "WindowID=%d", window);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ eo_do(view, elm_app_client_view_state_get(&state));
+ if (state == ELM_APP_VIEW_STATE_LIVE)
+ snprintf(buffer, sizeof(buffer), "State=alive");
+ else if (state == ELM_APP_VIEW_STATE_PAUSED)
+ snprintf(buffer, sizeof(buffer), "State=paused");
+ else if (state == ELM_APP_VIEW_STATE_CLOSED)
+ snprintf(buffer, sizeof(buffer), "State=closed");
+ else if (state == ELM_APP_VIEW_STATE_SHALLOW)
+ snprintf(buffer, sizeof(buffer), "State=shallow");
+ else
+ snprintf(buffer, sizeof(buffer), "State=unknown");
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ close_btn = elm_button_add(view_props);
+ elm_object_text_set(close_btn, "Close view");
+ evas_object_smart_callback_add(close_btn, "clicked", _btn_close_cb, view);
+ elm_list_item_append(view_props, NULL, close_btn, NULL, NULL, NULL);
+
+ pause_btn = elm_button_add(view_props);
+ elm_object_text_set(pause_btn, "Pause view");
+ evas_object_smart_callback_add(pause_btn, "clicked", _btn_pause_cb, view);
+ elm_list_item_append(view_props, NULL, pause_btn, NULL, NULL, NULL );
+
+ resume_btn = elm_button_add(view_props);
+ elm_object_text_set(resume_btn, "Resume view");
+ evas_object_smart_callback_add(resume_btn, "clicked", _btn_resume_cb, view);
+ elm_list_item_append(view_props, NULL, resume_btn, NULL, NULL, NULL );
+
+ elm_list_go(view_props);
+}
+
+static void
+_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void app_client_view_open_cb(void *data EINA_UNUSED, Elm_App_Client_View *view, const char *error, const char *error_message)
+{
+ Evas_Object *popup, *btn_ok;
+ char buf[1024];
+
+ popup = elm_popup_add(table);
+
+ if (view)
+ {
+ _app_view_clicked(view, NULL, NULL);
+ return;
+ }
+
+ snprintf(buf, sizeof(buf), "Some error happen opening view: %s %s", error, error_message);
+ elm_object_part_text_set(popup, "default", buf);
+
+ btn_ok = elm_button_add(popup);
+ elm_object_text_set(btn_ok, "Ok");
+ elm_object_part_content_set(popup, "button1", btn_ok);
+ evas_object_smart_callback_add(btn_ok, "clicked", _popup_close_cb, popup);
+
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP);
+ evas_object_show(popup);
+}
+
+static void _popup_btn_open_view_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup = data;
+ Eina_Value *args = NULL;//TODO fill with args of popup
+ Elm_App_Client *app = evas_object_data_get(popup, "app");
+
+ eo_do(app, elm_app_client_view_open(args, app_client_view_open_cb, NULL, NULL));
+
+ evas_object_del(popup);
+}
+
+static void
+_app_view_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client *app = data;
+ Evas_Object *popup, *btn_open, *btn_cancel, *args_box;
+
+ popup = elm_popup_add(table);
+ elm_object_part_text_set(popup, "title,text", "Open a view");
+
+ btn_open = elm_button_add(popup);
+ elm_object_text_set(btn_open, "Open");
+ elm_object_part_content_set(popup, "button1", btn_open);
+ evas_object_smart_callback_add(btn_open, "clicked", _popup_btn_open_view_cb, popup);
+ evas_object_show(btn_open);
+
+ btn_cancel = elm_button_add(popup);
+ elm_object_text_set(btn_cancel, "Cancel");
+ elm_object_part_content_set(popup, "button2", btn_cancel);
+ evas_object_smart_callback_add(btn_cancel, "clicked", _popup_close_cb, popup);
+ evas_object_show(btn_cancel);
+
+ args_box = elm_box_add(popup);
+ elm_object_part_content_set(popup, "default", args_box);
+ elm_object_part_text_set(popup, "default", "TODO: add some entrys to add some parameters to view.");
+
+ evas_object_data_set(popup, "app", app);
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP);
+ evas_object_show(popup);
+}
+
+static void _app_close_all_views_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client *app = data;
+ eo_do(app, elm_app_client_view_all_close());
+}
+
+static void
+_app_terminate_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client *app = data;
+ eo_do(app, elm_app_client_terminate());
+}
+
+static void
+_app_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *views, *btn_close_all, *btn_terminate, *btn_open_view;
+ Eina_Iterator *views_iter;
+ Elm_App_Client_View *client_view;
+ Elm_App_Client *app = data;
+
+ app_selected = app;
+
+ views = elm_table_child_get(table, VIEWS_COL, 0);
+ if (!views)
+ {
+ views = elm_list_add(table);
+ evas_object_size_hint_align_set(views, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(views);
+ elm_table_pack(table, views, VIEWS_COL, 0, 1, 1);
+ }
+ else
+ elm_list_clear(views);
+
+ btn_open_view = elm_button_add(views);
+ elm_object_text_set(btn_open_view, "Open a view");
+ evas_object_smart_callback_add(btn_open_view, "clicked", _app_view_open, app);
+ elm_list_item_append(views, NULL, btn_open_view, NULL, NULL, NULL);
+
+ eo_do(app, elm_app_client_views_get(&views_iter));
+ EINA_ITERATOR_FOREACH(views_iter, client_view)
+ {
+ const char *path;
+
+ eo_do(client_view, elm_app_client_view_path_get(&path));
+ elm_list_item_append(views, path, NULL, NULL, _app_view_clicked, client_view);
+ }
+ eina_iterator_free(views_iter);
+
+ btn_close_all = elm_button_add(views);
+ elm_object_text_set(btn_close_all, "Close all views");
+ evas_object_smart_callback_add(btn_close_all, "clicked", _app_close_all_views_cb, app);
+ elm_list_item_append(views, NULL, btn_close_all, NULL, NULL, NULL);
+
+ btn_terminate = elm_button_add(views);
+ elm_object_text_set(btn_terminate, "Terminate application");
+ evas_object_smart_callback_add(btn_terminate, "clicked", _app_terminate_cb, app);
+ elm_list_item_append(views, NULL, btn_terminate, NULL, NULL, NULL);
+
+ elm_list_go(views);
+}
+
+static Eina_Bool
+_view_list_update_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (app_selected == obj)
+ _app_clicked(obj, NULL, NULL);
+ return EINA_TRUE;
+}
+
+static void
+_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ Elm_App_Client *app;
+ EINA_LIST_FREE(apps_list, app)
+ eo_unref(app);
+}
+
+static void
+_app_open(const char *package)
+{
+ Elm_App_Client *app;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(apps_list, l, app)
+ {
+ const char *app_package;
+
+ eo_do(app, elm_app_client_package_get(&app_package));
+ if (!strcmp(package, app_package))
+ return;
+ }
+
+ app = eo_add_custom(ELM_APP_CLIENT_CLASS, NULL,
+ elm_app_client_constructor(package));
+ eo_do(app,
+ eo_event_callback_add(ELM_APP_CLIENT_EV_VIEW_LIST_LOADED,
+ _view_list_update_cb, table),
+ eo_event_callback_add(ELM_APP_CLIENT_EV_VIEW_CREATED,
+ _view_list_update_cb, table),
+ eo_event_callback_add(ELM_APP_CLIENT_EV_VIEW_DELETED,
+ _view_list_update_cb, table));
+ apps_list = eina_list_append(apps_list, app);
+}
+
+static void
+_btn_app_open_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *entry = data;
+ const char *pkg = elm_object_text_get(entry);
+
+ if (!pkg || !pkg[0])
+ return;
+
+ _app_open(pkg);
+ _apps_list_update();
+}
+
+static void
+_open_custom_app_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ elm_list_item_selected_set(event_info, EINA_FALSE);
+ elm_object_focus_set(data, EINA_TRUE);
+}
+
+static void
+_apps_list_update(void)
+{
+ Evas_Object *entry, *btn_open, *apps;
+ Elm_App_Client *app;
+ Eina_List *l;
+
+ apps = elm_table_child_get(table, APPS_COL, 0);
+ elm_list_clear(apps);
+
+ EINA_LIST_FOREACH(apps_list, l, app)
+ {
+ const char *app_package;
+ eo_do(app, elm_app_client_package_get(&app_package));
+ elm_list_item_append(apps, app_package, NULL, NULL, _app_clicked, app);
+ }
+
+ entry = elm_entry_add(apps);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5);
+
+ btn_open = elm_button_add(apps);
+ elm_object_text_set(btn_open, "Open");
+ evas_object_smart_callback_add(btn_open, "clicked", _btn_app_open_cb, entry);
+ elm_list_item_append(apps, NULL, entry, btn_open, _open_custom_app_cb, entry);
+
+ elm_list_go(apps);
+}
+
+void
+test_task_switcher(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *apps;
+
+ if (apps_list)
+ {
+ printf("Task switcher already open.\n");
+ return;
+ }
+
+ win = elm_win_util_standard_add("task switcher", "Task switcher");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ evas_object_smart_callback_add(win, "delete,request", _win_del, NULL);
+
+ table = elm_table_add(win);
+ elm_win_resize_object_add(win, table);
+ elm_table_padding_set(table, 0, 0);
+ elm_table_homogeneous_set(table, EINA_TRUE);
+ evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ _app_open("org.enlightenment.message");
+ _app_open("org.enlightenment.phone");
+
+ apps = elm_list_add(table);
+ evas_object_size_hint_align_set(apps, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(apps);
+ elm_table_pack(table, apps, APPS_COL, 0, 1, 1);
+ _apps_list_update();
+
+ evas_object_show(table);
+ evas_object_show(win);
+ evas_object_resize(win, 1024, 768);
+}
+#endif