diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-05-09 16:57:17 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-05-09 16:57:17 +0000 |
| commit | f26f23de50cb7941a7702198e3b4d1b2f9de062e (patch) | |
| tree | ec1d73c8e977d86e9231676c51e684a3415e7a0e /plugins | |
| parent | 60065663ba9dc448dcf90fd200cd459bcdb9ef9c (diff) | |
all my changes while i was offline.
better alt-tabbing. better transient handling. i dont even know. lots of fucking cool shit so WATCH the FUCK OUT.
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/keyboard/keyboard.c | 73 | ||||
| -rw-r--r-- | plugins/keyboard/tree.c | 5 | ||||
| -rw-r--r-- | plugins/keyboard/tree.h | 2 | ||||
| -rw-r--r-- | plugins/mouse/mouse.c | 75 | ||||
| -rw-r--r-- | plugins/mouse/mouse.h | 2 |
5 files changed, 89 insertions, 68 deletions
diff --git a/plugins/keyboard/keyboard.c b/plugins/keyboard/keyboard.c index bf670c49..acda951a 100644 --- a/plugins/keyboard/keyboard.c +++ b/plugins/keyboard/keyboard.c @@ -56,12 +56,15 @@ gboolean kbind(GList *keylist, Action *action) if (!(tree = tree_build(keylist))) return FALSE; + if ((t = tree_find(tree, &conflict)) != NULL) { - /* already bound to something */ - g_message("keychain is already bound"); + /* already bound to something, use the existing tree */ tree_destroy(tree); - return FALSE; - } + tree = NULL; + } else + t = tree; + while (t->first_child) t = t->first_child; + if (conflict) { g_message("conflict with binding"); tree_destroy(tree); @@ -73,12 +76,10 @@ gboolean kbind(GList *keylist, Action *action) grab_keys(FALSE); /* set the action */ - t = tree; - while (t->first_child) t = t->first_child; - t->action = action; + t->actions = g_slist_append(t->actions, action); /* assimilate this built tree into the main tree. assimilation destroys/uses the tree */ - tree_assimilate(tree); + if (tree) tree_assimilate(tree); grab_keys(TRUE); grab_server(FALSE); @@ -100,17 +101,25 @@ static void event(ObEvent *e, void *foo) if (e->data.x.e->xkey.keycode == button_return) done = TRUE; else if (e->data.x.e->xkey.keycode == button_escape) { - grabbed_key->action->data.cycle.cancel = TRUE; + GSList *it; + for (it = grabbed_key->actions; it; it = it->next) { + Action *act = it->data; + act->data.cycle.cancel = TRUE; + } done = TRUE; } } - if (done) { - grabbed_key->action->data.cycle.final = TRUE; - grabbed_key->action->func(&grabbed_key->action->data); - grab_keyboard(FALSE); - grabbed_key = NULL; - reset_chains(); - return; + if (done) { + GSList *it; + for (it = grabbed_key->actions; it; it = it->next) { + Action *act = it->data; + act->data.cycle.final = TRUE; + act->func(&act->data); + grab_keyboard(FALSE); + grabbed_key = NULL; + reset_chains(); + return; + } } } if (e->type == Event_X_KeyRelease) @@ -140,20 +149,24 @@ static void event(ObEvent *e, void *foo) } curpos = p; } else { - if (p->action->func != NULL) { - p->action->data.any.c = focus_client; - - if (p->action->func == action_cycle_windows) { - p->action->data.cycle.final = FALSE; - p->action->data.cycle.cancel = FALSE; - } - - p->action->func(&p->action->data); - - if (p->action->func == action_cycle_windows && - !grabbed_key) { - grab_keyboard(TRUE); - grabbed_key = p; + GSList *it; + for (it = p->actions; it; it = it->next) { + Action *act = it->data; + if (act->func != NULL) { + act->data.any.c = focus_client; + + if (act->func == action_cycle_windows) { + act->data.cycle.final = FALSE; + act->data.cycle.cancel = FALSE; + } + + act->func(&act->data); + + if (act->func == action_cycle_windows && + !grabbed_key) { + grab_keyboard(TRUE); + grabbed_key = p; + } } } diff --git a/plugins/keyboard/tree.c b/plugins/keyboard/tree.c index c0ea2f49..896f77bb 100644 --- a/plugins/keyboard/tree.c +++ b/plugins/keyboard/tree.c @@ -11,10 +11,13 @@ void tree_destroy(KeyBindingTree *tree) c = tree->first_child; if (c == NULL) { GList *it; + GSList *sit; for (it = tree->keylist; it != NULL; it = it->next) g_free(it->data); g_list_free(tree->keylist); - action_free(tree->action); + for (it = tree->actions; it != NULL; it = it->next) + action_free(it->data); + g_slist_free(tree->actions); } g_free(tree); tree = c; diff --git a/plugins/keyboard/tree.h b/plugins/keyboard/tree.h index 8750c94e..aefb2565 100644 --- a/plugins/keyboard/tree.h +++ b/plugins/keyboard/tree.h @@ -8,7 +8,7 @@ typedef struct KeyBindingTree { guint state; guint key; GList *keylist; - Action *action; + GSList *actions; /* list of Action pointers */ /* the next binding in the tree at the same level */ struct KeyBindingTree *next_sibling; diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c index caf4e554..8df8e2a0 100644 --- a/plugins/mouse/mouse.c +++ b/plugins/mouse/mouse.c @@ -96,9 +96,13 @@ static void clearall() int j; MouseBinding *b = it->data; - for (j = 0; j < NUM_MOUSEACTION; ++j) - if (b->action[j] != NULL) - action_free(b->action[j]); + for (j = 0; j < NUM_MOUSEACTION; ++j) { + GSList *it; + for (it = b->actions[j]; it; it = it->next) { + action_free(it->data); + } + g_slist_free(b->actions[j]); + } g_free(b); } g_slist_free(bound_contexts[i]); @@ -119,17 +123,20 @@ static void fire_button(MouseAction a, Context context, Client *c, guint state, /* if not bound, then nothing to do! */ if (it == NULL) return; - if (b->action[a] != NULL && b->action[a]->func != NULL) { - b->action[a]->data.any.c = c; + for (it = b->actions[a]; it; it = it->next) { + Action *act = it->data; + if (act->func != NULL) { + act->data.any.c = c; - g_assert(b->action[a]->func != action_moveresize); + g_assert(act->func != action_moveresize); - if (b->action[a]->func == action_showmenu) { - b->action[a]->data.showmenu.x = x; - b->action[a]->data.showmenu.y = y; - } + if (act->func == action_showmenu) { + act->data.showmenu.x = x; + act->data.showmenu.y = y; + } - b->action[a]->func(&b->action[a]->data); + act->func(&act->data); + } } } @@ -148,24 +155,27 @@ static void fire_motion(MouseAction a, Context context, Client *c, /* if not bound, then nothing to do! */ if (it == NULL) return; - if (b->action[a] != NULL && b->action[a]->func != NULL) { - b->action[a]->data.any.c = c; - - if (b->action[a]->func == action_moveresize) { - b->action[a]->data.moveresize.x = x_root; - b->action[a]->data.moveresize.y = y_root; - b->action[a]->data.moveresize.button = button; - if (!(b->action[a]->data.moveresize.corner == - prop_atoms.net_wm_moveresize_move || - b->action[a]->data.moveresize.corner == - prop_atoms.net_wm_moveresize_move_keyboard || - b->action[a]->data.moveresize.corner == - prop_atoms.net_wm_moveresize_size_keyboard)) - b->action[a]->data.moveresize.corner = corner; - } else - g_assert_not_reached(); + for (it = b->actions[a]; it; it = it->next) { + Action *act = it->data; + if (act->func != NULL) { + act->data.any.c = c; + + if (act->func == action_moveresize) { + act->data.moveresize.x = x_root; + act->data.moveresize.y = y_root; + act->data.moveresize.button = button; + if (!(act->data.moveresize.corner == + prop_atoms.net_wm_moveresize_move || + act->data.moveresize.corner == + prop_atoms.net_wm_moveresize_move_keyboard || + act->data.moveresize.corner == + prop_atoms.net_wm_moveresize_size_keyboard)) + act->data.moveresize.corner = corner; + } else + g_assert_not_reached(); - b->action[a]->func(&b->action[a]->data); + act->func(&act->data); + } } } @@ -338,12 +348,7 @@ gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, for (it = bound_contexts[context]; it != NULL; it = it->next){ b = it->data; if (b->state == state && b->button == button) { - /* already bound */ - if (b->action[mact] != NULL) { - g_warning("duplicate binding"); - return FALSE; - } - b->action[mact] = action; + b->actions[mact] = g_slist_append(b->actions[mact], action); return TRUE; } } @@ -354,7 +359,7 @@ gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, b = g_new0(MouseBinding, 1); b->state = state; b->button = button; - b->action[mact] = action; + b->actions[mact] = g_slist_append(NULL, action); bound_contexts[context] = g_slist_append(bound_contexts[context], b); grab_all_clients(TRUE); diff --git a/plugins/mouse/mouse.h b/plugins/mouse/mouse.h index 832ada1f..408ae964 100644 --- a/plugins/mouse/mouse.h +++ b/plugins/mouse/mouse.h @@ -15,7 +15,7 @@ typedef enum { typedef struct { guint state; guint button; - Action *action[NUM_MOUSEACTION]; + GSList *actions[NUM_MOUSEACTION]; /* lists of Action pointers */ } MouseBinding; gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, |
