PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bildschirmschoner blockiert die Multimediatasten



retak
06.10.09, 15:02
Immer wenn der Bildschirmschoner an ist, blockiert er die Multimediatasten, so dass man die Musik nicht mehr Mute stellen kann. Um genauer zu sein blockiert er die gesamte Tastatur, was ja auch der Sinn ist.

Ich habe mir mit xev und xbindkeys es so eingerichtet, dass wenn ich die mute Taste drücke, amixer die Soundkarte auf Mute stellt.

Ja, was gibts denn für Wege, dass die Scancodes durchkommen wenn der Schoner an ist?
Vllt. kann man das direkt nach der Kernel abgreifen und X völlig weglassen.

Für Tipps bin ich dankbar :)

pferdefreund
07.10.09, 07:01
Sollte durch einen Eingriff im Bildschirmschoner möglich sein - aber ob das
wirklich Sinn macht, deswegen an den Quellen herumzubasteln. Da sollte man schon
ein wenic C können - so ala Wenn Taste gedrückt - Signal an Daemon - der
schaltet dann stumm oder wieder aktiv. SIGUSR1 ist da sicherlich möglich.
Oder gleich die entsprechende Funktion in den Bildschirmschoner einbauen.

retak
07.10.09, 07:11
Das waere sicherlich die sauberste Lösung. Gibts es hier denn noch irgendwem, der das Problem hat?

Meine Lösung sieht etwas anders aus. Ich lese mit einem Programm /dev/input/event0 die Tastatur ein und immer wenn die mute Taste gedrückt wird, wird mit amixer der Master Kanal ausgeschaltet.

Vorher sollte man aber mit xmodmap die Verknüpfung zur Mute Taste löschen. Mit xev bekommt man ja den Scancode der Taste.

Hier das Programm


#include <stdio.h>
#include <linux/input.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
int fd;
if ((fd = open("/dev/input/event0", O_RDONLY)) < 0) {
perror("evdev open");
exit(1);
}

struct input_event ev;
int i = 0;
while(1) {
read(fd, &ev, sizeof(struct input_event));
//printf("value %d, type %d, code %d\n",ev.value,ev.type,ev.code);

// 160 ist der Scancoder meiner Mutetaste. Mit xev gefunden
// Nur jedes 2. Event beachten. 1 Taste druecken, 2. Taste loslassen
if(ev.value == 160 && i % 2 == 0)
{
system("amixer -c 0 set Master toggle");
}
i++;

}
return 0;
}