summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2008-02-26 03:15:21 -0500
committerDana Jansens <danakj@orodu.net>2008-02-26 03:15:21 -0500
commit7e47a57027e043d4fe908d5f0acb7882d4f9330f (patch)
tree395cddce3f441ae7b8b8191f3bf90cd06a1deef5 /openbox
parent8387c6cce85136426837e1528cdd2bf851a1ce3a (diff)
parent1ef0d8eb53fcae52afbae74310fbef0cac729951 (diff)
Merge branch 'backport' into work
Diffstat (limited to 'openbox')
-rw-r--r--openbox/event.c57
-rw-r--r--openbox/frame.h6
-rw-r--r--openbox/mouse.c6
3 files changed, 42 insertions, 27 deletions
diff --git a/openbox/event.c b/openbox/event.c
index 12c0edcf..2ccec270 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -877,7 +877,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
con = mouse_button_frame_context(con, e->xbutton.button,
e->xbutton.state);
- if (e->type == ButtonRelease && e->xbutton.button == pb)
+ /* button presses on CLIENT_CONTEXTs are not accompanied by a
+ release because they are Replayed to the client */
+ if ((e->type == ButtonRelease || CLIENT_CONTEXT(con, client)) &&
+ e->xbutton.button == pb)
pb = 0, px = py = -1, pcon = OB_FRAME_CONTEXT_NONE;
switch (con) {
@@ -973,41 +976,48 @@ static void event_handle_client(ObClient *client, XEvent *e)
case OB_FRAME_CONTEXT_TLCORNER:
case OB_FRAME_CONTEXT_TRCORNER:
/* we've left the button area inside the titlebar */
- if (client->frame->max_hover || client->frame->desk_hover ||
- client->frame->shade_hover || client->frame->iconify_hover ||
- client->frame->close_hover)
- {
- 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);
+ 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;
+ if (e->xcrossing.mode == NotifyGrab) {
+ client->frame->max_press = FALSE;
+ client->frame->desk_press = FALSE;
+ client->frame->shade_press = FALSE;
+ client->frame->iconify_press = FALSE;
+ client->frame->close_press = FALSE;
}
+ frame_adjust_state(client->frame);
break;
case OB_FRAME_CONTEXT_MAXIMIZE:
client->frame->max_hover = FALSE;
- client->frame->max_press = FALSE;
+ if (e->xcrossing.mode == NotifyGrab)
+ 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;
+ if (e->xcrossing.mode == NotifyGrab)
+ 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;
+ if (e->xcrossing.mode == NotifyGrab)
+ 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;
+ if (e->xcrossing.mode == NotifyGrab)
+ 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;
+ if (e->xcrossing.mode == NotifyGrab)
+ client->frame->close_press = FALSE;
frame_adjust_state(client->frame);
break;
case OB_FRAME_CONTEXT_FRAME:
@@ -1046,27 +1056,32 @@ 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);
+ if (e->xcrossing.mode == NotifyUngrab)
+ 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);
+ if (e->xcrossing.mode == NotifyUngrab)
+ 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);
+ if (e->xcrossing.mode == NotifyUngrab)
+ 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);
+ if (e->xcrossing.mode == NotifyUngrab)
+ 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);
+ if (e->xcrossing.mode == NotifyUngrab)
+ client->frame->close_press = (con == pcon);
frame_adjust_state(client->frame);
break;
case OB_FRAME_CONTEXT_FRAME:
diff --git a/openbox/frame.h b/openbox/frame.h
index 02be17a0..e1b787fe 100644
--- a/openbox/frame.h
+++ b/openbox/frame.h
@@ -56,6 +56,12 @@ typedef enum {
OB_FRAME_NUM_CONTEXTS
} ObFrameContext;
+#define FRAME_CONTEXT(co, cl) ((cl && cl->type != OB_CLIENT_TYPE_DESKTOP) ? \
+ co == OB_FRAME_CONTEXT_FRAME : FALSE)
+#define CLIENT_CONTEXT(co, cl) ((cl && cl->type == OB_CLIENT_TYPE_DESKTOP) ? \
+ co == OB_FRAME_CONTEXT_DESKTOP : \
+ co == OB_FRAME_CONTEXT_CLIENT)
+
/*! The decorations the client window wants to be displayed on it */
typedef enum {
OB_FRAME_DECOR_TITLEBAR = 1 << 0, /*!< Display a titlebar */
diff --git a/openbox/mouse.c b/openbox/mouse.c
index b5d97336..cd8490f1 100644
--- a/openbox/mouse.c
+++ b/openbox/mouse.c
@@ -37,12 +37,6 @@ typedef struct {
GSList *actions[OB_NUM_MOUSE_ACTIONS]; /* lists of Action pointers */
} ObMouseBinding;
-#define FRAME_CONTEXT(co, cl) ((cl && cl->type != OB_CLIENT_TYPE_DESKTOP) ? \
- co == OB_FRAME_CONTEXT_FRAME : FALSE)
-#define CLIENT_CONTEXT(co, cl) ((cl && cl->type == OB_CLIENT_TYPE_DESKTOP) ? \
- co == OB_FRAME_CONTEXT_DESKTOP : \
- co == OB_FRAME_CONTEXT_CLIENT)
-
/* Array of GSList*s of ObMouseBinding*s. */
static GSList *bound_contexts[OB_FRAME_NUM_CONTEXTS];
/* TRUE when we have a grab on the pointer and need to replay the pointer event