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
No, ma suona molto bene! –
Che cos'è quel numero 108 nella chiamata connect()? Non dovrebbe invece essere sizeof (m_acpidsockaddr)? –