fix hovering for corner buttons during full-max

This commit is contained in:
Dana Jansens 2007-05-09 23:38:16 +00:00
parent 66afa1dceb
commit da22958786
2 changed files with 46 additions and 5 deletions

View file

@ -730,12 +730,16 @@ static void event_handle_client(ObClient *client, XEvent *e)
Atom msgtype;
ObFrameContext con;
static gint px = -1, py = -1;
static guint pb = 0;
switch (e->type) {
case ButtonPress:
/* save where the press occured for the first button pressed */
if (px == -1) px = e->xbutton.x;
if (py == -1) py = e->xbutton.y;
if (!pb) {
pb = e->xbutton.button;
px = e->xbutton.x;
py = e->xbutton.y;
}
case ButtonRelease:
/* Wheel buttons don't draw because they are an instant click, so it
is a waste of resources to go drawing it.
@ -751,8 +755,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
con = frame_context(client, e->xbutton.window, px, py);
con = mouse_button_frame_context(con, e->xbutton.button);
if (e->type == ButtonRelease)
px = py = -1;
if (e->type == ButtonRelease && e->xbutton.button == pb)
pb = 0, px = py = -1;
switch (con) {
case OB_FRAME_CONTEXT_MAXIMIZE:
@ -781,6 +785,43 @@ static void event_handle_client(ObClient *client, XEvent *e)
}
}
break;
case MotionNotify:
con = frame_context(client, e->xmotion.window,
e->xmotion.x, e->xmotion.y);
switch (con) {
case OB_FRAME_CONTEXT_TITLEBAR:
/* we've left the button area inside the titlebar */
client->frame->max_hover = FALSE;
client->frame->desk_hover = FALSE;
client->frame->shade_hover = FALSE;
client->frame->iconify_hover = FALSE;
client->frame->close_hover = FALSE;
frame_adjust_state(client->frame);
break;
case OB_FRAME_CONTEXT_MAXIMIZE:
client->frame->max_hover = TRUE;
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_SHADE:
client->frame->shade_hover = TRUE;
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_CLOSE:
client->frame->close_hover = TRUE;
frame_adjust_state(client->frame);
break;
default:
break;
}
break;
case LeaveNotify:
con = frame_context(client, e->xcrossing.window,
e->xcrossing.x, e->xcrossing.y);

View file

@ -34,7 +34,7 @@
#define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
ButtonPressMask | ButtonReleaseMask)
#define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \
ButtonMotionMask | \
ButtonMotionMask | PointerMotionMask | \
EnterWindowMask | LeaveWindowMask)
/* The inner window does not need enter/leave events.
If it does get them, then it needs its own context for enter events