### 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 `$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

Little Big Mouse Logo

> [!TIP] > ## 🌐 New: [littlebigmouse.mgth.fr](https://littlebigmouse.mgth.fr/) — the official website > Little Big Mouse now has a home of its own: **[littlebigmouse.mgth.fr](https://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](https://github.com/mgth/LittleBigMouse/releases) page — and [littlebigmouse.mgth.fr](https://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](#linux-experimental). > [!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](https://github.com/mgth/LittleBigMouse/releases/tag/v5.6.0)** — requires the [.NET 10 Runtime (x64)](https://dotnet.microsoft.com/en-us/download/dotnet/10.0). > > The rescue shortcut is Windows-only for now; the Linux release follows separately. > > Something not working? [Tell us](https://github.com/mgth/LittleBigMouse/issues) 🙏 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](https://github.com/mgth/LittleBigMouse/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](https://github.com/mgth/LittleBigMouse/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`](packaging/arch); issues with the package go to the [issue tracker](https://github.com/mgth/LittleBigMouse/issues) 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](https://dotnet.microsoft.com/download/dotnet/10.0) and [rustup](https://rustup.rs) - 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](https://github.com/mgth/LittleBigMouse/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](PRIVACY.md). How releases are signed, and how to check a download you just made, is documented in [SIGNING.md](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](https://github.com/firstcontributions/first-contributions) to get started. ## Acknowledgements - **HLab Project**: Little Big Mouse depends on the HLab project for its functionality. Check out the [HLab](https://github.com/mgth/HLab.Core) and [HLab.Avalonia](https://github.com/mgth/HLab.Avalonia) repositories for more information. - **MouseKeyboardActivityMonitor**: Inspired by the [MouseKeyboardActivityMonitor](https://github.com/gmamaladze/globalmousekeyhook) project. - **Task Scheduler Managed Wrapper**: Utilizes the [Task Scheduler Managed Wrapper](https://github.com/dahall/TaskScheduler) for scheduling tasks. - **SignPath Foundation**: Free code signing provided by [SignPath.io](https://about.signpath.io), certificate by [SignPath Foundation](https://signpath.org). Thank you for using Little Big Mouse! ---