backend: Add meta_backend_update_last_device()

This function can be used to trigger changes depending on the device type
that is currently emitting the events. So far, it is used to switch cursor
visibility on/off on touchscreen interaction.

A "last-device-updated" signal has also been added, in order allow hooking
other behavior changes (eg. OSK) when the last device changes.

https://bugzilla.gnome.org/show_bug.cgi?id=712775
This commit is contained in:
Carlos Garnacho 2015-02-11 14:59:21 +01:00
parent 67a30b7a89
commit 9e3bac0237
2 changed files with 50 additions and 0 deletions

View File

@ -50,6 +50,7 @@ struct _MetaBackend
GObject parent; GObject parent;
GHashTable *device_monitors; GHashTable *device_monitors;
gint current_device_id;
}; };
struct _MetaBackendClass struct _MetaBackendClass
@ -106,4 +107,7 @@ void meta_backend_warp_pointer (MetaBackend *backend,
struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend); struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
void meta_backend_update_last_device (MetaBackend *backend,
int device_id);
#endif /* META_BACKEND_PRIVATE_H */ #endif /* META_BACKEND_PRIVATE_H */

View File

@ -29,6 +29,7 @@
#include "meta-input-settings-private.h" #include "meta-input-settings-private.h"
#include "backends/x11/meta-backend-x11.h" #include "backends/x11/meta-backend-x11.h"
#include "meta-cursor-tracker-private.h"
#include "meta-stage.h" #include "meta-stage.h"
#ifdef HAVE_NATIVE_BACKEND #ifdef HAVE_NATIVE_BACKEND
@ -268,6 +269,12 @@ meta_backend_class_init (MetaBackendClass *klass)
0, 0,
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
g_signal_new ("last-device-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_INT);
} }
static void static void
@ -388,6 +395,45 @@ meta_backend_get_stage (MetaBackend *backend)
return priv->stage; return priv->stage;
} }
void
meta_backend_update_last_device (MetaBackend *backend,
int device_id)
{
ClutterInputDeviceType device_type;
MetaCursorTracker *cursor_tracker;
ClutterDeviceManager *manager;
ClutterInputDevice *device;
if (backend->current_device_id == device_id)
return;
manager = clutter_device_manager_get_default ();
device = clutter_device_manager_get_device (manager, device_id);
if (!device ||
clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
return;
device_type = clutter_input_device_get_device_type (device);
cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
backend->current_device_id = device_id;
g_signal_emit_by_name (backend, "last-device-changed", device_id);
if (device_type == CLUTTER_KEYBOARD_DEVICE)
return;
switch (device_type)
{
case CLUTTER_TOUCHSCREEN_DEVICE:
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
break;
default:
meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE);
break;
}
}
static GType static GType
get_backend_type (void) get_backend_type (void)
{ {