Releases: majmichu1/UScreen
Release list
UScreen 1.2.7 — USB second monitor for Linux with S Pen support
Weekly release. Update both halves - the computer side and the app.
Fixes
- Palm rejection really works now. Samsung reports a resting hand as a normal finger, so fingers are ignored while the pen is in use.
- The mouse cursor left where the pen was lifted lands in the right place on multi-monitor desktops (#18).
- App: if the tablet's decoder refuses its settings, the app now steps down to safer ones (and finally Android's software decoder) instead of retrying the same thing forever on "Waiting for the host" (#10).
- Several tablets: starting one tablet no longer kills the other tablets' capture (#5).
- Arch: the PKGBUILD now carries the right version (#21).
New
- Each tablet is remembered by its serial, so its screen is built right away instead of being rebuilt a second after plugging in (#17). A
[tablets.<serial>]block in the config can also hold per-tabletfps,bitrate,quality,stream_scaleandposition. - Hyprland: the virtual screen is switched on and pen/touch are mapped through
hyprctl(#19). Not confirmed on real hardware yet, reports welcome. - The encoder check at start retries once before switching encoder, and the log and
uscreen doctorshow ffmpeg's actual error.
Full list in CHANGELOG.md.
UScreen 1.2.6 — USB second monitor for Linux with S Pen support
The first of the regular Saturday releases — from now on fixes collect
during the week and go out together on Saturday evening (US Eastern time),
unless people cannot use UScreen without one.
It picks an encoder that works
A fresh config said h264_nvenc, and nothing ever checked whether that could
work. On a laptop without NVIDIA, ffmpeg died on every start and the tablet
sat on a spinner forever; uscreen doctor even called the encoder
"available", because ffmpeg -encoders lists what ffmpeg was built with
(#15).
The daemon now encodes one small test frame with the configured encoder and,
if that fails, takes the first of NVENC → VAAPI → libx264 that works, says so
and saves the choice. doctor checks the same way. If you are on AMD or
Intel graphics and UScreen never showed a picture, this is the fix.
pointer_handoff
After the pen lifts, UScreen parks an ordinary mouse cursor where it was. That
also means the shared desktop cursor is now on the tablet, and carrying on
with the mouse means dragging it back first. pointer_handoff = false — a
checkbox in the GUI, Leave the mouse cursor where the pen was lifted —
creates no pointer device at all: pen and touch drive the tablet's screen, the
mouse stays where it was (#18).
Default unchanged. That report also found the parked cursor landing left of
the pen on mixed-scale layouts; that is not fixed yet, and turning the handoff
off avoids it.
Also
- GUI: the config path no longer draws on top of the status message
(#16). - Two more systems in the compatibility list: Q4OS on a two-core AMD 3020e,
and Arch on Intel Raptor Lake.
Update both halves together. Files: .deb, .rpm, PKGBUILD archive,
portable tarball, uscreen.apk, SHA256SUMS.
UScreen 1.2.5 — USB second monitor for Linux with S Pen support
Five fixes that surfaced from an outside audit of the code. One of them
matters to everyone who draws.
Palm rejection works now
Android's hidden TOOL_TYPE_PALM constant is 5. The app compared against 6,
so since the feature was added no palm was ever filtered: a hand resting on
the tablet reached Linux as a finger and scrolled or clicked. With the filter
live, a finger that Android reclassifies as a palm mid-gesture is lifted on
the host instead of left pressed, and every DOWN that was forwarded gets its
UP.
Also fixed
- A second daemon started as plain
uscreen(no subcommand, which means
start) was not recognised as one and could run alongside the first, both
fighting for the capture device. - The helper's BT.709 chroma coefficients summed to −1, so pure greys and
white carried a one-step blue cast. - The generated EDID is written to a temporary name and renamed into place;
a crash mid-write can no longer leave a truncated file that every later
start would use. - The app's frame-arrival ring index wraps instead of overflowing after 2³¹
frames.
Still open
The Galaxy Tab S10 FE+ black screen
(#10) is not touched by this
release. 1.2.4's decoder ladder and timestamp change are waiting on a log
from that tablet.
Update both halves together. Files: .deb, .rpm, PKGBUILD archive,
portable tarball, uscreen.apk, SHA256SUMS.
UScreen 1.2.4 — USB second monitor for Linux with S Pen support
For the one tablet that shows a single frame, and two small things in the settings window.
Decoder: a ladder instead of a loop
A Galaxy Tab S10 FE+ on Android 16 decodes keyframes and produces nothing for
the frames in between, so 1.2.3's watchdog restarted the decoder every 1.5 s,
got one frame at the next keyframe, and called that recovered — the picture
blinked at 1 fps (#10).
Now two stalls move the app one step down: the hardware decoder, then the
hardware decoder without low-latency hints, then Android's software decoder,
which is slow at tablet resolutions but decodes anything. Thirty frames in a
row count as recovery; one does not. The decoder's name and output format are
logged, so a logcat names the component.
Frames are also stamped 10 ms apart now instead of 1 µs — the host's sequence
number still rides in the timestamp for the latency loop, but a decoder that
paces or drops frames by timestamp finally sees plausible ones. This may be
the whole cause on that tablet; it is verified only in the sense that every
number still divides out. Reports from other devices welcome either way.
Settings window
- It scrolls. The settings ran past the window with no scrollbar and a dead
wheel, so on a small or portrait screen the lower ones were unreachable
(#14). - Saving from it no longer erases the address remembered by
uscreen wifi
— the window rewrites the whole config file and did not know that field.
Update both halves together. Files: .deb, .rpm, PKGBUILD archive,
portable tarball, uscreen.apk, SHA256SUMS.
UScreen 1.2.3 — USB second monitor for Linux with S Pen support
Three fixes from this week's reports. Two are certain, one is a best effort until its reporter comes back.
The virtual monitor only exists while a tablet is attached
The EVDI helper used to run from the moment the daemon started, so the desktop
saw a connected (disabled) monitor at every boot whether a tablet was there or
not. KDE remembers layouts per output, so a layout once saved as "show only on
the UScreen screen" came straight back on the next login with nothing to show
it on — real screens black, no tablet in sight
(#12).
The helper now starts when a tablet becomes a screen and stops when it stops
being one, so the virtual monitor appears and disappears exactly like a cable.
Verified: daemon running with no tablet, no helper process, no DVI output
listed by KWin.
.deb: a failing evdi-dkms no longer breaks the rest of the install
Debian's evdi-dkms 1.14.8 does not build against kernels 6.14 and newer
(drm_driver.date is gone there). With uscreen depending on it, dpkg left
uscreen unconfigured too — no udev rule for /dev/uinput, no modprobe file
for the EVDI device — which produced a wall of unrelated-looking errors
(#13).
The package now recommends evdi-dkms instead, the helper's hint when no EVDI
device appears says what to actually check (it used to suggest a Makefile
target package installs do not have), and docs/installation.md has the
recipe for building the upstream module on such kernels.
App: a decoder that shows nothing gets restarted
A Galaxy Tab S10 FE+ on Android 16 rendered one frame and then nothing while
the host kept sending and the decoder kept accepting input
(#10). The old watchdog only
noticed a decoder that stopped taking frames. Now, four frames in and none
out for 1.5 s restarts the decoder and reconnects for a fresh keyframe; a
second stall in a row restarts it without the low-latency hints.
This is built from that report's log and is a recovery, not a root cause; the
issue stays open until the reporter says what the tablet does with 1.2.3.
Update both halves together. Files: .deb, .rpm, PKGBUILD archive,
portable tarball, uscreen.apk, SHA256SUMS.
UScreen 1.2.2 — USB second monitor for Linux with S Pen support
A small release answering what came back from the last one.
The pen's tilt axes were the wrong way round
Android reports the stylus direction as an angle measured clockwise from the
top of the screen, and the app decomposed that into x from the cosine and y
from the sine — which is the wrong way round. libinput wants tilt_x positive
towards the right edge and tilt_y positive towards the user, so the y
component needed its sign as well. A pen leaning to the right arrived in Krita
or GIMP as a pen leaning towards you.
Spotted with a Lenovo Tab Pen Plus in
#11. Pressure, the eraser
end and the stylus button were never affected. If you draw with tilt, this is
worth the update — and please say in that issue whether it now matches your
hand, because the direction is easy to be confident about and hard to prove
without a second pair of eyes.
uscreen doctor can tell two tablets from one
Two adb entries used to be reported as one tablet "reachable 2 ways", which is
true when adb tcpip is in use and quite wrong when two Android devices are
plugged in — two USB serials are two devices. The daemon drives the first one
adb lists and launches the app there, so the other one sits black next to it
while everything looks healthy. doctor now names both, with their model, and
says which one is being used.
Found while working through a black-screen report,
#10, which is still open.
Confirmed since 1.2.1
- KDE Neon, Plasma 6.7.5, AMD — touch lands on the tablet's own screen
after the KWin fix, confirmed by the reporter of
#9. - Lenovo Tab K11 with Android 15 — works, 60–70 frames/s.
Both are in docs/compatibility.md now.
Update both halves together. Files: .deb, .rpm, PKGBUILD archive,
portable tarball, uscreen.apk, SHA256SUMS.
UScreen 1.2.1 — USB second monitor for Linux with S Pen support
A day after 1.2.0, because two people found the same real bug on Debian-based systems.
Touch and pen went to the wrong screen on Debian, Ubuntu, Neon, Pika…
The daemon pins the tablet's touch and pen onto the virtual display by setting
a property on KWin over D-Bus, and it did that by running qdbus. On
Debian- and Ubuntu-based Plasma systems that binary usually is not installed:
plain qdbus belongs to Qt5, and Plasma 6 ships qdbus-qt6. Every mapping
call failed, the daemon logged one line about it and carried on, and KWin was
left to place an absolute input device on its own — so touches drove the
laptop's screen, or landed at 0,0, depending on the machine. It looked exactly
like graphics-tablet mode being stuck on. Reported in
#9 and
#10.
KWin is now reached through systemd's busctl, which every distribution this
project targets has, and falls back to qdbus, qdbus6, qdbus-qt6 and
qdbus-qt5 in turn. The same call path carries on-screen-keyboard
suppression, which was silently off on those systems too.
uscreen doctor gained a KWin D-Bus line: it names the tool it reached
KWin with, or fails the check and says what to install. On the affected
machines the Desktop section was simply empty, which told nobody anything.
Wi-Fi in one command
uscreen wifi, run once with the cable plugged in, switches the tablet's adb
to the network, remembers its address and connects. From then on the daemon
retries that address by itself whenever no tablet is on USB, so the tablet
comes back as a screen without anyone typing an adb command
(#8). uscreen wifi --off
undoes it. The video and input ports stay on loopback, reached through adb's
tunnel, so nothing new is exposed to your network. Wi-Fi remains a fallback:
the median latency matches the cable, individual frames do not.
Also
- The settings window tells the desktop it is
uscreen, so the KDE task bar
shows the UScreen icon instead of a generic monitor. - Installing now refreshes the icon caches, so the menu entry stops being a
blank sheet until the next login.
Update both halves together. Files: .deb, .rpm, PKGBUILD archive,
portable tarball, uscreen.apk, SHA256SUMS.
UScreen 1.2.0 — USB second monitor for Linux with S Pen support
A performance release, plus the two things people asked for.
Faster, on every distribution
- ffmpeg 8 was converting every frame through RGB on the CPU. The BT.709
colour tags were passed as output options, which ffmpeg 7+ reads as a
request to convert; with ffmpeg 8 on the host the encoder process sat at
about 280 % of a core and the picture stuttered at every frame-rate
setting. Tagging the input instead brings it to about 12 % at 90 fps and
removes a needless colour round-trip. If UScreen got laggy for you after a
system update, this is why. - Capture cycle tightened. The helper asks the compositor for the next
frame as soon as the previous one is copied out, and keeps the framebuffer
on huge pages (copy 6.5 → 4.5 ms at 2960×1848). Under motion that is 58–63
frames/s where it was 52–57, and a 30 fps target no longer lands at 24.
docs/benchmarks.mdnow explains where the remaining ceiling comes from.
Asked for
- Screen orientation (discussion #7): Rotate automatically in the ⚙
sheet follows the tilt sensor between the two landscape directions, so the
tablet can be held camera-down for drawing; with it off, Camera up /
Camera down pin the direction. - Input mapping after graphics-tablet mode (#6): leaving the mode could
leave the pen and touch on the laptop screen. The daemon now waits for the
virtual display to be enabled before mapping and verifies the mapping
instead of assuming it.
Also
- The app comes back by itself if it dies on the tablet (swiped away,
killed by Android) — within about ten seconds, no re-plugging. - UScreen has an icon now: on the tablet, in the app menu, on the settings
window and in the tray (dimmed in graphics-tablet mode). uscreen doctorwarns when Samsung's Motion smoothness is on Standard,
which holds the panel at 60 Hz whatever the app asks for.
Update both halves together, as always. Files: .deb, .rpm, PKGBUILD
archive, portable tarball, uscreen.apk, SHA256SUMS.
UScreen 1.1.0 — USB second monitor for Linux with S Pen support
The security release, plus packages, multi-tablet support and update checks.
Security
Two problems an audit turned up, both real:
- The loopback ports had no authentication. The tablet reaches them through
adb reverse, but so could any process on the machine — or any other app on
the tablet: read the raw screen on 8890, inject mouse/pen input on 8891. The
daemon now generates a random session token per run and hands it to the app
over adb (on stdin, never in a command line, which any local process can
read). Clients that don't present it first get nothing. An app older than
1.1.0 cannot authenticate: update both sides together, or set
require_token = falsewhile you migrate. - The capture FIFO was
/tmp/uscreen_capture.fifo, mode 0666 — any local
account could read the frames, a live copy of the screen. It now lives in
the per-user runtime directory, mode 0600, opened withO_NOFOLLOW.
Packages, and binaries that actually run
Every release now ships a .deb (Debian, Ubuntu, Mint, Pop), an .rpm
(openSUSE; Fedora with RPM Fusion) and a PKGBUILD for Arch, so the package
manager resolves the dependencies that install.sh used to guess at. All of
them install the udev rule that opens /dev/uinput to the logged-in user —
on anything but Bazzite that was missing, and without it no input ever reached
the desktop.
The tarball binaries are built against Debian 12's glibc (2.36) and run on
anything released since. The 1.0.x binaries were built on a rolling system and
needed glibc 2.43, which no Debian or Ubuntu has — if you saw
GLIBC_2.43' not found, this is the fix.
Several tablets at once
max_tablets (up to 4) gives every attached tablet its own virtual screen,
with its own pen and touch devices mapped to it. Verified with one physical
tablet plus a loopback stand-in; a report from anyone with two real tablets
would be welcome.
Update checks
The app checks when it comes to the front, the GUI when its window opens, the
daemon once a day for the tray icon and uscreen doctor. All of them only
tell you; none of them installs anything.
Fixes
- A daemon shutting down could delete the PID file of the daemon that replaced
it, leaving the new one untracked —uscreen stopthen fell back to a
pattern match that could kill the very shell it was typed into. - Config writes are atomic now and log exactly which settings changed;
settings had been drifting between runs with nothing saying who wrote what. - The GUI said "no tablet" whenever two adb devices were reachable (the normal
state withadb tcpip), becauseadb get-statefails outright then. - The tray's Settings entry and the app menu entry both failed to launch the
GUI for~/.local/bininstalls; both now use full paths. - Android 8.0 never actually worked — the theme used API 27 attributes — so
the app is honest about it now: minimum is Android 8.1.
Install
Pick your file from the table in the README. Upgrading works in place — same
signing key as every earlier release. Update the APK and the Linux side
together: the session token needs both.
v1.0.2
More install fixes, found while chasing #2.
openSUSE
Wasn't handled at all — it fell through to "unknown distro". Which is a
shame, because it turns out to be the easiest distribution of the lot:
ffmpeg, android-tools, evdi and libevdi1 are all in the default
repositories. Now installed via zypper.
One bad package no longer takes the rest with it
Before, a single unavailable package failed the whole install line. That is
how Debian ended up with no evdi library at all once libevdi0 turned out not
to exist: the line failed, and the fallback didn't include a library either.
Userspace tools and the kernel module are now installed separately, so a dkms
build that fails for want of kernel headers doesn't stop ffmpeg and adb from
being installed. On openSUSE libevdi1 requires evdi-kmp, so those two stay
together — checked, not assumed.
PATH
The installer now checks that ~/.local/bin is actually on your PATH. It is
only added at login on most distributions, and only if it already exists, so
installing into a directory we just created could leave you with
uscreen: command not found after an install that reported success.
Install
Linux: download the tarball, extract, run ./scripts/install.sh.
Android: unchanged from 1.0.0; the APK is here for completeness and upgrades in
place, same signing key as every earlier release.