8

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
4

3 に答える 3

5

から読み取るスレッドを開始し、/proc/events/acpiそこでメッセージをデコードすることができます。

しかし、それを行うために使用acpidするのはどうですか?を聞いて、/var/run/acpid.socket気になるメッセージが届いたら、やらなければいけないことをします。

参照: http ://www.linuxmanpages.com/man8/acpid.8.php

これがお役に立てば幸いです。

于 2012-12-24T21:34:26.440 に答える
2

acpidを見てください。/etc/acpi/特に/etc/acpi/powerbtn.sh、カスタムコマンドを追加するために、スクリプトの1つを変更できると思います。自分で読んでみることもでき/proc/acpi/eventます。

于 2012-12-24T21:35:09.780 に答える
2

電源ボタンを押すなど、ACPIイベントがトリガーされ、/ etc / acpi/eventsで構成されているように応答してacpidがスクリプトを起動します。この場合、次のような/ etc / acpi/powerbtnが必要です。

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

/etc/acpi/powerbtn.shをカスタマイズするか、選択した別のスクリプトにポイントすることができます。

于 2012-12-24T21:35:34.083 に答える