frame context fallbacks when there is no binding on the context
authorDana Jansens <danakj@orodu.net>
Wed, 10 Sep 2003 20:05:06 +0000 (20:05 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 10 Sep 2003 20:05:06 +0000 (20:05 +0000)
openbox/event.c
openbox/mouse.c
openbox/mouse.h

index f5b2ec4..22a074f 100644 (file)
@@ -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);
index ab628ff..26aa859 100644 (file)
@@ -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) >=
index deba7ed..95dcc55 100644 (file)
@@ -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