--- 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; }