summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-09 23:38:16 +0000
committerDana Jansens <danakj@orodu.net>2007-05-09 23:38:16 +0000
commitda2295878691d876abf89b6e33d817386e46059a (patch)
tree8342521aa232a760a3087041adc4464d43f725d1
parent66afa1dcebaf8f1562311d1293baf4094f9ac011 (diff)
fix hovering for corner buttons during full-max
-rw-r--r--openbox/event.c49
-rw-r--r--openbox/frame.c2
2 files changed, 46 insertions, 5 deletions
diff --git a/openbox/event.c b/openbox/event.c
index ef320afd..8523f637 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -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);
diff --git a/openbox/frame.c b/openbox/frame.c
index 50f0dc61..1f45ea8b 100644
--- a/openbox/frame.c
+++ b/openbox/frame.c
@@ -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