+static gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact,
+ Action *action)
+{
+ guint state, button;
+ GQuark context;
+ MouseBinding *b;
+ GSList *it;
+ guint i;
+
+ if (!translate_button(buttonstr, &state, &button)) {
+ g_warning("invalid button");
+ return FALSE;
+ }
+
+ context = g_quark_try_string(contextstr);
+ if (!context) {
+ g_warning("invalid context");
+ return FALSE;
+ }
+
+ for (it = g_datalist_id_get_data(&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;
+ return TRUE;
+ }
+ }
+
+ grab_all_clients(FALSE);
+
+ /* add the binding */
+ b = g_new(MouseBinding, 1);
+ b->state = state;
+ b->button = button;
+ for (i = 0; i < NUM_MOUSEACTION; ++i)
+ b->action[i] = NULL;
+ b->action[mact] = action;
+ g_datalist_id_set_data(&bound_contexts, context,
+ g_slist_append(g_datalist_id_get_data(&bound_contexts, context), b));
+
+ grab_all_clients(TRUE);
+
+ return TRUE;
+}
+
+static void binddef()
+{
+ 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.
+
+ For action_move and action_resize, the 'x', 'y', and 'final' data
+ elements should not be set, as they are set at call-time.
+ */
+
+ a = action_new(action_move);
+ mbind("1", "titlebar", MouseAction_Motion, a);
+ a = action_new(action_move);
+ mbind("1", "handle", MouseAction_Motion, a);
+ a = action_new(action_move);
+ mbind("A-1", "frame", MouseAction_Motion, a);
+
+ a = action_new(action_resize);
+ mbind("1", "blcorner", MouseAction_Motion, a);
+ a = action_new(action_resize);
+ mbind("1", "brcorner", MouseAction_Motion, a);
+ a = action_new(action_resize);
+ mbind("A-3", "frame", MouseAction_Motion, a);
+
+ a = action_new(action_focus);
+ mbind("1", "titlebar", MouseAction_Press, a);
+ a = action_new(action_focus);
+ mbind("1", "handle", MouseAction_Press, a);
+ a = action_new(action_raise);
+ mbind("1", "titlebar", MouseAction_Click, a);
+ a = action_new(action_raise);
+ mbind("1", "handle", MouseAction_Click, a);
+ a = action_new(action_lower);
+ mbind("2", "titlebar", MouseAction_Press, a);
+ a = action_new(action_lower);
+ mbind("2", "handle", MouseAction_Press, a);
+ a = action_new(action_raise);
+ mbind("A-1", "frame", MouseAction_Click, a);
+ a = action_new(action_lower);
+ mbind("A-3", "frame", MouseAction_Click, a);
+
+ a = action_new(action_focusraise);
+ mbind("1", "client", MouseAction_Press, a);
+
+ a = action_new(action_toggle_shade);
+ mbind("1", "titlebar", MouseAction_DClick, a);
+ a = action_new(action_shade);
+ mbind("4", "titlebar", MouseAction_Press, a);
+ a = action_new(action_unshade);
+ mbind("5", "titlebar", MouseAction_Click, a);
+
+ a = action_new(action_toggle_maximize_full);
+ mbind("1", "maximize", MouseAction_Click, a);
+ a = action_new(action_toggle_maximize_vert);
+ mbind("2", "maximize", MouseAction_Click, a);
+ a = action_new(action_toggle_maximize_horz);
+ mbind("3", "maximize", MouseAction_Click, a);
+ a = action_new(action_iconify);
+ mbind("1", "iconify", MouseAction_Click, a);
+ a = action_new(action_close);
+ mbind("1", "icon", MouseAction_DClick, a);
+ a = action_new(action_close);
+ mbind("1", "close", MouseAction_Click, a);
+ a = action_new(action_toggle_omnipresent);
+ mbind("1", "alldesktops", MouseAction_Click, a);
+
+ a = action_new(action_next_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ mbind("4", "root", MouseAction_Click, a);
+ a = action_new(action_previous_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ mbind("5", "root", MouseAction_Click, a);
+ a = action_new(action_next_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ mbind("A-4", "root", MouseAction_Click, a);
+ a = action_new(action_previous_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ mbind("A-5", "root", MouseAction_Click, a);
+ a = action_new(action_next_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ mbind("A-4", "frame", MouseAction_Click, a);
+ a = action_new(action_previous_desktop);
+ a->data.nextprevdesktop.wrap = TRUE;
+ mbind("A-5", "frame", MouseAction_Click, a);
+}
+