X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fmouse%2Fmouse.c;h=694b2cbd80eff8ff8685dfbf7a5d56781118048e;hb=962f0b30624c62b0f6255c65128683ef4f09386b;hp=37c22bd80843d277cd711e8f2b1bd141060fe1a8;hpb=852f36235eee5f3414430d1b89e91b1ba68db666;p=chaz%2Fopenbox diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c index 37c22bd8..694b2cbd 100644 --- a/plugins/mouse/mouse.c +++ b/plugins/mouse/mouse.c @@ -3,9 +3,7 @@ #include "kernel/action.h" #include "kernel/event.h" #include "kernel/client.h" -#include "kernel/frame.h" #include "kernel/grab.h" -#include "kernel/engine.h" #include "kernel/parse.h" #include "kernel/frame.h" #include "translate.h" @@ -107,7 +105,7 @@ static void clearall() } static void fire_button(MouseAction a, Context context, Client *c, guint state, - guint button) + guint button, int x, int y) { GSList *it; MouseBinding *b; @@ -126,6 +124,11 @@ static void fire_button(MouseAction a, Context context, Client *c, guint state, g_assert(!(b->action[a]->func == action_move || b->action[a]->func == action_resize)); + if (b->action[a]->func == action_showmenu) { + b->action[a]->data.showmenu.x = x; + b->action[a]->data.showmenu.y = y; + } + b->action[a]->func(&b->action[a]->data); } } @@ -208,6 +211,8 @@ static void event(ObEvent *e, void *foo) static guint button = 0, state = 0, lbutton = 0; static gboolean drag = FALSE, drag_used = FALSE; static Corner corner = Corner_TopLeft; + static Client *drag_client = NULL; + static Context drag_context = Context_None; gboolean click = FALSE; gboolean dclick = FALSE; Context context; @@ -222,6 +227,9 @@ static void event(ObEvent *e, void *foo) break; case Event_X_ButtonPress: + context = frame_context(e->data.x.client, + e->data.x.e->xbutton.window); + if (!button) { if (e->data.x.client != NULL) { cx = e->data.x.client->frame->area.x; @@ -241,13 +249,14 @@ static void event(ObEvent *e, void *foo) } button = e->data.x.e->xbutton.button; state = e->data.x.e->xbutton.state; + drag_context = context; + drag_client = e->data.x.client; } - context = engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window); fire_button(MouseAction_Press, context, e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button); + e->data.x.e->xbutton.button, + e->data.x.e->xbutton.x_root, e->data.x.e->xbutton.y_root); if (context == Context_Client) { /* Replay the event, so it goes to the client*/ @@ -257,15 +266,17 @@ static void event(ObEvent *e, void *foo) break; case Event_X_ButtonRelease: - context = engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window); + context = frame_context(e->data.x.client, + e->data.x.e->xbutton.window); if (e->data.x.e->xbutton.button == button) { /* end drags */ if (drag_used) { - fire_motion(MouseAction_Motion, context, - e->data.x.client, state, button, + fire_motion(MouseAction_Motion, drag_context, + drag_client, state, button, cx, cy, cw, ch, dx, dy, TRUE, corner); drag = drag_used = FALSE; + drag_context = Context_None; + drag_client = NULL; lbutton = 0; } else { @@ -297,15 +308,20 @@ static void event(ObEvent *e, void *foo) } fire_button(MouseAction_Release, context, e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button); + e->data.x.e->xbutton.button, + e->data.x.e->xbutton.x_root, e->data.x.e->xbutton.y_root); if (click) fire_button(MouseAction_Click, context, e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button); + e->data.x.e->xbutton.button, + e->data.x.e->xbutton.x_root, + e->data.x.e->xbutton.y_root); if (dclick) fire_button(MouseAction_DClick, context, e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button); + e->data.x.e->xbutton.button, + e->data.x.e->xbutton.x_root, + e->data.x.e->xbutton.y_root); break; case Event_X_MotionNotify: @@ -313,13 +329,12 @@ static void event(ObEvent *e, void *foo) dx = e->data.x.e->xmotion.x_root - px; dy = e->data.x.e->xmotion.y_root - py; if (!drag && - (ABS(dx) >= threshold || ABS(dy) >= threshold)) + (ABS(dx) >= threshold || ABS(dy) >= threshold)) { drag = TRUE; + } if (drag) { - context = engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window); - drag_used = fire_motion(MouseAction_Motion, context, - e->data.x.client, + drag_used = fire_motion(MouseAction_Motion, drag_context, + drag_client, state, button, cx, cy, cw, ch, dx, dy, FALSE, corner); }