Idea: virtual KVM

Ok, so I often have two machines running, a desktop with two screens and a laptop with one screen. It looks like this:
(Click on the photo for an explanation of each screen). It would be cool if my mouse would work on all three screens, even though it's another computer. It would be REALLY useful if they also shared a clipboard. How would it work?

A program runs on both the master and slave computer. The slave waits for mouse event information on a port, and when it's recieved the slave software generates low-level mouse events. The master waits for a certain gesture (in this case, hitting the edge of the middle screen) and then starts sending mouse events to the slave. Moving clipboard information around is more interesting - basically I would make it so that when the "remote" cursor copies something and then it comes back, a clipboard transfer occurs. I have no idea how copy/paste information is stored or how it would be transferred - and that's where the interest lies. One could extend this easily to transmit keyboard events as well.

This is kind of like CrossLoops or LogMeIn but without the need to reproduce video data.

This would be a really nice little utility for a Windows hacker to come up with. (Could it be done in Java? probably)

[Note on making this post: what a cool workflow! I took the photo with my iPhone, emailed it to flickr, went to my flickr account and dragged the photo into Scribefire. I then posted, looked at my blog in another tab and copied the link into Flickr. Sweet.]

[Update: Jim White points out a wonderful tool called Synergy that does exactly what I want. Big thanks to Chris Schoeneman & friends for writing it.]

[Update: Well, Synergy works great. I still think it would be a fun Java
project though (and heaven knows that we computer programmers will never tire
of reinventing the wheel).

Additionally there are four enhancements I would like to see:
  1. Support for cross-machine drag-n-drop.
  2. Improved security (when on the client machine keystrokes and clipboard data are transmitted in the clear; could be solved with a simple tunnel)
  3. Improved usability (setup could be a lot more intuitive)
  4. Support for arbitrary screen locations (screens are always assumed to be at the same height, which is often wrong; my tablet is often *below* my primary screen when used as a writing surface)

And as much as I love cross-platform C++, I'm a Java guy. :)

Technorati Tags: , ,


Anonymous said...

That's a really good idea - i think you should do it.

josh said...

Big thanks to Jim White ( for pointing out Synergy ( which basically does exactly what I want (and more).

Chris Schoeneman said...

i'm glad you like it. on reading your blog i noticed point #4. synergy allows screens to be above or below, not just to the left or right, and you can map any portion of one screen's edge to any portion of the edge it's linked to. for example, you can map the right half of the bottom of one screen to the left half of the top of another screen. if what you're looking for is to change locations on the fly synergy can do that but it's not very convenient (update the configuration file and send the
server a SIGHUP).