static JSValueRef mouseDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { int button = 1; if (argumentCount == 1) { button = static_cast<int>(JSValueToNumber(context, arguments[0], exception)) + 1; g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); } GdkEvent event; if (!prepareMouseButtonEvent(&event, button)) return JSValueMakeUndefined(context); buttonCurrentlyDown = event.button.button; // Normally GDK will send both GDK_BUTTON_PRESS and GDK_2BUTTON_PRESS for // the second button press during double-clicks. WebKit GTK+ selectively // ignores the first GDK_BUTTON_PRESS of that pair using gdk_event_peek. // Since our events aren't ever going onto the GDK event queue, WebKit won't // be able to filter out the first GDK_BUTTON_PRESS, so we just don't send // it here. Eventually this code should probably figure out a way to get all // appropriate events onto the event queue and this work-around should be // removed. updateClickCount(event.button.button); if (clickCount == 2) event.type = GDK_2BUTTON_PRESS; else if (clickCount == 3) event.type = GDK_3BUTTON_PRESS; else event.type = GDK_BUTTON_PRESS; sendOrQueueEvent(event); return JSValueMakeUndefined(context); }
static JSValueRef contextClickCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { GdkEvent event; if (!prepareMouseButtonEvent(&event, 3)) return JSValueMakeUndefined(context); event.type = GDK_BUTTON_PRESS; sendOrQueueEvent(event); event.type = GDK_BUTTON_RELEASE; sendOrQueueEvent(event); return JSValueMakeUndefined(context); }
static JSValueRef contextClickCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { GdkEvent* pressEvent = gdk_event_new(GDK_BUTTON_PRESS); if (!prepareMouseButtonEvent(pressEvent, 2, 0)) return JSValueMakeUndefined(context); GdkEvent* releaseEvent = gdk_event_copy(pressEvent); sendOrQueueEvent(pressEvent); releaseEvent->type = GDK_BUTTON_RELEASE; sendOrQueueEvent(releaseEvent); return JSValueMakeUndefined(context); }
static JSValueRef mouseUpCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { int button = 1; if (argumentCount == 1) { button = static_cast<int>(JSValueToNumber(context, arguments[0], exception)) + 1; g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); } GdkEvent event; if (!prepareMouseButtonEvent(&event, button)) return JSValueMakeUndefined(context); lastClickPositionX = lastMousePositionX; lastClickPositionY = lastMousePositionY; lastClickButton = buttonCurrentlyDown; lastClickTimeOffset = timeOffset; buttonCurrentlyDown = 0; event.type = GDK_BUTTON_RELEASE; sendOrQueueEvent(event); return JSValueMakeUndefined(context); }
static JSValueRef mouseUpCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { int button = 0; if (argumentCount == 1) { button = static_cast<int>(JSValueToNumber(context, arguments[0], exception)); g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); } guint modifiers = argumentCount >= 2 ? gdkModifersFromJSValue(context, arguments[1]) : 0; GdkEvent* event = gdk_event_new(GDK_BUTTON_RELEASE); if (!prepareMouseButtonEvent(event, button, modifiers)) return JSValueMakeUndefined(context); lastClickPositionX = lastMousePositionX; lastClickPositionY = lastMousePositionY; lastClickButton = buttonCurrentlyDown; lastClickTimeOffset = timeOffset; buttonCurrentlyDown = 0; sendOrQueueEvent(event); return JSValueMakeUndefined(context); }