Embedded GTK widgets never get a surface (SSH terminal, web view), RDP stalls after gdi_init_ex — RDM 2026.3.0.5 Linux binaries

Embedded GTK widgets never get a surface (SSH terminal, web view), RDP stalls after gdi_init_ex — RDM 2026.3.0.5 Linux binaries

avatar

Hi,
I ran the official Linux build of RDM on FreeBSD's Linux compatibility layer (Linuxulator) and got surprisingly far, but hit two issues that look like they are on the RDM side rather than the platform side. I am not asking for FreeBSD support, and I understand this is an unsupported configuration. I am posting because the findings isolate the failure fairly precisely and might be useful to you, and because a few of them would improve the packaging on lean Linux installs as well.

Environment

  • FreeBSD 15.1-RELEASE amd64, Linuxulator with a Rocky Linux 9 userland (linux_base-rl9 9.7)
  • RDM Linux 2026.3.0.5, the official DEB, unpacked into the Linux root. SHA256 matches the one pinned in your own Flatpak manifest (7a08f8af70f2...)
  • webkit2gtk3 2.52.5 (EL9, API 4.0), vte291 0.64.2, GTK 3.24 from EL9
  • Xvfb at 1600x1000x24, software rendering via llvmpipe, tested both with and without a window manager
  • Launched as the packaged wrapper does: GDK_BACKEND=x11 DOTNET_EnableWriteXorExecute=0

What works
The application itself runs well. Full Avalonia UI, fonts, dialogs, settings, session history, all responsive. More importantly:

  • VNC sessions work completely, including the live framebuffer. I connected to a local x11vnc and got a correct, continuously updating image.
  • The RDP protocol handshake completes against xrdp: TLS, licensing, capability exchange, finalization, gdi_init_ex with PIXEL_FORMAT_BGRX32, and the rdpdr, rdpsnd, cliprdr and drdynvc channels all connect.
  • The web view actually loads pages. My local test server logs GET / HTTP/1.1 200 coming from the RDM tab.

So the .NET runtime, Avalonia, Skia, the VNC stack and the FreeRDP stack are all functional here.

Issue 1: embedded GTK widgets get a window but never a usable surface
This affects both the SSH terminal (VTE) and the web view (WebKitGTK). The X window tree during an open web session:

0x20000e "Remote Desktop Manager" 1024x768+10+10 (Avalonia toplevel)
└─ 0x200017 676x661+339+73 (session area)
└─ 0xc0002a "RemoteDesktopManager" 676x661+0+0 (GTK window, correctly reparented)
└─ 0xc0002b 1x1+-1+-1 (content, never allocated)

The GTK window is embedded at the right size, but its child stays at 1x1. Accompanying messages on stderr:
(RemoteDesktopManager:11387): Gdk-CRITICAL **: gdk_window_move_resize_internal:
assertion 'GDK_IS_WINDOW (window)' failed
(RemoteDesktopManager:13951): Gtk-CRITICAL **: gtk_widget_get_parent:
assertion 'GTK_IS_WIDGET (widget)' failed
(RemoteDesktopManager:13951): GLib-GObject-CRITICAL **: g_object_remove_toggle_ref:
assertion 'G_IS_OBJECT (object)' failed

Consequences:

  • SSH sessions abort. The tab opens, the host key prompt appears (so libssh is talking to the server), the username dialog appears, and then the session closes. The server side logs Connection closed by 127.0.0.1 port 47691 [preauth], and the GTK assertions above appear at exactly that moment.
  • Web view stays blank even though the page was fetched successfully.


Things I ruled out, in this order:

  • Missing libraries. ldd on libEmbeddedTerminal.so and libWebView-4.0.so resolves everything.
  • VTE API mismatch. All 11 vte_* symbols referenced by libEmbeddedTerminal.so are exported by vte291 0.64.2.
  • Window manager. Same result with twm running and with no WM at all.
  • WEBKIT_DISABLE_COMPOSITING_MODE=1, LIBGL_ALWAYS_SOFTWARE=1, GDK_SYNCHRONIZE=1, and forcing resize events on the embedded window from outside.
  • Missing Xwayland, which is a hard dependency of your DEB. Installed it, no change.
  • GTK itself. This is the key data point: a plain GTK3 application (zenity --info) from the same EL9 userland, on the same X server, renders perfectly, icon, text, button and all. So GTK, GDK, cairo and pango are fine on this platform. Only the widgets RDM embeds into the Avalonia window fail.

Issue 2: RDP session stalls right after gdi_init_ex
With WLOG_LEVEL=DEBUG, the connection completes and then stops. Last lines:
[INFO][com.freerdp.gdi] - [gdi_init_ex]: Local framebuffer format PIXEL_FORMAT_BGRX32
[INFO][com.freerdp.gdi] - [gdi_init_ex]: Remote framebuffer format PIXEL_FORMAT_BGRA32
[DEBUG][Devolutions.Rdp] - [_OnChannelConnected]: OnChannelConnected (rdpdr)
[INFO][com.freerdp.channels.rdpsnd.client] - [rdpsnd_load_device_plugin]: [static] Loaded alsa backend
[DEBUG][Devolutions.Rdp] - [_OnChannelConnected]: OnChannelConnected (rdpsnd)
[DEBUG][Devolutions.Rdp] - [_OnChannelConnected]: OnChannelConnected (cliprdr)
[INFO][com.freerdp.channels.drdynvc.client] - [dvcman_load_addin]: Loading DVC nowproto
[INFO][com.freerdp.channels.drdynvc.client] - [dvcman_load_addin]: Loading DVC ainput
[WARN][com.winpr.thread] - [SetThreadPriority]: pthread_setschedprio(0) not implemented

Nothing after that, even at WLOG_LEVEL=TRACE. The UI keeps showing "Connecting to 127.0.0.1:3389", and the socket confirms the client stopped reading:

tcp4 839 0 127.0.0.1.24404 127.0.0.1.3389 ESTABLISHED

839 bytes sit unread in the receive queue indefinitely, which are presumably the server's finalization PDUs. The pthread_setschedprio warning is a compile time fallback in WinPR, not the cause. I confirmed that by shimming the symbol via LD_PRELOAD, which changes nothing.

Packaging observations that apply to Linux generally

  1. libusb-1.0.so.0 is not in the DEB's Depends, but libDevolutionsRdp.so links against it. When it is missing, the library fails to load and RDM reports a generic "Unable to connect to host", which points the user at the network instead of at a missing dependency. Adding libusb-1.0-0 to Depends, or surfacing the dlopen error, would save people a lot of guessing.
  2. If /etc/resolv.conf is absent, the web view fails silently with a blank page and no visible error, because only the WebKitNetworkProcess is affected while the rest of the application keeps working.
  3. WebKit logs "Failed to get the memory usage" in a tight loop when /proc/meminfo has no MemAvailable line. That is a platform gap on my side and I patched it locally, but a rate limit on that message would be kind.


Questions

  1. How does RDM embed the VTE and WebKitGTK widgets into the Avalonia window? GtkPlug/GtkSocket with XEmbed, or a manually reparented X child window? Knowing which handshake is expected would tell me what to instrument next.
  2. Is there a way to raise the log level for the session hosting layer, the way WLOG_LEVEL works for the RDP stack? The GTK assertions are all I currently get.
  3. Is libusb required, or optional for smart card and USB redirection only?

Happy to run further tests, gather traces or try patched builds. The setup is a throwaway VM, so I can break it freely.

Thanks.

All Comments (1)

avatar

Hello,

Thank you for the very detailed report. We’ve shared your findings and questions with our development team for further investigation.

Regarding the SSH terminal and web view issue, this appears to be related to an area of the Linux client that is currently being actively reworked. If possible, could you please check whether the same behavior occurs on a standard Rocky Linux 9 or Ubuntu VM using the same setup?

For the RDP stall, could you also test the same xrdp server using xfreerdp from the same environment? This will help us determine whether the issue originates from FreeRDP itself or from Remote Desktop Manager.

Regarding libusb, it is only used for webcam redirection. However, the RDP library currently requires it in order to load, so please consider it a required dependency for now.

We’ll keep you updated as soon as we receive further feedback from our development team.

Best regards,

Carl Marien