edge and corner binding infrastructure. If you have an old config, enable the conf_edgebindings module and hit 'Reset to defaults' to get edge desktop switching.

The edge/corner picker needs some love from someone who is not artistically challenged.  And a proper module icon as well.


SVN revision: 39220
devs/princeamd/enlightenment-0.17-elive
Viktor Kojouharov 14 years ago
parent 5b0166b41e
commit 9bbc8158bd
  1. 3
      config/default/e.src
  2. 3
      config/illume/e.src
  3. 51
      config/minimalist/e.src
  4. 51
      config/netbook/e.src
  5. 51
      config/scaleable/e.src
  6. 63
      config/standard/e.src
  7. 3
      configure.ac
  8. 209
      data/themes/default.edc
  9. 124
      src/bin/e_actions.c
  10. 1
      src/bin/e_actions.h
  11. 222
      src/bin/e_bindings.c
  12. 20
      src/bin/e_bindings.h
  13. 52
      src/bin/e_config.c
  14. 16
      src/bin/e_config.h
  15. 30
      src/bin/e_desk.c
  16. 6
      src/bin/e_desk.h
  17. 1
      src/bin/e_int_shelf_config.c
  18. 82
      src/bin/e_ipc_handlers.h
  19. 56
      src/bin/e_shelf.c
  20. 757
      src/bin/e_zone.c
  21. 26
      src/bin/e_zone.h
  22. 5
      src/modules/Makefile.am
  23. 20
      src/modules/conf_desks/e_int_config_desks.c
  24. 7
      src/modules/conf_edgebindings/.cvsignore
  25. 31
      src/modules/conf_edgebindings/Makefile.am
  26. BIN
      src/modules/conf_edgebindings/e-module-conf_edgebindings.edj
  27. 1291
      src/modules/conf_edgebindings/e_int_config_edgebindings.c
  28. 9
      src/modules/conf_edgebindings/e_int_config_edgebindings.h
  29. 56
      src/modules/conf_edgebindings/e_mod_main.c
  30. 19
      src/modules/conf_edgebindings/e_mod_main.h
  31. 6
      src/modules/conf_edgebindings/module.desktop.in

@ -10,6 +10,7 @@ group "E_Config" struct {
value "border_shade_transition" int: 3;
value "border_shade_speed" double: 3000.0000000000000000000000000;
value "framerate" double: 30.0000000000000000000000000;
value "priority" int: 1;
value "image_cache" int: 4096;
value "font_cache" int: 512;
value "edje_cache" int: 10;
@ -19,8 +20,6 @@ group "E_Config" struct {
value "use_virtual_roots" int: 0;
value "show_desktop_icons" int: 1;
value "edge_flip_dragging" int: 0;
value "edge_flip_moving" int: 0;
value "edge_flip_timeout" double: 0.2500000000000000000000000;
value "evas_engine_default" int: 1;
value "evas_engine_container" int: 0;
value "evas_engine_init" int: 0;

@ -10,6 +10,7 @@ group "E_Config" struct {
value "border_shade_transition" int: 3;
value "border_shade_speed" double: 3000.0000000000000000000000000;
value "framerate" double: 30.0000000000000000000000000;
value "priority" int: 1;
value "image_cache" int: 2048;
value "font_cache" int: 512;
value "edje_cache" int: 8;
@ -19,8 +20,6 @@ group "E_Config" struct {
value "use_virtual_roots" int: 0;
value "show_desktop_icons" int: 0;
value "edge_flip_dragging" int: 0;
value "edge_flip_moving" int: 0;
value "edge_flip_timeout" double: 0.2500000000000000000000000;
value "evas_engine_default" int: 1;
value "evas_engine_container" int: 0;
value "evas_engine_init" int: 0;

@ -11,6 +11,7 @@ group "E_Config" struct {
value "border_shade_transition" int: 3;
value "border_shade_speed" double: 3000.0000000000000000000000000;
value "framerate" double: 30.0000000000000000000000000;
value "priority" int: 1;
value "image_cache" int: 4096;
value "font_cache" int: 512;
value "edje_cache" int: 32;
@ -20,8 +21,6 @@ group "E_Config" struct {
value "use_virtual_roots" int: 0;
value "show_desktop_icons" int: 1;
value "edge_flip_dragging" int: 1;
value "edge_flip_moving" int: 1;
value "edge_flip_timeout" double: 0.2500000000000000000000000;
value "evas_engine_default" int: 1;
value "evas_engine_container" int: 0;
value "evas_engine_init" int: 0;
@ -266,6 +265,14 @@ group "E_Config" struct {
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_edgebindings";
value "enabled" uchar: 1;
value "delayed" uchar: 1;
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_profiles";
@ -907,6 +914,46 @@ group "E_Config" struct {
value "any_mod" uchar: 0;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 1;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 2;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 3;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 4;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "signal_bindings" list {
group "E_Config_Binding_Signal" struct {
value "context" int: 2;

@ -11,6 +11,7 @@ group "E_Config" struct {
value "border_shade_transition" int: 3;
value "border_shade_speed" double: 3000.0000000000000000000000000;
value "framerate" double: 30.0000000000000000000000000;
value "priority" int: 1;
value "image_cache" int: 4096;
value "font_cache" int: 512;
value "edje_cache" int: 32;
@ -20,8 +21,6 @@ group "E_Config" struct {
value "use_virtual_roots" int: 0;
value "show_desktop_icons" int: 1;
value "edge_flip_dragging" int: 1;
value "edge_flip_moving" int: 1;
value "edge_flip_timeout" double: 0.2500000000000000000000000;
value "evas_engine_default" int: 1;
value "evas_engine_container" int: 0;
value "evas_engine_init" int: 0;
@ -298,6 +297,14 @@ group "E_Config" struct {
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_edgebindings";
value "enabled" uchar: 1;
value "delayed" uchar: 1;
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_profiles";
@ -971,6 +978,46 @@ group "E_Config" struct {
value "any_mod" uchar: 0;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 1;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 2;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 3;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 4;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "signal_bindings" list {
group "E_Config_Binding_Signal" struct {
value "context" int: 2;

@ -10,6 +10,7 @@ group "E_Config" struct {
value "border_shade_transition" int: 3;
value "border_shade_speed" double: 3000.0000000000000000000000000;
value "framerate" double: 30.0000000000000000000000000;
value "priority" int: 1;
value "image_cache" int: 4096;
value "font_cache" int: 512;
value "edje_cache" int: 32;
@ -19,8 +20,6 @@ group "E_Config" struct {
value "use_virtual_roots" int: 0;
value "show_desktop_icons" int: 1;
value "edge_flip_dragging" int: 1;
value "edge_flip_moving" int: 1;
value "edge_flip_timeout" double: 0.2500000000000000000000000;
value "evas_engine_default" int: 1;
value "evas_engine_container" int: 0;
value "evas_engine_init" int: 0;
@ -177,6 +176,14 @@ group "E_Config" struct {
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_edgebindings";
value "enabled" uchar: 1;
value "delayed" uchar: 1;
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_paths";
@ -994,6 +1001,46 @@ group "E_Config" struct {
value "any_mod" uchar: 0;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 1;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 2;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 3;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 4;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "signal_bindings" list {
group "E_Config_Binding_Signal" struct {
value "context" int: 2;

@ -1,5 +1,5 @@
group "E_Config" struct {
value "config_version" int: 65836;
value "config_version" int: 65837;
value "show_splash" int: 1;
value "init_default_theme" string: "default.edj";
value "desktop_default_name" string: "Desktop %i, %i";
@ -10,6 +10,7 @@ group "E_Config" struct {
value "border_shade_transition" int: 3;
value "border_shade_speed" double: 3000.0000000000000000000000000;
value "framerate" double: 30.0000000000000000000000000;
value "priority" int: 1;
value "image_cache" int: 4096;
value "font_cache" int: 512;
value "edje_cache" int: 32;
@ -19,8 +20,6 @@ group "E_Config" struct {
value "use_virtual_roots" int: 0;
value "show_desktop_icons" int: 1;
value "edge_flip_dragging" int: 1;
value "edge_flip_moving" int: 1;
value "edge_flip_timeout" double: 0.2500000000000000000000000;
value "evas_engine_default" int: 1;
value "evas_engine_container" int: 0;
value "evas_engine_init" int: 0;
@ -177,6 +176,14 @@ group "E_Config" struct {
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_edgebindings";
value "enabled" uchar: 1;
value "delayed" uchar: 1;
value "priority" int: 0;
}
}
group "modules" list {
group "E_Config_Module" struct {
value "name" string: "conf_paths";
@ -994,6 +1001,56 @@ group "E_Config" struct {
value "any_mod" uchar: 0;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 1;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 2;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 3;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_flip_in_direction";
value "edge" uchar: 4;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "edge_bindings" list {
group "E_Config_Binding_Edge" struct {
value "context" int: 3;
value "modifiers" int: 0;
value "action" string: "desk_deskshow_toggle";
value "edge" uchar: 6;
value "any_mod" uchar: 0;
value "delay" float: 0.3000000000000000000000000;
}
}
group "signal_bindings" list {
group "E_Config_Binding_Signal" struct {
value "context" int: 2;

@ -392,6 +392,7 @@ AC_E_OPTIONAL_MODULE([conf_dpms], true)
AC_E_OPTIONAL_MODULE([conf_shelves], true)
AC_E_OPTIONAL_MODULE([conf_keybindings], true)
AC_E_OPTIONAL_MODULE([conf_mousebindings], true)
AC_E_OPTIONAL_MODULE([conf_edgebindings], true)
AC_E_OPTIONAL_MODULE([conf_mouse], true)
AC_E_OPTIONAL_MODULE([conf_window_display], true)
AC_E_OPTIONAL_MODULE([conf_window_focus], true)
@ -496,6 +497,8 @@ src/modules/conf_keybindings/Makefile
src/modules/conf_keybindings/module.desktop
src/modules/conf_mousebindings/Makefile
src/modules/conf_mousebindings/module.desktop
src/modules/conf_edgebindings/Makefile
src/modules/conf_edgebindings/module.desktop
src/modules/conf_mouse/Makefile
src/modules/conf_mouse/module.desktop
src/modules/conf_window_display/Makefile

@ -6873,6 +6873,215 @@ collections { /* begin the collection of edje groups that are in this file */
}
}
/////////////////////////////////////////////////////////////////////////////
/*** MOD: CONF_EDGEBINDINGS ***/
/* This group draws the edge and corners for the user to pick.
* XXX: Needs some love from masters of the brush! */
group {
name: "e/modules/conf_edgebindings/selection"; // for gadget
parts {
part { name: "e.swallow.background";
type: SWALLOW;
mouse_events: 0;
description { state: "default" 0.0;
min: 210 150;
rel1.offset: 4 4;
rel2 {
relative: 0.5 1;
offset: -2 -5;
}
}
}
part { name: "e.edge.top_left";
type: RECT;
description { state: "default" 0.0;
rel1 {
to: "e.swallow.background";
}
rel2 {
relative: 0 0;
offset: 20 20;
to: "e.swallow.background";
}
color: 255 0 0 150;
}
}
part { name: "e.edge.top";
type: RECT;
description { state: "default" 0.0;
rel1 {
offset: 20 0;
to: "e.swallow.background";
}
rel2 {
relative: 1 0;
offset: -20 15;
to: "e.swallow.background";
}
color: 255 255 0 150;
}
}
part { name: "e.edge.top_right";
type: RECT;
description { state: "default" 0.0;
rel1 {
relative: 1 0;
offset: -20 0;
to: "e.swallow.background";
}
rel2 {
relative: 1 0;
offset: 0 20;
to: "e.swallow.background";
}
color: 255 0 0 150;
}
}
part { name: "e.edge.right";
type: RECT;
description { state: "default" 0.0;
rel1 {
relative: 1 0;
offset: -15 20;
to: "e.swallow.background";
}
rel2 {
relative: 1 1;
offset: 0 -20;
to: "e.swallow.background";
}
color: 255 255 0 150;
}
}
part { name: "e.edge.bottom_right";
type: RECT;
description { state: "default" 0.0;
rel1 {
relative: 1 1;
offset: -20 -20;
to: "e.swallow.background";
}
rel2 {
relative: 1 1;
offset: 0 0;
to: "e.swallow.background";
}
color: 255 0 0 150;
}
}
part { name: "e.edge.bottom";
type: RECT;
description { state: "default" 0.0;
rel1 {
relative: 0 1;
offset: 20 -15;
to: "e.swallow.background";
}
rel2 {
relative: 1 1;
offset: -20 0;
to: "e.swallow.background";
}
color: 255 255 0 150;
}
}
part { name: "e.edge.bottom_left";
type: RECT;
description { state: "default" 0.0;
rel1 {
relative: 0 1;
offset: 0 -20;
to: "e.swallow.background";
}
rel2 {
relative: 0 1;
offset: 20 0;
to: "e.swallow.background";
}
color: 255 0 0 150;
}
}
part { name: "e.edge.left";
type: RECT;
description { state: "default" 0.0;
rel1 {
relative: 0 0;
offset: 0 20;
to: "e.swallow.background";
}
rel2 {
relative: 0 1;
offset: 15 -20;
to: "e.swallow.background";
}
color: 255 255 0 150;
}
}
part { name: "e.swallow.slider";
type: SWALLOW;
description { state: "default" 0.0;
rel1 {
relative: 1 1;
offset: 5 4;
to_x: "e.swallow.background";
to_y: "e.text.description";
}
rel2 {
relative: 1 1;
offset: -5 -5;
to_y: "e.swallow.background";
}
}
}
part { name: "e.text.description";
type: TEXTBLOCK;
mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
rel1 {
relative: 1 0;
offset: 5 4;
to_x: "e.swallow.background";
}
rel2 {
relative: 1 1;
offset: -5 -45;
}
text {
style: "dialog_style";
min: 1 1;
}
}
}
part { name: "e.text.selection";
type: TEXT;
effect: SOFT_SHADOW;
mouse_events: 0;
description { state: "default" 0.0;
align: 0.5 0.5;
rel1 {
relative: 1 1;
offset: 5 5;
to: "e.edge.top_left";
}
rel2 {
relative: 0 0;
offset: -5 -5;
to: "e.edge.bottom_right";
}
color: 224 224 224 255;
color3: 0 0 0 64;
text {
font: "Sans:style=Bold";
size: 12;
align: 0.5 0.5;
fit: 1 1;
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
/*** MOD: START ***/
/* This is for the "start" module - i.e. a "start" button. It simply

@ -29,6 +29,13 @@
}
#define ACT_FN_GO_WHEEL(act) \
static void _e_actions_act_##act##_go_wheel(E_Object *obj, const char *params, Ecore_X_Event_Mouse_Wheel *ev)
#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) \
static void _e_actions_act_##act##_go_edge(E_Object *obj, const char *params, E_Event_Zone_Edge *ev)
#define ACT_GO_SIGNAL(name) \
{ \
act = e_action_add(#name); \
@ -1096,6 +1103,118 @@ ACT_FN_GO(desk_flip_to)
}
}
/***************************************************************************/
#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 *prev = NULL, *current = NULL;
E_Event_Pointer_Warp *wev;
int x, y, offset = 25;
zone = _e_actions_zone_get(obj);
wev = E_NEW(E_Event_Pointer_Warp, 1);
if ((!wev) || (!zone)) return;
ecore_x_pointer_xy_get(zone->container->win, &x, &y);
wev->prev.x = x;
wev->prev.y = y;
prev = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current);
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_x_pointer_warp(zone->container->win, 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_x_pointer_warp(zone->container->win, 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_x_pointer_warp(zone->container->win, x, 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_x_pointer_warp(zone->container->win, x, 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_x_pointer_warp(zone->container->win, zone->w - offset, 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_x_pointer_warp(zone->container->win, offset, 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_x_pointer_warp(zone->container->win, zone->w - offset, 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_x_pointer_warp(zone->container->win, offset, offset);
wev->curr.y = offset;
wev->curr.x = offset;
}
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)
{
@ -2501,6 +2620,11 @@ e_actions_init(void)
"desk_linear_flip_by_all",
NULL, "syntax: N-offset, example: -2", 1);
/* desk_flip_in_direction */
ACT_GO_EDGE(desk_flip_in_direction);
e_action_predef_name_set(_("Desktop"), _("Flip Desktop In Direction..."),
"desk_flip_in_direction", NULL, "syntax: N-pixel-offset, example: 25", 1);
/* desk_linear_flip_to_all */
ACT_GO(desk_linear_flip_to_all);
e_action_predef_name_set(_("Desktop"), _("Switch To Desktop 0 (All Screens)"),

@ -22,6 +22,7 @@ struct _E_Action
void (*go) (E_Object *obj, const char *params);
void (*go_mouse) (E_Object *obj, const char *params, Ecore_X_Event_Mouse_Button_Down *ev);
void (*go_wheel) (E_Object *obj, const char *params, Ecore_X_Event_Mouse_Wheel *ev);
void (*go_edge) (E_Object *obj, const char *params, E_Event_Zone_Edge *ev);
void (*go_key) (E_Object *obj, const char *params, Ecore_X_Event_Key_Down *ev);
void (*go_signal) (E_Object *obj, const char *params, const char *sig, const char *src);
void (*end) (E_Object *obj, const char *params);

@ -7,16 +7,29 @@
static void _e_bindings_mouse_free(E_Binding_Mouse *bind);
static void _e_bindings_key_free(E_Binding_Key *bind);
static void _e_bindings_edge_free(E_Binding_Edge *bind);
static void _e_bindings_signal_free(E_Binding_Signal *bind);
static void _e_bindings_wheel_free(E_Binding_Wheel *bind);
static int _e_bindings_context_match(E_Binding_Context bctxt, E_Binding_Context ctxt);
static int _e_bindings_edge_cb_timer(void *data);
/* local subsystem globals */
static Eina_List *mouse_bindings = NULL;
static Eina_List *key_bindings = NULL;
static Eina_List *mouse_bindings = NULL;
static Eina_List *key_bindings = NULL;
static Eina_List *edge_bindings = NULL;
static Eina_List *signal_bindings = NULL;
static Eina_List *wheel_bindings = NULL;
static Eina_List *wheel_bindings = NULL;
typedef struct _E_Binding_Edge_Data E_Binding_Edge_Data;
struct _E_Binding_Edge_Data
{
E_Binding_Edge *bind;
E_Event_Zone_Edge *ev;
E_Action *act;
E_Object *obj;
};
/* externally accessible functions */
@ -43,6 +56,15 @@ e_bindings_init(void)
eb->any_mod, eb->action, eb->params);
}
for (l = e_config->edge_bindings; l; l = l->next)
{
E_Config_Binding_Edge *eb;
eb = l->data;
e_bindings_edge_add(eb->context, eb->edge, eb->modifiers,
eb->any_mod, eb->action, eb->params, eb->delay);
}
for (l = e_config->signal_bindings; l; l = l->next)
{
E_Config_Binding_Signal *eb;
@ -97,6 +119,14 @@ e_bindings_shutdown(void)
key_bindings = eina_list_remove_list(key_bindings, key_bindings);
_e_bindings_key_free(bind);
}
while (edge_bindings)
{
E_Binding_Edge *bind;
bind = edge_bindings->data;
edge_bindings = eina_list_remove_list(edge_bindings, edge_bindings);
_e_bindings_edge_free(bind);
}
while (signal_bindings)
{
E_Binding_Signal *bind;
@ -516,6 +546,146 @@ e_bindings_key_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Ev
return NULL;
}
EAPI void
e_bindings_edge_add(E_Binding_Context ctxt, E_Zone_Edge edge, E_Binding_Modifier mod, int any_mod, const char *action, const char *params, float delay)
{
E_Binding_Edge *bind;
bind = calloc(1, sizeof(E_Binding_Edge));
bind->ctxt = ctxt;
bind->edge = edge;
bind->mod = mod;
bind->any_mod = any_mod;
bind->delay = delay;
if (action) bind->action = eina_stringshare_add(action);
if (params) bind->params = eina_stringshare_add(params);
edge_bindings = eina_list_append(edge_bindings, bind);
}
EAPI E_Binding_Edge *
e_bindings_edge_get(const char *action, E_Zone_Edge edge)
{
Eina_List *l;
for (l = edge_bindings; l; l = l->next)
{
E_Binding_Edge *bind;
bind = l->data;
if ((bind->edge == edge) && bind->action &&
action && !strcmp(action, bind->action))
return bind;
}
return NULL;
}
EAPI void
e_bindings_edge_del(E_Binding_Context ctxt, E_Zone_Edge edge, E_Binding_Modifier mod, int any_mod, const char *action, const char *params, float delay)
{
Eina_List *l;
for (l = edge_bindings; l; l = l->next)
{
E_Binding_Edge *bind;
bind = l->data;
if ((bind->ctxt == ctxt) &&
(bind->edge == edge) &&
(bind->mod == mod) &&
((bind->delay * 1000) == (delay * 1000)) &&
(bind->any_mod == any_mod) &&
(((bind->action) && (action) && (!strcmp(bind->action, action))) ||
((!bind->action) && (!action))) &&
(((bind->params) && (params) && (!strcmp(bind->params, params))) ||
((!bind->params) && (!params))))
{
_e_bindings_edge_free(bind);
edge_bindings = eina_list_remove_list(edge_bindings, l);
break;
}
}
}
EAPI E_Action *
e_bindings_edge_in_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev)
{
E_Binding_Modifier mod = 0;
E_Action *act = NULL;
Eina_List *l;
if (ev->modifiers & ECORE_X_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_X_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_X_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_X_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
for (l = edge_bindings; l; l = l->next)
{
E_Binding_Edge *bind;
bind = l->data;
if (((bind->edge == ev->edge)) &&
((bind->any_mod) || (bind->mod == mod)))
{
if (_e_bindings_context_match(bind->ctxt, ctxt))
{
act = e_action_find(bind->action);
if (act)
{
E_Binding_Edge_Data *ed = E_NEW(E_Binding_Edge_Data, 1);
E_Event_Zone_Edge *ev2 = E_NEW(E_Event_Zone_Edge, 1);
/* The original event will be freed before it can be
* used again */
ev2->zone = ev->zone;
ev2->edge = ev->edge;
ev2->x = ev->x;
ev2->y = ev->y;
ed->bind = bind;
ed->obj = obj;
ed->act = act;
ed->ev = ev2;
bind->timer = ecore_timer_add(((double) bind->delay), _e_bindings_edge_cb_timer, ed);
}
}
}
}
return act;
}
EAPI E_Action *
e_bindings_edge_out_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev)
{
E_Binding_Modifier mod = 0;
E_Action *act = NULL;
Eina_List *l;
if (ev->modifiers & ECORE_X_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_X_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_X_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_X_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
for (l = edge_bindings; l; l = l->next)
{
E_Binding_Edge *bind;
bind = l->data;
if ((bind->edge == ev->edge) &&
((bind->any_mod) || (bind->mod == mod)))
{
if (_e_bindings_context_match(bind->ctxt, ctxt))
{
if (bind->timer)
ecore_timer_del(bind->timer);
bind->timer = NULL;
act = e_action_find(bind->action);
if (act && act->func.end)
act->func.end(obj, bind->params);
}
}
}
return act;
}
EAPI void
e_bindings_signal_add(E_Binding_Context ctxt, const char *sig, const char *src, E_Binding_Modifier mod, int any_mod, const char *action, const char *params)
{
@ -801,6 +971,21 @@ _e_bindings_key_free(E_Binding_Key *bind)
free(bind);
}
static void
_e_bindings_edge_free(E_Binding_Edge *bind)
{
if (bind->action) eina_stringshare_del(bind->action);
if (bind->params) eina_stringshare_del(bind->params);
if (bind->timer)
{
E_Binding_Edge_Data *ed;
ed = ecore_timer_del(bind->timer);
E_FREE(ed);
}
free(bind);
}
static void
_e_bindings_signal_free(E_Binding_Signal *bind)
{
@ -827,3 +1012,34 @@ _e_bindings_context_match(E_Binding_Context bctxt, E_Binding_Context ctxt)
if (bctxt == ctxt) return 1;
return 0;
}
static int
_e_bindings_edge_cb_timer(void *data)
{
E_Binding_Edge_Data *ed;
E_Event_Zone_Edge *ev;
E_Binding_Edge *bind;
E_Action *act;
E_Object *obj;
ed = data;
bind = ed->bind;
act = ed->act;
obj = ed->obj;
ev = ed->ev;
E_FREE(ed);
if (act->func.go_edge)
act->func.go_edge(obj, bind->params, ev);
else if (act->func.go)
act->func.go(obj, bind->params);
bind->timer = NULL;
/* Duplicate event */
E_FREE(ev);
return 0;
}

@ -32,6 +32,7 @@ typedef enum _E_Binding_Modifier
typedef struct _E_Binding_Mouse E_Binding_Mouse;
typedef struct _E_Binding_Key E_Binding_Key;
typedef struct _E_Binding_Edge E_Binding_Edge;
typedef struct _E_Binding_Signal E_Binding_Signal;
typedef struct _E_Binding_Wheel E_Binding_Wheel;
@ -59,6 +60,19 @@ struct _E_Binding_Key
const char *params;
};
struct _E_Binding_Edge
{
E_Binding_Context ctxt;
E_Zone_Edge edge;
E_Binding_Modifier mod;
unsigned char any_mod : 1;
const char *action;
const char *params;
float delay;
Ecore_Timer *timer;
};
struct _E_Binding_Signal
{
E_Binding_Context ctxt;
@ -101,6 +115,12 @@ EAPI void e_bindings_key_ungrab(E_Binding_Context ctxt, Ecore_X_Window wi
EAPI E_Action *e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Down *ev);
EAPI E_Action *e_bindings_key_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Up *ev);
EAPI void e_bindings_edge_add(E_Binding_Context ctxt, E_Zone_Edge edge, E_Binding_Modifier mod, int any_mod, const char *action, const char *params, float delay);
EAPI E_Binding_Edge *e_bindings_edge_get(const char *action, E_Zone_Edge edge);
EAPI void e_bindings_edge_del(E_Binding_Context ctxt, E_Zone_Edge edge, E_Binding_Modifier mod, int any_mod, const char *action, const char *params, float delay);
EAPI E_Action *e_bindings_edge_in_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev);
EAPI E_Action *e_bindings_edge_out_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev);
EAPI void e_bindings_signal_add(E_Binding_Context ctxt, const char *sig, const char *src, E_Binding_Modifier mod, int any_mod, const char *action, const char *params);
EAPI void e_bindings_signal_del(E_Binding_Context ctxt, const char *sig, const char *src, E_Binding_Modifier mod, int any_mod, const char *action, const char *params);
EAPI E_Action *e_bindings_signal_find(E_Binding_Context ctxt, E_Object *obj, const char *sig, const char *src, E_Binding_Signal **bind_ret);

@ -29,6 +29,7 @@ static E_Config_DD *_e_config_font_default_edd = NULL;
static E_Config_DD *_e_config_theme_edd = NULL;
static E_Config_DD *_e_config_bindings_mouse_edd = NULL;
static E_Config_DD *_e_config_bindings_key_edd = NULL;
static E_Config_DD *_e_config_bindings_edge_edd = NULL;
static E_Config_DD *_e_config_bindings_signal_edd = NULL;
static E_Config_DD *_e_config_bindings_wheel_edd = NULL;
static E_Config_DD *_e_config_path_append_edd = NULL;
@ -266,6 +267,20 @@ e_config_init(void)
E_CONFIG_VAL(D, T, params, STR);
E_CONFIG_VAL(D, T, any_mod, UCHAR);
_e_config_bindings_edge_edd = E_CONFIG_DD_NEW("E_Config_Binding_Edge",
E_Config_Binding_Edge);
#undef T
#undef D
#define T E_Config_Binding_Edge
#define D _e_config_bindings_edge_edd
E_CONFIG_VAL(D, T, context, INT);
E_CONFIG_VAL(D, T, modifiers, INT);
E_CONFIG_VAL(D, T, action, STR);
E_CONFIG_VAL(D, T, params, STR);
E_CONFIG_VAL(D, T, edge, UCHAR);
E_CONFIG_VAL(D, T, any_mod, UCHAR);
E_CONFIG_VAL(D, T, delay, FLOAT);
_e_config_bindings_signal_edd = E_CONFIG_DD_NEW("E_Config_Binding_Signal",
E_Config_Binding_Signal);
#undef T
@ -424,8 +439,6 @@ e_config_init(void)
E_CONFIG_VAL(D, T, use_virtual_roots, INT); /* should not make this a config option (for now) */
E_CONFIG_VAL(D, T, show_desktop_icons, INT); /**/
E_CONFIG_VAL(D, T, edge_flip_dragging, INT); /**/
E_CONFIG_VAL(D, T, edge_flip_moving, INT); /**/
E_CONFIG_VAL(D, T, edge_flip_timeout, DOUBLE); /**/
E_CONFIG_VAL(D, T, evas_engine_default, INT); /**/
E_CONFIG_VAL(D, T, evas_engine_container, INT); /**/
E_CONFIG_VAL(D, T, evas_engine_init, INT); /**/
@ -444,6 +457,7 @@ e_config_init(void)
E_CONFIG_LIST(D, T, themes, _e_config_theme_edd); /**/
E_CONFIG_LIST(D, T, mouse_bindings, _e_config_bindings_mouse_edd); /**/
E_CONFIG_LIST(D, T, key_bindings, _e_config_bindings_key_edd); /**/
E_CONFIG_LIST(D, T, edge_bindings, _e_config_bindings_edge_edd); /**/
E_CONFIG_LIST(D, T, signal_bindings, _e_config_bindings_signal_edd); /**/
E_CONFIG_LIST(D, T, wheel_bindings, _e_config_bindings_wheel_edd); /**/
E_CONFIG_LIST(D, T, path_append_data, _e_config_path_append_edd); /**/
@ -680,6 +694,7 @@ e_config_shutdown(void)
E_CONFIG_DD_FREE(_e_config_theme_edd);
E_CONFIG_DD_FREE(_e_config_bindings_mouse_edd);
E_CONFIG_DD_FREE(_e_config_bindings_key_edd);
E_CONFIG_DD_FREE(_e_config_bindings_edge_edd);
E_CONFIG_DD_FREE(_e_config_bindings_signal_edd);
E_CONFIG_DD_FREE(_e_config_bindings_wheel_edd);
E_CONFIG_DD_FREE(_e_config_path_append_edd);
@ -884,8 +899,6 @@ e_config_load(void)
E_CONFIG_LIMIT(e_config->zone_desks_y_count, 1, 64);
E_CONFIG_LIMIT(e_config->show_desktop_icons, 0, 1);
E_CONFIG_LIMIT(e_config->edge_flip_dragging, 0, 1);
E_CONFIG_LIMIT(e_config->edge_flip_moving, 0, 1);
E_CONFIG_LIMIT(e_config->edge_flip_timeout, 0.0, 2.0);
E_CONFIG_LIMIT(e_config->window_placement_policy, E_WINDOW_PLACEMENT_SMART, E_WINDOW_PLACEMENT_MANUAL);
E_CONFIG_LIMIT(e_config->focus_policy, 0, 2);
E_CONFIG_LIMIT(e_config->focus_setting, 0, 3);
@ -1351,6 +1364,30 @@ e_config_binding_key_match(E_Config_Binding_Key *eb_in)
return NULL;
}
EAPI E_Config_Binding_Edge *
e_config_binding_edge_match(E_Config_Binding_Edge *eb_in)
{
Eina_List *l;
for (l = e_config->edge_bindings; l; l = l->next)
{
E_Config_Binding_Edge *eb;
eb = l->data;
if ((eb->context == eb_in->context) &&
(eb->modifiers == eb_in->modifiers) &&
(eb->any_mod == eb_in->any_mod) &&
(eb->edge == eb_in->edge) &&
(eb->delay == eb_in->delay) &&
(((eb->action) && (eb_in->action) && (!strcmp(eb->action, eb_in->action))) ||
((!eb->action) && (!eb_in->action))) &&
(((eb->params) && (eb_in->params) && (!strcmp(eb->params, eb_in->params))) ||
((!eb->params) && (!eb_in->params))))
return eb;
}
return NULL;
}
EAPI E_Config_Binding_Signal *
e_config_binding_signal_match(E_Config_Binding_Signal *eb_in)
{
@ -1419,6 +1456,7 @@ _e_config_free(E_Config *ecf)
E_Config_Binding_Wheel *ebw;
E_Config_Syscon_Action *sca;
E_Config_Binding_Key *ebk;
E_Config_Binding_Edge *ebe;
E_Font_Fallback *eff;
E_Config_Module *em;
E_Font_Default *efd;
@ -1464,6 +1502,12 @@ _e_config_free(E_Config *ecf)
if (ebk->params) eina_stringshare_del(ebk->params);
E_FREE(ebk);
}
EINA_LIST_FREE(ecf->edge_bindings, ebe)
{
if (ebe->action) eina_stringshare_del(ebe->action);
if (ebe->params) eina_stringshare_del(ebe->params);
E_FREE(ebe);
}
EINA_LIST_FREE(ecf->signal_bindings, ebs)
{
if (ebs->signal) eina_stringshare_del(ebs->signal);

@ -10,6 +10,7 @@ typedef struct _E_Config_Module E_Config_Module;
typedef struct _E_Config_Theme E_Config_Theme;
typedef struct _E_Config_Binding_Mouse E_Config_Binding_Mouse;
typedef struct _E_Config_Binding_Key E_Config_Binding_Key;
typedef struct _E_Config_Binding_Edge E_Config_Binding_Edge;
typedef struct _E_Config_Binding_Signal E_Config_Binding_Signal;
typedef struct _E_Config_Binding_Wheel E_Config_Binding_Wheel;
typedef struct _E_Config_Desktop_Background E_Config_Desktop_Background;
@ -82,8 +83,6 @@ struct _E_Config
int use_virtual_roots; // NO GUI - maybe remove?
int show_desktop_icons; // GUI
int edge_flip_dragging; // GUI
int edge_flip_moving; // GUI
double edge_flip_timeout; // GUI
int evas_engine_default; // GUI
int evas_engine_container; // NO GUI - maybe remove?
int evas_engine_init; // NO GUI - maybe remove?
@ -102,6 +101,7 @@ struct _E_Config
Eina_List *themes; // GUI
Eina_List *mouse_bindings; // GUI
Eina_List *key_bindings; // GUI
Eina_List *edge_bindings; // GUI
Eina_List *signal_bindings;
Eina_List *wheel_bindings; // GUI
Eina_List *path_append_data; // GUI
@ -374,6 +374,17 @@ struct _E_Config_Binding_Key
unsigned char any_mod;
};
struct _E_Config_Binding_Edge
{
int context;
int modifiers;
float delay;
const char *action;
const char *params;
unsigned char edge;
unsigned char any_mod;
};
struct _E_Config_Binding_Signal
{
int context;
@ -503,6 +514,7 @@ EAPI int e_config_domain_save(const char *domain, E_Config_DD *edd, const
EAPI E_Config_Binding_Mouse *e_config_binding_mouse_match(E_Config_Binding_Mouse *eb_in);
EAPI E_Config_Binding_Key *e_config_binding_key_match(E_Config_Binding_Key *eb_in);
EAPI E_Config_Binding_Edge *e_config_binding_edge_match(E_Config_Binding_Edge *eb_in);
EAPI E_Config_Binding_Signal *e_config_binding_signal_match(E_Config_Binding_Signal *eb_in);
EAPI E_Config_Binding_Wheel *e_config_binding_wheel_match(E_Config_Binding_Wheel *eb_in);

@ -11,6 +11,7 @@
static void _e_desk_free(E_Desk *desk);
static void _e_border_event_desk_show_free(void *data, void *ev);
static void _e_border_event_desk_before_show_free(void *data, void *ev);
static void _e_border_event_desk_after_show_free(void *data, void *ev);
static void _e_border_event_desk_deskshow_free(void *data, void *ev);
static void _e_border_event_desk_name_change_free(void *data, void *ev);
static void _e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy);
@ -22,6 +23,7 @@ static int _e_desk_hide_animator(void *data);
EAPI int E_EVENT_DESK_SHOW = 0;
EAPI int E_EVENT_DESK_BEFORE_SHOW = 0;
EAPI int E_EVENT_DESK_AFTER_SHOW = 0;
EAPI int E_EVENT_DESK_DESKSHOW = 0;
EAPI int E_EVENT_DESK_NAME_CHANGE = 0;
@ -30,6 +32,7 @@ e_desk_init(void)
{
E_EVENT_DESK_SHOW = ecore_event_type_new();
E_EVENT_DESK_BEFORE_SHOW = ecore_event_type_new();
E_EVENT_DESK_AFTER_SHOW = ecore_event_type_new();
E_EVENT_DESK_DESKSHOW = ecore_event_type_new();
E_EVENT_DESK_NAME_CHANGE = ecore_event_type_new();
return 1;
@ -204,6 +207,7 @@ e_desk_show(E_Desk *desk)
E_Border *bd;
E_Event_Desk_Show *ev;
E_Event_Desk_Before_Show *eev;
E_Event_Desk_After_Show *eeev;
Eina_List *l;
int was_zone = 0, x, y, dx = 0, dy = 0;
@ -311,6 +315,16 @@ e_desk_show(E_Desk *desk)
else
e_shelf_hide(es);
}
if (e_config->desk_flip_animate_mode == 0)
{
eeev = E_NEW(E_Event_Desk_After_Show, 1);
eeev->desk = e_desk_current_get(desk->zone);
e_object_ref(E_OBJECT(eeev->desk));
ecore_event_add(E_EVENT_DESK_AFTER_SHOW, eeev,
_e_border_event_desk_after_show_free, NULL);
}
}
EAPI void
@ -532,6 +546,16 @@ _e_border_event_desk_before_show_free(void *data, void *event)
free(ev);
}
static void
_e_border_event_desk_after_show_free(void *data, void *event)
{