mirror of https://github.com/mpv-player/mpv
wayland: improve behavior with touch events
There's currently some touch related code in mpv wayland, but clearly nobody actually uses because it's a broken mess. Initially an attempt to distinguish between two finger touches and one finger touch was made, but there's not a good way to make this work. For whatever reason, initiating either xdg_toplevel_resize or xdg_toplevel_move blocks any other touch events from occurring (at least in plasma). Trying to call these functions anywhere else is not really useful since the serial will be invalid outside of the touch down events (well it would work in the touch up event but that's just silly). Anyways, let's just make this work sanely. Eliminate the touch entries variable completely because it's pointless. Only one finger event is ever considered at a time. Touches besides the initial one are all ignored. If a user touches and drags within the touch edge radius, then a resize event occurs. If the user touches and drags elsewhere on the window, a move event occurs. A single tap displays the osc (which is clickable if you tap again). A double tap toggles fullscreen. Additionally, the default touch edge radius of 64 pixels is way too big (at least I think so). Cut this in half to 32 which feels a lot better (on a pinephone using plasma mobile anyway).
This commit is contained in:
parent
84362e820e
commit
8300830951
|
@ -5506,7 +5506,7 @@ The following video options are currently all specific to ``--vo=gpu`` and
|
|||
there are no server side decorations from the compositor.
|
||||
|
||||
``--wayland-edge-pixels-touch=<value>``
|
||||
Defines the size of an edge border (default: 64) to initiate client side
|
||||
Defines the size of an edge border (default: 32) to initiate client side
|
||||
resizes events in the wayland contexts with touch events.
|
||||
|
||||
``--spirv-compiler=<compiler>``
|
||||
|
|
|
@ -115,7 +115,7 @@ const struct m_sub_options wayland_conf = {
|
|||
.defaults = &(struct wayland_opts) {
|
||||
.disable_vsync = false,
|
||||
.edge_pixels_pointer = 10,
|
||||
.edge_pixels_touch = 64,
|
||||
.edge_pixels_touch = 32,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -283,33 +283,24 @@ static void touch_handle_down(void *data, struct wl_touch *wl_touch,
|
|||
{
|
||||
struct vo_wayland_state *wl = data;
|
||||
|
||||
enum xdg_toplevel_resize_edge edge;
|
||||
if (check_for_resize(wl, x_w, y_w, wl->opts->edge_pixels_touch, &edge)) {
|
||||
wl->touch_entries = 0;
|
||||
xdg_toplevel_resize(wl->xdg_toplevel, wl->seat, serial, edge);
|
||||
return;
|
||||
} else if (wl->touch_entries) {
|
||||
wl->touch_entries = 0;
|
||||
xdg_toplevel_move(wl->xdg_toplevel, wl->seat, serial);
|
||||
return;
|
||||
}
|
||||
|
||||
wl->touch_entries = 1;
|
||||
|
||||
wl->mouse_x = wl_fixed_to_int(x_w) * wl->scaling;
|
||||
wl->mouse_y = wl_fixed_to_int(y_w) * wl->scaling;
|
||||
|
||||
mp_input_set_mouse_pos(wl->vo->input_ctx, wl->mouse_x, wl->mouse_y);
|
||||
mp_input_put_key(wl->vo->input_ctx, MP_MBTN_LEFT | MP_KEY_STATE_DOWN);
|
||||
|
||||
enum xdg_toplevel_resize_edge edge;
|
||||
if (check_for_resize(wl, x_w, y_w, wl->opts->edge_pixels_touch, &edge)) {
|
||||
xdg_toplevel_resize(wl->xdg_toplevel, wl->seat, serial, edge);
|
||||
} else {
|
||||
xdg_toplevel_move(wl->xdg_toplevel, wl->seat, serial);
|
||||
}
|
||||
}
|
||||
|
||||
static void touch_handle_up(void *data, struct wl_touch *wl_touch,
|
||||
uint32_t serial, uint32_t time, int32_t id)
|
||||
{
|
||||
struct vo_wayland_state *wl = data;
|
||||
|
||||
wl->touch_entries = 0;
|
||||
|
||||
mp_input_put_key(wl->vo->input_ctx, MP_MBTN_LEFT | MP_KEY_STATE_UP);
|
||||
}
|
||||
|
||||
|
@ -1122,7 +1113,7 @@ end:
|
|||
static int check_for_resize(struct vo_wayland_state *wl, wl_fixed_t x_w, wl_fixed_t y_w,
|
||||
int edge_pixels, enum xdg_toplevel_resize_edge *edge)
|
||||
{
|
||||
if (wl->touch_entries || wl->vo_opts->fullscreen || wl->vo_opts->window_maximized)
|
||||
if (wl->vo_opts->fullscreen || wl->vo_opts->window_maximized)
|
||||
return 0;
|
||||
|
||||
int pos[2] = { wl_fixed_to_double(x_w), wl_fixed_to_double(y_w) };
|
||||
|
|
|
@ -70,7 +70,6 @@ struct vo_wayland_state {
|
|||
int pending_vo_events;
|
||||
int scaling;
|
||||
int timeout_count;
|
||||
int touch_entries;
|
||||
int wakeup_pipe[2];
|
||||
|
||||
/* idle-inhibit */
|
||||
|
|
Loading…
Reference in New Issue