2012-12-24 45 views
7

我有一個運行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 
+2

不,但這聽起來很酷! –

+0

connect()調用中的數字108是什麼?它不應該是sizeof(m_acpidsockaddr)嗎? –

回答

5

你可以只啓動一個線程從/proc/events/acpi中讀取,並解碼那裏的消息。

但是如何使用acpid來做到這一點?你會聽到/var/run/acpid.socket,當你關心的消息進來時,做你所做的事情。

請參見: http://www.linuxmanpages.com/man8/acpid.8.php

我希望這是有益的。

2

看一看acpid,我想你可以改變/etc/acpi/專門/etc/acpi/powerbtn.sh腳本之一添加自定義命令。你也可以嘗試自己閱讀/proc/acpi/event

2

之類的東西按壓其響應於被配置在/ etc/ACPI /事件ACPID打完一個腳本的電源按鈕觸發ACPI事件。在你想在/ etc/ACPI/powerbtn這種情況下,它看起來是這樣的:

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

您可以自定義/etc/acpi/powerbtn.sh,或在自己選擇的另一個腳本指向它。