У меня есть аркадный коктейльный шкаф (без клавиатуры, только джойстик и кнопки), работающий под управлением 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
Вы можете просто начать поток для чтения /proc/events/acpi
и декодировать сообщения там.
Но как насчет использования acpid
сделать это? Вы бы слушали /var/run/acpid.socket
и когда приходит сообщение, о котором вы заботитесь, делайте то, что вам нужно.
Увидеть:
http://www.linuxmanpages.com/man8/acpid.8.php
Я надеюсь, что это полезно.
Посмотри на ACPID, Я думаю, что вы могли бы изменить один из сценариев в /etc/acpi/
конкретно /etc/acpi/powerbtn.sh
добавить пользовательские команды. Вы также можете попробовать прочитать /proc/acpi/event
сам.
Такие вещи, как нажатие кнопки питания, запускают события ACPI, которые acpid запускает сценарий в ответ на настройку в / etc / acpi / events. В этом случае вы хотите / etc / acpi / powerbtn, который выглядит примерно так:
event=button[ /]power
action=/etc/acpi/powerbtn.sh
Вы можете настроить /etc/acpi/powerbtn.sh или указать другой скрипт по вашему выбору.