--- xc/programs/Xserver/hw/xfree86/os-support/shared~/VTsw_usl.c	2002-09-16 20:06:14.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/os-support/shared/VTsw_usl.c	2003-09-13 20:32:25.000000000 +0200
@@ -41,20 +41,41 @@
 void
 xf86VTRequest(int sig)
 {
-	signal(sig, (void(*)(int))xf86VTRequest);
-	xf86Info.vtRequestsPending = TRUE;
+        /*MU change*/
+/*MU debug*/ xf86Msg(X_INFO,"xf86VTRequest entered, sig=%d\n",sig);
+        if ( MUtype == eMUnone || MUtype == eMUconsole )
+        {
+	    signal(sig, (void(*)(int))xf86VTRequest);
+	    xf86Info.vtRequestsPending = TRUE;
+        }
+        /*MU end*/
 	return;
 }
 
 Bool
 xf86VTSwitchPending()
 {
-    return(xf86Info.vtRequestsPending ? TRUE : FALSE);
+    /*MU change*/
+/*MU debug*/ if(xf86Info.vtRequestsPending) xf86Msg(X_INFO,"xf86VTSwitchPending entered (and wanted)\n");
+        if ( MUtype == eMUnone || MUtype == eMUconsole )
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
+        return(xf86Info.vtRequestsPending ? TRUE : FALSE);
+    }
+    else
+    {
+        return FALSE;
+    }
+    /*MU end*/
 }
 
 Bool
 xf86VTSwitchAway()
 {
+    /*MU change*/
+/*MU debug*/ xf86Msg(X_INFO,"xf86VTSwitchAAway entered\n");
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	xf86Info.vtRequestsPending = FALSE;
 	if (ioctl(xf86Info.consoleFd, VT_RELDISP, 1) < 0)
 	{
@@ -64,11 +85,21 @@
 	{
 		return(TRUE);
 	}
+    }
+    else
+    {
+        return FALSE;
+    }
+    /*MU end*/
 }
 
 Bool
 xf86VTSwitchTo()
 {
+    /*MU change*/
+/*MU debug*/ xf86Msg(X_INFO,"xf86VTSwitchTo entered\n");
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	xf86Info.vtRequestsPending = FALSE;
 	if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ) < 0)
 	{
@@ -78,4 +109,10 @@
 	{
 		return(TRUE);
 	}
+    }
+    else
+    {
+        return TRUE;
+    }
+    /*MU end*/
 }
--- xc/programs/Xserver/hw/xfree86/os-support/linux~/lnx_init.c	2001-10-31 23:50:30.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c	2003-09-13 21:41:20.000000000 +0200
@@ -57,10 +57,12 @@
 #ifdef USE_DEV_FB
     struct fb_var_screeninfo var;
     int fbfd;
+/*MU debug*/ xf86Msg(X_INFO,"MU: USE_DEV_FB is defined\n");
 #endif
     char *tty0[] = { "/dev/tty0", "/dev/vc/0", NULL };
     char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
 
+/*MU debug*/ xf86Msg(X_INFO,"In xf86OpenConsole, MUtype=%d\n", MUtype);
     if (serverGeneration == 1) 
     {
 	/* check if we're run with euid==0 */
@@ -87,23 +89,44 @@
 		FatalError(
 		    "xf86OpenConsole: Cannot open /dev/tty0 (%s)\n",
 		    strerror(errno));
-	    if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
-		(xf86Info.vtno == -1)) {
-		FatalError("xf86OpenConsole: Cannot find a free VT\n");
+/*MU debug*/ xf86Msg(X_INFO,"MU: i=%d for finding tty0[i]\n",i);
+            /*MU change*/
+            if ( MUtype == eMUnone || MUtype == eMUconsole )
+            {
+	        if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
+		        (xf86Info.vtno == -1)) 
+                {
+		    FatalError("xf86OpenConsole: Cannot find a free VT\n");
+                }
+            }
+	    else if (ioctl(fd, VT_GETSTATE, &vts) == 0)
+	    {
+	    	xf86Info.vtno = vts.v_active;
+	    } 
+            else 
+            {
+		FatalError("xf86OpenConsole: Cannot find the current VT\n");
 	    }
+/*MU debug*/ xf86Msg(X_INFO,"MU: xf86Info.vtno=%d\n",xf86Info.vtno);
+            /*MU end*/
 	    close(fd);
 	}
 
+/*MU change*/
 #ifdef USE_DEV_FB
-	fb_dev_name=getenv("FRAMEBUFFER");
-	if (!fb_dev_name)
-	    fb_dev_name="/dev/fb0current";
-	if ((fbfd = open(fb_dev_name, O_RDONLY)) < 0)
-	    FatalError("xf86OpenConsole: Cannot open %s (%s)\n",
-	fb_dev_name, strerror(errno));
-	if (ioctl(fbfd, FBIOGET_VSCREENINFO, &var))
-	    FatalError("xf86OpenConsole: Unable to get screen info\n");
+        if ( MUtype == eMUnone || MUtype == eMUconsole )
+        {
+	    fb_dev_name=getenv("FRAMEBUFFER");
+	    if (!fb_dev_name)
+	        fb_dev_name="/dev/fb0current";
+	    if ((fbfd = open(fb_dev_name, O_RDONLY)) < 0)
+	        FatalError("xf86OpenConsole: Cannot open %s (%s)\n",
+	    fb_dev_name, strerror(errno));
+	    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &var))
+	        FatalError("xf86OpenConsole: Unable to get screen info\n");
+        }
 #endif
+/*MU end*/
 	xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
 
 	if (!KeepTty) {
@@ -118,6 +141,7 @@
 		break;
             i++;
         }
+/*MU debug*/ xf86Msg(X_INFO,"MU: i=%d for vcs open\n",i);
 
 	if (xf86Info.consoleFd < 0) {
 	    FatalError("xf86OpenConsole: Cannot open virtual console %d (%s)\n",
@@ -125,7 +149,14 @@
 	}
 
 	/* change ownership of the vt */
-	chown(vtname, getuid(), getgid());
+        /*MU change*/
+	/* MU: humm, not a good idea if we don't really use this vt, chowning it would
+	   probably mess with the first XFree instance. Right? i don't know! */
+        if ( MUtype == eMUnone || MUtype == eMUconsole )
+        {
+	        chown(vtname, getuid(), getgid());
+        }
+        /*MU end*/
 
 	/*
 	 * the current VT device we're running on is not "console", we want
@@ -153,6 +184,7 @@
 	    {
 		ioctl(i, TIOCNOTTY, 0);
 		close(i);
+/*MU debug*/    xf86Msg(X_INFO,"MU: Detach from tty\n");
 	    }
 	}
 
@@ -170,55 +202,81 @@
 	{
 	    xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
 	}
-	SYSCALL(result = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT));
-	if (result < 0) 
-	{
-	    FatalError("xf86OpenConsole: VT_GETMODE failed\n");
-	}
-
-	signal(SIGUSR1, xf86VTRequest);
+        /*MU change*/
+        if ( MUtype == eMUnone || MUtype == eMUconsole )
+        {
+	    SYSCALL(result = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT));
+	    if (result < 0) 
+            {
+	        FatalError("xf86OpenConsole: VT_GETMODE failed\n");
+            }
+
+	    signal(SIGUSR1, xf86VTRequest);
+
+	    VT.mode = VT_PROCESS;
+	    VT.relsig = SIGUSR1;
+	    VT.acqsig = SIGUSR1;
+	    if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0) 
+            {
+	        FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
+            }
+	    if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0)
+            {
+	        FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed\n");
+            }
+        }
+        else
+        {
+            if (MUtype == eMUnokeyboard )
+            {   /* switch back to VT running when we started */
+                ioctl(xf86Info.consoleFd, VT_ACTIVATE, activeVT);
+/*MU debug*/    xf86Msg(X_INFO,"MU: VT_ACTIVATE vt=%d\n",activeVT);
+                activeVT = -1;
+	    }
+            close(xf86Info.consoleFd);
+        }
+        /*MU end*/
 
-	VT.mode = VT_PROCESS;
-	VT.relsig = SIGUSR1;
-	VT.acqsig = SIGUSR1;
-	if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0) 
-	{
-	    FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
-	}
-	if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0)
-	{
-	    FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed\n");
-	}
 
 	/* we really should have a InitOSInputDevices() function instead
 	 * of Init?$#*&Device(). So I just place it here */
 	
+        /*MU change*/
 #ifdef USE_DEV_FB
-	/* copy info to new console */
-	var.yoffset=0;
-	var.xoffset=0;
-	if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &var))
-	    FatalError("Unable to set screen info\n");
-	close(fbfd);
+        if ( MUtype == eMUnone || MUtype == eMUconsole )
+        {
+            /* copy info to new console */
+	    var.yoffset=0;
+	    var.xoffset=0;
+	    if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &var))
+	        FatalError("Unable to set screen info\n");
+	    close(fbfd);
+        }
 #endif
+        /*MU end*/
     }
     else 
     {
-	/* serverGeneration != 1 */
-	/*
-	 * now get the VT
-	 */
-	SYSCALL(result = ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno));
-	if (result != 0)
-	{
-	    xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
-	}
-	SYSCALL(result =
-		ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno));
-	if (result != 0)
-	{
-	    xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
-	}
+        /*MU change*/
+        if ( MUtype == eMUnone || MUtype == eMUconsole )
+        {
+	    /* serverGeneration != 1 */
+	    /*
+	     * now get the VT
+	     */
+	    SYSCALL(result = ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno));
+	    if (result != 0)
+            {
+	        xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
+            }
+	    SYSCALL(result =
+		    ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno));
+	    if (result != 0)
+            {
+	        xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
+            }
+        }
+        /*MU end*/
     }
     return;
 }
@@ -232,21 +290,26 @@
     ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno);
     ioctl(xf86Info.consoleFd, VT_WAITACTIVE, 0);
 #endif
-    ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT);  /* Back to text mode ... */
-    if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
-    {
-	VT.mode = VT_AUTO;
-	ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* set dflt vt handling */
-    }
-    /*
-     * Perform a switch back to the active VT when we were started
-     */
-    if (activeVT >= 0)
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
     {
-	ioctl(xf86Info.consoleFd, VT_ACTIVATE, activeVT);
-	activeVT = -1;
+        ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT);  /* Back to text mode ... */
+        if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
+        {
+	    VT.mode = VT_AUTO;
+	    ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* set dflt vt handling */
+        }
+        /*
+         * Perform a switch back to the active VT when we were started
+         */
+        if (activeVT >= 0)
+        {
+	    ioctl(xf86Info.consoleFd, VT_ACTIVATE, activeVT);
+	    activeVT = -1;
+        }
+        close(xf86Info.consoleFd);                /* make the vt-manager happy */
     }
-    close(xf86Info.consoleFd);                /* make the vt-manager happy */
+    /*MU end*/
     return;
 }
 
--- xc/programs/Xserver/hw/xfree86/os-support/shared~/std_kbdEv.c	1999-05-07 04:56:23.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/os-support/shared/std_kbdEv.c	2003-08-24 02:55:40.000000000 +0200
@@ -30,9 +30,116 @@
 #include "xf86Priv.h"
 #include "xf86_OSlib.h"
 
+/*MU added*/
+/* 2001/01/14 Miguel Freitas <miguel@cetuc.puc-rio.br>
+ *
+ * USB Keyboard to PC-AT Keyboard HACK
+ *
+ * Included routines from Linux Kernel to handle usb keyboard events.
+ * I don't know if there are any license issues here. Any code written
+ * by me in this file is under the terms of the GNU General Public
+ * License as described below.
+ *
+*/
+
+/*
+ * $Id: keybdev.c,v 1.3 2000/05/28 17:31:36 vojtech Exp $
+ *
+ *  Copyright (c) 1999-2000 Vojtech Pavlik
+ *
+ *  Input driver to keyboard driver binding.
+ *
+ *  Sponsored by SuSE
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Should you need to contact me, the author, you can do so either by
+ * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
+ * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ */
+
+#include <linux/input.h>
+
+static unsigned short x86_keycodes[256] =
+	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+	 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+	 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+	 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+	 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+	 80, 81, 82, 83, 43, 85, 86, 87, 88,115,119,120,121,375,123, 90,
+	284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339,
+	367,294,293,286,350, 92,334,512,116,377,109,111,373,347,348,349,
+	360, 93, 94, 95, 98,376,100,101,357,316,354,304,289,102,351,355,
+	103,104,105,275,281,272,306,106,274,107,288,364,358,363,362,361,
+	291,108,381,290,287,292,279,305,280, 99,112,257,258,113,270,114,
+	118,117,125,374,379,259,260,261,262,263,264,265,266,267,268,269,
+	271,273,276,277,278,282,283,295,296,297,299,300,301,302,303,307,
+	308,310,313,314,315,317,318,319,320,321,322,323,324,325,326,330,
+	332,340,341,342,343,344,345,346,356,359,365,368,369,370,371,372 };
+
+static void handle_scancode(unsigned char scancode, int down)
+{
+        char up_flag = down ? 0 : 0200;
+
+        xf86PostKbdEvent(scancode | up_flag);
+}
+
+static int emulate_raw(unsigned int keycode, int down)
+{
+	if (keycode > 255 || !x86_keycodes[keycode])
+		return -1; 
+
+	if (keycode == KEY_PAUSE) {
+		handle_scancode(0xe1, 1);
+		handle_scancode(0x1d, down);
+		handle_scancode(0x45, down);
+		return 0;
+	} 
+
+	if (x86_keycodes[keycode] & 0x100)
+		handle_scancode(0xe0, 1);
+
+	handle_scancode(x86_keycodes[keycode] & 0x7f, down);
+
+	if (keycode == KEY_SYSRQ) {
+		handle_scancode(0xe0, 1);
+		handle_scancode(0x37, down);
+	}
+
+	return 0;
+}
+
+
+static void keybdev_event(unsigned int type, unsigned int code, int down)
+{
+	if (type != EV_KEY) return;
+
+	emulate_raw(code, down);
+}
+
+/*MU end*/
+
+
 void
 xf86KbdEvents()
 {
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	unsigned char rBuf[64];
 	int nBytes, i;
 
@@ -42,5 +149,23 @@
 		for (i = 0; i < nBytes; i++)
 			xf86PostKbdEvent(rBuf[i]);
 	}
+    }
+    else
+    {
+ 	struct s_input_event {
+ 	       struct timeval time;
+ 	       unsigned short type;
+    	       unsigned short code;
+    	       unsigned int value;
+	} input_event;
+
+ 	int nBytes, i;
+	while ((nBytes = read( xf86Info.kbdFd, (char *)&input_event, sizeof(input_event)))
+ 	    > 0)
+ 	{
+	    keybdev_event( input_event.type, input_event.code, input_event.value );
+ 	}
+    }
+    /*MU end*/
 }
 
--- xc/programs/Xserver/hw/xfree86/common~/xf86Config.c	2005-07-26 10:45:24.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/common/xf86Config.c	2003-09-01 21:55:54.000000000 +0200
@@ -79,6 +79,9 @@
 
 static char *fontPath = NULL;
 
+extern MUTYPE MUtype = eMUnone;    /*MU added, default to regular XF86free */
+
+
 /* Forward declarations */
 static Bool configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen,
 			 int scrnum, MessageType from);
@@ -1086,11 +1089,25 @@
   xf86Info.xkbgeometry   = NULL;
 #endif
 
+  /*MU added*/
+
+  s = xf86SetStrOption(inputp->commonOptions, "MultiUser", "no");
+  if ( xf86NameCmp(s, "yes") == 0 ) {
+     MUtype = eMUconsole;
+     xf86Msg(X_CONFIG, "MultiUser is yes\n");
+  }
+  else {
+     MUtype = eMUnone;
+     xf86Msg(X_CONFIG, "MultiUser is no\n");
+  }
+  /*MU end*/
+
   s = xf86SetStrOption(inputp->commonOptions, "Protocol", "standard");
   if (xf86NameCmp(s, "standard") == 0) {
      xf86Info.kbdProc    = xf86KbdProc;
      xf86Info.kbdEvents  = xf86KbdEvents;
      xfree(s);
+     xf86Msg(X_CONFIG, "Keyboard Protocol is standard\n");
   } else if (xf86NameCmp(s, "xqueue") == 0) {
 #ifdef XQUEUE
     xf86Info.kbdProc = xf86XqueKbdProc;
@@ -1150,6 +1167,30 @@
 	     return FALSE;
      }
 #endif
+  /*MU start*/
+  } else if (MUtype == eMUconsole && xf86NameCmp(s, "usbev") == 0) {
+      xf86Info.kbdProc    = xf86KbdProc;
+      xf86Info.kbdEvents  = xf86KbdEvents;
+      s = xf86SetStrOption(inputp->commonOptions, "Device", NULL);
+      xf86Msg(X_CONFIG, "MultiUser Keyboard: Protocol: usbev\n");
+      xf86Info.kbdFd = open(s, O_RDWR | O_NONBLOCK | O_EXCL);
+      if (xf86Info.kbdFd == -1) {
+        xf86ConfigError("cannot open \"%s\"", s);
+        return FALSE;
+      }
+     MUtype = eMUusb;    /* use usb keyboard */
+  } else if (MUtype == eMUconsole && xf86NameCmp(s, "none") == 0) {
+      xf86Info.kbdProc    = xf86KbdProc;
+      xf86Info.kbdEvents  = xf86KbdEvents;
+      s = "/dev/null";
+      xf86Msg(X_CONFIG, "MultiUser Keyboard: Protocol: none (no keyboard)\n");
+      xf86Info.kbdFd = open(s, O_RDWR | O_NONBLOCK | O_EXCL);
+      if (xf86Info.kbdFd == -1) {
+        xf86ConfigError("cannot open \"%s\" for no keyboard\n", s);
+        return FALSE;
+      } 
+      MUtype = eMUnokeyboard;    /* no keyboard */
+  /*MU end*/
   } else {
     xf86ConfigError("\"%s\" is not a valid keyboard protocol name", s);
     xfree(s);
--- xc/programs/Xserver/hw/xfree86/common~/xf86Init.c	2005-07-26 10:45:26.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/common/xf86Init.c	2003-08-24 02:54:00.000000000 +0200
@@ -1320,6 +1322,13 @@
     xf86ProbeOnly = TRUE;
     return 1;
   }
+  /*MU start*/
+  if (!strcmp(argv[i],"-delay"))
+  {
+    sleep(10);
+    return 1;
+  }
+  /*MU end*/
   if (!strcmp(argv[i],"-flipPixels"))
   {
     xf86FlipPixels = TRUE;
 
--- xc/programs/Xserver/hw/xfree86/common~/xf86Priv.h 2005-07-26 10:45:24.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/common/xf86Priv.h 2003-08-24 03:49:06.000000000 +0200
@@ -70,6 +69,10 @@
 extern unsigned short xf86MouseCflags[];
 extern Bool xf86SupportedMouseTypes[];
 extern int xf86NumMouseTypes;
+/*MU added - MultiUser enhancement*/
+typedef enum { eMUnone = 0, eMUconsole, eMUusb, eMUnokeyboard } MUTYPE;
+extern MUTYPE MUtype;
+/*MU end*/
 
 #ifdef XFree86LOADER
 extern DriverPtr *xf86DriverList;
--- xc/programs/Xserver/hw/xfree86/common~/xf86Privstr.h	2003-02-20 05:05:14.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/common/xf86Privstr.h	2003-08-24 02:54:00.000000000 +0200
@@ -59,6 +59,7 @@
     int			bell_pitch;
     int			bell_duration;
     Bool		autoRepeat;
+    int                 ledsave;		/*MU addition */
     unsigned long	leds;
     unsigned long	xleds;
     char *		vtinit;
--- xc/programs/Xserver/hw/xfree86/common~/xf86pciBus.c	2005-07-26 10:45:24.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c	2003-08-24 02:54:00.000000000 +0200
@@ -580,11 +580,16 @@
 static void
 pciIoAccessDisable(void* arg)
 {
+    /*MU change*/
+    if ( MUtype == eMUnone )
+    {
 #ifdef DEBUG
     ErrorF("pciIoAccessDisable: 0x%05lx\n", *(PCITAG *)arg);
 #endif
     pArg->ctrl &= ~SETBITS;
     pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+    }
+    /*MU end*/
 }
 
 #undef SETBITS
@@ -602,11 +607,16 @@
 static void
 pciIo_MemAccessDisable(void* arg)
 {
+    /*MU change*/
+    if ( MUtype == eMUnone )
+    {
 #ifdef DEBUG
     ErrorF("pciIo_MemAccessDisable: 0x%05lx\n", *(PCITAG *)arg);
 #endif
     pArg->ctrl &= ~SETBITS;
     pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+    }
+    /*MU end*/
 }
 
 #undef SETBITS
@@ -624,11 +634,16 @@
 static void
 pciMemAccessDisable(void* arg)
 {
+    /*MU change*/
+    if ( MUtype == eMUnone )
+    {
 #ifdef DEBUG
     ErrorF("pciMemAccessDisable: 0x%05lx\n", *(PCITAG *)arg);
 #endif
     pArg->ctrl &= ~SETBITS;
     pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+    }
+    /*MU end*/
 }
 #undef SETBITS
 #undef pArg
--- xc/programs/Xserver/hw/xfree86/os-support/linux~/lnx_io.c	2005-07-26 10:45:25.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c	2003-08-30 21:34:54.000000000 +0200
@@ -33,12 +33,19 @@
 #include "xf86.h"
 #include "xf86Priv.h"
 #include "xf86_OSlib.h"
+/*MU added*/
+#include <linux/input.h>
+#include <linux/kd.h>
+/*MU end*/
 
 #define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
 
 void
 xf86SoundKbdBell(int loudness, int pitch, int duration)
 {
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	if (loudness && pitch)
 	{
 		ioctl(xf86Info.consoleFd, KDMKTONE,
@@ -46,21 +53,63 @@
 		      (((unsigned long)duration *
 			loudness / 50) << 16));
 	}
+    }
+    /*MU end*/
 }
 
 void
 xf86SetKbdLeds(int leds)
 {
- 	ioctl(xf86Info.consoleFd, KDSETLED, leds);
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
+      ioctl(xf86Info.consoleFd, KDSETLED, leds);
+    }
+    else
+    {
+      struct s_output_event {
+             struct timeval time;
+             unsigned short type;
+             unsigned short code;
+             unsigned int value;
+      } output_event;
+
+      output_event.type = EV_LED;
+      output_event.code = LED_NUML;
+      output_event.value = (leds&(LED_NUM)) ? 1 : 0;
+      write( xf86Info.kbdFd, (char *)&output_event, sizeof(output_event));
+
+      output_event.type = EV_LED;
+      output_event.code = LED_CAPSL;
+      output_event.value = (leds&(LED_CAP)) ? 1 : 0;
+      write( xf86Info.kbdFd, (char *)&output_event, sizeof(output_event));
+
+      output_event.type = EV_LED;
+      output_event.code = LED_SCROLLL;
+      output_event.value = (leds&(LED_SCR)) ? 1 : 0;
+      write( xf86Info.kbdFd, (char *)&output_event, sizeof(output_event));
+
+      xf86Info.ledsave = leds;
+    }
+    /*MU end*/
 }
 
 int
 xf86GetKbdLeds()
 {
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	int leds = 0;
 
  	ioctl(xf86Info.consoleFd, KDGETLED, &leds);
 	return(leds);
+    }
+    else
+    {
+        return(xf86Info.ledsave);
+    }
+    /*MU end*/
 }
 
 /* kbd rate stuff based on kbdrate.c from Rik Faith <faith@cs.unc.edu> et.al.
@@ -185,6 +234,13 @@
   if (xf86Info.kbdDelay >= 0)
     delay = xf86Info.kbdDelay;
 
+  /*MU change*/
+  if ( MUtype != eMUnone && MUtype != eMUconsole )
+  {
+    /* FIXME: just returning so we don't mess with any other keyboards... */
+    return;
+  }
+  /*MU end
 
   if(KDKBDREP_ioctl_ok(rate, delay)) 	/* m68k? */
     return;
@@ -236,13 +292,21 @@
 void
 xf86KbdInit()
 {
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
 	tcgetattr (xf86Info.consoleFd, &kbdtty);
+    }
+    /*MU end*/
 }
 
 int
 xf86KbdOn()
 {
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	struct termios nTty;
 
 #ifdef __powerpc__
@@ -263,13 +327,28 @@
 	cfsetospeed(&nTty, 9600);
 	tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
 	return(xf86Info.consoleFd);
+    }
+    else
+    {
+        return(xf86Info.kbdFd);
+    }
+    /*MU end*/
 }
 
 int
 xf86KbdOff()
 {
+    /*MU change*/
+    if ( MUtype == eMUnone || MUtype == eMUconsole )
+    {
 	ioctl(xf86Info.consoleFd, KDSKBMODE, kbdtrans);
 	tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
 	return(xf86Info.consoleFd);
+    }
+    else
+    {
+        return(xf86Info.kbdFd);
+    }
+    /*MU end*/
 }
 
