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.
 
 
 

4113 lines
131 KiB

#include "e.h"
#define INITS
#define ACT_GO(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.go = _e_actions_act_##name##_go; \
}
#define ACT_FN_GO(act, use) \
static void _e_actions_act_##act##_go(E_Object * obj EINA_UNUSED, const char *params use)
#define ACT_GO_MOUSE(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.go_mouse = _e_actions_act_##name##_go_mouse; \
}
#define ACT_FN_GO_MOUSE(act, use) \
static Eina_Bool _e_actions_act_##act##_go_mouse(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
#define ACT_GO_WHEEL(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.go_wheel = _e_actions_act_##name##_go_wheel; \
}
#define ACT_FN_GO_WHEEL(act, use) \
static Eina_Bool _e_actions_act_##act##_go_wheel(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Wheel * ev EINA_UNUSED)
#define ACT_GO_EDGE(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.go_edge = _e_actions_act_##name##_go_edge; \
}
#define ACT_FN_GO_EDGE(act, use) \
static void _e_actions_act_##act##_go_edge(E_Object * obj EINA_UNUSED, const char *params use, E_Event_Zone_Edge * ev EINA_UNUSED)
#define ACT_GO_SIGNAL(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.go_signal = _e_actions_act_##name##_go_signal; \
}
#define ACT_FN_GO_SIGNAL(act, use) \
static void _e_actions_act_##act##_go_signal(E_Object * obj EINA_UNUSED, const char *params use, const char *sig, const char *src)
#define ACT_GO_KEY(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.go_key = _e_actions_act_##name##_go_key; \
}
#define ACT_FN_GO_KEY(act, use1, use2) \
static void _e_actions_act_##act##_go_key(E_Object * obj EINA_UNUSED, const char *params use1, Ecore_Event_Key * ev use2)
#define ACT_END(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.end = _e_actions_act_##name##_end; \
}
#define ACT_FN_END(act, use) \
static void _e_actions_act_##act##_end(E_Object * obj EINA_UNUSED, const char *params use)
#define ACT_END_MOUSE(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.end_mouse = _e_actions_act_##name##_end_mouse; \
}
#define ACT_FN_END_MOUSE(act, use) \
static Eina_Bool _e_actions_act_##act##_end_mouse(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
#define ACT_END_KEY(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.end_key = _e_actions_act_##name##_end_key; \
}
#define ACT_FN_END_KEY(act, use) \
static void _e_actions_act_##act##_end_key(E_Object * obj EINA_UNUSED, const char *params use, Ecore_Event_Key * ev EINA_UNUSED)
#define ACT_GO_ACPI(name) \
{ \
act = e_action_add(#name); \
if (act) act->func.go_acpi = _e_actions_act_##name##_go_acpi; \
}
#define ACT_FN_GO_ACPI(act, use) \
static void _e_actions_act_##act##_go_acpi(E_Object * obj EINA_UNUSED, const char *params use, E_Event_Acpi * ev EINA_UNUSED)
/* local functions forward declarations (window_jump_to needs the definition of exec) */
ACT_FN_GO(exec, );
/* local subsystem functions */
static void _e_action_free(E_Action *act);
static E_Maximize _e_actions_maximize_parse(const char *maximize);
static int _action_groups_sort_cb(const void *d1, const void *d2);
/* to save writing this in N places - the sections are defined here */
/***************************************************************************/
ACT_FN_GO(window_move, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
if (!((E_Client *)(void *)obj)->lock_user_location)
e_client_act_move_begin((E_Client *)(void *)obj, NULL);
}
ACT_FN_GO_MOUSE(window_move, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
e_client_act_move_begin((E_Client *)(void *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_SIGNAL(window_move, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
if (!((E_Client *)(void *)obj)->lock_user_location)
{
if ((params) && (!strcmp(params, "end")))
e_client_signal_move_end((E_Client *)(void *)obj, sig, src);
else
{
if (!((E_Client *)(void *)obj)->moving)
e_client_signal_move_begin((E_Client *)(void *)obj, sig, src);
}
}
}
ACT_FN_END(window_move, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
e_client_act_move_end((E_Client *)(void *)obj, NULL);
}
ACT_FN_END_MOUSE(window_move, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
e_client_act_move_end((E_Client *)(void *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_KEY(window_move, EINA_UNUSED, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_location)
e_client_act_move_keyboard((E_Client *)(void *)obj);
}
/***************************************************************************/
ACT_FN_GO(window_resize, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_size)
e_client_act_resize_begin((E_Client *)(void *)obj, NULL);
}
ACT_FN_GO_MOUSE(window_resize, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
if (!((E_Client *)(void *)obj)->lock_user_size)
e_client_act_resize_begin((E_Client *)(void *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_SIGNAL(window_resize, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
if (!((E_Client *)(void *)obj)->lock_user_size)
{
if ((params) && (!strcmp(params, "end")))
e_client_signal_resize_end((E_Client *)(void *)obj, params, sig, src);
else
{
if (!params) params = "";
if (e_client_util_resizing_get((E_Client *)(void *)obj))
e_client_signal_resize_end((E_Client *)(void *)obj, params, sig, src);
else
e_client_signal_resize_begin((E_Client *)(void *)obj, params, sig, src);
}
}
}
ACT_FN_END(window_resize, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
e_client_act_resize_end((E_Client *)(void *)obj, NULL);
}
ACT_FN_END_MOUSE(window_resize, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
e_client_act_resize_end((E_Client *)(void *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_KEY(window_resize, EINA_UNUSED, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE)
{
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
}
if (!((E_Client *)(void *)obj)->lock_user_size)
e_client_act_resize_keyboard((E_Client *)(void *)obj);
}
/***************************************************************************/
ACT_FN_GO(window_menu, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
e_client_act_menu_begin((E_Client *)(void *)obj, NULL, 0);
}
ACT_FN_GO_MOUSE(window_menu, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE)
{
obj = E_OBJECT(e_client_focused_get());
if (!obj) return EINA_FALSE;
}
e_client_act_menu_begin((E_Client *)(void *)obj, ev, 0);
return EINA_TRUE;
}
ACT_FN_GO_KEY(window_menu, EINA_UNUSED, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE)
{
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
}
e_client_act_menu_begin((E_Client *)(void *)obj, NULL, 1);
}
/***************************************************************************/
ACT_FN_GO(window_raise, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_stacking)
evas_object_raise(((E_Client *)(void *)obj)->frame);
}
/***************************************************************************/
ACT_FN_GO(window_lower, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_stacking)
evas_object_lower(((E_Client *)(void *)obj)->frame);
}
/***************************************************************************/
ACT_FN_GO(window_close, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_close)
e_client_act_close_begin((E_Client *)(void *)obj);
}
/***************************************************************************/
static E_Dialog *kill_dialog = NULL;
static void
_e_actions_cb_kill_dialog_ok(void *data, E_Dialog *dia)
{
E_Object *obj;
obj = data;
if (dia)
{
e_object_del(E_OBJECT(kill_dialog));
kill_dialog = NULL;
}
if ((!((E_Client *)(void *)obj)->lock_close) && (!((E_Client *)(void *)obj)->internal))
e_client_act_kill_begin((E_Client *)(void *)obj);
}
static void
_e_actions_cb_kill_dialog_cancel(void *data EINA_UNUSED, E_Dialog *dia EINA_UNUSED)
{
e_object_del(E_OBJECT(kill_dialog));
kill_dialog = NULL;
}
static void
_e_actions_cb_kill_dialog_delete(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
_e_actions_cb_kill_dialog_cancel(NULL, data);
}
ACT_FN_GO(window_kill, EINA_UNUSED)
{
E_Client *ec;
char dialog_text[1024];
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
if ((ec->lock_close) || (ec->internal)) return;
if (kill_dialog) e_object_del(E_OBJECT(kill_dialog));
if (e_config->cnfmdlg_disabled)
{
_e_actions_cb_kill_dialog_ok(obj, NULL);
return;
}
snprintf(dialog_text, sizeof(dialog_text),
_("You are about to kill %s.<ps/><ps/>"
"Please keep in mind that all data from this window<ps/>"
"which has not yet been saved will be lost!<ps/><ps/>"
"Are you sure you want to kill this window?"),
ec->icccm.name);
kill_dialog = e_dialog_new(NULL,
"E", "_kill_dialog");
if (!kill_dialog) return;
evas_object_event_callback_add(kill_dialog->win, EVAS_CALLBACK_DEL,
_e_actions_cb_kill_dialog_delete, kill_dialog);
e_dialog_title_set(kill_dialog,
_("Are you sure you want to kill this window?"));
e_dialog_text_set(kill_dialog, _(dialog_text));
e_dialog_icon_set(kill_dialog, "application-exit", 64);
e_dialog_button_add(kill_dialog, _("Kill"), NULL,
_e_actions_cb_kill_dialog_ok, obj);
e_dialog_button_add(kill_dialog, _("No"), NULL,
_e_actions_cb_kill_dialog_cancel, NULL);
e_dialog_button_focus_num(kill_dialog, 1);
elm_win_center(kill_dialog->win, 1, 1);
e_dialog_show(kill_dialog);
}
/***************************************************************************/
ACT_FN_GO(window_sticky_toggle, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_sticky)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (ec->sticky) e_client_unstick(ec);
else e_client_stick(ec);
}
}
/***************************************************************************/
ACT_FN_GO(window_sticky, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_sticky)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (params)
{
if (atoi(params) == 1)
e_client_stick(ec);
else if (atoi(params) == 0)
e_client_unstick(ec);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_iconic_toggle, EINA_UNUSED)
{
E_Client *ec;
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
if ((!ec->lock_user_iconify) && (!ec->fullscreen) &&
((ec->netwm.type == E_WINDOW_TYPE_NORMAL) ||
(ec->netwm.type == E_WINDOW_TYPE_UNKNOWN)))
{
if (ec->iconic) e_client_uniconify(ec);
else e_client_iconify(ec);
}
}
/***************************************************************************/
ACT_FN_GO(window_iconic, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_iconify)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (params)
{
if (atoi(params) == 1)
e_client_iconify(ec);
else if (atoi(params) == 0)
e_client_uniconify(ec);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_fullscreen_toggle, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_fullscreen)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (ec->fullscreen)
e_client_unfullscreen(ec);
else if (!params || *params == '\0')
e_client_fullscreen(ec, e_config->fullscreen_policy);
else if (!strcmp(params, "resize"))
e_client_fullscreen(ec, E_FULLSCREEN_RESIZE);
else if (!strcmp(params, "zoom"))
e_client_fullscreen(ec, E_FULLSCREEN_ZOOM);
}
}
/***************************************************************************/
ACT_FN_GO(window_fullscreen, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_fullscreen)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (params)
{
int v;
char buf[32];
buf[0] = 0;
if (sscanf(params, "%i %20s", &v, buf) == 2)
{
if (v == 1)
{
if (*buf == '\0')
e_client_fullscreen(ec, e_config->fullscreen_policy);
else if (!strcmp(buf, "resize"))
e_client_fullscreen(ec, E_FULLSCREEN_RESIZE);
else if (!strcmp(buf, "zoom"))
e_client_fullscreen(ec, E_FULLSCREEN_ZOOM);
}
else if (v == 0)
e_client_unfullscreen(ec);
}
}
}
}
/***************************************************************************/
ACT_FN_GO(window_maximized_toggle, )
{
E_Client *ec;
Eina_Bool resize = EINA_FALSE;
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
/* internal dialog which is resizable */
if (ec->internal && (ec->netwm.type == E_WINDOW_TYPE_DIALOG))
resize = (ec->icccm.max_w != ec->icccm.min_w);
if ((!ec->lock_user_maximize) && (!ec->fullscreen) &&
(resize || (ec->netwm.type == E_WINDOW_TYPE_NORMAL) ||
(ec->netwm.type == E_WINDOW_TYPE_UNKNOWN)))
{
if ((ec->maximized & E_MAXIMIZE_TYPE) != E_MAXIMIZE_NONE)
{
if (!params)
e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
else
{
E_Maximize max;
max = _e_actions_maximize_parse(params);
max &= E_MAXIMIZE_DIRECTION;
if (max == E_MAXIMIZE_VERTICAL)
{
if (ec->maximized & E_MAXIMIZE_VERTICAL)
e_client_unmaximize(ec, E_MAXIMIZE_VERTICAL);
else
goto maximize;
}
else if (max == E_MAXIMIZE_HORIZONTAL)
{
if (ec->maximized & E_MAXIMIZE_HORIZONTAL)
e_client_unmaximize(ec, E_MAXIMIZE_HORIZONTAL);
else
goto maximize;
}
else if (max == E_MAXIMIZE_LEFT)
{
if (ec->maximized & E_MAXIMIZE_LEFT)
e_client_unmaximize(ec, E_MAXIMIZE_LEFT);
else
goto maximize;
}
else if (max == E_MAXIMIZE_RIGHT)
{
if (ec->maximized & E_MAXIMIZE_RIGHT)
e_client_unmaximize(ec, E_MAXIMIZE_RIGHT);
else
goto maximize;
}
else
e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
}
}
else
{
maximize:
e_client_maximize(ec, _e_actions_maximize_parse(params));
}
}
}
/***************************************************************************/
ACT_FN_GO(window_maximized, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_maximize)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (params)
{
E_Maximize max;
int v, ret;
char s1[32], s2[32];
max = (e_config->maximize_policy & E_MAXIMIZE_DIRECTION);
ret = sscanf(params, "%i %20s %20s", &v, s1, s2);
if (ret == 3)
{
if (!strcmp(s2, "horizontal"))
max = E_MAXIMIZE_HORIZONTAL;
else if (!strcmp(s2, "vertical"))
max = E_MAXIMIZE_VERTICAL;
else if (!strcmp(s2, "left"))
max = E_MAXIMIZE_LEFT;
else if (!strcmp(s2, "right"))
max = E_MAXIMIZE_RIGHT;
else
max = E_MAXIMIZE_BOTH;
}
if (ret > 1)
{
if (v == 1)
{
if (!strcmp(s1, "fullscreen"))
e_client_maximize(ec, E_MAXIMIZE_FULLSCREEN | max);
else if (!strcmp(s1, "smart"))
e_client_maximize(ec, E_MAXIMIZE_SMART | max);
else if (!strcmp(s1, "expand"))
e_client_maximize(ec, E_MAXIMIZE_EXPAND | max);
else if (!strcmp(s1, "fill"))
e_client_maximize(ec, E_MAXIMIZE_FILL | max);
else
e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | max);
}
else if (v == 0)
e_client_unmaximize(ec, max);
}
}
}
}
/***************************************************************************/
ACT_FN_GO(window_shaded_toggle, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_shade)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (ec->shaded)
{
if (!params)
e_client_unshade(ec, E_DIRECTION_UP);
else
{
if (!strcmp(params, "up"))
e_client_unshade(ec, E_DIRECTION_UP);
else if (!strcmp(params, "down"))
e_client_unshade(ec, E_DIRECTION_DOWN);
else if (!strcmp(params, "left"))
e_client_unshade(ec, E_DIRECTION_LEFT);
else if (!strcmp(params, "right"))
e_client_unshade(ec, E_DIRECTION_RIGHT);
else
e_client_unshade(ec, E_DIRECTION_UP);
}
}
else
{
if (!params)
e_client_shade(ec, E_DIRECTION_UP);
else
{
if (!strcmp(params, "up"))
e_client_shade(ec, E_DIRECTION_UP);
else if (!strcmp(params, "down"))
e_client_shade(ec, E_DIRECTION_DOWN);
else if (!strcmp(params, "left"))
e_client_shade(ec, E_DIRECTION_LEFT);
else if (!strcmp(params, "right"))
e_client_shade(ec, E_DIRECTION_RIGHT);
else
e_client_shade(ec, E_DIRECTION_UP);
}
}
}
}
/***************************************************************************/
ACT_FN_GO(window_shaded, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_user_shade)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (!e_comp_object_frame_allowed(ec->frame)) return;
if (params)
{
int v;
char buf[32];
if (sscanf(params, "%i %20s", &v, buf) == 2)
{
if (v == 1)
{
if (!strcmp(buf, "up"))
e_client_shade(ec, E_DIRECTION_UP);
else if (!strcmp(buf, "down"))
e_client_shade(ec, E_DIRECTION_DOWN);
else if (!strcmp(buf, "left"))
e_client_shade(ec, E_DIRECTION_LEFT);
else if (!strcmp(buf, "right"))
e_client_shade(ec, E_DIRECTION_RIGHT);
}
else if (v == 0)
{
if (!strcmp(buf, "up"))
e_client_unshade(ec, E_DIRECTION_UP);
else if (!strcmp(buf, "down"))
e_client_unshade(ec, E_DIRECTION_DOWN);
else if (!strcmp(buf, "left"))
e_client_unshade(ec, E_DIRECTION_LEFT);
else if (!strcmp(buf, "right"))
e_client_unshade(ec, E_DIRECTION_RIGHT);
}
}
}
}
}
/***************************************************************************/
ACT_FN_GO(window_borderless_toggle, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_border)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (!e_comp_object_frame_allowed(ec->frame)) return;
ec->borderless = !ec->borderless;
ec->border.changed = 1;
EC_CHANGED(ec);
}
}
/***************************************************************************/
ACT_FN_GO(window_border_set, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_border)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (!e_comp_object_frame_allowed(ec->frame)) return;
if (ec && params)
{
eina_stringshare_replace(&ec->bordername, params);
ec->border.changed = 1;
EC_CHANGED(ec);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_border_cycle, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_border)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if (!e_comp_object_frame_allowed(ec->frame)) return;
if (ec && params)
{
const char *space;
while (*params == ' ')
params++;
if (ec->bordername)
{
const char *bdname = params;
while ((space = strchr(bdname, ' ')))
{
if (strncmp(ec->bordername, bdname, space - bdname) == 0)
{
bdname = space + 1;
while (*bdname == ' ')
bdname++;
space = strchr(bdname, ' ');
if (space)
eina_stringshare_replace_length(
&ec->bordername,
bdname, space - bdname);
else
eina_stringshare_replace(&ec->bordername, bdname);
ec->border.changed = 1;
EC_CHANGED(ec);
return;
}
bdname = space + 1;
while (*bdname == ' ')
bdname++;
}
}
space = strchr(params, ' ');
if (space)
eina_stringshare_replace_length(&ec->bordername,
params, space - params);
else
eina_stringshare_replace(&ec->bordername, params);
ec->border.changed = 1;
EC_CHANGED(ec);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_pinned_toggle, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!((E_Client *)(void *)obj)->lock_border)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
if ((ec->netwm.state.stacking == E_STACKING_BELOW) &&
(ec->user_skip_winlist) && (ec->borderless))
e_client_pinned_set(ec, 0);
else
e_client_pinned_set(ec, 1);
}
}
/***************************************************************************/
ACT_FN_GO(window_move_by, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE)
{
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
}
if (params)
{
int dx, dy;
if (sscanf(params, "%i %i", &dx, &dy) == 2)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
evas_object_move(ec->frame, ec->x + dx, ec->y + dy);
if (!e_client_focus_policy_click(ec))
e_client_pointer_warp_to_center_now(ec);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_move_to, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (params)
{
E_Client *ec;
int x, y, zx, zy, zw, zh;
char cx, cy;
ec = (E_Client *)(void *)obj;
e_zone_useful_geometry_get(ec->zone, &zx, &zy, &zw, &zh);
if (sscanf(params, "%c%i %c%i", &cx, &x, &cy, &y) == 4)
{
x += zx;
y += zy;
}
else if (sscanf(params, "* %c%i", &cy, &y) == 2)
{
/* Updated y, keep x. */
y += zy;
x = ec->x;
cx = 0;
}
else if (sscanf(params, "%c%i *", &cx, &x) == 2)
{
/* Updated x, keep y. */
x += zx;
y = ec->y;
cy = 0;
}
else return;
if (cx == '-') x = zw - ec->w - x + 2 * zx; /* compensate x with zx */
if (cy == '-') y = zh - ec->h - y + 2 * zy; /* compensate y with zy */
if ((x != ec->x) || (y != ec->y))
{
evas_object_move(ec->frame, x, y);
if (!e_client_focus_policy_click(ec))
e_client_pointer_warp_to_center_now(ec);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_quick_tile_to_quadrant, )
{
E_Client *ec;
int x, y, zx, zy, zw, zh;
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
if((ec->maximized & E_MAXIMIZE_TYPE) != E_MAXIMIZE_NONE)
e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
e_zone_useful_geometry_get(ec->zone, &zx, &zy, &zw, &zh);
if (params)
{
if (strcmp(params, "upper_left") == 0)
{
x = zx;
y = zy;
}
else if (strcmp(params, "upper_right") == 0)
{
x = zx + (zw / 2);
y = zy;
}
else if (strcmp(params, "lower_left") == 0)
{
x = zx;
y = zy + (zh / 2);
}
else if (strcmp(params, "lower_right") == 0)
{
x = zx + (zw / 2);
y = zy + (zh / 2);
}
else
return;
evas_object_geometry_set(ec->frame, x, y, zw / 2, zh / 2);
}
}
/***************************************************************************/
ACT_FN_GO(window_move_to_center, EINA_UNUSED)
{
E_Client *ec;
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
e_comp_object_util_center(ec->frame);
if (!e_client_focus_policy_click(ec))
e_client_pointer_warp_to_center_now(ec);
}
/***************************************************************************/
ACT_FN_GO(window_resize_by, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (params)
{
int dw, dh;
if (sscanf(params, "%i %i", &dw, &dh) == 2)
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
dw += ec->w;
dh += ec->h;
e_client_resize_limit(ec, &dw, &dh);
evas_object_resize(ec->frame, dw, dh);
if (!e_client_focus_policy_click(ec))
e_client_pointer_warp_to_center_now(ec);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_push, )
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (params)
{
E_Client *ec, *cur;
E_Desk *desk_current;
int hdir, vdir;
int x, y, zx, zy, zw, zh;
if (strcmp(params, "left") == 0)
{
hdir = -1;
vdir = 0;
}
else if (strcmp(params, "right") == 0)
{
hdir = +1;
vdir = 0;
}
else if (strcmp(params, "up") == 0)
{
hdir = 0;
vdir = -1;
}
else if (strcmp(params, "down") == 0)
{
hdir = 0;
vdir = +1;
}
else if (strcmp(params, "up-left") == 0)
{
hdir = -1;
vdir = -1;
}
else if (strcmp(params, "up-right") == 0)
{
hdir = +1;
vdir = -1;
}
else if (strcmp(params, "down-left") == 0)
{
hdir = -1;
vdir = +1;
}
else if (strcmp(params, "down-right") == 0)
{
hdir = +1;
vdir = +1;
}
else
return;
ec = (E_Client *)(void *)obj;
e_zone_useful_geometry_get(ec->zone, &zx, &zy, &zw, &zh);
if (hdir < 0) x = zx;
else if (hdir > 0)
x = zx + zw - ec->w;
else x = ec->x;
if (vdir < 0) y = zy;
else if (vdir > 0)
y = zy + zh - ec->h;
else y = ec->y;
desk_current = e_desk_current_get(ec->zone);
E_CLIENT_FOREACH(cur)
{
if (((cur->desk == desk_current) || (cur->sticky)) && (ec != cur) && (!cur->iconic))
{
if ((hdir < 0)
&& (cur->x + cur->w < ec->x)
&& (E_SPANS_COMMON(ec->y, ec->h, cur->y, cur->h)))
x = MAX(x, cur->x + cur->w);
else if ((hdir > 0)
&& (cur->x > ec->x + ec->w)
&& (E_SPANS_COMMON(ec->y, ec->h, cur->y, cur->h)))
x = MIN(x, zx + cur->x - ec->w);
if ((vdir < 0)
&& (cur->y + cur->h < ec->y)
&& (E_SPANS_COMMON(ec->x, ec->w, cur->x, cur->w)))
y = MAX(y, cur->y + cur->h);
else if ((vdir > 0)
&& (cur->y > ec->y + ec->h)
&& (E_SPANS_COMMON(ec->x, ec->w, cur->x, cur->w)))
y = MIN(y, zy + cur->y - ec->h);
}
}
if ((x != ec->x) || (y != ec->y))
{
evas_object_move(ec->frame, x, y);
if (!e_client_focus_policy_click(ec))
e_client_pointer_warp_to_center_now(ec);
}
}
}
/*
* These actions jump to a window with the given name. It uses the last focused
* window it finds (going through e_client_focus_stack_get), so the name should
* be unique, if you want to jump to a specific window.
*
*/
static int
window_jump_to(const char *params)
{
Eina_List *l, *ll;
E_Zone *current_zone;
E_Client *ec;
if (!params) return 0;
/* Go through the list of all windows (that's what the focus stack is used for) */
l = e_client_focus_stack_get();
/* If we can start at the second window, we start there in order to cycle.
* If not, there is only one window, so let's use it */
if (eina_list_next(l))
l = l->next;
EINA_LIST_FOREACH(l, ll, ec)
{
if (!ec->icccm.name) continue;
if (strcasecmp(ec->icccm.name, params)) continue;
/* Jump to the screen the window is on if it isn't on the current screen but
* only if we don't have to warp the pointer anyway */
current_zone = e_zone_current_get();
/* Change the virtual desktop if the window isn't on the current virtual desktop */
e_desk_show(ec->desk);
/* A minimized window won't be focusable for key input, un-minimize it */
if (!ec->lock_user_iconify)
e_client_uniconify(ec);
evas_object_raise(ec->frame);
if (ec->zone != current_zone)
{
if (!e_client_focus_policy_click(ec))
e_client_pointer_warp_to_center_now(ec);
}
evas_object_focus_set(ec->frame, 1);
return 1;
}
return 0;
}
ACT_FN_GO(window_jump_to, )
{
window_jump_to(params);
}
ACT_FN_GO(window_jump_to_or_start, )
{
char *window_name, *start_name;
if (!params) return;
window_name = strdup(params);
start_name = window_name;
start_name = strchr(window_name, ' ');
if (start_name)
{
start_name[0] = 0;
start_name++;
}
else
{
/* The user just specified one parameter, just call window_jump_to */
window_jump_to(window_name);
free(window_name);
return;
}
/* If we cannot jump to the specified window... */
if (!window_jump_to(window_name))
{
/* ...start application by calling "exec" action */
_e_actions_act_exec_go(obj, start_name);
}
free(window_name);
}
/***************************************************************************/
ACT_FN_GO(window_drag_icon, EINA_UNUSED)
{
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
{
E_Client *ec;
ec = (E_Client *)(void *)obj;
ec->drag.start = 1;
ec->drag.x = -1;
ec->drag.y = -1;
}
}
/***************************************************************************/
ACT_FN_GO(window_desk_move_by, )
{
E_Client *ec;
int x, y;
if (!params) return;
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj)
obj = E_OBJECT(e_client_action_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
if ((!ec->zone) || (!ec->desk)) return;
if (sscanf(params, "%d %d", &x, &y) == 2)
{
E_Desk *desk;
int dx, dy;
int to_x = 0, to_y = 0;
e_desk_xy_get(ec->desk, &dx, &dy);
to_x = dx + x;
to_y = dy + y;
while (!(desk = e_desk_at_xy_get(ec->zone, to_x, to_y)))
{
/* here we are out of our desktop range */
while (to_x >= ec->zone->desk_x_count)
{
to_x -= ec->zone->desk_x_count;
to_y++;
}
while (to_x < 0)
{
to_x += ec->zone->desk_x_count;
to_y--;
}
while (to_y >= ec->zone->desk_y_count)
to_y -= ec->zone->desk_y_count;
while (to_y < 0)
to_y += ec->zone->desk_y_count;
}
if (desk)
{
/* send the border to the required desktop. */
e_client_desk_set(ec, desk);
/* switch desktop. Quite useful from the interface point of view. */
e_zone_desk_flip_by(ec->zone, to_x - dx, to_y - dy);
if (!ec->lock_user_stacking)
evas_object_raise(ec->frame);
}
}
}
/***************************************************************************/
ACT_FN_GO(window_zone_move_by, )
{
E_Client *ec;
E_Zone *zone;
E_Maximize max;
int move;
char *end;
E_Fullscreen fs;
Eina_Bool fullscreen;
if (!params) return;
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj)
obj = E_OBJECT(e_client_action_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
/* bad */
if (!ec->zone) return;
/* only one screen */
if (eina_list_count(e_comp->zones) < 2) return;
errno = 0;
move = strtol(params, &end, 10);
if ((!end) || end[0] || errno) return;
move += ec->zone->num;
if (move < 0)
move = eina_list_count(e_comp->zones) - 1;
else if ((unsigned int)move >= eina_list_count(e_comp->zones))
move = 0;
zone = e_comp_zone_number_get(move);
if (!zone) return;
if (ec->zone == zone) return;
max = ec->maximized;
fs = ec->fullscreen_policy;
fullscreen = ec->fullscreen;
if (ec->maximized) e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
if (fullscreen) e_client_unfullscreen(ec);
e_client_zone_set(ec, zone);
if (max) e_client_maximize(ec, max);
if (fullscreen) e_client_fullscreen(ec, fs);
e_client_focus_set_with_pointer(ec);
}
/***************************************************************************/
ACT_FN_GO(window_desk_move_to, )
{
E_Client *ec;
int x, y;
if (!params) return;
if ((!obj) || (obj->type != E_CLIENT_TYPE))
obj = E_OBJECT(e_client_focused_get());
if (!obj)
obj = E_OBJECT(e_client_action_get());
if (!obj) return;
ec = (E_Client *)(void *)obj;
if ((!ec->zone) || (!ec->desk)) return;
if (sscanf(params, "%d %d", &x, &y) == 2)
{
E_Desk *desk;
E_Desk *old_desk = ec->desk;
Eina_Bool was_focused = e_client_stack_focused_get(ec);
desk = e_desk_at_xy_get(ec->zone, x, y);
if ((desk) && (desk != old_desk))
{
e_client_desk_set(ec, desk);
if (was_focused)
e_desk_last_focused_focus(old_desk);
}
}
}
/***************************************************************************/
static E_Zone *
_e_actions_zone_get(E_Object *obj)
{
if (obj)
{
if (obj->type == (int)E_COMP_TYPE)
return e_zone_current_get();
else if (obj->type == (int)E_ZONE_TYPE)
return (void *)obj;
else if (obj->type == (int)E_CLIENT_TYPE)
return ((E_Client *)(void *)obj)->zone;
else if (obj->type == (int)E_SHELF_TYPE)
return ((E_Shelf *)(void *)obj)->zone;
else if (e_obj_is_win(obj))
return e_win_client_get((void*)obj)->zone;
}
return e_zone_current_get();
}
ACT_FN_GO(desk_flip_by, )
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
int dx = 0, dy = 0;
if (sscanf(params, "%i %i", &dx, &dy) == 2)
e_zone_desk_flip_by(zone, dx, dy);
}
}
}
/***************************************************************************/
ACT_FN_GO(desk_flip_to, )
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
int dx = 0, dy = 0;
if (sscanf(params, "%i %i", &dx, &dy) == 2)
e_zone_desk_flip_to(zone, dx, dy);
}
}
}
/***************************************************************************/
ACT_FN_GO(desk_flip_prev, EINA_UNUSED)
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (!zone) return;
e_zone_desk_flip_to(zone, zone->desk_x_prev, zone->desk_y_prev);
}
/***************************************************************************/
#define ACT_FLIP_LEFT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1)) || ((zone)->desk_x_current > 0))
#define ACT_FLIP_RIGHT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1)) || (((zone)->desk_x_current + 1) < (zone)->desk_x_count))
#define ACT_FLIP_UP(zone) ((e_config->desk_flip_wrap && ((zone)->desk_y_count > 1)) || ((zone)->desk_y_current > 0))
#define ACT_FLIP_DOWN(zone) ((e_config->desk_flip_wrap && ((zone)->desk_y_count > 1)) || (((zone)->desk_y_current + 1) < (zone)->desk_y_count))
#define ACT_FLIP_UP_LEFT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1) && ((zone)->desk_y_count > 1)) || (((zone)->desk_x_current > 0) && ((zone)->desk_y_current > 0)))
#define ACT_FLIP_UP_RIGHT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1) && ((zone)->desk_y_count > 1)) || ((((zone)->desk_x_current + 1) < (zone)->desk_x_count) && ((zone)->desk_y_current > 0)))
#define ACT_FLIP_DOWN_RIGHT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1) && ((zone)->desk_y_count > 1)) || ((((zone)->desk_x_current + 1) < (zone)->desk_x_count) && (((zone)->desk_y_current + 1) < (zone)->desk_y_count)))
#define ACT_FLIP_DOWN_LEFT(zone) ((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1) && ((zone)->desk_y_count > 1)) || (((zone)->desk_x_current > 0) && (((zone)->desk_y_current + 1) < (zone)->desk_y_count)))
ACT_FN_GO_EDGE(desk_flip_in_direction, )
{
E_Zone *zone;
E_Desk *current = NULL;
E_Event_Pointer_Warp *wev;
int x, y, offset = 25;
if (!ev) return; // with flip on _e_zone_cb_edge_timer we don't have ev!!!
if (e_client_action_get() && e_client_util_resizing_get(e_client_action_get())) return;
zone = _e_actions_zone_get(obj);
if (!zone) return;
wev = E_NEW(E_Event_Pointer_Warp, 1);
if (!wev) return;
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
wev->prev.x = x;
wev->prev.y = y;
if (params)
{
if (sscanf(params, "%i", &offset) != 1)
offset = 25;
}
switch (ev->edge)
{
case E_ZONE_EDGE_LEFT:
if (ACT_FLIP_LEFT(zone))
{
e_zone_desk_flip_by(zone, -1, 0);
ecore_evas_pointer_warp(e_comp->ee, zone->x + zone->w - offset, y);
wev->curr.y = y;
wev->curr.x = zone->w - offset;
}
break;
case E_ZONE_EDGE_RIGHT:
if (ACT_FLIP_RIGHT(zone))
{
e_zone_desk_flip_by(zone, 1, 0);
ecore_evas_pointer_warp(e_comp->ee, zone->x + offset, y);
wev->curr.y = y;
wev->curr.x = offset;
}
break;
case E_ZONE_EDGE_TOP:
if (ACT_FLIP_UP(zone))
{
e_zone_desk_flip_by(zone, 0, -1);
ecore_evas_pointer_warp(e_comp->ee, x, zone->y + zone->h - offset);
wev->curr.x = x;
wev->curr.y = zone->h - offset;
}
break;
case E_ZONE_EDGE_BOTTOM:
if (ACT_FLIP_DOWN(zone))
{
e_zone_desk_flip_by(zone, 0, 1);
ecore_evas_pointer_warp(e_comp->ee, x, zone->y + offset);
wev->curr.x = x;
wev->curr.y = offset;
}
break;
case E_ZONE_EDGE_TOP_LEFT:
if (ACT_FLIP_UP_LEFT(zone))
{
e_zone_desk_flip_by(zone, -1, -1);
ecore_evas_pointer_warp(e_comp->ee, zone->x + zone->w - offset, zone->y + zone->h - offset);
wev->curr.x = zone->w - offset;
wev->curr.y = zone->h - offset;
}
break;
case E_ZONE_EDGE_TOP_RIGHT:
if (ACT_FLIP_UP_RIGHT(zone))
{
e_zone_desk_flip_by(zone, 1, -1);
ecore_evas_pointer_warp(e_comp->ee, zone->x + offset, zone->y + zone->h - offset);
wev->curr.x = offset;
wev->curr.y = zone->h - offset;
}
break;
case E_ZONE_EDGE_BOTTOM_LEFT:
if (ACT_FLIP_DOWN_LEFT(zone))
{
e_zone_desk_flip_by(zone, -1, 1);
ecore_evas_pointer_warp(e_comp->ee, zone->x + zone->w - offset, zone->y + offset);
wev->curr.y = offset;
wev->curr.x = zone->w - offset;
}
break;
case E_ZONE_EDGE_BOTTOM_RIGHT:
if (ACT_FLIP_DOWN_RIGHT(zone))
{
e_zone_desk_flip_by(zone, 1, 1);
ecore_evas_pointer_warp(e_comp->ee, zone->x + offset, zone->y + offset);
wev->curr.y = offset;
wev->curr.x = offset;
}
break;
default:
break;
}
current = e_desk_current_get(zone);
if (current)
ecore_event_add(E_EVENT_POINTER_WARP, wev, NULL, NULL);
else
free(wev);
}
/***************************************************************************/
ACT_FN_GO(desk_linear_flip_by, )
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
int dx = 0;
if (sscanf(params, "%i", &dx) == 1)
e_zone_desk_linear_flip_by(zone, dx);
}
}
}
/***************************************************************************/
ACT_FN_GO(desk_linear_flip_to, )
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
int dx = 0;
if (sscanf(params, "%i", &dx) == 1)
e_zone_desk_linear_flip_to(zone, dx);
}
}
}
#define DESK_ACTION_ALL(zone, act) \
do { \
E_Zone *zone; \
const Eina_List *lz; \
\
EINA_LIST_FOREACH(e_comp->zones, lz, zone) { \
{ \
zone->desk_flip_sync = 1; \
act; \
} \
} \
} while (0)
/***************************************************************************/
ACT_FN_GO(desk_linear_flip_to_screen, )
{
if (params)
{
int dx = 0, ds = 0;
if (sscanf(params, "%i %i", &dx, &ds) == 2)
{
int current_screen = 0;
DESK_ACTION_ALL(zone,
if (current_screen == ds)
{
e_zone_desk_linear_flip_to(zone, dx);
break;
}
else current_screen++;
);
}
}
}
/***************************************************************************/
ACT_FN_GO(desk_flip_by_all, )
{
if (params)
{
int dx = 0, dy = 0;
if (sscanf(params, "%i %i", &dx, &dy) == 2)
{
DESK_ACTION_ALL(zone, e_zone_desk_flip_by(zone, dx, dy));
}
}
}
/***************************************************************************/
ACT_FN_GO(desk_flip_to_all, )
{
if (params)
{
int dx = 0, dy = 0;
if (sscanf(params, "%i %i", &dx, &dy) == 2)
{
DESK_ACTION_ALL(zone, e_zone_desk_flip_to(zone, dx, dy));
}
}
}
/***************************************************************************/
ACT_FN_GO(desk_linear_flip_by_all, )
{
if (params)
{
int dx = 0;
if (sscanf(params, "%i", &dx) == 1)
{
DESK_ACTION_ALL(zone, e_zone_desk_linear_flip_by(zone, dx));
}
}
}
/***************************************************************************/
ACT_FN_GO(desk_linear_flip_to_all, )
{
if (params)
{
int dx = 0;
if (sscanf(params, "%i", &dx) == 1)
{
DESK_ACTION_ALL(zone, e_zone_desk_linear_flip_to(zone, dx));
}
}
}
/***************************************************************************/
ACT_FN_GO(screen_send_to, )
{
E_Zone *zone, *zone2;
int scr;
zone = _e_actions_zone_get(obj);
if (!zone) zone = e_zone_current_get();
if (!zone) return;
if (!params) return;
errno = 0;
scr = strtol(params, NULL, 10);
if (errno) return;
if (scr != -1)
scr = scr % eina_list_count(e_comp->zones);
if (scr < 0) scr += eina_list_count(e_comp->zones);
zone2 = e_comp_zone_number_get(scr);
if ((zone2) && (zone != zone2))
{
ecore_evas_pointer_warp(e_comp->ee,
zone2->x + (zone2->w / 2),
zone2->y + (zone2->h / 2));
e_desk_last_focused_focus(e_desk_current_get(zone2));
}
}
ACT_FN_GO(screen_send_by, )
{
E_Zone *zone, *zone2;
int scr = 0;
zone = _e_actions_zone_get(obj);
if (!zone) zone = e_zone_current_get();
if (!zone) return;
if (!params) return;
errno = 0;
scr = strtol(params, NULL, 10);
if (errno) return;
scr += zone->num;
if (scr != -1)
scr = scr % eina_list_count(e_comp->zones);
if (scr < 0) scr += eina_list_count(e_comp->zones);
zone2 = e_comp_zone_number_get(scr);
if ((zone2) && (zone != zone2))
{
ecore_evas_pointer_warp(e_comp->ee,
zone2->x + (zone2->w / 2),
zone2->y + (zone2->h / 2));
e_desk_last_focused_focus(e_desk_current_get(zone2));
}
}
#define ZONE_DESK_ACTION(con_num, zone_num, zone, act) \
E_Zone * zone; \
if ((con_num < 0) || (zone_num < 0)) { \
Eina_List *l; \
if ((con_num >= 0) && (zone_num < 0)) /* con=1 zone=all */ { \
EINA_LIST_FOREACH(e_comp->zones, l, zone) { \
act; \
} } \
else if ((con_num < 0) && (zone_num >= 0)) /* c=all zone=1 */ { \
zone = e_comp_zone_number_get(zone_num); \
if (zone) \
act; \
} \
else if ((con_num < 0) && (zone_num < 0)) /* c=all zone=all */ { \
EINA_LIST_FOREACH(e_comp->zones, lll, zone) { \
act; \
} } } \
else { \
zone = e_comp_zone_number_get(zone_num); \
if (zone) act; \
}
/***************************************************************************/
#if 0
ACT_FN_GO(zone_desk_flip_by, )
{
if (params)
{
int con_num = 0, zone_num = 0;
int dx = 0, dy = 0;
if (sscanf(params, "%i %i %i %i", &con_num, &zone_num, &dx, &dy) == 4)
ZONE_DESK_ACTION(con_num, zone_num, zone,
e_zone_desk_flip_by(zone, dx, dy));
}
}
#endif
/***************************************************************************/
#if 0
ACT_FN_GO(zone_desk_flip_to, )
{
if (params)
{
int con_num = 0, zone_num = 0;
int dx = 0, dy = 0;
if (sscanf(params, "%i %i %i %i", &con_num, &zone_num, &dx, &dy) == 4)
ZONE_DESK_ACTION(con_num, zone_num, zone,
e_zone_desk_flip_to(zone, dx, dy));
}
}
#endif
/***************************************************************************/
#if 0
ACT_FN_GO(zone_desk_linear_flip_by, )
{
if (params)
{
int con_num = 0, zone_num = 0;
int dx = 0;
if (sscanf(params, "%i %i %i", &con_num, &zone_num, &dx) == 3)
ZONE_DESK_ACTION(con_num, zone_num, zone,
e_zone_desk_linear_flip_by(zone, dx));
}
}
#endif
/***************************************************************************/
#if 0
ACT_FN_GO(zone_desk_linear_flip_to, )
{
if (params)
{
int con_num = 0, zone_num = 0;
int dx = 0;
if (sscanf(params, "%i %i %i", &con_num, &zone_num, &dx) == 3)
ZONE_DESK_ACTION(con_num, zone_num, zone,
e_zone_desk_linear_flip_to(zone, dx));
}
}
#endif
/***************************************************************************/
static void
_e_actions_cb_menu_end(void *data EINA_UNUSED, E_Menu *m)
{
e_object_del(E_OBJECT(m));
}
static E_Menu *
_e_actions_menu_find(const char *name)
{
if (!strcmp(name, "main"))
return e_int_menus_main_new();
else if (!strcmp(name, "favorites"))
return e_int_menus_favorite_apps_new();
else if (!strcmp(name, "all"))
return e_int_menus_all_apps_new();
else if (!strcmp(name, "clients"))
return e_int_menus_clients_new();
else if (!strcmp(name, "lost_clients"))
return e_int_menus_lost_clients_new();
else if (!strcmp(name, "configuration"))
return e_int_menus_config_new();
return NULL;
}
ACT_FN_GO(menu_show, )
{
E_Zone *zone;
/* menu is active - abort */
if (e_comp_util_kbd_grabbed() || e_comp_util_mouse_grabbed()) return;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
E_Menu *m = NULL;
m = _e_actions_menu_find(params);
if (m)
{
int x, y;
/* FIXME: this is a bit of a hack... setting m->c - bad hack */
m->zone = zone;
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
e_menu_post_deactivate_callback_set(m, _e_actions_cb_menu_end, NULL);
e_menu_activate_mouse(m, zone, x, y, 1, 1,
E_MENU_POP_DIRECTION_AUTO, 0);
}
}
}
}
ACT_FN_GO_MOUSE(menu_show, )
{
E_Zone *zone;
E_Menu *m = NULL;
int x, y;
/* menu is active - abort */
if (e_comp_util_kbd_grabbed() || e_comp_util_mouse_grabbed()) return EINA_TRUE;
zone = _e_actions_zone_get(obj);
if (!zone) return EINA_TRUE;
if (!params) return EINA_TRUE;
m = _e_actions_menu_find(params);
if (!m) return EINA_TRUE;
/* FIXME: this is a bit of a hack... setting m->zone - bad hack */
m->zone = zone;
x = ev->canvas.x;
y = ev->canvas.y;
e_menu_post_deactivate_callback_set(m, _e_actions_cb_menu_end, NULL);
e_menu_activate_mouse(m, zone, x, y, 1, 1,
E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
return EINA_TRUE;
}
ACT_FN_GO_KEY(menu_show, , EINA_UNUSED)
{
E_Zone *zone;
/* menu is active - abort */
if (e_comp_util_kbd_grabbed() || e_comp_util_mouse_grabbed()) return;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
E_Menu *m = NULL;
m = _e_actions_menu_find(params);
if (m)
{
int x, y;
/* FIXME: this is a bit of a hack... setting m->con - bad hack */
m->zone = zone;
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
e_menu_post_deactivate_callback_set(m, _e_actions_cb_menu_end, NULL);
e_menu_activate_key(m, zone, x, y, 1, 1,
E_MENU_POP_DIRECTION_DOWN);
}
}
}
}
ACT_FN_GO(menu_show_object,)
{
E_Zone *zone;
/* menu is active - abort */
if (e_comp_util_kbd_grabbed() || e_comp_util_mouse_grabbed()) return;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
E_Menu *m = NULL;
m = _e_actions_menu_find(params);
if (m)
{
int x, y, w, h;
Eina_List *l, *ll;
Evas_Object *o;
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
l = evas_objects_at_xy_get(e_comp->evas, x, y, 0, 0);
EINA_LIST_REVERSE_FOREACH(l, ll, o)
{
if (evas_object_repeat_events_get(o) && ll->prev) continue;
evas_object_geometry_get(o, &x, &y, &w, &h);
m->zone = e_comp_object_util_zone_get(o);
e_menu_post_deactivate_callback_set(m, _e_actions_cb_menu_end, NULL);
e_menu_activate_mouse(m, zone, x, y, w, h,
E_MENU_POP_DIRECTION_AUTO, 0);
break;
}
eina_list_free(l);
}
}
}
}
/***************************************************************************/
ACT_FN_GO(exec, )
{
E_Zone *zone;
static double lock;
double test;
/* prevent exec actions from occurring too frequently */
test = ecore_loop_time_get();
if (test - lock < 0.05)
{
lock = test;
return;
}
lock = ecore_loop_time_get();
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
e_exec(zone, NULL, params, NULL, "action/exec");
}
}
/***************************************************************************/
ACT_FN_GO(app, )
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
Efreet_Desktop *desktop = NULL;
char *p, *p2;
size_t plen;
plen = strlen(params);
p2 = memcpy(alloca(plen + 1), params, plen + 1);
p = strchr(p2, ':');
if (p)
{
*p++ = 0;
if (*p == ' ')
{
E_Dialog *dia;
char dialog_text[1024];
dia = e_dialog_new(NULL, "E", "_e_action_act_app_go_syntax_error");
if (!dia) return;
snprintf(dialog_text, sizeof(dialog_text),
"%s<ps/><ps/>"
"Check syntax. You should not put a whitespace right after colon in action params.<ps/>"
"syntax: [file:file.desktop|name:App Name|generic:Generic Name|exe:exename]<ps/><ps/>"
"exe:terminology (O)<ps/>"
"exe: terminology (X)", params);
e_dialog_title_set(dia, _("Action Params Syntax Error"));
e_dialog_text_set(dia, _(dialog_text));
e_dialog_icon_set(dia, "dialog-error", 64);
e_dialog_button_add(dia, _("Close"), NULL, NULL, NULL);
e_dialog_button_focus_num(dia, 0);
elm_win_center(dia->win, 1, 1);
e_dialog_show(dia);
return;
}
if (!strcmp(p2, "file"))
desktop = efreet_util_desktop_file_id_find(p);
else if (!strcmp(p2, "name"))
desktop = efreet_util_desktop_name_find(p);
else if (!strcmp(p2, "generic"))
desktop = efreet_util_desktop_generic_name_find(p);
else if (!strcmp(p2, "exe"))
desktop = efreet_util_desktop_exec_find(p);
if (desktop)
{
e_exec(zone, desktop, NULL, NULL, "action/app");
efreet_desktop_free(desktop);
}
}
}
}
}
/***************************************************************************/
ACT_FN_GO(app_new_instance, EINA_UNUSED)
{
E_Client *ec;
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (!zone)
zone = e_zone_current_get();
if (!obj) obj = E_OBJECT(e_client_focused_get());
if ((!obj) || (!zone)) return;
if (obj->type != E_CLIENT_TYPE)
{
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
}
ec = (E_Client *)(void *)obj;
if (ec->desktop)
e_exec(zone, ec->desktop, NULL, NULL, "action/app");
}
/***************************************************************************/
ACT_FN_GO(desk_deskshow_toggle, EINA_UNUSED)
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (!zone) zone = e_zone_current_get();
if (zone) e_desk_deskshow(zone);
}
ACT_FN_GO(cleanup_windows, EINA_UNUSED)
{
E_Zone *zone;
zone = _e_actions_zone_get(obj);
if (!zone) zone = e_zone_current_get();
if (zone) e_place_zone_region_smart_cleanup(zone);
}
/***************************************************************************/
static E_Dialog *exit_dialog = NULL;
static void
_e_actions_cb_exit_dialog_ok(void *data EINA_UNUSED, E_Dialog *dia)
{
if (dia)
{
e_object_del(E_OBJECT(exit_dialog));
exit_dialog = NULL;
}
e_sys_action_do(E_SYS_EXIT, NULL);
}
static void
_e_actions_cb_exit_dialog_cancel(void *data EINA_UNUSED, E_Dialog *dia EINA_UNUSED)
{
e_object_del(E_OBJECT(exit_dialog));
exit_dialog = NULL;
}
static void
_e_actions_cb_exit_dialog_delete(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
_e_actions_cb_exit_dialog_cancel(NULL, data);
}
ACT_FN_GO(exit, )
{
if ((params) && (!strcmp(params, "now")))
{
e_sys_action_do(E_SYS_EXIT, NULL);
return;
}
if (exit_dialog) e_object_del(E_OBJECT(exit_dialog));
if (e_config->cnfmdlg_disabled)
{
_e_actions_cb_exit_dialog_ok(NULL, NULL);
return;
}
exit_dialog = e_dialog_new(NULL, "E", "_exit_dialog");
if (!exit_dialog) return;
evas_object_event_callback_add(exit_dialog->win, EVAS_CALLBACK_DEL, _e_actions_cb_exit_dialog_delete, exit_dialog);
e_dialog_title_set(exit_dialog, _("Exit"));
e_dialog_text_set(exit_dialog, _("Are you sure you want to exit Enlightenment?"));
e_dialog_icon_set(exit_dialog, "application-exit", 64);
e_dialog_button_add(exit_dialog, _("Yes"), NULL,
_e_actions_cb_exit_dialog_ok, NULL);
e_dialog_button_add(exit_dialog, _("No"), NULL,
_e_actions_cb_exit_dialog_cancel, NULL);
e_dialog_button_focus_num(exit_dialog, 1);
elm_win_center(exit_dialog->win, 1, 1);
e_dialog_show(exit_dialog);
}
/***************************************************************************/
ACT_FN_GO(restart, EINA_UNUSED)
{
e_sys_action_do(E_SYS_RESTART, NULL);
}
/***************************************************************************/
ACT_FN_GO(exit_now, EINA_UNUSED)
{
e_sys_action_do(E_SYS_EXIT_NOW, NULL);
}
/***************************************************************************/
ACT_FN_GO(halt_now, EINA_UNUSED)
{
e_sys_action_do(E_SYS_HALT_NOW, NULL);
}
/***************************************************************************/
ACT_FN_GO(mode_presentation_toggle, EINA_UNUSED)
{
e_config->mode.presentation = !e_config->mode.presentation;
e_config_mode_changed();
e_config_save_queue();
}
/***************************************************************************/
ACT_FN_GO(mode_offline_toggle, EINA_UNUSED)
{
e_config->mode.offline = !e_config->mode.offline;
e_config_mode_changed();
e_config_save_queue();
}
/***************************************************************************/
static E_Dialog *logout_dialog = NULL;
static void
_e_actions_cb_logout_dialog_ok(void *data EINA_UNUSED, E_Dialog *dia)
{
if (dia)
{
e_object_del(E_OBJECT(logout_dialog));
logout_dialog = NULL;
}
e_sys_action_do(E_SYS_LOGOUT, NULL);
}
static void
_e_actions_cb_logout_dialog_cancel(void *data EINA_UNUSED, E_Dialog *dia EINA_UNUSED)
{
e_object_del(E_OBJECT(logout_dialog));
logout_dialog = NULL;
}
static void
_e_actions_cb_logout_dialog_delete(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
_e_actions_cb_logout_dialog_cancel(NULL, data);
}
ACT_FN_GO(logout, )
{
if ((params) && (!strcmp(params, "now")))
{
e_sys_action_do(E_SYS_LOGOUT, NULL);
return;
}
if (logout_dialog) e_object_del(E_OBJECT(logout_dialog));
if (e_config->cnfmdlg_disabled)
{
_e_actions_cb_logout_dialog_ok(NULL, NULL);
return;
}
logout_dialog = e_dialog_new(NULL, "E", "_logout_dialog");
if (!logout_dialog) return;
evas_object_event_callback_add(logout_dialog->win, EVAS_CALLBACK_DEL, _e_actions_cb_logout_dialog_delete, logout_dialog);
e_dialog_title_set(logout_dialog, _("Logout"));
e_dialog_text_set(logout_dialog, _("Are you sure you want to logout?"));
e_dialog_icon_set(logout_dialog, "system-log-out", 64);
e_dialog_button_add(logout_dialog, _("Yes"), NULL,
_e_actions_cb_logout_dialog_ok, NULL);
e_dialog_button_add(logout_dialog, _("No"), NULL,
_e_actions_cb_logout_dialog_cancel, NULL);
e_dialog_button_focus_num(logout_dialog, 1);
elm_win_center(logout_dialog->win, 1, 1);
e_dialog_show(logout_dialog);
}
/***************************************************************************/
static E_Dialog *halt_dialog = NULL;
static void
_e_actions_cb_halt_dialog_ok(void *data EINA_UNUSED, E_Dialog *dia)
{
if (dia)
{
e_object_del(E_OBJECT(halt_dialog));
halt_dialog = NULL;
}
e_sys_action_do(E_SYS_HALT, NULL);
}
static void
_e_actions_cb_halt_dialog_cancel(void *data EINA_UNUSED, E_Dialog *dia EINA_UNUSED)
{
e_object_del(E_OBJECT(halt_dialog));
halt_dialog = NULL;
}
static void
_e_actions_cb_halt_dialog_delete(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
if (!halt_dialog) return;
e_object_del(E_OBJECT(halt_dialog));
halt_dialog = NULL;
}
ACT_FN_GO(halt, )
{
if ((params) && (!strcmp(params, "now")))
{
e_sys_action_do(E_SYS_HALT, NULL);
return;
}
if (halt_dialog) e_object_del(E_OBJECT(halt_dialog));
if (e_config->cnfmdlg_disabled)
{
_e_actions_cb_halt_dialog_ok(NULL, NULL);
return;
}
halt_dialog = e_dialog_new(NULL, "E", "_halt_dialog");
if (!halt_dialog) return;
evas_object_event_callback_add(halt_dialog->win, EVAS_CALLBACK_DEL, _e_actions_cb_halt_dialog_delete, halt_dialog);
e_dialog_title_set(halt_dialog, _("Power off"));
e_dialog_text_set(halt_dialog,
_("Are you sure you want to power off your computer?"));
e_dialog_icon_set(halt_dialog, "system-shutdown", 64);
e_dialog_button_add(halt_dialog, _("Yes"), NULL,
_e_actions_cb_halt_dialog_ok, NULL);
e_dialog_button_add(halt_dialog, _("No"), NULL,
_e_actions_cb_halt_dialog_cancel, NULL);
e_dialog_button_focus_num(halt_dialog, 1);
elm_win_center(halt_dialog->win, 1, 1);
e_dialog_show(halt_dialog);
}
/***************************************************************************/
static E_Dialog *reboot_dialog = NULL;
static void
_e_actions_cb_reboot_dialog_ok(void *data EINA_UNUSED, E_Dialog *dia)
{
if (dia)
{
e_object_del(E_OBJECT(reboot_dialog));
reboot_dialog = NULL;
}
e_sys_action_do(E_SYS_REBOOT, NULL);
}
static void
_e_actions_cb_reboot_dialog_cancel(void *data EINA_UNUSED, E_Dialog *dia EINA_UNUSED)
{
e_object_del(E_OBJECT(reboot_dialog));
reboot_dialog = NULL;
}
static void
_e_actions_cb_reboot_dialog_delete(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
_e_actions_cb_reboot_dialog_cancel(NULL, data);
}
ACT_FN_GO(reboot, )
{
if ((params) && (!strcmp(params, "now")))
{
e_sys_action_do(E_SYS_REBOOT, NULL);
return;
}
if (reboot_dialog) e_object_del(E_OBJECT(reboot_dialog));
if (e_config->cnfmdlg_disabled)
{
_e_actions_cb_reboot_dialog_ok(NULL, NULL);
return;
}
reboot_dialog = e_dialog_new(NULL, "E", "_reboot_dialog");
if (!reboot_dialog) return;
evas_object_event_callback_add(reboot_dialog->win, EVAS_CALLBACK_DEL, _e_actions_cb_reboot_dialog_delete, reboot_dialog);
e_dialog_title_set(reboot_dialog, _("Reboot"));
e_dialog_text_set(reboot_dialog, _("Are you sure you want to reboot your computer?"));
e_dialog_icon_set(reboot_dialog, "system-restart", 64);
e_dialog_button_add(reboot_dialog, _("Yes"), NULL,
_e_actions_cb_reboot_dialog_ok, NULL);
e_dialog_button_add(reboot_dialog, _("No"), NULL,
_e_actions_cb_reboot_dialog_cancel, NULL);
e_dialog_button_focus_num(reboot_dialog, 1);
elm_win_center(reboot_dialog->win, 1, 1);
e_dialog_show(reboot_dialog);
}
/***************************************************************************/
static E_Dialog *suspend_dialog = NULL;
static void
_e_actions_cb_suspend_dialog_ok(void *data EINA_UNUSED, E_Dialog *dia)
{
if