all repos — openbox @ f99fe8373686615d24bb6806a5b788f5d11d2133

openbox fork - make it a bit more like ryudo

make realeases fire releases instead of presses. make drags prevent clicks only if there is something bound to the drag.
Dana Jansens danakj@orodu.net
commit

f99fe8373686615d24bb6806a5b788f5d11d2133

parent

a022c418e153dda58840f720bd6d9f5e9d7b5983

1 files changed, 20 insertions(+), 12 deletions(-)

jump to
M plugins/mouse/mouse.cplugins/mouse/mouse.c

@@ -113,10 +113,13 @@ }

} /* corner should be the opposite corner of the window in which the pointer - clicked, Corner_TopLeft if a good default if there is no client */ -static void fire_motion(MouseAction a, GQuark context, Client *c, guint state, - guint button, int cx, int cy, int cw, int ch, - int dx, int dy, gboolean final, Corner corner) + clicked, Corner_TopLeft if a good default if there is no client + Returns True or False for if a binding existed for the action or not. +*/ +static gboolean fire_motion(MouseAction a, GQuark context, Client *c, + guint state, guint button, int cx, int cy, + int cw, int ch, int dx, int dy, + gboolean final, Corner corner) { GSList *it; MouseBinding *b;

@@ -128,7 +131,7 @@ if (b->state == state && b->button == button)

break; } /* if not bound, then nothing to do! */ - if (it == NULL) return; + if (it == NULL) return FALSE; if (b->action[a] != NULL && b->action[a]->func != NULL) { b->action[a]->data.any.c = c;

@@ -160,7 +163,9 @@ }

b->action[a]->data.resize.final = final; } b->action[a]->func(&b->action[a]->data); + return TRUE; } + return FALSE; } static Corner pick_corner(int x, int y, int cx, int cy, int cw, int ch)

@@ -183,7 +188,7 @@ {

static Time ltime; static int px, py, cx, cy, cw, ch, dx, dy; static guint button = 0, lbutton = 0; - static gboolean drag = FALSE; + static gboolean drag = FALSE, drag_used = FALSE; static Corner corner = Corner_TopLeft; gboolean click = FALSE; gboolean dclick = FALSE;

@@ -230,7 +235,7 @@ context = engine_get_context(e->data.x.client,

e->data.x.e->xbutton.window); if (e->data.x.e->xbutton.button == button) { /* end drags */ - if (drag) { + if (drag_used) { fire_motion(MouseAction_Motion, context, e->data.x.client, e->data.x.e->xbutton.state, e->data.x.e->xbutton.button,

@@ -264,7 +269,7 @@

button = 0; ltime = e->data.x.e->xbutton.time; } - fire_button(MouseAction_Press, context, + fire_button(MouseAction_Release, context, e->data.x.client, e->data.x.e->xbutton.state, e->data.x.e->xbutton.button); if (click)

@@ -281,14 +286,17 @@ case Event_X_MotionNotify:

if (button) { dx = e->data.x.e->xmotion.x_root - px; dy = e->data.x.e->xmotion.y_root - py; - if (ABS(dx) >= drag_threshold || ABS(dy) >= drag_threshold) + if (!drag && + (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); + drag_used = 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;