diff options
author | Ray Strode <rstrode@redhat.com> | 2016-12-08 15:37:50 -0500 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2016-12-15 14:24:34 -0500 |
commit | 05035718958d99fa56a42fff93def3f15e6898e4 (patch) | |
tree | 7e16fbd2fb02aab0808dd112213779f46cbd97c2 | |
parent | e4b7e4955c7a675c9f2a746930a4c29b47951dda (diff) |
build-goo: make udev support build time optional
Some set ups just use /dev/fb0 and don't need udev.
https://bugs.freedesktop.org/show_bug.cgi?id=99104
-rw-r--r-- | configure.ac | 11 | ||||
-rw-r--r-- | src/libply-splash-core/ply-device-manager.c | 124 |
2 files changed, 80 insertions, 55 deletions
diff --git a/configure.ac b/configure.ac index 66085d11..0cbe4695 100644 --- a/configure.ac +++ b/configure.ac @@ -38,10 +38,19 @@ PKG_CHECK_MODULES(IMAGE, [libpng >= 1.2.16 ]) AC_SUBST(IMAGE_CFLAGS) AC_SUBST(IMAGE_LIBS) -PKG_CHECK_MODULES(UDEV, [libudev]); +AC_ARG_WITH(udev, AS_HELP_STRING([--with-udev], [Add udev support]),, with_udev=yes) +PKG_CHECK_MODULES(UDEV, [libudev], have_udev=yes, have_udev=no) AC_SUBST(UDEV_CFLAGS) AC_SUBST(UDEV_LIBS) +if test "x$with_udev" != "xno" ; then + if test "x$have_udev" = "xyes"; then + AC_DEFINE(HAVE_UDEV, 1, [Define if have udev support]) + else + AC_MSG_ERROR([libudev is required unless --without-udev is passed]) + fi +fi + PLYMOUTH_CFLAGS="" PLYMOUTH_LIBS="-lm -lrt -ldl" diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c index 76357803..88274c65 100644 --- a/src/libply-splash-core/ply-device-manager.c +++ b/src/libply-splash-core/ply-device-manager.c @@ -30,7 +30,9 @@ #include <sys/stat.h> #include <sys/types.h> +#ifdef HAVE_UDEV #include <libudev.h> +#endif #include "ply-logger.h" #include "ply-event-loop.h" @@ -41,7 +43,9 @@ #define SUBSYSTEM_DRM "drm" #define SUBSYSTEM_FRAME_BUFFER "graphics" +#ifdef HAVE_UDEV static void create_devices_from_udev (ply_device_manager_t *manager); +#endif static void create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, const char *device_path, @@ -98,6 +102,57 @@ attach_to_event_loop (ply_device_manager_t *manager, manager); } +static void +free_displays_for_renderer (ply_device_manager_t *manager, + ply_renderer_t *renderer) +{ + ply_list_node_t *node; + + node = ply_list_get_first_node (manager->pixel_displays); + while (node != NULL) { + ply_list_node_t *next_node; + ply_pixel_display_t *display; + ply_renderer_t *display_renderer; + + display = ply_list_node_get_data (node); + next_node = ply_list_get_next_node (manager->pixel_displays, node); + display_renderer = ply_pixel_display_get_renderer (display); + + if (display_renderer == renderer) { + if (manager->pixel_display_removed_handler != NULL) + manager->pixel_display_removed_handler (manager->event_handler_data, display); + ply_pixel_display_free (display); + ply_list_remove_node (manager->pixel_displays, node); + + } + + node = next_node; + } +} + +static void +free_devices_from_device_path (ply_device_manager_t *manager, + const char *device_path) +{ + char *key = NULL; + ply_renderer_t *renderer = NULL; + + ply_hashtable_lookup_full (manager->renderers, + (void *) device_path, + (void **) &key, + (void **) &renderer); + + if (renderer == NULL) + return; + + free_displays_for_renderer (manager, renderer); + + ply_hashtable_remove (manager->renderers, (void *) device_path); + free (key); + ply_renderer_free (renderer); +} + +#ifdef HAVE_UDEV static bool drm_device_in_use (ply_device_manager_t *manager, const char *device_path) @@ -199,56 +254,6 @@ create_devices_for_udev_device (ply_device_manager_t *manager, } static void -free_displays_for_renderer (ply_device_manager_t *manager, - ply_renderer_t *renderer) -{ - ply_list_node_t *node; - - node = ply_list_get_first_node (manager->pixel_displays); - while (node != NULL) { - ply_list_node_t *next_node; - ply_pixel_display_t *display; - ply_renderer_t *display_renderer; - - display = ply_list_node_get_data (node); - next_node = ply_list_get_next_node (manager->pixel_displays, node); - display_renderer = ply_pixel_display_get_renderer (display); - - if (display_renderer == renderer) { - if (manager->pixel_display_removed_handler != NULL) - manager->pixel_display_removed_handler (manager->event_handler_data, display); - ply_pixel_display_free (display); - ply_list_remove_node (manager->pixel_displays, node); - - } - - node = next_node; - } -} - -static void -free_devices_from_device_path (ply_device_manager_t *manager, - const char *device_path) -{ - char *key = NULL; - ply_renderer_t *renderer = NULL; - - ply_hashtable_lookup_full (manager->renderers, - (void *) device_path, - (void **) &key, - (void **) &renderer); - - if (renderer == NULL) - return; - - free_displays_for_renderer (manager, renderer); - - ply_hashtable_remove (manager->renderers, (void *) device_path); - free (key); - ply_renderer_free (renderer); -} - -static void free_devices_for_udev_device (ply_device_manager_t *manager, struct udev_device *device) { @@ -386,6 +391,7 @@ watch_for_udev_events (ply_device_manager_t *manager) NULL, manager); } +#endif static void free_terminal (char *device, @@ -477,8 +483,12 @@ ply_device_manager_new (const char *default_tty, manager->pixel_displays = ply_list_new (); manager->flags = flags; +#ifdef HAVE_UDEV if (!(flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV)) manager->udev_context = udev_new (); +#else + manager->flags |= PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV; +#endif attach_to_event_loop (manager, ply_event_loop_get_default ()); @@ -493,10 +503,6 @@ ply_device_manager_free (ply_device_manager_t *manager) if (manager == NULL) return; - ply_event_loop_stop_watching_for_timeout (manager->loop, - (ply_event_loop_timeout_handler_t) - create_devices_from_udev, manager); - ply_event_loop_stop_watching_for_exit (manager->loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, @@ -508,11 +514,17 @@ ply_device_manager_free (ply_device_manager_t *manager) free_renderers (manager); ply_hashtable_free (manager->renderers); +#ifdef HAVE_UDEV + ply_event_loop_stop_watching_for_timeout (manager->loop, + (ply_event_loop_timeout_handler_t) + create_devices_from_udev, manager); + if (manager->udev_monitor != NULL) udev_monitor_unref (manager->udev_monitor); if (manager->udev_context != NULL) udev_unref (manager->udev_context); +#endif free (manager); } @@ -755,6 +767,7 @@ create_devices_from_terminals (ply_device_manager_t *manager) return false; } +#ifdef HAVE_UDEV static void create_devices_from_udev (ply_device_manager_t *manager) { @@ -774,6 +787,7 @@ create_devices_from_udev (ply_device_manager_t *manager) manager->local_console_terminal, PLY_RENDERER_TYPE_NONE); } +#endif static void create_fallback_devices (ply_device_manager_t *manager) @@ -818,12 +832,14 @@ ply_device_manager_watch_devices (ply_device_manager_t *manager, return; } +#ifdef HAVE_UDEV watch_for_udev_events (manager); create_devices_for_subsystem (manager, SUBSYSTEM_DRM); ply_event_loop_watch_for_timeout (manager->loop, device_timeout, (ply_event_loop_timeout_handler_t) create_devices_from_udev, manager); +#endif } bool |