import kudzu
from simpleconfig import SimpleConfigFile
from snack import *
import os

class Mouse (SimpleConfigFile):
   mice = {
       "ALPS - GlidePoint (PS/2)" :
               ("ps/2", "GlidePointPS/2", "psaux", 1),
       "ASCII - MieMouse (serial)" :
               ("ms3", "IntelliMouse", "ttyS", 1),
       "ASCII - MieMouse (PS/2)" :
               ("ps/2", "NetMousePS/2", "psaux", 1),
       "ATI - Bus Mouse" :
               ("Busmouse", "BusMouse", "atibm", 1),
       "Generic - 2 Button Mouse (serial)" :
               ("Microsoft", "Microsoft", "ttyS", 1),
       "Generic - 3 Button Mouse (serial)" :
               ("Microsoft", "Microsoft", "ttyS", 0),
       "Generic - 2 Button Mouse (PS/2)" :
               ("ps/2", "PS/2", "psaux", 1),
       "Generic - 3 Button Mouse (PS/2)" :
               ("ps/2", "PS/2", "psaux", 0),
       "Genius - NetMouse (serial)" :
              ("ms3", "IntelliMouse", "ttyS", 1),
       "Genius - NetMouse (PS/2)" :
               ("netmouse", "NetMousePS/2", "psaux", 1),
       "Genius - NetMouse Pro (PS/2)" :
               ("netmouse", "NetMousePS/2", "psaux", 1),
       "Genius - NetScroll (PS/2)" :
               ("netmouse", "NetScrollPS/2", "psaux", 1),
       "Kensington - Thinking Mouse (PS/2)" :
               ("ps/2", "ThinkingMousePS/2", "psaux", 1),
       "Logitech - C7 Mouse (serial, old C7 type)" :
               ("Logitech", "Logitech", "ttyS", 0),
       "Logitech - CC Series (serial)" :
               ("logim", "MouseMan", "ttyS", 0),
       "Logitech - Bus Mouse" :
               ("Busmouse", "BusMouse", "logibm", 0),
       "Logitech - MouseMan/FirstMouse (serial)" :
               ("MouseMan", "MouseMan", "ttyS", 0),
       "Logitech - MouseMan/FirstMouse (PS/2)" :
               ("ps/2", "PS/2", "psaux", 0),
       "Logitech - MouseMan+/FirstMouse+ (serial)" :
               ("pnp", "IntelliMouse", "ttyS", 0),
       "Logitech - MouseMan+/FirstMouse+ (PS/2)" :
               ("ps/2", "MouseManPlusPS/2", "psaux", 0),
       "Microsoft - Compatible Mouse (serial)" :
               ("Microsoft",    "Microsoft", "ttyS", 1),
       "Microsoft - Rev 2.1A or higher (serial)" :
               ("pnp", "Auto", "ttyS", 1),
       "Microsoft - IntelliMouse (serial)" :
               ("ms3", "IntelliMouse", "ttyS", 1),
       "Microsoft - IntelliMouse (PS/2)" :
               ("imps2", "IMPS/2", "psaux", 1),
       "Microsoft - Bus Mouse" :
               ("Busmouse", "BusMouse", "inportbm", 1),
       "Mouse Systems - Mouse (serial)" :
               ("MouseSystems", "MouseSystems", "ttyS", 1),
       "MM - Series (serial)" :
               ("MMSeries", "MMSeries", "ttyS", 1),
       "MM - HitTablet (serial)" :
               ("MMHitTab", "MMHittab", "ttyS", 1),
       "None - None" :
               ("none", "none", "null", 0),
       "Sun - Mouse":
               ("sun", "sun", "sunmouse", 0),
       }

   # XXX fixme - externalize
   def __init__ (self, xmouseType = None, mouseType = None):
       self.info = {}
       self.device = None

       if (xmouseType):
           (proto, emulate, device) = xmouseType
           mouseType = None
           mice = self.mice.keys()
           mice.sort()
           for desc in mice:
               (gpm, x11, dev, em) = self.mice[desc]
#               print "trying %s: '%s', '%s'" % (desc, x11, proto)
               if (x11 == proto and emulate == em):
                   if (desc[:7] == "Generic" or desc[:3] == "Sun"):
                       mouseType = (desc, emulate, device)
                       break
           self.device = device
           if not mouseType:
               raise KeyError, "unknown X11 mouse type %s" % proto

       if (mouseType):
           if (len(mouseType) == 3):
               apply(self.set, mouseType)
       else:
           list = kudzu.probe(kudzu.CLASS_MOUSE, kudzu.BUS_UNSPEC,
                              kudzu.PROBE_ONE)
           if (list):
               (device, module, desc) = list[0]

               if device == "sunmouse":
                   self.set("Sun - Mouse", 0)
               elif device == "psaux":
                   self.set("Generic - 3 Button Mouse (PS/2)", 0)
               else:
                   self.set("Generic - 2 Button Mouse (serial)", 1)

               self.device = device
           else:
               self.set("Generic - 2 Button Mouse (serial)", 1, 'ttyS0')

   def available (self):
       return self.mice

   def get (self):
       return (self.info ["FULLNAME"], self.emulate)

   def __str__(self):
       if (self.emulate):
           self.info["XEMU3"] = "yes"
       else:
           self.info["XEMU3"] = "no"
       return SimpleConfigFile.__str__(self)

   def makeLink(self, root):
       try:
           os.unlink(root + "/dev/mouse")
       except:
           pass
       if (self.device):
           os.symlink(self.device, root + "/dev/mouse")

   def getDevice(self):
       return self.device

   def setDevice(self, device):
       self.device = device

   def set (self, mouse, emulateThreeButtons = -1, thedev = None):
       (gpm, x11, dev, em) = self.mice[mouse]
       self.info["MOUSETYPE"] = gpm
       self.info["XMOUSETYPE"] = x11
       self.info["FULLNAME"] = mouse
       if emulateThreeButtons != -1:
           self.emulate = emulateThreeButtons
       else:
           self.emu = em
       if not self.device and thedev: self.device = thedev
       if not self.device: self.device = dev