From b7488971e4975b44d4db0f769e07b0346d97d59d Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Fri, 13 Mar 2020 13:18:31 +0900 Subject: [PATCH] add e_desk_group draft Change-Id: I2bf91bba2c7874b4434afdd0d97ce686c909168d --- src/bin/Makefile.mk | 2 + src/bin/e_client.c | 84 ++++++++++ src/bin/e_client.h | 15 ++ src/bin/e_config.c | 2 + src/bin/e_config.h | 1 + src/bin/e_desk.c | 179 +++++++++++++++++++++ src/bin/e_desk.h | 19 +++ src/bin/e_desk_group.c | 354 +++++++++++++++++++++++++++++++++++++++++ src/bin/e_desk_group.h | 83 ++++++++++ src/bin/e_includes.h | 1 + 10 files changed, 740 insertions(+) create mode 100644 src/bin/e_desk_group.c create mode 100644 src/bin/e_desk_group.h diff --git a/src/bin/Makefile.mk b/src/bin/Makefile.mk index ad636c0eba..a5a2b795db 100644 --- a/src/bin/Makefile.mk +++ b/src/bin/Makefile.mk @@ -38,6 +38,7 @@ src/bin/e_config_data.h \ src/bin/e_config.h \ src/bin/e_dbusmenu.h \ src/bin/e_desk.h \ +src/bin/e_desk_group.h \ src/bin/e_dialog.h \ src/bin/e_dnd.h \ src/bin/e_dpms.h \ @@ -161,6 +162,7 @@ src/bin/e_config.c \ src/bin/e_config_data.c \ src/bin/e_dbusmenu.c \ src/bin/e_desk.c \ +src/bin/e_desk_group.c \ src/bin/e_dialog.c \ src/bin/e_dpms.c \ src/bin/e_dnd.c \ diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 46e35dc114..b7cc9fda4b 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -1329,6 +1329,7 @@ _e_client_del(E_Client *ec) } ec->transform_core.result.enable = EINA_FALSE; + e_client_desk_group_set(ec, NULL); e_client_visibility_calculate(); } @@ -4480,6 +4481,16 @@ e_client_desk_set(E_Client *ec, E_Desk *desk) _e_client_hook_call(E_CLIENT_HOOK_DESK_SET, ec); evas_object_smart_callback_call(ec->frame, "desk_change", ec); + + if (ec->desk->desk_group.enable) + { + if (!ec->desk_group.desk_group) + { + E_Desk_Group *edg; + edg = e_desk_desk_group_base_get(ec->desk); + e_client_desk_group_set(ec, edg); + } + } } E_API Eina_Bool @@ -7800,10 +7811,71 @@ e_client_layer_set(E_Client *ec, return EINA_TRUE; } +EINTERN Eina_Bool +e_client_desk_group_layer_set(E_Client *ec, E_Desk_Group_Layer layer) +{ + E_OBJECT_CHECK_RETURN(ec, EINA_FALSE); + E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE); + + ec->desk_group.layer = layer; + return EINA_TRUE; +} + +EINTERN E_Desk_Group_Layer +e_client_desk_group_layer_get(E_Client *ec) +{ + E_OBJECT_CHECK_RETURN(ec, E_DESK_GROUP_LAYER_BACKGROUND); + + return ec->desk_group.layer; +} + +EINTERN Eina_Bool +e_client_desk_group_enable_set(E_Client *ec, Eina_Bool enable) +{ + E_OBJECT_CHECK_RETURN(ec, EINA_FALSE); + E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE); + + ec->desk_group.enable = enable; + + return EINA_TRUE; +} + +E_API Eina_Bool +e_client_desk_group_set(E_Client *ec, E_Desk_Group *edg) +{ + E_Desk_Group *old_edg; + + if (!ec) return EINA_FALSE; + + if (ec->desk_group.desk_group == edg) + return EINA_TRUE; + + old_edg = ec->desk_group.desk_group; + if (old_edg) + e_desk_group_ec_remove(old_edg, ec); + + ec->desk_group.desk_group = edg; + e_desk_group_ec_add(edg, ec); + + return EINA_TRUE; +} + E_API void e_client_raise(E_Client *ec) { if (!ec) return; + + if (ec->desk_group.enable) + { + E_Desk_Group *edg; + edg = ec->desk_group.desk_group; + if (edg) + { + e_desk_group_ec_raise(edg, ec); + return; + } + } + evas_object_raise(ec->frame); } @@ -7811,6 +7883,18 @@ E_API void e_client_lower(E_Client *ec) { if (!ec) return; + + if (ec->desk_group.enable) + { + E_Desk_Group *edg; + edg = ec->desk_group.desk_group; + if (edg) + { + e_desk_group_ec_lower(edg, ec); + return; + } + } + evas_object_lower(ec->frame); } diff --git a/src/bin/e_client.h b/src/bin/e_client.h index b3a07c4992..2ba8e71cca 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -998,6 +998,14 @@ struct E_Client } base_output_resolution; Eina_Bool hwc_visible_skip : 1; + + struct + { + Eina_Bool enable; + E_Desk_Group *desk_group; + int layer; + int layer_backup; + } desk_group; }; #define e_client_focus_policy_click(ec) \ @@ -1209,6 +1217,13 @@ EINTERN Eina_Bool e_client_pending_geometry_has(E_Client *ec); E_API void e_client_frame_focus_set(E_Client *ec, Eina_Bool focus); E_API Eina_Bool e_client_layer_set(E_Client *ec, E_Layer layer); + +EINTERN Eina_Bool e_client_desk_group_layer_set(E_Client *ec, E_Desk_Group_Layer layer); +EINTERN E_Desk_Group_Layer e_client_desk_group_layer_get(E_Client *ec); +EINTERN Eina_Bool e_client_desk_group_enable_set(E_Client *ec, Eina_Bool enable); + +E_API Eina_Bool e_client_desk_group_set(E_Client *ec, E_Desk_Group *edg); + E_API void e_client_raise(E_Client *ec); E_API void e_client_lower(E_Client *ec); diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 3892fe7819..9bd435bde4 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -303,6 +303,7 @@ _e_config_edd_init(Eina_Bool old) E_CONFIG_VAL(D, T, configured_output_resolution.h, INT); E_CONFIG_VAL(D, T, global_object_not_provide.launch_effect, UCHAR); E_CONFIG_VAL(D, T, use_thread_max_cpu, UCHAR); + E_CONFIG_VAL(D, T, use_desk_group, UCHAR); } static Eina_Bool @@ -539,6 +540,7 @@ e_config_load(void) E_CONFIG_LIMIT(e_config->configured_output_resolution.use, 0, 1); E_CONFIG_LIMIT(e_config->global_object_not_provide.launch_effect, 0, 1); E_CONFIG_LIMIT(e_config->use_thread_max_cpu, 0, 1); + E_CONFIG_LIMIT(e_config->use_desk_group, 0, 1); } E_API int diff --git a/src/bin/e_config.h b/src/bin/e_config.h index b955b257b4..e93fc09b15 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -253,6 +253,7 @@ struct _E_Config } global_object_not_provide; Eina_Bool use_thread_max_cpu; //set cpu count to ecore thread max + Eina_Bool use_desk_group; }; struct _E_Config_Desklock_Background diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index 70dbbe023f..f1f18272e2 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -177,6 +177,13 @@ e_desk_new(E_Zone *zone, int x, int y) if (!ok) desk->window_profile = eina_stringshare_ref(e_config->desktop_default_window_profile); + + if (e_config->use_desk_group) + { + // Add a base e_desk_group + desk->desk_group.base = e_desk_desk_group_add(desk, desk->geom.x, desk->geom.y, desk->geom.w, desk->geom.h, E_DESK_GROUP_LAYER_NORMAL); + } + return desk; } @@ -1199,6 +1206,21 @@ e_desk_client_zoom_apply(E_Desk *desk, E_Client *ec) static void _e_desk_free(E_Desk *desk) { + Eina_List *l; + E_Desk_Group *edg; + + if (e_config->use_desk_group) + { + EINA_LIST_FOREACH(desk->desk_group.list, l, edg) + { + e_desk_group_del(edg); + } + eina_list_free(desk->desk_group.list); + desk->desk_group.list = NULL; + desk->desk_group.base = NULL; + desk->desk_group.active = NULL; + } + E_FREE_FUNC(desk->smart_obj, evas_object_del); eina_stringshare_del(desk->name); desk->name = NULL; @@ -1563,3 +1585,160 @@ _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Eva e_comp_object_render(ec->frame); } } + +E_API E_Desk_Group * +e_desk_desk_group_add(E_Desk *desk, int x, int y, int w, int h, E_Desk_Group_Layer layer) +{ + E_Desk_Group *edg; + int id; + + if (!e_config->use_desk_group) return NULL; + + E_OBJECT_CHECK_RETURN(desk, NULL); + E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL); + + id = desk->desk_group.id; + + edg = e_desk_group_new(desk, id, x, y, w, h, layer); + if (!edg) + { + return NULL; + } + + desk->desk_group.list = eina_list_append(desk->desk_group.list, edg); + desk->desk_group.id++; + + return edg; +} + +E_API void +e_desk_desk_group_del(E_Desk *desk, E_Desk_Group *edg) +{ + E_OBJECT_CHECK(desk); + E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE); + + if (!e_config->use_desk_group) return; + + if (!edg) return; + + desk->desk_group.list = eina_list_remove(desk->desk_group.list, edg); +} + +E_API E_Desk_Group * +e_desk_desk_group_get_by_id(E_Desk *desk, int id) +{ + E_Desk_Group *edg = NULL; + Eina_List *l; + + E_OBJECT_CHECK_RETURN(desk, NULL); + E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL); + + EINA_LIST_FOREACH(desk->desk_group.list, l, edg) + { + if (edg->id == id) + break; + } + + return edg; +} + +E_API E_Desk_Group * +e_desk_desk_group_base_get(E_Desk *desk) +{ + E_OBJECT_CHECK_RETURN(desk, NULL); + E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL); + + if (!e_config->use_desk_group) return NULL; + + return desk->desk_group.base; +} + +E_API E_Desk_Group * +e_desk_desk_group_active_get(E_Desk *desk) +{ + E_OBJECT_CHECK_RETURN(desk, NULL); + E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL); + + if (!e_config->use_desk_group) return NULL; + + return desk->desk_group.active; +} + +static void +_e_desk_desk_group_check_ec_in_desk_group(E_Desk *desk) +{ + E_Client *ec; + + E_CLIENT_FOREACH(ec) + { + if (ec->desk != desk) continue; + if (e_object_is_del(E_OBJECT(ec))) continue; + if (ec->desk_group.desk_group) continue; + + e_client_desk_group_set(ec, desk->desk_group.base); + } +} + +E_API Eina_Bool +e_desk_desk_group_enable(E_Desk *desk) +{ + E_Desk_Group *edg = NULL; + Eina_List *l; + + if (!e_config->use_desk_group) return EINA_FALSE; + + E_OBJECT_CHECK_RETURN(desk, EINA_FALSE); + E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE); + + ELOGF("EDG", "Enable Desk_Group...", NULL); + if (desk->desk_group.enable) return EINA_TRUE; + desk->desk_group.enable = EINA_TRUE; + + // check all ec is included in desk group + _e_desk_desk_group_check_ec_in_desk_group(desk); + + EINA_LIST_FOREACH(desk->desk_group.list, l, edg) + { + e_desk_group_enable_set(edg, EINA_TRUE); + } + + return EINA_TRUE; +} + +E_API Eina_Bool +e_desk_desk_group_disable(E_Desk *desk) +{ + E_Desk_Group *edg = NULL; + Eina_List *l; + + if (!e_config->use_desk_group) return EINA_FALSE; + + E_OBJECT_CHECK_RETURN(desk, EINA_FALSE); + E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE); + + ELOGF("EDG", "Disable Desk_Group...", NULL); + if (!desk->desk_group.enable) return EINA_TRUE; + desk->desk_group.enable = EINA_FALSE; + + EINA_LIST_FOREACH(desk->desk_group.list, l, edg) + { + e_desk_group_enable_set(edg, EINA_FALSE); + } + + return EINA_TRUE; +} + +EINTERN void +e_desk_desk_group_info_print(E_Desk *desk) +{ + E_Desk_Group *edg = NULL; + Eina_List *l; + + E_OBJECT_CHECK(desk); + E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE); + + EINA_LIST_FOREACH(desk->desk_group.list, l, edg) + { + e_desk_group_info_print(edg); + } +} diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index f9a41f67fe..8dba59f658 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -48,6 +48,15 @@ struct _E_Desk unsigned int animate_count; Eina_List *handlers; + + struct + { + Eina_Bool enable; + int id; + Eina_List *list; + E_Desk_Group *base; + E_Desk_Group *active; + } desk_group; }; struct _E_Event_Desk @@ -108,6 +117,16 @@ E_API Eina_Bool e_desk_client_zoom_skip_unset(E_Desk *desk, E_Client *ec); EINTERN void e_desk_client_zoom_apply(E_Desk *desk, E_Client *ec); +E_API E_Desk_Group *e_desk_desk_group_add(E_Desk *desk, int x, int y, int w, int h, E_Desk_Group_Layer layer); +E_API void e_desk_desk_group_del(E_Desk *desk, E_Desk_Group *edg); +E_API E_Desk_Group *e_desk_desk_group_get_by_id(E_Desk *desk, int id); +E_API E_Desk_Group *e_desk_desk_group_base_get(E_Desk *desk); +E_API E_Desk_Group *e_desk_desk_group_active_get(E_Desk *desk); +E_API Eina_Bool e_desk_desk_group_enable(E_Desk *desk); +E_API Eina_Bool e_desk_desk_group_disable(E_Desk *desk); +EINTERN void e_desk_desk_group_info_print(E_Desk *desk); + + extern E_API int E_EVENT_DESK_SHOW; extern E_API int E_EVENT_DESK_BEFORE_SHOW; extern E_API int E_EVENT_DESK_AFTER_SHOW; diff --git a/src/bin/e_desk_group.c b/src/bin/e_desk_group.c new file mode 100644 index 0000000000..792fa34daf --- /dev/null +++ b/src/bin/e_desk_group.c @@ -0,0 +1,354 @@ +#include "e.h" + +EINTERN int +e_desk_group_init(void) +{ + return 1; +} + +EINTERN int +e_desk_group_shutdown(void) +{ + return 1; +} + +EINTERN E_Desk_Group * +e_desk_group_new(E_Desk *desk, int id, int x, int y, int w, int h, E_Desk_Group_Layer layer) +{ + E_Desk_Group *edg; + + E_OBJECT_CHECK_RETURN(desk, NULL); + E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL); + + edg = E_NEW(E_Desk_Group, 1); + if (!edg) return NULL; + + edg->desk = desk; + edg->id = id; + + edg->x = x; + edg->y = y; + edg->w = w; + edg->h = h; + + edg->layer = layer; + + return edg; +} + +EINTERN void +e_desk_group_del(E_Desk_Group *edg) +{ + if (!edg) return; + + for (int i=0; iec_lists[i]); + } + + E_FREE(edg); +} + +void _e_desk_group_enable(E_Desk_Group *edg) +{ + int i; + E_Client *ec; + Eina_List *l; + + for (i=0; iec_lists[i], l, ec) + { + e_client_desk_group_enable_set(ec, EINA_TRUE); + } + } + + e_desk_group_all_ec_update(edg); +} + +void _e_desk_group_disable(E_Desk_Group *edg) +{ + int i; + E_Client *ec; + Eina_List *l; + + for (i=0; iec_lists[i], l, ec) + { + e_client_desk_group_enable_set(ec, EINA_FALSE); + } + } +} + +EINTERN Eina_Bool +e_desk_group_enable_set(E_Desk_Group *edg, Eina_Bool enable) +{ + if (!edg) return EINA_FALSE; + + edg->enable = enable; + if (enable) + { + _e_desk_group_enable(edg); + } + else + { + _e_desk_group_disable(edg); + } + + return EINA_TRUE; +} + +E_API Eina_Bool +e_desk_group_geometry_set(E_Desk_Group *edg, int x, int y, int w, int h) +{ + if (!edg) return EINA_FALSE; + + edg->x = x; + edg->y = y; + edg->w = w; + edg->h = h; + + return EINA_TRUE; +} + +E_API Eina_Bool +e_desk_group_geometry_get(E_Desk_Group *edg, int *x, int *y, int *w, int *h) +{ + if (!edg) return EINA_FALSE; + + if (x) *x = edg->x; + if (y) *y = edg->y; + if (w) *w = edg->w; + if (h) *h = edg->h; + + return EINA_TRUE; +} + +EINTERN Eina_Bool +e_desk_group_layer_set(E_Desk_Group *edg, E_Desk_Group_Layer layer) +{ + if (!edg) return EINA_FALSE; + + edg->layer = layer; + return EINA_TRUE; +} + +E_API E_Desk_Group_Layer +e_desk_group_layer_get(E_Desk_Group *edg) +{ + if (!edg) return E_DESK_GROUP_LAYER_NORMAL; + + return edg->layer; +} + +E_API void +e_desk_group_activate(E_Desk_Group *edg) +{ + if (!edg) return; +} + +E_API Eina_Bool +e_desk_group_is_activate(E_Desk_Group *edg) +{ + if (!edg) return EINA_FALSE; + + return EINA_TRUE; +} + +E_API void +e_desk_group_raise(E_Desk_Group *edg) +{ + int i; + E_Client *ec; + Eina_List *l; + + if (!edg) return; + + for (i=0; iec_lists[i], l, ec) + { + evas_object_raise(ec->frame); + } + } +} + +E_API void +e_desk_group_lower(E_Desk_Group *edg) +{ + int i; + E_Client *ec; + Eina_List *l; + + if (!edg) return; + + for (i=E_DESK_GROUP_LAYER_COUNT-1; i>=0; i--) + { + EINA_LIST_FOREACH(edg->ec_lists[i], l, ec) + { + evas_object_lower(ec->frame); + } + } +} + +static unsigned int +_e_desk_group_layer_map(E_Desk_Group_Layer layer) +{ + switch (layer) + { + case E_DESK_GROUP_LAYER_BACKGROUND: return 0; + case E_DESK_GROUP_LAYER_NORMAL_BELOW: return 1; + case E_DESK_GROUP_LAYER_NORMAL: return 2; + case E_DESK_GROUP_LAYER_NORMAL_ABOVE: return 3; + case E_DESK_GROUP_LAYER_NOTIFICATION_LOW: return 4; + case E_DESK_GROUP_LAYER_NOTIFICATION_NORMAL: return 5; + case E_DESK_GROUP_LAYER_NOTIFICATION_HIGH: return 6; + case E_DESK_GROUP_LAYER_NOTIFICATION_TOP: return 7; + case E_DESK_GROUP_LAYER_SYSTEM: return 7; + default: return 1; + } +} + +static E_Desk_Group_Layer +_e_desk_group_layer_convert_from_elayer(E_Layer elayer) +{ + E_Desk_Group_Layer edg_layer; + + if (elayer < E_LAYER_CLIENT_BELOW) + edg_layer = E_DESK_GROUP_LAYER_BACKGROUND; + else if (elayer < E_LAYER_CLIENT_NORMAL) + edg_layer = E_DESK_GROUP_LAYER_NORMAL_BELOW; + else if (elayer < E_LAYER_CLIENT_ABOVE) + edg_layer = E_DESK_GROUP_LAYER_NORMAL; + else if (elayer < E_LAYER_CLIENT_NOTIFICATION_LOW) + edg_layer = E_DESK_GROUP_LAYER_NORMAL_ABOVE; + else if (elayer < E_LAYER_CLIENT_NOTIFICATION_NORMAL) + edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_LOW; + else if (elayer < E_LAYER_CLIENT_NOTIFICATION_HIGH) + edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_NORMAL; + else if (elayer < E_LAYER_CLIENT_NOTIFICATION_TOP) + edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_HIGH; + else if (elayer < E_LAYER_CLIENT_ALERT_LOW) + edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_TOP; + else + edg_layer = E_DESK_GROUP_LAYER_SYSTEM; + + return edg_layer; +} + +E_API Eina_Bool +e_desk_group_ec_add(E_Desk_Group *edg, E_Client *ec) +{ + int edg_layer; + int index; + + if (!edg) return EINA_FALSE; + if (!ec) return EINA_FALSE; + + edg_layer = _e_desk_group_layer_convert_from_elayer(ec->layer); + index = _e_desk_group_layer_map(edg_layer); + + edg->ec_lists[index] = eina_list_prepend(edg->ec_lists[index], ec); + + e_client_desk_group_layer_set(ec, edg_layer); + + return EINA_TRUE; +} + +E_API void +e_desk_group_ec_remove(E_Desk_Group *edg, E_Client *ec) +{ + int edg_layer; + int index; + + if (!edg) return; + if (!ec) return; + + edg_layer = e_client_desk_group_layer_get(ec); + index = _e_desk_group_layer_map(edg_layer); + + edg->ec_lists[index] = eina_list_remove(edg->ec_lists[index], ec); +} + +EINTERN void +e_desk_group_ec_raise(E_Desk_Group *edg, E_Client *ec) +{ + if (!edg) return; + if (!ec) return; + + evas_object_raise(ec->frame); + + // update edg's ec_list order +} + +EINTERN void +e_desk_group_ec_lower(E_Desk_Group *edg, E_Client *ec) +{ + if (!edg) return; + if (!ec) return; + + evas_object_lower(ec->frame); + + // update edg's ec_list order +} + +E_API void +e_desk_group_ec_update(E_Desk_Group *edg, E_Client *ec) +{ + if (!edg) return; + if (!ec) return; + + e_client_pos_set(ec, edg->x, edg->y); + e_client_size_set(ec, edg->w, edg->h); + ec->changes.pos = 1; +} + +E_API void +e_desk_group_all_ec_update(E_Desk_Group *edg) +{ + int i; + E_Client *ec; + Eina_List *l; + + if (!edg) return; + + for (i=0; iec_lists[i], l, ec) + { + e_desk_group_ec_update(edg, ec); + } + } +} + +E_API Eina_List * +e_desk_group_ec_list_get(E_Desk_Group *edg) +{ + if (!edg) return NULL; + + return NULL; +} + + +// for debug +EINTERN void +e_desk_group_info_print(E_Desk_Group *edg) +{ + Eina_List *l; + E_Client *ec; + + if (!edg) return; + + ELOGF("EDG_INFO", "===========================================", NULL); + ELOGF("EDG_INFO", "E_Desk_Group(%p), ID(%d), Geo(%d,%d,%d,%d), Layer:%d", NULL, edg, edg->id, edg->x, edg->y, edg->w, edg->h, edg->layer); + ELOGF("EDG_INFO", "-------------------------------------------", NULL); + for (int i=E_DESK_GROUP_LAYER_COUNT-1; i>=0; i--) + { + EINA_LIST_FOREACH(edg->ec_lists[i], l, ec) + { + ELOGF("EDG_INFO", "EDG_Layer[%d] EC(win:%x, ec:%p), ec->layer:%d, org_layer:%d", NULL, i, e_client_util_win_get(ec), ec, ec->layer, ec->desk_group.layer_backup); + } + } + ELOGF("EDG_INFO", "===========================================", NULL); +} diff --git a/src/bin/e_desk_group.h b/src/bin/e_desk_group.h new file mode 100644 index 0000000000..1abfd5487f --- /dev/null +++ b/src/bin/e_desk_group.h @@ -0,0 +1,83 @@ +#ifdef E_TYPEDEFS + +typedef struct _E_Desk_Group E_Desk_Group; +typedef struct _E_Event_Desk_Group E_Event_Desk_Group; + +typedef enum _E_Desk_Group_Layer +{ + E_DESK_GROUP_LAYER_BACKGROUND = 0, + E_DESK_GROUP_LAYER_NORMAL_BELOW = 150, + E_DESK_GROUP_LAYER_NORMAL = 200, + E_DESK_GROUP_LAYER_NORMAL_ABOVE = 250, + E_DESK_GROUP_LAYER_NOTIFICATION_LOW = 650, + E_DESK_GROUP_LAYER_NOTIFICATION_NORMAL = 700, + E_DESK_GROUP_LAYER_NOTIFICATION_HIGH = 750, + E_DESK_GROUP_LAYER_NOTIFICATION_TOP = 800, + E_DESK_GROUP_LAYER_SYSTEM = 990, +} E_Desk_Group_Layer; + +# define E_DESK_GROUP_LAYER_COUNT 9 + +#else +#ifndef E_DESK_GROUP_H +#define E_DESK_GROUP_H + +struct _E_Desk_Group +{ + E_Object e_obj_inherit; + + E_Desk *desk; + int id; + E_Desk_Group_Layer layer; + Eina_Stringshare *name; + + int x, y, w, h; + + unsigned char enable : 1; + unsigned char visible : 1; + Eina_List *ec_lists[E_DESK_GROUP_LAYER_COUNT]; + + Eina_List *handlers; +}; + +struct _E_Event_Desk_Group +{ + E_Desk_Group *edg; +}; + +EINTERN int e_desk_group_init(void); +EINTERN int e_desk_group_shutdown(void); + +EINTERN E_Desk_Group *e_desk_group_new(E_Desk *desk, int id, int x, int y, int w, int h, E_Desk_Group_Layer layer); +EINTERN void e_desk_group_del(E_Desk_Group *edg); + +EINTERN Eina_Bool e_desk_group_enable_set(E_Desk_Group *edg, Eina_Bool enable); + +E_API Eina_Bool e_desk_group_geometry_set(E_Desk_Group *edg, int x, int y, int w, int h); +E_API Eina_Bool e_desk_group_geometry_get(E_Desk_Group *edg, int *x, int *y, int *w, int *h); + +EINTERN Eina_Bool e_desk_group_layer_set(E_Desk_Group *edg, E_Desk_Group_Layer layer); +E_API E_Desk_Group_Layer e_desk_group_layer_get(E_Desk_Group *edg); + +E_API void e_desk_group_activate(E_Desk_Group *edg); +E_API Eina_Bool e_desk_group_is_activate(E_Desk_Group *edg); + +E_API void e_desk_group_raise(E_Desk_Group *edg); +E_API void e_desk_group_lower(E_Desk_Group *edg); + + +E_API Eina_Bool e_desk_group_ec_add(E_Desk_Group *edg, E_Client *ec); +E_API void e_desk_group_ec_remove(E_Desk_Group *edg, E_Client *ec); +EINTERN void e_desk_group_ec_raise(E_Desk_Group *edg, E_Client *ec); +EINTERN void e_desk_group_ec_lower(E_Desk_Group *edg, E_Client *ec); + + +E_API void e_desk_group_ec_update(E_Desk_Group *edg, E_Client *ec); +E_API void e_desk_group_all_ec_update(E_Desk_Group *edg); + +E_API Eina_List *e_desk_group_ec_list_get(E_Desk_Group *edg); + +// for debug +EINTERN void e_desk_group_info_print(E_Desk_Group *edg); +#endif +#endif diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 3e4cbc6984..e96903997f 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -4,6 +4,7 @@ #include "e_error.h" #include "e_zone.h" #include "e_desk.h" +#include "e_desk_group.h" #include "e_pixmap.h" #include "e_comp_object.h" #include "e_util_transform.h" -- 2.34.1