/* Send the appropriate number of button clicks to emulate scroll wheel */ void DarwinSendScrollEvents(double scroll_x, double scroll_y) { ScreenPtr screen; ValuatorMask valuators; if (!darwinEvents) { DEBUG_LOG( "DarwinSendScrollEvents called before darwinEvents was initialized\n"); return; } screen = miPointerGetScreen(darwinPointer); if (!screen) { DEBUG_LOG( "DarwinSendScrollEvents called before screen was initialized\n"); return; } valuator_mask_zero(&valuators); valuator_mask_set_double(&valuators, 4, scroll_y); valuator_mask_set_double(&valuators, 5, scroll_x); darwinEvents_lock(); { QueuePointerEvents(darwinPointer, MotionNotify, 0, POINTER_RELATIVE, &valuators); DarwinPokeEQ(); } darwinEvents_unlock(); }
void valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src) { if (src) memcpy(dest, src, sizeof(*dest)); else valuator_mask_zero(dest); }
/** * Sets a range of valuators between first_valuator and num_valuators with * the data in the valuators array. All other values are set to 0. */ void valuator_mask_set_range(ValuatorMask *mask, int first_valuator, int num_valuators, const int* valuators) { int i; valuator_mask_zero(mask); for (i = first_valuator; i < min(first_valuator + num_valuators, MAX_VALUATORS); i++) valuator_mask_set(mask, i, valuators[i - first_valuator]); }
void DarwinSendTabletEvents(DeviceIntPtr pDev, int ev_type, int ev_button, double pointer_x, double pointer_y, double pressure, double tilt_x, double tilt_y) { ScreenPtr screen; ValuatorMask valuators; if (!darwinEvents) { DEBUG_LOG("%s called before darwinEvents was initialized\n", __FUNCTION__); return; } screen = miPointerGetScreen(pDev); if (!screen) { DEBUG_LOG("%s called before screen was initialized\n", __FUNCTION__); return; } /* Fix offset between darwin and X screens */ pointer_x -= darwinMainScreenX + screen->x; pointer_y -= darwinMainScreenY + screen->y; /* Adjust our pointer location to the [0,1] range */ pointer_x = pointer_x / (double)screenInfo.width; pointer_y = pointer_y / (double)screenInfo.height; valuator_mask_zero(&valuators); valuator_mask_set_double(&valuators, 0, XQUARTZ_VALUATOR_LIMIT * pointer_x); valuator_mask_set_double(&valuators, 1, XQUARTZ_VALUATOR_LIMIT * pointer_y); valuator_mask_set_double(&valuators, 2, XQUARTZ_VALUATOR_LIMIT * pressure); valuator_mask_set_double(&valuators, 3, XQUARTZ_VALUATOR_LIMIT * tilt_x); valuator_mask_set_double(&valuators, 4, XQUARTZ_VALUATOR_LIMIT * tilt_y); darwinEvents_lock(); { if (ev_type == ProximityIn || ev_type == ProximityOut) { QueueProximityEvents(pDev, ev_type, &valuators); } else { QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE, &valuators); } DarwinPokeEQ(); } darwinEvents_unlock(); }
void winMouseButtonsSendEvent(int iEventType, int iButton) { ValuatorMask mask; if (g_winMouseButtonMap) iButton = g_winMouseButtonMap[iButton]; valuator_mask_zero(&mask); QueuePointerEvents(g_pwinPointer, iEventType, iButton, POINTER_RELATIVE, &mask); winDebug("winMouseButtonsSendEvent: iEventType: %d, iButton: %d\n", iEventType, iButton); }
static void set_and_post_mask(struct MTouch *mt, DeviceIntPtr dev, mstime_t delta_t){ struct Gestures* gs; ValuatorMask* mask; float speed_factor; gs = &mt->gs; mask = mt->vm; valuator_mask_zero(mask); if (gs->move_dx) valuator_mask_set_double(mask, 0, gs->move_dx); if (gs->move_dy) valuator_mask_set_double(mask, 1, gs->move_dy); switch (gs->move_type){ case GS_SCROLL: case GS_SWIPE3: case GS_SWIPE4: //case GS_MOVE: case GS_NONE: /* Only scroll, or swipe or move can trigger coasting right now */ /* Continue coasting if enabled */ speed_factor = (mt->cfg.scroll_coast.num_of_ticks - gs->scroll_coast_tick_no) / (float)(mt->cfg.scroll_coast.num_of_ticks); if (ABSVAL(gs->scroll_speed_x) > mt->cfg.scroll_coast.min_speed) valuator_mask_set_double(mask, 2, gs->scroll_speed_x * delta_t * speed_factor); if (ABSVAL(gs->scroll_speed_y) > mt->cfg.scroll_coast.min_speed) valuator_mask_set_double(mask, 3, gs->scroll_speed_y * delta_t * speed_factor); break; default: /* Any other movement/gesture type will break coasting. */ mt->gs.scroll_speed_y = mt->gs.scroll_speed_x = 0.0f; break; } xf86PostMotionEventM(dev, Relative, mask); /* Once posted, we can clear the move variables */ gs->move_dx = gs->move_dy = 0; }
void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, double pointer_x, double pointer_y, double pointer_dx, double pointer_dy) { static int darwinFakeMouseButtonDown = 0; ScreenPtr screen; ValuatorMask valuators; if (!darwinEvents) { DEBUG_LOG("%s called before darwinEvents was initialized\n", __FUNCTION__); return; } screen = miPointerGetScreen(pDev); if (!screen) { DEBUG_LOG("%s called before screen was initialized\n", __FUNCTION__); return; } /* Handle fake click */ if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) { if (darwinFakeMouseButtonDown != 0) { /* We're currently "down" with another button, so release it first */ DarwinSendPointerEvents(pDev, ButtonRelease, darwinFakeMouseButtonDown, pointer_x, pointer_y, 0.0, 0.0); darwinFakeMouseButtonDown = 0; } if (darwin_all_modifier_flags & darwinFakeMouse2Mask) { ev_button = 2; darwinFakeMouseButtonDown = 2; DarwinUpdateModKeys( darwin_all_modifier_flags & ~darwinFakeMouse2Mask); } else if (darwin_all_modifier_flags & darwinFakeMouse3Mask) { ev_button = 3; darwinFakeMouseButtonDown = 3; DarwinUpdateModKeys( darwin_all_modifier_flags & ~darwinFakeMouse3Mask); } } if (ev_type == ButtonRelease && ev_button == 1) { if (darwinFakeMouseButtonDown) { ev_button = darwinFakeMouseButtonDown; } if (darwinFakeMouseButtonDown == 2) { DarwinUpdateModKeys( darwin_all_modifier_flags & ~darwinFakeMouse2Mask); } else if (darwinFakeMouseButtonDown == 3) { DarwinUpdateModKeys( darwin_all_modifier_flags & ~darwinFakeMouse3Mask); } darwinFakeMouseButtonDown = 0; } /* Fix offset between darwin and X screens */ pointer_x -= darwinMainScreenX + screen->x; pointer_y -= darwinMainScreenY + screen->y; valuator_mask_zero(&valuators); valuator_mask_set_double(&valuators, 0, pointer_x); valuator_mask_set_double(&valuators, 1, pointer_y); if (ev_type == MotionNotify) { if (pointer_dx != 0.0) valuator_mask_set_double(&valuators, 2, pointer_dx); if (pointer_dy != 0.0) valuator_mask_set_double(&valuators, 3, pointer_dy); } darwinEvents_lock(); { QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE, &valuators); DarwinPokeEQ(); } darwinEvents_unlock(); }