From 40cd37aa825ac9c091a447d46b34034cdec155d6 Mon Sep 17 00:00:00 2001 From: kohnish Date: Thu, 13 Nov 2025 17:38:08 +0100 Subject: [PATCH 1/2] Add support for libvnc.so from tigervnc * A lot of public api has been converted to private caused tigervnc to not even initialise. Expose necessary interfaces again. --- Xext/namespace/hook-init-rootwindow.c | 2 +- Xext/saver.c | 2 +- Xext/xace.h | 2 +- composite/compoverlay.c | 2 +- dix/callback_priv.h | 1 + dix/dispatch.c | 4 ++-- dix/display.c | 3 ++- dix/dix_priv.h | 1 - dix/main.c | 2 +- dix/property_priv.h | 3 --- dix/selection_priv.h | 13 ++----------- dix/window.c | 4 ++-- include/callback.h | 7 ++++++- include/opaque.h | 3 +++ include/property.h | 3 +++ include/window.h | 21 +++++++++++++++++++++ include/xkbsrv.h | 20 ++++++++++++++++++++ mi/mi.h | 13 +++++++++++++ mi/mi_priv.h | 10 ---------- os/connection.c | 2 ++ os/xdmcp.c | 2 +- xkb/xkbsrv_priv.h | 5 ----- 22 files changed, 83 insertions(+), 42 deletions(-) diff --git a/Xext/namespace/hook-init-rootwindow.c b/Xext/namespace/hook-init-rootwindow.c index 0bececddb0..b7b92a3aaa 100644 --- a/Xext/namespace/hook-init-rootwindow.c +++ b/Xext/namespace/hook-init-rootwindow.c @@ -40,7 +40,7 @@ void hookInitRootWindow(CallbackListPtr *pcbl, void *data, void *screen) } int rc = 0; - WindowPtr pWin = dixCreateWindow( + WindowPtr pWin = CreateWindow( FakeClientID(0), realRoot, 0, 0, 23, 23, 0, /* bw */ InputOutput, diff --git a/Xext/saver.c b/Xext/saver.c index 63a57b8382..9abc62fade 100644 --- a/Xext/saver.c +++ b/Xext/saver.c @@ -471,7 +471,7 @@ CreateSaverWindow(ScreenPtr pScreen) if (GrabInProgress && GrabInProgress != pAttr->client->index) return FALSE; - pWin = dixCreateWindow(pSaver->wid, pScreen->root, + pWin = CreateWindow(pSaver->wid, pScreen->root, pAttr->x, pAttr->y, pAttr->width, pAttr->height, pAttr->borderWidth, pAttr->class, pAttr->mask, (XID *) pAttr->values, diff --git a/Xext/xace.h b/Xext/xace.h index c9951f2c9f..5db3686f45 100644 --- a/Xext/xace.h +++ b/Xext/xace.h @@ -60,7 +60,7 @@ int XaceHookIsSet(int hook); */ int XaceHookPropertyAccess(ClientPtr ptr, WindowPtr pWin, PropertyPtr *ppProp, Mask access_mode); -int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel, Mask access_mode); +_X_EXPORT int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel, Mask access_mode); /* needs to be exported for in-tree modesetting, but not part of public API */ _X_EXPORT int XaceHookResourceAccess(ClientPtr client, XID id, RESTYPE rtype, void *res, diff --git a/composite/compoverlay.c b/composite/compoverlay.c index edc5ae2c27..144bcd4d03 100644 --- a/composite/compoverlay.c +++ b/composite/compoverlay.c @@ -142,7 +142,7 @@ compCreateOverlayWindow(ScreenPtr pScreen) #endif /* XINERAMA */ pWin = cs->pOverlayWin = - dixCreateWindow(cs->overlayWid, pRoot, x, y, w, h, 0, + CreateWindow(cs->overlayWid, pRoot, x, y, w, h, 0, InputOutput, CWBackPixmap | CWOverrideRedirect, &attrs[0], pRoot->drawable.depth, serverClient, pScreen->rootVisual, &result); diff --git a/dix/callback_priv.h b/dix/callback_priv.h index 64c4fbcce6..4fa04f30f3 100644 --- a/dix/callback_priv.h +++ b/dix/callback_priv.h @@ -6,6 +6,7 @@ #define _XSERVER_CALLBACK_PRIV_H #include "callback.h" +#include void InitCallbackManager(void); void DeleteCallbackManager(void); diff --git a/dix/dispatch.c b/dix/dispatch.c index 0f776678e1..e673b8b3ad 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -144,6 +144,7 @@ Equipment Corporation. #include "xkbsrv.h" #include "xfixesint.h" #include "dixstruct_priv.h" +#include #define mskcnt ((MAXCLIENTS + 31) / 32) #define BITMASK(i) (1U << ((i) & 31)) @@ -745,7 +746,7 @@ int DoCreateWindowReq(ClientPtr client, xCreateWindowReq *stuff, XID *xids) client->errorValue = 0; return BadValue; } - pWin = dixCreateWindow(stuff->wid, pParent, stuff->x, + pWin = CreateWindow(stuff->wid, pParent, stuff->x, stuff->y, stuff->width, stuff->height, stuff->borderWidth, stuff->class, stuff->mask, (XID *) xids, @@ -4257,4 +4258,3 @@ DetachOffloadGPU(ScreenPtr secondary) assert(secondary->is_offload_secondary); secondary->is_offload_secondary = FALSE; } - diff --git a/dix/display.c b/dix/display.c index 5e8cf7bc5e..61b10667bf 100644 --- a/dix/display.c +++ b/dix/display.c @@ -7,8 +7,9 @@ #include "dix/dix_priv.h" #include "include/dix.h" #include "include/screenint.h" +#include -const char *display = "0"; +char *display = (char *)"0"; int displayfd = -1; const char *dixGetDisplayName(ScreenPtr *pScreen) diff --git a/dix/dix_priv.h b/dix/dix_priv.h index 19deb74c48..ef49213f55 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -292,7 +292,6 @@ extern int ScreenSaverBlanking; extern int ScreenSaverAllowExposures; extern int defaultScreenSaverBlanking; extern int defaultScreenSaverAllowExposures; -extern const char *display; extern int displayfd; extern Bool explicit_display; diff --git a/dix/main.c b/dix/main.c index ee3fccab53..74af117c6f 100644 --- a/dix/main.c +++ b/dix/main.c @@ -135,7 +135,7 @@ dix_main(int argc, char *argv[], char *envp[]) { HWEventQueueType alwaysCheckForInput[2]; - display = "0"; + display = (char *)"0"; InitRegions(); diff --git a/dix/property_priv.h b/dix/property_priv.h index 4fc776914c..10790349ca 100644 --- a/dix/property_priv.h +++ b/dix/property_priv.h @@ -94,9 +94,6 @@ typedef struct _PropertyFilterParam { extern CallbackListPtr PropertyFilterCallback; -int dixLookupProperty(PropertyPtr *result, WindowPtr pWin, Atom proprty, - ClientPtr pClient, Mask access_mode); - void DeleteAllWindowProperties(WindowPtr pWin); #endif /* _XSERVER_PROPERTY_PRIV_H */ diff --git a/dix/selection_priv.h b/dix/selection_priv.h index 24492d9cab..23707ab5ae 100644 --- a/dix/selection_priv.h +++ b/dix/selection_priv.h @@ -12,7 +12,7 @@ #include "include/dixstruct.h" #include "include/privates.h" -typedef struct _Selection { +struct _Selection { Atom selection; TimeStamp lastTimeChanged; Window window; @@ -20,7 +20,7 @@ typedef struct _Selection { ClientPtr client; struct _Selection *next; PrivateRec *devPrivates; -} Selection; +}; typedef enum { SelectionSetOwner, @@ -56,18 +56,9 @@ typedef struct { Atom target; } SelectionFilterParamRec, *SelectionFilterParamPtr; -extern Selection *CurrentSelections; - -extern CallbackListPtr SelectionCallback; extern CallbackListPtr SelectionFilterCallback; -int dixLookupSelection(Selection **result, - Atom name, - ClientPtr client, - Mask access_mode); - void InitSelections(void); -void DeleteWindowFromAnySelections(WindowPtr pWin); void DeleteClientFromAnySelections(ClientPtr client); #endif /* _XSERVER_DIX_SELECTION_PRIV_H */ diff --git a/dix/window.c b/dix/window.c index a2431c5380..8d49ff8a80 100644 --- a/dix/window.c +++ b/dix/window.c @@ -736,7 +736,7 @@ RealChildHead(WindowPtr pWin) } WindowPtr -dixCreateWindow(Window wid, WindowPtr pParent, int x, int y, unsigned w, +CreateWindow(Window wid, WindowPtr pParent, int x, int y, unsigned w, unsigned h, unsigned bw, unsigned class, Mask vmask, XID *vlist, int depth, ClientPtr client, VisualID visual, int *error) { @@ -3255,7 +3255,7 @@ TileScreenSaver(ScreenPtr pScreen, int kind) } pWin = pScreen->screensaver.pWindow = - dixCreateWindow(pScreen->screensaver.wid, + CreateWindow(pScreen->screensaver.wid, pScreen->root, -RANDOM_WIDTH, -RANDOM_WIDTH, (unsigned short) pScreen->width + RANDOM_WIDTH, diff --git a/include/callback.h b/include/callback.h index 7b78deba4e..431a3db38a 100644 --- a/include/callback.h +++ b/include/callback.h @@ -51,12 +51,12 @@ SOFTWARE. #include /* for Bool */ #include #include - /* * callback manager stuff */ typedef struct _CallbackList *CallbackListPtr; +typedef struct _Selection Selection; typedef void (*CallbackProcPtr) (CallbackListPtr *, void *, void *); @@ -79,4 +79,9 @@ CallCallbacks(CallbackListPtr *pcbl, void *call_data) _CallCallbacks(pcbl, call_data); } +extern _X_EXPORT CallbackListPtr SelectionCallback; +extern _X_EXPORT Selection *CurrentSelections; +_X_EXPORT int dixLookupSelection(Selection ** result, Atom name, + ClientPtr client, Mask access_mode); + #endif /* CALLBACK_H */ diff --git a/include/opaque.h b/include/opaque.h index 7850792e88..4cbc600ace 100644 --- a/include/opaque.h +++ b/include/opaque.h @@ -37,4 +37,7 @@ from The Open Group. extern _X_EXPORT Bool enableIndirectGLX; extern _X_EXPORT Bool bgNoneRoot; +// needed by libvnc.so from tigervnc +extern _X_EXPORT char *display; + #endif /* OPAQUE_H */ diff --git a/include/property.h b/include/property.h index 6c879e6d9b..98132f3f0b 100644 --- a/include/property.h +++ b/include/property.h @@ -65,4 +65,7 @@ extern _X_EXPORT int DeleteProperty(ClientPtr /*client */ , WindowPtr /*pWin */ , Atom /*propName */ ); +_X_EXPORT int dixLookupProperty(PropertyPtr *result, WindowPtr pWin, Atom proprty, + ClientPtr pClient, Mask access_mode); + #endif /* PROPERTY_H */ diff --git a/include/window.h b/include/window.h index dffefbdcd2..6268794d31 100644 --- a/include/window.h +++ b/include/window.h @@ -215,4 +215,25 @@ extern _X_EXPORT void PrintWindowTree(void); extern _X_EXPORT void PrintPassiveGrabs(void); extern _X_EXPORT VisualPtr WindowGetVisual(WindowPtr /*pWin*/); + +extern _X_EXPORT WindowPtr CreateWindow(Window /*wid */ , + WindowPtr /*pParent */ , + int /*x */ , + int /*y */ , + unsigned int /*w */ , + unsigned int /*h */ , + unsigned int /*bw */ , + unsigned int /*class */ , + Mask /*vmask */ , + XID * /*vlist */ , + int /*depth */ , + ClientPtr /*client */ , + VisualID /*visual */ , + int * /*error */ ); + + +_X_EXPORT void DeleteWindowFromAnySelections(WindowPtr pWin); + +#define disCreateWindow CreateWindow + #endif /* WINDOW_H */ diff --git a/include/xkbsrv.h b/include/xkbsrv.h index b06f57beff..6f08118652 100644 --- a/include/xkbsrv.h +++ b/include/xkbsrv.h @@ -37,6 +37,9 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "inputstr.h" #include "events.h" + +#define XkbChangeTypesOfKey SrvXkbChangeTypesOfKey + typedef struct _XkbInterest { DeviceIntPtr dev; ClientPtr client; @@ -228,6 +231,23 @@ extern _X_EXPORT void XkbFreeRMLVOSet(XkbRMLVOSet * /* rmlvo */ , extern _X_EXPORT Bool XkbCopyDeviceKeymap(DeviceIntPtr /* dst */, DeviceIntPtr /* src */); +extern _X_EXPORT void XkbConvertCase(KeySym /* sym */ , + KeySym * /* lower */ , + KeySym * /* upper */ + ); + + +extern _X_EXPORT Status SrvXkbChangeTypesOfKey(XkbDescPtr /* xkb */ , + int /* key */ , + int /* nGroups */ , + unsigned int /* groups */ , + int * /* newTypesIn */ , + XkbMapChangesPtr /* changes */ + ); + +void _X_EXPORT XkbSendNotification(DeviceIntPtr kbd, XkbChangesPtr pChanges, + XkbEventCausePtr cause); + #include "xkbstr.h" #include "xkbrules.h" diff --git a/mi/mi.h b/mi/mi.h index 0adb915cd2..5abdf95a23 100644 --- a/mi/mi.h +++ b/mi/mi.h @@ -51,6 +51,7 @@ SOFTWARE. #include "validate.h" #include "window.h" #include "gc.h" +#include #include #include "input.h" #include "cursor.h" @@ -308,4 +309,16 @@ extern _X_EXPORT void miPolyFillArc(DrawablePtr /*pDraw */ , xArc * /*parcs */ ); + +/** + * Custom input event handler. If you need to process input events in some + * other way than the default path, register an input event handler for the + * given internal event type. + */ +typedef void (*mieqHandler) (int screen, InternalEvent *event, + DeviceIntPtr dev); + +void _X_EXPORT mieqSetHandler(int event, mieqHandler handler); +void _X_EXPORT mieqProcessInputEvents(void); + #endif /* MI_H */ diff --git a/mi/mi_priv.h b/mi/mi_priv.h index ba52f03403..6ac4644675 100644 --- a/mi/mi_priv.h +++ b/mi/mi_priv.h @@ -41,19 +41,9 @@ void mieqFini(void); void mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e); void mieqSwitchScreen(DeviceIntPtr pDev, ScreenPtr pScreen, Bool set_dequeue_screen); void mieqProcessDeviceEvent(DeviceIntPtr dev, InternalEvent *event, ScreenPtr screen); -void mieqProcessInputEvents(void); void mieqAddCallbackOnDrained(CallbackProcPtr callback, void *param); void mieqRemoveCallbackOnDrained(CallbackProcPtr callback, void *param); -/** - * Custom input event handler. If you need to process input events in some - * other way than the default path, register an input event handler for the - * given internal event type. - */ -typedef void (*mieqHandler) (int screen, InternalEvent *event, - DeviceIntPtr dev); -void mieqSetHandler(int event, mieqHandler handler); - void miSendExposures(WindowPtr pWin, RegionPtr pRgn, int dx, int dy); _X_EXPORT /* used by in-tree libwfb.so module */ diff --git a/os/connection.c b/os/connection.c index fa5b543403..113a1a517d 100644 --- a/os/connection.c +++ b/os/connection.c @@ -105,6 +105,8 @@ SOFTWARE. #include "globals.h" #include "xace.h" +#include + #ifdef HAVE_GETPEERUCRED #include #include diff --git a/os/xdmcp.c b/os/xdmcp.c index 584e261193..31cb8bb939 100644 --- a/os/xdmcp.c +++ b/os/xdmcp.c @@ -47,7 +47,7 @@ #include "dixstruct.h" #include "os/Xtrans.h" - +#include #ifdef XDMCP #undef REQUEST diff --git a/xkb/xkbsrv_priv.h b/xkb/xkbsrv_priv.h index 894f27eb28..be18d3cc4a 100644 --- a/xkb/xkbsrv_priv.h +++ b/xkb/xkbsrv_priv.h @@ -165,11 +165,8 @@ Bool XkbEnableDisableControls(XkbSrvInfoPtr xkbi, unsigned long change, XkbEventCausePtr cause); void XkbDisableComputedAutoRepeats(DeviceIntPtr pXDev, unsigned int key); XkbGeometryPtr XkbLookupNamedGeometry(DeviceIntPtr dev, Atom name, Bool *shouldFree); -void XkbConvertCase(KeySym sym, KeySym *lower, KeySym *upper); int XkbChangeKeycodeRange(XkbDescPtr xkb, int minKC, int maxKC, XkbChangesPtr changes); void XkbFreeInfo(XkbSrvInfoPtr xkbi); -int XkbChangeTypesOfKey(XkbDescPtr xkb, int key, int nGroups, unsigned int groups, - int *newTypesIn, XkbMapChangesPtr changes); int XkbKeyTypesForCoreSymbols(XkbDescPtr xkb, int map_width, KeySym *core_syms, unsigned int protected, int *types_inout, KeySym *xkb_syms_rtrn); @@ -236,8 +233,6 @@ void XkbSendNamesNotify(DeviceIntPtr kbd, xkbNamesNotify *ev); void XkbSendActionMessage(DeviceIntPtr kbd, xkbActionMessage *ev); void XkbSendExtensionDeviceNotify(DeviceIntPtr kbd, ClientPtr client, xkbExtensionDeviceNotify *ev); -void XkbSendNotification(DeviceIntPtr kbd, XkbChangesPtr pChanges, - XkbEventCausePtr cause); void XkbSendNewKeyboardNotify(DeviceIntPtr kbd, xkbNewKeyboardNotify *pNKN); /* device lookup */ From 1ddb16e074116f285b67e727363f118069752565 Mon Sep 17 00:00:00 2001 From: kohnish Date: Sun, 16 Nov 2025 16:33:24 +0100 Subject: [PATCH 2/2] Also fix compile time issues on xvnc in tigervnc --- Xext/sync.c | 1 + dix/dispatch.c | 2 ++ dix/dix_priv.h | 11 ----------- dix/inpututils_priv.h | 8 -------- dix/main.c | 4 ++-- dix/screenint_priv.h | 5 ----- hw/kdrive/ephyr/ephyrinit.c | 9 ++++++++- hw/kdrive/ephyr/meson.build | 1 - hw/kdrive/fbdev/fbinit.c | 2 +- hw/kdrive/fbdev/meson.build | 1 - hw/stubs/ddxBeforeReset.c | 12 ------------ hw/vfb/InitOutput.c | 10 +++++++++- hw/vfb/meson.build | 1 - hw/xfree86/common/meson.build | 1 - hw/xfree86/common/xf86Init.c | 9 ++++++++- hw/xnest/Init.c | 10 +++++++++- hw/xnest/meson.build | 1 - hw/xquartz/darwin.c | 2 +- hw/xquartz/meson.build | 1 - hw/xwin/InitOutput.c | 5 ++++- include/dix.h | 6 +++++- include/input.h | 8 ++++++++ include/inpututils.h | 0 include/meson.build | 1 + include/opaque.h | 7 +++++++ include/os.h | 34 ++++++++++++++++++++++++++++++++++ include/scrnintstr.h | 5 +++++ include/selection.h | 0 include/xkbsrv.h | 10 ++++++++++ mi/mi.h | 1 + mi/mi_priv.h | 1 - mi/mipointer.h | 6 ++++++ mi/mipointer_priv.h | 1 - os/cmdline.h | 7 ------- os/ddx_priv.h | 13 ------------- os/log.c | 18 ++++++++++++++++++ os/osdep.h | 7 ------- xkb/xkbsrv_priv.h | 8 +------- 38 files changed, 141 insertions(+), 88 deletions(-) delete mode 100644 hw/stubs/ddxBeforeReset.c create mode 100644 include/inpututils.h create mode 100644 include/selection.h diff --git a/Xext/sync.c b/Xext/sync.c index 8545feb09a..3eb65f97c6 100644 --- a/Xext/sync.c +++ b/Xext/sync.c @@ -76,6 +76,7 @@ PERFORMANCE OF THIS SOFTWARE. #include "protocol-versions.h" #include "inputstr.h" #include "misync_priv.h" +#include "opaque.h" /* * Local Global Variables diff --git a/dix/dispatch.c b/dix/dispatch.c index e673b8b3ad..6beedcd110 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -594,7 +594,9 @@ Dispatch(void) } dispatchException &= ~DE_PRIORITYCHANGE; } +#if defined(DDXBEFORERESET) ddxBeforeReset(); +#endif KillAllClients(); dispatchException &= ~DE_RESET; SmartScheduleLatencyLimited = 0; diff --git a/dix/dix_priv.h b/dix/dix_priv.h index ef49213f55..80c7b94c4a 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -48,7 +48,6 @@ #define MAX_BIG_REQUEST_SIZE 4194303 extern long maxBigRequestSize; -extern char dispatchExceptionAtReset; extern int terminateDelay; extern Bool touchEmulatePointer; @@ -136,8 +135,6 @@ void EnableLimitedSchedulingLatency(void); void DisableLimitedSchedulingLatency(void); -int dix_main(int argc, char *argv[], char *envp[]); - void SetMaskForEvent(int deviceid, Mask mask, int event); void EnqueueEvent(InternalEvent *ev, DeviceIntPtr device); @@ -281,19 +278,11 @@ extern Bool whiteRoot; extern volatile char isItTimeToYield; -/* bit values for dispatchException */ -#define DE_RESET 1 -#define DE_TERMINATE 2 -#define DE_PRIORITYCHANGE 4 /* set when a client's priority changes */ - -extern volatile char dispatchException; - extern int ScreenSaverBlanking; extern int ScreenSaverAllowExposures; extern int defaultScreenSaverBlanking; extern int defaultScreenSaverAllowExposures; extern int displayfd; -extern Bool explicit_display; extern Bool disableBackingStore; extern Bool enableBackingStore; diff --git a/dix/inpututils_priv.h b/dix/inpututils_priv.h index 1f2076999f..f168706dfb 100644 --- a/dix/inpututils_priv.h +++ b/dix/inpututils_priv.h @@ -32,14 +32,6 @@ extern Mask event_filters[MAXDEVICES][MAXEVENTS]; -struct _ValuatorMask { - int8_t last_bit; /* highest bit set in mask */ - int8_t has_unaccelerated; - uint8_t mask[(MAX_VALUATORS + 7) / 8]; - double valuators[MAX_VALUATORS]; /* valuator data */ - double unaccelerated[MAX_VALUATORS]; /* valuator data */ -}; - void verify_internal_event(const InternalEvent *ev); void init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms, enum DeviceEventSource event_source); diff --git a/dix/main.c b/dix/main.c index 74af117c6f..603c70082b 100644 --- a/dix/main.c +++ b/dix/main.c @@ -119,7 +119,7 @@ Equipment Corporation. #include "extnsionst.h" #include "privates.h" #include "exevents.h" - +#include "opaque.h" #ifdef DPMSExtension #include #include "dpmsproc.h" @@ -195,7 +195,7 @@ dix_main(int argc, char *argv[], char *envp[]) dixResetRegistry(); InitFonts(); InitCallbackManager(); - InitOutput(argc, argv); + InitOutput(NULL, argc, argv); if (screenInfo.numScreens < 1) FatalError("no screens found"); diff --git a/dix/screenint_priv.h b/dix/screenint_priv.h index 65eb476227..f24e2a0004 100644 --- a/dix/screenint_priv.h +++ b/dix/screenint_priv.h @@ -13,9 +13,6 @@ #include "include/screenint.h" #include "include/scrnintstr.h" /* for screenInfo */ -typedef Bool (*ScreenInitProcPtr)(ScreenPtr pScreen, int argc, char **argv); - -int AddScreen(ScreenInitProcPtr pfnInit, int argc, char **argv); int AddGPUScreen(ScreenInitProcPtr pfnInit, int argc, char **argv); void RemoveGPUScreen(ScreenPtr pScreen); @@ -26,8 +23,6 @@ void DetachUnboundGPU(ScreenPtr unbound); void AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr newScreen); void DetachOffloadGPU(ScreenPtr slave); -void InitOutput(int argc, char **argv); - static inline ScreenPtr dixGetMasterScreen(void) { return screenInfo.screens[0]; } diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c index da78680d9c..f3c72de6b3 100644 --- a/hw/kdrive/ephyr/ephyrinit.c +++ b/hw/kdrive/ephyr/ephyrinit.c @@ -63,7 +63,7 @@ InitCard(char *name) } void -InitOutput(int argc, char **argv) +InitOutput(ScreenInfo *unused, int argc, char **argv) { KdInitOutput(argc, argv); } @@ -111,6 +111,13 @@ ddxInputThreadInit(void) } #endif +#ifdef DDXBEFORERESET +void +ddxBeforeReset(void) +{ +} +#endif + void ddxUseMsg(void) { diff --git a/hw/kdrive/ephyr/meson.build b/hw/kdrive/ephyr/meson.build index 42ec9dab26..11d0b17c07 100644 --- a/hw/kdrive/ephyr/meson.build +++ b/hw/kdrive/ephyr/meson.build @@ -4,7 +4,6 @@ srcs = [ 'ephyrcursor.c', 'ephyr_draw.c', 'hostx.c', - '../../stubs/ddxBeforeReset.c', ] xephyr_dep = [ diff --git a/hw/kdrive/fbdev/fbinit.c b/hw/kdrive/fbdev/fbinit.c index b1b7e5291f..d4c5542794 100644 --- a/hw/kdrive/fbdev/fbinit.c +++ b/hw/kdrive/fbdev/fbinit.c @@ -54,7 +54,7 @@ ddxInputThreadInit(void) #endif void -InitOutput(int argc, char **argv) +InitOutput(ScreenInfo *unused, int argc, char **argv) { if (serverGeneration == 1) ephyrExtensionInit(); diff --git a/hw/kdrive/fbdev/meson.build b/hw/kdrive/fbdev/meson.build index f015f699d4..2c8e6eff05 100644 --- a/hw/kdrive/fbdev/meson.build +++ b/hw/kdrive/fbdev/meson.build @@ -1,7 +1,6 @@ srcs = [ 'fbdev.c', 'fbinit.c', - '../../stubs/ddxBeforeReset.c', ] xfbdev_server = executable( diff --git a/hw/stubs/ddxBeforeReset.c b/hw/stubs/ddxBeforeReset.c deleted file mode 100644 index fa29fab233..0000000000 --- a/hw/stubs/ddxBeforeReset.c +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: MIT OR X11 - * - * Copyright © 2024 Enrico Weigelt, metux IT consult - */ -#include - -#include "os/ddx_priv.h" - -void -ddxBeforeReset(void) -{ -} diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c index 916605ff4f..026ed676bb 100644 --- a/hw/vfb/InitOutput.c +++ b/hw/vfb/InitOutput.c @@ -271,6 +271,14 @@ OsVendorFatalError(const char *f, va_list args) { } +#if defined(DDXBEFORERESET) +void +ddxBeforeReset(void) +{ + return; +} +#endif + #if INPUTTHREAD /** This function is called in Xserver/os/inputthread.c when starting the input thread. */ @@ -1047,7 +1055,7 @@ vfbScreenInit(ScreenPtr pScreen, int argc, char **argv) } /* end vfbScreenInit */ void -InitOutput(int argc, char **argv) +InitOutput(ScreenInfo *unused, int argc, char **argv) { int i; int NumFormats = 0; diff --git a/hw/vfb/meson.build b/hw/vfb/meson.build index 891bb75b4e..7332866b3d 100644 --- a/hw/vfb/meson.build +++ b/hw/vfb/meson.build @@ -3,7 +3,6 @@ srcs = [ 'InitOutput.c', '../../mi/miinitext.c', '../../mi/miinitext.h', - '../stubs/ddxBeforeReset.c', ] xvfb_server = executable( diff --git a/hw/xfree86/common/meson.build b/hw/xfree86/common/meson.build index 0a9a1b37ed..f3b10bf8f2 100644 --- a/hw/xfree86/common/meson.build +++ b/hw/xfree86/common/meson.build @@ -22,7 +22,6 @@ srcs_xorg_common = [ 'xf86Mode.c', 'xorgHelper.c', 'xf86Extensions.c', - '../../stubs/ddxBeforeReset.c', ] xorg_sdk_headers = [ diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index cd1cddb968..3c7ed3333a 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -284,7 +284,7 @@ xf86EnsureRANDR(ScreenPtr pScreen) * collecting the pixmap formats. */ void -InitOutput(int argc, char **argv) +InitOutput(ScreenInfo *unused, int argc, char **argv) { int i, j, k, scr_index; const char **modulelist; @@ -1324,6 +1324,13 @@ xf86GetBppFromDepth(ScrnInfoPtr pScrn, int depth) return 0; } +#ifdef DDXBEFORERESET +void +ddxBeforeReset(void) +{ +} +#endif + #if INPUTTHREAD /** This function is called in Xserver/os/inputthread.c when starting the input thread. */ diff --git a/hw/xnest/Init.c b/hw/xnest/Init.c index 894f4fe5d1..e81083f45f 100644 --- a/hw/xnest/Init.c +++ b/hw/xnest/Init.c @@ -65,7 +65,7 @@ Bool noGlxExtension = FALSE; #endif void -InitOutput(int argc, char *argv[]) +InitOutput(ScreenInfo *unused, int argc, char *argv[]) { int i; @@ -166,6 +166,14 @@ OsVendorFatalError(const char *f, va_list args) return; } +#if defined(DDXBEFORERESET) +void +ddxBeforeReset(void) +{ + return; +} +#endif + #if INPUTTHREAD /** This function is called in Xserver/os/inputthread.c when starting the input thread. */ diff --git a/hw/xnest/meson.build b/hw/xnest/meson.build index d01b871db7..28dc78396b 100644 --- a/hw/xnest/meson.build +++ b/hw/xnest/meson.build @@ -18,7 +18,6 @@ srcs = [ '../../mi/miinitext.h', 'xcb.c', 'xkb.c', - '../stubs/ddxBeforeReset.c', ] xcb_dep = dependency('xcb', required: true) diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c index 58a0c13d61..f171c0e615 100644 --- a/hw/xquartz/darwin.c +++ b/hw/xquartz/darwin.c @@ -631,7 +631,7 @@ void DarwinAdjustScreenOrigins(void) * SetupScreen function can be called to finalize screen setup. */ void -InitOutput(int argc, char **argv) +InitOutput(ScreenInfo *unused, int argc, char **argv) { int i; diff --git a/hw/xquartz/meson.build b/hw/xquartz/meson.build index 925e0b98c3..d8dd7cd989 100644 --- a/hw/xquartz/meson.build +++ b/hw/xquartz/meson.build @@ -55,7 +55,6 @@ srcs_libxquartz = [ 'quartzRandR.c', '../../mi/miinitext.c', '../../mi/miinitext.h', - '../stubs/ddxBeforeReset.c', ] libxquartz_defs = [ diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c index d7470cc3b7..f67e35688d 100644 --- a/hw/xwin/InitOutput.c +++ b/hw/xwin/InitOutput.c @@ -143,10 +143,12 @@ void XwinExtensionInit(void) LoadExtensionList(xwinExtensions, ARRAY_SIZE(xwinExtensions), TRUE); } +#if defined(DDXBEFORERESET) /* * Called right before KillAllClients when the server is going to reset, * allows us to shutdown our separate threads cleanly. */ + void ddxBeforeReset(void) { @@ -154,6 +156,7 @@ ddxBeforeReset(void) winClipboardShutdown(); } +#endif #if INPUTTHREAD /** This function is called in Xserver/os/inputthread.c when starting @@ -786,7 +789,7 @@ ddxUseMsg(void) */ void -InitOutput(int argc, char *argv[]) +InitOutput(ScreenInfo *unused, int argc, char *argv[]) { int i; diff --git a/include/dix.h b/include/dix.h index f32c668036..96410dde67 100644 --- a/include/dix.h +++ b/include/dix.h @@ -53,6 +53,7 @@ SOFTWARE. #include "input.h" #include "cursor.h" #include "events.h" +#include #include #define EARLIER -1 @@ -213,7 +214,7 @@ typedef struct { } DeviceEventInfoRec; extern _X_EXPORT void *lastGLContext; - +extern _X_EXPORT char dispatchExceptionAtReset; /** * @brief get display string for given screen * @@ -225,4 +226,7 @@ extern _X_EXPORT void *lastGLContext; */ _X_EXPORT const char *dixGetDisplayName(ScreenPtr *pScreen); +_X_EXPORT int dix_main(int argc, char *argv[], char *envp[]); +_X_EXPORT extern volatile char dispatchException; + #endif /* DIX_H */ diff --git a/include/input.h b/include/input.h index de89ee37db..6047f17064 100644 --- a/include/input.h +++ b/include/input.h @@ -159,6 +159,14 @@ typedef struct _GestureInfo *GestureInfoPtr; typedef struct _DDXTouchPointInfo *DDXTouchPointInfoPtr; typedef union _GrabMask GrabMask; +struct _ValuatorMask { + int8_t last_bit; /* highest bit set in mask */ + int8_t has_unaccelerated; + uint8_t mask[(MAX_VALUATORS + 7) / 8]; + double valuators[MAX_VALUATORS]; /* valuator data */ + double unaccelerated[MAX_VALUATORS]; /* valuator data */ +}; + typedef struct _ValuatorMask ValuatorMask; /* The DIX stores incoming input events in this list */ diff --git a/include/inpututils.h b/include/inpututils.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/include/meson.build b/include/meson.build index 687cb0af15..27fa5f7f16 100644 --- a/include/meson.build +++ b/include/meson.build @@ -272,6 +272,7 @@ conf_data.set('HAVE_LIBUNWIND', get_option('libunwind')) conf_data.set('HAVE_APM', (build_apm or build_acpi) ? '1' : false) conf_data.set('HAVE_ACPI', build_acpi ? '1' : false) +conf_data.set('DDXBEFORERESET', build_xwin ? '1' : false) enable_debugging = get_option('buildtype') == 'debug' conf_data.set('DEBUG', enable_debugging ? '1' : false) diff --git a/include/opaque.h b/include/opaque.h index 4cbc600ace..7de5b57615 100644 --- a/include/opaque.h +++ b/include/opaque.h @@ -29,6 +29,7 @@ from The Open Group. #ifndef OPAQUE_H #define OPAQUE_H +#include #include #include "globals.h" @@ -39,5 +40,11 @@ extern _X_EXPORT Bool bgNoneRoot; // needed by libvnc.so from tigervnc extern _X_EXPORT char *display; +extern _X_EXPORT Bool explicit_display; +_X_EXPORT void UseMsg(void); +/* bit values for dispatchException */ +#define DE_RESET 1 +#define DE_TERMINATE 2 +#define DE_PRIORITYCHANGE 4 /* set when a client's priority changes */ #endif /* OPAQUE_H */ diff --git a/include/os.h b/include/os.h index 6238f9b362..93895f5ee8 100644 --- a/include/os.h +++ b/include/os.h @@ -276,6 +276,13 @@ _X_ATTRIBUTE_PRINTF(1, 2); extern _X_EXPORT void xorg_backtrace(void); +/* Logging. */ +typedef enum _LogParameter { + XLOG_SYNC, + XLOG_VERBOSITY, + XLOG_FILE_VERBOSITY +} LogParameter; +int LogSetParameter(LogParameter param, int value); /* should not be used anymore, just for backwards compat with drivers */ #define LogVMessageVerbSigSafe(...) LogVMessageVerb(__VA_ARGS__) #define LogMessageVerbSigSafe(...) LogMessageVerb(__VA_ARGS__) @@ -294,4 +301,31 @@ static inline int System(const char* cmdline) return system(cmdline); } + +#define CHECK_FOR_REQUIRED_ARGUMENTS(num) \ + do if (((i + num) >= argc) || (!argv[i + num])) { \ + UseMsg(); \ + FatalError("Required argument to %s not specified\n", argv[i]); \ + } while (0) + + +enum ExitCode { + EXIT_NO_ERROR = 0, + EXIT_ERR_ABORT = 1, + EXIT_ERR_CONFIGURE = 2, + EXIT_ERR_DRIVERS = 3, +}; + +/* called by ProcessCommandLine, so DDX can catch cmdline args */ +_X_EXPORT int ddxProcessArgument(int argc, char *argv[], int i); +/* called before server reset */ +_X_EXPORT void ddxBeforeReset(void); + +/* print DDX specific usage message */ +_X_EXPORT void ddxUseMsg(void); + +_X_EXPORT void ddxGiveUp(enum ExitCode error); + +_X_EXPORT void ddxInputThreadInit(void); + #endif /* OS_H */ diff --git a/include/scrnintstr.h b/include/scrnintstr.h index 24e2cc8902..99e5ad3432 100644 --- a/include/scrnintstr.h +++ b/include/scrnintstr.h @@ -732,4 +732,9 @@ typedef struct _ScreenInfo { extern _X_EXPORT ScreenInfo screenInfo; +_X_EXPORT void InitOutput(ScreenInfo *unused, int argc, char **argv); + +typedef Bool (*ScreenInitProcPtr)(ScreenPtr pScreen, int argc, char **argv); +extern _X_EXPORT int AddScreen(ScreenInitProcPtr pfnInit, int argc, char **argv); + #endif /* SCREENINTSTRUCT_H */ diff --git a/include/selection.h b/include/selection.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/include/xkbsrv.h b/include/xkbsrv.h index 6f08118652..2a72cf14cd 100644 --- a/include/xkbsrv.h +++ b/include/xkbsrv.h @@ -36,6 +36,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "xkbrules.h" #include "inputstr.h" #include "events.h" +#include #define XkbChangeTypesOfKey SrvXkbChangeTypesOfKey @@ -248,6 +249,15 @@ extern _X_EXPORT Status SrvXkbChangeTypesOfKey(XkbDescPtr /* xkb */ , void _X_EXPORT XkbSendNotification(DeviceIntPtr kbd, XkbChangesPtr pChanges, XkbEventCausePtr cause); +#define XkbSetCauseUnknown(c) XkbSetCauseKey(c, 0, 0) +#define XkbAX_KRGMask (XkbSlowKeysMask|XkbBounceKeysMask) +#define XkbAllFilteredEventsMask \ + (XkbAccessXKeysMask|XkbRepeatKeysMask|XkbMouseKeysAccelMask|XkbAX_KRGMask) + +#define XkbSetCauseKey(c,k,e) { (c)->kc= (k),(c)->event= (e),\ + (c)->mjr= (c)->mnr= 0; \ + (c)->client= NULL; } + #include "xkbstr.h" #include "xkbrules.h" diff --git a/mi/mi.h b/mi/mi.h index 5abdf95a23..6db5c68ec9 100644 --- a/mi/mi.h +++ b/mi/mi.h @@ -320,5 +320,6 @@ typedef void (*mieqHandler) (int screen, InternalEvent *event, void _X_EXPORT mieqSetHandler(int event, mieqHandler handler); void _X_EXPORT mieqProcessInputEvents(void); +Bool _X_EXPORT mieqInit(void); #endif /* MI_H */ diff --git a/mi/mi_priv.h b/mi/mi_priv.h index 6ac4644675..c869eeb50a 100644 --- a/mi/mi_priv.h +++ b/mi/mi_priv.h @@ -36,7 +36,6 @@ void miWideArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs); void miStepDash(int dist, int * pDashIndex, unsigned char * pDash, int numInDashList, int *pDashOffset); -Bool mieqInit(void); void mieqFini(void); void mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e); void mieqSwitchScreen(DeviceIntPtr pDev, ScreenPtr pScreen, Bool set_dequeue_screen); diff --git a/mi/mipointer.h b/mi/mipointer.h index ba1710a25b..bdd0daedde 100644 --- a/mi/mipointer.h +++ b/mi/mipointer.h @@ -80,6 +80,12 @@ extern _X_EXPORT Bool miDCInitialize(ScreenPtr /*pScreen */ , extern _X_EXPORT ScreenPtr miPointerGetScreen(DeviceIntPtr pDev); +extern _X_EXPORT void miPointerWarpCursor(DeviceIntPtr /*pDev */ , + ScreenPtr /*pScreen */ , + int /*x */ , + int /*y */ + ); + /* Returns the current cursor position. */ extern _X_EXPORT void miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y); diff --git a/mi/mipointer_priv.h b/mi/mipointer_priv.h index cc4ce99400..6af6404233 100644 --- a/mi/mipointer_priv.h +++ b/mi/mipointer_priv.h @@ -11,7 +11,6 @@ #include "include/input.h" #include "mi/mipointer.h" -void miPointerWarpCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y); void miPointerSetScreen(DeviceIntPtr pDev, int screen_num, int x, int y); void miPointerUpdateSprite(DeviceIntPtr pDev); diff --git a/os/cmdline.h b/os/cmdline.h index eba96746f1..6400e87f60 100644 --- a/os/cmdline.h +++ b/os/cmdline.h @@ -7,13 +7,6 @@ #include "include/os.h" -#define CHECK_FOR_REQUIRED_ARGUMENTS(num) \ - do if (((i + num) >= argc) || (!argv[i + num])) { \ - UseMsg(); \ - FatalError("Required argument to %s not specified\n", argv[i]); \ - } while (0) - -void UseMsg(void); void ProcessCommandLine(int argc, char * argv[]); void CheckUserParameters(int argc, char **argv, char **envp); diff --git a/os/ddx_priv.h b/os/ddx_priv.h index 9ef4d64687..09fae7c7d4 100644 --- a/os/ddx_priv.h +++ b/os/ddx_priv.h @@ -12,17 +12,4 @@ DDX's need to implement these in order to handle DDX specific things. */ -/* called before server reset */ -void ddxBeforeReset(void); - -/* called by ProcessCommandLine, so DDX can catch cmdline args */ -int ddxProcessArgument(int argc, char *argv[], int i); - -/* print DDX specific usage message */ -void ddxUseMsg(void); - -void ddxGiveUp(enum ExitCode error); - -void ddxInputThreadInit(void); - #endif /* _XSERVER_OS_DDX_PRIV_H */ diff --git a/os/log.c b/os/log.c index bc9c200998..bdeaf9794e 100644 --- a/os/log.c +++ b/os/log.c @@ -319,6 +319,24 @@ LogSetDisplay(void) initSyslog(); } +int +LogSetParameter(LogParameter param, int value) +{ + switch (param) { + case XLOG_SYNC: + xorgLogSync = value ? TRUE : FALSE; + return TRUE; + case XLOG_VERBOSITY: + xorgLogVerbosity = value; + return TRUE; + case XLOG_FILE_VERBOSITY: + xorgLogFileVerbosity = value; + return TRUE; + default: + return FALSE; + } +} + void LogClose(enum ExitCode error) { diff --git a/os/osdep.h b/os/osdep.h index 1e51a6e703..77b169dd75 100644 --- a/os/osdep.h +++ b/os/osdep.h @@ -222,13 +222,6 @@ static inline size_t x_safe_strlen(const char *str) { return (str ? strlen(str) : 0); } -enum ExitCode { - EXIT_NO_ERROR = 0, - EXIT_ERR_ABORT = 1, - EXIT_ERR_CONFIGURE = 2, - EXIT_ERR_DRIVERS = 3, -}; - extern sig_atomic_t inSignalContext; /* run timers that are expired at timestamp `now` */ diff --git a/xkb/xkbsrv_priv.h b/xkb/xkbsrv_priv.h index be18d3cc4a..08da66488c 100644 --- a/xkb/xkbsrv_priv.h +++ b/xkb/xkbsrv_priv.h @@ -17,6 +17,7 @@ #include "privates.h" #include "xkbsrv.h" #include "xkbstr.h" +#include #define _BEEP_NONE 0 #define _BEEP_FEATURE_ON 1 @@ -35,22 +36,15 @@ #define _BEEP_LED_CHANGE 14 #define _BEEP_BOUNCE_REJECT 15 -#define XkbSetCauseKey(c,k,e) { (c)->kc= (k),(c)->event= (e),\ - (c)->mjr= (c)->mnr= 0; \ - (c)->client= NULL; } #define XkbSetCauseReq(c,j,n,cl) { (c)->kc= (c)->event= 0,\ (c)->mjr= (j),(c)->mnr= (n);\ (c)->client= (cl); } #define XkbSetCauseCoreReq(c,e,cl) XkbSetCauseReq(c,e,0,cl) #define XkbSetCauseXkbReq(c,e,cl) XkbSetCauseReq(c,XkbReqCode,e,cl) -#define XkbSetCauseUnknown(c) XkbSetCauseKey(c,0,0) #define XkbSLI_IsDefault (1L<<0) #define XkbSLI_HasOwnState (1L<<1) -#define XkbAX_KRGMask (XkbSlowKeysMask|XkbBounceKeysMask) -#define XkbAllFilteredEventsMask \ - (XkbAccessXKeysMask|XkbRepeatKeysMask|XkbMouseKeysAccelMask|XkbAX_KRGMask) /* * Settings for xkbClientFlags field (used by DIX)