Compare commits
3 Commits
main
...
wip/kms-co
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9582f7b207 | ||
![]() |
5fa38f4cd5 | ||
![]() |
0ae31a45ab |
@@ -29,4 +29,7 @@ MetaKmsConnector * meta_kms_connector_new (MetaKmsImplDevice *impl_device,
|
|||||||
drmModeConnector *drm_connector,
|
drmModeConnector *drm_connector,
|
||||||
drmModeRes *drm_resources);
|
drmModeRes *drm_resources);
|
||||||
|
|
||||||
|
gboolean meta_kms_connector_is_same_as (MetaKmsConnector *connector,
|
||||||
|
drmModeConnector *drm_connector);
|
||||||
|
|
||||||
#endif /* META_KMS_CONNECTOR_PRIVATE_H */
|
#endif /* META_KMS_CONNECTOR_PRIVATE_H */
|
||||||
|
@@ -36,6 +36,7 @@ struct _MetaKmsConnector
|
|||||||
|
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
MetaConnectorType type;
|
MetaConnectorType type;
|
||||||
|
uint32_t type_id;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
MetaKmsConnectorState *current_state;
|
MetaKmsConnectorState *current_state;
|
||||||
@@ -562,6 +563,15 @@ make_connector_name (drmModeConnector *drm_connector)
|
|||||||
drm_connector->connector_type_id);
|
drm_connector->connector_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_kms_connector_is_same_as (MetaKmsConnector *connector,
|
||||||
|
drmModeConnector *drm_connector)
|
||||||
|
{
|
||||||
|
return (connector->id == drm_connector->connector_id &&
|
||||||
|
connector->type == drm_connector->connector_type &&
|
||||||
|
connector->type_id == drm_connector->connector_type_id);
|
||||||
|
}
|
||||||
|
|
||||||
MetaKmsConnector *
|
MetaKmsConnector *
|
||||||
meta_kms_connector_new (MetaKmsImplDevice *impl_device,
|
meta_kms_connector_new (MetaKmsImplDevice *impl_device,
|
||||||
drmModeConnector *drm_connector,
|
drmModeConnector *drm_connector,
|
||||||
@@ -573,6 +583,7 @@ meta_kms_connector_new (MetaKmsImplDevice *impl_device,
|
|||||||
connector->device = meta_kms_impl_device_get_device (impl_device);
|
connector->device = meta_kms_impl_device_get_device (impl_device);
|
||||||
connector->id = drm_connector->connector_id;
|
connector->id = drm_connector->connector_id;
|
||||||
connector->type = (MetaConnectorType) drm_connector->connector_type;
|
connector->type = (MetaConnectorType) drm_connector->connector_type;
|
||||||
|
connector->type_id = drm_connector->connector_type_id;
|
||||||
connector->name = make_connector_name (drm_connector);
|
connector->name = make_connector_name (drm_connector);
|
||||||
|
|
||||||
find_property_ids (connector, impl_device, drm_connector);
|
find_property_ids (connector, impl_device, drm_connector);
|
||||||
|
@@ -24,4 +24,7 @@
|
|||||||
|
|
||||||
MetaKmsImplDevice * meta_kms_device_get_impl_device (MetaKmsDevice *device);
|
MetaKmsImplDevice * meta_kms_device_get_impl_device (MetaKmsDevice *device);
|
||||||
|
|
||||||
|
void meta_kms_device_update_states_in_impl (MetaKmsDevice *device,
|
||||||
|
MetaKmsUpdateStatesFlags flags);
|
||||||
|
|
||||||
#endif /* META_KMS_DEVICE_PRIVATE_H */
|
#endif /* META_KMS_DEVICE_PRIVATE_H */
|
||||||
|
@@ -108,6 +108,31 @@ meta_kms_device_get_primary_plane_for (MetaKmsDevice *device,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_kms_device_update_states_in_impl (MetaKmsDevice *device,
|
||||||
|
MetaKmsUpdateStatesFlags flags)
|
||||||
|
{
|
||||||
|
MetaKmsImplDevice *impl_device = meta_kms_device_get_impl_device (device);
|
||||||
|
|
||||||
|
meta_assert_in_kms_impl (device->kms);
|
||||||
|
|
||||||
|
meta_kms_impl_device_update_states (impl_device, flags);
|
||||||
|
|
||||||
|
if (flags & META_KMS_UPDATE_STATES_FLAG_HOTPLUG)
|
||||||
|
{
|
||||||
|
meta_assert_is_waiting_for_kms_impl_task (device->kms);
|
||||||
|
|
||||||
|
g_list_free (device->crtcs);
|
||||||
|
device->crtcs = meta_kms_impl_device_copy_crtcs (impl_device);
|
||||||
|
|
||||||
|
g_list_free (device->connectors);
|
||||||
|
device->connectors = meta_kms_impl_device_copy_connectors (impl_device);
|
||||||
|
|
||||||
|
g_list_free (device->planes);
|
||||||
|
device->planes = meta_kms_impl_device_copy_planes (impl_device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
dispatch_in_impl (MetaKmsImpl *impl,
|
dispatch_in_impl (MetaKmsImpl *impl,
|
||||||
gpointer user_data,
|
gpointer user_data,
|
||||||
|
@@ -196,10 +196,28 @@ init_crtcs (MetaKmsImplDevice *impl_device,
|
|||||||
impl_device->crtcs = g_list_reverse (impl_device->crtcs);
|
impl_device->crtcs = g_list_reverse (impl_device->crtcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static MetaKmsConnector *
|
||||||
init_connectors (MetaKmsImplDevice *impl_device,
|
find_existing_connector (MetaKmsImplDevice *impl_device,
|
||||||
drmModeRes *drm_resources)
|
drmModeConnector *drm_connector)
|
||||||
{
|
{
|
||||||
|
GList *l;
|
||||||
|
|
||||||
|
for (l = impl_device->connectors; l; l = l->next)
|
||||||
|
{
|
||||||
|
MetaKmsConnector *connector = l->data;
|
||||||
|
|
||||||
|
if (meta_kms_connector_is_same_as (connector, drm_connector))
|
||||||
|
return connector;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_connectors (MetaKmsImplDevice *impl_device,
|
||||||
|
drmModeRes *drm_resources)
|
||||||
|
{
|
||||||
|
GList *connectors = NULL;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < drm_resources->count_connectors; i++)
|
for (i = 0; i < drm_resources->count_connectors; i++)
|
||||||
@@ -212,14 +230,19 @@ init_connectors (MetaKmsImplDevice *impl_device,
|
|||||||
if (!drm_connector)
|
if (!drm_connector)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
connector = meta_kms_connector_new (impl_device, drm_connector,
|
connector = find_existing_connector (impl_device, drm_connector);
|
||||||
drm_resources);
|
if (connector)
|
||||||
|
connector = g_object_ref (connector);
|
||||||
|
else
|
||||||
|
connector = meta_kms_connector_new (impl_device, drm_connector,
|
||||||
|
drm_resources);
|
||||||
drmModeFreeConnector (drm_connector);
|
drmModeFreeConnector (drm_connector);
|
||||||
|
|
||||||
impl_device->connectors = g_list_prepend (impl_device->connectors,
|
connectors = g_list_prepend (connectors, connector);
|
||||||
connector);
|
|
||||||
}
|
}
|
||||||
impl_device->connectors = g_list_reverse (impl_device->connectors);
|
|
||||||
|
g_list_free_full (impl_device->connectors, g_object_unref);
|
||||||
|
impl_device->connectors = g_list_reverse (connectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaKmsPlaneType
|
static MetaKmsPlaneType
|
||||||
@@ -295,13 +318,18 @@ init_planes (MetaKmsImplDevice *impl_device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device)
|
meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device,
|
||||||
|
MetaKmsUpdateStatesFlags flags)
|
||||||
{
|
{
|
||||||
drmModeRes *drm_resources;
|
drmModeRes *drm_resources;
|
||||||
|
|
||||||
meta_assert_in_kms_impl (meta_kms_impl_get_kms (impl_device->impl));
|
meta_assert_in_kms_impl (meta_kms_impl_get_kms (impl_device->impl));
|
||||||
|
|
||||||
drm_resources = drmModeGetResources (impl_device->fd);
|
drm_resources = drmModeGetResources (impl_device->fd);
|
||||||
|
|
||||||
|
if (flags & META_KMS_UPDATE_STATES_FLAG_HOTPLUG)
|
||||||
|
update_connectors (impl_device, drm_resources);
|
||||||
|
|
||||||
g_list_foreach (impl_device->crtcs, (GFunc) meta_kms_crtc_update_state,
|
g_list_foreach (impl_device->crtcs, (GFunc) meta_kms_crtc_update_state,
|
||||||
NULL);
|
NULL);
|
||||||
g_list_foreach (impl_device->connectors, (GFunc) meta_kms_connector_update_state,
|
g_list_foreach (impl_device->connectors, (GFunc) meta_kms_connector_update_state,
|
||||||
@@ -346,9 +374,10 @@ meta_kms_impl_device_new (MetaKmsDevice *device,
|
|||||||
impl_device->fd = fd;
|
impl_device->fd = fd;
|
||||||
|
|
||||||
init_crtcs (impl_device, drm_resources);
|
init_crtcs (impl_device, drm_resources);
|
||||||
init_connectors (impl_device, drm_resources);
|
|
||||||
init_planes (impl_device);
|
init_planes (impl_device);
|
||||||
|
|
||||||
|
update_connectors (impl_device, drm_resources);
|
||||||
|
|
||||||
drmModeFreeResources (drm_resources);
|
drmModeFreeResources (drm_resources);
|
||||||
|
|
||||||
impl_device->fd_source =
|
impl_device->fd_source =
|
||||||
|
@@ -53,7 +53,8 @@ int meta_kms_impl_device_get_fd (MetaKmsImplDevice *impl_device);
|
|||||||
|
|
||||||
int meta_kms_impl_device_leak_fd (MetaKmsImplDevice *impl_device);
|
int meta_kms_impl_device_leak_fd (MetaKmsImplDevice *impl_device);
|
||||||
|
|
||||||
void meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device);
|
void meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device,
|
||||||
|
MetaKmsUpdateStatesFlags flags);
|
||||||
|
|
||||||
int meta_kms_impl_device_close (MetaKmsImplDevice *impl_device);
|
int meta_kms_impl_device_close (MetaKmsImplDevice *impl_device);
|
||||||
|
|
||||||
|
@@ -55,9 +55,13 @@ GSource * meta_kms_register_fd_in_impl (MetaKms *kms,
|
|||||||
|
|
||||||
gboolean meta_kms_in_impl_task (MetaKms *kms);
|
gboolean meta_kms_in_impl_task (MetaKms *kms);
|
||||||
|
|
||||||
|
gboolean meta_kms_is_waiting_for_impl_task (MetaKms *kms);
|
||||||
|
|
||||||
#define meta_assert_in_kms_impl(kms) \
|
#define meta_assert_in_kms_impl(kms) \
|
||||||
g_assert (meta_kms_in_impl_task (kms))
|
g_assert (meta_kms_in_impl_task (kms))
|
||||||
#define meta_assert_not_in_kms_impl(kms) \
|
#define meta_assert_not_in_kms_impl(kms) \
|
||||||
g_assert (!meta_kms_in_impl_task (kms))
|
g_assert (!meta_kms_in_impl_task (kms))
|
||||||
|
#define meta_assert_is_waiting_for_kms_impl_task(kms) \
|
||||||
|
g_assert (meta_kms_is_waiting_for_impl_task (kms))
|
||||||
|
|
||||||
#endif /* META_KMS_PRIVATE_H */
|
#endif /* META_KMS_PRIVATE_H */
|
||||||
|
@@ -56,4 +56,10 @@ typedef enum _MetaKmsDeviceFlag
|
|||||||
META_KMS_DEVICE_FLAG_PLATFORM_DEVICE = 1 << 1,
|
META_KMS_DEVICE_FLAG_PLATFORM_DEVICE = 1 << 1,
|
||||||
} MetaKmsDeviceFlag;
|
} MetaKmsDeviceFlag;
|
||||||
|
|
||||||
|
typedef enum _MetaKmsUpdateStatesFlags
|
||||||
|
{
|
||||||
|
META_KMS_UPDATE_STATES_FLAG_NONE = 0,
|
||||||
|
META_KMS_UPDATE_STATES_FLAG_HOTPLUG = 1 << 0,
|
||||||
|
} MetaKmsUpdateStatesFlags;
|
||||||
|
|
||||||
#endif /* META_KMS_IMPL_TYPES_H */
|
#endif /* META_KMS_IMPL_TYPES_H */
|
||||||
|
@@ -119,6 +119,15 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
RESOURCES_CHANGED,
|
||||||
|
|
||||||
|
N_SIGNALS
|
||||||
|
};
|
||||||
|
|
||||||
|
static int signals[N_SIGNALS];
|
||||||
|
|
||||||
typedef struct _MetaKmsCallbackData
|
typedef struct _MetaKmsCallbackData
|
||||||
{
|
{
|
||||||
MetaKmsCallback callback;
|
MetaKmsCallback callback;
|
||||||
@@ -154,6 +163,7 @@ struct _MetaKms
|
|||||||
|
|
||||||
MetaKmsImpl *impl;
|
MetaKmsImpl *impl;
|
||||||
gboolean in_impl_task;
|
gboolean in_impl_task;
|
||||||
|
gboolean waiting_for_impl_task;
|
||||||
|
|
||||||
GList *devices;
|
GList *devices;
|
||||||
|
|
||||||
@@ -166,7 +176,8 @@ struct _MetaKms
|
|||||||
G_DEFINE_TYPE (MetaKms, meta_kms, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (MetaKms, meta_kms, G_TYPE_OBJECT)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_kms_update_states_in_impl (MetaKms *kms);
|
meta_kms_update_states_in_impl (MetaKms *kms,
|
||||||
|
MetaKmsUpdateStatesFlags flags);
|
||||||
|
|
||||||
MetaKmsUpdate *
|
MetaKmsUpdate *
|
||||||
meta_kms_ensure_pending_update (MetaKms *kms)
|
meta_kms_ensure_pending_update (MetaKms *kms)
|
||||||
@@ -194,7 +205,8 @@ meta_kms_update_process_in_impl (MetaKmsImpl *impl,
|
|||||||
ret = meta_kms_impl_process_update (impl, update, error);
|
ret = meta_kms_impl_process_update (impl, update, error);
|
||||||
|
|
||||||
if (meta_kms_update_has_mode_set (update))
|
if (meta_kms_update_has_mode_set (update))
|
||||||
meta_kms_update_states_in_impl (meta_kms_impl_get_kms (impl));
|
meta_kms_update_states_in_impl (meta_kms_impl_get_kms (impl),
|
||||||
|
META_KMS_UPDATE_STATES_FLAG_NONE);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -322,7 +334,9 @@ meta_kms_run_impl_task_sync (MetaKms *kms,
|
|||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
|
||||||
kms->in_impl_task = TRUE;
|
kms->in_impl_task = TRUE;
|
||||||
|
kms->waiting_for_impl_task = TRUE;
|
||||||
ret = func (kms->impl, user_data, error);
|
ret = func (kms->impl, user_data, error);
|
||||||
|
kms->waiting_for_impl_task = FALSE;
|
||||||
kms->in_impl_task = FALSE;
|
kms->in_impl_task = FALSE;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -440,8 +454,15 @@ meta_kms_in_impl_task (MetaKms *kms)
|
|||||||
return kms->in_impl_task;
|
return kms->in_impl_task;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_kms_is_waiting_for_impl_task (MetaKms *kms)
|
||||||
|
{
|
||||||
|
return kms->waiting_for_impl_task;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_kms_update_states_in_impl (MetaKms *kms)
|
meta_kms_update_states_in_impl (MetaKms *kms,
|
||||||
|
MetaKmsUpdateStatesFlags flags)
|
||||||
{
|
{
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
@@ -453,9 +474,8 @@ meta_kms_update_states_in_impl (MetaKms *kms)
|
|||||||
for (l = kms->devices; l; l = l->next)
|
for (l = kms->devices; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaKmsDevice *device = l->data;
|
MetaKmsDevice *device = l->data;
|
||||||
MetaKmsImplDevice *impl_device = meta_kms_device_get_impl_device (device);
|
|
||||||
|
|
||||||
meta_kms_impl_device_update_states (impl_device);
|
meta_kms_device_update_states_in_impl (device, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,20 +484,22 @@ update_states_in_impl (MetaKmsImpl *impl,
|
|||||||
gpointer user_data,
|
gpointer user_data,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
MetaKms *kms = user_data;
|
MetaKms *kms = meta_kms_impl_get_kms (impl);;
|
||||||
|
MetaKmsUpdateStatesFlags flags = GPOINTER_TO_UINT (user_data);
|
||||||
|
|
||||||
meta_kms_update_states_in_impl (kms);
|
meta_kms_update_states_in_impl (kms, flags);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_kms_update_states_sync (MetaKms *kms,
|
meta_kms_update_states_sync (MetaKms *kms,
|
||||||
GError **error)
|
MetaKmsUpdateStatesFlags flags,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
return meta_kms_run_impl_task_sync (kms,
|
return meta_kms_run_impl_task_sync (kms,
|
||||||
update_states_in_impl,
|
update_states_in_impl,
|
||||||
kms,
|
GUINT_TO_POINTER (flags),
|
||||||
error);
|
error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,8 +508,12 @@ handle_hotplug_event (MetaKms *kms)
|
|||||||
{
|
{
|
||||||
g_autoptr (GError) error = NULL;
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
if (!meta_kms_update_states_sync (kms, &error))
|
if (!meta_kms_update_states_sync (kms,
|
||||||
|
META_KMS_UPDATE_STATES_FLAG_HOTPLUG,
|
||||||
|
&error))
|
||||||
g_warning ("Updating KMS state failed: %s", error->message);
|
g_warning ("Updating KMS state failed: %s", error->message);
|
||||||
|
|
||||||
|
g_signal_emit (kms, signals[RESOURCES_CHANGED], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -590,4 +616,12 @@ meta_kms_class_init (MetaKmsClass *klass)
|
|||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->finalize = meta_kms_finalize;
|
object_class->finalize = meta_kms_finalize;
|
||||||
|
|
||||||
|
signals[RESOURCES_CHANGED] =
|
||||||
|
g_signal_new ("resources-changed",
|
||||||
|
G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
}
|
}
|
||||||
|
@@ -75,8 +75,7 @@ struct _MetaMonitorManagerKms
|
|||||||
{
|
{
|
||||||
MetaMonitorManager parent_instance;
|
MetaMonitorManager parent_instance;
|
||||||
|
|
||||||
guint hotplug_handler_id;
|
gulong kms_resources_changed_handler_id;
|
||||||
guint removed_handler_id;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorManagerKmsClass
|
struct _MetaMonitorManagerKmsClass
|
||||||
@@ -479,16 +478,8 @@ handle_hotplug_event (MetaMonitorManager *manager)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_udev_hotplug (MetaUdev *udev,
|
on_kms_resources_changed (MetaKms *kms,
|
||||||
MetaMonitorManager *manager)
|
MetaMonitorManager *manager)
|
||||||
{
|
|
||||||
handle_hotplug_event (manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
on_udev_device_removed (MetaUdev *udev,
|
|
||||||
GUdevDevice *device,
|
|
||||||
MetaMonitorManager *manager)
|
|
||||||
{
|
{
|
||||||
handle_hotplug_event (manager);
|
handle_hotplug_event (manager);
|
||||||
}
|
}
|
||||||
@@ -498,14 +489,12 @@ meta_monitor_manager_kms_connect_hotplug_handler (MetaMonitorManagerKms *manager
|
|||||||
{
|
{
|
||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
||||||
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
||||||
MetaUdev *udev = meta_backend_native_get_udev (META_BACKEND_NATIVE (backend));
|
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
|
||||||
|
MetaKms *kms = meta_backend_native_get_kms (backend_native);
|
||||||
|
|
||||||
manager_kms->hotplug_handler_id =
|
manager_kms->kms_resources_changed_handler_id =
|
||||||
g_signal_connect_after (udev, "hotplug",
|
g_signal_connect (kms, "resources-changed",
|
||||||
G_CALLBACK (on_udev_hotplug), manager);
|
G_CALLBACK (on_kms_resources_changed), manager);
|
||||||
manager_kms->removed_handler_id =
|
|
||||||
g_signal_connect_after (udev, "device-removed",
|
|
||||||
G_CALLBACK (on_udev_device_removed), manager);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -513,12 +502,10 @@ meta_monitor_manager_kms_disconnect_hotplug_handler (MetaMonitorManagerKms *mana
|
|||||||
{
|
{
|
||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
||||||
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
||||||
MetaUdev *udev = meta_backend_native_get_udev (META_BACKEND_NATIVE (backend));
|
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
|
||||||
|
MetaKms *kms = meta_backend_native_get_kms (backend_native);
|
||||||
|
|
||||||
g_signal_handler_disconnect (udev, manager_kms->hotplug_handler_id);
|
g_clear_signal_handler (&manager_kms->kms_resources_changed_handler_id, kms);
|
||||||
manager_kms->hotplug_handler_id = 0;
|
|
||||||
g_signal_handler_disconnect (udev, manager_kms->removed_handler_id);
|
|
||||||
manager_kms->removed_handler_id = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Reference in New Issue
Block a user