Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mouse pointer disappearing #1811

Open
L-U-T-i opened this issue Aug 18, 2024 · 18 comments
Open

Mouse pointer disappearing #1811

L-U-T-i opened this issue Aug 18, 2024 · 18 comments

Comments

@L-U-T-i
Copy link

L-U-T-i commented Aug 18, 2024

Describe the bug
I am noticing recently (some months now, I guess - don't remember to see it in 1.13) that from time to time, with no apparent reason (usually when a new window is opened or so... - maybe when the cursor shape should change?), the mouse pointer (cursor) just disappears. It seems it is still there (I can for instance see a change of buttons when mouse over, select some text or even move a window, if lucky to "catch" it without seeing the exact cursor position), it is just not displayed (invisible). In RealVNC viewer, at the same moment, just a small dot cursor is shown, so I guess the source is on the server side.

To Reproduce
No obvious way to reproduce - seems to happen sporadically...

Expected behavior
Mouse pointer (cursor) is displayed, as on the normal desktop (never noticed that out of vncviewer, so I guess it is not Mate Desktop to be blamed for.

Screenshots
I'll try to make some screenshots when it reappears.

Client (please complete the following information):

  • Rocky Linux 9.4 (with all updates)
  • VNC client: TigerVNC
  • VNC client version: 1.14.0 (release) / 1.40.80 (git 242488d - 14.8.2024)
  • Client downloaded from: custom builds, based on EPEL / Fedora packages

Server (please complete the following information):

  • Rocky Linux 9.4 (with all updates)
  • VNC server: TigerVNC
  • VNC server version: 1.14.0 (release) / 1.40.80 (git 242488d - 14.8.2024)
  • Server downloaded from: custom builds, based on EPEL / Fedora packages
  • Server was started using: systemd ('/usr/libexec/vncsession-start %i')

Additional context
As said, it seems the server sends something causing TigerVNC to not display the cursor at all, while RealVNC viewer displays it as a small dot only. It lasts some time (some seconds) or maybe until I made a few clicks (still trying to find a pattern...), after everything works as supposed to (until next occasion). While "invisible", the shape should also change (standard cursor / select text / resize a window / move a window...), but this doesn't make the cursor to reappear (until - after a while it suddenly does...).

@CendioOssman
Copy link
Member

Since you're seeing in RealVNC as well, it seems likely to be a server-side issue. Unfortunately, the most likely explanation is that your desktop environment/applications are simply setting a blank cursor.

Could you test with an older build of TigerVNC?

It will be difficult to resolve this without a good way to reproduce it, unfortunately.

@L-U-T-i
Copy link
Author

L-U-T-i commented Aug 20, 2024

I doubt that my desktop (most recent Mate Desktop 1.28) or included apps (noticed it with Mate Desktop's caja, pluma or terminal only, as much as I remember) are setting a blank cursor, because I would notice it also without VNC (I am using the same versions on 1 physical PC and 2 notebooks much more time as on server over VNC, and never ever noticed it).

I've downgraded to tigervnc-1.13.1-11.1 (direct fc39 rebuild for rhel 9) on one server to see what happens.

@L-U-T-i
Copy link
Author

L-U-T-i commented Aug 20, 2024

What I've noticed it that once the cursor disappears, it doesn't reapper at the first occurence where it should change the shape, or next few after (for instance while moving over the text area, on the edge of the window or so...). Also it doesn't reapper after the first mouse click (or, the next few). But, suddenly at one moment, it is back.

I absolutely can't find a pattern...

@CendioOssman
Copy link
Member

Many applications often set a blank cursor, so that is not particularly rare. Commonly, when you are typing something.

How did the test go with an earlier version of TigerVNC? And could you test with the TigerVNC that's included in RHEL? That would help us see if it's a build issue or something else.

@L-U-T-i
Copy link
Author

L-U-T-i commented Aug 31, 2024

I haven't spent very much time on a test server (where I've downgraded tigervnc to 1.13.1, as above) in last 2 weeks, but haven't noticed anything such since then. So, I guess something was introduced in between causing that.

And no, it was not happening during write or so, but mainly while opening a new window (like mate desktop's own text editor pluma or file browser caja or terminal, as much as I remember) or switching from one window to another. I am normally not noticing any pointer disappearing during that (on normal login or older vnc sessions), maybe just a cursor shape change or so (or not even that).

My recent builds include PR #1672 (Scale remote screen to window (X11)) and PR #1785 (h264: Use consistent size of scaling buffer), but I don't believe those introduce anything that could lead to that.

@L-U-T-i
Copy link
Author

L-U-T-i commented Aug 31, 2024

I don't think the last Rocky (RHEL) 1.13.1-1 build is significantly different, in particular since also newer Fedora rebuilt 1.13.1-11 doesn't seem to have this issue...

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 5, 2024

Just happened again on the server with the latest version built 1.40.80 (git 242488d - 14.8.2024) after right clicking a text file in caja and choosing "Open with pluma".

On 1.13 server haven't noticed that yet, despite working quite a lot there in last few days! So it most probably has to be something related to cursors introduced after 1.13...

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 15, 2024

I am testing commit f5ac658 now, and haven't noticed this issue yet. Before, I've tested commit 4812f13, and the issue was already present. I suspect this issue might be introduced with commit 858a859 (Jun 19).

Any clue, which one of 14 commits (or more of them) of PR #1769 should I try to revert to resolve it?

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 20, 2024

It seems this issue appears after commit f5ac658 (this build seems to be the last working well - without this issue).

By the way, why are commits first listed separately - from Detect conflicting timer rescheduling to Slow down fake clock when no clients - and again after that as Merge branch 'present' of github.com:CendioOssman/tigervnc? Isn't that a bit confusing?

Anyhow, I've found out in between that the cursor is invisible when it should be the "waiting" one (a kind of rotating whatever it is - for example when caja is waiting tor something to finish) - like immediately after login, before the background is painted and caja folder browser windows and other things being restored. And, it seems sometimes the standard (arrow) corsor is not back immediately when it should be, but after some (random ?) delay.

I've tried to revert just commit Avoid patching miinitext.c for Xvnc for the latest code. Build went well (no errors), but vncserver service can not be launched (vnc server seems to be crashing immediately at start).

@CendioOssman
Copy link
Member

By the way, why are commits first listed separately - from Detect conflicting timer rescheduling to Slow down fake clock when no clients - and again after that as Merge branch 'present' of github.com:CendioOssman/tigervnc? Isn't that a bit confusing?

That's just how GitHub presents things. History in git is not linear, but has branches with parallel development. Unfortunately, GitHub does not show this clearly in their commit lists.

I've tried to revert just commit Avoid patching miinitext.c for Xvnc for the latest code. Build went well (no errors), but vncserver service can not be launched (vnc server seems to be crashing immediately at start).

A crash is not expected after reverting that. Just note that it changes the patch files, so you cannot just do make after reverting that. You need to go through the full range of steps with patching a clean Xorg tree.

Are you familiar with git bisect? It's the best tool in a setup like this. It automates finding the commit that broke things.

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 20, 2024

Thank you for the feedback, CendioOssman .

I've expected that it is how git works, but haven't noticed such a behavior in other repos yet (usually there are more clear PRs without separate commits...). Anyhow, I've discovered there are substantial differences comparing the last separate commit (as Slow down fake clock when no clients) and a complete branch merge (as Merge branch 'present' of github.com:CendioOssman/tigervnc), the second one being OK, while the separate commits seem to revert the whole tree for a bunch of other commits back...

Based on that, I've finally managed to create a patch:

diff -Nupr a/unix/xserver/configure.ac b/unix/xserver/configure.ac
--- a/unix/xserver/configure.ac	2024-09-20 03:32:43.612182841 +0200
+++ b/unix/xserver/configure.ac	2024-09-20 11:57:13.882513764 +0200
@@ -1743,6 +1743,7 @@ if test "x$XVFB" = xyes; then
 fi
 
 dnl Xvnc DDX
+AC_SUBST([XVNC_CPPFLAGS], ["-DHAVE_DIX_CONFIG_H $XSERVER_CFLAGS"])
 AC_SUBST([XVNC_LIBS], ["$FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $MAIN_LIB"])
 AC_SUBST([XVNC_SYS_LIBS], ["$GLX_SYS_LIBS"])
 
@@ -1790,6 +1791,8 @@ if test "x$XORG" = xauto; then
 fi
 AC_MSG_RESULT([$XORG])
 
+AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
+
 if test "x$XORG" = xyes; then
 	XORG_DDXINCS='-I$(top_srcdir)/hw/xfree86 -I$(top_srcdir)/hw/xfree86/include -I$(top_srcdir)/hw/xfree86/common'
 	XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os'
@@ -2004,7 +2007,6 @@ if test "x$XORG" = xyes; then
 	AC_DEFINE(XORG_SERVER, 1, [Building Xorg server])
 	AC_DEFINE(XORGSERVER, 1, [Building Xorg server])
 	AC_DEFINE(XFree86Server, 1, [Building XFree86 server])
-	AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
 	AC_DEFINE(NEED_XF86_TYPES, 1, [Need XFree86 typedefs])
 	AC_DEFINE(NEED_XF86_PROTOTYPES, 1, [Need XFree86 helper functions])
 	AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server])
diff -Nupr a/unix/xserver/hw/vnc/Makefile.am b/unix/xserver/hw/vnc/Makefile.am
--- a/unix/xserver/hw/vnc/Makefile.am	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver/hw/vnc/Makefile.am	2024-09-20 12:07:14.446541078 +0200
@@ -8,11 +8,7 @@ NETWORK_LIB=$(TIGERVNC_BUILDDIR)/common/
 UNIXCOMMON_LIB=$(TIGERVNC_BUILDDIR)/unix/common/libunixcommon.la
 COMMON_LIBS=$(NETWORK_LIB) $(RFB_LIB) $(RDR_LIB) $(OS_LIB) $(UNIXCOMMON_LIB)
 
-AM_CPPFLAGS = \
-	-I$(TIGERVNC_BUILDDIR) \
-	-I$(TIGERVNC_SRCDIR)/common \
-	-I$(TIGERVNC_SRCDIR)/unix/common \
-	$(DIX_CFLAGS) $(LIBXCVT_CFLAGS)
+AM_CPPFLAGS = $(LIBXCVT_CFLAGS)
 
 AM_CXXFLAGS = -std=gnu++11
 
@@ -28,8 +24,10 @@ libvnccommon_la_SOURCES = $(HDRS) \
 	vncBlockHandler.c XorgGlue.c RandrGlue.c RFBGlue.cc XserverDesktop.cc \
 	vncInput.c vncInputXKB.c qnum_to_xorgevdev.c qnum_to_xorgkbd.c
 
-libvnccommon_la_CPPFLAGS = $(AM_CPPFLAGS) \
-	-I$(TIGERVNC_SRCDIR)/unix/vncconfig
+libvnccommon_la_CPPFLAGS = -DVENDOR_RELEASE="$(VENDOR_RELEASE)" -I$(TIGERVNC_SRCDIR)/unix/common \
+	-DVENDOR_STRING="\"$(VENDOR_STRING)\"" -I$(TIGERVNC_SRCDIR)/common -UHAVE_CONFIG_H \
+	-I$(TIGERVNC_SRCDIR)/unix/vncconfig $(XVNC_CPPFLAGS) ${XSERVERLIBS_CFLAGS} \
+	-I$(top_srcdir)/include
 
 bin_PROGRAMS = Xvnc
 
@@ -37,14 +35,18 @@ man1_MANS = Xvnc.man
 
 Xvnc_SOURCES = xvnc.c \
 	$(top_srcdir)/Xi/stubs.c $(top_srcdir)/mi/miinitext.c \
-	buildtime.c
+	$(top_srcdir)/fb/fbcmap_mi.c buildtime.c
 
 # Xvnc contains no C++ sources so automake doesn't understand that we
 # need to use the C++ compiler to link things. This is the upstream
 # recommendation for coaxing automake.
 nodist_EXTRA_Xvnc_SOURCES = dummy.cxx
 
-Xvnc_CPPFLAGS = $(AM_CPPFLAGS)
+Xvnc_CPPFLAGS = $(XVNC_CPPFLAGS) -DTIGERVNC -DNO_MODULE_EXTS \
+	-UHAVE_CONFIG_H \
+	-DXFree86Server -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \
+	-DVENDOR_STRING="\"$(VENDOR_STRING)\"" -I$(TIGERVNC_SRCDIR)/common -I$(TIGERVNC_SRCDIR)/unix/common \
+	-I$(top_srcdir)/include ${XSERVERLIBS_CFLAGS} $(AM_CPPFLAGS)
 
 LOCAL_LIBS = \
 	$(XVNC_LIBS) \
@@ -57,7 +59,7 @@ Xvnc_LDADD = \
 	$(LOCAL_LIBS) \
 	$(XSERVER_SYS_LIBS) \
 	$(XVNC_SYS_LIBS) \
-	$(LIBXCVT_LIBS)
+	$(LIBXCVT_LIBS) -lX11
 
 Xvnc_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
 
@@ -77,10 +79,13 @@ libvnc_la_SOURCES = vncModule.c
 # See Xvnc magic above
 nodist_EXTRA_libvnc_la_SOURCES = dummy.cxx
 
-libvnc_la_CPPFLAGS = $(AM_CPPFLAGS) \
+libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I$(TIGERVNC_SRCDIR)/common -UHAVE_CONFIG_H \
+	-I$(TIGERVNC_SRCDIR)/unix/common \
 	-I$(top_srcdir)/hw/xfree86/common \
 	-I$(top_srcdir)/hw/xfree86/os-support \
-	-I$(top_srcdir)/hw/xfree86/os-support/bus
+	-I$(top_srcdir)/hw/xfree86/os-support/bus \
+	-I$(top_srcdir)/include \
+	${XSERVERLIBS_CFLAGS}
 
 libvnc_la_LDFLAGS = -module -avoid-version -Wl,-z,now
 
diff -Nupr a/unix/xserver/hw/vnc/vncModule.c b/unix/xserver/hw/vnc/vncModule.c
--- a/unix/xserver/hw/vnc/vncModule.c	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver/hw/vnc/vncModule.c	2024-09-20 12:08:12.519930775 +0200
@@ -53,7 +53,7 @@ static XF86ModuleVersionInfo vncVersRec
     "TigerVNC Project",
     MODINFOSTRING1,
     MODINFOSTRING2,
-    VENDOR_RELEASE,
+    XORG_VERSION_CURRENT,
     1, 0, 0,
     ABI_CLASS_EXTENSION,         /* needs the server extension ABI */
     ABI_EXTENSION_VERSION,
diff -Nupr a/unix/xserver/hw/vnc/xorg-version.h b/unix/xserver/hw/vnc/xorg-version.h
--- a/unix/xserver/hw/vnc/xorg-version.h	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver/hw/vnc/xorg-version.h	2024-09-20 12:09:38.492507695 +0200
@@ -24,12 +24,10 @@
 #include <dix-config.h>
 #endif
 
-#include <version-config.h>
-
 #define XORG_AT_LEAST(major, minor, patch) \
-    (VENDOR_RELEASE >= ((major * 10000000) + (minor * 100000) + (patch * 1000)))
+    (XORG_VERSION_CURRENT >= ((major * 10000000) + (minor * 100000) + (patch * 1000)))
 #define XORG_OLDER_THAN(major, minor, patch) \
-    (VENDOR_RELEASE < ((major * 10000000) + (minor * 100000) + (patch * 1000)))
+    (XORG_VERSION_CURRENT < ((major * 10000000) + (minor * 100000) + (patch * 1000)))
 
 #if XORG_OLDER_THAN(1, 16, 0)
 #error "X.Org older than 1.16 is not supported"
diff -Nupr a/unix/xserver/hw/vnc/xvnc.c b/unix/xserver/hw/vnc/xvnc.c
--- a/unix/xserver/hw/vnc/xvnc.c	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver/hw/vnc/xvnc.c	2024-09-20 12:15:22.129813644 +0200
@@ -71,6 +71,8 @@ from the X Consortium.
 #include <X11/keysym.h>
 extern char buildtime[];
 
+#undef VENDOR_RELEASE
+#undef VENDOR_STRING
 #include "version-config.h"
 
 #define XVNCVERSION "TigerVNC 1.14.80"
@@ -1152,17 +1154,14 @@ vncClientStateChange(CallbackListPtr *a,
 #ifdef GLXEXT
 #if XORG_OLDER_THAN(1, 20, 0)
 extern void GlxExtensionInit(void);
-#endif
-#endif
 
-static const ExtensionModule vncExtensions[] = {
-    {vncExtensionInit, "TIGERVNC", NULL},
-#ifdef GLXEXT
-#if XORG_OLDER_THAN(1, 20, 0)
-    { GlxExtensionInit, "GLX", &noGlxExtension },
+static ExtensionModule glxExt = {
++    GlxExtensionInit,
+    "GLX",
+    &noGlxExtension
+};
 #endif
 #endif
-};
 
 void
 InitOutput(ScreenInfo * scrInfo, int argc, char **argv)
@@ -1172,11 +1171,15 @@ InitOutput(ScreenInfo * scrInfo, int arg
 
     vncPrintBanner();
 
-    if (serverGeneration == 1)
-        LoadExtensionList(vncExtensions, ARRAY_SIZE(vncExtensions), TRUE);
-
 #if XORG_AT_LEAST(1, 20, 0)
     xorgGlxCreateVendor();
+#else
+
+#ifdef GLXEXT
+    if (serverGeneration == 1)
+        LoadExtensionList(&glxExt, 1, TRUE);
+#endif
+
 #endif
 
     /* initialize pixmap formats */
diff -Nupr a/unix/xserver/mi/miinitext.c b/unix/xserver/mi/miinitext.c
--- a/unix/xserver/mi/miinitext.c	2024-09-20 03:32:43.570182561 +0200
+++ b/unix/xserver/mi/miinitext.c	2024-09-20 12:18:21.266015738 +0200
@@ -107,8 +107,15 @@ SOFTWARE.
 #include "os.h"
 #include "globals.h"
 
+#ifdef TIGERVNC
+extern void vncExtensionInit(void);
+#endif
+
 /* List of built-in (statically linked) extensions */
 static const ExtensionModule staticExtensions[] = {
+#ifdef TIGERVNC
+    {vncExtensionInit, "TIGERVNC", NULL},
+#endif
     {GEExtensionInit, "Generic Event Extension", &noGEExtension},
     {ShapeExtensionInit, "SHAPE", NULL},
 #ifdef MITSHM
diff -Nupr a/unix/xserver120.patch b/unix/xserver120.patch
--- a/unix/xserver120.patch	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver120.patch	2024-09-20 12:29:49.380636432 +0200
@@ -10,11 +10,12 @@ index 0909cc5b4..c01873200 100644
  AC_PROG_LN_S
  LT_PREREQ([2.2])
  LT_INIT([disable-static win32-dll])
-@@ -1735,6 +1736,19 @@ if test "x$XVFB" = xyes; then
+@@ -1735,6 +1736,20 @@ if test "x$XVFB" = xyes; then
  	AC_SUBST([XVFB_SYS_LIBS])
  fi
  
 +dnl Xvnc DDX
++AC_SUBST([XVNC_CPPFLAGS], ["-DHAVE_DIX_CONFIG_H $XSERVER_CFLAGS"])
 +AC_SUBST([XVNC_LIBS], ["$FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $MAIN_LIB"])
 +AC_SUBST([XVNC_SYS_LIBS], ["$GLX_SYS_LIBS"])
 +
@@ -30,6 +31,23 @@ index 0909cc5b4..c01873200 100644
  
  dnl Xnest DDX
  
+@@ -1812,6 +1817,8 @@ if test "x$XORG" = xauto; then
+ fi
+ AC_MSG_RESULT([$XORG])
+ 
++AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
++
+ if test "x$XORG" = xyes; then
+ 	XORG_DDXINCS='-I$(top_srcdir)/hw/xfree86 -I$(top_srcdir)/hw/xfree86/include -I$(top_srcdir)/hw/xfree86/common'
+ 	XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os'
+@@ -2029,7 +2036,6 @@ if test "x$XORG" = xyes; then
+ 	AC_DEFINE(XORG_SERVER, 1, [Building Xorg server])
+ 	AC_DEFINE(XORGSERVER, 1, [Building Xorg server])
+ 	AC_DEFINE(XFree86Server, 1, [Building XFree86 server])
+-	AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
+ 	AC_DEFINE(NEED_XF86_TYPES, 1, [Need XFree86 typedefs])
+ 	AC_DEFINE(NEED_XF86_PROTOTYPES, 1, [Need XFree86 helper functions])
+ 	AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server])
 @@ -2058,7 +2067,6 @@ if test "x$GLAMOR" = xyes; then
  			 [AC_DEFINE(GLAMOR_HAS_EGL_QUERY_DRIVER, 1, [Have GLAMOR_HAS_EGL_QUERY_DRIVER])],
  			 [])
@@ -127,6 +145,26 @@ index 19895dc77..3ecfa8b7a 100644
  	$(AM_V_at)for i in $(SUBDIRS) ; do $(MAKE) -C $$i relink || exit 1 ; done
 +
 +SUBDIRS += vnc
+Index: b/mi/miinitext.c
+===================================================================
+--- a/mi/miinitext.c
++++ b/mi/miinitext.c
+@@ -107,8 +107,15 @@ SOFTWARE.
+ #include "os.h"
+ #include "globals.h"
+ 
++#ifdef TIGERVNC
++extern void vncExtensionInit(void);
++#endif
++
+ /* List of built-in (statically linked) extensions */
+ static const ExtensionModule staticExtensions[] = {
++#ifdef TIGERVNC
++    {vncExtensionInit, "TIGERVNC", NULL},
++#endif
+     {GEExtensionInit, "Generic Event Extension", &noGEExtension},
+     {ShapeExtensionInit, "SHAPE", NULL},
+ #ifdef MITSHM
 diff --git a/include/dix-config.h.in b/include/dix-config.h.in
 index f8fc67067..d53c4e72f 100644
 --- a/include/dix-config.h.in
diff -Nupr a/unix/xserver21.patch b/unix/xserver21.patch
--- a/unix/xserver21.patch	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver21.patch	2024-09-20 12:35:22.454873056 +0200
@@ -10,11 +10,12 @@ index fad7b5769..2c167de3d 100644
  AC_PROG_LN_S
  LT_PREREQ([2.2])
  LT_INIT([disable-static win32-dll])
-@@ -1720,6 +1721,19 @@ if test "x$XVFB" = xyes; then
+@@ -1720,6 +1721,20 @@ if test "x$XVFB" = xyes; then
  	AC_SUBST([XVFB_SYS_LIBS])
  fi
  
 +dnl Xvnc DDX
++AC_SUBST([XVNC_CPPFLAGS], ["-DHAVE_DIX_CONFIG_H $XSERVER_CFLAGS"])
 +AC_SUBST([XVNC_LIBS], ["$FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $MAIN_LIB"])
 +AC_SUBST([XVNC_SYS_LIBS], ["$GLX_SYS_LIBS"])
 +
@@ -30,6 +31,23 @@ index fad7b5769..2c167de3d 100644
  
  dnl Xnest DDX
  
+@@ -1812,6 +1817,8 @@ if test "x$XORG" = xauto; then
+ fi
+ AC_MSG_RESULT([$XORG])
+ 
++AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
++
+ if test "x$XORG" = xyes; then
+ 	XORG_DDXINCS='-I$(top_srcdir)/hw/xfree86 -I$(top_srcdir)/hw/xfree86/include -I$(top_srcdir)/hw/xfree86/common'
+ 	XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os'
+@@ -2029,7 +2036,6 @@ if test "x$XORG" = xyes; then
+ 	AC_DEFINE(XORG_SERVER, 1, [Building Xorg server])
+ 	AC_DEFINE(XORGSERVER, 1, [Building Xorg server])
+ 	AC_DEFINE(XFree86Server, 1, [Building XFree86 server])
+-	AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
+ 	AC_DEFINE(NEED_XF86_TYPES, 1, [Need XFree86 typedefs])
+ 	AC_DEFINE(NEED_XF86_PROTOTYPES, 1, [Need XFree86 helper functions])
+ 	AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server])
 @@ -2038,7 +2047,6 @@ if test "x$GLAMOR" = xyes; then
  			 [AC_DEFINE(GLAMOR_HAS_EGL_QUERY_DRIVER, 1, [Have GLAMOR_HAS_EGL_QUERY_DRIVER])],
  			 [])
@@ -56,6 +74,25 @@ index 1749018fa..1172cd59b 100644
  	$(AM_V_at)for i in $(SUBDIRS) ; do $(MAKE) -C $$i relink || exit 1 ; done
 +
 +SUBDIRS += vnc
+diff -urpN a/mi/miinitext.c b/mi/miinitext.c
+--- a/mi/miinitext.c	2018-05-10 09:32:37.000000000 -0700
++++ b/mi/miinitext.c	2018-06-13 19:05:14.742200675 -0700
+@@ -107,8 +107,15 @@ SOFTWARE.
+ #include "os.h"
+ #include "globals.h"
+ 
++#ifdef TIGERVNC
++extern void vncExtensionInit(void);
++#endif
++
+ /* List of built-in (statically linked) extensions */
+ static const ExtensionModule staticExtensions[] = {
++#ifdef TIGERVNC
++    {vncExtensionInit, "TIGERVNC", NULL},
++#endif
+     {GEExtensionInit, "Generic Event Extension", &noGEExtension},
+     {ShapeExtensionInit, "SHAPE", NULL},
+ #ifdef MITSHM
 diff --git a/include/dix-config.h.in b/include/dix-config.h.in
 index 382d70609..04a4fd263 100644
 --- a/include/dix-config.h.in

with which I expect to effectively revert the whole Merge branch 'xserver-cleanup'. I've done it manually editing the files of the latest git commit Filter duplicate server history entries, based on the '-Nupr' diff between Merge branch 'xserver-cleanup' and Merge branch 'present' of github.com:CendioOssman/tigervnc.

Build went fine, and vncserver (the latest Filter duplicate server history entries from Sep 6, 2024) now seems to work as expected (also the "waiting" cursor is back, and haven't noticed any other issues by now).

I guess the actual patch (a part of the code reverted) could be much smaller (what would also be better to get as much of the benefits of this commit possible). Can you suggest what to try (which part does actually anything to do with cursors...)?

And no, I am a complete noob about git (know just how to get a complete tree for certain commit and how to get patches...). It is the first time I even hear about git bisect... ;-)

@CendioOssman
Copy link
Member

Nothing in that change is obvious, unfortunately, so it is still interesting to pinpoint the trigger more precisely.

I would suggest reverting individual commits from #1770 until you see which commit seems to trigger the problem. You can either do this by hand, or try to let git bisect help you out.

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 24, 2024

It seems commit #662676e - Avoid patching miinitext.c for Xvnc is the culprit.

Considering Raise Xorg requirement to 1.20+ remains, I've "optimized" the reverted patch to also completely remove the code for #if XORG_OLDER_THAN(1, 20, 0) (including the part which you seem to miss in cleanup - in unix/xserver/hw/vnc/xvnc.c, lines 150÷171; I know this should be a separate commit, but I've tried to make it simple for testing...).

I've most recently successfully rebuilt the commit 2fe9dca with the following patch:

diff -Nupr a/unix/xserver/hw/vnc/Makefile.am b/unix/xserver/hw/vnc/Makefile.am
--- a/unix/xserver/hw/vnc/Makefile.am	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver/hw/vnc/Makefile.am	2024-09-20 12:07:14.446541078 +0200
@@ -44,7 +44,7 @@ Xvnc_SOURCES = xvnc.c \
 # recommendation for coaxing automake.
 nodist_EXTRA_Xvnc_SOURCES = dummy.cxx
 
-Xvnc_CPPFLAGS = $(AM_CPPFLAGS)
+Xvnc_CPPFLAGS = $(AM_CPPFLAGS) -DTIGERVNC
 
 LOCAL_LIBS = \
 	$(XVNC_LIBS) \
diff -Nupr a/unix/xserver/hw/vnc/xvnc.c b/unix/xserver/hw/vnc/xvnc.c
--- a/unix/xserver/hw/vnc/xvnc.c	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver/hw/vnc/xvnc.c	2024-09-24 09:42:02.228009395 +0200
@@ -147,28 +147,6 @@ vncBitsPerPixel(int depth)
 
 static void vncFreeFramebufferMemory(VncFramebufferInfoPtr pfb);
 
-#ifdef DPMSExtension
-#if XORG_OLDER_THAN(1, 20, 0)
-    /* Why support DPMS? Because stupid modern desktop environments
-       such as Unity 2D on Ubuntu 11.10 crashes if DPMS is not
-       available. (DPMSSet is called by dpms.c, but the return value
-       is ignored.) */
-int
-DPMSSet(ClientPtr client, int level)
-{
-    return Success;
-}
-
-Bool
-DPMSSupported(void)
-{
-    /* Causes DPMSCapable to return false, meaning no devices are DPMS
-       capable */
-    return FALSE;
-}
-#endif
-#endif
-
 void
 ddxGiveUp(enum ExitCode error)
 {
@@ -1149,21 +1127,6 @@ vncClientStateChange(CallbackListPtr *a,
     }
 }
 
-#ifdef GLXEXT
-#if XORG_OLDER_THAN(1, 20, 0)
-extern void GlxExtensionInit(void);
-#endif
-#endif
-
-static const ExtensionModule vncExtensions[] = {
-    {vncExtensionInit, "TIGERVNC", NULL},
-#ifdef GLXEXT
-#if XORG_OLDER_THAN(1, 20, 0)
-    { GlxExtensionInit, "GLX", &noGlxExtension },
-#endif
-#endif
-};
-
 void
 InitOutput(ScreenInfo * scrInfo, int argc, char **argv)
 {
@@ -1172,12 +1135,7 @@ InitOutput(ScreenInfo * scrInfo, int arg
 
     vncPrintBanner();
 
-    if (serverGeneration == 1)
-        LoadExtensionList(vncExtensions, ARRAY_SIZE(vncExtensions), TRUE);
-
-#if XORG_AT_LEAST(1, 20, 0)
     xorgGlxCreateVendor();
-#endif
 
     /* initialize pixmap formats */
 
diff -Nupr a/unix/xserver/mi/miinitext.c b/unix/xserver/mi/miinitext.c
--- a/unix/xserver/mi/miinitext.c	2024-09-20 03:32:43.570182561 +0200
+++ b/unix/xserver/mi/miinitext.c	2024-09-20 12:18:21.266015738 +0200
@@ -107,8 +107,15 @@ SOFTWARE.
 #include "os.h"
 #include "globals.h"
 
+#ifdef TIGERVNC
+extern void vncExtensionInit(void);
+#endif
+
 /* List of built-in (statically linked) extensions */
 static const ExtensionModule staticExtensions[] = {
+#ifdef TIGERVNC
+    {vncExtensionInit, "TIGERVNC", NULL},
+#endif
     {GEExtensionInit, "Generic Event Extension", &noGEExtension},
     {ShapeExtensionInit, "SHAPE", NULL},
 #ifdef MITSHM
diff -Nupr a/unix/xserver120.patch b/unix/xserver120.patch
--- a/unix/xserver120.patch	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver120.patch	2024-09-20 12:29:49.380636432 +0200
@@ -127,6 +127,26 @@ index 19895dc77..3ecfa8b7a 100644
  	$(AM_V_at)for i in $(SUBDIRS) ; do $(MAKE) -C $$i relink || exit 1 ; done
 +
 +SUBDIRS += vnc
+Index: b/mi/miinitext.c
+===================================================================
+--- a/mi/miinitext.c
++++ b/mi/miinitext.c
+@@ -107,8 +107,15 @@ SOFTWARE.
+ #include "os.h"
+ #include "globals.h"
+ 
++#ifdef TIGERVNC
++extern void vncExtensionInit(void);
++#endif
++
+ /* List of built-in (statically linked) extensions */
+ static const ExtensionModule staticExtensions[] = {
++#ifdef TIGERVNC
++    {vncExtensionInit, "TIGERVNC", NULL},
++#endif
+     {GEExtensionInit, "Generic Event Extension", &noGEExtension},
+     {ShapeExtensionInit, "SHAPE", NULL},
+ #ifdef MITSHM
 diff --git a/include/dix-config.h.in b/include/dix-config.h.in
 index f8fc67067..d53c4e72f 100644
 --- a/include/dix-config.h.in
diff -Nupr a/unix/xserver21.patch b/unix/xserver21.patch
--- a/unix/xserver21.patch	2024-09-06 17:14:52.000000000 +0200
+++ b/unix/xserver21.patch	2024-09-20 12:35:22.454873056 +0200
@@ -56,6 +56,25 @@ index 1749018fa..1172cd59b 100644
  	$(AM_V_at)for i in $(SUBDIRS) ; do $(MAKE) -C $$i relink || exit 1 ; done
 +
 +SUBDIRS += vnc
+diff -urpN a/mi/miinitext.c b/mi/miinitext.c
+--- a/mi/miinitext.c	2018-05-10 09:32:37.000000000 -0700
++++ b/mi/miinitext.c	2018-06-13 19:05:14.742200675 -0700
+@@ -107,8 +107,15 @@ SOFTWARE.
+ #include "os.h"
+ #include "globals.h"
+ 
++#ifdef TIGERVNC
++extern void vncExtensionInit(void);
++#endif
++
+ /* List of built-in (statically linked) extensions */
+ static const ExtensionModule staticExtensions[] = {
++#ifdef TIGERVNC
++    {vncExtensionInit, "TIGERVNC", NULL},
++#endif
+     {GEExtensionInit, "Generic Event Extension", &noGEExtension},
+     {ShapeExtensionInit, "SHAPE", NULL},
+ #ifdef MITSHM
 diff --git a/include/dix-config.h.in b/include/dix-config.h.in
 index 382d70609..04a4fd263 100644
 --- a/include/dix-config.h.in

and everything seems to work fine by now.

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 24, 2024

I'm not sure however weather the parts of the patch modifying unix/xserver120.patch and unix/xserver21.patch are actually needed, considering unix/xserver/mi/miinitext.c shall already include the lines to be added with those 2 patches - as above. It seems to me those 2 patches are actually not applied in my case during the build process (as they should obviously fail, or?). But I don't know the purpose of those 2 patches, so...

@CendioOssman
Copy link
Member

It sounds like you are not doing a full rebuild in that case, which unfortunately casts doubt on previous test results. You need to completely remove the entire xserver tree between each test, or you might be seeing effects from previous test builds.

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 27, 2024

I'm not sure I understand what you mean...

I am building in the following way:

  1. I get the source file (the latest commit) from github: wget https://github.com/TigerVNC/tigervnc/archive/704f9724d8af58314c4fafc8930666bb2be46722.tar.gz -O tigervnc-704f9724d8af58314c4fafc8930666bb2be46722.tar.gz which I unpack ('%setup -q %{!?rel_build:-n %{name}-%{commit}}' in my .spec file
  2. I apply the patches as before this patch (tigervnc-vncsession-restore-script-systemd-service.patch and tigervnc-1.14.80-pr-1672.patch)
  3. To resolve this issue, I apply at the end this patch (as above)

Why would this not be a full rebuild (or, what would need to be fulfilled to be considered as such)?

@L-U-T-i
Copy link
Author

L-U-T-i commented Sep 27, 2024

I am building rpm with a slightly modified .spec file (based on yours and Fedora one) in mock chroot.

@OmarJay1
Copy link

I'm not sure if this is the same issue, but maybe it's relevant. My pointer was disappearing on the Windows Viewer viewing a Mac Mini. I also noticed that things were really slow, so I switched wallpaper on the Mac to a static picture instead of a video. After that things sped up dramatically and the pointer reappeared.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants