Code:
lipc-wait-event -m com.lab126.powerd goingToScreenSaver,outOfScreenSaver
doesn't work for me because I turn off the screen saver during my program execution:
Code:
# prevent screensaver activation
lipc-set-prop com.lab126.powerd preventScreenSaver 1
...
# restore screensaver
lipc-set-prop com.lab126.powerd preventScreenSaver 0
exploring kernel sources I've found yoshi_button.c.
So, I can get power button release event using netlink socket:
code sample
Spoiler:
Code:
#include <sys/socket.h>
#include <linux/netlink.h>
#define MAX_PAYLOAD 1024 /* maximum payload size*/
struct sockaddr_nl src_addr, dest_addr;
struct nlmsghdr *nlh = NULL;
struct msghdr msg;
struct iovec iov;
int sock_fd;
int main()
{
/* Changed LJ article example to use NETLINK_KOBJECT_UEVENT */
sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
memset(&src_addr, 0, sizeof(src_addr));
src_addr.nl_family = AF_NETLINK;
src_addr.nl_pid = getpid(); // self pid
src_addr.nl_groups = 1; // interested in group 1<<0
bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr));
memset(&dest_addr, 0, sizeof(dest_addr));
nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
iov.iov_base = (void *)nlh;
iov.iov_len = NLMSG_SPACE(MAX_PAYLOAD);
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
printf("Waiting for message from kernel\n");
/* Read message from kernel */
recvmsg(sock_fd, &msg, 0);
printf("Received message payload: %s\n", NLMSG_DATA(nlh));
close(sock_fd);
return 0;
}
Message for power button is: "virtual/misc/yoshibutton"
Probably it will be useful for sombody else. It works at least for KT and KPW-1. KPW-2 seems to use another approach (through event-N).
Now I need to get the sleepcover event also. But the main problem that I have no sleep cover on my KT.
Please, I need to know, does sleep cover use the same approach?