diff --git a/evdev/evdev.c b/evdev/evdev.c new file mode 100644 index 0000000..cc3f956 --- /dev/null +++ b/evdev/evdev.c @@ -0,0 +1,33 @@ +#include "evdev.h" + + +int block_until_keypress(const char* keyboardPath) { + int keyboardFd = open(keyboardPath, O_RDONLY); + if (keyboardFd < 0) { + return keyboardFd; + } + + int eventSize = sizeof(struct input_event); + int bytesRead = 0; + struct input_event events[NUM_EVENTS]; + + int readEvents = 1; + while(readEvents) { + bytesRead = read(keyboardFd, events, eventSize * NUM_EVENTS); + if (bytesRead < 0) { + return bytesRead; + } + + for(int i = 0; i < (bytesRead / eventSize); ++i) { + struct input_event event = events[i]; + if(event.type == EV_KEY) { + if(event.value == 1) { + readEvents = 0; + } + } + } + } + + close(keyboardFd); + return 0; +} diff --git a/evdev/evdev.go b/evdev/evdev.go new file mode 100644 index 0000000..53126d1 --- /dev/null +++ b/evdev/evdev.go @@ -0,0 +1,24 @@ +package evdev + +// #cgo CFLAGS: -g -Wall +// #include "evdev.h" +// #include +import "C" + +import ( + "unsafe" + "syscall" +) + + +func BlockUntilKeypress(devicePath string) error { + path := C.CString(devicePath) + defer C.free(unsafe.Pointer(path)) + + ret := C.block_until_keypress(path) + if ret < 0 { + return syscall.Errno(ret) + } + + return nil +} diff --git a/evdev/evdev.h b/evdev/evdev.h new file mode 100644 index 0000000..7741b47 --- /dev/null +++ b/evdev/evdev.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + + +#define NUM_EVENTS 128 + +int block_until_keypress(const char* keyboardPath); diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..33fcada --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module after-lock + +go 1.15 diff --git a/main.go b/main.go new file mode 100644 index 0000000..719e53c --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import( + "after-lock/evdev" + "log" +) + +func main() { + err := evdev.BlockUntilKeypress("/dev/input/by-id/usb-Dell_Dell_USB_Entry_Keyboard-event-kbd") + if err != nil { + log.Fatal(err) + } +} \ No newline at end of file