Multimediální klávesy v textovém režimu

Pali

Multimediální klávesy v textovém režimu
« kdy: 02. 06. 2011, 12:56:46 »
Ahojte,

snazim sa uz dlhsie na nete najst navod/programy na nastavenie klavesovych stratiek a multimedialnych klavesov v textovom rezime bez X-ka. V X-ku to ide v pohode cez konfiguratory v prostredi KDE ci Gnome...

Ale ako sa daju nastavit klavesove skratky a dalsie multimedialne klavesy v textovom rezime bez X-ka? (Teda napr. po staceni klavesu XF86AudioMute by sa spustil program 'pactl set-sink-mute <id> <yes/no>' aj keby X-ko nebezalo)
« Poslední změna: 02. 06. 2011, 15:48:27 od Petr Krčmář »


Re: Multimedialne klavesy v textovom rezime
« Odpověď #1 kdy: 02. 06. 2011, 13:38:30 »
Ak si trosku zbehly, skus si skompilovat tento program a spustat ho ako sluzbu. Makefile:
Kód: [Vybrat]
mpckbd: mpckbd.c Makefile
        gcc -o mpckbd mpckbd.c -O3 $(INCLUDES)
mpckbd.c:
Kód: [Vybrat]
#include <linux/input.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>

void parse(char *line, char **argv);
void run(char *cmd, char *params);

int main() {
char *mpc,*amixer,*conf;
conf="/etc/mpckbd.conf";
mpc="mpc";
amixer="amixer";
int fd;
char cmd[1024];
char key_fav[80];
char key_a[80];

if ((fd = open("/dev/input/event8", O_RDONLY)) < 0) {
perror("evdev open");
_exit(1);
}
struct input_event event;

FILE *file = fopen(conf , "r");
if ( file != NULL ) {
    if ( fgets(key_fav, sizeof key_fav, file) != NULL ) {
char *newline = strchr(key_fav, '\n');
if ( newline != NULL ) {
        *newline = '\0';
    }
     }
    if ( fgets(key_a, sizeof key_a, file) != NULL ) {
char *newline = strchr(key_a, '\n');
if ( newline != NULL ) {
        *newline = '\0';
    }
     }
    fclose(file);
}

while (read(fd, &event, sizeof(event)) > 0) {
if (event.type != EV_KEY) continue;
if (event.value != EV_KEY) continue;
printf("type=%i value=%i code=%i \n",event.type,event.value,event.code); //vypis co bolo stlacene
strcpy(cmd,"");
switch (event.code) {
case 114://MPCKBD_MINUS:
run(amixer,"set Master playback 2dB-"); break;
case 113://MPCKBD_MUTE:
run(amixer,"set Master toggle"); break;
case 115://MPCKBD_PLUS:
run(amixer,"set Master playback 2dB+"); break;
case 165://MPCKBD_PREV:
run(mpc,"prev"); break;
case 166://MPCKBD_STOP:
run(mpc,"stop"); break;
case 164://MPCKBD_TOGGLE:
run(mpc,"toggle"); break;
case 163://MPCKBD_NEXT:
run(mpc,"next"); break;
case 156://MPCKBD_FAV:
run(mpc,key_fav); break;
case 140://MPCKBD_ADR:
run(mpc,key_a); break;
case 159://MPCKBD_FORWARD:
run(mpc,"seek +00:00:10"); break;
case 158://MPCKBD_BACK:
run(mpc,"seek -00:00:10"); break;
}
    }
    return 1;
}

void  parse(char *line, char **argv)
{
     while (*line!='\0') {
        while (*line==' ' || *line=='\t' || *line=='\n')
               *line++ = '\0';
        *argv++ = line;
        while (*line!='\0' && *line!=' ' && *line!='\t' && *line!='\n')
    line++;
     }
     *argv = '\0';
}

void run(char *cmd, char *params)
{
char line[1024];
strcpy(line,cmd);
strcat(line," ");
strcat(line,params);
    char *argv[64];
    parse(line,argv);
    if (fork() != 0) return;
    close(0);
    close(1);
    close(2);
    execvp(*argv,argv);
    _exit(1);
}
Kody za riadkom "switch (event.code) {" si mozes lubovolne menit, pridavat, ci mazat. Potom len program znovu skompilujes a mozes pouzit.

Re: Multimedialne klavesy v textovom rezime
« Odpověď #2 kdy: 02. 06. 2011, 13:42:39 »
v /etc/ treba este potom vytvorit subor mpckbd.conf, ktory definuje parametre pre dve klavesy (MPCKBD_FAV a MPCKBD_ADR) v kode:
Kód: [Vybrat]
play 1
play 21

#prikazy musia byt prve dva riadky

Pali

Re: Multimedialne klavesy v textovom rezime
« Odpověď #3 kdy: 02. 06. 2011, 13:48:44 »
Jasne, robit si vlastny program ktory bude citat co sa v konkretom input device /dev/input/event* stalo nie je problem. Ja som ale myslel, ze uz je nejaky daemon ktory uz je nakodeny a da sa pekne konfigurovat... Okrem jednoduchych klavesov, potrebujem aj klavesove skratky s meta klavesom - a to uz nie je jednoduche.

Ozaj nebude to bugle, ak spustim X-ko? X-ko tiez cita z /dev/input/... a tym padom by mohli byt kolizie. Daemon gpm pre mys v textovom rezime to riesi tak, ze sa z /dev/ odpoji akonahle user prepne do tty pre X-ko a pripoji ak sa user prepne opat do textoveho modu.

Atrament

Re: Multimediální klávesy v textovém režimu
« Odpověď #4 kdy: 02. 06. 2011, 18:11:20 »
zkus kouknout na podkapitolku "Nastavení v konzoli"  v článku http://www.abclinuxu.cz/clanky/hardware/multimedialni-a-jinak-vylepsene-klavesnice


Pali

Re: Multimediální klávesy v textovém režimu
« Odpověď #5 kdy: 05. 06. 2011, 02:18:46 »
No to moj problem neriesi. V tej konzolovej casti je napisane, ze dany string sa vypisuje na stdin - co pri spusteni lubovolnej aplikacie v konzole nebude fungovat.

Pali

Re: Multimediální klávesy v textovém režimu
« Odpověď #6 kdy: 08. 06. 2011, 17:03:20 »
Napadla ma taka vec. Zneuzit k tomu acpid daemona :D Treba ho vsak spustit s parametrom -n nech cita vsetky klavesy z /dev/input (nie len acpi eventy z /proc/acpi/event)

acpi_listen potom vypise pekne ake klavesy boli namackane... takze s konfiguraciou uz nebude problem. Nemusim teda pisat vlastneho daemona na to - zneuzijem existujuceho :D