From c5fab74cbf4781abd4e7d3582282e8ce01629995 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 30 Apr 2005 07:03:35 +0000 Subject: [PATCH] a whole wad more bindings... i'll stop here. it's now a matter of slow, over time, expansion of actions and systems to hook in. SVN revision: 14512 --- src/bin/e_actions.c | 269 ++++++++++++++++++++++++++++++++++++++++++- src/bin/e_bindings.c | 60 ++++++++++ src/bin/e_border.c | 34 ++++-- src/bin/e_border.h | 5 +- src/bin/e_menu.c | 8 +- src/bin/e_zone.c | 6 +- 6 files changed, 359 insertions(+), 23 deletions(-) diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 9a98bd7ba..01e7dc35a 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -115,15 +115,34 @@ ACT_FN_GO(window_menu) { if (!obj) obj = E_OBJECT(e_border_focused_get()); if (!obj) return; - if (obj->type != E_BORDER_TYPE) return; - e_border_act_menu_begin((E_Border *)obj, NULL); + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + e_border_act_menu_begin((E_Border *)obj, NULL, 0); } ACT_FN_GO_MOUSE(window_menu) { if (!obj) obj = E_OBJECT(e_border_focused_get()); if (!obj) return; - if (obj->type != E_BORDER_TYPE) return; - e_border_act_menu_begin((E_Border *)obj, ev); + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + e_border_act_menu_begin((E_Border *)obj, ev, 0); +} +ACT_FN_GO_KEY(window_menu) +{ + if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + e_border_act_menu_begin((E_Border *)obj, NULL, 1); } /***************************************************************************/ @@ -165,6 +184,95 @@ ACT_FN_GO(window_close) e_border_act_close_begin((E_Border *)obj); } +/***************************************************************************/ +ACT_FN_GO(window_kill) +{ + if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + e_border_act_kill_begin((E_Border *)obj); +} + +/***************************************************************************/ +ACT_FN_GO(window_sticky_toggle) +{ + if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + { + E_Border *bd; + + bd = (E_Border *)obj; + if (bd->sticky) e_border_unstick(bd); + else e_border_stick(bd); + } +} + +/***************************************************************************/ +ACT_FN_GO(window_iconic_toggle) +{ + if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + { + E_Border *bd; + + bd = (E_Border *)obj; + if (bd->iconic) e_border_uniconify(bd); + else e_border_iconify(bd); + } +} + +/***************************************************************************/ +ACT_FN_GO(window_maximized_toggle) +{ + if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + { + E_Border *bd; + + bd = (E_Border *)obj; + if (bd->maximized) e_border_unmaximize(bd); + else e_border_maximize(bd); + } +} + +/***************************************************************************/ +ACT_FN_GO(window_shaded_toggle) +{ + if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + if (obj->type != E_BORDER_TYPE) + { + obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; + } + { + E_Border *bd; + + bd = (E_Border *)obj; + if (bd->shaded) e_border_unshade(bd, E_DIRECTION_UP); + else e_border_shade(bd, E_DIRECTION_UP); + } +} + /***************************************************************************/ ACT_FN_GO(desk_flip_by) { @@ -245,6 +353,141 @@ ACT_FN_GO(desk_linear_flip_to) } } +/***************************************************************************/ +static void +_e_actions_cb_menu_end(void *data, E_Menu *m) +{ + e_object_del(E_OBJECT(m)); +} +static E_Menu * +_e_actions_menu_find(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, "clients")) return e_int_menus_clients_new(); + return NULL; +} +ACT_FN_GO(menu_show) +{ + E_Zone *zone; + + /* menu is active - abort */ + if (e_menu_grab_window_get()) return; + if (!obj) return; + if (obj->type == E_MANAGER_TYPE) + { + zone = e_util_zone_current_get((E_Manager *)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_x_pointer_xy_get(zone->container->win, &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_DOWN); + } + } + } + } +} +ACT_FN_GO_MOUSE(menu_show) +{ + E_Zone *zone; + + /* menu is active - abort */ + if (e_menu_grab_window_get()) return; + if (!obj) return; + if (obj->type == E_MANAGER_TYPE) + { + zone = e_util_zone_current_get((E_Manager *)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; + x = ev->root.x; + y = ev->root.y; + x -= zone->container->x; + y -= zone->container->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_DOWN); + } + } + } + } +} +ACT_FN_GO_KEY(menu_show) +{ + E_Zone *zone; + + /* menu is active - abort */ + if (e_menu_grab_window_get()) return; + if (!obj) return; + if (obj->type == E_MANAGER_TYPE) + { + zone = e_util_zone_current_get((E_Manager *)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_x_pointer_xy_get(zone->container->win, &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(exec) +{ + E_Zone *zone; + + if (!obj) return; + if (obj->type != E_MANAGER_TYPE) return; + zone = e_util_zone_current_get((E_Manager *)obj); + if (zone) + { + if (params) + { + Ecore_Exe *exe; + + exe = ecore_exe_run(params, NULL); + if (exe) ecore_exe_free(exe); + } + } +} + + /* local subsystem globals */ static Evas_Hash *actions = NULL; @@ -267,12 +510,24 @@ e_actions_init(void) ACT_GO(window_menu); ACT_GO_MOUSE(window_menu); + ACT_GO_KEY(window_menu); ACT_GO(window_raise); ACT_GO(window_lower); + ACT_GO(window_close); + ACT_GO(window_kill); + + ACT_GO(window_sticky_toggle); + + ACT_GO(window_iconic_toggle); + + ACT_GO(window_maximized_toggle); + + ACT_GO(window_shaded_toggle); + ACT_GO(desk_flip_by); ACT_GO(desk_flip_to); @@ -280,6 +535,12 @@ e_actions_init(void) ACT_GO(desk_linear_flip_by); ACT_GO(desk_linear_flip_to); + + ACT_GO(menu_show); + ACT_GO_MOUSE(menu_show); + ACT_GO_KEY(menu_show); + + ACT_GO(exec); return 1; } diff --git a/src/bin/e_bindings.c b/src/bin/e_bindings.c index d61ea7264..cf174dc6c 100644 --- a/src/bin/e_bindings.c +++ b/src/bin/e_bindings.c @@ -61,6 +61,7 @@ e_bindings_init(void) e_bindings_mouse_add(E_BINDING_CONTEXT_BORDER, 3, E_BINDING_MODIFIER_ALT, 0, "window_menu", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, "Left", E_BINDING_MODIFIER_SHIFT | E_BINDING_MODIFIER_ALT, 0, "desk_flip_by", "-1 0"); @@ -82,6 +83,25 @@ e_bindings_init(void) e_bindings_key_add(E_BINDING_CONTEXT_ANY, "x", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, "window_close", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "k", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_kill", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "w", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_menu", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "s", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_sticky_toggle", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "i", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_iconic_toggle", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "f", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_maximized_toggle", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "r", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_shaded_toggle", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, "Left", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, "desk_linear_flip_by", "-1"); @@ -124,6 +144,46 @@ e_bindings_init(void) e_bindings_key_add(E_BINDING_CONTEXT_ANY, "F12", E_BINDING_MODIFIER_ALT, 0, "desk_linear_flip_to", "11"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "m", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "menu_show", "main"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "a", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "menu_show", "favorites"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Menu", 0, 0, + "menu_show", "main"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Menu", E_BINDING_MODIFIER_CTRL, 0, + "menu_show", "clients"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Menu", E_BINDING_MODIFIER_ALT, 0, + "menu_show", "favorites"); + + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Insert", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "exec", "Eterm"); + + /* shoudl do these - can't yet due to other things missing... */ + + /* need a yes/no dialog for these - to stop accidental logouts. for this + * i'd make a special case that can ask u to log out, restart or shut down + * or even reboot (if you have permissions to do so) + */ + /* CTRL+ALT Delete - logout */ + /* CTRL+ALT End - restart */ + + /* need a way to display all focused windows nicely - subsystem for + * this that also grabs the modifier on activate (if there are any) so + * on release of modifier(s) OR on any new action this list aborts display + */ + /* ALT Tab - next window focus */ + /* ALT_SHIFT Tab - prev window focus */ + + /* need to support fullscreen anyway for this - ie netwm and the border + * system need to handle this as well as possibly using xrandr/xvidmode + */ + /* ALT Return - fullscreen window */ return 1; } diff --git a/src/bin/e_border.c b/src/bin/e_border.c index cf2be771b..9be9ad8d4 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -68,7 +68,7 @@ static void _e_border_resize_handle(E_Border *bd); static int _e_border_shade_animator(void *data); static void _e_border_cb_border_menu_end(void *data, E_Menu *m); -static void _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y); +static void _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key); static void _e_border_menu_cb_close(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_iconify(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_maximize(void *data, E_Menu *m, E_Menu_Item *mi); @@ -1270,18 +1270,20 @@ e_border_act_resize_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Up *ev) } void -e_border_act_menu_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev) +e_border_act_menu_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev, int key) { if (ev) { - _e_border_menu_show(bd, bd->x + ev->x, bd->y + ev->y); + _e_border_menu_show(bd, + bd->x + ev->x - bd->zone->container->x, + bd->y + ev->y - bd->zone->container->y, key); } else { int x, y; - ecore_x_pointer_last_xy_get(&x, &y); - _e_border_menu_show(bd, x, y); + ecore_x_pointer_xy_get(bd->zone->container->win, &x, &y); + _e_border_menu_show(bd, x, y, key); } } @@ -1300,6 +1302,15 @@ e_border_act_close_begin(E_Border *bd) } } +void +e_border_act_kill_begin(E_Border *bd) +{ + ecore_x_kill(bd->client.win); + ecore_x_sync(); + e_border_hide(bd, 0); + e_object_del(E_OBJECT(bd)); +} + /* local subsystem functions */ static void _e_border_free(E_Border *bd) @@ -2172,7 +2183,7 @@ _e_border_cb_signal_action(void *data, Evas_Object *obj, const char *emission, c Evas_Coord x, y; evas_pointer_canvas_xy_get(bd->bg_evas , &x, &y); - _e_border_menu_show(bd, x + bd->x, y + bd->y); + _e_border_menu_show(bd, x + bd->x, y + bd->y, 0); } else if (!strcmp(source, "lower")) { @@ -3632,7 +3643,7 @@ _e_border_cb_border_menu_end(void *data, E_Menu *m) } static void -_e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y) +_e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key) { E_Menu *m; E_Menu_Item *mi; @@ -3744,9 +3755,12 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y) e_menu_item_callback_set(mi, _e_border_menu_cb_icon_edit, buf); } - e_menu_activate_mouse(m, bd->zone, x, y, 1, 1, + if (key) + e_menu_activate_key(m, bd->zone, x, y, 1, 1, E_MENU_POP_DIRECTION_DOWN); - + else + e_menu_activate_mouse(m, bd->zone, x, y, 1, 1, + E_MENU_POP_DIRECTION_DOWN); } static void @@ -3773,7 +3787,7 @@ _e_border_menu_cb_iconify(void *data, E_Menu *m, E_Menu_Item *mi) E_Border *bd; bd = data; - if (bd->maximized) e_border_uniconify(bd); + if (bd->iconic) e_border_uniconify(bd); else e_border_iconify(bd); } diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 20f272eb7..9b97ee672 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -352,9 +352,10 @@ EAPI void e_border_act_move_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down EAPI void e_border_act_move_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Up *ev); EAPI void e_border_act_resize_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev); EAPI void e_border_act_resize_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Up *ev); -EAPI void e_border_act_menu_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev); +EAPI void e_border_act_menu_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev, int key); EAPI void e_border_act_close_begin(E_Border *bd); - +EAPI void e_border_act_kill_begin(E_Border *bd); + extern EAPI int E_EVENT_BORDER_RESIZE; extern EAPI int E_EVENT_BORDER_MOVE; extern EAPI int E_EVENT_BORDER_ADD; diff --git a/src/bin/e_menu.c b/src/bin/e_menu.c index ab25e4a2e..399098c2f 100644 --- a/src/bin/e_menu.c +++ b/src/bin/e_menu.c @@ -151,8 +151,8 @@ e_menu_activate_key(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE); _e_menu_activate_time = 0.0; _e_menu_activate_internal(m, zone); - m->cur.x = 200; - m->cur.y = 200; + m->cur.x = x + w; + m->cur.y = y + h; _e_menu_activate_first(); } @@ -167,8 +167,8 @@ e_menu_activate_mouse(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int d E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE); _e_menu_activate_time = ecore_time_get(); _e_menu_activate_internal(m, zone); - m->cur.x = x; - m->cur.y = y; + m->cur.x = x + w; + m->cur.y = y + h; pmi = _e_menu_item_active_get(); if (pmi) e_menu_item_active_set(pmi, 0); diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index 105d8ca5a..74393bf1d 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -202,8 +202,8 @@ e_zone_current_get(E_Container *con) else { int x, y; - - ecore_x_pointer_last_xy_get(&x, &y); + + ecore_x_pointer_xy_get(con->win, &x, &y); for (l = con->zones; l; l = l->next) { E_Zone *zone; @@ -618,7 +618,7 @@ _e_zone_cb_timer(void *data) zone = data; - ecore_x_pointer_last_xy_get(&x, &y); + ecore_x_pointer_xy_get(zone->container->win, &x, &y); switch (zone->flip.direction) {