I hate spending money on hardware when there's a software solution. like, I've got a subwoofer from a 2.1 system (without satellites) for free. instead of sourcing speakers for it, however cheap they might be, I'll just utilize the speakers from my monitor. pipewire
to the rescue, it creates a combined sink that outputs sound to both DP and analog audio, et voila - a 2.1 sound system. people are like "your monitor sounds like that!?" and usually I play dumb: "yeah, yours doesn't? well that's linux for ya".
so, I have a desktop and a laptop and I'd like to share the same monitor, keyboard, and mouse. modern monitors have a KVM switch integrated, you connect your keyboard/mouse/etc. to it, one USB Type-C cable to the laptop, a couple to the desktop and you have a seamless switch; it even charges the laptop, how cool is that!
however, my monitor works just fine and I don't replace my hardware unless I really have to. USB KVMs with similar functions aren't cheap. also, the monitor already has multiple display inputs so I got to thinking, how do I re-create this with no money, or as little as possible, with DIY tech?
first, switching the display; this one took me no time at all. I have a USB Type-C to DP cable (with DP-Alt) and with the power of udev
(detect a connection then trigger stuff) and ddcutil
(sends commands to the monitor) I got it working as seamless as possible - I connect the laptop and it automagically switches the monitor over. when I disconnect it, the monitor falls back to an active connection, which is the desktop. awesome!
now how about switching the keyboard and mouse over? I'd like to do it in software, like barrier/inputleap does it but without having to move the cursor to the adjacent monitor. also, both machines are on wayland which isn't supported. eventual input lag to the laptop is unimportant, I game on the desktop. no idea if that can be accomplished or if that's even a thing...
that is a thing - it's called USB/IP, i.e. sharing your USB device over TCP/IP; it's a kernel module included by default for a long time now and that thing rocks! not only does the USB keyboard work without any perceivable lag on the laptop, it get's "disconnected" from the host, so your keypresses aren't disturbing the host. since it's a kernel module, no need to convince wayland to play ball! this also works for webcams, scanners, readers, etc., the client system thinks this is a local device and it just works.
so all we have to do is expand the shell script to bring over the keyboard and mouse along with switching over the monitor once the USB-C connection is detected annnd... success!
well, sorta. my wireless mouse is second-hand and I haven't got the USB receiver for it, so it connects over bluetooth. tried sharing with usbip
and it works, but the radio connection gets interrupted or something and the mouse doesn't work there. maybe there's a workaround but I don't want to dig further.
also, how do I switch back to the desktop to shoot some peggies? I don't want to disconnect the laptop manually so I could come up with a slew of shell scripts and udev triggers and I'd also need a ssh tunnel, I don't want my keyboard input to travel over the LAN in cleartext, etc... kinda cumbersome. also, once the novelty wears off, the automagicallity gets tired, I'd prefer manually switching between devices with a keyboard combo.
enter rkvm. it's written in rust and as everybody knows that's super awesome. unlike usbip
, comms are encrypted, so no sniffing possible, and hotkey switching is a default function, and it also handles the mouse!
now, rkvm
currently doesn't support triggers, like "do X when hotkey combo pressed", but Plasma can handle running the monitor switch script on each device separately by listening to the same hotkey combo.
both solutions have their advantages and disadvantages, usbip
requires more legwork but is more powerful whereas rkvm
is simpler and easier to set up.
the final step, powering the laptop over the same cable. sadly, can't handle that in software, but there are power delivery injectors out there, some as cheap as $7. also, there's this cool project, looks easy enough to source and implement. not sure if I'm going that way or just go with a used dock station, as those can be had for a song for popular business ex-flagships, like the Thinkpad T-series, HP Elitebooks, Dell Latitudes, etc..
are there downsides? sure there are. numero uno, the host (desktop, in my case) has to be on all the time. not a big deal for me, it gets woken in the morning and suspended late at night. there are edge cases when rkvm geeks out, but for a thing that's in its 0.x version, this is more than usable.
so, I've been using this setup for the past week or so and haven't yet found it to break or have any negative side-effects. gaming on the desktop is as snappy (or shitty) as ever and using my mech keyboard and giant screen on the laptop allows me to easily compartmentalize my business and private stuff.
thanks for reading!
edit: edited title to clarify I'm talking about a Keyboard-Video-Mouse switch, not a Kernel-Virtual-Machine.
I deployed RocketChat on two different client installations (didn't check the licensing you're mentioning, I'll have to look into that) and I run a Prosody instance (XMPP) on my own; tried Matrix for a short while and ran away from that mess as fast as I could. anyhow, although the messengers work without any significant issues or downtime, the amount of flak I get from non-tech normies about the client apps is staggering.
the apps just aren't up to current UX standards. they're used to Twitter and iMessage and Telegram quality UX, and getting used to these PoC-quality apps - both on mobile and desktop - makes them "feel icky". I've had to intervene on a number of occasions when some of them transferred their business-related comms to other platforms because they just can't/won't get used to these apps.