2012-12-24 41 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,或在自己选择的另一个脚本指向它。