diff --git a/src/servers/Jamfile b/src/servers/Jamfile index b67eb396ea..fa73aa96c3 100644 --- a/src/servers/Jamfile +++ b/src/servers/Jamfile @@ -7,6 +7,7 @@ SubInclude OBOS_TOP src servers media ; SubInclude OBOS_TOP src servers media_addon ; SubInclude OBOS_TOP src servers midi ; # SubInclude OBOS_TOP src servers net ; +SubInclude OBOS_TOP src servers power ; SubInclude OBOS_TOP src servers print ; SubInclude OBOS_TOP src servers registrar ; SubInclude OBOS_TOP src servers screensaver ; diff --git a/src/servers/power/Jamfile b/src/servers/power/Jamfile new file mode 100644 index 0000000000..72c7b71bd8 --- /dev/null +++ b/src/servers/power/Jamfile @@ -0,0 +1,10 @@ +SubDir OBOS_TOP src servers power ; + +AddResources power_daemon : power_daemon.rdef ; + +Server power_daemon : + power_daemon.cpp + power_button_monitor.cpp + ; + +LinkSharedOSLibs power_daemon : be ; diff --git a/src/servers/power/power_button_monitor.cpp b/src/servers/power/power_button_monitor.cpp new file mode 100644 index 0000000000..8aee4dcd11 --- /dev/null +++ b/src/servers/power/power_button_monitor.cpp @@ -0,0 +1,30 @@ +#include +#include + +#include "power_button_monitor.h" + +#define B_SYSTEM_SHUTDOWN 0x12d +static const char *kRosterSignature = "application/x-vnd.Be-ROST"; + +PowerButtonMonitor::PowerButtonMonitor() : BHandler ("power_button_monitor") { + power_button_fd = open("/dev/power/button/power",O_RDONLY); +} + +PowerButtonMonitor::~PowerButtonMonitor() { + if (power_button_fd > 0) + close(power_button_fd); +} + +void PowerButtonMonitor::MessageReceived(BMessage *msg) { + if (msg->what != POLL_POWER_BUTTON_STATUS) + return; + + if (power_button_fd <= 0) + return; + + bool button_pressed; + read(power_button_fd,&button_pressed,1); + + if (button_pressed) + BMessenger(kRosterSignature).SendMessage(B_SYSTEM_SHUTDOWN); +} diff --git a/src/servers/power/power_button_monitor.h b/src/servers/power/power_button_monitor.h new file mode 100644 index 0000000000..b11738721f --- /dev/null +++ b/src/servers/power/power_button_monitor.h @@ -0,0 +1,19 @@ +#ifndef _POWER_BUTTON_MONITOR_H +#define _POWER_BUTTON_MONITOR_H + +#include + +#define POLL_POWER_BUTTON_STATUS 'ppbs' + +class PowerButtonMonitor : public BHandler { + public: + PowerButtonMonitor(); + virtual ~PowerButtonMonitor(); + + virtual void MessageReceived(BMessage *msg); + + private: + int power_button_fd; +}; + +#endif // _POWER_BUTTON_MONITOR_H diff --git a/src/servers/power/power_daemon.cpp b/src/servers/power/power_daemon.cpp new file mode 100644 index 0000000000..d9611df807 --- /dev/null +++ b/src/servers/power/power_daemon.cpp @@ -0,0 +1,26 @@ +#include +#include + +#include "power_button_monitor.h" + +class PowerManagementDaemon : public BApplication { + public: + PowerManagementDaemon(); + virtual ~PowerManagementDaemon(); +}; + +int main(void) { + new PowerManagementDaemon(); + be_app->Run(); + delete be_app; + return 0; +} + +PowerManagementDaemon::PowerManagementDaemon() : BApplication("application/x-vnd.Haiku-powermanagement") { + PowerButtonMonitor *pb_mon = new PowerButtonMonitor(); + AddHandler(pb_mon); + + new BMessageRunner(BMessenger(pb_mon,this),new BMessage(POLL_POWER_BUTTON_STATUS),5e5 /* twice a second */); +} + +PowerManagementDaemon::~PowerManagementDaemon() {} diff --git a/src/servers/power/power_daemon.rdef b/src/servers/power/power_daemon.rdef new file mode 100644 index 0000000000..1ac50c2827 --- /dev/null +++ b/src/servers/power/power_daemon.rdef @@ -0,0 +1,22 @@ + +resource(1, "BEOS:FILE_TYPES") message; + +resource(1, "BEOS:APP_SIG") #'MIMS' "application/x-vnd.Haiku-powermanagement"; + +resource app_version +{ + major = 0, + middle = 0, + minor = 1, + + /* 0 = development 1 = alpha 2 = beta + 3 = gamma 4 = golden master 5 = final */ + variety = 0, + + internal = 0, + + short_info = "Power Management 0.01", + long_info = "Haiku Power Management Daemon 0.01 Development" +}; + +resource(1, "BEOS:APP_FLAGS") #'APPF' $"04000000";