X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmouse.c;h=c0fcade49556e090e62b0a9de9db1403376422dc;hb=a260db31a99ad35a5bf347facab2cdd61e3b7558;hp=ab628ff3a5652ed5311983c1a24543ec0c9a30be;hpb=8fe0cb8989c1fe12b30b9030b446345f25340d35;p=chaz%2Fopenbox diff --git a/openbox/mouse.c b/openbox/mouse.c index ab628ff3..c0fcade4 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -1,3 +1,21 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- + + mouse.c for the Openbox window manager + Copyright (c) 2003 Ben Jansens + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + See the COPYING file for a copy of the GNU General Public License. +*/ + #include "openbox.h" #include "config.h" #include "xerror.h" @@ -23,9 +41,52 @@ typedef struct { co == OB_FRAME_CONTEXT_DESKTOP : \ co == OB_FRAME_CONTEXT_CLIENT) -/* Array of GSList*s of PointerBinding*s. */ +/* Array of GSList*s of ObMouseBinding*s. */ static GSList *bound_contexts[OB_FRAME_NUM_CONTEXTS]; +ObFrameContext mouse_button_frame_context(ObFrameContext context, + guint button) +{ + GSList *it; + ObFrameContext x = context; + + for (it = bound_contexts[context]; it; it = g_slist_next(it)) { + ObMouseBinding *b = it->data; + + if (b->button == button) + return context; + } + + switch (context) { + case OB_FRAME_CONTEXT_NONE: + 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_BLCORNER: + case OB_FRAME_CONTEXT_BRCORNER: + x = OB_FRAME_CONTEXT_HANDLE; + break; + case OB_FRAME_CONTEXT_TLCORNER: + case OB_FRAME_CONTEXT_TRCORNER: + case OB_FRAME_CONTEXT_MAXIMIZE: + case OB_FRAME_CONTEXT_ALLDESKTOPS: + case OB_FRAME_CONTEXT_SHADE: + case OB_FRAME_CONTEXT_ICONIFY: + case OB_FRAME_CONTEXT_ICON: + case OB_FRAME_CONTEXT_CLOSE: + x = OB_FRAME_CONTEXT_TITLEBAR; + break; + case OB_FRAME_NUM_CONTEXTS: + g_assert_not_reached(); + } + + return x; +} + void mouse_grab_for_client(ObClient *client, gboolean grab) { int i; @@ -67,7 +128,7 @@ static void grab_all_clients(gboolean grab) mouse_grab_for_client(it->data, grab); } -static void clearall() +void mouse_unbind_all() { int i; GSList *it; @@ -106,8 +167,7 @@ static gboolean fire_binding(ObMouseAction a, ObFrameContext context, /* if not bound, then nothing to do! */ if (it == NULL) return FALSE; - for (it = b->actions[a]; it; it = it->next) - action_run_mouse(it->data, c, state, button, x, y); + action_run_mouse(b->actions[a], c, state, button, x, y); return TRUE; } @@ -122,10 +182,11 @@ void mouse_event(ObClient *client, XEvent *e) gboolean click = FALSE; gboolean dclick = FALSE; - context = frame_context(client, e->xany.window); - switch (e->type) { case ButtonPress: + context = frame_context(client, e->xany.window); + context = mouse_button_frame_context(context, e->xbutton.button); + px = e->xbutton.x_root; py = e->xbutton.y_root; button = e->xbutton.button; @@ -144,11 +205,15 @@ void mouse_event(ObClient *client, XEvent *e) break; case ButtonRelease: + context = frame_context(client, e->xany.window); + context = mouse_button_frame_context(context, e->xbutton.button); + if (e->xbutton.button == button) { /* clicks are only valid if its released over the window */ int junk1, junk2; Window wjunk; guint ujunk, b, w, h; + /* this can cause errors to occur when the window closes */ xerror_set_ignore(TRUE); junk1 = XGetGeometry(ob_display, e->xbutton.window, &wjunk, &junk1, &junk2, &w, &h, &b, &ujunk); @@ -200,6 +265,9 @@ void mouse_event(ObClient *client, XEvent *e) case MotionNotify: if (button) { + context = frame_context(client, e->xany.window); + context = mouse_button_frame_context(context, button); + if (ABS(e->xmotion.x_root - px) >= config_mouse_threshold || ABS(e->xmotion.y_root - py) >= @@ -227,8 +295,8 @@ void mouse_event(ObClient *client, XEvent *e) } } -gboolean mouse_bind(char *buttonstr, char *contextstr, ObMouseAction mact, - ObAction *action) +gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr, + ObMouseAction mact, ObAction *action) { guint state, button; ObFrameContext context; @@ -240,14 +308,11 @@ gboolean mouse_bind(char *buttonstr, char *contextstr, ObMouseAction mact, return FALSE; } - contextstr = g_ascii_strdown(contextstr, -1); context = frame_context_from_string(contextstr); if (!context) { g_warning("invalid context '%s'", contextstr); - g_free(contextstr); return FALSE; } - g_free(contextstr); for (it = bound_contexts[context]; it != NULL; it = it->next){ b = it->data; @@ -282,5 +347,5 @@ void mouse_startup(gboolean reconfig) void mouse_shutdown(gboolean reconfig) { grab_all_clients(FALSE); - clearall(); + mouse_unbind_all(); }