mirror of https://github.com/neutrinolabs/xrdp
Store TS_SYNC_EVENT before module load
When a connection is made to a system with the client numlock pressed, a TS_SYNC_EVENT is sent before the module is loaded. This TS_SYNC_EVENT correctly contains the NumLock status as 'pressed'. The event is, however, discarded as the module isn't loaded. When the module is loaded, a TS_SYNC_EVENT is not sent again unless client focus is removed from the xrdp window and re-applied. As a result, the NumLock state is incorrect unless this is done. This commit stores the last TS_SYNC_EVENT sent before a module is loaded. When the module is loaded, the sync state can be correctly communicated to the module.
This commit is contained in:
parent
ba1d93930a
commit
3f568b42fb
|
@ -526,6 +526,18 @@ xrdp_mm_setup_mod2(struct xrdp_mm *self)
|
||||||
if (self->mod->mod_connect(self->mod) == 0)
|
if (self->mod->mod_connect(self->mod) == 0)
|
||||||
{
|
{
|
||||||
rv = 0; /* connect success */
|
rv = 0; /* connect success */
|
||||||
|
|
||||||
|
// If we've received a recent TS_SYNC_EVENT, pass it on to
|
||||||
|
// the module so (e.g.) NumLock starts in the right state.
|
||||||
|
if (self->last_sync_saved)
|
||||||
|
{
|
||||||
|
int key_flags = self->last_sync_key_flags;
|
||||||
|
int device_flags = self->last_sync_device_flags;
|
||||||
|
self->last_sync_saved = 0;
|
||||||
|
self->mod->mod_event(self->mod, WM_KEYBRD_SYNC, key_flags,
|
||||||
|
device_flags, key_flags, device_flags);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -447,6 +447,10 @@ struct xrdp_mm
|
||||||
struct display_control_monitor_layout_data *resize_data;
|
struct display_control_monitor_layout_data *resize_data;
|
||||||
struct list *resize_queue;
|
struct list *resize_queue;
|
||||||
tbus resize_ready;
|
tbus resize_ready;
|
||||||
|
/* Last sync event if a module isn't loaded */
|
||||||
|
int last_sync_saved;
|
||||||
|
int last_sync_key_flags;
|
||||||
|
int last_sync_device_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct xrdp_key_info
|
struct xrdp_key_info
|
||||||
|
|
|
@ -1673,13 +1673,18 @@ xrdp_wm_key_sync(struct xrdp_wm *self, int device_flags, int key_flags)
|
||||||
self->caps_lock = 1;
|
self->caps_lock = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->mm->mod != 0)
|
if (self->mm->mod != 0 && self->mm->mod->mod_event != 0)
|
||||||
{
|
{
|
||||||
if (self->mm->mod->mod_event != 0)
|
self->mm->mod->mod_event(self->mm->mod, WM_KEYBRD_SYNC, key_flags,
|
||||||
{
|
device_flags, key_flags, device_flags);
|
||||||
self->mm->mod->mod_event(self->mm->mod, WM_KEYBRD_SYNC, key_flags,
|
}
|
||||||
device_flags, key_flags, device_flags);
|
else
|
||||||
}
|
{
|
||||||
|
// Save the event for when the module is loaded
|
||||||
|
self->mm->last_sync_saved = 1;
|
||||||
|
self->mm->last_sync_key_flags = key_flags;
|
||||||
|
self->mm->last_sync_device_flags = device_flags;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue