backends/x11: Implement tablet settings based on the Wacom driver
This is a stopgap solution until libinput is the fallback driver handling tablets and pads. https://bugzilla.gnome.org/show_bug.cgi?id=773779
This commit is contained in:
parent
b35b531f00
commit
ff9753688f
@ -188,10 +188,20 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
|
|||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
gboolean enabled)
|
gboolean enabled)
|
||||||
{
|
{
|
||||||
guchar value = (enabled) ? 1 : 0;
|
guchar value;
|
||||||
|
|
||||||
change_property (device, "libinput Left Handed Enabled",
|
if (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE)
|
||||||
XA_INTEGER, 8, &value, 1);
|
{
|
||||||
|
value = enabled ? 3 : 0;
|
||||||
|
change_property (device, "Wacom Rotation",
|
||||||
|
XA_INTEGER, 8, &value, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value = enabled ? 1 : 0;
|
||||||
|
change_property (device, "libinput Left Handed Enabled",
|
||||||
|
XA_INTEGER, 8, &value, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -467,14 +477,76 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
|
|||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
GDesktopTabletMapping mapping)
|
GDesktopTabletMapping mapping)
|
||||||
{
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||||
|
int device_id = clutter_input_device_get_device_id (device);
|
||||||
|
XDevice *xdev;
|
||||||
|
|
||||||
|
if (!display)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Grab the puke bucket! */
|
||||||
|
meta_error_trap_push (display);
|
||||||
|
xdev = XOpenDevice (xdisplay, device_id);
|
||||||
|
if (xdev)
|
||||||
|
{
|
||||||
|
XSetDeviceMode (xdisplay, xdev,
|
||||||
|
mapping == G_DESKTOP_TABLET_MAPPING_ABSOLUTE ?
|
||||||
|
Absolute : Relative);
|
||||||
|
XCloseDevice (xdisplay, xdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meta_error_trap_pop_with_return (display))
|
||||||
|
{
|
||||||
|
g_warning ("Could not set tablet mapping for %s",
|
||||||
|
clutter_input_device_get_device_name (device));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
device_query_area (ClutterInputDevice *device,
|
||||||
|
gint *width,
|
||||||
|
gint *height)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||||
|
gint device_id, n_devices, i;
|
||||||
|
XIDeviceInfo *info;
|
||||||
|
Atom abs_x, abs_y;
|
||||||
|
|
||||||
|
*width = *height = 0;
|
||||||
|
device_id = clutter_input_device_get_device_id (device);
|
||||||
|
info = XIQueryDevice (xdisplay, device_id, &n_devices);
|
||||||
|
if (n_devices == 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
abs_x = XInternAtom (xdisplay, "Abs X", True);
|
||||||
|
abs_y = XInternAtom (xdisplay, "Abs Y", True);
|
||||||
|
|
||||||
|
for (i = 0; i < info->num_classes; i++)
|
||||||
|
{
|
||||||
|
XIValuatorClassInfo *valuator = (XIValuatorClassInfo *) info->classes[i];
|
||||||
|
|
||||||
|
if (valuator->type != XIValuatorClass)
|
||||||
|
continue;
|
||||||
|
if (valuator->label == abs_x)
|
||||||
|
*width = valuator->max - valuator->min;
|
||||||
|
else if (valuator->label == abs_y)
|
||||||
|
*height = valuator->max - valuator->min;
|
||||||
|
}
|
||||||
|
|
||||||
|
XIFreeDeviceInfo (info);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_x11_set_tablet_keep_aspect (MetaInputSettings *settings,
|
update_tablet_area (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
MetaOutput *output,
|
gint32 *area)
|
||||||
gboolean keep_aspect)
|
|
||||||
{
|
{
|
||||||
|
change_property (device, "Wacom Tablet Area",
|
||||||
|
XA_INTEGER, 32, area, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -485,6 +557,61 @@ meta_input_settings_x11_set_tablet_area (MetaInputSettings *settings,
|
|||||||
gdouble padding_top,
|
gdouble padding_top,
|
||||||
gdouble padding_bottom)
|
gdouble padding_bottom)
|
||||||
{
|
{
|
||||||
|
gint32 width, height, area[4] = { 0 };
|
||||||
|
|
||||||
|
if (!device_query_area (device, &width, &height))
|
||||||
|
return;
|
||||||
|
|
||||||
|
area[0] = width * padding_left;
|
||||||
|
area[1] = height * padding_top;
|
||||||
|
area[2] = width - (width * padding_right);
|
||||||
|
area[2] = height - (height * padding_bottom);
|
||||||
|
update_tablet_area (settings, device, area);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_input_settings_x11_set_tablet_keep_aspect (MetaInputSettings *settings,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
MetaOutput *output,
|
||||||
|
gboolean keep_aspect)
|
||||||
|
{
|
||||||
|
gint32 width, height, dev_width, dev_height, area[4] = { 0 };
|
||||||
|
|
||||||
|
if (!device_query_area (device, &dev_width, &dev_height))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (keep_aspect)
|
||||||
|
{
|
||||||
|
gdouble output_aspect, dev_aspect;
|
||||||
|
|
||||||
|
if (output && output->crtc)
|
||||||
|
{
|
||||||
|
width = output->crtc->rect.width;
|
||||||
|
height = output->crtc->rect.height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MetaMonitorManager *monitor_manager;
|
||||||
|
MetaBackend *backend;
|
||||||
|
|
||||||
|
backend = meta_get_backend ();
|
||||||
|
monitor_manager = meta_backend_get_monitor_manager (backend);
|
||||||
|
meta_monitor_manager_get_screen_limits (monitor_manager,
|
||||||
|
&width, &height);
|
||||||
|
}
|
||||||
|
|
||||||
|
output_aspect = (gdouble) width / height;
|
||||||
|
dev_aspect = (gdouble) dev_width / dev_height;
|
||||||
|
|
||||||
|
if (dev_aspect > output_aspect)
|
||||||
|
dev_width = dev_height * output_aspect;
|
||||||
|
else if (dev_aspect < output_aspect)
|
||||||
|
dev_height = dev_width / output_aspect;
|
||||||
|
}
|
||||||
|
|
||||||
|
area[2] = dev_width;
|
||||||
|
area[3] = dev_height;
|
||||||
|
update_tablet_area (settings, device, area);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -501,6 +628,76 @@ meta_input_settings_x11_dispose (GObject *object)
|
|||||||
G_OBJECT_CLASS (meta_input_settings_x11_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_input_settings_x11_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
action_to_button (GDesktopStylusButtonAction action,
|
||||||
|
guint button)
|
||||||
|
{
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case G_DESKTOP_STYLUS_BUTTON_ACTION_MIDDLE:
|
||||||
|
return CLUTTER_BUTTON_MIDDLE;
|
||||||
|
case G_DESKTOP_STYLUS_BUTTON_ACTION_RIGHT:
|
||||||
|
return CLUTTER_BUTTON_SECONDARY;
|
||||||
|
case G_DESKTOP_STYLUS_BUTTON_ACTION_BACK:
|
||||||
|
return 8;
|
||||||
|
case G_DESKTOP_STYLUS_BUTTON_ACTION_FORWARD:
|
||||||
|
return 9;
|
||||||
|
case G_DESKTOP_STYLUS_BUTTON_ACTION_DEFAULT:
|
||||||
|
default:
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *settings,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
ClutterInputDeviceTool *tool,
|
||||||
|
GDesktopStylusButtonAction primary,
|
||||||
|
GDesktopStylusButtonAction secondary)
|
||||||
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||||
|
int device_id = clutter_input_device_get_device_id (device);
|
||||||
|
XDevice *xdev;
|
||||||
|
|
||||||
|
if (!display)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Grab the puke bucket! */
|
||||||
|
meta_error_trap_push (display);
|
||||||
|
xdev = XOpenDevice (xdisplay, device_id);
|
||||||
|
if (xdev)
|
||||||
|
{
|
||||||
|
guchar map[3] = {
|
||||||
|
CLUTTER_BUTTON_PRIMARY,
|
||||||
|
action_to_button (primary, CLUTTER_BUTTON_MIDDLE),
|
||||||
|
action_to_button (secondary, CLUTTER_BUTTON_SECONDARY),
|
||||||
|
};
|
||||||
|
|
||||||
|
XSetDeviceButtonMapping (xdisplay, xdev, map, G_N_ELEMENTS (map));
|
||||||
|
XCloseDevice (xdisplay, xdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meta_error_trap_pop_with_return (display))
|
||||||
|
{
|
||||||
|
g_warning ("Could not set stylus button map for %s",
|
||||||
|
clutter_input_device_get_device_name (device));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_input_settings_x11_set_stylus_pressure (MetaInputSettings *settings,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
ClutterInputDeviceTool *tool,
|
||||||
|
const gint32 pressure[4])
|
||||||
|
{
|
||||||
|
guchar values[4] = { pressure[0], pressure[1], pressure[2], pressure[3] };
|
||||||
|
|
||||||
|
change_property (device, "Wacom Pressurecurve", XA_INTEGER, 8,
|
||||||
|
&values, G_N_ELEMENTS (values));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
|
meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
|
||||||
{
|
{
|
||||||
@ -527,6 +724,9 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
|
|||||||
|
|
||||||
input_settings_class->set_mouse_accel_profile = meta_input_settings_x11_set_mouse_accel_profile;
|
input_settings_class->set_mouse_accel_profile = meta_input_settings_x11_set_mouse_accel_profile;
|
||||||
input_settings_class->set_trackball_accel_profile = meta_input_settings_x11_set_trackball_accel_profile;
|
input_settings_class->set_trackball_accel_profile = meta_input_settings_x11_set_trackball_accel_profile;
|
||||||
|
|
||||||
|
input_settings_class->set_stylus_pressure = meta_input_settings_x11_set_stylus_pressure;
|
||||||
|
input_settings_class->set_stylus_button_map = meta_input_settings_x11_set_stylus_button_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user