2012-12-24 11 views
7

Ho un cabinet cabinet arcade (senza tastiera, solo un joystick e pulsanti) con Ubuntu 12.4.1, quando viene premuto il pulsante di alimentazione viene visualizzato un popup e il sistema si spegne bene, ma quando l'applicazione del menu di avvio di gioco a schermo intero è in esecuzione, quindi premendo il pulsante non ha alcun effetto. Mi piacerebbe intercettare l'evento quando viene premuto il pulsante in modo che la mia app possa attivare l'arresto del sistema. La mia app di menu è scritta in C++ e utilizza SDL. Qualche idea su come posso intrappolare l'evento di stampa del pulsante di spegnimento?Come posso rilevare quando l'utente ha premuto il pulsante di spegnimento?

grazie a coloro che hanno risposto, ecco il codice vero e proprio che ho usato per farlo funzionare:

I membri della classe: il codice

int m_acpidsock; 
sockaddr_un m_acpidsockaddr; 

Setup:

/* Connect to acpid socket */ 
m_acpidsock = socket(AF_UNIX, SOCK_STREAM, 0); 
if(m_acpidsock>=0) 
{ 
    m_acpidsockaddr.sun_family = AF_UNIX; 
    strcpy(m_acpidsockaddr.sun_path,"/var/run/acpid.socket"); 
    if(connect(m_acpidsock, (struct sockaddr *)&m_acpidsockaddr, 108)<0) 
    { 
     /* can't connect */ 
     close(m_acpidsock); 
     m_acpidsock=-1; 
    } 
} 

Codice di aggiornamento:

/* check for any power events */ 
if(m_acpidsock) 
{ 
    char buf[1024]; 
    int s=recv(m_acpidsock, buf, sizeof(buf), MSG_DONTWAIT); 

    if(s>0) 
    { 
     buf[s]=0; 
     printf("ACPID:%s\n\n",buf); 
     if(!strncmp(buf,"button/power",12)) 
     { 
      setShutdown(); 
      system("shutdown -P now"); 
     } 
    } 
} 

Chiudi Codice presa:

if(m_acpidsock>=0) 
{ 
    close(m_acpidsock); 
    m_acpidsock=-1; 
} 

Infine, avevo bisogno di consentire agli utenti non-root di arresto e che ha lavorato con questa linea:

sudo chmod u+s /sbin/shutdown 
+2

No, ma suona molto bene! –

+0

Che cos'è quel numero 108 nella chiamata connect()? Non dovrebbe invece essere sizeof (m_acpidsockaddr)? –

risposta

5

Si può solo iniziare una discussione da leggere da /proc/events/acpi e decodificare i messaggi lì.

Ma che ne dici di usare acpid per farlo? Ascolteresti lo /var/run/acpid.socket e, quando arriverà un messaggio che ti interessa, fai ciò che devi fare.

Vedi: http://www.linuxmanpages.com/man8/acpid.8.php

Spero che questo sia utile.

2

Dai un'occhiata a acpid, penso che potresti modificare uno degli script in /etc/acpi/ in particolare /etc/acpi/powerbtn.sh per aggiungere comandi personalizzati. Puoi anche provare a leggere /proc/acpi/event da solo.

2

Cose come premere il pulsante di accensione per attivare eventi ACPI che acpid attiva uno script in risposta a come configurato in/etc/acpi/events. In questo caso si vuole/etc/acpi/powerbtn, che sembra qualcosa di simile:

event=button[ /]power 
action=/etc/acpi/powerbtn.sh 

È possibile personalizzare /etc/acpi/powerbtn.sh, o puntarlo verso un altro script di tua scelta.

Problemi correlati