<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to VNC Full Stack</title><link>https://sourceforge.net/p/oculix/wiki/VNC%2520Full%2520Stack/</link><description>Recent changes to VNC Full Stack</description><atom:link href="https://sourceforge.net/p/oculix/wiki/VNC%20Full%20Stack/feed" rel="self"/><language>en</language><lastBuildDate>Sun, 12 Apr 2026 00:55:57 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/oculix/wiki/VNC%20Full%20Stack/feed" rel="self" type="application/rss+xml"/><item><title>VNC Full Stack modified by Julien Mer</title><link>https://sourceforge.net/p/oculix/wiki/VNC%2520Full%2520Stack/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v2
+++ v3
@@ -153,9 +153,9 @@

     :::mermaid
     graph LR

-        A["Java KeyEvent&lt;br/&gt;VK_A, VK_F1, etc."] --&amp;gt;|keyToXlib()| B["XLib Keysym&lt;br/&gt;0x61, 0xFFBE, etc."]
-        C["Java char&lt;br/&gt;'a', '!', '@', etc."] --&amp;gt;|charToXlib()| B
-        B --&amp;gt;|VNCClient.keyDown()| D["RFB KeyEvent&lt;br/&gt;to VNC server"]
+        A["Java KeyEvent\nVK_A, VK_F1"] --&amp;gt;|keyToXlib| B["XLib Keysym\n0x61, 0xFFBE"]
+        C["Java char\na, !, @"] --&amp;gt;|charToXlib| B
+        B --&amp;gt;|VNCClient.keyDown| D["RFB KeyEvent\nto VNC server"]

 ### Supported input

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Mer</dc:creator><pubDate>Sun, 12 Apr 2026 00:55:57 -0000</pubDate><guid>https://sourceforge.net30cd701bf11c0f51f82924f3bfdc67a7d7e5e449</guid></item><item><title>VNC Full Stack modified by Julien Mer</title><link>https://sourceforge.net/p/oculix/wiki/VNC%2520Full%2520Stack/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -2,65 +2,281 @@

 ![Enhanced](https://img.shields.io/badge/type-enhanced-blue?style=for-the-badge)
 ![TigerVNC](https://img.shields.io/badge/TigerVNC-vendored-green?style=for-the-badge)
-
-&amp;gt; VNC support existed in SikuliX1 but was incomplete and unstable. OculiX upgraded it to production-grade with vendored TigerVNC, corruption fixes, and multi-encoding support.
-
----
-
-## What was in SikuliX1
-
-- Basic VNC screen class (`VNCScreen`)
-- Relied on external TigerVNC dependency (sikulix2tigervnc)
-- Frequent image corruption issues
-- Limited encoding support
-
-## What OculiX changed
-
-### Vendored TigerVNC
-The entire `com.tigervnc.*` package (100+ Java files) is now embedded directly in the JAR — no external dependency needed.
-
-Includes:
-- **Decoders**: Raw, ZRLE, Tight, Hextile
-- **Encryption**: TLS support, `SSLEngineManager`
-- **Compression**: Zlib streams
-- **Network**: `TcpSocket`, `TcpListener`
-
-### Corruption Fixes
-
-| Commit | Fix |
-|--------|-----|
-| `a22913e` | ZRLE/Tight corruption fix with `SetPixelFormat` negotiation |
-| `fa6860c` | Disabled VeNCrypt/TLS, use VncAuth only (stability) |
-| `b1b2e2f` | Raw encoding: refresh before capture, screen stability |
-| `99e1c8a` | Disabled CPIXEL optimization in ZRLE/Tight (source of corruption) |
-
-### Architecture
-

-    VNCScreen          → Screen abstraction (capture, bounds)
-      └── VNCRobot     → Keyboard/mouse via RFB protocol
-      └── VNCClient    → RFB protocol implementation (776 lines)
-            └── VNCFrameBuffer  → Pixel buffer management
-            └── VNCClipboard    → Clipboard sync
-            └── TigerVNC decoders (Raw, ZRLE, Tight, Hextile)
-
-### Key Classes
-
-| Class | Package | Purpose |
-|-------|---------|---------|
-| `VNCScreen` | `org.sikuli.vnc` | Screen interface for SikuliX API |
-| `VNCRobot` | `org.sikuli.vnc` | Input events over VNC |
-| `VNCClient` | `com.sikulix.vnc` | RFB protocol, 776 lines |
-| `VNCFrameBuffer` | `com.sikulix.vnc` | Framebuffer management |
-| `XKeySym` | `org.sikuli.vnc` | 2200+ international key definitions |
-| `ThreadLocalSecurityClient` | `com.sikulix.vnc` | Thread-safe parallel sessions |
-
-### Usage
+![Production Ready](https://img.shields.io/badge/production-ready-brightgreen?style=for-the-badge)
+
+&amp;gt; VNC support existed in SikuliX1 but was incomplete and unstable. OculiX upgraded it to **production-grade** with vendored TigerVNC, corruption fixes, full input handling, and seamless integration with the find/click API.
+
+---
+
+## The Big Picture
+
+OculiX turns **any machine with a VNC server** into an automatable screen — same `find()`, `click()`, `type()` API as local automation:
+
+    :::mermaid
+    graph LR
+        subgraph "OculiX (local)"
+            A["Python/Jython script&lt;br/&gt;find('button.png').click()"]
+        end
+        subgraph "Network"
+            B["SSH Tunnel&lt;br/&gt;(optional)"]
+        end
+        subgraph "Remote Machine (any OS)"
+            C["VNC Server"]
+            D["Application&lt;br/&gt;under test"]
+        end
+        A --&amp;gt;|"RFB protocol"| B
+        B --&amp;gt;|"port forward"| C
+        C --&amp;gt; D
+        style A fill:#e6f3ff,stroke:#0066cc
+        style D fill:#ffe6e6,stroke:#cc0000
+
+This works on **any machine**: Windows, Linux, macOS, headless servers, VMs, thin clients — anything running a VNC server.
+
+---
+
+## What SikuliX1 Had vs What OculiX Delivers
+
+| Capability | SikuliX1 | OculiX |
+|-----------|----------|--------|
+| VNC connection | Basic, external TigerVNC dep | Vendored TigerVNC (100+ files in JAR) |
+| Image stability | Frequent corruption | Double-refresh + stability wait |
+| Encodings | Tight/ZRLE (buggy) | Raw (stable), all decoders available |
+| Input | Partial keyboard | Full keyboard (2200+ keysyms) + mouse + wheel |
+| Multi-screen | Single connection | Registry-based, multiple concurrent VNC screens |
+| SSH integration | None | Built-in `SSHTunnel` (see [SSH Tunnel]) |
+| Thread safety | Not guaranteed | `imageLock` on framebuffer, `ThreadLocalSecurityClient` |
+| Headless/CI | Unreliable | Stable, tested in `-r` mode |
+
+---
+
+## Architecture
+
+    :::mermaid
+    graph TB
+        subgraph "User Script"
+            S["screen.find('btn.png').click()"]
+        end
+        subgraph "SikuliX API Layer"
+            VS["VNCScreen&lt;br/&gt;&lt;i&gt;extends Region&lt;br/&gt;implements IScreen&lt;/i&gt;"]
+            VR["VNCRobot&lt;br/&gt;&lt;i&gt;implements IRobot&lt;/i&gt;"]
+        end
+        subgraph "VNC Protocol Layer"
+            VC["VNCClient&lt;br/&gt;&lt;i&gt;extends CConnection&lt;/i&gt;"]
+            VF["VNCFrameBuffer&lt;br/&gt;&lt;i&gt;extends PixelBuffer&lt;/i&gt;"]
+            SEC["ThreadLocal&lt;br/&gt;SecurityClient"]
+        end
+        subgraph "TigerVNC (vendored)"
+            RFB["RFB Protocol"]
+            DEC["Decoders&lt;br/&gt;Raw | ZRLE | Tight | Hextile"]
+            TLS["TLS / Encryption"]
+        end
+        subgraph "Network"
+            NET["TCP Socket&lt;br/&gt;(direct or via SSH tunnel)"]
+        end
+    
+        S --&amp;gt; VS
+        VS --&amp;gt;|capture| VC
+        VS --&amp;gt;|input| VR
+        VR --&amp;gt;|key/mouse events| VC
+        VC --&amp;gt; VF
+        VC --&amp;gt; SEC
+        VC --&amp;gt; RFB
+        RFB --&amp;gt; DEC
+        RFB --&amp;gt; TLS
+        RFB --&amp;gt; NET
+
+---
+
+## Data Flow: How `find().click()` Works on a Remote Screen
+
+    :::mermaid
+    sequenceDiagram
+        participant Script as User Script
+        participant VS as VNCScreen
+        participant VC as VNCClient
+        participant FB as VNCFrameBuffer
+        participant Server as VNC Server
+    
+        Note over Script,Server: CAPTURE PHASE
+        Script-&amp;gt;&amp;gt;VS: find("button.png")
+        VS-&amp;gt;&amp;gt;VC: refreshFramebuffer(full, non-incremental)
+        VC-&amp;gt;&amp;gt;Server: FramebufferUpdateRequest
+        Server-&amp;gt;&amp;gt;VC: FramebufferUpdate (Raw pixels)
+        VC-&amp;gt;&amp;gt;FB: imageRect(x, y, w, h, pixels)
+        Note over VS: Wait 100ms (stability)
+        VS-&amp;gt;&amp;gt;VC: refreshFramebuffer(full, non-incremental)
+        VC-&amp;gt;&amp;gt;Server: FramebufferUpdateRequest
+        Server-&amp;gt;&amp;gt;VC: FramebufferUpdate
+        VC-&amp;gt;&amp;gt;FB: imageRect()
+        FB-&amp;gt;&amp;gt;VS: BufferedImage
+        VS-&amp;gt;&amp;gt;VS: Template matching (OpenCV)
+    
+        Note over Script,Server: CLICK PHASE
+        VS-&amp;gt;&amp;gt;Script: Match(x=340, y=220, score=0.98)
+        Script-&amp;gt;&amp;gt;VS: click()
+        VS-&amp;gt;&amp;gt;VC: mouseMove(340, 220)
+        VC-&amp;gt;&amp;gt;Server: PointerEvent(340, 220, buttons=0)
+        VS-&amp;gt;&amp;gt;VC: mouseDown(LEFT)
+        VC-&amp;gt;&amp;gt;Server: PointerEvent(340, 220, buttons=1)
+        VS-&amp;gt;&amp;gt;VC: mouseUp(LEFT)
+        VC-&amp;gt;&amp;gt;Server: PointerEvent(340, 220, buttons=0)
+
+&amp;gt; **Why double refresh?** The first request may return stale data from encoding lag. The 100ms wait + second refresh ensures the framebuffer reflects the actual screen state.
+
+---
+
+## Corruption Fixes (the hard wins)
+
+VNC image corruption was the [#1] reliability issue. Here's what was fixed:
+
+| Commit | Problem | Fix |
+|--------|---------|-----|
+| `a22913e` | ZRLE/Tight decoders produced garbled pixels | Fixed `SetPixelFormat` negotiation — server and client pixel formats now match |
+| `99e1c8a` | CPIXEL optimization in ZRLE/Tight caused byte misalignment | Disabled CPIXEL — minor bandwidth cost, major reliability gain |
+| `fa6860c` | VeNCrypt/TLS handshake failed on some servers | Disabled VeNCrypt, use VncAuth only — TLS handled by SSH tunnel instead |
+| `b1b2e2f` | Captures returned stale/partial screen | Double framebuffer refresh with sleep between requests |
+
+### Current default: Raw encoding
+
+    :::java
+    // VNCClient.java line 61
+    currentEncoding = Encodings.encodingRaw;
+    // "CDC fix: force Raw encoding to avoid corruption with TigerVNC/RFB 3.x"
+
+Raw encoding = uncompressed pixels. More bandwidth, but **zero corruption risk**. On a LAN or SSH tunnel, the overhead is negligible.
+
+---
+
+## Keyboard: Full International Support
+
+`VNCRobot` translates Java `KeyEvent` codes to **XLib/XWindow Keysyms** (2200+ codes in `XKeySym.java`):
+
+    :::mermaid
+    graph LR
+        A["Java KeyEvent&lt;br/&gt;VK_A, VK_F1, etc."] --&amp;gt;|keyToXlib()| B["XLib Keysym&lt;br/&gt;0x61, 0xFFBE, etc."]
+        C["Java char&lt;br/&gt;'a', '!', '@', etc."] --&amp;gt;|charToXlib()| B
+        B --&amp;gt;|VNCClient.keyDown()| D["RFB KeyEvent&lt;br/&gt;to VNC server"]
+
+### Supported input
+
+| Category | Examples |
+|----------|---------|
+| Letters | A-Z (with shift detection) |
+| Numbers | 0-9, Numpad 0-9 |
+| Function keys | F1-F24 |
+| Modifiers | Ctrl, Shift, Alt, AltGr, Meta (Cmd/Win) |
+| Special | Enter, Tab, Backspace, Escape, Delete, Insert |
+| Navigation | Arrows, Home, End, PageUp, PageDown |
+| Dead keys | Grave, Acute, Circumflex, Tilde, Diaeresis |
+| Symbols | All US keyboard special chars with shift handling |
+
+### Mouse support
+
+| Action | Method |
+|--------|--------|
+| Move | `mouseMove(x, y)` |
+| Click | `mouseDown(buttons)` / `mouseUp(buttons)` |
+| Scroll | `mouseWheel(amount)` — up/down |
+| Smooth move | `smoothMove(src, dest, duration)` — linear interpolation |
+| Color pick | `getColorAt(x, y)` — 1x1 pixel capture |
+
+Supports **8 mouse buttons** and multi-button combinations.
+
+---
+
+## Multi-Screen Registry
+
+    :::mermaid
+    graph TD
+        subgraph "OculiX Process"
+            R["Static Registry&lt;br/&gt;Map&amp;lt;String, VNCScreen&amp;gt;"]
+            S1["VNCScreen&lt;br/&gt;192.168.1.10:5900"]
+            S2["VNCScreen&lt;br/&gt;192.168.1.20:5900"]
+            S3["VNCScreen&lt;br/&gt;10.0.0.5:5901"]
+        end
+        subgraph "Remote Machines"
+            M1["Windows Server"]
+            M2["Linux Desktop"]
+            M3["macOS VM"]
+        end
+        R --&amp;gt; S1
+        R --&amp;gt; S2
+        R --&amp;gt; S3
+        S1 -.-&amp;gt; M1
+        S2 -.-&amp;gt; M2
+        S3 -.-&amp;gt; M3
+
+- Screens are keyed by `"ip:port"` in a static map
+- `VNCScreen.start()` returns existing screen if already connected (no duplicates)
+- `VNCScreen.stopAll()` cleans up everything on shutdown
+- Each screen runs its own message processing thread
+
+---
+
+## Screen Stability Detection
+
+Before capturing for template matching, OculiX can wait for the remote screen to stabilize:
+
+    :::java
+    screen.waitForScreenStable(5000, 500);
+    // Polls every 50ms, compares frames
+    // Returns true when screen unchanged for 500ms (within 5s timeout)
+
+This prevents false matches during screen transitions (loading spinners, animations, window redraws).
+
+---
+
+## Usage Examples
+
+### Basic — automate a remote Linux desktop

     :::python
     from sikuli import *

-    vnc = VNCScreen.start("192.168.1.100", 5900, "password")
-    vnc.find("button.png")
-    vnc.click("button.png")
+    
+    vnc = VNCScreen.start("192.168.1.100", 5900, "vncpassword", 5, 1000)
+    vnc.find("terminal_icon.png").doubleClick()
+    vnc.type("ls -la\n")
     vnc.stop()

-&amp;gt; **Note**: A branch `claude/fix-vnc-corruption-WvspU` contains additional VNC fixes not yet merged.
+### With SSH tunnel — through a firewall
+

+    :::python
+    from com.sikulix.util import SSHTunnel
+    
+    tunnel = SSHTunnel.open("bastion.company.com", "admin", "sshpass")
+    vnc = VNCScreen.start("127.0.0.1", tunnel.getLocalPort(), "vncpass", 5, 1000)
+    
+    vnc.find("app_icon.png").click()
+    vnc.waitForScreenStable()
+    vnc.find("submit_button.png").click()
+    
+    vnc.stop()
+    tunnel.close()
+
+### Multi-screen — automate several machines in parallel
+
+    :::python
+    screen1 = VNCScreen.start("192.168.1.10")
+    screen2 = VNCScreen.start("192.168.1.20")
+    
+    # Both screens are independent, concurrent
+    screen1.find("button.png").click()
+    screen2.find("button.png").click()
+    
+    VNCScreen.stopAll()
+
+---
+
+## Key Classes
+
+| Class | Package | Lines | Purpose |
+|-------|---------|-------|---------|
+| `VNCScreen` | `org.sikuli.vnc` | — | Screen abstraction, SikuliX API integration |
+| `VNCRobot` | `org.sikuli.vnc` | — | Keyboard/mouse input via RFB |
+| `XKeySym` | `org.sikuli.vnc` | 175KB | 2200+ international key definitions |
+| `VNCClient` | `com.sikulix.vnc` | 776 | RFB protocol, connection lifecycle |
+| `VNCFrameBuffer` | `com.sikulix.vnc` | — | Thread-safe pixel buffer |
+| `VNCClipboard` | `com.sikulix.vnc` | — | Clipboard synchronization |
+| `ThreadLocalSecurityClient` | `com.sikulix.vnc` | — | Thread-safe auth for parallel sessions |
+| `BasicUserPasswdGetter` | `com.sikulix.vnc` | — | VNC password provider |
+| `com.tigervnc.*` | vendored | 100+ files | Full RFB stack, decoders, TLS |
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Mer</dc:creator><pubDate>Sun, 12 Apr 2026 00:55:57 -0000</pubDate><guid>https://sourceforge.net3ab60285a0f5db7998def1680427d3a204d6d4c1</guid></item><item><title>VNC Full Stack modified by Julien Mer</title><link>https://sourceforge.net/p/oculix/wiki/VNC%2520Full%2520Stack/</link><description>&lt;div class="markdown_content"&gt;&lt;h1 id="h-vnc-full-stack"&gt;VNC Full Stack&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Enhanced" rel="nofollow" src="https://img.shields.io/badge/type-enhanced-blue?style=for-the-badge"/&gt;&lt;br/&gt;
&lt;img alt="TigerVNC" rel="nofollow" src="https://img.shields.io/badge/TigerVNC-vendored-green?style=for-the-badge"/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VNC support existed in SikuliX1 but was incomplete and unstable. OculiX upgraded it to production-grade with vendored TigerVNC, corruption fixes, and multi-encoding support.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;
&lt;h2 id="h-what-was-in-sikulix1"&gt;What was in SikuliX1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Basic VNC screen class (&lt;code&gt;VNCScreen&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Relied on external TigerVNC dependency (sikulix2tigervnc)&lt;/li&gt;
&lt;li&gt;Frequent image corruption issues&lt;/li&gt;
&lt;li&gt;Limited encoding support&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h-what-oculix-changed"&gt;What OculiX changed&lt;/h2&gt;
&lt;h3 id="h-vendored-tigervnc"&gt;Vendored TigerVNC&lt;/h3&gt;
&lt;p&gt;The entire &lt;code&gt;com.tigervnc.*&lt;/code&gt; package (100+ Java files) is now embedded directly in the JAR — no external dependency needed.&lt;/p&gt;
&lt;p&gt;Includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Decoders&lt;/strong&gt;: Raw, ZRLE, Tight, Hextile&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption&lt;/strong&gt;: TLS support, &lt;code&gt;SSLEngineManager&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compression&lt;/strong&gt;: Zlib streams&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt;: &lt;code&gt;TcpSocket&lt;/code&gt;, &lt;code&gt;TcpListener&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h-corruption-fixes"&gt;Corruption Fixes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Commit&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a22913e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ZRLE/Tight corruption fix with &lt;code&gt;SetPixelFormat&lt;/code&gt; negotiation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fa6860c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disabled VeNCrypt/TLS, use VncAuth only (stability)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;b1b2e2f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Raw encoding: refresh before capture, screen stability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;99e1c8a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disabled CPIXEL optimization in ZRLE/Tight (source of corruption)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="h-architecture"&gt;Architecture&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;VNCScreen&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Screen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;abstraction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VNCRobot&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Keyboard&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mouse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RFB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;protocol&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VNCClient&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RFB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;implementation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;776&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VNCFrameBuffer&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Pixel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;management&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VNCClipboard&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Clipboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sync&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TigerVNC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;decoders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZRLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Tight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Hextile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="h-key-classes"&gt;Key Classes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VNCScreen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;org.sikuli.vnc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Screen interface for SikuliX API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VNCRobot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;org.sikuli.vnc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Input events over VNC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VNCClient&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;com.sikulix.vnc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RFB protocol, 776 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VNCFrameBuffer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;com.sikulix.vnc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Framebuffer management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;XKeySym&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;org.sikuli.vnc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2200+ international key definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ThreadLocalSecurityClient&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;com.sikulix.vnc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thread-safe parallel sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="h-usage"&gt;Usage&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sikuli&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;vnc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VNCScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vnc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"button.png"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vnc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"button.png"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vnc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: A branch &lt;code&gt;claude/fix-vnc-corruption-WvspU&lt;/code&gt; contains additional VNC fixes not yet merged.&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Mer</dc:creator><pubDate>Sun, 12 Apr 2026 00:55:56 -0000</pubDate><guid>https://sourceforge.net5e598c549997833ba13a87763833f5f1c56be564</guid></item></channel></rss>