From 9caa096ad95772741514b1a5cccf288f249e9b1e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 10 Sep 2003 20:05:06 +0000 Subject: [PATCH] frame context fallbacks when there is no binding on the context --- openbox/event.c | 4 +++- openbox/mouse.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++--- openbox/mouse.h | 3 +++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/openbox/event.c b/openbox/event.c index f5b2ec48..22a074fd 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -581,7 +581,9 @@ static void event_handle_client(ObClient *client, XEvent *e) /* Wheel buttons don't draw because they are an instant click, so it is a waste of resources to go drawing it. */ if (!(e->xbutton.button == 4 || e->xbutton.button == 5)) { - switch (frame_context(client, e->xbutton.window)) { + con = frame_context(client, e->xbutton.window); + con = mouse_button_frame_context(con, e->xbutton.button); + switch (con) { case OB_FRAME_CONTEXT_MAXIMIZE: client->frame->max_press = (e->type == ButtonPress); framerender_frame(client->frame); diff --git a/openbox/mouse.c b/openbox/mouse.c index ab628ff3..26aa8596 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -23,9 +23,51 @@ 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: + 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; @@ -122,10 +164,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,6 +187,9 @@ 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; @@ -200,6 +246,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) >= diff --git a/openbox/mouse.h b/openbox/mouse.h index deba7ed2..95dcc55f 100644 --- a/openbox/mouse.h +++ b/openbox/mouse.h @@ -17,4 +17,7 @@ void mouse_event(struct _ObClient *client, XEvent *e); void mouse_grab_for_client(struct _ObClient *client, gboolean grab); +ObFrameContext mouse_button_frame_context(ObFrameContext context, + guint button); + #endif -- 2.44.0