static void weston_output_update_zoom_transform(struct weston_output *output) { float global_x, global_y; wl_fixed_t x = output->zoom.current.x; /* global pointer coords */ wl_fixed_t y = output->zoom.current.y; float level; level = output->zoom.spring_z.current; if (!output->zoom.active || level > output->zoom.max_level || level == 0.0f) return; zoom_area_center_from_point(output, &x, &y); global_x = wl_fixed_to_double(x); global_y = wl_fixed_to_double(y); output->zoom.trans_x = global_x - output->width / 2; output->zoom.trans_y = global_y - output->height / 2; if (output->zoom.trans_x < 0) output->zoom.trans_x = 0; if (output->zoom.trans_y < 0) output->zoom.trans_y = 0; if (output->zoom.trans_x > level * output->width) output->zoom.trans_x = level * output->width; if (output->zoom.trans_y > level * output->height) output->zoom.trans_y = level * output->height; }
static void relative_pointer_handle_relative_motion(void *data, struct zwp_relative_pointer_v1 *pointer, uint32_t time_hi, uint32_t time_lo, wl_fixed_t dx_w, wl_fixed_t dy_w, wl_fixed_t dx_unaccel_w, wl_fixed_t dy_unaccel_w) { struct SDL_WaylandInput *input = data; SDL_VideoData *d = input->display; SDL_WindowData *window = input->pointer_focus; double dx_unaccel; double dy_unaccel; double dx; double dy; dx_unaccel = wl_fixed_to_double(dx_unaccel_w); dy_unaccel = wl_fixed_to_double(dy_unaccel_w); /* Add left over fraction from last event. */ dx_unaccel += input->dx_frac; dy_unaccel += input->dy_frac; input->dx_frac = modf(dx_unaccel, &dx); input->dy_frac = modf(dy_unaccel, &dy); if (input->pointer_focus && d->relative_mouse_mode) { SDL_SendMouseMotion(window->sdlwindow, 0, 1, (int)dx, (int)dy); } }
static void pointerHandleAxis(void* data, struct wl_pointer* wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { _GLFWwindow* window = _glfw.wl.pointerFocus; double scroll_factor; double x, y; if (!window) return; /* Wayland scroll events are in pointer motion coordinate space (think * two finger scroll). The factor 10 is commonly used to convert to * "scroll step means 1.0. */ scroll_factor = 1.0/10.0; switch (axis) { case WL_POINTER_AXIS_HORIZONTAL_SCROLL: x = wl_fixed_to_double(value) * scroll_factor; y = 0.0; break; case WL_POINTER_AXIS_VERTICAL_SCROLL: x = 0.0; y = wl_fixed_to_double(value) * scroll_factor; break; default: break; } _glfwInputScroll(window, x, y); }
static void drag_grab_motion(struct weston_pointer_grab *grab, uint32_t time, wl_fixed_t x, wl_fixed_t y) { struct weston_pointer_drag *drag = container_of(grab, struct weston_pointer_drag, grab); struct weston_pointer *pointer = drag->grab.pointer; float fx, fy; wl_fixed_t sx, sy; weston_pointer_move(pointer, x, y); if (drag->base.icon) { fx = wl_fixed_to_double(pointer->x) + drag->base.dx; fy = wl_fixed_to_double(pointer->y) + drag->base.dy; weston_view_set_position(drag->base.icon, fx, fy); weston_view_schedule_repaint(drag->base.icon); } if (drag->base.focus_resource) { weston_view_from_global_fixed(drag->base.focus, pointer->x, pointer->y, &sx, &sy); wl_data_device_send_motion(drag->base.focus_resource, time, sx, sy); } }
static void pointerHandleAxis(void* data, struct wl_pointer* pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { _GLFWwindow* window = _glfw.wl.pointerFocus; double x = 0.0, y = 0.0; // Wayland scroll events are in pointer motion coordinate space (think two // finger scroll). The factor 10 is commonly used to convert to "scroll // step means 1.0. const double scrollFactor = 1.0 / 10.0; if (!window) return; assert(axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL || axis == WL_POINTER_AXIS_VERTICAL_SCROLL); if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) x = wl_fixed_to_double(value) * scrollFactor; else if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL) y = wl_fixed_to_double(value) * scrollFactor; _glfwInputScroll(window, x, y); }
static void drag_grab_touch_motion(struct weston_touch_grab *grab, uint32_t time, int touch_id, wl_fixed_t sx, wl_fixed_t sy) { struct weston_touch_drag *touch_drag = container_of(grab, struct weston_touch_drag, grab); struct weston_touch *touch = grab->touch; wl_fixed_t view_x, view_y; float fx, fy; if (touch_id != touch->grab_touch_id) return; drag_grab_touch_focus(touch_drag); if (touch_drag->base.icon) { fx = wl_fixed_to_double(touch->grab_x) + touch_drag->base.dx; fy = wl_fixed_to_double(touch->grab_y) + touch_drag->base.dy; weston_view_set_position(touch_drag->base.icon, fx, fy); weston_view_schedule_repaint(touch_drag->base.icon); } if (touch_drag->base.focus_resource) { weston_view_from_global_fixed(touch_drag->base.focus, touch->grab_x, touch->grab_y, &view_x, &view_y); wl_data_device_send_motion(touch_drag->base.focus_resource, time, view_x, view_y); } }
static void pointer_handle_axis(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { struct vo_wayland_state *wl = data; // value is 10.00 on a normal mouse wheel // scale it down to 1.00 for multipliying it with the commands if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL) { if (value > 0) mp_input_put_axis(wl->vo->input_ctx, MP_AXIS_DOWN, wl_fixed_to_double(value)*0.1); if (value < 0) mp_input_put_axis(wl->vo->input_ctx, MP_AXIS_UP, wl_fixed_to_double(value)*-0.1); } else if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) { if (value > 0) mp_input_put_axis(wl->vo->input_ctx, MP_AXIS_RIGHT, wl_fixed_to_double(value)*0.1); if (value < 0) mp_input_put_axis(wl->vo->input_ctx, MP_AXIS_LEFT, wl_fixed_to_double(value)*-0.1); } }
static void pointerHandleMotion(void* data, struct wl_pointer* pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy) { _GLFWwindow* window = _glfw.wl.pointerFocus; if (!window) return; if (window->cursorMode == GLFW_CURSOR_DISABLED) { /* TODO */ _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: GLFW_CURSOR_DISABLED not supported"); return; } else { window->wl.cursorPosX = wl_fixed_to_double(sx); window->wl.cursorPosY = wl_fixed_to_double(sy); } _glfwInputCursorMotion(window, wl_fixed_to_double(sx), wl_fixed_to_double(sy)); }
void xw::Pointer::HandleMotion(uint32_t time, wl_fixed_t surfaceXFixed, wl_fixed_t surfaceYFixed) { m_receiver.Motion(time, wl_fixed_to_double(surfaceXFixed), wl_fixed_to_double(surfaceYFixed)); }
static void pointerHandleMotion(void* data, struct wl_pointer* pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy) { _GLFWwindow* window = _glfw.wl.pointerFocus; const char* cursorName; if (!window) return; if (window->cursorMode == GLFW_CURSOR_DISABLED) return; else { window->wl.cursorPosX = wl_fixed_to_double(sx); window->wl.cursorPosY = wl_fixed_to_double(sy); } switch (window->wl.decorations.focus) { case mainWindow: _glfwInputCursorPos(window, wl_fixed_to_double(sx), wl_fixed_to_double(sy)); return; case topDecoration: if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH) cursorName = "n-resize"; else cursorName = "left_ptr"; break; case leftDecoration: if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH) cursorName = "nw-resize"; else cursorName = "w-resize"; break; case rightDecoration: if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH) cursorName = "ne-resize"; else cursorName = "e-resize"; break; case bottomDecoration: if (window->wl.cursorPosX < _GLFW_DECORATION_WIDTH) cursorName = "sw-resize"; else if (window->wl.cursorPosX > window->wl.width + _GLFW_DECORATION_WIDTH) cursorName = "se-resize"; else cursorName = "s-resize"; break; default: assert(0); } setCursor(cursorName); }
void xw::Pointer::HandleEnter(uint32_t serial, struct wl_surface *surface, wl_fixed_t surfaceXFixed, wl_fixed_t surfaceYFixed) { m_receiver.Enter(surface, wl_fixed_to_double(surfaceXFixed), wl_fixed_to_double(surfaceYFixed)); }
static void pointer_handle_motion (void *data, struct wl_pointer *pointer, uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w) { GstGLWindowWaylandEGL *window_egl = data; window_egl->display.pointer_x = wl_fixed_to_double (sx_w); window_egl->display.pointer_y = wl_fixed_to_double (sy_w); }
static void touch_handle_motion(void *data, struct wl_touch *wl_touch, uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w) { struct touch *touch = data; float x = wl_fixed_to_double(x_w); float y = wl_fixed_to_double(y_w); touch_paint(touch, x, y, id); }
static void pointer_handle_motion(void *data, struct wl_pointer *pointer, uint32_t time, wl_fixed_t x, wl_fixed_t y) { struct input *input = data; input->x = wl_fixed_to_double(x); input->y = wl_fixed_to_double(y); fprintf(stderr, "test-client: got pointer motion %f %f\n", input->x, input->y); }
static void clutter_wayland_handle_pointer_enter (void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y) { ClutterInputDeviceWayland *device = data; ClutterStageCogl *stage_cogl; ClutterEvent *event; ClutterBackend *backend; ClutterBackendWayland *backend_wayland; stage_cogl = wl_surface_get_user_data (surface); device->pointer_focus = stage_cogl; _clutter_input_device_set_stage (CLUTTER_INPUT_DEVICE (device), stage_cogl->wrapper); event = clutter_event_new (CLUTTER_ENTER); event->crossing.stage = stage_cogl->wrapper; event->crossing.time = 0; /* ?! */ event->crossing.x = wl_fixed_to_double(x); event->crossing.y = wl_fixed_to_double(y); event->crossing.source = CLUTTER_ACTOR (stage_cogl->wrapper); event->crossing.device = CLUTTER_INPUT_DEVICE (device); device->x = event->crossing.x; device->y = event->crossing.y; _clutter_event_push (event, FALSE); /* Set the cursor to the cursor loaded at backend initialisation */ backend = clutter_get_default_backend (); backend_wayland = CLUTTER_BACKEND_WAYLAND (backend); wl_pointer_set_cursor (pointer, serial, backend_wayland->cursor_surface, backend_wayland->cursor_x, backend_wayland->cursor_y); wl_surface_attach (backend_wayland->cursor_surface, backend_wayland->cursor_buffer, 0, 0); wl_surface_damage (backend_wayland->cursor_surface, 0, 0, 32, /* XXX: FFS */ 32); wl_surface_commit (backend_wayland->cursor_surface); }
static void pointer_handle_enter(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y) { struct input *input = data; input->pointer_focus = wl_surface_get_user_data(surface); input->x = wl_fixed_to_double(x); input->y = wl_fixed_to_double(y); fprintf(stderr, "test-client: got pointer enter %f %f, surface %p\n", input->x, input->y, surface); }
WL_EXPORT void weston_output_update_zoom(struct weston_output *output) { struct weston_seat *seat = output->zoom.seat; struct weston_pointer *pointer = weston_seat_get_pointer(seat); assert(output->zoom.active); output->zoom.current.x = wl_fixed_to_double(pointer->x); output->zoom.current.y = wl_fixed_to_double(pointer->y); weston_zoom_transition(output); weston_output_update_zoom_transform(output); }
static void wp_viewport_set_source (struct wl_client *client, struct wl_resource *resource, wl_fixed_t src_x, wl_fixed_t src_y, wl_fixed_t src_width, wl_fixed_t src_height) { MetaWaylandSurface *surface; float new_x; float new_y; float new_width; float new_height; surface = wl_resource_get_user_data (resource); if (!surface) { wl_resource_post_error (resource, WP_VIEWPORT_ERROR_NO_SURFACE, "wl_surface for this viewport no longer exists"); return; } new_x = wl_fixed_to_double (src_x); new_y = wl_fixed_to_double (src_y); new_width = wl_fixed_to_double (src_width); new_height = wl_fixed_to_double (src_height); if ((new_x >= 0 && new_y >= 0 && new_width > 0 && new_height > 0) || (new_x == -1 && new_y == -1 && new_width == -1 && new_height == -1)) { surface->pending->viewport_src_rect.origin.x = new_x; surface->pending->viewport_src_rect.origin.y = new_y; surface->pending->viewport_src_rect.size.width = new_width; surface->pending->viewport_src_rect.size.height = new_height; surface->pending->has_new_viewport_src_rect = TRUE; } else { wl_resource_post_error (resource, WP_VIEWPORT_ERROR_BAD_VALUE, "x and y values must be zero or positive and " "width and height valuest must be positive or " "all values must be -1 to unset the viewport"); } }
static void pointer_handle_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { fprintf(stderr, "test-client: got pointer axis %u %f\n", axis, wl_fixed_to_double(value)); }
/*static*/ void Pointer::axis( void *data, wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { Pointer* pointer = static_cast<Pointer*>(data); ASSERT(wl_pointer == *pointer); TEST_LOG( boost::format("%016p::Pointer::axis() : axis=%d; value=%f") % pointer % axis % wl_fixed_to_double(value) ); pointer->axis_ = axis; pointer->axisValue_ = wl_fixed_to_double(value); }
static void weston_output_update_zoom_transform(struct weston_output *output) { uint32_t type = output->zoom.type; float global_x, global_y; wl_fixed_t x = output->zoom.current.x; wl_fixed_t y = output->zoom.current.y; float trans_min, trans_max; float ratio, level; level = output->zoom.spring_z.current; ratio = 1 / level; if (!output->zoom.active || level > output->zoom.max_level || level == 0.0f) return; if (type == ZOOM_FOCUS_POINTER && wl_list_empty(&output->zoom.animation_xy.link)) zoom_area_center_from_pointer(output, &x, &y); global_x = wl_fixed_to_double(x); global_y = wl_fixed_to_double(y); output->zoom.trans_x = ((((global_x - output->x) / output->width) * (level * 2)) - level) * ratio; output->zoom.trans_y = ((((global_y - output->y) / output->height) * (level * 2)) - level) * ratio; weston_zoom_apply_output_transform(output, &output->zoom.trans_x, &output->zoom.trans_y); trans_max = level * 2 - level; trans_min = -trans_max; /* Clip zoom area to output */ if (output->zoom.trans_x > trans_max) output->zoom.trans_x = trans_max; else if (output->zoom.trans_x < trans_min) output->zoom.trans_x = trans_min; if (output->zoom.trans_y > trans_max) output->zoom.trans_y = trans_max; else if (output->zoom.trans_y < trans_min) output->zoom.trans_y = trans_min; }
static void transform_stage_point_fixed (ClaylandSurface *surface, wl_fixed_t x, wl_fixed_t y, wl_fixed_t *sx, wl_fixed_t *sy) { float xf, yf; clutter_actor_transform_stage_point (surface->actor, wl_fixed_to_double (x), wl_fixed_to_double (y), &xf, &yf); *sx = wl_fixed_from_double (xf); *sy = wl_fixed_from_double (yf); }
void xw::Pointer::HandleAxis(uint32_t time, uint32_t axis, wl_fixed_t value) { m_receiver.Axis(time, axis, wl_fixed_to_double(value)); }
static void axis_handler(struct widget *widget, struct input *input, uint32_t time, uint32_t axis, wl_fixed_t value, void *data) { struct image *image = data; if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL && input_get_modifiers(input) == MOD_CONTROL_MASK) { /* set zoom level to 2% per 10 axis units */ zoom(image, (1.0 - wl_fixed_to_double(value) / 500.0)); window_schedule_redraw(image->window); } else if (input_get_modifiers(input) == 0) { if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL) move_viewport(image, 0, wl_fixed_to_double(value)); else if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) move_viewport(image, wl_fixed_to_double(value), 0); } }
static void pointer_handle_axis(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { struct window *window = data; enum scroll_direction direction; switch (axis) { case 0: direction = wl_fixed_to_double(value) < 0 ? SCROLL_UP : SCROLL_DOWN; break; case 1: direction = wl_fixed_to_double(value) < 0 ? SCROLL_LEFT : SCROLL_RIGHT; break; default: sway_log(L_DEBUG, "Unexpected axis value on mouse scroll"); return; } if (window->pointer_input.notify_scroll) { window->pointer_input.notify_scroll(window, direction); } }
static void drag_surface_configure(struct weston_drag *drag, struct weston_pointer *pointer, struct weston_touch *touch, struct weston_surface *es, int32_t sx, int32_t sy) { struct wl_list *list; float fx, fy; assert((pointer != NULL && touch == NULL) || (pointer == NULL && touch != NULL)); if (!weston_surface_is_mapped(es) && es->buffer_ref.buffer) { if (pointer && pointer->sprite && weston_view_is_mapped(pointer->sprite)) list = &pointer->sprite->layer_link; else list = &es->compositor->cursor_layer.view_list; wl_list_remove(&drag->icon->layer_link); wl_list_insert(list, &drag->icon->layer_link); weston_view_update_transform(drag->icon); empty_region(&es->pending.input); } drag->dx += sx; drag->dy += sy; /* init to 0 for avoiding a compile warning */ fx = fy = 0; if (pointer) { fx = wl_fixed_to_double(pointer->x) + drag->dx; fy = wl_fixed_to_double(pointer->y) + drag->dy; } else if (touch) { fx = wl_fixed_to_double(touch->grab_x) + drag->dx; fy = wl_fixed_to_double(touch->grab_y) + drag->dy; } weston_view_set_position(drag->icon, fx, fy); }
/** * \brief CALLBACK function, Wayland informs about axis event * \param widget widget * \param input input device that caused the axis event * \param time time the event happened * \param axis vertical or horizontal * \param value amount of scrolling * \param data user data associated to the widget */ static void axis_handler(struct widget *widget, struct input *input, uint32_t time, uint32_t axis, wl_fixed_t value, void *data) { if (!log_axis) return; printf("axis time: %d, axis: %s, value: %f\n", time, axis == WL_POINTER_AXIS_VERTICAL_SCROLL ? "vertical" : "horizontal", wl_fixed_to_double(value)); }
static void clutter_wayland_handle_motion (void *data, struct wl_pointer *pointer, uint32_t _time, wl_fixed_t x, wl_fixed_t y) { ClutterInputDeviceWayland *device = data; ClutterStageCogl *stage_cogl = device->pointer_focus; ClutterEvent *event; event = clutter_event_new (CLUTTER_MOTION); event->motion.stage = stage_cogl->wrapper; event->motion.device = CLUTTER_INPUT_DEVICE (device); event->motion.time = _time; event->motion.modifier_state = 0; event->motion.x = wl_fixed_to_double(x); event->motion.y = wl_fixed_to_double(y); device->x = event->motion.x; device->y = event->motion.y; _clutter_event_push (event, FALSE); }
static void pointerHandleMotion(void* data, struct wl_pointer* pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy) { _GLFWwindow* window = _glfw.wl.pointerFocus; if (!window) return; if (window->cursorMode == GLFW_CURSOR_DISABLED) return; else { window->wl.cursorPosX = wl_fixed_to_double(sx); window->wl.cursorPosY = wl_fixed_to_double(sy); } _glfwInputCursorPos(window, wl_fixed_to_double(sx), wl_fixed_to_double(sy)); }
static void clutter_wayland_handle_axis (void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { ClutterInputDeviceWayland *device = data; ClutterStageCogl *stage_cogl = device->pointer_focus; ClutterEvent *event; gdouble delta_x, delta_y; event = clutter_event_new (CLUTTER_SCROLL); event->scroll.time = time; event->scroll.stage = stage_cogl->wrapper; event->scroll.direction = CLUTTER_SCROLL_SMOOTH; event->scroll.x = device->x; event->scroll.y = device->y; if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) { delta_x = -wl_fixed_to_double(value) * 23; delta_y = 0; } else { delta_x = 0; delta_y = -wl_fixed_to_double(value) * 23; /* XXX: based on my bcm5794 */ } clutter_event_set_scroll_delta (event, delta_x, delta_y); event->scroll.modifier_state = xkb_state_serialize_mods(device->xkb, XKB_STATE_EFFECTIVE); _clutter_event_push (event, FALSE); }