[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: mouseemu conflicts with ikeyd



> Following up on my own explanations:

Again ...

> Event passthrough is not even reaching ikeyd - ikeyd explicitly scans for
> the button device _only_. ikeyd needs to be fixed to search for a virtual
> keyboard and mouse device _first_, and use that if present. I can cook up
> a patch if necessary. While we're at it - ikeyd needs to be made aware of
> udev as well.

See attached patch - virtual keyboard device is probed first. ikeyd now
gets to see events on my system. Test and improve, please.

	Michael
--- ikeyd.c.org	2006-02-20 18:03:44.000000000 +0100
+++ ikeyd.c	2006-02-20 18:06:30.000000000 +0100
@@ -97,6 +97,7 @@
 static int check_pmu ();
 static void check_pidfile ();
 static int find_button_device ();
+static int find_virtual_device ();
 static void eject_cdrom ();
 static void volume_change (int level);
 static void remove_pidfile (int signum);
@@ -180,8 +181,12 @@
       exit (EXIT_FAILURE);
     }
 
-  /* now search the button device */
-  eventfd = find_button_device ();
+  /* now search the virtual event devices */
+  eventfd = find_virtual_device ();
+  if (eventfd < 0) {
+    /* now search the button device */
+    eventfd = find_button_device ();
+  }
 
   /* check the pidfile */
   check_pidfile ();
@@ -585,6 +590,94 @@
   return eventfd;
 }				/* »»» */
 
+/* static int find_virtual_device () ««« */
+static int
+find_virtual_device ()
+{
+  /* the filename of the event interface */
+  char *filename;
+  /* the filedescriptor of the event interface */
+  int eventfd = -1;
+  struct input_id id;
+  char name[256] = "UNKNOWN";
+  int i;
+
+  for (i = 0; i < 32; i++)
+    {
+      filename = malloc (strlen (EVENT_PATH) + 3);
+      sprintf (filename, "%s%i", EVENT_PATH, i);
+      /* try to open the device */
+      eventfd = open (filename, O_RDONLY);
+      /* if opening suceeded */
+      if (eventfd >= 0)
+	{
+	  /* check the id of the event interface */
+	  ioctl (eventfd, EVIOCGID, &id);
+	  if (want_verbose)
+	    {
+	      ioctl (eventfd, EVIOCGNAME(sizeof(name)), name);
+	      printf("%s: input: %s name: %s bustype: %d vendor: %d product: %d version: %d\n",
+		  PACKAGE, filename, name, id.bustype, id.vendor, id.product, id.version);
+	    }
+	  
+	  if ((id.product & 0xfff) == 0x01f && (id.vendor & 0xfff) == 0x01f)
+	    {
+	      if (!want_quiet)
+		printf ("%s: Virtual event device found at %s\n", PACKAGE, filename);
+	      event_device = filename;
+	      break;
+	    }
+	  else
+	    {
+	      close (eventfd);
+	      eventfd = -1;
+	    }
+	}
+    }
+
+  /* when no event filedesctiptor is set e.g. the event device could not be found */
+  if (!(eventfd >= 0))
+    {
+      free (filename);
+
+      /* check if we are root */
+      if (geteuid () != 0)
+	{
+	  printf
+	    ("%s: Couldn't access /dev/input/event* perhaps you are not root?\n",
+	     PACKAGE);
+	  exit (0);
+	}
+
+      /* check if the kernel module is loaded */
+      if (!system ("lsmod | grep evdev"))
+	{
+	  printf
+	    ("%s: The evdev kernel module is already loaded, so it seems\n",
+	     PACKAGE);
+	  printf ("%s: something else is going wrong.\n", PACKAGE);
+	  exit (0);
+	}
+
+      /* when the kernel module is not loaded and we are not root
+       * try to load the kernel module... */
+      printf ("%s: I' will try to load some modules...\n", PACKAGE);
+      printf ("%s: loading evdev...\n", PACKAGE);
+      if (!system ("modprobe evdev"))
+	{
+	  printf ("%s: loading succeeded.\n", PACKAGE);
+	  return find_button_device ();
+	}
+      else
+	printf ("%s: Something wrent wong loading the evdev module.\n",
+		PACKAGE);
+
+      exit (0);
+    }
+
+  return eventfd;
+}				/* »»» */
+
 /* static void eject_cdrom () ««« */
 static void
 eject_cdrom ()

Reply to: