mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
Add mouse emulation for touch devices (#2277)
This commit is contained in:
parent
4d3efb4339
commit
45a9bd95e7
5 changed files with 24 additions and 3 deletions
|
|
@ -690,7 +690,7 @@ extending outward from the snapped edge.
|
|||
## TOUCH
|
||||
|
||||
```
|
||||
<touch deviceName="" mapToOutput="" />
|
||||
<touch deviceName="" mapToOutput="" mouseEmulation="no"/>
|
||||
```
|
||||
|
||||
*<touch deviceName="" />*
|
||||
|
|
@ -704,6 +704,10 @@ extending outward from the snapped edge.
|
|||
Direct cursor movement to a specified output. If the compositor is
|
||||
running in nested mode, this does not take effect.
|
||||
|
||||
*<touch mouseEmulation="" />*
|
||||
If mouseEmulation is enabled, all touch up/down/motion events are
|
||||
translated to mouse button and motion events.
|
||||
|
||||
## TABLET
|
||||
|
||||
```
|
||||
|
|
|
|||
|
|
@ -537,8 +537,11 @@
|
|||
|
||||
Direct cursor movement to a specified output. If the compositor is
|
||||
running in nested mode, this does not take effect.
|
||||
|
||||
If mouseEmulation is enabled, all touch up/down/motion events are
|
||||
translated to mouse button and motion events.
|
||||
-->
|
||||
<touch deviceName="" mapToOutput="" />
|
||||
<touch deviceName="" mapToOutput="" mouseEmulation="no"/>
|
||||
|
||||
<!--
|
||||
The tablet cursor movement can be restricted to a single output.
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
struct touch_config_entry {
|
||||
char *device_name;
|
||||
char *output_name;
|
||||
bool force_mouse_emulation;
|
||||
|
||||
struct wl_list link; /* struct rcxml.touch_configs */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -633,6 +633,8 @@ fill_touch(char *nodename, char *content)
|
|||
current_touch->device_name = xstrdup(content);
|
||||
} else if (!strcasecmp(nodename, "mapToOutput.touch")) {
|
||||
current_touch->output_name = xstrdup(content);
|
||||
} else if (!strcasecmp(nodename, "mouseEmulation.touch")) {
|
||||
set_bool(content, ¤t_touch->force_mouse_emulation);
|
||||
} else {
|
||||
wlr_log(WLR_ERROR, "Unexpected data in touch parser: %s=\"%s\"",
|
||||
nodename, content);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,17 @@ static struct wlr_surface*
|
|||
touch_get_coords(struct seat *seat, struct wlr_touch *touch, double x, double y,
|
||||
double *x_offset, double *y_offset)
|
||||
{
|
||||
/*
|
||||
* Do not return a surface when mouse emulation is enforced. Not
|
||||
* having a surface will trigger the fallback to cursor move/button
|
||||
* emulation in the touch signal handlers.
|
||||
*/
|
||||
struct touch_config_entry *config_entry =
|
||||
touch_find_config_for_device(touch->base.name);
|
||||
if (config_entry && config_entry->force_mouse_emulation) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Convert coordinates: first [0, 1] => layout, then layout => surface */
|
||||
double lx, ly;
|
||||
wlr_cursor_absolute_to_layout_coords(seat->cursor, &touch->base,
|
||||
|
|
@ -93,7 +104,7 @@ handle_touch_down(struct wl_listener *listener, void *data)
|
|||
|
||||
/* Compute layout => surface offset and save for this touch point */
|
||||
struct touch_point *touch_point = znew(*touch_point);
|
||||
double x_offset, y_offset;
|
||||
double x_offset = 0.0, y_offset = 0.0;
|
||||
touch_point->surface = touch_get_coords(seat, event->touch,
|
||||
event->x, event->y, &x_offset, &y_offset);
|
||||
touch_point->touch_id = event->touch_id;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue