A VT client is one that needs to be put to sleep when we don't own the VT, and woken up when we regain it.
Signed-off-by: Adam Jackson <[email protected]> --- hw/xfree86/common/xf86.h | 3 +++ hw/xfree86/common/xf86Events.c | 55 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h index 674e83cb1..3b66d20ff 100644 --- a/hw/xfree86/common/xf86.h +++ b/hw/xfree86/common/xf86.h @@ -222,6 +222,9 @@ extern _X_EXPORT void xf86PrintBacktrace(void); extern _X_EXPORT Bool xf86VTOwner(void); extern _X_EXPORT void xf86VTLeave(void); extern _X_EXPORT void xf86VTEnter(void); +extern _X_EXPORT Bool xf86SetupVTClients(void); +extern _X_EXPORT void xf86SetVTClient(ClientPtr client); +extern _X_EXPORT int xf86SetAndSleepVTClient(ClientPtr client); extern _X_EXPORT void xf86EnableInputDeviceForVTSwitch(InputInfoPtr pInfo); extern _X_EXPORT void xf86DisableInputDeviceForVTSwitch(InputInfoPtr pInfo); diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c index 53ec74f26..76fb6192c 100644 --- a/hw/xfree86/common/xf86Events.c +++ b/hw/xfree86/common/xf86Events.c @@ -393,6 +393,59 @@ xf86UpdateHasVTProperty(Bool hasVT) } } +static DevPrivateKeyRec VTClientPrivateKey; + +static int * +clientVTSleep(ClientPtr client) +{ + return dixGetPrivateAddr(&client->devPrivates, &VTClientPrivateKey); +} + +Bool +xf86SetupVTClients(void) +{ + return dixRegisterPrivateKey(&VTClientPrivateKey, PRIVATE_CLIENT, + sizeof(int)); +} + +static void +xf86SleepVTClients(void) +{ + for (int i = 1; i < currentMaxClients; i++) { + ClientPtr client = clients[i]; + + if (*clientVTSleep(client)) + IgnoreClient(client); + } +} + +static void +xf86WakeVTClients(void) +{ + for (int i = 1; i < currentMaxClients; i++) { + ClientPtr client = clients[i]; + + if (*clientVTSleep(client)) + AttendClient(client); + } +} + +void +xf86SetVTClient(ClientPtr client) +{ + *clientVTSleep(client) = TRUE; +} + +int +xf86SetAndSleepVTClient(ClientPtr client) +{ + xf86SetVTClient(client); + ResetCurrentRequest(client); + client->sequence--; + IgnoreClient(client); + return Success; +} + void xf86VTLeave(void) { @@ -451,6 +504,7 @@ xf86VTLeave(void) xf86DisableIO(); xf86UpdateHasVTProperty(FALSE); + xf86SleepVTClients(); return; @@ -535,6 +589,7 @@ xf86VTEnter(void) xf86platformVTProbe(); #endif + xf86WakeVTClients(); xf86UpdateHasVTProperty(TRUE); input_unlock(); -- 2.13.0 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
