+ if (e->data.x.e->xkey.keycode == reset_key &&
+ e->data.x.e->xkey.state == reset_state) {
+ reset_chains();
+ XAllowEvents(ob_display, AsyncKeyboard, CurrentTime);
+ } else {
+ KeyBindingTree *p;
+ if (curpos == NULL)
+ p = firstnode;
+ else
+ p = curpos->first_child;
+ while (p) {
+ if (p->key == e->data.x.e->xkey.keycode &&
+ p->state == e->data.x.e->xkey.state) {
+ if (p->first_child != NULL) { /* part of a chain */
+ /* XXX TIMER */
+ if (!grabbed) {
+ grab_keyboard(TRUE);
+ grabbed = TRUE;
+ XAllowEvents(ob_display, AsyncKeyboard, CurrentTime);
+ }
+ curpos = p;
+ } else {
+ if (p->action->func != NULL) {
+ p->action->data.any.c = focus_client;
+
+ g_assert(!(p->action->func == action_move ||
+ p->action->func == action_resize));
+
+ p->action->func(&p->action->data);
+ }
+
+ XAllowEvents(ob_display, AsyncKeyboard, CurrentTime);
+ reset_chains();
+ }
+ break;
+ }
+ p = p->next_sibling;
+ }
+ }
+}
+
+static void binddef()
+{
+ GList *list = g_list_append(NULL, NULL);
+ Action *a;
+
+ /* When creating an Action struct, all of the data elements in the
+ appropriate struct need to be set, except the Client*, which will be set
+ at call-time when then action function is used.
+ */
+
+ list->data = "C-Right";
+ a = action_new(action_next_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ kbind(list, a);
+
+ list->data = "C-Left";
+ a = action_new(action_previous_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ kbind(list, a);
+
+ list->data = "C-1";
+ a = action_new(action_desktop);
+ a->data.desktop.desk = 0;
+ kbind(list, a);
+
+ list->data = "C-2";
+ a = action_new(action_desktop);
+ a->data.desktop.desk = 1;
+ kbind(list, a);
+
+ list->data = "C-3";
+ a = action_new(action_desktop);
+ a->data.desktop.desk = 2;
+ kbind(list, a);
+
+ list->data = "C-4";
+ a = action_new(action_desktop);
+ a->data.desktop.desk = 3;
+ kbind(list, a);
+
+ list->data = "C-space";
+ a = action_new(action_execute);
+ a->data.execute.path = g_strdup("xterm");
+ kbind(list, a);