Fix button press behaviours. On LeaveNotify, make the button no longer pressed. On MotionNotify, only make it hovered if no button is pressed down. On EnterNotify, make it hovered or pressed as appropriate.
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.
This commit is contained in:
parent
5bfa48dcff
commit
041d17373e
1 changed files with 21 additions and 6 deletions
|
@ -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;
|
||||
static ObFrameContext pcon = OB_FRAME_CONTEXT_NONE;
|
||||
|
||||
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;
|
||||
|
||||
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
|
||||
|
@ -868,7 +873,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
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:
|
||||
|
@ -922,31 +927,31 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
}
|
||||
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:
|
||||
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:
|
||||
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:
|
||||
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:
|
||||
if (!client->frame->close_hover) {
|
||||
if (!client->frame->close_hover && !pb) {
|
||||
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;
|
||||
client->frame->max_press = 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;
|
||||
client->frame->shade_press = 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;
|
||||
client->frame->close_press = FALSE;
|
||||
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;
|
||||
client->frame->max_press = (con == pcon);
|
||||
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;
|
||||
client->frame->shade_press = (con == pcon);
|
||||
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;
|
||||
client->frame->close_press = (con == pcon);
|
||||
frame_adjust_state(client->frame);
|
||||
break;
|
||||
case OB_FRAME_CONTEXT_FRAME:
|
||||
|
|
Loading…
Reference in a new issue