From 9f7013f03e2b5429c4649caf4fde656fac1589ee Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 29 Apr 2005 19:42:19 +0000 Subject: [PATCH] key bindings... um.. kinda... work... SVN revision: 14505 --- src/bin/e_actions.c | 113 +++++++++++++++++++++++++ src/bin/e_actions.h | 8 +- src/bin/e_bindings.c | 193 ++++++++++++++++++++++++++++++++++++++++++- src/bin/e_bindings.h | 6 ++ src/bin/e_border.c | 71 +++++++++++++--- src/bin/e_border.h | 7 +- src/bin/e_font.c | 41 ++++----- src/bin/e_main.c | 2 + src/bin/e_manager.c | 55 +++++++++++- src/bin/e_manager.h | 4 + src/bin/e_zone.c | 6 ++ src/bin/e_zone.h | 3 +- 12 files changed, 460 insertions(+), 49 deletions(-) diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 3855f80a7..566257f9b 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -18,6 +18,13 @@ } #define ACT_FN_GO_MOUSE(act) \ static void _e_actions_act_##act##_go_mouse(E_Object *obj, char *params, Ecore_X_Event_Mouse_Button_Down *ev) +#define ACT_GO_KEY(name) \ + { \ + act = e_action_set(#name); \ + if (act) act->func.go_key = _e_actions_act_##name##_go_key; \ + } +#define ACT_FN_GO_KEY(act) \ + static void _e_actions_act_##act##_go_key(E_Object *obj, char *params, Ecore_X_Event_Key_Down *ev) #define ACT_END(name) \ { \ act = e_action_set(#name); \ @@ -32,6 +39,13 @@ } #define ACT_FN_END_MOUSE(act) \ static void _e_actions_act_##act##_end_mouse(E_Object *obj, char *params, Ecore_X_Event_Mouse_Button_Up *ev) +#define ACT_END_KEY(name) \ + { \ + act = e_action_set(#name); \ + if (act) act->func.end_key = _e_actions_act_##name##_end_key; \ + } +#define ACT_FN_END_KEY(act) \ + static void _e_actions_act_##act##_end_key(E_Object *obj, char *params, Ecore_X_Event_Key_Up *ev) /* local subsystem functions */ @@ -40,24 +54,28 @@ ACT_FN_GO(window_move) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_move_begin((E_Border *)obj, NULL); } ACT_FN_GO_MOUSE(window_move) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_move_begin((E_Border *)obj, ev); } ACT_FN_END(window_move) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_move_end((E_Border *)obj, NULL); } ACT_FN_END_MOUSE(window_move) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_move_end((E_Border *)obj, ev); } @@ -66,24 +84,28 @@ ACT_FN_END_MOUSE(window_move) ACT_FN_GO(window_resize) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_resize_begin((E_Border *)obj, NULL); } ACT_FN_GO_MOUSE(window_resize) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_resize_begin((E_Border *)obj, ev); } ACT_FN_END(window_resize) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_resize_end((E_Border *)obj, NULL); } ACT_FN_END_MOUSE(window_resize) { if (!obj) obj = E_OBJECT(e_border_focused_get()); + if (!obj) return; if (obj->type != E_BORDER_TYPE) return; e_border_act_resize_end((E_Border *)obj, ev); } @@ -92,16 +114,100 @@ ACT_FN_END_MOUSE(window_resize) 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); } 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); } +/***************************************************************************/ +ACT_FN_GO(window_raise) +{ + 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_raise((E_Border *)obj); +} + +/***************************************************************************/ +ACT_FN_GO(window_lower) +{ + 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_lower((E_Border *)obj); +} + +/***************************************************************************/ +ACT_FN_GO(window_close) +{ + 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_close_begin((E_Border *)obj); +} + +/***************************************************************************/ +ACT_FN_GO(desk_flip_by) +{ + E_Container *con; + + if (!obj) return; + if (obj->type != E_MANAGER_TYPE) return; + con = e_manager_container_current_get((E_Manager *)obj); + if (con) + { + E_Zone *zone; + + zone = e_zone_current_get(con); + if (zone) + { + E_Desk *desk; + int dx = 0, dy = 0; + + if (params) + { + if (sscanf(params, "%i %i", &dx, &dy) != 2) + { + dx = 0; + dy = 0; + } + } + dx = zone->desk_x_current + dx; + if (dx < 0) dx = 0; + else if (dx >= zone->desk_x_count) dx = zone->desk_x_count - 1; + dy = zone->desk_x_current + dy; + if (dy < 0) dy = 0; + else if (dy >= zone->desk_y_count) dy = zone->desk_y_count - 1; + desk = e_desk_at_xy_get(zone, dx, dy); + if (desk) + { + ecore_x_window_focus(con->manager->root); + e_desk_show(desk); + e_zone_update_flip(zone); + } + } + } +} + /* local subsystem globals */ static Evas_Hash *actions = NULL; @@ -125,6 +231,13 @@ e_actions_init(void) ACT_GO(window_menu); ACT_GO_MOUSE(window_menu); + ACT_GO(window_raise); + + ACT_GO(window_lower); + ACT_GO(window_close); + + ACT_GO(desk_flip_by); + return 1; } diff --git a/src/bin/e_actions.h b/src/bin/e_actions.h index e47440dc1..b114ffb14 100644 --- a/src/bin/e_actions.h +++ b/src/bin/e_actions.h @@ -9,10 +9,12 @@ struct _E_Action { char *name; struct { - void (*go) (E_Object *obj, char *params); - void (*go_mouse) (E_Object *obj, char *params, Ecore_X_Event_Mouse_Button_Down *ev); - void (*end) (E_Object *obj, char *params); + void (*go) (E_Object *obj, char *params); + void (*go_mouse) (E_Object *obj, char *params, Ecore_X_Event_Mouse_Button_Down *ev); + void (*go_key) (E_Object *obj, char *params, Ecore_X_Event_Key_Down *ev); + void (*end) (E_Object *obj, char *params); void (*end_mouse) (E_Object *obj, char *params, Ecore_X_Event_Mouse_Button_Up *ev); + void (*end_key) (E_Object *obj, char *params, Ecore_X_Event_Key_Up *ev); } func; }; diff --git a/src/bin/e_bindings.c b/src/bin/e_bindings.c index 9e5768270..df6d541be 100644 --- a/src/bin/e_bindings.c +++ b/src/bin/e_bindings.c @@ -38,6 +38,7 @@ struct _E_Binding_Signal }; static void _e_bindings_mouse_free(E_Binding_Mouse *bind); +static void _e_bindings_key_free(E_Binding_Key *bind); static int _e_bindings_context_match(E_Binding_Context bctxt, E_Binding_Context ctxt); /* local subsystem globals */ @@ -60,12 +61,34 @@ 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"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Right", E_BINDING_MODIFIER_SHIFT | E_BINDING_MODIFIER_ALT, 0, + "desk_flip_by", "1 0"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Up", E_BINDING_MODIFIER_SHIFT | E_BINDING_MODIFIER_ALT, 0, + "desk_flip_by", "0 -1"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Down", E_BINDING_MODIFIER_SHIFT | E_BINDING_MODIFIER_ALT, 0, + "desk_flip_by", "0 -1"); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Up", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_raise", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "Down", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_lower", ""); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, + "x", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, + "window_close", ""); return 1; } int e_bindings_shutdown(void) { + /* FIXME: free bindings */ return 1; } @@ -118,7 +141,7 @@ e_bindings_mouse_grab(E_Binding_Context ctxt, Ecore_X_Window win) E_Binding_Mouse *bind; bind = l->data; - if (bind->ctxt == ctxt) + if (_e_bindings_context_match(bind->ctxt, ctxt)) { int mod; @@ -146,7 +169,7 @@ e_bindings_mouse_ungrab(E_Binding_Context ctxt, Ecore_X_Window win) E_Binding_Mouse *bind; bind = l->data; - if (bind->ctxt == ctxt) + if (_e_bindings_context_match(bind->ctxt, ctxt)) { int mod; @@ -238,17 +261,170 @@ e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_ } /* FIXME: finish off key bindings */ +void +e_bindings_key_add(E_Binding_Context ctxt, char *key, E_Binding_Modifier mod, int any_mod, char *action, char *params) +{ + E_Binding_Key *bind; + + bind = calloc(1, sizeof(E_Binding_Key)); + bind->ctxt = ctxt; + bind->key = strdup(key); + bind->mod = mod; + bind->any_mod = any_mod; + bind->action = strdup(action); + bind->params = strdup(params); + key_bindings = evas_list_append(key_bindings, bind); +} + +void +e_bindings_key_del(E_Binding_Context ctxt, char *key, E_Binding_Modifier mod, int any_mod, char *action, char *params) +{ + Evas_List *l; + + for (l = key_bindings; l; l = l->next) + { + E_Binding_Key *bind; + + bind = l->data; + if ((bind->ctxt == ctxt) && + (!strcmp(bind->key, key)) && + (bind->mod == mod) && + (bind->any_mod == any_mod) && + (!strcmp(bind->action, action)) && + (!strcmp(bind->params, params))) + { + _e_bindings_key_free(bind); + key_bindings = evas_list_remove_list(key_bindings, l); + break; + } + } +} + +void +e_bindings_key_grab(E_Binding_Context ctxt, Ecore_X_Window win) +{ + Evas_List *l; + + printf("GRAB KEYS %p\n", key_bindings); + for (l = key_bindings; l; l = l->next) + { + E_Binding_Key *bind; + + bind = l->data; + if (_e_bindings_context_match(bind->ctxt, ctxt)) + { + int mod; + + mod = 0; + if (bind->mod & E_BINDING_MODIFIER_SHIFT) mod |= ECORE_X_MODIFIER_SHIFT; + if (bind->mod & E_BINDING_MODIFIER_CTRL) mod |= ECORE_X_MODIFIER_CTRL; + if (bind->mod & E_BINDING_MODIFIER_ALT) mod |= ECORE_X_MODIFIER_ALT; + if (bind->mod & E_BINDING_MODIFIER_WIN) mod |= ECORE_X_MODIFIER_WIN; + printf("BIND %x %s %x %i\n", win, bind->key, mod, bind->any_mod); + ecore_x_window_key_grab(win, bind->key, + mod, bind->any_mod); + } + } +} + +void +e_bindings_key_ungrab(E_Binding_Context ctxt, Ecore_X_Window win) +{ + Evas_List *l; + + for (l = key_bindings; l; l = l->next) + { + E_Binding_Key *bind; + + bind = l->data; + if (_e_bindings_context_match(bind->ctxt, ctxt)) + { + int mod; + + mod = 0; + if (bind->mod & E_BINDING_MODIFIER_SHIFT) mod |= ECORE_X_MODIFIER_SHIFT; + if (bind->mod & E_BINDING_MODIFIER_CTRL) mod |= ECORE_X_MODIFIER_CTRL; + if (bind->mod & E_BINDING_MODIFIER_ALT) mod |= ECORE_X_MODIFIER_ALT; + if (bind->mod & E_BINDING_MODIFIER_WIN) mod |= ECORE_X_MODIFIER_WIN; + ecore_x_window_key_ungrab(win, bind->key, + mod, bind->any_mod); + } + } +} + int e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Down *ev) { E_Binding_Modifier mod = 0; Evas_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 = key_bindings; l; l = l->next) + { + E_Binding_Key *bind; + + bind = l->data; + if ((!strcmp(bind->key, ev->keyname)) && + ((bind->any_mod) || (bind->mod == mod))) + { + if (_e_bindings_context_match(bind->ctxt, ctxt)) + { + E_Action *act; + + act = e_action_find(bind->action); + if (act) + { + if (act->func.go_key) + act->func.go_key(obj, bind->params, ev); + else if (act->func.go) + act->func.go(obj, bind->params); + return 1; + } + return 0; + } + } + } + return 0; +} + +int +e_bindings_key_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Up *ev) +{ + E_Binding_Modifier mod = 0; + Evas_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 = key_bindings; l; l = l->next) + { + E_Binding_Key *bind; + + bind = l->data; + if ((!strcmp(bind->key, ev->keyname)) && + ((bind->any_mod) || (bind->mod == mod))) + { + if (_e_bindings_context_match(bind->ctxt, ctxt)) + { + E_Action *act; + + act = e_action_find(bind->action); + if (act) + { + if (act->func.end_key) + act->func.end_key(obj, bind->params, ev); + else if (act->func.end) + act->func.end(obj, bind->params); + return 1; + } + return 0; + } + } + } return 0; } @@ -271,10 +447,19 @@ _e_bindings_mouse_free(E_Binding_Mouse *bind) free(bind); } +static void +_e_bindings_key_free(E_Binding_Key *bind) +{ + E_FREE(bind->key); + E_FREE(bind->action); + E_FREE(bind->params); + free(bind); +} + static int _e_bindings_context_match(E_Binding_Context bctxt, E_Binding_Context ctxt) { - if (bctxt) return 1; + if (bctxt == E_BINDING_CONTEXT_ANY) return 1; if (ctxt == E_BINDING_CONTEXT_UNKNOWN) return 0; if (bctxt == ctxt) return 1; return 0; diff --git a/src/bin/e_bindings.h b/src/bin/e_bindings.h index a4bb4f03e..ec507f92d 100644 --- a/src/bin/e_bindings.h +++ b/src/bin/e_bindings.h @@ -9,6 +9,7 @@ typedef enum _E_Binding_Context E_BINDING_CONTEXT_UNKNOWN, E_BINDING_CONTEXT_BORDER, E_BINDING_CONTEXT_ZONE, + E_BINDING_CONTEXT_MANAGER, E_BINDING_CONTEXT_ANY } E_Binding_Context; @@ -38,7 +39,12 @@ EAPI void e_bindings_mouse_ungrab(E_Binding_Context ctxt, Ecore_X_Window EAPI int e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev); EAPI int e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev); +EAPI void e_bindings_key_add(E_Binding_Context ctxt, char *key, E_Binding_Modifier mod, int any_mod, char *action, char *params); +EAPI void e_bindings_key_del(E_Binding_Context ctxt, char *key, E_Binding_Modifier mod, int any_mod, char *action, char *params); +EAPI void e_bindings_key_grab(E_Binding_Context ctxt, Ecore_X_Window win); +EAPI void e_bindings_key_ungrab(E_Binding_Context ctxt, Ecore_X_Window win); EAPI int e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Down *ev); +EAPI int e_bindings_key_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Up *ev); EAPI int e_bindings_signal_handle(E_Binding_Context ctxt, E_Object *obj, char *sig, char *src); diff --git a/src/bin/e_border.c b/src/bin/e_border.c index f74dc3a49..fda3b47a5 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -108,6 +108,8 @@ static void _e_border_move_update(E_Border *bd); static void _e_border_reorder_after(E_Border *bd, E_Border *after); static void _e_border_reorder_before(E_Border *bd, E_Border *before); +static int _e_border_cb_focus_fix(void *data); + /* local subsystem globals */ static Evas_List *handlers = NULL; static Evas_List *borders = NULL; @@ -116,6 +118,8 @@ static E_Border *focused = NULL; static E_Border *resize = NULL; static E_Border *move = NULL; +static Ecore_Timer *focus_fix_timer = NULL; + int E_EVENT_BORDER_ADD = 0; int E_EVENT_BORDER_REMOVE = 0; int E_EVENT_BORDER_ZONE_SET = 0; @@ -177,6 +181,8 @@ e_border_init(void) E_EVENT_BORDER_LOWER = ecore_event_type_new(); E_EVENT_BORDER_ICON_CHANGE = ecore_event_type_new(); + focus_fix_timer = ecore_timer_add(0.5, _e_border_cb_focus_fix, NULL); + return 1; } @@ -191,6 +197,8 @@ e_border_shutdown(void) handlers = evas_list_remove_list(handlers, handlers); ecore_event_handler_del(h); } + ecore_timer_del(focus_fix_timer); + focus_fix_timer = NULL; return 1; } @@ -235,6 +243,7 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map) e_canvas_del(bd->bg_ecore_evas); ecore_evas_free(bd->bg_ecore_evas); ecore_x_window_del(bd->client.shell_win); + e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win); ecore_x_window_del(bd->win); free(bd); return NULL; @@ -703,7 +712,7 @@ e_border_focus_set(E_Border *bd, int focus, int set) else { // printf("remove focus\n"); - ecore_x_window_focus(bd->container->manager->win); + ecore_x_window_focus(bd->container->manager->root); // e_hints_active_window_set(bd->container->manager, NULL); } } @@ -1197,7 +1206,7 @@ e_border_act_move_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev) } void -e_border_act_move_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev) +e_border_act_move_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Up *ev) { if (bd->moving) { @@ -1251,7 +1260,7 @@ e_border_act_resize_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev) } void -e_border_act_resize_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev) +e_border_act_resize_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Up *ev) { if (bd->resize_mode != RESIZE_NONE) { @@ -1276,6 +1285,21 @@ e_border_act_menu_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev) } } +void +e_border_act_close_begin(E_Border *bd) +{ + if (bd->client.icccm.delete_request) + ecore_x_window_delete_request_send(bd->client.win); + else + { + ecore_x_kill(bd->client.win); + ecore_x_sync(); +// ecore_x_window_del(bd->client.win); + e_border_hide(bd, 0); + e_object_del(E_OBJECT(bd)); + } +} + /* local subsystem functions */ static void _e_border_free(E_Border *bd) @@ -1320,6 +1344,7 @@ _e_border_free(E_Border *bd) e_canvas_del(bd->bg_ecore_evas); ecore_evas_free(bd->bg_ecore_evas); ecore_x_window_del(bd->client.shell_win); + e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win); ecore_x_window_del(bd->win); bd->container->clients = evas_list_remove(bd->container->clients, bd); @@ -1818,6 +1843,7 @@ _e_border_cb_window_focus_out(void *data, int ev_type, void *ev) if (e->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR) return 1; else if (e->detail == ECORE_X_EVENT_DETAIL_INFERIOR) return 1; else if (e->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL) return 1; + else if (e->detail == ECORE_X_EVENT_DETAIL_ANCESTOR) return 1; } else if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) { @@ -2109,16 +2135,7 @@ _e_border_cb_signal_action(void *data, Evas_Object *obj, const char *emission, c printf("action %s\n", source); if (!strcmp(source, "close")) { - if (bd->client.icccm.delete_request) - ecore_x_window_delete_request_send(bd->client.win); - else - { - ecore_x_kill(bd->client.win); - ecore_x_sync(); -// ecore_x_window_del(bd->client.win); - e_border_hide(bd, 0); - e_object_del(E_OBJECT(bd)); - } + e_border_act_close_begin(bd); } else if (!strcmp(source, "shade_up") || !strcmp(source, "shade")) { @@ -4127,3 +4144,31 @@ _e_border_reorder_before(E_Border *bd, E_Border *before) borders = evas_list_prepend(borders, bd); } } + +static int +_e_border_cb_focus_fix(void *data) +{ + if (!focused) + { +/* + Evas_List *managers; + E_Manager *man; + + managers = e_manager_list(); + if (managers) + { + E_Container *con; + + man = managers->data; + con = e_manager_container_current_get(man); + if (con) + { + printf("set foc to %x [%x]\n", + man->focus_win, ecore_x_window_focus_get()); + ecore_x_window_focus(man->root); + } + } + */ + } + return 1; +} diff --git a/src/bin/e_border.h b/src/bin/e_border.h index aaa6e9dc8..b3c494246 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -348,11 +348,12 @@ EAPI void e_border_idler_before(void); EAPI Evas_List *e_border_clients_get(); EAPI void e_border_act_move_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev); -EAPI void e_border_act_move_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev); +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_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_close_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_font.c b/src/bin/e_font.c index b26f48909..f693835a6 100644 --- a/src/bin/e_font.c +++ b/src/bin/e_font.c @@ -37,6 +37,7 @@ e_font_apply(void) /* setup edje fallback list */ blen = sizeof(buf) - 1; + buf[0] = 0; buf[blen] = 0; next = e_config->font_fallbacks; if (next) @@ -49,33 +50,27 @@ e_font_apply(void) blen -= len; } next = evas_list_next(next); - } - else - { - edje_fontset_append_set(NULL); - } - - while (next) - { - eff = evas_list_data(next); - len = 1; - if (len < blen) + while (next) { - strcat(buf, ","); - blen -= len; + eff = evas_list_data(next); + len = 1; + if (len < blen) + { + strcat(buf, ","); + blen -= len; + } + len = strlen(eff->name); + if (len < blen) + { + strcat(buf, eff->name); + blen -= len; + } + next = evas_list_next(next); } - len = strlen(eff->name); - if (len < blen) - { - strcat(buf, eff->name); - blen -= len; - } - next = evas_list_next(next); - } - if (buf[0] != 0) - { edje_fontset_append_set(buf); } + else + edje_fontset_append_set(NULL); /* setup edje text classes */ for (next = e_config->font_defaults; next; next = next->next) diff --git a/src/bin/e_main.c b/src/bin/e_main.c index c58e12042..f5e427069 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -375,6 +375,8 @@ main(int argc, char **argv) /* an idle enterer to be called after all others */ _e_main_idle_enterer_after = ecore_idle_enterer_add(_e_main_cb_idler_after, NULL); + e_managers_keys_grab(); + ecore_x_ungrab(); e_init_title_set(_("Enlightenment")); diff --git a/src/bin/e_manager.c b/src/bin/e_manager.c index b13050932..8e345efe4 100644 --- a/src/bin/e_manager.c +++ b/src/bin/e_manager.c @@ -8,6 +8,7 @@ static void _e_manager_free(E_Manager *man); static int _e_manager_cb_window_show_request(void *data, int ev_type, void *ev); static int _e_manager_cb_window_configure(void *data, int ev_type, void *ev); +static int _e_manager_cb_key_down(void *data, int ev_type, void *ev); #if 0 /* use later - maybe */ static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev); static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev); @@ -85,10 +86,14 @@ e_manager_new(Ecore_X_Window root) { man->win = man->root; } + man->focus_win = ecore_x_window_override_new(man->root, -1, -1, 1, 1); + ecore_x_window_show(man->focus_win); h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, _e_manager_cb_window_show_request, man); if (h) man->handlers = evas_list_append(man->handlers, h); h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _e_manager_cb_window_configure, man); if (h) man->handlers = evas_list_append(man->handlers, h); + h = ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN, _e_manager_cb_key_down, man); + if (h) man->handlers = evas_list_append(man->handlers, h); return man; } @@ -361,6 +366,34 @@ e_manager_container_number_get(E_Manager *man, int num) return NULL; } +void +e_managers_keys_grab(void) +{ + Evas_List *l; + + for (l = managers; l; l = l->next) + { + E_Manager *man; + + man = l->data; + e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root); + } +} + +void +e_managers_keys_ungrab(void) +{ + Evas_List *l; + + for (l = managers; l; l = l->next) + { + E_Manager *man; + + man = l->data; + e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root); + } +} + /* local subsystem functions */ static void _e_manager_free(E_Manager *man) @@ -381,6 +414,7 @@ _e_manager_free(E_Manager *man) l = l->next; e_object_del(E_OBJECT(tmp->data)); } + ecore_x_window_del(man->focus_win); if (man->root != man->win) { ecore_x_window_del(man->win); @@ -390,7 +424,7 @@ _e_manager_free(E_Manager *man) } static int -_e_manager_cb_window_show_request(void *data __UNUSED__, int ev_type __UNUSED__, void *ev) +_e_manager_cb_window_show_request(void *data, int ev_type __UNUSED__, void *ev) { E_Manager *man; Ecore_X_Event_Window_Show_Request *e; @@ -419,7 +453,7 @@ _e_manager_cb_window_show_request(void *data __UNUSED__, int ev_type __UNUSED__, } static int -_e_manager_cb_window_configure(void *data __UNUSED__, int ev_type __UNUSED__, void *ev) +_e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev) { E_Manager *man; Ecore_X_Event_Window_Configure *e; @@ -431,6 +465,23 @@ _e_manager_cb_window_configure(void *data __UNUSED__, int ev_type __UNUSED__, vo return 1; } +static int +_e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev) +{ + E_Manager *man; + Ecore_X_Event_Key_Down *e; + + man = data; + e = ev; + printf("KEY %s [%x %x]\n", + e->keyname, e->win, e->event_win); + if ((e->event_win != man->root) && + (e->event_win != man->focus_win)) return 1; + if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev)) + return 0; + return 1; +} + #if 0 /* use later - maybe */ static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev){return 1;} static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev){return 1;} diff --git a/src/bin/e_manager.h b/src/bin/e_manager.h index 9e60812bb..11522843a 100644 --- a/src/bin/e_manager.h +++ b/src/bin/e_manager.h @@ -19,6 +19,7 @@ struct _E_Manager int x, y, w, h; char visible : 1; Ecore_X_Window root; + Ecore_X_Window focus_win; Evas_List *handlers; Evas_List *containers; }; @@ -40,5 +41,8 @@ EAPI void e_manager_lower(E_Manager *man); EAPI E_Container *e_manager_container_current_get(E_Manager *man); EAPI E_Container *e_manager_container_number_get(E_Manager *man, int num); +EAPI void e_managers_keys_grab(void); +EAPI void e_managers_keys_ungrab(void); + #endif #endif diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index 9b96ca7ba..ad7a0bbf9 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -493,6 +493,12 @@ e_zone_desk_count_get(E_Zone *zone, int *x_count, int *y_count) *y_count = zone->desk_y_count; } +void +e_zone_update_flip(E_Zone *zone) +{ + _e_zone_update_flip(zone); +} + static void _e_zone_event_zone_desk_count_set_free(void *data, void *ev) { diff --git a/src/bin/e_zone.h b/src/bin/e_zone.h index c3e7ebca9..c0187797f 100644 --- a/src/bin/e_zone.h +++ b/src/bin/e_zone.h @@ -57,7 +57,8 @@ EAPI void e_zone_bg_reconfigure(E_Zone *zone); EAPI void e_zone_flip_coords_handle(E_Zone *zone, int x, int y); EAPI void e_zone_desk_count_set(E_Zone *zone, int x_count, int y_count); EAPI void e_zone_desk_count_get(E_Zone *zone, int *x_count, int *y_count); - +EAPI void e_zone_update_flip(E_Zone *zone); + extern EAPI int E_EVENT_ZONE_DESK_COUNT_SET; #endif