static void pointerHandleButton(void *_data, struct wl_pointer *_pointer, uint32_t _serial, uint32_t _time, uint32_t _button, uint32_t _state) { struct ContextData *d = (struct ContextData*) _data; if (_button == BTN_LEFT && _state == WL_POINTER_BUTTON_STATE_PRESSED) { wl_shell_surface_move(d->shell_surface, d->seat, _serial); } }
static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { gfx_ctx_wayland_data_t *wl = (gfx_ctx_wayland_data_t*)data; if (state == WL_POINTER_BUTTON_STATE_PRESSED) { if (button == BTN_LEFT) { wl->input.mouse.left = true; /* This behavior matches mpv, seems like a decent way to support window moving for now. */ if (BIT_GET(wl->input.key_state, KEY_LEFTALT) && wl->shell_surf) wl_shell_surface_move(wl->shell_surf, wl->seat, serial); } else if (button == BTN_RIGHT) wl->input.mouse.right = true; else if (button == BTN_MIDDLE) wl->input.mouse.middle = true; } else { if (button == BTN_LEFT) wl->input.mouse.left = false; else if (button == BTN_RIGHT) wl->input.mouse.right = false; else if (button == BTN_MIDDLE) wl->input.mouse.middle = false; } }
static void touch_handle_down(void *data, struct wl_touch *wl_touch, uint32_t serial, uint32_t time, struct wl_surface *surface, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w) { struct display *d = (struct display *)data; wl_shell_surface_move(d->window->shell_surface, d->seat, serial); }
static void pointerHandleButton(void *data, struct wl_pointer *pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state_w) { XdevLWindowEventServerWayland* wes = (XdevLWindowEventServerWayland*)data; XdevLWindowWayland* window = (XdevLWindowWayland*)wl_surface_get_user_data(wes->getCurrentWindow()); // // TODO For now we just allow to move the window just with a button press. // if( (button == BTN_RIGHT) && (state_w == WL_POINTER_BUTTON_STATE_PRESSED)) { wl_shell_surface_move(window->getNativeShellSurface(), m_seat, serial); } else if( (button == BTN_MIDDLE) && (state_w == WL_POINTER_BUTTON_STATE_PRESSED)) { wl_shell_surface_resize(window->getNativeShellSurface(), m_seat, serial, 0); } // // Set which button we use. // XdevLEvent ev; xdl_uint32 state = state_w; switch (button) { case BTN_LEFT: ev.button.button = BUTTON_LEFT; break; case BTN_MIDDLE: ev.button.button = BUTTON_MIDDLE; break; case BTN_RIGHT: ev.button.button = BUTTON_RIGHT; break; case BTN_SIDE: ev.button.button = BUTTON_SIDE; break; case BTN_EXTRA: ev.button.button = BUTTON_EXTRA; break; default: return; } ev.common.timestamp = wes->getMediator()->getTimer().getTime64(); ev.type = state ? MouseButtonPressed.getHashCode() : MouseButtonReleased.getHashCode(); xdl_int x, y; wes->getCurrentPointerPosition(x, y); ev.button.x = x; ev.button.y = y; ev.window.windowid = window->getWindowID(); wes->getMediator()->fireEvent(ev); }
static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { struct display *display = data; if (button == BTN_LEFT && state == WL_POINTER_BUTTON_STATE_PRESSED) wl_shell_surface_move(display->window->shell_surface, display->seat, serial); }
static void pointer_handle_button (void *data, struct wl_pointer *pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state_w) { GstGLWindowWaylandEGL *window_egl = data; guint edges = _get_closest_pointer_corner (window_egl); window_egl->display.serial = serial; if (button == BTN_LEFT && state_w == WL_POINTER_BUTTON_STATE_PRESSED) wl_shell_surface_move (window_egl->window.shell_surface, window_egl->display.seat, serial); if (button == BTN_RIGHT && state_w == WL_POINTER_BUTTON_STATE_PRESSED) wl_shell_surface_resize (window_egl->window.shell_surface, window_egl->display.seat, serial, edges); }
static void pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { struct vo_wayland_state *wl = data; mp_input_put_key(wl->vo->input_ctx, MP_MOUSE_BTN0 + (button - BTN_LEFT) | ((state == WL_POINTER_BUTTON_STATE_PRESSED) ? MP_KEY_STATE_DOWN : MP_KEY_STATE_UP)); if ((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_PRESSED)) wl_shell_surface_move(wl->window.shell_surface, wl->input.seat, serial); }
static SDL_bool ProcessHitTest(struct SDL_WaylandInput *input, uint32_t serial) { SDL_WindowData *window_data = input->pointer_focus; SDL_Window *window = window_data->sdlwindow; if (window->hit_test) { const SDL_Point point = { wl_fixed_to_int(input->sx_w), wl_fixed_to_int(input->sy_w) }; const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data); static const uint32_t directions[] = { WL_SHELL_SURFACE_RESIZE_TOP_LEFT, WL_SHELL_SURFACE_RESIZE_TOP, WL_SHELL_SURFACE_RESIZE_TOP_RIGHT, WL_SHELL_SURFACE_RESIZE_RIGHT, WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT, WL_SHELL_SURFACE_RESIZE_BOTTOM, WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT, WL_SHELL_SURFACE_RESIZE_LEFT }; switch (rc) { case SDL_HITTEST_DRAGGABLE: wl_shell_surface_move(window_data->shell_surface, input->seat, serial); return SDL_TRUE; case SDL_HITTEST_RESIZE_TOPLEFT: case SDL_HITTEST_RESIZE_TOP: case SDL_HITTEST_RESIZE_TOPRIGHT: case SDL_HITTEST_RESIZE_RIGHT: case SDL_HITTEST_RESIZE_BOTTOMRIGHT: case SDL_HITTEST_RESIZE_BOTTOM: case SDL_HITTEST_RESIZE_BOTTOMLEFT: case SDL_HITTEST_RESIZE_LEFT: wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, directions[rc - SDL_HITTEST_RESIZE_TOPLEFT]); return SDL_TRUE; default: return SDL_FALSE; } } return SDL_FALSE; }
static void pointerHandleButton(void* data, struct wl_pointer* pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { _GLFWwindow* window = _glfw.wl.pointerFocus; int glfwButton; // Both xdg-shell and wl_shell use the same values. uint32_t edges = WL_SHELL_SURFACE_RESIZE_NONE; if (!window) return; if (button == BTN_LEFT) { switch (window->wl.decorations.focus) { case mainWindow: break; case topDecoration: if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH) edges = WL_SHELL_SURFACE_RESIZE_TOP; else { if (window->wl.xdg.toplevel) xdg_toplevel_move(window->wl.xdg.toplevel, _glfw.wl.seat, serial); else wl_shell_surface_move(window->wl.shellSurface, _glfw.wl.seat, serial); } break; case leftDecoration: if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH) edges = WL_SHELL_SURFACE_RESIZE_TOP_LEFT; else edges = WL_SHELL_SURFACE_RESIZE_LEFT; break; case rightDecoration: if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH) edges = WL_SHELL_SURFACE_RESIZE_TOP_RIGHT; else edges = WL_SHELL_SURFACE_RESIZE_RIGHT; break; case bottomDecoration: if (window->wl.cursorPosX < _GLFW_DECORATION_WIDTH) edges = WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT; else if (window->wl.cursorPosX > window->wl.width + _GLFW_DECORATION_WIDTH) edges = WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT; else edges = WL_SHELL_SURFACE_RESIZE_BOTTOM; break; default: assert(0); } if (edges != WL_SHELL_SURFACE_RESIZE_NONE) { if (window->wl.xdg.toplevel) xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat, serial, edges); else wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat, serial, edges); } } else if (button == BTN_RIGHT) { if (window->wl.decorations.focus != mainWindow && window->wl.xdg.toplevel) { xdg_toplevel_show_window_menu(window->wl.xdg.toplevel, _glfw.wl.seat, serial, window->wl.cursorPosX, window->wl.cursorPosY); return; } } // Don’t pass the button to the user if it was related to a decoration. if (window->wl.decorations.focus != mainWindow) return; _glfw.wl.pointerSerial = serial; /* Makes left, right and middle 0, 1 and 2. Overall order follows evdev * codes. */ glfwButton = button - BTN_LEFT; _glfwInputMouseClick(window, glfwButton, state == WL_POINTER_BUTTON_STATE_PRESSED ? GLFW_PRESS : GLFW_RELEASE, _glfw.wl.xkb.modifiers); }