LittleBigMouse

GitHub

DPI Aware mouse move across screens

6,494 stars C#
RAW Doc

Hisense Vidaa

Hisense VIDAA projector control

The VCP view now exposes a Hisense VIDAA card for displays whose EDID vendor is
HEC (including the C1). Enter the projector IP; LittleBigMouse derives the
controller MAC from the network route, including across routed subnets. The
projector MAC is optional and is only used for Wake-on-LAN. Navigation keys are sent over the
local VIDAA MQTT endpoint (TLS, port 36669); Wake uses a standard broadcast
magic packet.

Before pairing, LittleBigMouse reads the projector's UPnP descriptor directly
by IP and selects the protocol from transport_protocol. Older RemoteNOW
devices such as the C1 (2160) use the static MQTT service credentials and a
<CONTROLLER MAC>$normal topic. Newer VIDAA devices use time-based credentials
and access tokens. If the descriptor is unavailable, the newer credential
algorithms are tried in order.

The C1 requires the private client certificate shipped in the official Android
VIDAA application. It cannot be redistributed with LittleBigMouse. Extract the
PKCS#12 file (client_mobile_android.p12, or res/3R.p12 in obfuscated APKs)
and copy it to ~/.config/LittleBigMouse/vidaa-client.p12. The password is
detected internally. The connection uses mutual TLS 1.2, then displays the
projector PIN and stores the issued VIDAA access tokens.

---

Samsung Tizen

Samsung Tizen monitor control

LittleBigMouse can control Samsung smart monitors such as the Odyssey OLED G8
G80SD over the local network when DDC/CI is unavailable.

Pairing

1. Put the computer and monitor on the same LAN/VLAN.
2. Open the VCP view for the Samsung monitor.
3. Select Discover, or enter the monitor IPv4 address manually.
4. Select Pair and allow LittleBigMouse in the prompt displayed by the monitor.

Before pairing, enable both Settings > All Settings > Connections > Network >
Expert Settings > Power On with Mobile and IP Remote. Samsung documents
Power On with Mobile as a prerequisite for IP Remote on this monitor. Access
Notification belongs to the separate mobile/content-sharing device manager and
does not enable the IP-control channel.

If a pairing prompt is displayed, allow LittleBigMouse. Depending on the Access
Notification setting and firmware, the monitor may authorize the connection
without displaying a prompt.

The association, Wi-Fi MAC address and Tizen remote token are stored per EDID
monitor in samsung-tizen.json under the LittleBigMouse configuration directory.
The MAC address is obtained automatically from Samsung's device-information API;
manual entry is only a fallback. On Unix the file is created with user-only
permissions.

Controls

The panel provides power-off, Wake-on-LAN, Home, Settings, Source and directional
remote keys. Wake-on-LAN also requires the monitor's network wake option to be
enabled; its wording and menu location vary by firmware.

Tizen's local remote channel does not expose readable brightness, contrast or RGB
levels. Picture settings can instead be automated with an explicit key macro. A
macro contains KEY_ names and optional delays in milliseconds:

text
KEY_MENU,700,KEY_DOWN,KEY_ENTER

Commas, semicolons and + are accepted as separators. A number changes the delay
after the preceding key; keys otherwise wait 150 ms. Delays are limited to ten
seconds. Build a macro against the monitor's current firmware and picture mode,
because Samsung can change menu order between SDR, HDR, Game Mode and firmware
versions.

Network details

- Discovery uses SSDP multicast and falls back cleanly to manual IPv4 entry.
- Device information is read from http://MONITOR:8001/api/v2/.
- Remote commands use the paired TLS WebSocket endpoint on port 8002.
- The monitor uses a device-generated TLS certificate, accepted only by the client
instance connected to the IPv4 address explicitly selected in the UI.
- Power-on sends three standard Wake-on-LAN magic packets to UDP port 9.

---

Test Session Persistence Windows

Session de test Windows — refactor persistance (moteur partagé + RegistryLayoutStore)

Contexte : la persistance Windows (PersistencyExtensions, 535 lignes d'extensions registre)

a été remplacée par le moteur partagé LayoutPersistence (LittleBigMouse.Plugins/Persistence)

branché sur RegistryLayoutStore. Le mapping modèle↔DTO est désormais unique pour les deux OS.

> Déjà validé sous Linux : 46 tests verts (moteur complet sur store in-memory + format JSON),

compilation de tous les projets, comportement Linux inchangé (DTOs déplacés verbatim).

> Reste à valider : tout ce qui touche le runtime Windows réel — le RegistryLayoutStore

n'est pas testable sous Linux (API registre Windows-only), il n'est couvert que par relecture.

0. Préparation (avant de lancer quoi que ce soit)

- [ ] Sauvegarder le registre :
reg export "HKCU\SOFTWARE\Mgth\LittleBigMouse" %USERPROFILE%\lbm-backup.reg
- [ ] Sauvegarder %LOCALAPPDATA%\Mgth\LittleBigMouse\Excluded.txt (et noter les autres fichiers du dossier)
- [ ] Noter l'état de la tâche planifiée : schtasks /query /fo list | findstr LittleBigMouse
- [ ] Compiler la solution complète sous Windows (le projet Server échouait sous Linux pour une
raison d'environnement SDK — NETSDK1226 — vérifier qu'il compile normalement sous Windows)

Rollback à tout moment : fermer l'app, reg import %USERPROFILE%\lbm-backup.reg, restaurer Excluded.txt.

1. Compat utilisateur existant (le test le plus important)

Avec le registre actuel déjà peuplé :

- [ ] Lancer l'app : le layout est restauré à l'identique — positions mm (XLocationInMm/YLocationInMm),
ratios (PhysicalRatioX/Y), BorderResistance, source active, moniteurs exclus
- [ ] Les options layout sont restaurées : Enabled, Algorithm, MaxTravelDistance, Freelook*, LoopX/Y,
AdjustPointer/Speed, AllowOverlaps/Discontinuity
- [ ] Les options globales sont restaurées : Pinned, AutoUpdate, StartMinimized, StartElevated,
DebugTools, ShowMonitorActionWarning, BorderValues, HideTrayIcon, DaemonPort
- [ ] Lecture pure : reg export avant/après lancement (sans sauvegarder) → diff vide, à une
exception près : ExcludedDefaultsVersion peut être écrit une fois si absent (migration top-up).
L'ancien code seedait le registre au chargement (GetOrSet) ; le nouveau ne doit RIEN écrire d'autre.
- [ ] Le moteur démarre et la souris traverse normalement (sanity E2E daemon)

2. Sauvegarde — format byte-for-byte

- [ ] Déplacer un moniteur, sauvegarder, inspecter dans regedit :
valeurs REG_SZ, décimales avec point (culture invariante), bools en "1"/"0"
- [ ] Diff reg export avant/après sauvegarde : uniquement les changements attendus
- [ ] Redémarrer l'app : tout est relu correctement (round-trip complet)

3. Fix Priority (bug corrigé au passage — vérifier qu'il est bien corrigé)

Avant : Priority était sauvée en clé racine mais écrasée au chargement par la valeur
seedée "Normal" de la clé layout → ne persistait jamais.

- [ ] Mettre Priority ≠ Normal dans l'UI, sauvegarder, redémarrer → la valeur est conservée
- [ ] Vérifier dans regedit que Layouts\{id}\Priority est maintenant écrite à la sauvegarde

4. Install vierge (première exécution)

Renommer HKCU\SOFTWARE\Mgth\LittleBigMouse (ex. suffixe .bak) et déplacer le dossier
%LOCALAPPDATA%\Mgth\LittleBigMouse :

- [ ] L'app démarre avec les défauts, sans erreur
- [ ] Excluded.txt est créé et contient les 4 défauts (Epic, steamapps, Riot, XboxGames)
- [ ] Le registre reste (quasi) vide tant qu'on ne sauvegarde pas — pas de seeding au chargement
- [ ] Les moniteurs sont auto-placés depuis la config système (Placed faux → placement auto) ;
changement assumé : au 2ᵉ lancement sans sauvegarde, ils sont TOUJOURS auto-placés
(l'ancien seeding les figeait dès le 2ᵉ lancement — la nouvelle sémantique est celle de Linux)
- [ ] Sauvegarder → la clé se peuple entièrement ; relancer → tout est restauré

5. Migrations legacy (configs anciennes)

Simuler un vieux profil dans regedit :

- [ ] Supprimer Priority, Pinned, AutoUpdate, StartMinimized, StartElevated, HomeCinema
de la clé racine et les créer dans Layouts\{id} → au chargement les valeurs sont reprises ;
après sauvegarde elles arrivent en clé racine
- [ ] Renommer ShowMonitorActionWarning en ShowAttachDetachWarning (ancien nom) → la valeur
est relue ; après sauvegarde le nouveau nom est écrit

6. Migration top-up des exclusions (#494)

- [ ] Écrire dans Excluded.txt uniquement les 3 défauts legacy (Epic, steamapps, Riot),
supprimer la valeur ExcludedDefaultsVersion → lancement : \XboxGames\ est ajouté au fichier,
ExcludedDefaultsVersion=1 écrit en clé racine
- [ ] Liste personnalisée (retirer un défaut legacy) → rien n'est ajouté, la version est écrite quand même
- [ ] Relancer → la migration ne retourne pas (une seule fois par version)

7. Autostart / SaveEnabled / élévation

- [ ] Cocher LoadAtStartup + sauvegarder → tâche planifiée créée ; décocher → supprimée
- [ ] Variante StartElevated : la tâche est créée en RunLevel Highest
- [ ] Scénario élévation au chargement (garde IsLoading) : LoadAtStartup + StartElevated actifs,
redémarrer l'app → la tâche reste élevée (le chargement des options ne doit pas re-planifier
la tâche à mi-parcours et perdre l'élévation)
- [ ] Toggle moteur on/off sans sauvegarder (chemin SaveEnabled) : Layouts\{id}\Enabled mis à jour,
les autres valeurs de la clé layout sont intactes (c'est désormais un read-modify-write du
document complet — vérifier qu'aucune valeur n'est perdue ni altérée), tâche planifiée alignée

8. Bordures par-moniteur (la parité du PR #503 — raison d'être du refactor)

- [ ] Mode PerModel : sauvegarder → PAS de sous-clé Borders sous PhysicalMonitors\{id}
- [ ] Passer en PerMonitor sans redémarrer : les bordures partent des valeurs modèle courantes
- [ ] Éditer les bordures d'un seul moniteur, sauvegarder → Borders\Left/Top/Right/Bottom écrites
pour ce moniteur uniquement
- [ ] Redémarrer → BordersCustomized restauré, valeurs correctes, l'autre moniteur suit toujours son modèle
- [ ] Sauvegarder en mode PerModel après coup → les Borders par-moniteur survivent
- [ ] Bordures modèle (monitors\{pnp}\Borders + Size\Width/Height) : édition, sauvegarde, relecture OK

9. Sources / attach-detach

- [ ] ActiveSource, DisplayName, Primary écrits sous PhysicalMonitors\{id}\{sourceId}\
- [ ] Détacher un moniteur du bureau, le rattacher → sa géométrie pixel est restaurée depuis le store
- [ ] Changement assumé : la géométrie n'est plus sauvée au chargement (seulement à la sauvegarde) ;
un détachement AVANT toute première sauvegarde n'a donc rien à restaurer — comportement Linux, rare

10. SaveLive (options appliquées immédiatement)

- [ ] Changer StartMinimized / AutoUpdate / Pinned / DebugTools sans bouton save → écrits immédiatement
en clé racine ; effectifs au prochain démarrage
- [ ] Changement assumé : SaveLive écrit désormais TOUTES les options globales (comportement Linux),
pas seulement les 6 historiques — vérifier qu'aucun effet de bord visible (ex. une valeur éditée
mais non sauvée type HideTrayIcon devient persistée)
- [ ] La boucle live-save ne réagit pas pendant un chargement (pas d'écho d'écritures au lancement)

11. Multi-layout & divers

- [ ] Changer la topologie (débrancher/rebrancher un écran, dock) → chaque combinaison garde sa propre
clé Layouts\{id} avec ses valeurs, sans contamination croisée
- [ ] DaemonPort personnalisé dans le registre → toujours honoré (il n'est plus seedé au chargement,
mais il est maintenant écrit à la sauvegarde)
- [ ] Lancement en admin → Elevated détecté, UI cohérente
- [ ] Exclusion process : lancer un jeu sous un chemin exclu → LBM ne traverse pas (le daemon lit
toujours le même Excluded.txt, chemin inchangé)

Changements de comportement ASSUMÉS (ne pas les signaler comme bugs)

1. Plus de seeding du registre au chargement — les valeurs apparaissent à la première sauvegarde
2. Placed ne devient vrai qu'après une vraie sauvegarde (install vierge : auto-placement à chaque
lancement tant qu'on n'a pas sauvé)
3. SaveLive écrit toutes les options globales, pas seulement les 6 historiques
4. SaveEnabled réécrit le document layout complet (valeurs identiques) au lieu de la seule valeur Enabled
5. HomeCinema n'est plus écrit dans la clé layout (global uniquement ; l'ancienne valeur layout
reste lue en fallback)
6. Priority/PriorityUnhooked sont maintenant écrites aussi dans la clé layout (c'est le fix du §3)
7. La géométrie des sources attachées n'est plus sauvée au chargement (seulement à la sauvegarde)

---

README

Little Big Mouse

<p align="center">
<img src="https://raw.githubusercontent.com/mgth/LittleBigMouse/master/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Assets/lbm.png" width="200" alt="Little Big Mouse Logo"/>
</p>

TIP

## 🌐 New: littlebigmouse.mgth.fr — the official website


Little Big Mouse now has a home of its own: littlebigmouse.mgth.fr — what it does, downloads, and guides, always in sync with this repository.

> ⚠️ Warning! Note that littlebigmouse.com is not affiliated with this project. It is used to distribute malware. We don't operate that site, don't know who does, and can't vouch for anything it publishes. If you have some time to help, please report it to google or other search engines.

> The only official sources for Little Big Mouse are this repository — with its Releases page — and littlebigmouse.mgth.fr.

TIP

## 🐧 New: Little Big Mouse is on the AUR


Arch Linux users get a real package — no more cloning and building by hand:

> ``bash

paru -S littlebigmouse # or: yay -S littlebigmouse

`

> [](https://aur.archlinux.org/packages/littlebigmouse)

[](https://aur.archlinux.org/packages/littlebigmouse)

> It builds from the tagged sources and ships the desktop entry, the icon and the udev

rule for /dev/uinput. One manual step remains — joining the input group — see

Linux.

IMPORTANT

## 🎉 5.6.0 is out!


Your monitors land where Windows has them. The automatic placement lost the vertical offset between neighbouring screens, so a monitor sitting a little higher than the one beside it came out stacked a whole screen height away — and the first layout you were shown never matched what Place from windows config gave you afterwards (#531). Both are fixed, and the two directions now round-trip.

> Border resistance, drawn where you want it (#522): sections along any edge, each with its own resistance, and separate settings for moving and for dragging a window. Live update (#525) sends your changes to the mouse engine as you make them, so you can feel a layout before keeping it — pick it from the arrow next to the apply button. And when a layout traps the cursor somewhere you cannot click, hold Ctrl+Alt+Shift+M to get the mouse back (#528) — configurable in the options.

> Closing with unsaved changes now asks first (#530), and the C++ hook is gone: the Rust daemon is the only one, and the test suites finally run in CI (#524).

> ⬇ Download 5.6.0 — requires the .NET 10 Runtime (x64).

> The rescue shortcut is Windows-only for now; the Linux release follows separately.

> Something not working? Tell us 🙏

Little Big Mouse (LBM) is an open-source software designed to enhance the multi-monitor experience on Windows 10 and 11 by providing accurate mouse screen crossover location within multi-DPI monitors environments. This is particularly useful for setups involving a 4K monitor alongside a full HD monitor.

Donations

If you find Little Big Mouse helpful, consider supporting the project with a donation. Your contribution helps us maintain and improve the software.

[](https://github.com/sponsors/mgth)
[](https://ko-fi.com/G5X022D1RW)
[](https://liberapay.com/mgth/donate)

Presentation Video

Check the very nice video from Touble Chute (a very big thanks to him):

[](https://www.youtube.com/watch?v=6D46stJMP68)


Features

- Smooth Mouse Transitions: Ensures smooth and accurate mouse movement across screens with different DPI settings.
- Screen Looping: Lets the cursor wrap around the desktop — leave the last screen and re-enter from the first, horizontally or vertically.
- Display Size Adjustments: Allows for adjustments in the relative sizes of displays.
- Border Resistance: Allow some resistance before crossing.
- Rescue Shortcut: A keyboard way out when a layout leaves the cursor somewhere it cannot escape — the one recovery that does not need a click.
- Live Update: Feel a layout while you edit it. Changes go straight to the mouse engine as you make them, without being saved, so you can try a resistance or a position with the real mouse instead of applying it and undoing it.
- Display Color and Brightness Balancing: Offers control over color and brightness profiles of displays.
- Access to Display Debugging Information: Provides detailed information from your displays and drivers.

Installation

1. Download the latest release from the Releases page.
2. Run the Little Big Mouse installer from your computer.
3. (Optional) Change the default installation path.
4. Follow the installation progress and complete the installation.
5. Access the program from the Start Menu.

Linux (experimental)

The Linux port works, but is still experimental. Mouse routing uses an evdev/uinput
backend — it grabs the physical mice and drives a virtual pointer, exactly like the
Windows hook — with Wayland-portal and X11 fallbacks. It is developed and tested on
KDE Plasma 6 (Wayland); feedback from other desktops is very welcome on the
issues page.

Arch Linux — install from the AUR

[](https://aur.archlinux.org/packages/littlebigmouse)

bash
paru -S littlebigmouse   # or: yay -S littlebigmouse

That is the whole install. The package builds the Rust hook daemon and the Avalonia UI
from the tagged sources, and lays down:

- the app in /usr/lib/littlebigmouse with littlebigmouse on your PATH;
- a desktop entry and the icon, so it shows up in your launcher;
- a udev rule granting the
input group write access to /dev/uinput.

It depends on dotnet-runtime-10.0 rather than bundling .NET, so runtime security
updates come through pacman.
ddcutil, kscreen and argyllcms are optional
dependencies — install them for monitor brightness/contrast control, Plasma layout
detection and colorimeter support respectively.

One manual step remains, because a package cannot add you to a group:

bash
sudo gpasswd -a "$USER" input   # then log out and back in

Without it the daemon falls back to the Wayland portal or X11, which cannot intercept
the cursor crossing between adjacent screens on KWin. Note that
input group membership
lets every program you run read all keyboard and mouse events.

The packaging recipe lives in packaging/arch; issues with the
package go to the issue tracker like
anything else.

Other distributions — build from source

- The .NET 10 SDK (the runtime alone is not enough to build) and the Rust
toolchain (
cargo):
- Arch / CachyOS:
sudo pacman -S dotnet-sdk rust
- other distros: .NET SDK and rustup
- Access to
/dev/input and /dev/uinput for the evdev backend: add yourself to the
input group (sudo usermod -aG input $USER), then log out and back in — without
it the daemon silently falls back to the portal/X11 backend.

Build and run

bash
git clone --recursive https://github.com/mgth/LittleBigMouse.git
cd LittleBigMouse
./run-lbm.sh

run-lbm.sh builds the hook daemon (cargo) and the UI (dotnet), stages everything and
relaunches the app. UI and daemon logs land in
/tmp/lbm-ui.log. If you cloned without
--recursive, run git submodule update --init --recursive first — the HLab projects
are submodules.

Tests

bash
dotnet test LittleBigMouse.sln
cargo test --manifest-path LittleBigMouse-Hook-Rust/Cargo.toml

Both are what CI runs, before it builds anything for shipping.

Usage

Documentation : https://littlebigmouse.mgth.fr/docs/ and https://github.com/mgth/LittleBigMouse/wiki

Little Big Mouse provides a single-window interface with three main sections:

- Top Panel: Access view tabs for display and display adapter information, changing relative sizes and positions of displays, and adjusting color and brightness profiles.
- Center Panel: Displays information about your display devices, including makes and models, capabilities, adapters, and relative positions.
- Bottom Panel: Exporting or copying the layout, and the operations that act on it — save, apply, stop, undo.

Applying a layout

The apply button hands the layout to the mouse engine and saves it. The arrow next to it
chooses how changes get there:

- Apply on click — the default. Nothing reaches the engine until you press the button.
- Live update — every change reaches the running engine as you make it, so the layout
can be felt with the real mouse straight away.

Live update saves nothing: the button is still what keeps a layout, and Undo goes back
to the last saved one. Nothing about it survives closing the app either — a restarted
engine comes back to the layout you last applied, never to something you were only trying
out.

If the cursor gets trapped

A layout can leave the cursor somewhere it cannot get out of — and then Undo, Stop and the
tray menu are all behind a click you cannot make. Hold
Ctrl+Alt+Shift+M` for about a
second and the mouse comes back:

- while live update is on, the layout you were trying is thrown away and the engine
goes back to the one you saved;
- otherwise the engine stops, and the mouse behaves the way Windows alone would until you
start it again.

The combination is yours to change under Options → Mouse → Rescue shortcut: click it
and press the one you want. If another application already owns that combination, the
setting says so — a rescue you only discover is missing when you need it would be worse
than none.

Windows only for now — the setting is not shown elsewhere. Wayland has no global
shortcut without a portal, and reading one from evdev would mean opening the keyboard
devices, which is a great deal more than a mouse utility should ask for.

Support

If you encounter any issues or have suggestions for improvements, please open an issue on our Issues page. We appreciate your feedback and are always looking to improve the tool.

Little Big Mouse collects no analytics and sends no telemetry; what it stores and the few cases where it uses the network are set out in the privacy policy. How releases are signed, and how to check a download you just made, is documented in SIGNING.md.

We Welcome Contributions: Your help is invaluable! Whether it's reporting bugs, suggesting new features, or submitting pull requests, we encourage you to get involved. Your contributions can make a significant difference in the development and improvement of Little Big Mouse. First time? Check out This guide to get started.

Acknowledgements

- HLab Project: Little Big Mouse depends on the HLab project for its functionality. Check out the HLab and HLab.Avalonia repositories for more information.
- MouseKeyboardActivityMonitor: Inspired by the MouseKeyboardActivityMonitor project.
- Task Scheduler Managed Wrapper: Utilizes the Task Scheduler Managed Wrapper for scheduling tasks.
- SignPath Foundation: Free code signing provided by SignPath.io, certificate by SignPath Foundation.

Thank you for using Little Big Mouse!

---