if (renderer_type != PLY_RENDERER_TYPE_NONE) {
ply_renderer_t *old_renderer = NULL;
+ bool force = manager->device_timeout_elapsed ||
+ (manager->flags & PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN);
+
renderer = ply_renderer_new (renderer_type, device_path, terminal);
- if (renderer != NULL && !ply_renderer_open (renderer)) {
+ if (renderer != NULL && !ply_renderer_open (renderer, force)) {
ply_trace ("could not open renderer for %s", device_path);
ply_renderer_free (renderer);
renderer = NULL;
PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS = 1 << 2,
PLY_DEVICE_MANAGER_FLAGS_FORCE_FRAME_BUFFER = 1 << 3,
PLY_DEVICE_MANAGER_FLAGS_USE_SIMPLEDRM = 1 << 4,
+ PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN = 1 << 5,
} ply_device_manager_flags_t;
typedef struct _ply_device_manager ply_device_manager_t;
void (*destroy_backend)(ply_renderer_backend_t *backend);
bool (*open_device)(ply_renderer_backend_t *backend);
void (*close_device)(ply_renderer_backend_t *backend);
- bool (*query_device)(ply_renderer_backend_t *backend);
+ bool (*query_device)(ply_renderer_backend_t *backend,
+ bool force);
bool (*handle_change_event)(ply_renderer_backend_t *backend);
bool (*map_to_device)(ply_renderer_backend_t *backend);
void (*unmap_from_device)(ply_renderer_backend_t *backend);
}
static bool
-ply_renderer_query_device (ply_renderer_t *renderer)
+ply_renderer_query_device (ply_renderer_t *renderer,
+ bool force)
{
assert (renderer != NULL);
assert (renderer->plugin_interface != NULL);
- return renderer->plugin_interface->query_device (renderer->backend);
+ return renderer->plugin_interface->query_device (renderer->backend, force);
}
static bool
static bool
ply_renderer_open_plugin (ply_renderer_t *renderer,
- const char *plugin_path)
+ const char *plugin_path,
+ bool force)
{
ply_trace ("trying to open renderer plugin %s", plugin_path);
return false;
}
- if (!ply_renderer_query_device (renderer)) {
+ if (!ply_renderer_query_device (renderer, force)) {
ply_trace ("could not query rendering device for plugin %s",
plugin_path);
ply_renderer_close_device (renderer);
}
bool
-ply_renderer_open (ply_renderer_t *renderer)
+ply_renderer_open (ply_renderer_t *renderer,
+ bool force)
{
int i;
for (i = 0; known_plugins[i].type != PLY_RENDERER_TYPE_NONE; i++) {
if (renderer->type == known_plugins[i].type ||
renderer->type == PLY_RENDERER_TYPE_AUTO) {
- if (ply_renderer_open_plugin (renderer, known_plugins[i].path)) {
+ if (ply_renderer_open_plugin (renderer, known_plugins[i].path, force)) {
renderer->is_active = true;
goto out;
}
const char *device_name,
ply_terminal_t *terminal);
void ply_renderer_free (ply_renderer_t *renderer);
-bool ply_renderer_open (ply_renderer_t *renderer);
+bool ply_renderer_open (ply_renderer_t *renderer,
+ bool force);
void ply_renderer_close (ply_renderer_t *renderer);
/* Returns true when the heads have changed as a result of the change event */
bool ply_renderer_handle_change_event (ply_renderer_t *renderer);
if (ply_kernel_command_line_has_argument ("plymouth.use-simpledrm"))
state->use_simpledrm = 1;
else if (ply_kernel_command_line_has_argument ("nomodeset"))
- state->use_simpledrm = 1;
+ state->use_simpledrm = 2;
}
}
if (state.use_simpledrm >= 1)
device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_USE_SIMPLEDRM;
+ if (state.use_simpledrm >= 2)
+ device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN;
+
load_devices (&state, device_manager_flags);
ply_trace ("entering event loop");
}
static bool
-query_device (ply_renderer_backend_t *backend)
+query_device (ply_renderer_backend_t *backend,
+ bool force)
{
bool ret = true;
}
static bool
-query_device (ply_renderer_backend_t *backend)
+query_device (ply_renderer_backend_t *backend,
+ bool force)
{
struct fb_var_screeninfo variable_screen_info;
struct fb_fix_screeninfo fixed_screen_info;
}
static bool
-query_device (ply_renderer_backend_t *backend)
+query_device (ply_renderer_backend_t *backend,
+ bool force)
{
assert (backend != NULL);