You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
6.0 KiB
227 lines
6.0 KiB
#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_resize_client_extents(E_Client *ec, int *w, int *h); |
|
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 int visible = 0; |
|
|
|
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); |
|
|
|
return 1; |
|
} |
|
|
|
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) |
|
return; |
|
|
|
_e_resize_client_extents(ec, &w, &h); |
|
|
|
_disp_content = o = edje_object_add(e_comp_get(ec)->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); |
|
} |
|
|
|
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; |
|
} |
|
} |
|
|
|
visible = 0; |
|
} |
|
|
|
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_resize_client_extents(ec, &w, &h); |
|
|
|
if (!visible) |
|
{ |
|
evas_object_show(_disp_obj); |
|
visible = 1; |
|
} |
|
snprintf(buf, sizeof(buf), _("%i×%i"), w, h); |
|
edje_object_part_text_set(_disp_content, "e.text.label", buf); |
|
} |
|
|
|
static void |
|
_e_resize_client_extents(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_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) |
|
return; |
|
|
|
_disp_content = o = edje_object_add(e_comp_get(ec)->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); |
|
} |
|
|
|
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; |
|
} |
|
} |
|
|
|
visible = 0; |
|
} |
|
|
|
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); |
|
|
|
if (!visible) |
|
{ |
|
evas_object_show(_disp_obj); |
|
visible = 1; |
|
} |
|
snprintf(buf, sizeof(buf), "%i %i", ec->x, ec->y); |
|
edje_object_part_text_set(_disp_content, "e.text.label", buf); |
|
}
|
|
|