Как я могу определить, когда пользователь нажал кнопку выключения?

У меня есть аркадный коктейльный шкаф (без клавиатуры, только джойстик и кнопки), работающий под управлением 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

7

Решение

Вы можете просто начать поток для чтения /proc/events/acpiи декодировать сообщения там.

Но как насчет использования acpid сделать это? Вы бы слушали /var/run/acpid.socketи когда приходит сообщение, о котором вы заботитесь, делайте то, что вам нужно.

Увидеть:
http://www.linuxmanpages.com/man8/acpid.8.php

Я надеюсь, что это полезно.

5

Другие решения

Посмотри на ACPID, Я думаю, что вы могли бы изменить один из сценариев в /etc/acpi/ конкретно /etc/acpi/powerbtn.sh добавить пользовательские команды. Вы также можете попробовать прочитать /proc/acpi/event сам.

2

Такие вещи, как нажатие кнопки питания, запускают события ACPI, которые acpid запускает сценарий в ответ на настройку в / etc / acpi / events. В этом случае вы хотите / etc / acpi / powerbtn, который выглядит примерно так:

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

Вы можете настроить /etc/acpi/powerbtn.sh или указать другой скрипт по вашему выбору.

2
По вопросам рекламы [email protected]