X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fmouse%2Fmouse.c;h=2a0b4ecc8fe78523e2f22e6f86041d7e1ed65ae5;hb=185d1337e553283530e23b1edff3bb709f04e9bb;hp=27c536d51594c98d3e94a8738be04855eb1f3f3d;hpb=cbbf90a718ecc6836ef7a77b9040aebb9da348b8;p=chaz%2Fopenbox diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c index 27c536d5..2a0b4ecc 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); } } @@ -178,7 +181,8 @@ static gboolean fire_motion(MouseAction a, Context context, Client *c, break; } b->action[a]->data.resize.final = final; - } + } else + g_assert_not_reached(); b->action[a]->func(&b->action[a]->data); return TRUE; } @@ -204,7 +208,7 @@ static void event(ObEvent *e, void *foo) { static Time ltime; static int px, py, cx, cy, cw, ch, dx, dy; - static guint button = 0, lbutton = 0; + static guint button = 0, state = 0, lbutton = 0; static gboolean drag = FALSE, drag_used = FALSE; static Corner corner = Corner_TopLeft; gboolean click = FALSE; @@ -239,13 +243,15 @@ static void event(ObEvent *e, void *foo) corner = pick_corner(px, py, cx, cy, cw, ch); } button = e->data.x.e->xbutton.button; + state = e->data.x.e->xbutton.state; } - 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); 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*/ @@ -255,14 +261,13 @@ 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, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button, + e->data.x.client, state, button, cx, cy, cw, ch, dx, dy, TRUE, corner); drag = drag_used = FALSE; @@ -291,19 +296,25 @@ static void event(ObEvent *e, void *foo) } button = 0; + state = 0; ltime = e->data.x.e->xbutton.time; } 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: @@ -314,12 +325,11 @@ static void event(ObEvent *e, void *foo) (ABS(dx) >= threshold || ABS(dy) >= threshold)) drag = TRUE; if (drag) { - 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); drag_used = fire_motion(MouseAction_Motion, context, e->data.x.client, - e->data.x.e->xmotion.state, - button, cx, cy, cw, ch, dx, dy, + state, button, cx, cy, cw, ch, dx, dy, FALSE, corner); } }