@ -39,12 +39,14 @@
# include "ply-hashtable.h"
# include "ply-list.h"
# include "ply-utils.h"
# include <math.h>
# define SUBSYSTEM_DRM "drm"
# define SUBSYSTEM_FRAME_BUFFER "graphics"
# ifdef HAVE_UDEV
static void create_devices_from_udev ( ply_device_manager_t * manager ) ;
static void create_fb_devices_from_udev ( ply_device_manager_t * manager ) ;
# endif
static bool create_devices_for_terminal_and_renderer_type ( ply_device_manager_t * manager ,
@ -84,6 +86,7 @@ struct _ply_device_manager
uint32_t paused : 1 ;
uint32_t device_timeout_elapsed : 1 ;
uint32_t fb_device_timeout_elapsed : 1 ;
uint32_t found_drm_device : 1 ;
uint32_t found_fb_device : 1 ;
} ;
@ -442,7 +445,12 @@ on_udev_event (ply_device_manager_t *manager)
ply_trace ( " ignoring since we're already using text splash for local console " ) ;
else
on_drm_udev_add_or_change ( manager , action , device ) ;
} else {
} else if ( manager - > fb_device_timeout_elapsed & & strcmp ( subsystem , SUBSYSTEM_FRAME_BUFFER ) = = 0 ) {
if ( manager - > local_console_managed & & manager - > local_console_is_text )
ply_trace ( " ignoring since we're already using text splash for local console " ) ;
else
on_drm_udev_add_or_change ( manager , action , device ) ;
} else {
ply_trace ( " ignoring since we only handle subsystem %s devices after timeout " , subsystem ) ;
}
} else if ( strcmp ( action , " remove " ) = = 0 ) {
@ -620,6 +628,9 @@ ply_device_manager_free (ply_device_manager_t *manager)
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_timeout ( manager - > loop ,
( ply_event_loop_timeout_handler_t )
create_fb_devices_from_udev , manager ) ;
if ( manager - > udev_monitor ! = NULL )
udev_monitor_unref ( manager - > udev_monitor ) ;
@ -917,6 +928,22 @@ create_devices_from_udev (ply_device_manager_t *manager)
ply_trace ( " Creating non-graphical devices, since there's no suitable graphics hardware " ) ;
create_non_graphical_devices ( manager ) ;
}
static void
create_fb_devices_from_udev ( ply_device_manager_t * manager )
{
manager - > fb_device_timeout_elapsed = true ;
if ( manager - > paused ) {
ply_trace ( " create_fb_devices_from_udev timeout elapsed while paused, deferring execution " ) ;
return ;
}
ply_trace ( " Timeout elapsed, looking for framebuffer devices from udev " ) ;
create_devices_for_subsystem ( manager , SUBSYSTEM_DRM ) ;
create_devices_for_subsystem ( manager , SUBSYSTEM_FRAME_BUFFER ) ;
}
# endif
static void
@ -930,6 +957,7 @@ create_fallback_devices (ply_device_manager_t *manager)
void
ply_device_manager_watch_devices ( ply_device_manager_t * manager ,
double fb_device_timeout ,
double device_timeout ,
ply_keyboard_added_handler_t keyboard_added_handler ,
ply_keyboard_removed_handler_t keyboard_removed_handler ,
@ -949,6 +977,9 @@ ply_device_manager_watch_devices (ply_device_manager_t *manager,
manager - > text_display_removed_handler = text_display_removed_handler ;
manager - > event_handler_data = data ;
if ( isnan ( fb_device_timeout ) )
fb_device_timeout = 5 ;
/* Try to create devices for each serial device right away, if possible
*/
done_with_initial_devices_setup = create_devices_from_terminals ( manager ) ;
@ -971,6 +1002,10 @@ ply_device_manager_watch_devices (ply_device_manager_t *manager,
# ifdef HAVE_UDEV
watch_for_udev_events ( manager ) ;
create_devices_for_subsystem ( manager , SUBSYSTEM_DRM ) ;
ply_event_loop_watch_for_timeout ( manager - > loop ,
fb_device_timeout ,
( ply_event_loop_timeout_handler_t )
create_fb_devices_from_udev , manager ) ;
ply_event_loop_watch_for_timeout ( manager - > loop ,
device_timeout ,
( ply_event_loop_timeout_handler_t )
@ -1114,6 +1149,10 @@ ply_device_manager_unpause (ply_device_manager_t *manager)
ply_trace ( " ply_device_manager_unpause() called, resuming watching for udev events " ) ;
manager - > paused = false ;
# ifdef HAVE_UDEV
if ( manager - > fb_device_timeout_elapsed ) {
ply_trace ( " ply_device_manager_unpause(): timeout elapsed while paused, looking for udev devices " ) ;
create_fb_devices_from_udev ( manager ) ;
}
if ( manager - > device_timeout_elapsed ) {
ply_trace ( " ply_device_manager_unpause(): timeout elapsed while paused, looking for udev devices " ) ;
create_devices_from_udev ( manager ) ;