#include "openbox.h"
#include "config.h"
-#include "xerror.h"
#include "actions.h"
#include "event.h"
#include "client.h"
-#include "prop.h"
#include "grab.h"
#include "frame.h"
#include "translate.h"
#include "mouse.h"
#include "gettext.h"
+#include "obt/display.h"
#include <glib.h>
case OB_FRAME_CONTEXT_MOVE_RESIZE:
case OB_FRAME_CONTEXT_LEFT:
case OB_FRAME_CONTEXT_RIGHT:
+ case OB_FRAME_CONTEXT_DOCK:
break;
case OB_FRAME_CONTEXT_ROOT:
x = OB_FRAME_CONTEXT_DESKTOP;
actions_act_unref(jt->data);
g_slist_free(b->actions[j]);
}
- g_free(b);
+ g_slice_free(ObMouseBinding, b);
}
g_slist_free(bound_contexts[i]);
bound_contexts[i] = NULL;
return TRUE;
}
-void mouse_replay_pointer()
+void mouse_replay_pointer(void)
{
if (replay_pointer_needed) {
/* replay the pointer event before any windows move */
- XAllowEvents(ob_display, ReplayPointer, event_curtime);
+ XAllowEvents(obt_display, ReplayPointer, event_time());
replay_pointer_needed = FALSE;
}
}
-void mouse_event(ObClient *client, XEvent *e)
+gboolean mouse_event(ObClient *client, XEvent *e)
{
static Time ltime;
static guint button = 0, state = 0, lbutton = 0;
static Window lwindow = None;
- static gint px, py, pwx = -1, pwy = -1;
+ static gint px, py, pwx = -1, pwy = -1, lx = -10, ly = -10;
+ gboolean used = FALSE;
ObFrameContext context;
gboolean click = FALSE;
if (CLIENT_CONTEXT(context, client))
replay_pointer_needed = TRUE;
- fire_binding(OB_MOUSE_ACTION_PRESS, context,
- client, e->xbutton.state,
- e->xbutton.button,
- e->xbutton.x_root, e->xbutton.y_root);
+ used = fire_binding(OB_MOUSE_ACTION_PRESS, context,
+ client, e->xbutton.state,
+ e->xbutton.button,
+ e->xbutton.x_root, e->xbutton.y_root) || used;
/* if the bindings grab the pointer, there won't be a ButtonRelease
event for us */
Window wjunk;
guint ujunk, b, w, h;
/* this can cause errors to occur when the window closes */
- xerror_set_ignore(TRUE);
- junk1 = XGetGeometry(ob_display, e->xbutton.window,
+ obt_display_ignore_errors(TRUE);
+ junk1 = XGetGeometry(obt_display, e->xbutton.window,
&wjunk, &junk1, &junk2, &w, &h, &b, &ujunk);
- xerror_set_ignore(FALSE);
+ obt_display_ignore_errors(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)) {
+ 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) {
+ ltime &&
+ ABS(e->xbutton.x - lx) < 8 &&
+ ABS(e->xbutton.y - ly) < 8)
+ {
dclick = TRUE;
lbutton = 0;
} else {
lbutton = button;
lwindow = e->xbutton.window;
+ lx = e->xbutton.x;
+ ly = e->xbutton.y;
}
} else {
lbutton = 0;
state = 0;
ltime = e->xbutton.time;
}
- fire_binding(OB_MOUSE_ACTION_RELEASE, context,
- client, e->xbutton.state,
- e->xbutton.button,
- e->xbutton.x_root,
- e->xbutton.y_root);
+ used = fire_binding(OB_MOUSE_ACTION_RELEASE, context,
+ client, e->xbutton.state,
+ e->xbutton.button,
+ e->xbutton.x_root,
+ e->xbutton.y_root) || used;
if (click)
- fire_binding(OB_MOUSE_ACTION_CLICK, context,
- client, e->xbutton.state,
- e->xbutton.button,
- e->xbutton.x_root,
- e->xbutton.y_root);
+ used = fire_binding(OB_MOUSE_ACTION_CLICK, context,
+ client, e->xbutton.state,
+ e->xbutton.button,
+ e->xbutton.x_root,
+ e->xbutton.y_root) || used;
if (dclick)
- fire_binding(OB_MOUSE_ACTION_DOUBLE_CLICK, context,
- client, e->xbutton.state,
- e->xbutton.button,
- e->xbutton.x_root,
- e->xbutton.y_root);
+ used = fire_binding(OB_MOUSE_ACTION_DOUBLE_CLICK, context,
+ client, e->xbutton.state,
+ e->xbutton.button,
+ e->xbutton.x_root,
+ e->xbutton.y_root) || used;
break;
case MotionNotify:
context == OB_FRAME_CONTEXT_CLOSE)
break;
- fire_binding(OB_MOUSE_ACTION_MOTION, context,
- client, state, button, px, py);
+ used = fire_binding(OB_MOUSE_ACTION_MOTION, context,
+ client, state, button, px, py);
button = 0;
state = 0;
}
default:
g_assert_not_reached();
}
+ return used;
}
-gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr,
+gboolean mouse_bind(const gchar *buttonstr, ObFrameContext context,
ObMouseAction mact, ObActionsAct *action)
{
guint state, button;
- ObFrameContext context;
ObMouseBinding *b;
GSList *it;
+ g_assert(context != OB_FRAME_CONTEXT_NONE);
+
if (!translate_button(buttonstr, &state, &button)) {
g_message(_("Invalid button \"%s\" in mouse binding"), buttonstr);
return FALSE;
}
- context = frame_context_from_string(contextstr);
- if (!context) {
- g_message(_("Invalid context \"%s\" in mouse binding"), contextstr);
- return FALSE;
- }
-
for (it = bound_contexts[context]; it; it = g_slist_next(it)) {
b = it->data;
if (b->state == state && b->button == button) {
}
/* add the binding */
- b = g_new0(ObMouseBinding, 1);
+ b = g_slice_new0(ObMouseBinding);
b->state = state;
b->button = button;
b->actions[mact] = g_slist_append(NULL, action);