libx11 libxcursor handling - Problems with big cursors not working in Java and xterm

OpenSubmitted by Danny Milosavljevic.
Details
2 participants
  • Danny Milosavljevic
  • Liliana Marie Prikler
Owner
unassigned
Severity
normal
D
D
Danny Milosavljevic wrote on 31 Mar 15:31 +0200
(address . bug-guix@gnu.org)
20220331153156.0ae2b4ce@scratchpost.org
Hi,

After I got HiDPI displays (3840 pixels x 2160 pixels) mostly working in Guix
system, I am only left with one remaining problem:

libx11's XCreateFontCursor tries to dynamically-load libxcursor with just the
basename "libXcursor.so.1".

Because libxcursor depends on libx11, it's not possible to just add libxcursor
as a dependency TO libx11.

The problematic location is:

# libX11-1.7.3.1/src/CrGlCur.c

#define LIBXCURSOR "libXcursor.so.1"
static char libraryName[] = LIBXCURSOR;

static XModuleType
open_library (void)
{
[...]
module = dlopen(library, RTLD_LAZY);
[...]
}

#define GetFunc(type,name,ret) {\
[...] _XcursorModule = open_library ();

#define CURSORFONT "cursor" /* standard cursor fonts */

It's getting to dlopen of "LibXcursor.so.1" via XCreateFontCursor, which
calls XCreateGlyphCursor, which calls _XTryShapeCursor, which calls
open_library.

static Cursor
_XTryShapeCursor (Display *dpy,
Font source_font,
Font mask_font,
unsigned int source_char,
unsigned int mask_char,
XColor _Xconst *foreground,
XColor _Xconst *background)
{
TryShapeCursorFunc func;

GetFunc (TryShapeCursorFunc, "XcursorTryShapeCursor", func); <----- problem
if (func)
return (*func) (dpy, source_font, mask_font, source_char, mask_char,
foreground, background);
return None;
}

Cursor XCreateGlyphCursor(
register Display *dpy,
Font source_font,
Font mask_font,
unsigned int source_char,
unsigned int mask_char,
XColor _Xconst *foreground,
XColor _Xconst *background)
{
Cursor cid;
register xCreateGlyphCursorReq *req;

#ifdef USE_DYNAMIC_XCURSOR
cid = _XTryShapeCursor (dpy, source_font, mask_font,
source_char, mask_char, foreground, background);
if (cid)
return cid;
#endif
LockDisplay(dpy);
GetReq(CreateGlyphCursor, req);
cid = req->cid = XAllocID(dpy);
req->source = source_font;
req->mask = mask_font;
req->sourceChar = source_char;
req->maskChar = mask_char;
req->foreRed = foreground->red;
req->foreGreen = foreground->green;
req->foreBlue = foreground->blue;
req->backRed = background->red;
req->backGreen = background->green;
req->backBlue = background->blue;
UnlockDisplay(dpy);
SyncHandle();
return (cid);
}

Cursor XCreateFontCursor(
Display *dpy,
unsigned int which)
{
/*
* the cursor font contains the shape glyph followed by the mask
* glyph; so character position 0 contains a shape, 1 the mask for 0,
* 2 a shape, etc. <X11/cursorfont.h> contains hash define names
* for all of these.
*/

if (dpy->cursor_font == None) {
dpy->cursor_font = XLoadFont (dpy, CURSORFONT);
if (dpy->cursor_font == None) return None;
}

return XCreateGlyphCursor (dpy, dpy->cursor_font, dpy->cursor_font,
which, which + 1, &foreground, &background);
}

Cursor XCreateGlyphCursor(
register Display *dpy,
Font source_font,
Font mask_font,
unsigned int source_char,
unsigned int mask_char,
XColor _Xconst *foreground,
XColor _Xconst *background)
{
Cursor cid;
register xCreateGlyphCursorReq *req;

#ifdef USE_DYNAMIC_XCURSOR
cid = _XTryShapeCursor (dpy, source_font, mask_font,
source_char, mask_char, foreground, background);
if (cid)
return cid;
#endif
LockDisplay(dpy);
GetReq(CreateGlyphCursor, req);
cid = req->cid = XAllocID(dpy);
req->source = source_font;
req->mask = mask_font;
req->sourceChar = source_char;
req->maskChar = mask_char;
req->foreRed = foreground->red;
req->foreGreen = foreground->green;
req->foreBlue = foreground->blue;
req->backRed = background->red;
req->backGreen = background->green;
req->backBlue = background->blue;
UnlockDisplay(dpy);
SyncHandle();
return (cid);
}

To test, to enable HiDPI:

1. Put big mouse cursors into .icons/default/cursors
2. Invoke: gsettings set org.gnome.desktop.interface cursor-size 64
3. Add to .xinitrc: xsetroot -cursor_name left_ptr # does it again
4. xrdb merge: Xft.dpi: 163

To test whether it's actually because of that (don't do it for too long):

1. Find the /gnu/store location for the libx11 used by openjdk.
2. cp -r /gnu/store/whatever-libx11* /tmp/foo
3. mount -o bind /tmp/foo /gnu/store/whatever-libx11
4. cp `guix build libxcursor`/lib/libXcursor.so* /tmp/foo/lib
5. Call your fancy Java program (for example IntelliJ IDEA)

Not sure what the best way forward is.

Possible alternative fixes:

a. Patch openjdk and xterm (and who knows what) such that it also does the
XcursorTryShapeCursor before it calls XCreateFontCursor.
That's a lot of work.
Note: There are no libxcursor or XLoadFont bindings in openjdk yet,
and one is not supposed to access Display->cursor_font from outside.
Note: xterm use libxcursor--but for something else. So it still
doesn't work (because it doesn't call XcursorTryShapeCursor).

b. Patch guix such that the libx11 package used by libxcursor is one without
reference to libxcursor, but a new user-visible libx11 package actually
would just link libxcursor in. Not sure whether that's such a good
idea--it could increase the size of everything and have two libx11
libraries loaded in the same user process, no?

c. Inline the build of libxcursor into the build of libx11.
If we did that, we would add libxrender libxfixes to libx11's inputs.
! I think this would actually be nice, especially since libxcursor seems
to rarely change anyway (last change was in 2015).
But even then, libxcursor depends on libxrender and libxfixes, both of
which depends on libx11.

Non-solution steps (that's asking too much from the user--shared libraries
are an implementation detail):

1. Add an environment variable XCURSOR_RUNPATH that the user has to set
2. Patch our libx11 package to read the environment variable in GetFunc
instead of using the global variable.
3. Add search-path or something to libxcursor.

I-don't-know-how-to-do-that-probably-bad-solution steps:

1. Add an environment variable XCURSOR_RUNPATH (see attachment)
2. Patch our libx11 package to read the environment variable in GetFunc
instead of using the global variable. (add such a variable to
search-path or something)
3. Patch our libxcursor package to set search-path
4. Patch our libx11 package to propagate ,(delay libxcursor)

All of those have their pros and cons.

Unfortunately, any fix causes a massive rebuild of guix, except "a".

What to do?

P.S. Same problem exists in nix.
diff -ru orig/libX11-1.7.3.1/src/CrGlCur.c libX11-1.7.3.1/src/CrGlCur.c
--- orig/libX11-1.7.3.1/src/CrGlCur.c 2022-03-31 14:29:15.743894864 +0200
+++ libX11-1.7.3.1/src/CrGlCur.c 2022-03-31 14:30:26.485732511 +0200
@@ -63,7 +63,7 @@
static XModuleType
open_library (void)
{
- char *library = libraryName;
+ char *library = getenv("XCURSOR_RUNPATH") ?: libraryName;
char *dot;
XModuleType module;
for (;;)
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCgAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAmJFrUwACgkQ5xo1VCww
uqXXsQf+J7NG7FYikFixbyUXN0K9mo1qcx5ofQNrFMfRi15RAfMKTvQwN//MlTGY
Dt/ubuTRUcBm7Ey2j7988EhECIKY4SYS2H/1eWogcmqv43wwgRETwSzFH34KvDwy
6jL6J6TAfdtZNC2Ickm54+iKoRcKQHFjXCYGvcMUeNWItLuQzJfRz4GzAsXRCmvZ
rWdu/bThvTAW4nadSXjNuUvEDIp8EgR5zSt6JPC4fE0gg3N0ZkdF3fNdwBwN5aT8
WpFHKWWsu4XZ0SfpzRBxiPDphvX/2anseObaw1l47ieRzvVcV/Mw89SIg80pPNTu
wpVRM1rauqMNdsPQCF9e5M86XcNF0A==
=jIyn
-----END PGP SIGNATURE-----


D
D
dannym wrote on 31 Mar 19:13 +0200
[PATCH] gnu: openjdk15: Make big cursors work.
(address . 54654@debbugs.gnu.org)(name . Danny Milosavljevic)(address . dannym@scratchpost.org)
20220331171311.20805-1-dannym@scratchpost.org
From: Danny Milosavljevic <dannym@scratchpost.org>

* gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/java.scm (openjdk15)[source]: Add it.
---
.../openjdk-15-xcursor-no-dynamic.patch | 66 +++++++++++++++++++
1 file changed, 66 insertions(+)
create mode 100644 gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch

Toggle diff (74 lines)
diff --git a/gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch b/gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch
new file mode 100644
index 0000000000..975730518b
--- /dev/null
+++ b/gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch
@@ -0,0 +1,66 @@
+From: Danny Milosavljevic <dannym@scratchpost.org>
+Date: Thu, 31 Mar 2022 17:02:00 +0200
+Subject: Make openjdk use libxcursor directly
+
+Fixes <https://issues.guix.gnu.org/54654>.
+
+This patch makes openjdk use libxcursor directly.
+Without it, libx11 would try to dlopen("libXcursor.so.1") and fail.
+
+diff -ru orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk
+--- orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk	2022-03-31 15:34:08.773419480 +0200
++++ 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk	2022-03-31 17:47:26.259535832 +0200
+@@ -217,7 +217,7 @@
+       endif
+     endif
+ 
+-    LIBAWT_XAWT_LIBS := $(LIBM) -lawt -lXext -lX11 -lXrender $(LIBDL) -lXtst -lXi -ljava -ljvm
++    LIBAWT_XAWT_LIBS := $(LIBM) -lawt -lXext -lX11 -lXcursor -lXrender $(LIBDL) -lXtst -lXi -ljava -ljvm
+ 
+     ifeq ($(call isTargetOs, linux), true)
+       LIBAWT_XAWT_LIBS += -lpthread
+diff -ru orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix
+--- orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix	2022-03-31 15:34:10.553466316 +0200
++++ 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix	2022-03-31 17:47:08.027052750 +0200
+@@ -31,7 +31,7 @@
+ 
+ J_INC =		$(TESTJAVA)/include
+ INCLUDES =	-I$(J_INC) -I$(J_INC)/$(SYST) -I.
+-LIBS =		-L$(TESTJAVA)/lib -ljawt -lX11
++LIBS =		-L$(TESTJAVA)/lib -ljawt -lX11 -lXcursor
+ 
+ all:		$(CLASSES) libmylib.so
+ 
+diff -ru orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c
+--- orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c	2022-03-31 15:34:11.917502206 +0200
++++ 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c	2022-03-31 17:07:25.664488391 +0200
+@@ -44,6 +44,7 @@
+ #include <X11/XKBlib.h>
+ #include <X11/Xos.h>
+ #include <X11/Xutil.h>
++#include <X11/Xcursor/Xcursor.h>
+ 
+ #if defined(AIX)
+ #undef X_HAVE_UTF8_STRING
+@@ -972,10 +973,20 @@
+ 
+ }
+ 
++static XColor _Xconst foreground = { 0,    0,     0,     0  };  /* black */
++static XColor _Xconst background = { 0, 65535, 65535, 65535 };  /* white */
++
+ JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XCreateFontCursor
+ (JNIEnv *env, jclass clazz, jlong display, jint shape) {
+     AWT_CHECK_HAVE_LOCK_RETURN(0);
+-    return XCreateFontCursor((Display *) jlong_to_ptr(display), (int) shape);
++    Display * dpy = (Display *) jlong_to_ptr(display);
++    Font font = XLoadFont(dpy, "cursor"); /* note: leak */
++    if (font == None)
++        return 0;
++    Cursor result = XcursorTryShapeCursor(dpy, font, font, (int) shape, (int) shape + 1, &foreground, &background);
++    if (!result)
++        result = XCreateFontCursor(dpy, (int) shape);
++    return result;
+ }
+ 
+ /*
-- 
2.34.0
D
D
dannym wrote on 31 Mar 22:03 +0200
[PATCH v2] gnu: openjdk15: Make big cursors work.
(address . 54654@debbugs.gnu.org)(name . Danny Milosavljevic)(address . dannym@scratchpost.org)
20220331200323.10098-1-dannym@scratchpost.org
From: Danny Milosavljevic <dannym@scratchpost.org>

* gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/java.scm (openjdk15)[source]: Add it.
---
gnu/local.mk | 1 +
gnu/packages/java.scm | 7 +-
.../openjdk-15-xcursor-no-dynamic.patch | 72 +++++++++++++++++++
3 files changed, 79 insertions(+), 1 deletion(-)
create mode 100644 gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch

Toggle diff (110 lines)
diff --git a/gnu/local.mk b/gnu/local.mk
index a704161abc..ac8992885e 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1564,6 +1564,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/opencascade-oce-glibc-2.26.patch		\
   %D%/packages/patches/openfoam-4.1-cleanup.patch			\
   %D%/packages/patches/openjdk-10-idlj-reproducibility.patch	\
+  %D%/packages/patches/openjdk-15-xcursor-no-dynamic.patch	\
   %D%/packages/patches/openmpi-mtl-priorities.patch		\
   %D%/packages/patches/openssh-hurd.patch			\
   %D%/packages/patches/openresolv-restartcmd-guix.patch	\
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index b27892841e..b0908cc15a 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -2185,7 +2185,12 @@ (define-public openjdk15
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "168cr08nywp0q3vyj8njkhsmmnyd8rz9r58hk4xhzdzc6bdfkl1i"))))
+                "168cr08nywp0q3vyj8njkhsmmnyd8rz9r58hk4xhzdzc6bdfkl1i"))
+              (patches
+                (search-patches "openjdk-15-xcursor-no-dynamic.patch"))))
+    (inputs
+     (cons `("libxcursor" ,libxcursor) ; for our patch to work
+           (package-inputs openjdk14)))
     (native-inputs
      `(("autoconf" ,autoconf)
        ("openjdk14:jdk" ,openjdk14 "jdk")
diff --git a/gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch b/gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch
new file mode 100644
index 0000000000..9325dd3da6
--- /dev/null
+++ b/gnu/packages/patches/openjdk-15-xcursor-no-dynamic.patch
@@ -0,0 +1,72 @@
+From: Danny Milosavljevic <dannym@scratchpost.org>
+Date: Thu, 31 Mar 2022 17:02:00 +0200
+Subject: Make openjdk use libxcursor directly
+
+Fixes <https://issues.guix.gnu.org/54654>.
+
+This patch makes openjdk use libxcursor directly.
+Without it, libx11 would try to dlopen("libXcursor.so.1") and fail.
+
+diff -ru orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk
+--- orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk	2022-03-31 15:34:08.773419480 +0200
++++ 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/make/modules/java.desktop/lib/Awt2dLibraries.gmk	2022-03-31 21:36:27.854273411 +0200
+@@ -217,7 +217,7 @@
+       endif
+     endif
+ 
+-    LIBAWT_XAWT_LIBS := $(LIBM) -lawt -lXext -lX11 -lXrender $(LIBDL) -lXtst -lXi -ljava -ljvm
++    LIBAWT_XAWT_LIBS := $(LIBM) -lawt -lXext -lX11 -lXcursor -lXrender $(LIBDL) -lXtst -lXi -ljava -ljvm
+ 
+     ifeq ($(call isTargetOs, linux), true)
+       LIBAWT_XAWT_LIBS += -lpthread
+diff -ru orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c
+--- orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c	2022-03-31 15:34:11.917502206 +0200
++++ 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c	2022-03-31 21:38:16.417253535 +0200
+@@ -40,10 +40,12 @@
+ #include <X11/keysym.h>
+ #include <X11/Sunkeysym.h>
+ #include <X11/Xlib.h>
++#include <X11/Xlibint.h>
+ #include <X11/Xatom.h>
+ #include <X11/XKBlib.h>
+ #include <X11/Xos.h>
+ #include <X11/Xutil.h>
++#include <X11/Xcursor/Xcursor.h>
+ 
+ #if defined(AIX)
+ #undef X_HAVE_UTF8_STRING
+@@ -972,10 +974,21 @@
+ 
+ }
+ 
++static XColor _Xconst foreground = { 0,    0,     0,     0  };  /* black */
++static XColor _Xconst background = { 0, 65535, 65535, 65535 };  /* white */
++
+ JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XCreateFontCursor
+ (JNIEnv *env, jclass clazz, jlong display, jint shape) {
+     AWT_CHECK_HAVE_LOCK_RETURN(0);
+-    return XCreateFontCursor((Display *) jlong_to_ptr(display), (int) shape);
++    Display * dpy = (Display *) jlong_to_ptr(display);
++    if (dpy->cursor_font == None) {
++        dpy->cursor_font = XLoadFont(dpy, "cursor");
++        if (dpy->cursor_font == None) return None;
++    }
++    Cursor result = XcursorTryShapeCursor(dpy, dpy->cursor_font, dpy->cursor_font, (int) shape, (int) shape + 1, &foreground, &background);
++    if (!result)
++        result = XCreateFontCursor(dpy, (int) shape);
++    return result;
+ }
+ 
+ /*
+diff -ru orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix
+--- orig/22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix	2022-03-31 15:34:10.553466316 +0200
++++ 22kjr9lzrml0h5m55viq7zlfkqr9p7ny-openjdk-15.0.3-checkout/test/jdk/java/awt/JAWT/Makefile.unix	2022-03-31 21:36:27.854273411 +0200
+@@ -31,7 +31,7 @@
+ 
+ J_INC =		$(TESTJAVA)/include
+ INCLUDES =	-I$(J_INC) -I$(J_INC)/$(SYST) -I.
+-LIBS =		-L$(TESTJAVA)/lib -ljawt -lX11
++LIBS =		-L$(TESTJAVA)/lib -ljawt -lX11 -lXcursor
+ 
+ all:		$(CLASSES) libmylib.so
+ 
-- 
2.34.0
L
L
Liliana Marie Prikler wrote on 1 Apr 08:16 +0200
Re: libx11 libxcursor handling - Problems with big cursors not working in Java and xterm
4e22551e52e7187ea770bcbdce713940c322dc14.camel@ist.tugraz.at
Am Donnerstag, dem 31.03.2022 um 15:31 +0200 schrieb Danny
Milosavljevic:
Toggle quote (13 lines)
> [...]
> Possible fixes:
>
> a. Patch openjdk and xterm (and who knows what) such that it also
> does the
>    XcursorTryShapeCursor before it calls XCreateFontCursor.
>    That's a lot of work.
>    Note: There are no libxcursor or XLoadFont bindings in openjdk
> yet,
>    and one is not supposed to access Display->cursor_font from
> outside.
>    Note: xterm use libxcursor--but for something else. So it still
>    doesn't work (because it doesn't call XcursorTryShapeCursor).
This solution works short-term and should probably be done in the
meantime while...

Toggle quote (7 lines)
> b. Patch guix such that the libx11 package used by libxcursor is one
> without
>    reference to libxcursor, but a new user-visible libx11 package
> actually
>    would just link libxcursor in. Not sure whether that's such a good
>    idea--it could increase the size of everything and have two libx11
>    libraries loaded in the same user process, no?
this is the proper solution, which we would need to deploy on core-
updates first due to the enormous amount of dependents. As for the two
libx11s being loaded into the same user process, I think there ought to
be a way of making that just one, which would be the big one containing
all the right paths. I don't think libxcursor should reload libx11 if
there's already a libx11 dynamically loaded.

Cheers
D
D
Danny Milosavljevic wrote on 4 Apr 12:14 +0200
Re: bug#54654: libx11 libxcursor handling - Problems with big cursors not working in Java and xterm
(address . 54654@debbugs.gnu.org)
20220404121430.3b71d39f@scratchpost.org
For future reference:

* See also bug# 54680 for a patch to xterm.
* See also bug# 54701 for a patch to openjdk.
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCgAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAmJKxQYACgkQ5xo1VCww
uqWU+wgAoW91HO8F6p5XUvs78O98ueLIEoUAoXfL2mR8RTjO+0HgvutZGk1zHolr
LgtDQoWnrgfj5S9+Wng5VHEtxu250ohDNK6IND8QjZt/sJ5WZMEBORzDFd/NABNr
IjjwjHVr3GecwdXEh5scujVGuhUJPlUpFaxUWqLG1RgzOd2ucC80lMTEnPXy2Fl4
tjQRugVYOdYuUrHkK96J/cU4wfyJFl207RWqd7Ruw/VauHZzMYY4ILS1fpiz7MuB
y7zFoatv3TPzZKW1CIlGJ0t9baJ5pZgNp7bgroYcngMevfQePqassPj4ijShQGt9
3rHFc8prKBY8/K9Ixt140Bwv7J8Mkw==
=0Wsw
-----END PGP SIGNATURE-----


D
D
Danny Milosavljevic wrote on 7 Apr 20:04 +0200
(address . 54654@debbugs.gnu.org)
20220407200403.4d9c8ade@scratchpost.org
On Thu, 31 Mar 2022 15:31:56 +0200
Danny Milosavljevic <dannym@scratchpost.org> wrote:

Toggle quote (2 lines)
> Possible alternative fixes:

d. Move the definitions of XCreateFontCursor and XCreatePixmapCursor to
libxcursor (i.e. delete their definitions from libx11 and create them
in libxcursor). Fix up now-failing packages such that they always add
-lxcursor to their linker flags.
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCgAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAmJPJ5MACgkQ5xo1VCww
uqWyYgf9Gn0MgI4YBsmTTr2lDG15usH+hlghDvffMDHHZAQQGgkTD2D+kIgOi+8n
Z9x7UchTXheSmBji+0FON+IA9V5gdtKSAnm83XbbDffIg91vNBoHi523ODt3iAsw
XfdZ0BnXsuuT2ss2QVXpsdd/ywsg+AP0r+cvTh2oK6UatUs38mux5xGtADw1GxNj
QQfLIa7EPS2JGoujEjPRmkbfFrvqzQL9BY4MjzmItpr0gGjJ+LoK79xIuBszQ++I
wxuUOggKOz+P0CxkV9CiOsqCNH9U/6qWvVdaqieyK/B474PlMhiA6GHRksl+hyR2
m5NK0DrSY24wC1hqploBk0ROulVL5A==
=wOiZ
-----END PGP SIGNATURE-----


D
D
Danny Milosavljevic wrote on 7 Apr 22:21 +0200
(address . 54654@debbugs.gnu.org)
20220407222146.3ea42405@scratchpost.org
The following package sources are also affected (i.e. they definitely use
XCreate.*Cursor, and have libx11 as direct input) on guix master (214 sources):

allegro-4.4.3.1
allegro-5.0.11
allegro-5.2.7.0
Aseprite-v1.1.7-Source.zip
awesome-4.3
blender-3.0.1
bochs-2.7
boinc-7.16.17-checkout
bsnes-115-checkout
bzflag-2.4.24
Cairo
carla-2.4.1-checkout
cgoban-1.9.14
chromium-98.0.4758.102
cl-sdl2-0.0.0-1.bb2aa2a-checkout
clutter-1.26.2
cwm-6.7
directfb-1.7.7-checkout
dmenu-5.1
dolphin-emu-5.0-13178.a34823d-checkout
drawterm-20210628-1.c97fe46-checkout
dwm-6.3
editres-1.0.7
edk2-20170116-1.13a50a6-checkout
efl-1.26.2
emacs-27.2
emacs-next-28.0.50-0.2ea3466-checkout
emacs-next-pgtk-28.0.50-1.ae18c8e-checkout
EMBOSS-6.5.7
evilwm-1.3.1
exim-4.95
fbida-2.14
feh-3.8
ffmpeg-2.8.18
firefox-78.15.0
fltk-1.3.6
fluida-lv2-0.6-checkout
fluxbox-1.3.7
fontforge-20190801
fontforge-20201107
fox-1.6.57
freeglut-2.8.1
freeglut-3.2.1
freerdp-2.2.0-checkout
fvwm-2.6.9
ghostscript-9.54.0
gifsicle-1.93
gimp-2.10.30
glfw-3.3.4
glimpse-0.2.0-checkout
gmic-3.0.0
gnuplot-5.4.2
godot-3.4.2-checkout
GraphicsMagick-1.3.36
graphviz-2.38.0-1.f54ac2c-checkout
graphviz-2.49.0
gr-framework-0.58.1-checkout
gromacs-2020.2
gtk+-2.24.33
gtk+-3.24.30
gtk-4.4.1
guile-emacs-0.0.0-0.41120e0-checkout
helm-0.9.0-checkout
herbstluftwm-0.9.3
higan-110-checkout
hwloc-1.11.12
hwloc-2.7.1
idesk-0.7.5
ImageMagick-6.9.12-4
imager
irrlicht-1.8.4
java-openjfx-build-8.202-checkout
jdk-0276cba45aac
jdk-11.0.13-ga
jdk-3cc80be736f2
jdk-6fa770f9f8ab
jgmenu-4.4.0-checkout
kitty-0.20.3-checkout
kodi-18.8-checkout
lesstif-0.95.2
libcaca-0.99.beta19
libreoffice-7.1.4.2
libresprite-1.0-checkout
libXcursor-1.2.0
libXmu-1.1.3
libXt-1.2.1
looking-glass-client-B5-checkout
lsp-plugins-1.1.26-checkout
lukesmithxyz-st-0.8.4-checkout
lush-2.0.1
lyx-2.3.6.1
mamba-2.1-checkout
marco-1.24.1
mlterm-3.9.1
mono-4.4.1
mpich-3.3.2
MPlayer-1.4
mpv-0.34.1-checkout
mupdf-1.19.0-source
mutter-41.0
netpbm-10.78.3-checkout
ngspice-36
nsxiv-27.1-checkout
ntk-1.3.1000-checkout
ois-1.5.1-checkout
oneko-1.2.sakura.5
openbox-3.6.1
opencpn-5.6.0-checkout
openjdk-13.0.7-checkout
openjdk-14.0.2-checkout
openjdk-15.0.3-checkout
openjdk-16.0.1-checkout
openjdk-17.0.1-checkout
openscenegraph-3.6.5-checkout
patchmatrix-0.16.0-checkout
pcb-4.0.2
pcb-rnd-2.2.4
pcsxr-6484236cb0281e8040ff6c8078c87899a3407534-checkout
petsc-3.16.1
plib-1.8.5
polyml-5.8.2-checkout
povray-3.7.0.8-checkout
psi-1.5
psi-plus-1.5.1484-checkout
qemu-4.1.0
qemu-6.2.0
qtbase-everywhere-src-5.15.2
qtbase-everywhere-src-6.1.1
qtwebengine-everywhere-src-5.15.2
R-4.1.2
ratpoison-1.4.9
redkite-1.3.1-checkout
retroarch-1.9.11-checkout
ring-project
rxvt-unicode-9.30
sawfish_1.12.0
scrot-1.7-checkout
SDL-1.2.15
SDL2-2.0.14
SDL2_image-2.0.5
sent-1.tar.gz
sfml-2.5.1-checkout
sherlock.lv2-0.24.0
slim-1.3.6
slock-1.4
slop-7.6-checkout
snd-20.9
Squeak-4.10.2.2614-src
st-0.8.5
stalin-0.11-checkout
stepmania-5.1.0-b2-checkout
SuperTuxKart-1.3-src
swi-prolog-8.3.20-checkout
sxiv-26-checkout
synergy-1.11.1-checkout
tcltk2
texlive-20210325-source
TeXmacs-2.1.1-src
TiMidity++-2.15.0
Tk-804.036
tk8.6.11
tklib-0.6
transset-1.0.2
trayer-srg-1.1.8-checkout
tvtime-1.0.11
twm-1.0.11
unclutter
utox-0.18.1-checkout
vim-8.2.4564-checkout
virtualgl-2.6.2-checkout
VTK-6.3.0
VTK-9.0.1
warsow-qfusion-2.5-1.c4de15d-checkout
WindowMaker-0.95.9
wine-6.6
wine-7.0
winit-0.19.5
winit-0.20.0-alpha6
winit-0.24.0
wmctrl-1.07
wolf-shaper-0.1.8-checkout
wolf-spectrum-1.0.0-checkout
wxGTK-2.8.12
wxPython-src-3.0.2.0
wxWidgets-3.0.5.1
wxwidgets-3.1.5-checkout
X11-1.10.2
xarcan-0.5.4-1.8e6ee02-checkout
xboard-4.9.1
xdotool-3.20211022.1
xf86-video-intel-2.99.917-18.31486f4-checkout
xfce4-taskmanager-1.4.2
xfe-1.44
xfig-3.2.8b
Xfoil
xfwm4-4.16.1
xkill-1.0.5
xlispstat-3.52.23-0.f1bea60-checkout
xlockmore-5.68
xmag-1.0.6
Xonotic
xorg-server-21.1.2
xournalpp-1.1.1-checkout
xprop-1.2.5
xscreensaver-5.45
xsecurelock-1.7.0
xsetroot-1.1.2
xshogi-1.4.2
xsnow-3.4.2
xst-0.8.4.1-checkout
xterm-370
xwd-1.0.8
xwininfo-1.1.5
zbar-0.23.90-checkout

Of those, only the following use Xcursor.h already (who knows what they use
it for--but at least it's there):

allegro-4.4.3.1
allegro-5.0.11
allegro-5.2.7.0
Aseprite-v1.1.7-Source.zip
carla-2.4.1-checkout
chromium-98.0.4758.102
efl-1.26.2
fltk-1.3.6 (explicit -lXcursor)
fontforge-20201107
fox-1.6.57 (explicit -lXcursor)
freerdp
fvwm-2.6.9 (explicit -lXcursor)
gimp-2.10.30
glfw-3.3.4
glimpse-0.2.0
godot-3.4.2
gr-framework-0.58.1-checkout (only explicit -lXcursor, no .h)
gtk+-2.24.33
gtk+-3.24.30
gtk-4.4.1
helm-0.9.0
irrlicht-1.8.4 (explicit -lXcursor)
kitty-0.20.3
libresprite-1.0-checkout
looking-glass-client-B5
marco-1.24.1
mutter-41.0
openbox-3.6.1
qtbase-everywhere-src-5.15.2
qtbase-everywhere-src-6.1.1
qtwebengine-everywhere-src-5.15.2
SDL2-2.0.14 (explicit -lXcursor)
SuperTuxKart-1.3-src (bundled irrlicht)
VTK-9.0.1
wine-6.6 (explicit -lXcursor)
wine-7.0 (explicit -lXcursor)
xf86-video-intel-2.99.917-18.31486f4-checkout
xsetroot-1.1.2

Of the former, Cairo is the most worrying.

Details attached.
Attachment: XCURSOR
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCgAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAmJPR9oACgkQ5xo1VCww
uqWGSwf/SNl4NQVybGpIX6LaZMbaiLSEcDtDsKuxVYg+gcIc9Q/pf7bt1WZ1dgB2
213OiquGUzrccoMwUNzOtHHu2yC1dBOCkkVH5Oa/52BDGinJLWeSGmDKzxNfmzFT
/mmqmJ2xGPAdwzBonH71DMl3bA0UkKf08ycNOz9M3QeEUsWAea4Nay/zarvP0CrN
CVy1POgH49TQd4OyNeZwyAQAg2kIKjLvK4+4vpRjCyTWKA19Sdhx1KZP9XXklQYB
sG/f56blZWkRr4sSO2rC1pmKhBgtVNd3065nXCFw9LUXCE+gwAOEfLZYC/R6bqcb
YhdF9ztzWz0g5Lvv0qXf4tVwwbwCEA==
=bHsc
-----END PGP SIGNATURE-----


?