Ubuntu 12.4.1を実行しているアーケードカクテルキャビネット(キーボードなし、ジョイスティックとボタンのみ)があります。電源ボタンを押すとポップアップが表示され、システムは正常にシャットダウンしますが、フルスクリーンのゲームランチャーメニューアプリケーションが実行されている場合その後、ボタンを押しても効果はありません。ボタンが押されたときにイベントをトラップして、アプリがシステムのシャットダウンをトリガーできるようにします。私のメニューアプリはC++で書かれており、SDLを使用しています。電源オフボタンの押下イベントをトラップする方法についてのアイデアはありますか?
回答してくれた人たちのおかげで、これが私がそれを機能させるために使用した実際のコードです:
クラスのメンバー:
int m_acpidsock;
sockaddr_un m_acpidsockaddr;
セットアップコード:
/* 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;
}
}
更新コード:
/* 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");
}
}
}
ソケットコードを閉じます:
if(m_acpidsock>=0)
{
close(m_acpidsock);
m_acpidsock=-1;
}
最後に、root以外のユーザーがシャットダウンできるようにする必要があり、それは次の行を使用して機能しました。
sudo chmod u+s /sbin/shutdown