This allows a click to go though even if a small amount of mouse motion
is detected. Currently set to 8 motion events, it might be better to use
pixels instead of events.
/* Handle button click */
if (sig == SIG_BUTTON_PRESS)
/* Handle button click */
if (sig == SIG_BUTTON_PRESS)
- object->state.clicking = TRUE;
+ object->state.clicking = GRITS_CLICK_THRESHOLD;
+ if (sig == SIG_MOTION && object->state.clicking)
+ object->state.clicking -= 1;
if (sig == SIG_BUTTON_RELEASE && object->state.clicking)
g_signal_emit(object, signals[SIG_CLICKED], 0, event, &rval);
if (sig == SIG_BUTTON_RELEASE && object->state.clicking)
g_signal_emit(object, signals[SIG_CLICKED], 0, event, &rval);
- if (sig == SIG_BUTTON_RELEASE || sig == SIG_MOTION)
- object->state.clicking = FALSE;
+ if (sig == SIG_BUTTON_RELEASE)
+ object->state.clicking = 0;
/* Emit this signal */
if (rval == FALSE) {
/* Emit this signal */
if (rval == FALSE) {
#define GRITS_SKIP_CENTER (1<<2)
#define GRITS_SKIP_STATE (1<<3)
#define GRITS_SKIP_CENTER (1<<2)
#define GRITS_SKIP_STATE (1<<3)
+/* Mouse move threshold for clicking */
+#define GRITS_CLICK_THRESHOLD 8
+
/* Picking states */
typedef struct {
guint picked : 1;
guint selected : 1;
/* Picking states */
typedef struct {
guint picked : 1;
guint selected : 1;
} GritsState;
typedef struct _GritsObject GritsObject;
} GritsState;
typedef struct _GritsObject GritsObject;