#include "openbox.h"
#include "config.h"
+#include "xerror.h"
#include "action.h"
#include "event.h"
#include "client.h"
GSList *actions[OB_MOUSE_NUM_ACTIONS]; /* lists of Action pointers */
} ObMouseBinding;
-#define CLIENT_CONTEXT(co, cl) (co == OB_FRAME_CONTEXT_CLIENT || \
- (co == OB_FRAME_CONTEXT_ROOT && \
- cl->type == OB_CLIENT_TYPE_DESKTOP))
+#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 PointerBinding*s. */
static GSList *bound_contexts[OB_FRAME_NUM_CONTEXTS];
int mode;
unsigned int mask;
- if (i == OB_FRAME_CONTEXT_FRAME) {
+ if (FRAME_CONTEXT(i, client)) {
win = client->frame->window;
mode = GrabModeAsync;
mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask;
} else continue;
if (grab)
- grab_button_full(b->button, b->state, win, mask, mode, None);
+ grab_button_full(b->button, b->state, win, mask, mode,
+ OB_CURSOR_NONE);
else
ungrab_button(b->button, b->state, win);
}
g_free(b);
}
g_slist_free(bound_contexts[i]);
+ bound_contexts[i] = NULL;
}
}
act->data.showmenu.y = y;
}
- if (act->func == action_desktop_dir)
- {
- act->data.desktopdir.final = FALSE;
- act->data.desktopdir.cancel = FALSE;
- }
- if (act->func == action_send_to_desktop_dir)
- {
- act->data.sendtodir.final = FALSE;
- act->data.sendtodir.cancel = FALSE;
- }
-
- if (config_desktop_popup &&
- (act->func == action_desktop_dir ||
- act->func == action_send_to_desktop_dir))
- {
+ if (act->data.any.interactive) {
+ act->data.inter.cancel = FALSE;
+ act->data.inter.final = FALSE;
keyboard_interactive_grab(state, c, context, act);
}
static int px, py;
gboolean click = FALSE;
gboolean dclick = FALSE;
-
+
switch (e->type) {
case ButtonPress:
px = e->xbutton.x_root;
int junk1, junk2;
Window wjunk;
guint ujunk, b, w, h;
- XGetGeometry(ob_display, e->xbutton.window,
- &wjunk, &junk1, &junk2, &w, &h, &b, &ujunk);
- if (e->xbutton.x >= (signed)-b &&
- e->xbutton.y >= (signed)-b &&
- e->xbutton.x < (signed)(w+b) &&
- e->xbutton.y < (signed)(h+b)) {
- click = TRUE;
- /* double clicks happen if there were 2 in a row! */
- if (lbutton == button &&
- lwindow == e->xbutton.window &&
- e->xbutton.time - config_mouse_dclicktime <=
- ltime) {
- dclick = TRUE;
- lbutton = 0;
+ xerror_set_ignore(TRUE);
+ junk1 = XGetGeometry(ob_display, e->xbutton.window,
+ &wjunk, &junk1, &junk2, &w, &h, &b, &ujunk);
+ xerror_set_ignore(FALSE);
+ if (junk1) {
+ if (e->xbutton.x >= (signed)-b &&
+ e->xbutton.y >= (signed)-b &&
+ e->xbutton.x < (signed)(w+b) &&
+ e->xbutton.y < (signed)(h+b)) {
+ click = TRUE;
+ /* double clicks happen if there were 2 in a row! */
+ if (lbutton == button &&
+ lwindow == e->xbutton.window &&
+ e->xbutton.time - config_mouse_dclicktime <=
+ ltime) {
+ dclick = TRUE;
+ lbutton = 0;
+ } else {
+ lbutton = button;
+ lwindow = e->xbutton.window;
+ }
} else {
- lbutton = button;
- lwindow = e->xbutton.window;
+ lbutton = 0;
+ lwindow = None;
}
- } else {
- lbutton = 0;
- lwindow = None;
}
button = 0;
}
}
- grab_all_clients(FALSE);
+ /* when there are no modifiers in the binding, then the action cannot
+ be interactive */
+ if (!state && action->data.any.interactive) {
+ action->data.any.interactive = FALSE;
+ action->data.inter.final = TRUE;
+ }
/* add the binding */
b = g_new0(ObMouseBinding, 1);
b->actions[mact] = g_slist_append(NULL, action);
bound_contexts[context] = g_slist_append(bound_contexts[context], b);
- grab_all_clients(TRUE);
-
return TRUE;
}
-void mouse_startup()
+void mouse_startup(gboolean reconfig)
{
+ grab_all_clients(TRUE);
}
-void mouse_shutdown()
+void mouse_shutdown(gboolean reconfig)
{
grab_all_clients(FALSE);
clearall();