diff --git a/data/config/behavior/default/actions.db b/data/config/behavior/default/actions.db index 2dff2fd8b..aec13cc5a 100644 Binary files a/data/config/behavior/default/actions.db and b/data/config/behavior/default/actions.db differ diff --git a/data/config/behavior/default/grabs.db b/data/config/behavior/default/grabs.db index a3c6bd868..ba5c2cf21 100644 Binary files a/data/config/behavior/default/grabs.db and b/data/config/behavior/default/grabs.db differ diff --git a/data/config/behavior/default/settings.db b/data/config/behavior/default/settings.db index d3774d297..d514e1f51 100644 Binary files a/data/config/behavior/default/settings.db and b/data/config/behavior/default/settings.db differ diff --git a/data/scripts/build_db.sh b/data/scripts/build_db.sh index 88337f2c9..7121b7238 100755 --- a/data/scripts/build_db.sh +++ b/data/scripts/build_db.sh @@ -16,6 +16,7 @@ MOD_SHIFT=1 MOD_CTRL=2 MOD_ALT=4 MOD_WIN=8 +MOD_CTRL_ALT=$[ $MOD_CTRL + $MOD_ALT ]; FOCUS_POINTER=0 FOCUS_SLOPPY=1 @@ -152,6 +153,30 @@ edb_ed $DB add "/actions/"$NUM"/button" int 1 edb_ed $DB add "/actions/"$NUM"/key" str "" edb_ed $DB add "/actions/"$NUM"/modifiers" int $MOD_NONE NUM=$[ $NUM + 1 ]; +edb_ed $DB add "/actions/"$NUM"/name" str "Key_Binding" +edb_ed $DB add "/actions/"$NUM"/action" str "Restart" +edb_ed $DB add "/actions/"$NUM"/params" str "" +edb_ed $DB add "/actions/"$NUM"/event" int $ACT_KEY_DOWN +edb_ed $DB add "/actions/"$NUM"/button" int 0 +edb_ed $DB add "/actions/"$NUM"/key" str "End" +edb_ed $DB add "/actions/"$NUM"/modifiers" int $MOD_CTRL_ALT +NUM=$[ $NUM + 1 ]; +edb_ed $DB add "/actions/"$NUM"/name" str "Key_Binding" +edb_ed $DB add "/actions/"$NUM"/action" str "Exit" +edb_ed $DB add "/actions/"$NUM"/params" str "" +edb_ed $DB add "/actions/"$NUM"/event" int $ACT_KEY_DOWN +edb_ed $DB add "/actions/"$NUM"/button" int 0 +edb_ed $DB add "/actions/"$NUM"/key" str "Delete" +edb_ed $DB add "/actions/"$NUM"/modifiers" int $MOD_CTRL_ALT +NUM=$[ $NUM + 1 ]; +edb_ed $DB add "/actions/"$NUM"/name" str "Key_Binding" +edb_ed $DB add "/actions/"$NUM"/action" str "Window_Max_Size" +edb_ed $DB add "/actions/"$NUM"/params" str "" +edb_ed $DB add "/actions/"$NUM"/event" int $ACT_KEY_DOWN +edb_ed $DB add "/actions/"$NUM"/button" int 0 +edb_ed $DB add "/actions/"$NUM"/key" str "m" +edb_ed $DB add "/actions/"$NUM"/modifiers" int $MOD_CTRL_ALT +NUM=$[ $NUM + 1 ]; edb_ed $DB add "/actions/count" int $NUM # basic settings diff --git a/src/Makefile.am b/src/Makefile.am index 8fb84f5a9..944508126 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,6 +18,7 @@ fs.c \ icccm.c \ icons.c \ ipc.c \ +keys.c \ main.c \ menu.c \ menudb.c \ @@ -28,5 +29,5 @@ util.c \ view.c \ e.h -enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ @efsd_libs@ -lm $(INTLLIBS) $(LDADD_FLAGS) +enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ @efsd_libs@ -lm $(INTLLIBS) diff --git a/src/actions.c b/src/actions.c index 909fbc826..314dd23d0 100644 --- a/src/actions.c +++ b/src/actions.c @@ -124,6 +124,16 @@ _e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mo a->object = NULL; a->started = 0; actions = evas_list_append(actions, a); + /* it's a key? lets grab it! */ + if ((a->key) && (strlen(a->key) > 0)) + { + printf("grab it! (%s %i)\n", a->key, a->modifiers); + if (a->modifiers == -1) + e_keys_grab(a->key, EV_KEY_MODIFIER_NONE, 1); + else + e_keys_grab(a->key, (Ev_Key_Modifiers)a->modifiers, 0); + a->grabbed = 1; + } } error: e_db_close(db); @@ -185,6 +195,15 @@ _e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mo static void _e_action_free(E_Action *a) { + /* it's a key? lets ungrab it! */ + if ((a->key) && (strlen(a->key) > 0) && (a->grabbed)) + { + printf("ungrab it! (%s %i)\n", a->key, a->modifiers); + if (a->modifiers == -1) + e_keys_ungrab(a->key, EV_KEY_MODIFIER_NONE, 1); + else + e_keys_ungrab(a->key, (Ev_Key_Modifiers)a->modifiers, 0); + } IF_FREE(a->name); IF_FREE(a->action); IF_FREE(a->params); @@ -466,6 +485,8 @@ e_act_move_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; b->mode.move = 1; b->current.requested.dx = 0; b->current.requested.dy = 0; @@ -486,6 +507,8 @@ e_act_move_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int ry E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; b->current.requested.x = b->current.x; b->current.requested.y = b->current.y; b->changed = 1; @@ -510,6 +533,8 @@ e_act_move_go (void *o, E_Action *a, void *data, int x, int y, int rx, int ry E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; b->current.requested.x += dx; b->current.requested.y += dy; if (dx != 0) b->current.requested.dx = dx; @@ -532,6 +557,8 @@ e_act_resize_start (void *o, E_Action *a, void *data, int x, int y, int rx, int E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; /* 0 | 1 */ /* --+-- */ @@ -575,6 +602,8 @@ e_act_resize_stop (void *o, E_Action *a, void *data, int x, int y, int rx, int E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; b->current.requested.x = b->current.x; b->current.requested.y = b->current.y; @@ -598,6 +627,8 @@ e_act_resize_go (void *o, E_Action *a, void *data, int x, int y, int rx, int E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; if (b->mode.resize == 0) { @@ -641,6 +672,8 @@ e_act_resize_h_start (void *o, E_Action *a, void *data, int x, int y, int rx, in E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; /* 4 | 5 */ if (x > (b->current.w / 2)) @@ -667,6 +700,8 @@ e_act_resize_h_stop (void *o, E_Action *a, void *data, int x, int y, int rx, in E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; b->current.requested.x = b->current.x; b->current.requested.y = b->current.y; @@ -690,6 +725,8 @@ e_act_resize_h_go (void *o, E_Action *a, void *data, int x, int y, int rx, in E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; if (b->mode.resize == 4) { @@ -719,6 +756,8 @@ e_act_resize_v_start (void *o, E_Action *a, void *data, int x, int y, int rx, in E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; /* 6 */ /* - */ @@ -747,6 +786,8 @@ e_act_resize_v_stop (void *o, E_Action *a, void *data, int x, int y, int rx, in E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; b->current.requested.x = b->current.x; b->current.requested.y = b->current.y; @@ -770,6 +811,8 @@ e_act_resize_v_go (void *o, E_Action *a, void *data, int x, int y, int rx, in E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded != 0) return; if (b->mode.resize == 6) { @@ -799,6 +842,8 @@ e_act_close_start (void *o, E_Action *a, void *data, int x, int y, int rx, int r E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->win.client) e_icccm_delete(b->win.client); return; UN(a); @@ -816,6 +861,8 @@ e_act_kill_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->win.client) e_window_kill_client(b->win.client); return; UN(a); @@ -837,6 +884,8 @@ e_act_cb_shade(int val, void *data) int pix_per_sec = 3200; b = data; + if (!b) b = e_border_current_focused(); + if (!b) return; if (val == 0) { OBJ_REF(b); @@ -875,6 +924,8 @@ e_act_cb_unshade(int val, void *data) int pix_per_sec = 3200; b = data; + if (!b) b = e_border_current_focused(); + if (!b) return; if (val == 0) { OBJ_REF(b); @@ -909,6 +960,8 @@ e_act_shade_start (void *o, E_Action *a, void *data, int x, int y, int rx, int r E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded == 0) e_act_cb_shade(0, b); else e_act_cb_unshade(0, b); return; @@ -927,6 +980,8 @@ e_act_raise_start (void *o, E_Action *a, void *data, int x, int y, int rx, int r E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; e_border_raise(b); return; UN(a); @@ -944,6 +999,8 @@ e_act_lower_start (void *o, E_Action *a, void *data, int x, int y, int rx, int r E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; e_border_lower(b); return; UN(a); @@ -961,6 +1018,8 @@ e_act_raise_lower_start (void *o, E_Action *a, void *data, int x, int y, int rx, E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; return; UN(a); UN(data); @@ -993,6 +1052,8 @@ e_act_menu_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; return; UN(a); UN(data); @@ -1043,6 +1104,8 @@ e_act_stick_start (void *o, E_Action *a, void *data, int x, int y, int rx, int r E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->client.sticky) b->client.sticky = 0; else b->client.sticky = 1; b->changed = 1; @@ -1078,6 +1141,8 @@ e_act_iconify_start (void *o, E_Action *a, void *data, int x, int y, int rx, int E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; return; UN(a); UN(data); @@ -1094,6 +1159,9 @@ e_act_max_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry) E_Border *b; b = o; + printf("e_act_max_start\n"); + if (!b) b = e_border_current_focused(); + if (!b) return; if (b->current.shaded > 0) return; if ((b->mode.move) || (b->mode.resize)) return; b->mode.move = 0; @@ -1146,6 +1214,8 @@ e_act_snap_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; return; UN(a); UN(data); @@ -1162,6 +1232,8 @@ e_act_zoom_start (void *o, E_Action *a, void *data, int x, int y, int rx, int ry E_Border *b; b = o; + if (!b) b = e_border_current_focused(); + if (!b) return; return; UN(a); UN(data); diff --git a/src/border.c b/src/border.c index b3de4dcc7..be2d62838 100644 --- a/src/border.c +++ b/src/border.c @@ -385,6 +385,7 @@ e_focus_in(Eevent * ev) if (b) { b->current.selected = 1; + if (e->key_grab) b->current.select_lost_from_grab = 0; b->changed = 1; } } @@ -413,6 +414,7 @@ e_focus_out(Eevent * ev) E_CONFIG_INT_GET(cfg_focus_mode, focus_mode); b->current.selected = 0; + if (e->key_grab) b->current.select_lost_from_grab = 1; /* settings - click to focus would affect grabs */ if (!b->current.selected) { @@ -2105,3 +2107,25 @@ e_border_adopt_children(Window win) free(wins); } } + +E_Border * +e_border_current_focused(void) +{ + Evas_List l; + + for (l = borders; l; l = l->next) + { + E_Border *b; + + b = l->data; + if (b->current.selected) return b; + } + for (l = borders; l; l = l->next) + { + E_Border *b; + + b = l->data; + if (b->current.select_lost_from_grab) return b; + } + return NULL; +} diff --git a/src/e.h b/src/e.h index b7132080d..bec052de4 100644 --- a/src/e.h +++ b/src/e.h @@ -191,6 +191,7 @@ struct _E_Border int x, y, w, h; int visible; int selected; + int select_lost_from_grab; int shaded; int has_shape; int shape_changes; @@ -267,6 +268,7 @@ struct _E_Action E_Action_Proto *action_proto; void *object; int started; + int grabbed; }; struct _E_Action_Proto @@ -713,7 +715,8 @@ void e_border_raise_above(E_Border *b, E_Border *above); void e_border_lower_below(E_Border *b, E_Border *below); void e_border_init(void); void e_border_adopt_children(Window win); - +E_Border *e_border_current_focused(void); + void e_icccm_move_resize(Window win, int x, int y, int w, int h); void e_icccm_delete(Window win); void e_icccm_state_mapped(Window win); diff --git a/src/icons.c b/src/icons.c index 47e005f1e..c4ed447a8 100644 --- a/src/icons.c +++ b/src/icons.c @@ -99,7 +99,6 @@ e_icon_place_grid(E_Icon *icon) x += (icon->view->options.arrange.grid.w - icon->current.w) / 2; y += (icon->view->options.arrange.grid.h - icon->current.h); e_icon_set_xy(icon, x, y); - printf("GRID PLACE at %i %i\n", x, y); icon->view->options.arrange.grid.next_pos++; } else /* v */ @@ -113,7 +112,6 @@ e_icon_pre_show(E_Icon *icon) int x, y; if (icon->info.ready) return; - printf("*********!!!!!!!!!!!!!!!********* update from e_icon_pre_show()\n"); e_icon_update(icon); icon->info.ready = 1; if (icon->info.coord.have) @@ -291,7 +289,6 @@ e_icon_update(E_Icon *icon) int obj_new = 0; if (!icon->changed) return; - printf("icon (%s).. update\n", icon->file); if (icon->current.state.clicked) { if (icon->info.icon.clicked) @@ -417,5 +414,4 @@ e_icon_update(E_Icon *icon) icon->previous = icon->current; icon->previous.icon = strdup(icon->current.icon); icon->changed = 0; - printf("... done\n"); } diff --git a/src/keys.c b/src/keys.c new file mode 100644 index 000000000..902f8dc77 --- /dev/null +++ b/src/keys.c @@ -0,0 +1,56 @@ +#include "e.h" + +static void e_key_down(Eevent * ev); +static void e_key_up(Eevent * ev); + +static void +e_key_down(Eevent * ev) +{ + Ev_Key_Down *e; + + e = ev->event; + if (e->win == e_get_key_grab_win()) + { + e_action_stop("Key_Binding", ACT_KEY_DOWN, 0, e->key, e->mods, + NULL, NULL, 0, 0, 0, 0); + e_action_start("Key_Binding", ACT_KEY_DOWN, 0, e->key, e->mods, + NULL, NULL, 0, 0, 0, 0); + } +} + +static void +e_key_up(Eevent * ev) +{ + Ev_Key_Up *e; + + e = ev->event; + if (e->win == e_get_key_grab_win()) + { + e_action_stop("Key_Binding", ACT_KEY_UP, 0, e->key, e->mods, + NULL, NULL, 0, 0, 0, 0); + e_action_start("Key_Binding", ACT_KEY_UP, 0, e->key, e->mods, + NULL, NULL, 0, 0, 0, 0); + } +} + +void +e_keys_init(void) +{ + /* load up our actions .... once to get some grabbed keys */ + e_action_start("", ACT_KEY_DOWN, 0, NULL, EV_KEY_MODIFIER_NONE, + NULL, NULL, 0, 0, 0, 0); + e_event_filter_handler_add(EV_KEY_DOWN, e_key_down); + e_event_filter_handler_add(EV_KEY_UP, e_key_up); +} + +void +e_keys_grab(char *key, Ev_Key_Modifiers mods, int anymod) +{ + e_key_grab(key, mods, anymod, 0); +} + +void +e_keys_ungrab(char *key, Ev_Key_Modifiers mods, int anymod) +{ + e_key_ungrab(key, mods, anymod); +} diff --git a/src/main.c b/src/main.c index 9368ef662..80567469a 100644 --- a/src/main.c +++ b/src/main.c @@ -56,6 +56,7 @@ main(int argc, char **argv) e_view_init(); e_entry_init(); e_ipc_init(); + e_keys_init(); setup();