e-modules/comp-scale: start to add keybindings.

+ esc key in scale for k-s



SVN revision: 57469
This commit is contained in:
Hannes Janetzek 2011-03-02 16:15:06 +00:00
parent f6d756aa95
commit 26906c5f35
5 changed files with 552 additions and 137 deletions

View File

@ -230,35 +230,35 @@ collections
} }
} }
part { part {
name: "event"; name: "bg";
mouse_events: 1; mouse_events: 1;
type: RECT; type: RECT;
description { description {
state: "default" 0.0; state: "default" 0.0;
color: 0 0 0 60; color: 0 0 0 20;
} }
description { description {
state: "focused" 0.0; state: "unfocused" 0.0;
color: 0 0 0 80; color: 0 0 0 70;
} }
} }
} }
programs { programs {
program { program {
name: "mouse_in"; name: "focused";
signal: "mouse,in"; signal: "focused";
source: "e";
action: STATE_SET "focused" 0.0;
transition: SINUSOIDAL 0.3;
target: "event";
}
program {
name: "mouse_out";
signal: "mouse,out";
source: "e"; source: "e";
action: STATE_SET "default" 0.0; action: STATE_SET "default" 0.0;
transition: SINUSOIDAL 0.4; transition: SINUSOIDAL 0.2;
target: "event"; target: "bg";
}
program {
name: "unfocused";
signal: "unfocused";
source: "e";
action: STATE_SET "unfocused" 0.0;
transition: SINUSOIDAL 0.3;
target: "bg";
} }
} }
} }

View File

@ -22,34 +22,111 @@ static void _scale_gc_cb_menu_post(void *data, E_Menu *menu);
static void _scale_gc_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi); static void _scale_gc_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi);
static E_Action *act = NULL; static E_Action *act = NULL;
static int _hold_count = 0;
static int _hold_mod = 0;
Eina_Bool
e_mod_hold_modifier_check(Ecore_Event_Key *ev)
{
if (!_hold_mod)
return EINA_TRUE;
if ((_hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && (!strcmp(ev->key, "Shift_L")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && (!strcmp(ev->key, "Shift_R")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_CTRL) && (!strcmp(ev->key, "Control_L")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_CTRL) && (!strcmp(ev->key, "Control_R")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Alt_L")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Alt_R")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Meta_L")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Meta_R")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Super_L")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Super_R")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Super_L")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Super_R")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Mode_switch")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Meta_L")))
_hold_count--;
else if ((_hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Meta_R")))
_hold_count--;
if (_hold_count <= 0)
{
return EINA_FALSE;
}
return EINA_TRUE;
}
static void static void
_e_mod_action(const char *params) _e_mod_action(const char *params, int modifiers)
{ {
int active;
E_Manager *man;
Evas *e;
if (!params) return; if (!params) return;
/* we expect that there is only one manager!!!*/
man = eina_list_data_get(e_manager_list());
if (!man) return;
e = e_manager_comp_evas_get(man);
if (!e) return;
if (!strncmp(params, "go_pager", 8)) if (!strncmp(params, "go_pager", 8))
{ {
pager_run(params); active = pager_run(man, params);
} }
else if (!strncmp(params, "go_scale", 8)) else if (!strncmp(params, "go_scale", 8))
{ {
scale_run(params); active = scale_run(man, params);
}
if (active)
{
_hold_mod = modifiers;
_hold_count = 0;
if (_hold_mod & ECORE_EVENT_MODIFIER_SHIFT) _hold_count++;
if (_hold_mod & ECORE_EVENT_MODIFIER_CTRL) _hold_count++;
if (_hold_mod & ECORE_EVENT_MODIFIER_ALT) _hold_count++;
if (_hold_mod & ECORE_EVENT_MODIFIER_WIN) _hold_count++;
} }
} }
static void static void
_e_mod_action_cb_edge(E_Object *obj, const char *params, E_Event_Zone_Edge *ev) _e_mod_action_cb_edge(E_Object *obj, const char *params, E_Event_Zone_Edge *ev)
{ {
_e_mod_action(params); _e_mod_action(params, 0);
} }
static void static void
_e_mod_action_cb(E_Object *obj, const char *params) _e_mod_action_cb(E_Object *obj, const char *params)
{ {
_e_mod_action(params); _e_mod_action(params, 0);
} }
static void
_e_mod_action_cb_key(E_Object *obj, const char *params, Ecore_Event_Key *ev)
{
_e_mod_action(params, ev->modifiers);
}
static void
_e_mod_action_cb_mouse(E_Object *obj, const char *params, Ecore_Event_Mouse_Button *ev)
{
_e_mod_action(params, 0);
}
/* Module and Gadcon stuff */ /* Module and Gadcon stuff */
typedef struct _Instance Instance; typedef struct _Instance Instance;
@ -155,13 +232,31 @@ e_modapi_init(E_Module *m)
if (act) if (act)
{ {
act->func.go = _e_mod_action_cb; act->func.go = _e_mod_action_cb;
act->func.go_key = _e_mod_action_cb_key;
act->func.go_mouse = _e_mod_action_cb_mouse;
act->func.go_edge = _e_mod_action_cb_edge; act->func.go_edge = _e_mod_action_cb_edge;
e_action_predef_name_set(D_("Desktop"), D_("Scale Windows"), e_action_predef_name_set(D_("Desktop"), D_("Scale Windows"),
"scale-windows", "go_scale", NULL, 0); "scale-windows", "go_scale", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Windows (All Desktops)"), e_action_predef_name_set(D_("Desktop"), D_("Scale Windows (All Desktops)"),
"scale-windows", "go_scale_all", NULL, 0); "scale-windows", "go_scale_all", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager"), e_action_predef_name_set(D_("Desktop"), D_("Scale Pager"),
"scale-windows", "go_pager", NULL, 0); "scale-windows", "go_pager", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager"),
"scale-windows", "go_pager", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager Next"),
"scale-windows", "go_pager_next", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager Previous"),
"scale-windows", "go_pager_prev", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager Left"),
"scale-windows", "go_pager_left", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager Right"),
"scale-windows", "go_pager_right", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager Up"),
"scale-windows", "go_pager_up", NULL, 0);
e_action_predef_name_set(D_("Desktop"), D_("Scale Pager Down"),
"scale-windows", "go_pager_down", NULL, 0);
} }
return m; return m;

View File

@ -134,8 +134,11 @@ EAPI int e_modapi_save(E_Module *m);
E_Config_Dialog *e_int_config_scale_module(E_Container *con, const char *params); E_Config_Dialog *e_int_config_scale_module(E_Container *con, const char *params);
void scale_run(const char *params);
void pager_run(const char *params); Eina_Bool e_mod_hold_modifier_check(Ecore_Event_Key *ev);
Eina_Bool scale_run(E_Manager *man, const char *params);
Eina_Bool pager_run(E_Manager *man, const char *params);
extern Config *scale_conf; extern Config *scale_conf;

View File

@ -54,6 +54,8 @@ static void _pager_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src);
static void _pager_win_del(Item *it); static void _pager_win_del(Item *it);
static void _pager_finish(); static void _pager_finish();
static void _pager_handler(void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata);
static Ecore_X_Window input_win = 0; static Ecore_X_Window input_win = 0;
@ -74,6 +76,7 @@ static E_Desk *current_desk = NULL;
static int min_x, min_y, max_x, max_y; static int min_x, min_y, max_x, max_y;
static double desk_w, desk_h; static double desk_w, desk_h;
static double zoom = 0.0; static double zoom = 0.0;
static int fade_windows;
static void static void
_pager_place_desks(double scale) _pager_place_desks(double scale)
@ -151,7 +154,7 @@ _pager_redraw(void *data)
_pager_place_desks(in); _pager_place_desks(in);
_pager_place_windows(in); _pager_place_windows(in);
if (scale_conf->pager_fade_windows) if (fade_windows)
{ {
EINA_LIST_FOREACH(items, l, it) EINA_LIST_FOREACH(items, l, it)
{ {
@ -216,8 +219,11 @@ _pager_in()
static void static void
_pager_out() _pager_out()
{ {
double duration, now = ecore_time_get(); Item *it;
Eina_List *l;
double duration, now;
now = ecore_time_get();
duration = scale_conf->pager_duration; duration = scale_conf->pager_duration;
if (now - start_time < duration) if (now - start_time < duration)
@ -231,6 +237,12 @@ _pager_out()
if (selected_item) if (selected_item)
edje_object_signal_emit(selected_item->o, "hide", "e"); edje_object_signal_emit(selected_item->o, "hide", "e");
EINA_LIST_FOREACH(items, l, it)
{
it->bd_x = it->bd->x + (it->desk->x - current_desk->x) * zone->w;
it->bd_y = it->bd->y + (it->desk->y - current_desk->y) * zone->h;
}
scale_state = EINA_FALSE; scale_state = EINA_FALSE;
} }
@ -336,16 +348,18 @@ _pager_desk_at_xy_get(double x, double y)
static void static void
_pager_desk_select(E_Desk *desk) _pager_desk_select(E_Desk *desk)
{ {
Item *it; Evas_Object *o_desk;
Eina_List *l;
if (current_desk && (desk != current_desk))
{
o_desk = eina_list_nth(desks, current_desk->y * zone->desk_x_count + current_desk->x);
edje_object_signal_emit(o_desk, "unfocused", "e");
}
current_desk = desk; current_desk = desk;
EINA_LIST_FOREACH(items, l, it) o_desk = eina_list_nth(desks, desk->y * zone->desk_x_count + desk->x);
{ edje_object_signal_emit(o_desk, "focused", "e");
it->bd_x = it->bd->x + (it->desk->x - desk->x) * zone->w;
it->bd_y = it->bd->y + (it->desk->y - desk->y) * zone->h;
}
} }
static void static void
@ -369,6 +383,9 @@ _pager_win_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info
else if (ev->button == 1) else if (ev->button == 1)
{ {
e_border_raise(it->bd); e_border_raise(it->bd);
if (current_desk != it->desk)
_pager_desk_select(it->desk);
} }
it->mx = ev->canvas.x; it->mx = ev->canvas.x;
@ -470,6 +487,9 @@ _pager_win_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info
y += (desk2->y - desk->y) * zone->h; y += (desk2->y - desk->y) * zone->h;
} }
if (current_desk != desk)
_pager_desk_select(desk);
e_border_move(it->bd, x, y); e_border_move(it->bd, x, y);
it->desk = desk; it->desk = desk;
@ -784,9 +804,8 @@ _pager_cb_mouse_down(void *data, int type, void *event)
if (!it) if (!it)
{ {
E_Desk *desk = _pager_desk_at_xy_get(ev->x, ev->y); E_Desk *desk = _pager_desk_at_xy_get(ev->x, ev->y);
if (desk) current_desk = desk; if (desk)
_pager_desk_select(desk);
_pager_desk_select(current_desk);
_pager_out(); _pager_out();
return ECORE_CALLBACK_PASS_ON; return ECORE_CALLBACK_PASS_ON;
@ -801,6 +820,162 @@ _pager_cb_mouse_down(void *data, int type, void *event)
} }
static void static void
_pager_switch(const char *params)
{
int max_x,max_y, desk_x, desk_y;
int x = 0, y = 0;
E_Desk *desk;
printf("switch %s\n", params);
if (!params[0])
{
_pager_out();
return;
}
e_zone_desk_count_get(zone, &max_x, &max_y);
if (!strcmp(params, "_left"))
x = -1;
else if (!strcmp(params, "_right"))
x = 1;
else if (!strcmp(params, "_up"))
y = -1;
else if (!strcmp(params, "_down"))
y = 1;
else if (!strcmp(params, "_next"))
{
x = 1;
if (current_desk->x == max_x - 1)
y = 1;
}
else if (!strcmp(params, "_prev"))
{
x = -1;
if (current_desk->x == 0)
y = -1;
}
desk_x = current_desk->x + x;
desk_y = current_desk->y + y;
if (desk_x < 0)
desk_x = max_x - 1;
else if (desk_x >= max_x)
desk_x = 0;
if (desk_y < 0)
desk_y = max_y - 1;
else if (desk_y >= max_y)
desk_y = 0;
printf("selec %d %d\n", desk_x, desk_y);
desk = e_desk_at_xy_get(zone, desk_x, desk_y);
if (desk) _pager_desk_select(desk);
if (!scale_state)
{
Eina_List *l;
Item *it;
fade_windows = 0;
EINA_LIST_FOREACH(items, l, it)
{
it->alpha = 255.0;
evas_object_color_set(it->o_win, 255.0, 255.0, 255.0, 255.0);
}
}
}
static Eina_Bool
_pager_cb_key_down(void *data, int type, void *event)
{
Ecore_Event_Key *ev = event;
if (ev->window != input_win)
return ECORE_CALLBACK_PASS_ON;
printf("%s\n", ev->key);
if (!strcmp(ev->key, "Up"))
_pager_switch("_up");
else if (!strcmp(ev->key, "Down"))
_pager_switch("_down");
else if (!strcmp(ev->key, "Left"))
_pager_switch("_left");
else if (!strcmp(ev->key, "Right"))
_pager_switch("_right");
else if (!strcmp(ev->key, "p"))
_pager_switch("_prev");
else if (!strcmp(ev->key, "n"))
_pager_switch("_next");
else if (!strcmp(ev->key, "Return"))
_pager_out();
else if (!strcmp(ev->key, "space"))
_pager_out();
else if (!strcmp(ev->key, "Escape"))
{
_pager_desk_select(e_desk_current_get(zone));
_pager_out();
}
else
{
E_Action *act;
Eina_List *l;
E_Config_Binding_Key *bind;
E_Binding_Modifier mod;
for (l = e_config->key_bindings; l; l = l->next)
{
bind = l->data;
if (bind->action && strcmp(bind->action, "scale-windows")) continue;
if (!bind->params || strncmp(bind->params, "go_pager", 8)) continue;
printf("found action\n");
mod = 0;
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
mod |= E_BINDING_MODIFIER_WIN;
if (bind->key && (!strcmp(bind->key, ev->keyname)) &&
((bind->modifiers == mod) || (bind->any_mod)))
{
if (!(act = e_action_find(bind->action))) continue;
if (act->func.go_key)
act->func.go_key(E_OBJECT(zone), bind->params, ev);
else if (act->func.go)
act->func.go(E_OBJECT(zone), bind->params);
}
}
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_pager_cb_key_up(void *data, int type, void *event)
{
Ecore_Event_Key *ev = event;
if (ev->window != input_win)
return ECORE_CALLBACK_PASS_ON;
if (!scale_state)
return ECORE_CALLBACK_PASS_ON;
if (!e_mod_hold_modifier_check(event))
_pager_out();
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_pager_run(E_Manager *man) _pager_run(E_Manager *man)
{ {
Eina_List *l; Eina_List *l;
@ -808,8 +983,10 @@ _pager_run(E_Manager *man)
Ecore_Event_Handler *h; Ecore_Event_Handler *h;
Evas *e; Evas *e;
if (input_win) return EINA_FALSE;
e = e_manager_comp_evas_get(man); e = e_manager_comp_evas_get(man);
if (!e) return; if (!e) return EINA_FALSE;
zone = e_util_zone_current_get(man); zone = e_util_zone_current_get(man);
current_desk = e_desk_current_get(zone); current_desk = e_desk_current_get(zone);
@ -822,9 +999,11 @@ _pager_run(E_Manager *man)
{ {
ecore_x_window_free(input_win); ecore_x_window_free(input_win);
input_win = 0; input_win = 0;
return; return EINA_FALSE;
} }
msg_handler = e_msg_handler_add(_pager_handler, NULL);
h = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, h = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
_pager_cb_mouse_down, e); _pager_cb_mouse_down, e);
handlers = eina_list_append(handlers, h); handlers = eina_list_append(handlers, h);
@ -837,6 +1016,14 @@ _pager_run(E_Manager *man)
_pager_cb_mouse_move, e); _pager_cb_mouse_move, e);
handlers = eina_list_append(handlers, h); handlers = eina_list_append(handlers, h);
h = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
_pager_cb_key_down, e);
handlers = eina_list_append(handlers, h);
h = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
_pager_cb_key_up, e);
handlers = eina_list_append(handlers, h);
zoom = zone->desk_x_count; zoom = zone->desk_x_count;
if (zoom < zone->desk_y_count) if (zoom < zone->desk_y_count)
zoom = zone->desk_y_count; zoom = zone->desk_y_count;
@ -856,19 +1043,26 @@ _pager_run(E_Manager *man)
if (background) if (background)
{ {
Evas_Object *o; Evas_Object *o;
int i; int x, y;
for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++) for (y = 0; y < zone->desk_y_count; y++)
{ {
o = edje_object_add(e);
if (!e_theme_edje_object_set(o, "base/theme/modules/scale",
"modules/scale/desk"))
edje_object_file_set(o, scale_conf->theme_path,
"modules/scale/desk");
evas_object_stack_above(o, background->o_win);
evas_object_show(o);
desks = eina_list_append(desks, o); for (x = 0; x < zone->desk_x_count; x++)
{
o = edje_object_add(e);
if (!e_theme_edje_object_set(o, "base/theme/modules/scale",
"modules/scale/desk"))
edje_object_file_set(o, scale_conf->theme_path,
"modules/scale/desk");
evas_object_stack_above(o, background->o_win);
evas_object_show(o);
desks = eina_list_append(desks, o);
if ((x != zone->desk_x_current) || (y != zone->desk_y_current))
edje_object_signal_emit(o, "unfocused", "e");
}
} }
_pager_place_desks(1.0); _pager_place_desks(1.0);
} }
@ -876,62 +1070,79 @@ _pager_run(E_Manager *man)
evas_event_feed_mouse_in(e, ecore_x_current_time_get(), NULL); evas_event_feed_mouse_in(e, ecore_x_current_time_get(), NULL);
evas_event_feed_mouse_move(e, -1000000, -1000000, evas_event_feed_mouse_move(e, -1000000, -1000000,
ecore_x_current_time_get(), NULL); ecore_x_current_time_get(), NULL);
_pager_in();
fade_windows = scale_conf->pager_fade_windows;
return EINA_TRUE;
}
Eina_Bool
pager_run(E_Manager *man, const char *params)
{
Eina_Bool ret = EINA_FALSE;
printf("run: %s\n", params);
if (scale_state)
{
_pager_switch(params+8);
}
else if (!scale_state)
{
if (input_win)
return ret;
ret = _pager_run(man);
if (ret)
{
if (strlen(params) > 8)
_pager_switch(params+8);
_pager_in();
}
}
return ret;
} }
static void static void
_pager_handler(void *data, const char *name, const char *info, int val, _pager_handler(void *data, const char *name, const char *info, int val,
E_Object *obj, void *msgdata) E_Object *obj, void *msgdata)
{ {
E_Manager *man = (E_Manager *)obj; E_Manager *man = (E_Manager *)obj;
E_Manager_Comp_Source *src = (E_Manager_Comp_Source *)msgdata; E_Manager_Comp_Source *src = (E_Manager_Comp_Source *)msgdata;
Evas *e; Evas *e;
/* DBG("handler... '%s' '%s'\n", name, info); */ /* DBG("handler... '%s' '%s'\n", name, info); */
if (strcmp(name, "comp.manager")) return; if (strcmp(name, "comp.manager")) return;
e = e_manager_comp_evas_get(man); e = e_manager_comp_evas_get(man);
if (!strcmp(info, "change.comp")) if (!strcmp(info, "change.comp"))
{ {
if (!e) DBG("TTT: No comp manager\n"); if (!e) DBG("TTT: No comp manager\n");
else DBG("TTT: comp canvas = %p\n", e); else DBG("TTT: comp canvas = %p\n", e);
} }
else if (!strcmp(info, "resize.comp")) else if (!strcmp(info, "resize.comp"))
{ {
DBG("%s: %p | %p\n", info, man, src); DBG("%s: %p | %p\n", info, man, src);
} }
else if (!strcmp(info, "add.src")) else if (!strcmp(info, "add.src"))
{ {
/* DBG("%s: %p | %p\n", info, man, src); */ /* DBG("%s: %p | %p\n", info, man, src); */
_pager_win_new(e, man, src); _pager_win_new(e, man, src);
} }
else if (!strcmp(info, "del.src")) else if (!strcmp(info, "del.src"))
{ {
DBG("%s: %p | %p\n", info, man, src); DBG("%s: %p | %p\n", info, man, src);
} }
else if (!strcmp(info, "config.src")) else if (!strcmp(info, "config.src"))
{ {
DBG("%s: %p | %p\n", info, man, src); DBG("%s: %p | %p\n", info, man, src);
} }
/* else if (!strcmp(info, "visible.src")) else if (!strcmp(info, "visible.src"))
* { {
* DBG("%s: %p | %p\n", info, man, src); DBG("%s: %p | %p\n", info, man, src);
* } */ }
} }
void
pager_run(const char *params)
{
Eina_List *l;
E_Manager *man;
msg_handler = e_msg_handler_add(_pager_handler, NULL);
EINA_LIST_FOREACH(e_manager_list(), l, man)
{
Evas *e = e_manager_comp_evas_get(man);
if (e) _pager_run(man);
}
}

View File

@ -71,6 +71,9 @@ static void _scale_finish(void);
static void _scale_in(void); static void _scale_in(void);
static void _scale_out(void); static void _scale_out(void);
static void _scale_handler(void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata);
static Ecore_X_Window input_win = 0; static Ecore_X_Window input_win = 0;
static E_Msg_Handler *msg_handler = NULL; static E_Msg_Handler *msg_handler = NULL;
@ -140,7 +143,7 @@ _scale_redraw(void *blah)
EINA_LIST_FOREACH(items, l, it) EINA_LIST_FOREACH(items, l, it)
{ {
a = 255.0; a = 255.0;
if ((it->bd->desk != current_desk) && (selected_item != it)) if ((it->bd->desk != current_desk) && (selected_item != it))
{ {
double ax = it->cur_x - it->x; double ax = it->cur_x - it->x;
@ -155,7 +158,7 @@ _scale_redraw(void *blah)
evas_object_color_set(it->o_win, a, a, a, a); evas_object_color_set(it->o_win, a, a, a, a);
} }
} }
if (scale_conf->fade_popups) if (scale_conf->fade_popups)
{ {
a = 255.0 * in; a = 255.0 * in;
@ -255,7 +258,7 @@ _scale_finish()
it->bd_x = it->bd->x; it->bd_x = it->bd->x;
it->bd_y = it->bd->y; it->bd_y = it->bd->y;
} }
_scale_place_windows(1.0); _scale_place_windows(1.0);
EINA_LIST_FREE(items, it) EINA_LIST_FREE(items, it)
@ -1339,19 +1342,106 @@ _scale_place_natural()
} }
} }
static Eina_Bool
_scale_cb_key_down(void *data, int type, void *event)
{
Ecore_Event_Key *ev = event;
if (ev->window != input_win)
return ECORE_CALLBACK_PASS_ON;
printf("%s\n", ev->key);
static void /* if (!strcmp(ev->key, "Up"))
* _scale_switch("_up");
* else if (!strcmp(ev->key, "Down"))
* _scale_switch("_down");
* else if (!strcmp(ev->key, "Left"))
* _scale_switch("_left");
* else if (!strcmp(ev->key, "Right"))
* _scale_switch("_right");
* else if (!strcmp(ev->key, "p"))
* _scale_switch("_prev");
* else if (!strcmp(ev->key, "n"))
* _scale_switch("_next");
* else if (!strcmp(ev->key, "Return"))
* _scale_out();
* else */
if (!strcmp(ev->key, "space"))
_scale_out();
else if (!strcmp(ev->key, "Escape"))
{
/* TODO go to previously focused window */
_scale_out();
}
else
{
E_Action *act;
Eina_List *l;
E_Config_Binding_Key *bind;
E_Binding_Modifier mod;
for (l = e_config->key_bindings; l; l = l->next)
{
bind = l->data;
if (bind->action && strcmp(bind->action, "scale-windows")) continue;
if (!bind->params || strncmp(bind->params, "go_scale", 8)) continue;
printf("found action\n");
mod = 0;
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
mod |= E_BINDING_MODIFIER_WIN;
if (bind->key && (!strcmp(bind->key, ev->keyname)) &&
((bind->modifiers == mod) || (bind->any_mod)))
{
if (!(act = e_action_find(bind->action))) continue;
if (act->func.go_key)
act->func.go_key(E_OBJECT(zone), bind->params, ev);
else if (act->func.go)
act->func.go(E_OBJECT(zone), bind->params);
}
}
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_scale_cb_key_up(void *data, int type, void *event)
{
Ecore_Event_Key *ev = event;
if (ev->window != input_win)
return ECORE_CALLBACK_PASS_ON;
if (!scale_state)
return ECORE_CALLBACK_PASS_ON;
if (!e_mod_hold_modifier_check(event))
_scale_out();
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_scale_run(E_Manager *man) _scale_run(E_Manager *man)
{ {
Eina_List *l; Eina_List *l;
E_Manager_Comp_Source *src; E_Manager_Comp_Source *src;
Ecore_Event_Handler *h;
Evas *e; Evas *e;
int i; int i;
Item *it; Item *it;
e = e_manager_comp_evas_get(man); e = e_manager_comp_evas_get(man);
if (!e) return; if (!e) return EINA_FALSE;
zone = e_util_zone_current_get(e_manager_current_get()); zone = e_util_zone_current_get(e_manager_current_get());
current_desk = e_desk_current_get(zone); current_desk = e_desk_current_get(zone);
@ -1364,20 +1454,28 @@ _scale_run(E_Manager *man)
{ {
ecore_x_window_free(input_win); ecore_x_window_free(input_win);
input_win = 0; input_win = 0;
return; return EINA_FALSE;
} }
handlers = eina_list_append h = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
(handlers, ecore_event_handler_add _scale_cb_mouse_down, e);
(ECORE_EVENT_MOUSE_BUTTON_DOWN, _scale_cb_mouse_down, e)); handlers = eina_list_append(handlers, h);
handlers = eina_list_append h = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
(handlers, ecore_event_handler_add _scale_cb_mouse_up, e);
(ECORE_EVENT_MOUSE_BUTTON_UP, _scale_cb_mouse_up, e)); handlers = eina_list_append(handlers, h);
handlers = eina_list_append h = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
(handlers, ecore_event_handler_add _scale_cb_mouse_move, e);
(ECORE_EVENT_MOUSE_MOVE, _scale_cb_mouse_move, e)); handlers = eina_list_append(handlers, h);
h = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
_scale_cb_key_down, e);
handlers = eina_list_append(handlers, h);
h = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
_scale_cb_key_up, e);
handlers = eina_list_append(handlers, h);
EINA_LIST_FOREACH((Eina_List *)e_manager_comp_src_list(man), l, src) EINA_LIST_FOREACH((Eina_List *)e_manager_comp_src_list(man), l, src)
_scale_win_new(e, man, src, current_desk); _scale_win_new(e, man, src, current_desk);
@ -1385,13 +1483,13 @@ _scale_run(E_Manager *man)
if (eina_list_count(items) < 1) if (eina_list_count(items) < 1)
{ {
_scale_finish(); _scale_finish();
return; return EINA_FALSE;
} }
if ((eina_list_count(items) < 2) && (!show_all_desks)) if ((eina_list_count(items) < 2) && (!show_all_desks))
{ {
_scale_finish(); _scale_finish();
return; return EINA_FALSE;
} }
if (show_all_desks) if (show_all_desks)
@ -1494,6 +1592,8 @@ _scale_run(E_Manager *man)
ecore_x_current_time_get(), NULL); ecore_x_current_time_get(), NULL);
_scale_in(); _scale_in();
return EINA_TRUE;
} }
@ -1543,6 +1643,33 @@ _scale_cb_mouse_up(void *data, int type, void *event)
return ECORE_CALLBACK_PASS_ON; return ECORE_CALLBACK_PASS_ON;
} }
Eina_Bool
scale_run(E_Manager *man, const char *params)
{
Eina_List *l;
Eina_Bool ret = EINA_FALSE;
if (!strcmp(params, "go_scale_all"))
show_all_desks = EINA_TRUE;
else
show_all_desks = EINA_FALSE;
if (scale_state)
{
/* _scale_action(params+8); */
}
else
{
if (input_win)
return ret;
ret = _scale_run(man);
}
return ret;
}
static void static void
_scale_handler(void *data, const char *name, const char *info, int val, _scale_handler(void *data, const char *name, const char *info, int val,
E_Object *obj, void *msgdata) E_Object *obj, void *msgdata)
@ -1579,29 +1706,8 @@ _scale_handler(void *data, const char *name, const char *info, int val,
DBG("%s: %p | %p\n", info, man, src); DBG("%s: %p | %p\n", info, man, src);
} }
/* else if (!strcmp(info, "visible.src")) else if (!strcmp(info, "visible.src"))
* {
* DBG("%s: %p | %p\n", info, man, src);
* } */
}
void
scale_run(const char *params)
{
Eina_List *l;
E_Manager *man;
msg_handler = e_msg_handler_add(_scale_handler, NULL);
if (!strcmp(params, "go_scale_all"))
show_all_desks = EINA_TRUE;
else
show_all_desks = EINA_FALSE;
EINA_LIST_FOREACH(e_manager_list(), l, man)
{ {
Evas *e = e_manager_comp_evas_get(man); DBG("%s: %p | %p\n", info, man, src);
if (e) _scale_run(man);
} }
} }