all repos — openbox @ 9caa096ad95772741514b1a5cccf288f249e9b1e

openbox fork - make it a bit more like ryudo

frame context fallbacks when there is no binding on the context
Dana Jansens danakj@orodu.net
commit

9caa096ad95772741514b1a5cccf288f249e9b1e

parent

13dbd8cb17d9ad5f21742306a8d06113f5b1bbbc

3 files changed, 58 insertions(+), 4 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -581,7 +581,9 @@ case ButtonRelease:

/* 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);
M openbox/mouse.copenbox/mouse.c

@@ -23,9 +23,51 @@ #define CLIENT_CONTEXT(co, cl) ((cl && cl->type == OB_CLIENT_TYPE_DESKTOP) ? \

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 @@ ObFrameContext context;

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 @@ } else

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 @@ break;

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) >=
M openbox/mouse.hopenbox/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