#include "e.h" static void _e_resize_begin(void *data, E_Client *ec); static void _e_resize_update(void *data, E_Client *ec); static void _e_resize_end(void *data, E_Client *ec); static void _e_move_begin(void *data, E_Client *ec); static void _e_move_update(void *data, E_Client *ec); static void _e_move_end(void *data, E_Client *ec); static Evas_Object *_disp_obj = NULL; static Evas_Object *_disp_content = NULL; static Eina_List *hooks = NULL; static Eina_Bool _e_moveresize_enabled = EINA_TRUE; EINTERN int e_moveresize_init(void) { E_Client_Hook *h; h = e_client_hook_add(E_CLIENT_HOOK_RESIZE_BEGIN, _e_resize_begin, NULL); if (h) hooks = eina_list_append(hooks, h); h = e_client_hook_add(E_CLIENT_HOOK_RESIZE_UPDATE, _e_resize_update, NULL); if (h) hooks = eina_list_append(hooks, h); h = e_client_hook_add(E_CLIENT_HOOK_RESIZE_END, _e_resize_end, NULL); if (h) hooks = eina_list_append(hooks, h); h = e_client_hook_add(E_CLIENT_HOOK_MOVE_BEGIN, _e_move_begin, NULL); if (h) hooks = eina_list_append(hooks, h); h = e_client_hook_add(E_CLIENT_HOOK_MOVE_UPDATE, _e_move_update, NULL); if (h) hooks = eina_list_append(hooks, h); h = e_client_hook_add(E_CLIENT_HOOK_MOVE_END, _e_move_end, NULL); if (h) hooks = eina_list_append(hooks, h); return 1; } EINTERN int e_moveresize_shutdown(void) { E_Client_Hook *h; EINA_LIST_FREE(hooks, h) e_client_hook_del(h); _e_moveresize_enabled = EINA_TRUE; return 1; } EAPI void e_moveresize_replace(Eina_Bool enable) { _e_moveresize_enabled = !enable; } EAPI void e_moveresize_client_extents(const E_Client *ec, int *w, int *h) { if ((ec->icccm.base_w >= 0) && (ec->icccm.base_h >= 0)) { if (ec->icccm.step_w > 0) *w = (ec->client.w - ec->icccm.base_w) / ec->icccm.step_w; else *w = ec->client.w; if (ec->icccm.step_h > 0) *h = (ec->client.h - ec->icccm.base_h) / ec->icccm.step_h; else *h = ec->client.h; } else { if (ec->icccm.step_w > 0) *w = (ec->client.w - ec->icccm.min_w) / ec->icccm.step_w; else *w = ec->client.w; if (ec->icccm.step_h > 0) *h = (ec->client.h - ec->icccm.min_h) / ec->icccm.step_h; else *h = ec->client.h; } } static void _e_resize_begin(void *data __UNUSED__, E_Client *ec) { Evas_Object *o; Evas_Coord ew, eh; char buf[40]; int w, h; if (_disp_obj) evas_object_hide(_disp_obj); E_FREE_FUNC(_disp_obj, evas_object_del); if ((!e_config->resize_info_visible) || (!_e_moveresize_enabled)) return; e_moveresize_client_extents(ec, &w, &h); _disp_content = o = edje_object_add(e_comp->evas); evas_object_name_set(o, "resizeinfo->_disp_content"); e_theme_edje_object_set(o, "base/theme/borders", "e/widgets/border/default/resize"); snprintf(buf, sizeof(buf), "9999x9999"); edje_object_part_text_set(o, "e.text.label", buf); edje_object_size_min_calc(o, &ew, &eh); snprintf(buf, sizeof(buf), _("%i×%i"), w, h); edje_object_part_text_set(o, "e.text.label", buf); _disp_obj = e_comp_object_util_add(o, E_COMP_OBJECT_TYPE_POPUP); evas_object_name_set(o, "resizeinfo->_disp_obj"); evas_object_layer_set(_disp_obj, E_LAYER_POPUP); evas_object_pass_events_set(_disp_obj, 1); evas_object_resize(_disp_obj, ew, eh); if (e_config->resize_info_follows) e_comp_object_util_center_on(_disp_obj, ec->frame); else e_comp_object_util_center(_disp_obj); evas_object_show(_disp_obj); } static void _e_resize_end(void *data __UNUSED__, E_Client *ec __UNUSED__) { if (e_config->resize_info_visible) { if (_disp_obj) { evas_object_hide(_disp_obj); evas_object_del(_disp_obj); _disp_obj = NULL; _disp_content = NULL; } } } static void _e_resize_update(void *data __UNUSED__, E_Client *ec) { char buf[40]; int w, h; if (!_disp_obj) return; if (e_config->resize_info_follows) e_comp_object_util_center_on(_disp_obj, ec->frame); e_moveresize_client_extents(ec, &w, &h); snprintf(buf, sizeof(buf), _("%i×%i"), w, h); edje_object_part_text_set(_disp_content, "e.text.label", buf); } static void _e_move_begin(void *data __UNUSED__, E_Client *ec) { Evas_Object *o; Evas_Coord ew, eh; char buf[40]; if (_disp_obj) { evas_object_hide(_disp_obj); evas_object_del(_disp_obj); } _disp_obj = NULL; if ((!e_config->move_info_visible) || (!_e_moveresize_enabled)) return; _disp_content = o = edje_object_add(e_comp->evas); evas_object_name_set(o, "moveinfo->_disp_content"); e_theme_edje_object_set(o, "base/theme/borders", "e/widgets/border/default/move"); snprintf(buf, sizeof(buf), "9999 9999"); edje_object_part_text_set(o, "e.text.label", buf); edje_object_size_min_calc(o, &ew, &eh); snprintf(buf, sizeof(buf), "%i %i", ec->x, ec->y); edje_object_part_text_set(o, "e.text.label", buf); _disp_obj = e_comp_object_util_add(o, E_COMP_OBJECT_TYPE_POPUP); evas_object_name_set(o, "moveinfo->_disp_obj"); evas_object_layer_set(_disp_obj, E_LAYER_POPUP); evas_object_pass_events_set(_disp_obj, 1); evas_object_resize(_disp_obj, ew, eh); if (e_config->move_info_follows) e_comp_object_util_center_on(_disp_obj, ec->frame); else e_comp_object_util_center(_disp_obj); evas_object_show(_disp_obj); } static void _e_move_end(void *data __UNUSED__, E_Client *ec __UNUSED__) { if (e_config->move_info_visible) { if (_disp_obj) { evas_object_hide(_disp_obj); E_FREE_FUNC(_disp_obj, evas_object_del); _disp_content = NULL; } } } static void _e_move_update(void *data __UNUSED__, E_Client *ec) { char buf[40]; if (!_disp_obj) return; if (e_config->move_info_follows) e_comp_object_util_center_on(_disp_obj, ec->frame); snprintf(buf, sizeof(buf), "%i %i", ec->x, ec->y); edje_object_part_text_set(_disp_content, "e.text.label", buf); }