X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmouse.c;h=8b0cfccbd0a0b887e2de95ff2a7d4e449958f92c;hb=f9fe78d970fa1ef62d56160db7a82fa6948643b6;hp=517ed6e695c362ac6b3ae0d2fdfa2705a1e0e887;hpb=e84fb1b052584b83947715d8ae4ec5d8afd201e7;p=chaz%2Fopenbox diff --git a/openbox/mouse.c b/openbox/mouse.c index 517ed6e6..8b0cfccb 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -65,16 +65,17 @@ ObFrameContext mouse_button_frame_context(ObFrameContext context, case OB_FRAME_CONTEXT_DESKTOP: case OB_FRAME_CONTEXT_CLIENT: case OB_FRAME_CONTEXT_TITLEBAR: - case OB_FRAME_CONTEXT_HANDLE: case OB_FRAME_CONTEXT_FRAME: case OB_FRAME_CONTEXT_MOVE_RESIZE: break; + case OB_FRAME_CONTEXT_BOTTOM: case OB_FRAME_CONTEXT_BLCORNER: case OB_FRAME_CONTEXT_BRCORNER: - x = OB_FRAME_CONTEXT_HANDLE; + x = OB_FRAME_CONTEXT_BOTTOM; break; case OB_FRAME_CONTEXT_TLCORNER: case OB_FRAME_CONTEXT_TRCORNER: + case OB_FRAME_CONTEXT_TOP: case OB_FRAME_CONTEXT_MAXIMIZE: case OB_FRAME_CONTEXT_ALLDESKTOPS: case OB_FRAME_CONTEXT_SHADE: @@ -108,7 +109,7 @@ void mouse_grab_for_client(ObClient *client, gboolean grab) mode = GrabModeAsync; mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask; } else if (CLIENT_CONTEXT(i, client)) { - win = client->window; + win = 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 @@ -179,7 +180,7 @@ void 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; + static gint px, py, pwx = -1, pwy = -1; ObFrameContext context; gboolean click = FALSE; @@ -187,11 +188,14 @@ void mouse_event(ObClient *client, XEvent *e) switch (e->type) { case ButtonPress: - context = frame_context(client, e->xany.window); + context = frame_context(client, e->xbutton.window, + e->xbutton.x, e->xbutton.y); context = mouse_button_frame_context(context, e->xbutton.button); px = e->xbutton.x_root; py = e->xbutton.y_root; + if (!button) pwx = e->xbutton.x; + if (!button) pwy = e->xbutton.y; button = e->xbutton.button; state = e->xbutton.state; @@ -209,9 +213,13 @@ void mouse_event(ObClient *client, XEvent *e) break; case ButtonRelease: - context = frame_context(client, e->xany.window); + /* use where the press occured in the window */ + context = frame_context(client, e->xbutton.window, pwx, pwy); context = mouse_button_frame_context(context, e->xbutton.button); + if (e->xbutton.button == button) + pwx = pwy = -1; + if (e->xbutton.button == button) { /* clicks are only valid if its released over the window */ gint junk1, junk2; @@ -252,7 +260,8 @@ void mouse_event(ObClient *client, XEvent *e) fire_binding(OB_MOUSE_ACTION_RELEASE, context, client, e->xbutton.state, e->xbutton.button, - e->xbutton.x_root, e->xbutton.y_root, + e->xbutton.x_root, + e->xbutton.y_root, e->xbutton.time); if (click) fire_binding(OB_MOUSE_ACTION_CLICK, context, @@ -272,13 +281,11 @@ void mouse_event(ObClient *client, XEvent *e) case MotionNotify: if (button) { - context = frame_context(client, e->xany.window); + context = frame_context(client, e->xmotion.window, pwx, pwy); context = mouse_button_frame_context(context, button); - if (ABS(e->xmotion.x_root - px) >= - config_mouse_threshold || - ABS(e->xmotion.y_root - py) >= - config_mouse_threshold) { + if (ABS(e->xmotion.x_root - px) >= config_mouse_threshold || + ABS(e->xmotion.y_root - py) >= config_mouse_threshold) { /* You can't drag on buttons */ if (context == OB_FRAME_CONTEXT_MAXIMIZE || @@ -311,13 +318,13 @@ gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr, GSList *it; if (!translate_button(buttonstr, &state, &button)) { - g_message(_("Invalid button '%s' in pointer binding"), buttonstr); + 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 pointer binding"), contextstr); + g_message(_("Invalid context '%s' in mouse binding"), contextstr); return FALSE; }