backends/native: Add udev abstraction layer
To be used to signal devices added, hotplugs and other udev events. Currently the only event emitted is when a device is added. https://gitlab.gnome.org/GNOME/mutter/issues/548 https://gitlab.gnome.org/GNOME/mutter/merge_requests/525
This commit is contained in:
parent
11e2005563
commit
73e8127d5d
@ -64,6 +64,7 @@ struct _MetaBackendNative
|
|||||||
MetaBackend parent;
|
MetaBackend parent;
|
||||||
|
|
||||||
MetaLauncher *launcher;
|
MetaLauncher *launcher;
|
||||||
|
MetaUdev *udev;
|
||||||
MetaBarrierManagerNative *barrier_manager;
|
MetaBarrierManagerNative *barrier_manager;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -81,6 +82,7 @@ meta_backend_native_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
MetaBackendNative *native = META_BACKEND_NATIVE (object);
|
MetaBackendNative *native = META_BACKEND_NATIVE (object);
|
||||||
|
|
||||||
|
g_clear_object (&native->udev);
|
||||||
meta_launcher_free (native->launcher);
|
meta_launcher_free (native->launcher);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
|
||||||
@ -516,6 +518,8 @@ meta_backend_native_initable_init (GInitable *initable,
|
|||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
MetaBackendNative *native = META_BACKEND_NATIVE (initable);
|
||||||
|
|
||||||
if (!meta_is_stage_views_enabled ())
|
if (!meta_is_stage_views_enabled ())
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
@ -523,6 +527,8 @@ meta_backend_native_initable_init (GInitable *initable,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
native->udev = meta_udev_new ();
|
||||||
|
|
||||||
return initable_parent_iface->init (initable, cancellable, error);
|
return initable_parent_iface->init (initable, cancellable, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -585,6 +591,12 @@ meta_backend_native_get_launcher (MetaBackendNative *native)
|
|||||||
return native->launcher;
|
return native->launcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MetaUdev *
|
||||||
|
meta_backend_native_get_udev (MetaBackendNative *native)
|
||||||
|
{
|
||||||
|
return native->udev;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_activate_vt (int vt, GError **error)
|
meta_activate_vt (int vt, GError **error)
|
||||||
{
|
{
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/native/meta-clutter-backend-native.h"
|
#include "backends/native/meta-clutter-backend-native.h"
|
||||||
#include "backends/native/meta-launcher.h"
|
#include "backends/native/meta-launcher.h"
|
||||||
|
#include "backends/native/meta-udev.h"
|
||||||
|
|
||||||
#define META_TYPE_BACKEND_NATIVE (meta_backend_native_get_type ())
|
#define META_TYPE_BACKEND_NATIVE (meta_backend_native_get_type ())
|
||||||
G_DECLARE_FINAL_TYPE (MetaBackendNative, meta_backend_native,
|
G_DECLARE_FINAL_TYPE (MetaBackendNative, meta_backend_native,
|
||||||
@ -41,4 +42,6 @@ void meta_backend_native_resume (MetaBackendNative *backend_native);
|
|||||||
|
|
||||||
MetaLauncher * meta_backend_native_get_launcher (MetaBackendNative *native);
|
MetaLauncher * meta_backend_native_get_launcher (MetaBackendNative *native);
|
||||||
|
|
||||||
|
MetaUdev * meta_backend_native_get_udev (MetaBackendNative *native);
|
||||||
|
|
||||||
#endif /* META_BACKEND_NATIVE_H */
|
#endif /* META_BACKEND_NATIVE_H */
|
||||||
|
109
src/backends/native/meta-udev.c
Normal file
109
src/backends/native/meta-udev.c
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "backends/native/meta-udev.h"
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
DEVICE_ADDED,
|
||||||
|
|
||||||
|
N_SIGNALS
|
||||||
|
};
|
||||||
|
|
||||||
|
static guint signals[N_SIGNALS];
|
||||||
|
|
||||||
|
struct _MetaUdev
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
|
||||||
|
GUdevClient *gudev_client;
|
||||||
|
|
||||||
|
guint uevent_handler_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (MetaUdev, meta_udev, G_TYPE_OBJECT)
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_uevent (GUdevClient *client,
|
||||||
|
const char *action,
|
||||||
|
GUdevDevice *device,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaUdev *udev = META_UDEV (user_data);
|
||||||
|
|
||||||
|
if (!g_udev_device_get_device_file (device))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (g_str_equal (action, "add"))
|
||||||
|
g_signal_emit (udev, signals[DEVICE_ADDED], 0, device);
|
||||||
|
}
|
||||||
|
|
||||||
|
GUdevClient *
|
||||||
|
meta_udev_get_gudev_client (MetaUdev *udev)
|
||||||
|
{
|
||||||
|
return udev->gudev_client;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaUdev *
|
||||||
|
meta_udev_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_UDEV, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_udev_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaUdev *udev = META_UDEV (object);
|
||||||
|
|
||||||
|
g_signal_handler_disconnect (udev->gudev_client, udev->uevent_handler_id);
|
||||||
|
g_clear_object (&udev->gudev_client);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_udev_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_udev_init (MetaUdev *udev)
|
||||||
|
{
|
||||||
|
const char *subsystems[] = { "drm", NULL };
|
||||||
|
|
||||||
|
udev->gudev_client = g_udev_client_new (subsystems);
|
||||||
|
udev->uevent_handler_id = g_signal_connect (udev->gudev_client,
|
||||||
|
"uevent",
|
||||||
|
G_CALLBACK (on_uevent), udev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_udev_class_init (MetaUdevClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_udev_finalize;
|
||||||
|
|
||||||
|
signals[DEVICE_ADDED] =
|
||||||
|
g_signal_new ("device-added",
|
||||||
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0, NULL, NULL,
|
||||||
|
g_cclosure_marshal_VOID__VOID,
|
||||||
|
G_TYPE_NONE, 1,
|
||||||
|
G_UDEV_TYPE_DEVICE);
|
||||||
|
}
|
33
src/backends/native/meta-udev.h
Normal file
33
src/backends/native/meta-udev.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_UDEV_H
|
||||||
|
#define META_UDEV_H
|
||||||
|
|
||||||
|
#include <gudev/gudev.h>
|
||||||
|
|
||||||
|
#define META_TYPE_UDEV (meta_udev_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (MetaUdev, meta_udev, META, UDEV, GObject)
|
||||||
|
|
||||||
|
GUdevClient * meta_udev_get_gudev_client (MetaUdev *udev);
|
||||||
|
|
||||||
|
MetaUdev * meta_udev_new (void);
|
||||||
|
|
||||||
|
#endif /* META_UDEV_H */
|
@ -599,6 +599,8 @@ if have_native_backend
|
|||||||
'backends/native/meta-renderer-native.h',
|
'backends/native/meta-renderer-native.h',
|
||||||
'backends/native/meta-stage-native.c',
|
'backends/native/meta-stage-native.c',
|
||||||
'backends/native/meta-stage-native.h',
|
'backends/native/meta-stage-native.h',
|
||||||
|
'backends/native/meta-udev.c',
|
||||||
|
'backends/native/meta-udev.h',
|
||||||
]
|
]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user