--- bluez-utils-3.7/hidd/fakehid.c	2007-01-14 01:25:20.000000000 +0100
+++ ../bluez-utils-3.7/hidd/fakehid.c	2007-01-14 01:19:47.000000000 +0100
@@ -594,16 +594,20 @@
 
 struct mpcmd write_lcd_single[] = { /* Write a single line of text to the LCD */ 
 	{{ 0xA2, 0x10, 0x00, 0x81, 0x10, 0x00, 0x00, 0x00 }, 8},
-	{{ 0xA2, 0x10, 0x00, 0x80, 0x12, 0x10, 0x10, 0x10 }, 8},
-	{{ 0xA2, 0x10, 0x00, 0x81, 0x10, 0x00, 0x00, 0x00 }, 8},
+	{{ 0xA2, 0x10, 0x00, 0x80, 0x12, 0x00, 0x00, 0x00 }, 8},
+	{{ 0xA2, 0x10, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00 }, 8},
 	{{ 0xA2, 0x11, 0x00, 0x82, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }, 21},
 	{{ 0xA2, 0x11, 0x00, 0x82, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }, 21},
 	{{ 0xA2, 0x11, 0x00, 0x82, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }, 21},
-	{{ 0xA2, 0x10, 0x00, 0x80, 0x12, 0x10, 0x10, 0x10 }, 8},
+	{{ 0xA2, 0x10, 0x00, 0x80, 0x12, 0x00, 0x00, 0x00 }, 8},
 	{{ 0xA2, 0x10, 0x00, 0x83, 0x11, 0x00, 0x00, 0x00 }, 8},
 	{{ 0 }, 0}
 };
 
+struct mpcmd write_num[] = { /* Set Numlock */
+	{{ 0xA2, 0x01, 0x00 }, 3}
+};
+
 #define N_LCDW_CMDS	14
 #define N_LCDS_CMDS	8
 
@@ -689,15 +693,15 @@
 		case 0x56: return KEY_KPMINUS;
 		case 0x57: return KEY_KPPLUS;
 		case 0x58: return KEY_KPENTER;
-		case 0x59: return (mode != 0) ? KEY_OPEN      : KEY_1;
-		case 0x5a: return (mode != 0) ? KEY_LEFTMETA  : KEY_2;
-		case 0x5b: return (mode != 0) ? KEY_UNDO      : KEY_3;	/* Even though it should be KEY_CLOSE (non-existant) */
+		case 0x59: return KEY_1;
+		case 0x5a: return (mode != 0) ? KEY_DOWN      : KEY_2;
+		case 0x5b: return KEY_3;	
 		case 0x5c: return (mode != 0) ? KEY_LEFT      : KEY_4;
-		case 0x5d: return (mode != 0) ? KEY_DOWN      : KEY_5;
+		case 0x5d: return KEY_5;
 		case 0x5e: return (mode != 0) ? KEY_RIGHT     : KEY_6;
-		case 0x5f: return (mode != 0) ? KEY_BACK      : KEY_7;
+		case 0x5f: return KEY_7;
 		case 0x60: return (mode != 0) ? KEY_UP        : KEY_8;
-		case 0x61: return (mode != 0) ? KEY_FORWARD   : KEY_9;
+		case 0x61: return KEY_9;
 		case 0x62: return KEY_0;
 		case 0x63: return KEY_DOT;
 	}
@@ -719,6 +723,15 @@
 	write(sock,lcdwi.command,lcdwi.len);
 }
 
+static void set_numlock(int sock, char mode) {
+	struct mpcmd lcdnum; 
+	
+	if (sock < 4) return;
+	memcpy(&lcdnum,write_num,sizeof(struct mpcmd));
+	lcdnum.command[2] = mode;
+	write(sock,lcdnum.command,lcdnum.len);
+}
+
 static void beep_or_blink(int sock, uint8_t beep, uint8_t blink) {
 	struct mpcmd bbeep[3]; int i = 0;
 
@@ -813,6 +826,7 @@
 
 	/* Write the text */
 	lcdw[1].command[4 + lineno] = LCD_LINE_INIT;
+	lcdw[6].command[4 + lineno] = f;
 	i = 0; while (lcdw[i].len != 0) { write(sock,lcdw[i].command,lcdw[i].len); i++; } free(lcdw);
 }		
 
@@ -974,27 +988,47 @@
 		if (poll(&p,1,1) < 0) { __io_canceled = 1; break; }
 		if (p.revents & POLLIN) {
 			if ((ln = read(p.fd, buf, sizeof(buf))) <= 0) { __io_canceled = 1; break; }
+			syslog(LOG_WARNING, "Got mode %d - key_up %d - prev %d - key %x | %x %x %x %x : %x %x %x %x : %x %x %x", mode, discard_keyup, prev_key, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
 			if (buf[1] == 0x03) { /* Special Keys */
 				/* e9 = vol up, ea = vol down, e2 = mute, b5 = ffwd, b6 = rew, b7 = stop, cd = play/pause */
 				if (buf[2] == (char)0x83 && buf[3] == 0x02) { clear_screen(p.fd); if (icons & LCD_ICON_MUTE) { icons = LCD_ICON_MUTE; set_lcd_indicator(p.fd, LCD_ICON_MUTE, 1); }}
-				if (buf[2] == (char)0x00 && buf[3] == 0x00) { if (prev_key != 0) { inject_key(fd,prev_key,0); prev_key = 0; } 
-									      if (discard_keyup) discard_keyup = 0; else mode = 0; }
+				if (buf[2] == (char)0x00 && buf[3] == 0x00)
+				{/*
+					if (prev_key != 0) {
+						inject_key(fd,prev_key,0);
+						prev_key = 0;
+					} 
+					if (discard_keyup)
+						discard_keyup = 0;
+					else {
+						//mode = 0;
+					}
+				*/}
 				if (buf[2] == (char)0x83 && buf[3] == 0x01) { prev_key = KEY_PHONE;        inject_key(fd,prev_key,1); } /* Media key */
 				if (buf[2] == (char)0xb5 && buf[3] == 0x00) { prev_key = KEY_NEXTSONG;     inject_key(fd,prev_key,1); discard_keyup = 1; }
 				if (buf[2] == (char)0xb6 && buf[3] == 0x00) { prev_key = KEY_PREVIOUSSONG; inject_key(fd,prev_key,1); discard_keyup = 1; }
 				if (buf[2] == (char)0xb7 && buf[3] == 0x00) { prev_key = KEY_STOP;         inject_key(fd,prev_key,1); }
 				if (buf[2] == (char)0xcd && buf[3] == 0x00) { prev_key = KEY_PLAYPAUSE;    inject_key(fd,prev_key,1); }
 				if (buf[2] == (char)0xe2 && buf[3] == 0x00) { prev_key = KEY_MUTE;         inject_key(fd,prev_key,1); 
-									     icons = ((icons & LCD_ICON_MUTE) != 0) ? (icons & ~LCD_ICON_MUTE) : (icons | LCD_ICON_MUTE); 
-									     set_lcd_indicator(p.fd, LCD_ICON_MUTE, ((icons & LCD_ICON_MUTE) != 0) ? 1 : 0); }
+									     icons ^= LCD_ICON_MUTE; set_lcd_indicator(p.fd, LCD_ICON_MUTE, ((icons & LCD_ICON_MUTE) != 0) ? 1 : 0); }
 				if (buf[2] == (char)0xe9 && buf[3] == 0x00) { prev_key = KEY_VOLUMEUP;     inject_key(fd,prev_key,1); 
 									     icons = (icons & ~LCD_ICON_MUTE); set_lcd_indicator(p.fd, LCD_ICON_MUTE, 0); }
 				if (buf[2] == (char)0xea && buf[3] == 0x00) { prev_key = KEY_VOLUMEDOWN;   inject_key(fd,prev_key,1); 
 									     icons = (icons & ~LCD_ICON_MUTE); set_lcd_indicator(p.fd, LCD_ICON_MUTE, 0); }
+				if (buf[2] == (char)0x24 && buf[3] == 0x02) { prev_key = KEY_BACK;         inject_key(fd,prev_key,1); }
+				if (buf[2] == (char)0x25 && buf[3] == 0x02) { prev_key = KEY_FORWARD;      inject_key(fd,prev_key,1); }
 			} else if (buf[1] == 0x01 && buf[2] == 0x00) {
-				if (buf[4] == 0x53 && buf[5] == 0x00) { mode = 1; prev_key = 0; } /* NAV key */
-				else if (buf[4] == 0x00 && buf[5] == 0x00 && prev_key != 0) inject_key(fd,prev_key,0);
+				if (buf[4] == 0x53 && buf[5] == 0x00) {
+					mode ^= 1;
+					prev_key = 0;
+					set_numlock(sock, mode ^ 1);
+				} /* NAV key */
+				else if (buf[4] == 0x00 && buf[5] == 0x00 && prev_key != 0) { inject_key(fd,prev_key,0); }
 				else if (buf[4] != 0x00) { prev_key = translate_key(mode,buf[4] & 0x7f); inject_key(fd,prev_key,1); }
+			} else if (buf[1] == 0x01 && buf[2] == 0x08) {
+				prev_key = KEY_LEFTMETA;	inject_key(fd,prev_key,1);
+			} else if (buf[1] == 0x01 && buf[2] == 0x04) {
+				if (buf[4] == (char)0x3d) { prev_key = KEY_CLOSE;      inject_key(fd,prev_key,1); }
 			} else if (buf[1] == 0x11 && buf[2] == 0x0a) { /* Calculator Result */
 				//cwtmp = &buf[4]; while (*cwtmp && *cwtmp == 0x20) cwtmp++;
 				syslog(LOG_WARNING,"Got Calc result");
