Make the dock a context and add actions LowerDock and RaiseDock
[dana/openbox.git] / openbox / mouse.c
index cd8490f..ddf6851 100644 (file)
@@ -66,6 +66,7 @@ ObFrameContext mouse_button_frame_context(ObFrameContext context,
     case OB_FRAME_CONTEXT_MOVE_RESIZE:
     case OB_FRAME_CONTEXT_LEFT:
     case OB_FRAME_CONTEXT_RIGHT:
+    case OB_FRAME_CONTEXT_DOCK:
         break;
     case OB_FRAME_CONTEXT_ROOT:
         x = OB_FRAME_CONTEXT_DESKTOP;
@@ -155,7 +156,7 @@ void mouse_unbind_all(void)
                     actions_act_unref(jt->data);
                 g_slist_free(b->actions[j]);
             }
-            g_free(b);
+            g_slice_free(ObMouseBinding, b);
         }
         g_slist_free(bound_contexts[i]);
         bound_contexts[i] = NULL;
@@ -200,17 +201,18 @@ void mouse_replay_pointer(void)
 {
     if (replay_pointer_needed) {
         /* replay the pointer event before any windows move */
-        XAllowEvents(obt_display, ReplayPointer, event_curtime);
+        XAllowEvents(obt_display, ReplayPointer, event_time());
         replay_pointer_needed = FALSE;
     }
 }
 
-void mouse_event(ObClient *client, XEvent *e)
+gboolean mouse_event(ObClient *client, XEvent *e)
 {
     static Time ltime;
     static guint button = 0, state = 0, lbutton = 0;
     static Window lwindow = None;
     static gint px, py, pwx = -1, pwy = -1;
+    gboolean used = FALSE;
 
     ObFrameContext context;
     gboolean click = FALSE;
@@ -246,10 +248,10 @@ void mouse_event(ObClient *client, XEvent *e)
         if (CLIENT_CONTEXT(context, client))
             replay_pointer_needed = TRUE;
 
-        fire_binding(OB_MOUSE_ACTION_PRESS, context,
-                     client, e->xbutton.state,
-                     e->xbutton.button,
-                     e->xbutton.x_root, e->xbutton.y_root);
+        used = fire_binding(OB_MOUSE_ACTION_PRESS, context,
+                            client, e->xbutton.state,
+                            e->xbutton.button,
+                            e->xbutton.x_root, e->xbutton.y_root) || used;
 
         /* if the bindings grab the pointer, there won't be a ButtonRelease
            event for us */
@@ -311,23 +313,23 @@ void mouse_event(ObClient *client, XEvent *e)
             state = 0;
             ltime = e->xbutton.time;
         }
-        fire_binding(OB_MOUSE_ACTION_RELEASE, context,
-                     client, e->xbutton.state,
-                     e->xbutton.button,
-                     e->xbutton.x_root,
-                     e->xbutton.y_root);
+        used = fire_binding(OB_MOUSE_ACTION_RELEASE, context,
+                            client, e->xbutton.state,
+                            e->xbutton.button,
+                            e->xbutton.x_root,
+                            e->xbutton.y_root) || used;
         if (click)
-            fire_binding(OB_MOUSE_ACTION_CLICK, context,
-                         client, e->xbutton.state,
-                         e->xbutton.button,
-                         e->xbutton.x_root,
-                         e->xbutton.y_root);
+            used = fire_binding(OB_MOUSE_ACTION_CLICK, context,
+                                client, e->xbutton.state,
+                                e->xbutton.button,
+                                e->xbutton.x_root,
+                                e->xbutton.y_root) || used;
         if (dclick)
-            fire_binding(OB_MOUSE_ACTION_DOUBLE_CLICK, context,
-                         client, e->xbutton.state,
-                         e->xbutton.button,
-                         e->xbutton.x_root,
-                         e->xbutton.y_root);
+            used = fire_binding(OB_MOUSE_ACTION_DOUBLE_CLICK, context,
+                                client, e->xbutton.state,
+                                e->xbutton.button,
+                                e->xbutton.x_root,
+                                e->xbutton.y_root) || used;
         break;
 
     case MotionNotify:
@@ -347,8 +349,8 @@ void mouse_event(ObClient *client, XEvent *e)
                     context == OB_FRAME_CONTEXT_CLOSE)
                     break;
 
-                fire_binding(OB_MOUSE_ACTION_MOTION, context,
-                             client, state, button, px, py);
+                used = fire_binding(OB_MOUSE_ACTION_MOTION, context,
+                                    client, state, button, px, py);
                 button = 0;
                 state = 0;
             }
@@ -358,27 +360,23 @@ void mouse_event(ObClient *client, XEvent *e)
     default:
         g_assert_not_reached();
     }
+    return used;
 }
 
-gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr,
+gboolean mouse_bind(const gchar *buttonstr, ObFrameContext context,
                     ObMouseAction mact, ObActionsAct *action)
 {
     guint state, button;
-    ObFrameContext context;
     ObMouseBinding *b;
     GSList *it;
 
+    g_assert(context != OB_FRAME_CONTEXT_NONE);
+
     if (!translate_button(buttonstr, &state, &button)) {
         g_message(_("Invalid button \"%s\" in mouse binding"), buttonstr);
         return FALSE;
     }
 
-    context = frame_context_from_string(contextstr);
-    if (!context) {
-        g_message(_("Invalid context \"%s\" in mouse binding"), contextstr);
-        return FALSE;
-    }
-
     for (it = bound_contexts[context]; it; it = g_slist_next(it)) {
         b = it->data;
         if (b->state == state && b->button == button) {
@@ -388,7 +386,7 @@ gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr,
     }
 
     /* add the binding */
-    b = g_new0(ObMouseBinding, 1);
+    b = g_slice_new0(ObMouseBinding);
     b->state = state;
     b->button = button;
     b->actions[mact] = g_slist_append(NULL, action);