From 68652158b79af55637c36b74aabf9fe3256a0905 Mon Sep 17 00:00:00 2001 From: illiliti Date: Sun, 13 Mar 2022 22:13:27 +0300 Subject: [PATCH] backend/session/dev_udev.c, backend/libinput/backend.c: decouple udev from include/wlr/backend/session/session.h --- backend/libinput/backend.c | 3 ++- backend/session/dev_udev.c | 49 +++++++++++++++++++++-------------- include/wlr/backend/session.h | 6 ++--- 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index 60f456cc1..5eac2c96b 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -6,6 +6,7 @@ #include #include #include "backend/libinput.h" +#include "backend/session/dev_udev.h" #include "util/signal.h" static struct wlr_libinput_backend *get_libinput_backend_from_backend( @@ -87,7 +88,7 @@ static bool backend_start(struct wlr_backend *wlr_backend) { wlr_log(WLR_DEBUG, "Starting libinput backend"); backend->libinput_context = libinput_udev_create_context(&libinput_impl, - backend, backend->session->udev); + backend, backend->session->dev->udev); if (!backend->libinput_context) { wlr_log(WLR_ERROR, "Failed to create libinput context"); return false; diff --git a/backend/session/dev_udev.c b/backend/session/dev_udev.c index 88dab7b33..338e43b57 100644 --- a/backend/session/dev_udev.c +++ b/backend/session/dev_udev.c @@ -15,6 +15,7 @@ #include #include "backend/session/session.h" #include "backend/session/dev.h" +#include "backend/session/dev_udev.h" #include "util/signal.h" #define WAIT_GPU_TIMEOUT 10000 // ms @@ -64,7 +65,7 @@ static void read_udev_change_event(struct wlr_device_change_event *event, static int handle_udev_event(int fd, uint32_t mask, void *data) { struct wlr_session *session = data; - struct udev_device *udev_dev = udev_monitor_receive_device(session->mon); + struct udev_device *udev_dev = udev_monitor_receive_device(session->dev->mon); if (!udev_dev) { return 1; } @@ -121,37 +122,46 @@ out: } int dev_init(struct wlr_session *session, struct wl_display *disp) { - session->udev = udev_new(); - if (!session->udev) { - wlr_log_errno(WLR_ERROR, "Failed to create udev context"); + struct dev *dev = calloc(1, sizeof(*dev)); + if (!dev) { + wlr_log_errno(WLR_ERROR, "Allocation failed"); return -1; } - session->mon = udev_monitor_new_from_netlink(session->udev, "udev"); - if (!session->mon) { + dev->udev = udev_new(); + if (!dev->udev) { + wlr_log_errno(WLR_ERROR, "Failed to create udev context"); + goto error_dev; + } + + dev->mon = udev_monitor_new_from_netlink(dev->udev, "udev"); + if (!dev->mon) { wlr_log_errno(WLR_ERROR, "Failed to create udev monitor"); goto error_udev; } - udev_monitor_filter_add_match_subsystem_devtype(session->mon, "drm", NULL); - udev_monitor_enable_receiving(session->mon); + udev_monitor_filter_add_match_subsystem_devtype(dev->mon, "drm", NULL); + udev_monitor_enable_receiving(dev->mon); struct wl_event_loop *event_loop = wl_display_get_event_loop(disp); - int fd = udev_monitor_get_fd(session->mon); + int fd = udev_monitor_get_fd(dev->mon); - session->udev_event = wl_event_loop_add_fd(event_loop, fd, + dev->udev_event = wl_event_loop_add_fd(event_loop, fd, WL_EVENT_READABLE, handle_udev_event, session); - if (!session->udev_event) { + if (!dev->udev_event) { wlr_log_errno(WLR_ERROR, "Failed to create udev event source"); goto error_mon; } + session->dev = dev; return 0; error_mon: - udev_monitor_unref(session->mon); + udev_monitor_unref(dev->mon); error_udev: - udev_unref(session->udev); + udev_unref(dev->udev); +error_dev: + free(dev); return -1; } @@ -160,9 +170,10 @@ void dev_finish(struct wlr_session *session) { return; } - wl_event_source_remove(session->udev_event); - udev_monitor_unref(session->mon); - udev_unref(session->udev); + wl_event_source_remove(session->dev->udev_event); + udev_monitor_unref(session->dev->mon); + udev_unref(session->dev->udev); + free(session->dev); } static struct udev_enumerate *enumerate_drm_cards(struct udev *udev) { @@ -206,7 +217,7 @@ static void find_gpus_handle_add(struct wl_listener *listener, void *data) { */ ssize_t dev_find_gpus(struct wlr_session *session, size_t ret_len, struct wlr_device **ret) { - struct udev_enumerate *en = enumerate_drm_cards(session->udev); + struct udev_enumerate *en = enumerate_drm_cards(session->dev->udev); if (!en) { return -1; } @@ -241,7 +252,7 @@ ssize_t dev_find_gpus(struct wlr_session *session, wl_list_remove(&handler.listener.link); - en = enumerate_drm_cards(session->udev); + en = enumerate_drm_cards(session->dev->udev); if (!en) { return -1; } @@ -258,7 +269,7 @@ ssize_t dev_find_gpus(struct wlr_session *session, bool is_boot_vga = false; const char *path = udev_list_entry_get_name(entry); - struct udev_device *dev = udev_device_new_from_syspath(session->udev, path); + struct udev_device *dev = udev_device_new_from_syspath(session->dev->udev, path); if (!dev) { continue; } diff --git a/include/wlr/backend/session.h b/include/wlr/backend/session.h index c8461ff7c..0f2e09722 100644 --- a/include/wlr/backend/session.h +++ b/include/wlr/backend/session.h @@ -1,12 +1,12 @@ #ifndef WLR_BACKEND_SESSION_H #define WLR_BACKEND_SESSION_H -#include #include #include #include struct libseat; +struct dev; struct wlr_device { int fd; @@ -34,9 +34,7 @@ struct wlr_session { unsigned vtnr; char seat[256]; - struct udev *udev; - struct udev_monitor *mon; - struct wl_event_source *udev_event; + struct dev *dev; struct libseat *seat_handle; struct wl_event_source *libseat_event;