The keymap and capslock code in src/plugins/renderers/drm/plugin.c relies
on the terminal passed to backend_create() to get the keymap and current
capslock state (when not using evdev input because of e.g. no XKBLAYOUT
in /etc/vconsole.conf which is the default in at least Fedora).
When 2 GPUs which both have displays attached are used only the first
one gets passed the local_console_terminal as terminal (it is considered
the terminal owner and e.g. listens for keypresses). This leads to keymap
and capslock icons not being shown on displays attached to the second GPU.
To fix this add a second ply_terminal_t argument to backend_create() called
local_console_terminal, which will pass the local_console_terminal to both
drm plugin instances. And modify the drm plugin capslock and keymap code to
use this instead of the normal terminal argument which will be NULL on
the second GPU.
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2375854
Signed-off-by: Hans de Goede <hansg@kernel.org>
bool force = manager->device_timeout_elapsed ||
(manager->flags & PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN);
- renderer = ply_renderer_new (renderer_type, device_path, terminal);
+ renderer = ply_renderer_new (renderer_type, device_path,
+ terminal, manager->local_console_terminal);
if (renderer != NULL && !ply_renderer_open (renderer, force)) {
ply_trace ("could not open renderer for %s", device_path);
typedef struct
{
ply_renderer_backend_t * (*create_backend)(const char *device_name,
- ply_terminal_t *terminal);
+ ply_terminal_t *terminal,
+ ply_terminal_t *local_console_terminal);
void (*destroy_backend)(ply_renderer_backend_t *backend);
bool (*open_device)(ply_renderer_backend_t *backend);
void (*close_device)(ply_renderer_backend_t *backend);
ply_renderer_type_t type;
char *device_name;
ply_terminal_t *terminal;
+ ply_terminal_t *local_console_terminal;
uint32_t input_source_is_open : 1;
uint32_t is_mapped : 1;
ply_renderer_t *
ply_renderer_new (ply_renderer_type_t renderer_type,
const char *device_name,
- ply_terminal_t *terminal)
+ ply_terminal_t *terminal,
+ ply_terminal_t *local_console_terminal)
{
ply_renderer_t *renderer;
renderer->device_name = strdup (device_name);
renderer->terminal = terminal;
+ renderer->local_console_terminal = local_console_terminal;
return renderer;
}
}
renderer->backend = renderer->plugin_interface->create_backend (renderer->device_name,
- renderer->terminal);
+ renderer->terminal,
+ renderer->local_console_terminal);
if (renderer->backend == NULL) {
ply_save_errno ();
#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
ply_renderer_t *ply_renderer_new (ply_renderer_type_t renderer_type,
const char *device_name,
- ply_terminal_t *terminal);
+ ply_terminal_t *terminal,
+ ply_terminal_t *local_console_terminal);
void ply_renderer_free (ply_renderer_t *renderer);
bool ply_renderer_open (ply_renderer_t *renderer,
bool force);
{
ply_event_loop_t *loop;
ply_terminal_t *terminal;
+ ply_terminal_t *local_console_terminal;
int device_fd;
bool simpledrm;
static ply_renderer_backend_t *
create_backend (const char *device_name,
- ply_terminal_t *terminal)
+ ply_terminal_t *terminal,
+ ply_terminal_t *local_console_terminal)
{
ply_renderer_backend_t *backend;
backend->input_source.key_buffer = ply_buffer_new ();
backend->input_source.input_devices = ply_list_new ();
backend->terminal = terminal;
+ backend->local_console_terminal = local_console_terminal;
backend->requires_explicit_flushing = true;
backend->output_buffers = ply_hashtable_new (ply_hashtable_direct_hash,
ply_hashtable_direct_compare);
return ply_input_device_get_capslock_state (dev);
}
- if (!backend->terminal)
+ if (!backend->local_console_terminal)
return false;
- return ply_terminal_get_capslock_state (backend->terminal);
+ return ply_terminal_get_capslock_state (backend->local_console_terminal);
}
static const char *
return keymap;
}
}
- if (!backend->terminal)
+ if (!backend->local_console_terminal)
return NULL;
- return ply_terminal_get_keymap (backend->terminal);
+ return ply_terminal_get_keymap (backend->local_console_terminal);
}
static void
static ply_renderer_backend_t *
create_backend (const char *device_name,
- ply_terminal_t *terminal)
+ ply_terminal_t *terminal,
+ ply_terminal_t *local_console_terminal)
{
ply_renderer_backend_t *backend;
static ply_renderer_backend_t *
create_backend (const char *device_name,
- ply_terminal_t *terminal)
+ ply_terminal_t *terminal,
+ ply_terminal_t *local_console_terminal)
{
ply_renderer_backend_t *backend;