X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fmouse%2Fmouse.c;h=4c19d2436a65800004e2c77b6602e81e85487a4e;hb=47cc179781aec47bf317c5c15879fa0dad95de86;hp=9a1549362f029419f4852ffe0ba43f794767d39e;hpb=d75e094032c10a4f752c83f8b01542739787e5f5;p=chaz%2Fopenbox diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c index 9a154936..4c19d243 100644 --- a/plugins/mouse/mouse.c +++ b/plugins/mouse/mouse.c @@ -6,6 +6,7 @@ #include "../../kernel/frame.h" #include "../../kernel/grab.h" #include "../../kernel/engine.h" +#include "../../kernel/config.h" #include "translate.h" #include "mouse.h" #include "mouserc_parse.h" @@ -13,10 +14,17 @@ void plugin_setup_config() { + config_def_set(config_def_new("mouse.dragThreshold", Config_Integer, + "Drag Threshold", + "The drag threshold in pixels before a Drag " + "event starts.")); + config_def_set(config_def_new("mouse.doubleClickTime", Config_Integer, + "Double Click Interval", + "The amount of time (in milliseconds) in " + "which two clicks must occur to cause a " + "DoubleClick event.")); } -static int drag_threshold = 3; - /* GData of GSList*s of PointerBinding*s. */ static GData *bound_contexts; @@ -190,9 +198,16 @@ static void event(ObEvent *e, void *foo) static guint button = 0, lbutton = 0; static gboolean drag = FALSE, drag_used = FALSE; static Corner corner = Corner_TopLeft; + ConfigValue doubleclicktime; + ConfigValue dragthreshold; gboolean click = FALSE; gboolean dclick = FALSE; GQuark context; + + if (!config_get("mouse.dragThreshold", Config_Integer, &dragthreshold)) + dragthreshold.integer = 3; /* default */ + if (!config_get("mouse.doubleClickTime", Config_Integer, &doubleclicktime)) + doubleclicktime.integer = 200; /* default */ switch (e->type) { case Event_Client_Mapped: @@ -208,8 +223,15 @@ static void event(ObEvent *e, void *foo) if (e->data.x.client != NULL) { cx = e->data.x.client->frame->area.x; cy = e->data.x.client->frame->area.y; - cw = e->data.x.client->frame->area.width; - ch = e->data.x.client->frame->area.height; + /* use the client size because the frame can be differently + sized (shaded windows) and we want this based on the clients + size */ + cw = e->data.x.client->area.width + + e->data.x.client->frame->size.left + + e->data.x.client->frame->size.right; + ch = e->data.x.client->area.height + + e->data.x.client->frame->size.top + + e->data.x.client->frame->size.bottom; px = e->data.x.e->xbutton.x_root; py = e->data.x.e->xbutton.y_root; corner = pick_corner(px, py, cx, cy, cw, ch); @@ -240,7 +262,7 @@ static void event(ObEvent *e, void *foo) e->data.x.client, e->data.x.e->xbutton.state, e->data.x.e->xbutton.button, cx, cy, cw, ch, dx, dy, TRUE, corner); - drag = FALSE; + drag = drag_used = FALSE; lbutton = 0; } else { @@ -257,7 +279,8 @@ static void event(ObEvent *e, void *foo) click = TRUE; /* double clicks happen if there were 2 in a row! */ if (lbutton == button && - e->data.x.e->xbutton.time - 300 <= ltime) { + e->data.x.e->xbutton.time - doubleclicktime.integer <= + ltime) { dclick = TRUE; lbutton = 0; } else @@ -287,7 +310,8 @@ static void event(ObEvent *e, void *foo) dx = e->data.x.e->xmotion.x_root - px; dy = e->data.x.e->xmotion.y_root - py; if (!drag && - (ABS(dx) >= drag_threshold || ABS(dy) >= drag_threshold)) + (ABS(dx) >= dragthreshold.integer || + ABS(dy) >= dragthreshold.integer)) drag = TRUE; if (drag) { context = engine_get_context(e->data.x.client,