--- kbdd.cvs/dev_uinput.c	2007-06-08 10:49:43.000000000 +0200
+++ kbdd.my/dev_uinput.c	2007-06-08 11:04:06.000000000 +0200
@@ -49,6 +49,21 @@
 #define MCE_DISPLAY_ON_REQ "req_display_state_on"
 #endif
 
+/* taken from linux/bitops.h */
+static inline int test_bit(int nr, const volatile unsigned long *p){
+	        return (p[nr >> 5] >> (nr & 31)) & 1UL;
+}
+
+static inline void set_bit(int nr, volatile unsigned long *p){
+	        p[nr >> 5] |= (1UL << (nr & 31));
+}
+
+static inline void clear_bit(int nr, volatile unsigned long *p){
+	        p[nr >> 5] &= ~(1UL << (nr & 31));
+}
+
+/* bitfield for pressed keys */
+unsigned long pressed_keys[(KEY_MAX+1)/(8*sizeof(unsigned long))];
 
 int dev_uinput_init(void)
 {
@@ -111,6 +126,7 @@
                                    MCE_REQUEST_IF,
                                    MCE_PREVENT_BLANK_REQ);
 #endif
+	memset(pressed_keys,0,sizeof(pressed_keys));
 return fd;
 }
 
@@ -142,6 +158,13 @@
 		// flush could block now, do later // dbus_connection_flush(conn);
 	}
 #endif
+        if (code<=KEY_MAX){
+		/* remember pressed keys, we release them on exit */
+		if (pressed)
+			set_bit(code,pressed_keys);
+		else
+			clear_bit(code,pressed_keys);
+	}
 	memset(&event, 0, sizeof(event));
 	event.type = EV_KEY;
 	event.code = code;
@@ -152,6 +175,17 @@
 
 void dev_uinput_close(int fd)
 {
+struct uinput_event event;
+unsigned short i;
+	// release all pressed keys
+	memset(&event, 0, sizeof(event));
+	event.type = EV_KEY;
+	// event.value = 0; // (0=release, already cleared)
+	for (i=0;i<=KEY_MAX;i++) 
+		if (test_bit(i,pressed_keys)){
+			event.code = i;
+			write(fd, &event, sizeof(event));
+		}
 	ioctl(fd, UI_DEV_DESTROY);
 	close(fd);
 #ifdef N770
--- kbdd.cvs/kbd.c	2007-06-08 10:49:43.000000000 +0200
+++ kbdd.my/kbd.c	2007-06-08 11:16:51.000000000 +0200
@@ -1381,7 +1381,8 @@
 	}
 
 	signal(SIGTERM, handle_sigterm);
-
+	signal(SIGINT, handle_sigterm);
+	
 	if (kbdtype == KBD_TYPE_FOLDABLE)
 		compaq_foldable();
 	else if (kbdtype == KBD_TYPE_BTFOLDABLE)
@@ -1426,5 +1427,6 @@
 	else if (kbdtype == KBD_TYPE_FREEDOM)
 		freedom_keyboard();
 
+	dev_uinput_close(uindev);
 return 0;
 }
