The Mouse Detective :-) This is an incomplete program for mouse detection. The idea is to use it in some kind of dialog that says: try to move your mouse and click on the OK button. If this doesn't work, enter return [the keyboard focus is on cancel]. Use it like this: $ ./mdetect -v Found the following devices: /dev/ttyS1 /dev/ttyS0 /dev/psaux [start moving mouse] microsoft: 105 102 logitech: LM -27 27 microsoft: L 6 -43 logitech: LM 93 191 microsoft: 7 -7 Detected microsoft mouse on /dev/ttyS0 You can see it switching between logitech and microsoft mode until it settles on microsoft mode. Invoking it without the -v switch disables all output except for the `Detected ... mouse' line. Currently, the following mice are reported: psaux PS/2 mousesystems MouseSystems compatible microsoft Old Microsoft protocol logitech Some (old) logitech mice mouseman MouseMan (microsoft with 3/4 packet extension) Here's a framework that I think might work 1. Start the mouse detection program 2. Start X server, display dialog 3. User starts moving the mouse 4. Detection program tries to understand what the mouse tries to say (this is stage1). It should arrive at a decision within 1 sec. 5a. Detection program has decided on a driver. Enters stage2, where it writes the mouse packets it received into a fifo (but now, in a mouse-type independent packet format). This is basically what gpm -R does. Pointer starts to move on the screen. 5b. Detection Program wasn't able to detect mouse type. It doesn't do anything. Pointer doesn't move, user has to select mouse manually. NB: How does XF86Config set the mouse type? I assume there's an X extension? If so, in step 5, we can also tell the X server what mouse to use (if we know what to use), and exit. This is a lot better than the fifo approach. Mode of Operation What the program does is open all available devices for reading. Whenever it gets a byte, it lets all drivers (currently psaux, microsoft, logitech) have a look at it. If the driver can make sense of the packet, fine. If any driver is able to successfully decode 20 mouse packets in a row, it is considered _the_ driver. Serial mice are a bit special, since they use different line settings etc. So there's a serial 'meta' driver that sets the line characteristics to those of each driver in turn. Currently, I'm able to detect either ps2 or an M$-compatible mouse fairly reliably. I haven't tested the logitech code. If you don't jiggle the mouse too hard, detection is faster; otherwise, it will start with a few false guesses before settling on the right one. Good packets are those that can be decoded, have reasonable dx/dy values and no mouse button pressed. (this might be improved by looking at the second derivative, so to speak: changes in dx/dy values sent by the mouse shouldn't be too large). The question is whether this is really worth the trouble. Maybe we will have as high a success rate if we use ps2 when able to open the device; and ttyS0 with the M$ protocol otherwise.