Fix button press behaviours. On LeaveNotify, make the button no longer pressed....
authorDana Jansens <danakj@orodu.net>
Mon, 18 Feb 2008 22:12:38 +0000 (17:12 -0500)
committerDana Jansens <danakj@orodu.net>
Tue, 19 Feb 2008 01:42:35 +0000 (20:42 -0500)
This fixes case where you left-click and hold on a button, then right click to open the menu - this used to leave the button in a pressed state.

openbox/event.c

index 2d3ecec..28c13a2 100644 (file)
@@ -843,6 +843,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
     ObFrameContext con;
     static gint px = -1, py = -1;
     static guint pb = 0;
     ObFrameContext con;
     static gint px = -1, py = -1;
     static guint pb = 0;
+    static ObFrameContext pcon = OB_FRAME_CONTEXT_NONE;
 
     switch (e->type) {
     case ButtonPress:
 
     switch (e->type) {
     case ButtonPress:
@@ -851,6 +852,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
             pb = e->xbutton.button;
             px = e->xbutton.x;
             py = e->xbutton.y;
             pb = e->xbutton.button;
             px = e->xbutton.x;
             py = e->xbutton.y;
+
+            pcon = frame_context(client, e->xbutton.window, px, py);
+            pcon = mouse_button_frame_context(pcon, e->xbutton.button,
+                                              e->xbutton.state);
         }
     case ButtonRelease:
         /* Wheel buttons don't draw because they are an instant click, so it
         }
     case ButtonRelease:
         /* Wheel buttons don't draw because they are an instant click, so it
@@ -868,7 +873,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                              e->xbutton.state);
 
             if (e->type == ButtonRelease && e->xbutton.button == pb)
                                              e->xbutton.state);
 
             if (e->type == ButtonRelease && e->xbutton.button == pb)
-                pb = 0, px = py = -1;
+                pb = 0, px = py = -1, pcon = OB_FRAME_CONTEXT_NONE;
 
             switch (con) {
             case OB_FRAME_CONTEXT_MAXIMIZE:
 
             switch (con) {
             case OB_FRAME_CONTEXT_MAXIMIZE:
@@ -922,31 +927,31 @@ static void event_handle_client(ObClient *client, XEvent *e)
             }
             break;
         case OB_FRAME_CONTEXT_MAXIMIZE:
             }
             break;
         case OB_FRAME_CONTEXT_MAXIMIZE:
-            if (!client->frame->max_hover) {
+            if (!client->frame->max_hover && !pb) {
                 client->frame->max_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_ALLDESKTOPS:
                 client->frame->max_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_ALLDESKTOPS:
-            if (!client->frame->desk_hover) {
+            if (!client->frame->desk_hover && !pb) {
                 client->frame->desk_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_SHADE:
                 client->frame->desk_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_SHADE:
-            if (!client->frame->shade_hover) {
+            if (!client->frame->shade_hover && !pb) {
                 client->frame->shade_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_ICONIFY:
                 client->frame->shade_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_ICONIFY:
-            if (!client->frame->iconify_hover) {
+            if (!client->frame->iconify_hover && !pb) {
                 client->frame->iconify_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_CLOSE:
                 client->frame->iconify_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
             break;
         case OB_FRAME_CONTEXT_CLOSE:
-            if (!client->frame->close_hover) {
+            if (!client->frame->close_hover && !pb) {
                 client->frame->close_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
                 client->frame->close_hover = TRUE;
                 frame_adjust_state(client->frame);
             }
@@ -977,22 +982,27 @@ static void event_handle_client(ObClient *client, XEvent *e)
             break;
         case OB_FRAME_CONTEXT_MAXIMIZE:
             client->frame->max_hover = FALSE;
             break;
         case OB_FRAME_CONTEXT_MAXIMIZE:
             client->frame->max_hover = FALSE;
+            client->frame->max_press = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ALLDESKTOPS:
             client->frame->desk_hover = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ALLDESKTOPS:
             client->frame->desk_hover = FALSE;
+            client->frame->desk_press = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_SHADE:
             client->frame->shade_hover = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_SHADE:
             client->frame->shade_hover = FALSE;
+            client->frame->shade_press = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ICONIFY:
             client->frame->iconify_hover = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ICONIFY:
             client->frame->iconify_hover = FALSE;
+            client->frame->iconify_press = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_CLOSE:
             client->frame->close_hover = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_CLOSE:
             client->frame->close_hover = FALSE;
+            client->frame->close_press = FALSE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_FRAME:
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_FRAME:
@@ -1031,22 +1041,27 @@ static void event_handle_client(ObClient *client, XEvent *e)
         switch (con) {
         case OB_FRAME_CONTEXT_MAXIMIZE:
             client->frame->max_hover = TRUE;
         switch (con) {
         case OB_FRAME_CONTEXT_MAXIMIZE:
             client->frame->max_hover = TRUE;
+            client->frame->max_press = (con == pcon);
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ALLDESKTOPS:
             client->frame->desk_hover = TRUE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ALLDESKTOPS:
             client->frame->desk_hover = TRUE;
+            client->frame->desk_press = (con == pcon);
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_SHADE:
             client->frame->shade_hover = TRUE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_SHADE:
             client->frame->shade_hover = TRUE;
+            client->frame->shade_press = (con == pcon);
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ICONIFY:
             client->frame->iconify_hover = TRUE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_ICONIFY:
             client->frame->iconify_hover = TRUE;
+            client->frame->iconify_press = (con == pcon);
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_CLOSE:
             client->frame->close_hover = TRUE;
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_CLOSE:
             client->frame->close_hover = TRUE;
+            client->frame->close_press = (con == pcon);
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_FRAME:
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_FRAME: