backend/session/dev_udev.c, backend/libinput/backend.c: decouple udev from include/wlr/backend/session/session.h

This commit is contained in:
illiliti 2022-03-13 22:13:27 +03:00
parent e706875432
commit 68652158b7
3 changed files with 34 additions and 24 deletions

View file

@ -6,6 +6,7 @@
#include <wlr/backend/session.h> #include <wlr/backend/session.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "backend/libinput.h" #include "backend/libinput.h"
#include "backend/session/dev_udev.h"
#include "util/signal.h" #include "util/signal.h"
static struct wlr_libinput_backend *get_libinput_backend_from_backend( 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"); wlr_log(WLR_DEBUG, "Starting libinput backend");
backend->libinput_context = libinput_udev_create_context(&libinput_impl, backend->libinput_context = libinput_udev_create_context(&libinput_impl,
backend, backend->session->udev); backend, backend->session->dev->udev);
if (!backend->libinput_context) { if (!backend->libinput_context) {
wlr_log(WLR_ERROR, "Failed to create libinput context"); wlr_log(WLR_ERROR, "Failed to create libinput context");
return false; return false;

View file

@ -15,6 +15,7 @@
#include <xf86drm.h> #include <xf86drm.h>
#include "backend/session/session.h" #include "backend/session/session.h"
#include "backend/session/dev.h" #include "backend/session/dev.h"
#include "backend/session/dev_udev.h"
#include "util/signal.h" #include "util/signal.h"
#define WAIT_GPU_TIMEOUT 10000 // ms #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) { static int handle_udev_event(int fd, uint32_t mask, void *data) {
struct wlr_session *session = 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) { if (!udev_dev) {
return 1; return 1;
} }
@ -121,37 +122,46 @@ out:
} }
int dev_init(struct wlr_session *session, struct wl_display *disp) { int dev_init(struct wlr_session *session, struct wl_display *disp) {
session->udev = udev_new(); struct dev *dev = calloc(1, sizeof(*dev));
if (!session->udev) { if (!dev) {
wlr_log_errno(WLR_ERROR, "Failed to create udev context"); wlr_log_errno(WLR_ERROR, "Allocation failed");
return -1; return -1;
} }
session->mon = udev_monitor_new_from_netlink(session->udev, "udev"); dev->udev = udev_new();
if (!session->mon) { 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"); wlr_log_errno(WLR_ERROR, "Failed to create udev monitor");
goto error_udev; goto error_udev;
} }
udev_monitor_filter_add_match_subsystem_devtype(session->mon, "drm", NULL); udev_monitor_filter_add_match_subsystem_devtype(dev->mon, "drm", NULL);
udev_monitor_enable_receiving(session->mon); udev_monitor_enable_receiving(dev->mon);
struct wl_event_loop *event_loop = wl_display_get_event_loop(disp); 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); 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"); wlr_log_errno(WLR_ERROR, "Failed to create udev event source");
goto error_mon; goto error_mon;
} }
session->dev = dev;
return 0; return 0;
error_mon: error_mon:
udev_monitor_unref(session->mon); udev_monitor_unref(dev->mon);
error_udev: error_udev:
udev_unref(session->udev); udev_unref(dev->udev);
error_dev:
free(dev);
return -1; return -1;
} }
@ -160,9 +170,10 @@ void dev_finish(struct wlr_session *session) {
return; return;
} }
wl_event_source_remove(session->udev_event); wl_event_source_remove(session->dev->udev_event);
udev_monitor_unref(session->mon); udev_monitor_unref(session->dev->mon);
udev_unref(session->udev); udev_unref(session->dev->udev);
free(session->dev);
} }
static struct udev_enumerate *enumerate_drm_cards(struct udev *udev) { 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, ssize_t dev_find_gpus(struct wlr_session *session,
size_t ret_len, struct wlr_device **ret) { 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) { if (!en) {
return -1; return -1;
} }
@ -241,7 +252,7 @@ ssize_t dev_find_gpus(struct wlr_session *session,
wl_list_remove(&handler.listener.link); wl_list_remove(&handler.listener.link);
en = enumerate_drm_cards(session->udev); en = enumerate_drm_cards(session->dev->udev);
if (!en) { if (!en) {
return -1; return -1;
} }
@ -258,7 +269,7 @@ ssize_t dev_find_gpus(struct wlr_session *session,
bool is_boot_vga = false; bool is_boot_vga = false;
const char *path = udev_list_entry_get_name(entry); 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) { if (!dev) {
continue; continue;
} }

View file

@ -1,12 +1,12 @@
#ifndef WLR_BACKEND_SESSION_H #ifndef WLR_BACKEND_SESSION_H
#define WLR_BACKEND_SESSION_H #define WLR_BACKEND_SESSION_H
#include <libudev.h>
#include <stdbool.h> #include <stdbool.h>
#include <sys/types.h> #include <sys/types.h>
#include <wayland-server-core.h> #include <wayland-server-core.h>
struct libseat; struct libseat;
struct dev;
struct wlr_device { struct wlr_device {
int fd; int fd;
@ -34,9 +34,7 @@ struct wlr_session {
unsigned vtnr; unsigned vtnr;
char seat[256]; char seat[256];
struct udev *udev; struct dev *dev;
struct udev_monitor *mon;
struct wl_event_source *udev_event;
struct libseat *seat_handle; struct libseat *seat_handle;
struct wl_event_source *libseat_event; struct wl_event_source *libseat_event;