config: add tablet area configuration

This commit is contained in:
Jens Peters 2024-01-01 18:26:38 +01:00 committed by Johan Malm
parent dd91cd89ae
commit f0abd9304f
5 changed files with 32 additions and 2 deletions

View file

@ -394,14 +394,22 @@
</mouse> </mouse>
<!-- <!--
The active tablet area can be specified by setting the top/left
coordinate (in mm) and/or width/height (in mm). If width or height
are omitted or default (0.0), width/height will be set to the
remaining width/height seen from top/left.
The tablet orientation can be changed in 90 degree steps, thus The tablet orientation can be changed in 90 degree steps, thus
rotation can be set to [0|90|180|270]. rotation can be set to [0|90|180|270]. Rotation will be applied
after applying tablet area transformation.
Tablet buttons emulate regular mouse buttons. The tablet *button* can Tablet buttons emulate regular mouse buttons. The tablet *button* can
be set to any of [tip|stylus|stylus2|stylus3]. Valid *to* mouse buttons be set to any of [tip|stylus|stylus2|stylus3]. Valid *to* mouse buttons
are [left|right|middle]. are [left|right|middle].
--> -->
<tablet rotate="0"> <tablet rotate="0">
<!-- Active area dimensions are in mm -->
<area top="0.0" left="0.0" width="0.0" height="0.0">
<map button="tip" to="left" /> <map button="tip" to="left" />
<map button="stylus" to="right" /> <map button="stylus" to="right" />
<map button="stylus2" to="middle" /> <map button="stylus2" to="middle" />

View file

@ -89,6 +89,7 @@ struct rcxml {
/* graphics tablet */ /* graphics tablet */
struct tablet_config { struct tablet_config {
struct wlr_fbox box;
enum rotation rotation; enum rotation rotation;
uint16_t button_map_count; uint16_t button_map_count;
struct button_map_entry button_map[BUTTON_MAP_MAX]; struct button_map_entry button_map[BUTTON_MAP_MAX];

View file

@ -17,6 +17,7 @@ struct button_map_entry {
uint32_t to; uint32_t to;
}; };
double tablet_get_dbl_if_positive(const char *content, const char *name);
enum rotation tablet_parse_rotation(int value); enum rotation tablet_parse_rotation(int value);
uint32_t tablet_button_from_str(const char *button); uint32_t tablet_button_from_str(const char *button);
uint32_t mouse_button_from_str(const char *button); uint32_t mouse_button_from_str(const char *button);

View file

@ -854,6 +854,14 @@ entry(xmlNode *node, char *nodename, char *content)
} else { } else {
wlr_log(WLR_ERROR, "Invalid value for <resize popupShow />"); wlr_log(WLR_ERROR, "Invalid value for <resize popupShow />");
} }
} else if (!strcasecmp(nodename, "left.area.tablet")) {
rc.tablet.box.x = tablet_get_dbl_if_positive(content, "left");
} else if (!strcasecmp(nodename, "top.area.tablet")) {
rc.tablet.box.y = tablet_get_dbl_if_positive(content, "top");
} else if (!strcasecmp(nodename, "width.area.tablet")) {
rc.tablet.box.width = tablet_get_dbl_if_positive(content, "width");
} else if (!strcasecmp(nodename, "height.area.tablet")) {
rc.tablet.box.height = tablet_get_dbl_if_positive(content, "height");
} else if (!strcasecmp(nodename, "rotate.tablet")) { } else if (!strcasecmp(nodename, "rotate.tablet")) {
rc.tablet.rotation = tablet_parse_rotation(atoi(content)); rc.tablet.rotation = tablet_parse_rotation(atoi(content));
} else if (!strcasecmp(nodename, "button.map.tablet")) { } else if (!strcasecmp(nodename, "button.map.tablet")) {
@ -1027,7 +1035,7 @@ rcxml_init(void)
rc.doubleclick_time = 500; rc.doubleclick_time = 500;
rc.scroll_factor = 1.0; rc.scroll_factor = 1.0;
rc.tablet.button_map_count = 0; rc.tablet.box = (struct wlr_fbox){0};
tablet_load_default_button_mappings(); tablet_load_default_button_mappings();
rc.repeat_rate = 25; rc.repeat_rate = 25;

View file

@ -7,6 +7,17 @@
#include "config/tablet.h" #include "config/tablet.h"
#include "config/rcxml.h" #include "config/rcxml.h"
double
tablet_get_dbl_if_positive(const char *content, const char *name)
{
double value = atof(content);
if (value < 0) {
wlr_log(WLR_ERROR, "Invalid value for tablet area %s", name);
return 0;
}
return value;
}
enum rotation enum rotation
tablet_parse_rotation(int value) tablet_parse_rotation(int value)
{ {
@ -84,6 +95,7 @@ tablet_button_mapping_add(uint32_t from, uint32_t to)
void void
tablet_load_default_button_mappings(void) tablet_load_default_button_mappings(void)
{ {
rc.tablet.button_map_count = 0;
tablet_button_mapping_add(BTN_TOOL_PEN, BTN_LEFT); /* Used for the pen tip */ tablet_button_mapping_add(BTN_TOOL_PEN, BTN_LEFT); /* Used for the pen tip */
tablet_button_mapping_add(BTN_STYLUS, BTN_RIGHT); tablet_button_mapping_add(BTN_STYLUS, BTN_RIGHT);
tablet_button_mapping_add(BTN_STYLUS2, BTN_MIDDLE); tablet_button_mapping_add(BTN_STYLUS2, BTN_MIDDLE);