]> Dogcows Code - chaz/openbox/blobdiff - plugins/mouse/mouse.c
add descriptive names and long descriptions to config var def'ns. set these for the...
[chaz/openbox] / plugins / mouse / mouse.c
index ad332982b53cb8983bec8d7a66dbcd4943fcf573..ea943f5a2820ac1a838efc4bf5a104ea4a82f660 100644 (file)
@@ -3,11 +3,14 @@
 #include "../../kernel/action.h"
 #include "../../kernel/client.h"
 #include "../../kernel/frame.h"
+#include "../../kernel/grab.h"
 #include "../../kernel/engine.h"
 #include "translate.h"
 #include "mouse.h"
 #include <glib.h>
 
+static int drag_threshold = 3;
+
 /* GData of GSList*s of PointerBinding*s. */
 static GData *bound_contexts;
 
@@ -16,40 +19,33 @@ struct foreach_grab_temp {
     gboolean grab;
 };
 
-static void grab_button(Client *client, guint state, guint button,
-                       GQuark context, gboolean grab)
-{
-    Window win;
-    int mode = GrabModeAsync;
-    unsigned int mask;
-
-    if (context == g_quark_try_string("frame")) {
-       win = client->frame->window;
-       mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask;
-    } else if (context == g_quark_try_string("client")) {
-       win = client->frame->plate;
-       mode = GrabModeSync; /* this is handled in pointer_event */
-       mask = ButtonPressMask; /* can't catch more than this with Sync mode
-                                  the release event is manufactured in
-                                  pointer_fire */
-    } else return;
-
-    if (grab)
-        /* XXX grab all lock keys */
-       XGrabButton(ob_display, button, state, win, FALSE, mask, mode,
-                   GrabModeAsync, None, None);
-    else
-        /* XXX ungrab all lock keys */
-       XUngrabButton(ob_display, button, state, win);
-}
-
 static void foreach_grab(GQuark key, gpointer data, gpointer user_data)
 {
     struct foreach_grab_temp *d = user_data;
     GSList *it;
     for (it = data; it != NULL; it = it->next) {
+        /* grab/ungrab the button */
        MouseBinding *b = it->data;
-       grab_button(d->client, b->state, b->button, key, d->grab);
+        Window win;
+        int mode;
+        unsigned int mask;
+
+        if (key == g_quark_try_string("frame")) {
+            win = d->client->frame->window;
+            mode = GrabModeAsync;
+            mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask;
+        } else if (key == g_quark_try_string("client")) {
+            win = d->client->frame->plate;
+            mode = GrabModeSync; /* this is handled in event */
+            mask = ButtonPressMask; /* can't catch more than this with Sync
+                                       mode the release event is manufactured
+                                       in event */
+        } else return;
+
+        if (d->grab)
+            grab_button(b->button, b->state, win, mask, mode);
+        else
+            ungrab_button(b->button, b->state, win);
     }
 }
   
@@ -276,14 +272,17 @@ static void event(ObEvent *e, void *foo)
 
     case Event_X_MotionNotify:
         if (button) {
-            drag = TRUE;
             dx = e->data.x.e->xmotion.x_root - px;
             dy = e->data.x.e->xmotion.y_root - py;
-            context = engine_get_context(e->data.x.client,
-                                         e->data.x.e->xbutton.window);
-            fire_motion(MouseAction_Motion, context,
-                        e->data.x.client, e->data.x.e->xmotion.state,
-                        button, cx, cy, cw, ch, dx, dy, FALSE, corner);
+            if (ABS(dx) >= drag_threshold || ABS(dy) >= drag_threshold)
+                drag = TRUE;
+            if (drag) {
+                context = engine_get_context(e->data.x.client,
+                                             e->data.x.e->xbutton.window);
+                fire_motion(MouseAction_Motion, context,
+                            e->data.x.client, e->data.x.e->xmotion.state,
+                            button, cx, cy, cw, ch, dx, dy, FALSE, corner);
+            }
         }
         break;
 
@@ -369,10 +368,14 @@ static void binddef()
     a = action_new(action_resize);
     mbind("A-3", "frame", MouseAction_Motion, a);
 
-    a = action_new(action_focusraise);
+    a = action_new(action_focus);
     mbind("1", "titlebar", MouseAction_Press, a);
-    a = action_new(action_focusraise);
+    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);
@@ -382,7 +385,7 @@ static void binddef()
     a = action_new(action_lower);
     mbind("A-3", "frame", MouseAction_Click, a);
 
-    a = action_new(action_focusraise);
+    a = action_new(action_focus);
     mbind("1", "client", MouseAction_Press, a);
 
     a = action_new(action_toggle_shade);
@@ -404,6 +407,8 @@ static void binddef()
     mbind("1", "icon", MouseAction_DClick, a);
     a = action_new(action_close);
     mbind("1", "close", MouseAction_Click, a);
+    a = action_new(action_kill);
+    mbind("2", "close", MouseAction_Click, a);
     a = action_new(action_toggle_omnipresent);
     mbind("1", "alldesktops", MouseAction_Click, a);
 
This page took 0.02552 seconds and 4 git commands to generate.