aboutsummaryrefslogtreecommitdiff
path: root/src/skhd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/skhd.c')
-rw-r--r--src/skhd.c110
1 files changed, 67 insertions, 43 deletions
diff --git a/src/skhd.c b/src/skhd.c
index 3525269..ee2da62 100644
--- a/src/skhd.c
+++ b/src/skhd.c
@@ -27,6 +27,7 @@
#include "parse.h"
#include "hotkey.h"
#include "synthesize.h"
+#include "service.h"
#include "hotload.c"
#include "event_tap.c"
@@ -47,28 +48,34 @@ extern bool CGSIsSecureEventInputSet(void);
typedef GLOBAL_CONNECTION_CALLBACK(global_connection_callback);
extern CGError CGSRegisterNotifyProc(void *handler, uint32_t type, void *context);
-#define internal static
-#define global static
-
#define SKHD_CONFIG_FILE ".skhdrc"
#define SKHD_PIDFILE_FMT "/tmp/skhd_%s.pid"
-global unsigned major_version = 0;
-global unsigned minor_version = 3;
-global unsigned patch_version = 5;
+#define VERSION_OPT_LONG "--version"
+#define VERSION_OPT_SHRT "-v"
+
+#define SERVICE_INSTALL_OPT "--install-service"
+#define SERVICE_UNINSTALL_OPT "--uninstall-service"
+#define SERVICE_START_OPT "--start-service"
+#define SERVICE_RESTART_OPT "--restart-service"
+#define SERVICE_STOP_OPT "--stop-service"
+
+#define MAJOR 0
+#define MINOR 3
+#define PATCH 6
-global struct carbon_event carbon;
-global struct event_tap event_tap;
-global struct hotloader hotloader;
-global struct mode *current_mode;
-global struct table mode_map;
-global struct table blacklst;
-global bool thwart_hotloader;
-global char config_file[4096];
+static struct carbon_event carbon;
+static struct event_tap event_tap;
+static struct hotloader hotloader;
+static struct mode *current_mode;
+static struct table mode_map;
+static struct table blacklst;
+static bool thwart_hotloader;
+static char config_file[4096];
-internal HOTLOADER_CALLBACK(config_handler);
+static HOTLOADER_CALLBACK(config_handler);
-internal void
+static void
parse_config_helper(char *absolutepath)
{
struct parser parser;
@@ -100,7 +107,7 @@ parse_config_helper(char *absolutepath)
current_mode = table_find(&mode_map, "default");
}
-internal HOTLOADER_CALLBACK(config_handler)
+static HOTLOADER_CALLBACK(config_handler)
{
BEGIN_TIMED_BLOCK("hotload_config");
debug("skhd: config-file has been modified.. reloading config\n");
@@ -110,7 +117,7 @@ internal HOTLOADER_CALLBACK(config_handler)
END_TIMED_BLOCK();
}
-internal CF_NOTIFICATION_CALLBACK(keymap_handler)
+static CF_NOTIFICATION_CALLBACK(keymap_handler)
{
BEGIN_TIMED_BLOCK("keymap_changed");
if (initialize_keycode_map()) {
@@ -122,7 +129,7 @@ internal CF_NOTIFICATION_CALLBACK(keymap_handler)
END_TIMED_BLOCK();
}
-internal EVENT_TAP_CALLBACK(key_observer_handler)
+static EVENT_TAP_CALLBACK(key_observer_handler)
{
switch (type) {
case kCGEventTapDisabledByTimeout:
@@ -152,7 +159,7 @@ internal EVENT_TAP_CALLBACK(key_observer_handler)
return event;
}
-internal EVENT_TAP_CALLBACK(key_handler)
+static EVENT_TAP_CALLBACK(key_handler)
{
switch (type) {
case kCGEventTapDisabledByTimeout:
@@ -186,8 +193,7 @@ internal EVENT_TAP_CALLBACK(key_handler)
return event;
}
-internal void
-sigusr1_handler(int signal)
+static void sigusr1_handler(int signal)
{
BEGIN_TIMED_BLOCK("sigusr1");
debug("skhd: SIGUSR1 received.. reloading config\n");
@@ -197,8 +203,7 @@ sigusr1_handler(int signal)
END_TIMED_BLOCK();
}
-internal pid_t
-read_pid_file(void)
+static pid_t read_pid_file(void)
{
char pid_file[255] = {};
pid_t pid = 0;
@@ -225,8 +230,7 @@ read_pid_file(void)
return pid;
}
-internal void
-create_pid_file(void)
+static void create_pid_file(void)
{
char pid_file[255] = {};
pid_t pid = getpid();
@@ -263,15 +267,44 @@ create_pid_file(void)
debug("skhd: successfully created pid-file..\n");
}
-internal bool
-parse_arguments(int argc, char **argv)
+static inline bool string_equals(const char *a, const char *b)
+{
+ return a && b && strcmp(a, b) == 0;
+}
+
+static bool parse_arguments(int argc, char **argv)
{
+ if ((string_equals(argv[1], VERSION_OPT_LONG)) ||
+ (string_equals(argv[1], VERSION_OPT_SHRT))) {
+ fprintf(stdout, "skhd-v%d.%d.%d\n", MAJOR, MINOR, PATCH);
+ exit(EXIT_SUCCESS);
+ }
+
+ if (string_equals(argv[1], SERVICE_INSTALL_OPT)) {
+ exit(service_install());
+ }
+
+ if (string_equals(argv[1], SERVICE_UNINSTALL_OPT)) {
+ exit(service_uninstall());
+ }
+
+ if (string_equals(argv[1], SERVICE_START_OPT)) {
+ exit(service_start());
+ }
+
+ if (string_equals(argv[1], SERVICE_RESTART_OPT)) {
+ exit(service_restart());
+ }
+
+ if (string_equals(argv[1], SERVICE_STOP_OPT)) {
+ exit(service_stop());
+ }
+
int option;
const char *short_option = "VPvc:k:t:rho";
struct option long_option[] = {
{ "verbose", no_argument, NULL, 'V' },
{ "profile", no_argument, NULL, 'P' },
- { "version", no_argument, NULL, 'v' },
{ "config", required_argument, NULL, 'c' },
{ "no-hotload", no_argument, NULL, 'h' },
{ "key", required_argument, NULL, 'k' },
@@ -289,10 +322,6 @@ parse_arguments(int argc, char **argv)
case 'P': {
profile = true;
} break;
- case 'v': {
- printf("skhd version %d.%d.%d\n", major_version, minor_version, patch_version);
- return true;
- } break;
case 'c': {
snprintf(config_file, sizeof(config_file), "%s", optarg);
} break;
@@ -324,8 +353,7 @@ parse_arguments(int argc, char **argv)
return false;
}
-internal bool
-check_privileges(void)
+static bool check_privileges(void)
{
bool result;
const void *keys[] = { kAXTrustedCheckOptionPrompt };
@@ -343,8 +371,7 @@ check_privileges(void)
return result;
}
-internal inline bool
-file_exists(char *filename)
+static inline bool file_exists(char *filename)
{
struct stat buffer;
@@ -359,8 +386,7 @@ file_exists(char *filename)
return true;
}
-internal bool
-get_config_file(char *restrict filename, char *restrict buffer, int buffer_size)
+static bool get_config_file(char *restrict filename, char *restrict buffer, int buffer_size)
{
char *xdg_home = getenv("XDG_CONFIG_HOME");
if (xdg_home && *xdg_home) {
@@ -378,8 +404,7 @@ get_config_file(char *restrict filename, char *restrict buffer, int buffer_size)
return file_exists(buffer);
}
-internal char *
-secure_keyboard_entry_process_info(pid_t *pid)
+static char *secure_keyboard_entry_process_info(pid_t *pid)
{
char *process_name = NULL;
@@ -396,8 +421,7 @@ secure_keyboard_entry_process_info(pid_t *pid)
return process_name;
}
-internal void
-dump_secure_keyboard_entry_process_info(void)
+static void dump_secure_keyboard_entry_process_info(void)
{
pid_t pid;
char *process_name = secure_keyboard_entry_process_info(&pid);