From 5f2d4da4ea132aef9e8942ad0c29eda56cf0c12c Mon Sep 17 00:00:00 2001 From: stefan11111 Date: Sun, 6 Jul 2025 01:08:10 +0300 Subject: [PATCH] kdrive: add some new functions Add definitions for the forward declarations from the previous commit In preparation for adding the Xfbdev X11 kdrive server Signed-off-by: stefan11111 --- hw/kdrive/src/kdrive.c | 72 +++++++++++++++++++++++++++++++++++++++++- hw/kdrive/src/kdrive.h | 6 ++++ hw/kdrive/src/kinput.c | 45 ++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c index 92801c188..7ca139a3e 100644 --- a/hw/kdrive/src/kdrive.c +++ b/hw/kdrive/src/kdrive.c @@ -184,9 +184,65 @@ KdEnableScreen(ScreenPtr pScreen) } void -ddxGiveUp(enum ExitCode error) +KdResume(void) +{ + KdCardInfo *card; + KdScreenInfo *screen; + + if (kdEnabled) { + KdDoSwitchCmd("resume"); + for (card = kdCardInfo; card; card = card->next) { + if (card->cfuncs->preserve) + (*card->cfuncs->preserve) (card); + for (screen = card->screenList; screen; screen = screen->next) + if (screen->mynum == card->selected && screen->pScreen) + KdEnableScreen(screen->pScreen); + } + KdEnableInput(); + KdReleaseAllKeys(); + } +} + +void +KdEnableScreens(void) +{ + if (!kdEnabled) { + kdEnabled = TRUE; + if (kdOsFuncs->Enable) + (*kdOsFuncs->Enable) (); + } + KdResume(); +} + +void +KdProcessSwitch(void) +{ + if (kdEnabled) + KdDisableScreens(); + else + KdEnableScreens(); +} + +static void +AbortDDX(enum ExitCode error) { KdDisableScreens(); + if (kdOsFuncs) { + if (kdEnabled && kdOsFuncs->Disable) + (*kdOsFuncs->Disable) (); + if (kdOsFuncs->Fini) + (*kdOsFuncs->Fini) (); + KdDoSwitchCmd("stop"); + } + + if (kdCaughtSignal) + OsAbort(); +} + +void +ddxGiveUp(enum ExitCode error) +{ + AbortDDX(error); } Bool kdDumbDriver; @@ -939,6 +995,20 @@ KdAddScreen(ScreenInfo * pScreenInfo, AddScreen(KdScreenInit, argc, argv); } +#if 0 /* This function is not used currently */ + +int +KdDepthToFb(ScreenPtr pScreen, int depth) +{ + KdScreenPriv(pScreen); + + for (fb = 0; fb <= KD_MAX_FB && pScreenPriv->screen->fb.frameBuffer; fb++) + if (pScreenPriv->screen->fb.depth == depth) + return fb; +} + +#endif + void KdInitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) { diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h index 2af6bf2d1..d9d4e5f58 100644 --- a/hw/kdrive/src/kdrive.h +++ b/hw/kdrive/src/kdrive.h @@ -399,6 +399,8 @@ Bool void KdEnableScreens(void); +void KdResume(void); + void KdProcessSwitch(void); @@ -501,6 +503,8 @@ KdEnqueuePointerEvent(KdPointerInfo * pi, unsigned long flags, int rx, int ry, void _KdEnqueuePointerEvent(KdPointerInfo * pi, int type, int x, int y, int z, int b, int absrel, Bool force); +void KdReleaseAllKeys(void); + void KdSetLed(KdKeyboardInfo * ki, int led, Bool on); void @@ -510,6 +514,8 @@ void KdComputePointerMatrix(KdPointerMatrix *pointer, Rotation randr, int width, int height); +void KdScreenToPointerCoords(int *x, int *y); + void KdBlockHandler(ScreenPtr pScreen, void *timeout); diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index 85620afa1..2cba7475a 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -154,6 +154,7 @@ static void KdAddFd(int fd, int i) KdNonBlockFd(fd); InputThreadRegisterDev(fd, KdNotifyFd, (void *) (intptr_t) i); #ifdef KDRIVE_KBD +/* AddEnabledDevice(fd); */ memset(&act, '\0', sizeof act); act.sa_handler = KdSigio; @@ -592,6 +593,20 @@ KdComputePointerMatrix(KdPointerMatrix * m, Rotation randr, int width, } } +void +KdScreenToPointerCoords(int *x, int *y) +{ + int (*m)[3] = kdPointerMatrix.matrix; + int div = m[0][1] * m[1][0] - m[1][1] * m[0][0]; + int sx = *x; + int sy = *y; + + *x = (m[0][1] * sy - m[0][1] * m[1][2] + m[1][1] * m[0][2] - + m[1][1] * sx) / div; + *y = (m[1][0] * sx + m[0][0] * m[1][2] - m[1][0] * m[0][2] - + m[0][0] * sy) / div; +} + static void KdKbdCtrl(DeviceIntPtr pDevice, KeybdCtrl * ctrl) { @@ -1740,6 +1755,36 @@ KdReceiveTimeout(KdPointerInfo * pi) KdRunMouseMachine(pi, timeout, 0, 0, 0, 0, 0, 0); } +void +KdReleaseAllKeys(void) +{ +#if 0 + int key; + KdKeyboardInfo *ki; + +#ifndef KDRIVE_KBD + input_lock(); +#else + KdBlockSigio(); +#endif + + for (ki = kdKeyboards; ki; ki = ki->next) { + for (key = ki->keySyms.minKeyCode; key < ki->keySyms.maxKeyCode; key++) { + if (key_is_down(ki->dixdev, key, KEY_POSTED | KEY_PROCESSED)) { + KdHandleKeyboardEvent(ki, KeyRelease, key); + QueueGetKeyboardEvents(ki->dixdev, KeyRelease, key, NULL); + } + } + } + +#ifndef KDRIVE_KBD + input_unlock(); +#else + KdUnblockSigio(); +#endif +#endif +} + static void KdCheckLock(void) {