diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index 080226ddb..8a7c59663 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -526,6 +526,18 @@ xrdp_mm_setup_mod2(struct xrdp_mm *self) if (self->mod->mod_connect(self->mod) == 0) { 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 { diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 5a014f883..419ea0bfa 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -447,6 +447,10 @@ struct xrdp_mm struct display_control_monitor_layout_data *resize_data; struct list *resize_queue; 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 diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index ae6efedcd..c93d959d8 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -1673,13 +1673,18 @@ xrdp_wm_key_sync(struct xrdp_wm *self, int device_flags, int key_flags) 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;