diff --git a/src/Makefile.am b/src/Makefile.am index d402aa58e..458d77a6f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -275,6 +275,8 @@ libmutter_la_SOURCES += \ backends/native/meta-cursor-renderer-native.h \ backends/native/meta-idle-monitor-native.c \ backends/native/meta-idle-monitor-native.h \ + backends/native/meta-input-settings-native.c \ + backends/native/meta-input-settings-native.h \ backends/native/meta-monitor-manager-kms.c \ backends/native/meta-monitor-manager-kms.h \ backends/native/meta-launcher.c \ diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c index 0c995620d..f3148672d 100644 --- a/src/backends/meta-input-settings.c +++ b/src/backends/meta-input-settings.c @@ -33,6 +33,11 @@ #include "meta-input-settings-private.h" #include "x11/meta-input-settings-x11.h" +#ifdef HAVE_NATIVE_BACKEND +#include "native/meta-backend-native.h" +#include "native/meta-input-settings-native.h" +#endif + #include typedef struct _MetaInputSettingsPrivate MetaInputSettingsPrivate; @@ -604,6 +609,14 @@ meta_input_settings_init (MetaInputSettings *settings) MetaInputSettings * meta_input_settings_create (void) { +#ifdef HAVE_NATIVE_BACKEND + MetaBackend *backend; + + backend = meta_get_backend (); + + if (META_IS_BACKEND_NATIVE (backend)) + return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE, NULL); +#endif if (!meta_is_wayland_compositor ()) return g_object_new (META_TYPE_INPUT_SETTINGS_X11, NULL); diff --git a/src/backends/native/meta-input-settings-native.c b/src/backends/native/meta-input-settings-native.c new file mode 100644 index 000000000..4f436e9f1 --- /dev/null +++ b/src/backends/native/meta-input-settings-native.c @@ -0,0 +1,217 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2014 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Author: Carlos Garnacho + */ + +#include "config.h" + +#include +#include + +#include "meta-input-settings-native.h" + +G_DEFINE_TYPE (MetaInputSettingsNative, meta_input_settings_native, META_TYPE_INPUT_SETTINGS) + +static void +meta_input_settings_native_set_send_events (MetaInputSettings *settings, + ClutterInputDevice *device, + GDesktopDeviceSendEvents mode) +{ + enum libinput_config_send_events_mode libinput_mode; + struct libinput_device *libinput_device; + + switch (mode) + { + case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED: + libinput_mode = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED; + break; + case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE: + libinput_mode = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE; + break; + case G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED: + libinput_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; + break; + default: + g_assert_not_reached (); + } + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + libinput_device_config_send_events_set_mode (libinput_device, libinput_mode); +} + +static void +meta_input_settings_native_set_matrix (MetaInputSettings *settings, + ClutterInputDevice *device, + gfloat matrix[6]) +{ + struct libinput_device *libinput_device; + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + + if (libinput_device_config_calibration_has_matrix (libinput_device) > 0) + libinput_device_config_calibration_set_matrix (libinput_device, matrix); +} + +static void +meta_input_settings_native_set_speed (MetaInputSettings *settings, + ClutterInputDevice *device, + gdouble speed) +{ + struct libinput_device *libinput_device; + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + libinput_device_config_accel_set_speed (libinput_device, + CLAMP (speed, -1, 1)); +} + +static void +meta_input_settings_native_set_left_handed (MetaInputSettings *settings, + ClutterInputDevice *device, + gboolean enabled) +{ + struct libinput_device *libinput_device; + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + + if (libinput_device_config_left_handed_is_available (libinput_device)) + libinput_device_config_left_handed_set (libinput_device, enabled); +} + +static void +meta_input_settings_native_set_tap_enabled (MetaInputSettings *settings, + ClutterInputDevice *device, + gboolean enabled) +{ + struct libinput_device *libinput_device; + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + + if (libinput_device_config_tap_get_finger_count (libinput_device) > 0) + libinput_device_config_tap_set_enabled (libinput_device, + enabled ? + LIBINPUT_CONFIG_TAP_ENABLED : + LIBINPUT_CONFIG_TAP_DISABLED); +} + +static void +meta_input_settings_native_set_invert_scroll (MetaInputSettings *settings, + ClutterInputDevice *device, + gboolean inverted) +{ + struct libinput_device *libinput_device; + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + + if (libinput_device_config_scroll_has_natural_scroll (libinput_device)) + libinput_device_config_scroll_set_natural_scroll_enabled (libinput_device, + inverted); +} + +static gboolean +device_set_scroll_method (struct libinput_device *libinput_device, + enum libinput_config_scroll_method method) +{ + enum libinput_config_scroll_method supported; + + supported = libinput_device_config_scroll_get_methods (libinput_device); + + if (method & supported) + libinput_device_config_scroll_set_method (libinput_device, method); + + return (method & supported) != 0; +} + +static void +meta_input_settings_native_set_scroll_method (MetaInputSettings *settings, + ClutterInputDevice *device, + GDesktopTouchpadScrollMethod mode) +{ + enum libinput_config_scroll_method scroll_method = 0; + struct libinput_device *libinput_device; + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + + switch (mode) + { + case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_DISABLED: + scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL; + break; + case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_EDGE_SCROLLING: + scroll_method = LIBINPUT_CONFIG_SCROLL_2FG; + break; + case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_TWO_FINGER_SCROLLING: + scroll_method = LIBINPUT_CONFIG_SCROLL_EDGE; + break; + default: + g_assert_not_reached (); + return; + } + + device_set_scroll_method (libinput_device, scroll_method); +} + +static void +meta_input_settings_native_set_scroll_button (MetaInputSettings *settings, + ClutterInputDevice *device, + guint button) +{ + struct libinput_device *libinput_device; + + libinput_device = clutter_evdev_input_device_get_libinput_device (device); + + if (!device_set_scroll_method (libinput_device, + LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN)) + return; + + libinput_device_config_scroll_set_button (libinput_device, button); +} + +static void +meta_input_settings_native_set_keyboard_repeat (MetaInputSettings *settings, + gboolean enabled, + guint delay, + guint interval) +{ + ClutterDeviceManager *manager = clutter_device_manager_get_default (); + + clutter_evdev_set_keyboard_repeat (manager, enabled, delay, interval); +} + +static void +meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass) +{ + MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (klass); + + input_settings_class->set_send_events = meta_input_settings_native_set_send_events; + input_settings_class->set_matrix = meta_input_settings_native_set_matrix; + input_settings_class->set_speed = meta_input_settings_native_set_speed; + input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed; + input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled; + input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll; + input_settings_class->set_scroll_method = meta_input_settings_native_set_scroll_method; + input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button; + input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat; +} + +static void +meta_input_settings_native_init (MetaInputSettingsNative *settings) +{ +} diff --git a/src/backends/native/meta-input-settings-native.h b/src/backends/native/meta-input-settings-native.h new file mode 100644 index 000000000..99ba7b6b4 --- /dev/null +++ b/src/backends/native/meta-input-settings-native.h @@ -0,0 +1,49 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright 2014 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: Carlos Garnacho + */ + +#ifndef META_INPUT_SETTINGS_NATIVE_H +#define META_INPUT_SETTINGS_NATIVE_H + +#include "meta-input-settings-private.h" + +#define META_TYPE_INPUT_SETTINGS_NATIVE (meta_input_settings_native_get_type ()) +#define META_INPUT_SETTINGS_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_INPUT_SETTINGS_NATIVE, MetaInputSettingsNative)) +#define META_INPUT_SETTINGS_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_INPUT_SETTINGS_NATIVE, MetaInputSettingsNativeClass)) +#define META_IS_INPUT_SETTINGS_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_INPUT_SETTINGS_NATIVE)) +#define META_IS_INPUT_SETTINGS_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_INPUT_SETTINGS_NATIVE)) +#define META_INPUT_SETTINGS_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_INPUT_SETTINGS_NATIVE, MetaInputSettingsNativeClass)) + +typedef struct _MetaInputSettingsNative MetaInputSettingsNative; +typedef struct _MetaInputSettingsNativeClass MetaInputSettingsNativeClass; + +struct _MetaInputSettingsNative +{ + MetaInputSettings parent_instance; +}; + +struct _MetaInputSettingsNativeClass +{ + MetaInputSettingsClass parent_class; +}; + +GType meta_input_settings_native_get_type (void) G_GNUC_CONST; + +#endif /* META_INPUT_SETTINGS_NATIVE_H */