GNU bug report logs - #54654
libx11 libxcursor handling - Problems with big cursors not working in Java and xterm

Previous Next

Package: guix;

Reported by: Danny Milosavljevic <dannym <at> scratchpost.org>

Date: Thu, 31 Mar 2022 13:33:02 UTC

Severity: normal

To reply to this bug, email your comments to 54654 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guix <at> gnu.org:
bug#54654; Package guix. (Thu, 31 Mar 2022 13:33:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Danny Milosavljevic <dannym <at> scratchpost.org>:
New bug report received and forwarded. Copy sent to bug-guix <at> gnu.org. (Thu, 31 Mar 2022 13:33:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: <bug-guix <at> gnu.org>
Subject: libx11 libxcursor handling - Problems with big cursors not working
 in Java and xterm
Date: Thu, 31 Mar 2022 15:31:56 +0200
[Message part 1 (text/plain, inline)]
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.
[libx11-xcursor-use-env-var.patch (text/x-patch, attachment)]
[Message part 3 (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#54654; Package guix. (Thu, 31 Mar 2022 17:34:02 GMT) Full text and rfc822 format available.

Message #8 received at 54654 <at> debbugs.gnu.org (full text, mbox):

From: dannym <at> scratchpost.org
To: 54654 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym <at> scratchpost.org>
Subject: [PATCH] gnu: openjdk15: Make big cursors work.
Date: Thu, 31 Mar 2022 19:13:11 +0200
From: Danny Milosavljevic <dannym <at> 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

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 <at> 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





Information forwarded to bug-guix <at> gnu.org:
bug#54654; Package guix. (Thu, 31 Mar 2022 20:04:02 GMT) Full text and rfc822 format available.

Message #11 received at 54654 <at> debbugs.gnu.org (full text, mbox):

From: dannym <at> scratchpost.org
To: 54654 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym <at> scratchpost.org>
Subject: [PATCH v2] gnu: openjdk15: Make big cursors work.
Date: Thu, 31 Mar 2022 22:03:23 +0200
From: Danny Milosavljevic <dannym <at> 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

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 <at> 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





Information forwarded to bug-guix <at> gnu.org:
bug#54654; Package guix. (Fri, 01 Apr 2022 06:17:01 GMT) Full text and rfc822 format available.

Message #14 received at 54654 <at> debbugs.gnu.org (full text, mbox):

From: Liliana Marie Prikler <liliana.prikler <at> ist.tugraz.at>
To: Danny Milosavljevic <dannym <at> scratchpost.org>, 54654 <at> debbugs.gnu.org
Subject: Re: libx11 libxcursor handling - Problems with big cursors not
 working in Java and xterm
Date: Fri, 01 Apr 2022 08:16:29 +0200
Am Donnerstag, dem 31.03.2022 um 15:31 +0200 schrieb Danny
Milosavljevic:
> [...]
> 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...

> 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





Information forwarded to bug-guix <at> gnu.org:
bug#54654; Package guix. (Mon, 04 Apr 2022 10:15:01 GMT) Full text and rfc822 format available.

Message #17 received at 54654 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 54654 <at> debbugs.gnu.org
Subject: Re: bug#54654: libx11 libxcursor handling - Problems with big
 cursors not working in Java and xterm
Date: Mon, 4 Apr 2022 12:14:30 +0200
[Message part 1 (text/plain, inline)]
For future reference: 

* See also bug# 54680 for a patch to xterm.
* See also bug# 54701 for a patch to openjdk.

[Message part 2 (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#54654; Package guix. (Thu, 07 Apr 2022 18:05:01 GMT) Full text and rfc822 format available.

Message #20 received at 54654 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 54654 <at> debbugs.gnu.org
Subject: Re: bug#54654: libx11 libxcursor handling - Problems with big
 cursors not working in Java and xterm
Date: Thu, 7 Apr 2022 20:04:03 +0200
[Message part 1 (text/plain, inline)]
On Thu, 31 Mar 2022 15:31:56 +0200
Danny Milosavljevic <dannym <at> scratchpost.org> wrote:

> 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.
[Message part 2 (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#54654; Package guix. (Thu, 07 Apr 2022 20:22:02 GMT) Full text and rfc822 format available.

Message #23 received at 54654 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 54654 <at> debbugs.gnu.org
Subject: Re: bug#54654: libx11 libxcursor handling - Problems with big
 cursors not working in Java and xterm
Date: Thu, 7 Apr 2022 22:21:46 +0200
[Message part 1 (text/plain, inline)]
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.
[XCURSOR (application/octet-stream, attachment)]
[Message part 3 (application/pgp-signature, inline)]

This bug report was last modified 2 years and 18 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.