Als ich damals auf Kernel 2.6.21 umgestiegen bin liefen am Notebook meine ACPI Tasten nicht mehr und da ich diese nutze um zum Beispiel meinen Firefox oder Sylpheed-Claws zu starten hab ich damals etwas geforscht und bin auf
Ikke's Blog gestoßen der mir dann klar gemacht hat das dies wohl mit einigen Kernel-Änderungen zu tun hat die passiert sind. Damals habe ich das Problem dann einfach damit geloest das ich den kleinen Patch der dort gepostet ist applied habe, allerdings ist mir das heute zu doof geworden und ich habe ein wenig geforscht.
Ich habe zwar noch immer keinen blassen schimmer wo der Sinn dieses TestBit Makros ist aber ich habe rausgefunden das die Rückgabe 1 sein muss und nicht 16, wie sie bei /dev/input/event0 ist, warum auch immer und warum auch immer das Programm dann an dieser Stelle gestoppt hat. Jedenfalls funktioniert es so:
CODE:
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/input.h>
#define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))
int find_keyboard() {
int i, j;
int fd;
char filename[32];
char key_bitmask[(KEY_MAX + 7) / 8];
for (i=0; i<32; i++) {
snprintf(filename,sizeof(filename), "/dev/input/event%d", i);
fd = open(filename, O_RDWR);
ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask);
for (j = 0; j < BTN_MISC; j++) {
if (TestBit(j, key_bitmask)==1) {
break;
}
}
if (j < BTN_MISC) {
return fd;
}
close (fd);
}
return 0;
}
int main(int argc, char** argv) {
int fd;
int key;
struct input_event event;
FILE *handle;
if (argc == 2) {
key = atoi(argv[1]);
} else {
return 1;
}
if(!fopen("/tmp/fakekey_running", "r")) {
handle=fopen("/tmp/fakekey_running", "w");
fclose(handle);
} else {
return 22;
}
fd = find_keyboard();
if (!fd) {
return 2;
}
event.type = EV_KEY;
event.code = key;
event.value = 1;
write(fd, &event, sizeof event);
event.type = EV_KEY;
event.code = key;
event.value = 0;
write(fd, &event, sizeof event);
close(fd);
unlink("/tmp/fakekey_running");
return 0;
}
bei mir. Ausserdem habe ich noch eine kleine Verbesserung (wie ich finde reingebracht, beim start schaut das Programm ob die Datei /tmp/fakekey_running existiert, ist dies der fall wird das Programm direkt beendet, ansonsten wird das File angelegt das Programm läuft durch und löscht die Datei wieder, das habe ich zu Testzwecken reingebracht weil es bei mir ab und zu schonmal dazu gekommen ist das der Firefox sich durch druck auf die Taste zig mal gestartet hat und das System unbrauchbar gemacht hat. Obs so viel besser ist weiss ich noch nicht, das wird die Zeit zeigen.
[EDIT]Anscheinend ist dieser von mir eingebaute Lock echt hilfreich, bisher ists nicht mehr vorgekommen[/EDIT]