diff --git a/setsu/include/setsu.h b/setsu/include/setsu.h index a34250a..0303024 100644 --- a/setsu/include/setsu.h +++ b/setsu/include/setsu.h @@ -20,6 +20,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct setsu_t Setsu; typedef struct setsu_device_t SetsuDevice; typedef int SetsuTrackingId; @@ -75,4 +79,8 @@ const char *setsu_device_get_path(SetsuDevice *dev); uint32_t setsu_device_get_width(SetsuDevice *dev); uint32_t setsu_device_get_height(SetsuDevice *dev); +#ifdef __cplusplus +} +#endif + #endif diff --git a/setsu/src/setsu.c b/setsu/src/setsu.c index 2e78e9a..bfce543 100644 --- a/setsu/src/setsu.c +++ b/setsu/src/setsu.c @@ -116,11 +116,20 @@ Setsu *setsu_new() void setsu_free(Setsu *setsu) { + if(!setsu) + return; while(setsu->dev) setsu_disconnect(setsu, setsu->dev); if(setsu->udev_mon) udev_monitor_unref(setsu->udev_mon); udev_unref(setsu->udev); + while(setsu->avail_dev) + { + SetsuAvailDevice *adev = setsu->avail_dev; + setsu->avail_dev = adev->next; + free(adev->path); + free(adev); + } free(setsu); } diff --git a/setsu/test/main.c b/setsu/test/main.c index 41401ac..be36535 100644 --- a/setsu/test/main.c +++ b/setsu/test/main.c @@ -22,6 +22,7 @@ #include #include #include +#include Setsu *setsu; @@ -38,12 +39,13 @@ struct { bool dirty = false; bool log_mode; +volatile bool should_quit; #define LOG(...) do { if(log_mode) fprintf(stderr, __VA_ARGS__); } while(0) -void quit() +void sigint(int s) { - setsu_free(setsu); + should_quit = true; } void print_state() @@ -155,15 +157,22 @@ int main(int argc, const char *argv[]) printf("Failed to init setsu\n"); return 1; } + + struct sigaction sa = {0}; + sa.sa_handler = sigint; + sigemptyset(&sa.sa_mask); + sigaction(SIGINT, &sa, NULL); + dirty = true; - while(1) + while(!should_quit) { if(dirty && !log_mode) print_state(); dirty = false; setsu_poll(setsu, event, NULL); } - atexit(quit); + setsu_free(setsu); + printf("\nさよなら!\n"); return 0; }