diff options
Diffstat (limited to 'src/mds-libinput.c')
-rw-r--r-- | src/mds-libinput.c | 668 |
1 files changed, 338 insertions, 330 deletions
diff --git a/src/mds-libinput.c b/src/mds-libinput.c index cd87e72..76bfb5e 100644 --- a/src/mds-libinput.c +++ b/src/mds-libinput.c @@ -32,7 +32,7 @@ -#define MDS_LIBINPUT_VARS_VERSION 0 +#define MDS_LIBINPUT_VARS_VERSION 0 @@ -42,15 +42,14 @@ * * This tells the server-base how to behave */ -server_characteristics_t server_characteristics = - { - .require_privileges = 1, - .require_display = 1, - .require_respawn_info = 0, - .sanity_check_argc = 1, - .fork_for_safety = 0, - .danger_is_deadly = 0 - }; +server_characteristics_t server_characteristics = { + .require_privileges = 1, + .require_display = 1, + .require_respawn_info = 0, + .sanity_check_argc = 1, + .fork_for_safety = 0, + .danger_is_deadly = 0 +}; @@ -82,12 +81,12 @@ static struct libinput* li = NULL; /** * udev context */ -static struct udev* udev = NULL; +static struct udev *udev = NULL; /** * List of all opened devices */ -static struct libinput_device** devices = NULL; +static struct libinput_device **devices = NULL; /** * The number of element slots allocated for `devices` @@ -117,7 +116,7 @@ static volatile sig_atomic_t ev_thread_started = 0; /** * Message buffer for the main thread */ -static char* resp_send_buffer = NULL; +static char *resp_send_buffer = NULL; /** * The size of `resp_send_buffer` @@ -127,7 +126,7 @@ static size_t resp_send_buffer_size = 0; /** * Message buffer for the event thread */ -static char* anno_send_buffer = NULL; +static char *anno_send_buffer = NULL; /** * The size of `anno_send_buffer` @@ -176,8 +175,8 @@ static pthread_mutex_t dev_mutex; * @param length:size_t The length of the message * @return :int Zero on success, -1 on error */ -#define full_send(message, length) \ - ((full_send)(socket_fd, message, length)) +#define full_send(message, length)\ + ((full_send)(socket_fd, message, length)) /** @@ -185,48 +184,46 @@ static pthread_mutex_t dev_mutex; * * @return Non-zero on error */ -int parse_cmdline(void) +int +parse_cmdline(void) { - int i; - - /* Parse command line arguments. */ - for (i = 1; i < argc; i++) - { - char* arg = argv[i]; - int v; - if ((v = strequals(arg, "--initial-spawn")) || /* Initial spawn? */ - strequals(arg, "--respawn")) /* Respawning after crash? */ - { - exit_if (is_respawn == v, - eprintf("conflicting arguments %s and %s cannot be combined.", - "--initial-spawn", "--respawn");); - is_respawn = !v; + int i, v; + char *arg; + + /* Parse command line arguments. */ + for (i = 1; i < argc; i++) { + arg = argv[i]; + if ((v = strequals(arg, "--initial-spawn")) || /* Initial spawn? */ + strequals(arg, "--respawn")) { /* Respawning after crash? */ + exit_if (is_respawn == v, + eprintf("conflicting arguments %s and %s cannot be combined.", + "--initial-spawn", "--respawn");); + is_respawn = !v; + } else if (strequals(arg, "--re-exec")) { /* Re-exec state-marshal. */ + is_reexec = 1; + } else if (startswith(arg, "--alarm=")) { /* Schedule an alarm signal for forced abort. */ + alarm(min(atou(arg + strlen("--alarm=")), 60)); /* At most 1 minute. */ + } else if (strequals(arg, "--on-init-fork")) { /* Fork process when initialised. */ + on_init_fork = 1; + } else if (startswith(arg, "--on-init-sh=")) { /* Run a command when initialised. */ + on_init_sh = arg + strlen("--on-init-sh="); + } else if (strequals(arg, "--immortal")) { /* I return to serve. */ + is_immortal = 1; + } else if (startswith(arg, "--seat=")) { /* Seat to pass to libinput. */ + seat = arg + strlen("--seat="); + } } - else if (strequals(arg, "--re-exec")) /* Re-exec state-marshal. */ - is_reexec = 1; - else if (startswith(arg, "--alarm=")) /* Schedule an alarm signal for forced abort. */ - alarm(min(atou(arg + strlen("--alarm=")), 60)); /* At most 1 minute. */ - else if (strequals(arg, "--on-init-fork")) /* Fork process when initialised. */ - on_init_fork = 1; - else if (startswith(arg, "--on-init-sh=")) /* Run a command when initialised. */ - on_init_sh = arg + strlen("--on-init-sh="); - else if (strequals(arg, "--immortal")) /* I return to serve. */ - is_immortal = 1; - else if (startswith(arg, "--seat=")) /* Seat to pass to libinput. */ - seat = arg + strlen("--seat="); - } - if (is_reexec) - { - is_respawn = 1; - eprint("re-exec performed."); - } - - /* Check that mandatory arguments have been specified. */ - if (server_characteristics.require_respawn_info) - exit_if (is_respawn < 0, - eprintf("missing state argument, require either %s or %s.", - "--initial-spawn", "--respawn");); - return 0; + if (is_reexec) { + is_respawn = 1; + eprint("re-exec performed."); + } + + /* Check that mandatory arguments have been specified. */ + if (server_characteristics.require_respawn_info) + exit_if (is_respawn < 0, + eprintf("missing state argument, require either %s or %s.", + "--initial-spawn", "--respawn");); + return 0; } @@ -236,9 +233,10 @@ int parse_cmdline(void) * * @return Non-zero on error */ -int __attribute__((const)) preinitialise_server(void) +int __attribute__((const)) +preinitialise_server(void) { - return 0; + return 0; } @@ -248,18 +246,19 @@ int __attribute__((const)) preinitialise_server(void) * * @return Non-zero on error */ -int initialise_server(void) +int +initialise_server(void) { - int stage = 0; - fail_if (server_initialised()); - fail_if (mds_message_initialise(&received)); stage++; - - return 0; - - fail: - xperror(*argv); - if (stage >= 1) mds_message_destroy(&received); - return 1; + int stage = 0; + fail_if (server_initialised()); + fail_if (mds_message_initialise(&received)); stage++; + + return 0; + +fail: + xperror(*argv); + if (stage >= 1) mds_message_destroy(&received); + return 1; } @@ -269,23 +268,24 @@ int initialise_server(void) * * @return Non-zero on error */ -int postinitialise_server(void) +int +postinitialise_server(void) { - int stage = 0; - fail_if (initialise_libinput()); - fail_if (pthread_mutex_init(&dev_mutex, NULL)); stage++; - - if (connected) - return 0; - - fail_if (reconnect_to_display()); - connected = 1; - return 0; - fail: - terminate_libinput(); - mds_message_destroy(&received); - if (stage >= 1) pthread_mutex_destroy(&dev_mutex); - return 1; + int stage = 0; + fail_if (initialise_libinput()); + fail_if (pthread_mutex_init(&dev_mutex, NULL)); stage++; + + if (connected) + return 0; + + fail_if (reconnect_to_display()); + connected = 1; + return 0; +fail: + terminate_libinput(); + mds_message_destroy(&received); + if (stage >= 1) pthread_mutex_destroy(&dev_mutex); + return 1; } @@ -297,11 +297,12 @@ int postinitialise_server(void) * * @return The number of bytes that will be stored by `marshal_server` */ -size_t marshal_server_size(void) +size_t +marshal_server_size(void) { - size_t rc = 2 * sizeof(int) + sizeof(uint32_t); - rc += mds_message_marshal_size(&received); - return rc; + size_t rc = 2 * sizeof(int) + sizeof(uint32_t); + rc += mds_message_marshal_size(&received); + return rc; } @@ -311,15 +312,16 @@ size_t marshal_server_size(void) * @param state_buf The buffer for the marshalled data * @return Non-zero on error */ -int marshal_server(char* state_buf) +int +marshal_server(char *state_buf) { - buf_set_next(state_buf, int, MDS_LIBINPUT_VARS_VERSION); - buf_set_next(state_buf, int, connected); - buf_set_next(state_buf, uint32_t, message_id); - mds_message_marshal(&received, state_buf); - - mds_message_destroy(&received); - return 0; + buf_set_next(state_buf, int, MDS_LIBINPUT_VARS_VERSION); + buf_set_next(state_buf, int, connected); + buf_set_next(state_buf, uint32_t, message_id); + mds_message_marshal(&received, state_buf); + + mds_message_destroy(&received); + return 0; } @@ -333,19 +335,20 @@ int marshal_server(char* state_buf) * @param state_buf The marshalled data that as not been read already * @return Non-zero on error */ -int unmarshal_server(char* state_buf) +int +unmarshal_server(char *state_buf) { - /* buf_get_next(state_buf, int, MDS_LIBINPUT_VARS_VERSION); */ - buf_next(state_buf, int, 1); - buf_get_next(state_buf, int, connected); - buf_get_next(state_buf, uint32_t, message_id); - fail_if (mds_message_unmarshal(&received, state_buf)); - - return 0; - fail: - xperror(*argv); - mds_message_destroy(&received); - return -1; + /* buf_get_next(state_buf, int, MDS_LIBINPUT_VARS_VERSION); */ + buf_next(state_buf, int, 1); + buf_get_next(state_buf, int, connected); + buf_get_next(state_buf, uint32_t, message_id); + fail_if (mds_message_unmarshal(&received, state_buf)); + + return 0; +fail: + xperror(*argv); + mds_message_destroy(&received); + return -1; } @@ -355,9 +358,10 @@ int unmarshal_server(char* state_buf) * * @return Non-zero on error */ -int __attribute__((const)) reexec_failure_recover(void) +int __attribute__((const)) +reexec_failure_recover(void) { - return -1; + return -1; } @@ -366,16 +370,17 @@ int __attribute__((const)) reexec_failure_recover(void) * * @param signo The signal */ -void signal_all(int signo) +void +signal_all(int signo) { - pthread_t current_thread = pthread_self(); - - if (pthread_equal(current_thread, master_thread) == 0) - pthread_kill(master_thread, signo); + pthread_t current_thread = pthread_self(); - if (ev_thread_started) - if (pthread_equal(current_thread, ev_thread) == 0) - pthread_kill(ev_thread, signo); + if (!pthread_equal(current_thread, master_thread)) + pthread_kill(master_thread, signo); + + if (ev_thread_started) + if (!pthread_equal(current_thread, ev_thread)) + pthread_kill(ev_thread, signo); } @@ -386,17 +391,17 @@ void signal_all(int signo) * * @param signo The signal that has been received */ -void received_danger(int signo) +void +received_danger(int signo) { - SIGHANDLER_START; - (void) signo; - if ((danger == 0) || (ev_danger == 0)) - { - danger = 1; - ev_danger = 1; - eprint("danger signal received."); - } - SIGHANDLER_END; + SIGHANDLER_START; + if (!danger || !ev_danger) { + danger = 1; + ev_danger = 1; + eprint("danger signal received."); + } + SIGHANDLER_END; + (void) signo; } @@ -405,64 +410,62 @@ void received_danger(int signo) * * @return Non-zero on error */ -int master_loop(void) +int +master_loop(void) { - int rc = 1, joined = 0, r; - void* ev_ret; - - /* Start thread that reads input events. */ - fail_if ((errno = pthread_create(&ev_thread, NULL, event_loop, NULL))); + int rc = 1, joined = 0, r; + void *ev_ret; - /* Listen for messages. */ - while (!reexecing && !terminating) - { - if (info) - dump_info(); - if (danger) - { - danger = 0; - free(resp_send_buffer), resp_send_buffer = NULL; - resp_send_buffer_size = 0; - pack_devices(); - } - - if (r = mds_message_read(&received, socket_fd), r == 0) - if (r = handle_message(), r == 0) - continue; - - if (r == -2) - { - eprint("corrupt message received, aborting."); - goto done; + /* Start thread that reads input events. */ + fail_if ((errno = pthread_create(&ev_thread, NULL, event_loop, NULL))); + + /* Listen for messages. */ + while (!reexecing && !terminating) { + if (info) + dump_info(); + if (danger) { + danger = 0; + free(resp_send_buffer), resp_send_buffer = NULL; + resp_send_buffer_size = 0; + pack_devices(); + } + + if (!(r = mds_message_read(&received, socket_fd))) + if (!(r = handle_message())) + continue; + + if (r == -2) { + eprint("corrupt message received, aborting."); + goto done; + } else if (errno == EINTR) { + continue; + } else { + fail_if (errno != ECONNRESET); + } + + eprint("lost connection to server."); + mds_message_destroy(&received); + mds_message_initialise(&received); + connected = 0; + fail_if (reconnect_to_display()); + connected = 1; } - else if (errno == EINTR) - continue; - else - fail_if (errno != ECONNRESET); - - eprint("lost connection to server."); - mds_message_destroy(&received); - mds_message_initialise(&received); - connected = 0; - fail_if (reconnect_to_display()); - connected = 1; - } - - joined = 1; - fail_if ((errno = pthread_join(ev_thread, &ev_ret))); - rc = ev_ret == NULL ? 0 : 1; - goto done; - fail: - xperror(*argv); - done: - free(resp_send_buffer); - if (!joined && (errno = pthread_join(ev_thread, NULL))) - xperror(*argv); - if (!rc && reexecing) - return 0; - mds_message_destroy(&received); - terminate_libinput(); - return rc; + + joined = 1; + fail_if ((errno = pthread_join(ev_thread, &ev_ret))); + rc = ev_ret == NULL ? 0 : 1; + goto done; +fail: + xperror(*argv); +done: + free(resp_send_buffer); + if (!joined && (errno = pthread_join(ev_thread, NULL))) + xperror(*argv); + if (!rc && reexecing) + return 0; + mds_message_destroy(&received); + terminate_libinput(); + return rc; } @@ -472,39 +475,36 @@ int master_loop(void) * @param data Input data * @return Output data */ -void* event_loop(void* data) +void *event_loop(void *data) { - (void) data; - - ev_thread_started = 1; - - if (handle_event() < 0) - fail_if (errno != EINTR); - while (!reexecing && !terminating) - { - if (ev_danger) - { - ev_danger = 0; - free(anno_send_buffer), anno_send_buffer = NULL; - anno_send_buffer_size = 0; - } - - FD_SET(event_fd, &event_fd_set); - if (select(event_fd + 1, &event_fd_set, NULL, NULL, NULL) < 0) - { - fail_if (errno != EINTR); - continue; + ev_thread_started = 1; + + if (handle_event() < 0) + fail_if (errno != EINTR); + while (!reexecing && !terminating) { + if (ev_danger) { + ev_danger = 0; + free(anno_send_buffer); + anno_send_buffer = NULL; + anno_send_buffer_size = 0; + } + + FD_SET(event_fd, &event_fd_set); + if (select(event_fd + 1, &event_fd_set, NULL, NULL, NULL) < 0) { + fail_if (errno != EINTR); + continue; + } + if (handle_event() < 0) + fail_if (errno != EINTR); } - if (handle_event() < 0) - fail_if (errno != EINTR); - } - - return NULL; - - fail: - xperror(*argv); - raise(SIGTERM); - return (void*)1024; + + return NULL; + +fail: + xperror(*argv); + raise(SIGTERM); + return (void*)1024; + (void) data; } @@ -513,22 +513,23 @@ void* event_loop(void* data) * * @return Zero on success, -1 on error */ -int handle_event(void) +int +handle_event(void) { - struct libinput_event* ev; - if ((errno = -libinput_dispatch(li))) - return -1; - while ((ev = libinput_get_event(li))) { - switch (libinput_event_get_type(ev)) { - /* TODO */ - default: - break; - } - libinput_event_destroy(ev); - if ((errno = -libinput_dispatch(li))) - return -1; - } - return 0; + struct libinput_event* ev; + if ((errno = -libinput_dispatch(li))) + return -1; + while ((ev = libinput_get_event(li))) { + switch (libinput_event_get_type(ev)) { + /* TODO */ + default: + break; + } + libinput_event_destroy(ev); + if ((errno = -libinput_dispatch(li))) + return -1; + } + return 0; } @@ -537,10 +538,11 @@ int handle_event(void) * * @return Zero on success, -1 on error */ -int handle_message(void) +int +handle_message(void) { - /* TODO */ - return 0; + /* TODO */ + return 0; } @@ -552,13 +554,14 @@ int handle_message(void) * @param userdata Not used * @return The file descriptor, or `-errno` on error */ -int open_restricted(const char* path, int flags, void* userdata) +int +open_restricted(const char *path, int flags, void *userdata) { - int fd = open(path, flags); - if (fd < 0) - return perror(*argv), -errno; - return fd; - (void) userdata; + int fd = open(path, flags); + if (fd < 0) + return perror(*argv), -errno; + return fd; + (void) userdata; } @@ -568,10 +571,11 @@ int open_restricted(const char* path, int flags, void* userdata) * @param fd The file descriptor of the device * @param userdata Not used */ -void close_restricted(int fd, void* userdata) +void +close_restricted(int fd, void *userdata) { - close(fd); - (void) userdata; + close(fd); + (void) userdata; } @@ -580,37 +584,41 @@ void close_restricted(int fd, void* userdata) * * @return Zero on success, -1 on error */ -int initialise_libinput(void) +int +initialise_libinput(void) { - const struct libinput_interface interface = { - .open_restricted = open_restricted, - .close_restricted = close_restricted - }; - - if (!(udev = udev_new())) - return eprint("failed to initialize udev."), errno = 0, -1; - if (!(li = libinput_udev_create_context(&interface, NULL, udev))) - return eprint("failed to initialize context from udev."), errno = 0, -1; - if (libinput_udev_assign_seat(li, seat)) - return eprintf("failed to set seat: %s", seat), errno = 0, -1; - - event_fd = libinput_get_fd(li); - FD_ZERO(&event_fd_set); - - return 0; + const struct libinput_interface interface = { + .open_restricted = open_restricted, + .close_restricted = close_restricted + }; + + if (!(udev = udev_new())) + return eprint("failed to initialize udev."), errno = 0, -1; + if (!(li = libinput_udev_create_context(&interface, NULL, udev))) + return eprint("failed to initialize context from udev."), errno = 0, -1; + if (libinput_udev_assign_seat(li, seat)) + return eprintf("failed to set seat: %s", seat), errno = 0, -1; + + event_fd = libinput_get_fd(li); + FD_ZERO(&event_fd_set); + + return 0; } /** * Release access of input devices */ -void terminate_libinput(void) +void +terminate_libinput(void) { - while (devices_used--) - if (devices[devices_used]) - libinput_device_unref(devices[devices_used]); - if (li) libinput_unref(li); - if (udev) udev_unref(udev); + while (devices_used--) + if (devices[devices_used]) + libinput_device_unref(devices[devices_used]); + if (li) + libinput_unref(li); + if (udev) + udev_unref(udev); } @@ -620,21 +628,21 @@ void terminate_libinput(void) * @param dev The device * @return Zero on success, -1 on error */ -int add_device(struct libinput_device* dev) +int +add_device(struct libinput_device *dev) { - if (devices_ptr == devices_size) - { - struct libinput_device** tmp; - if (yrealloc(tmp, devices, devices_size + 10, struct libinput_device*)) - return -1; - devices_size += 10; - } - - devices[devices_ptr++] = libinput_device_ref(dev); - while ((devices_ptr < devices_used) && devices[devices_ptr]) - devices_ptr++; - - return 0; + struct libinput_device **tmp; + if (devices_ptr == devices_size) { + if (yrealloc(tmp, devices, devices_size + 10, struct libinput_device*)) + return -1; + devices_size += 10; + } + + devices[devices_ptr++] = libinput_device_ref(dev); + while (devices_ptr < devices_used && devices[devices_ptr]) + devices_ptr++; + + return 0; } @@ -643,48 +651,47 @@ int add_device(struct libinput_device* dev) * * @param dev The device */ -void remove_device(struct libinput_device* dev) +void +remove_device(struct libinput_device *dev) { - size_t i; - - for (i = 0; i < devices_used; i++) - if (devices[i] == dev) - { - libinput_device_unref(dev); - devices[i] = NULL; - if (i < devices_ptr) - devices_ptr = i; - if (i + 1 == devices_used) - devices_used -= 1; - break; - } + size_t i; + for (i = 0; i < devices_used; i++) { + if (devices[i] == dev) { + libinput_device_unref(dev); + devices[i] = NULL; + if (i < devices_ptr) + devices_ptr = i; + if (i + 1 == devices_used) + devices_used -= 1; + break; + } + } } /** * Pack the device list */ -void pack_devices(void) +void +pack_devices(void) { - size_t i; - - for (i = devices_ptr = 0; i < devices_used; i++) - if (devices[i]) - devices[devices_ptr++] = devices[i]; - devices_used = devices_ptr; + struct libinput_device **tmp; + size_t i; - if (devices_used) - { - struct libinput_device** tmp; - if (yrealloc(tmp, devices, devices_used, struct libinput_device*)) - return; - devices_size = devices_used; - } - else - { - free(devices), devices = NULL; - devices_size = 0; - } + for (i = devices_ptr = 0; i < devices_used; i++) + if (devices[i]) + devices[devices_ptr++] = devices[i]; + devices_used = devices_ptr; + + if (devices_used) { + if (yrealloc(tmp, devices, devices_used, struct libinput_device *)) + return; + devices_size = devices_used; + } else { + free(devices); + devices = NULL; + devices_size = 0; + } } @@ -695,30 +702,31 @@ void pack_devices(void) * * @param signo The signal that has been received */ -void received_info(int signo) +void +received_info(int signo) { - SIGHANDLER_START; - (void) signo; - info = 1; - SIGHANDLER_END; + SIGHANDLER_START; + info = 1; + SIGHANDLER_END; + (void) signo; } /** * The the state of the server */ -void dump_info(void) +void +dump_info(void) { - info = 1; - iprintf("next message ID: %" PRIu32, message_id); - iprintf("connected: %s", connected ? "yes" : "no"); - iprintf("libinput seat: %s", seat); - iprintf("sigdanger pending (main): %s", danger ? "yes" : "no"); - iprintf("sigdanger pending (event): %s", ev_danger ? "yes" : "no"); - iprintf("response send buffer size: %zu bytes", resp_send_buffer_size); - iprintf("announce send buffer size: %zu bytes", anno_send_buffer_size); - iprintf("event file descriptor: %i", event_fd); - iprintf("event thread started: %s", ev_thread_started ? "yes" : "no"); - /* TODO list devices -- with_mutex(dev_mutex, ); */ + info = 1; + iprintf("next message ID: %" PRIu32, message_id); + iprintf("connected: %s", connected ? "yes" : "no"); + iprintf("libinput seat: %s", seat); + iprintf("sigdanger pending (main): %s", danger ? "yes" : "no"); + iprintf("sigdanger pending (event): %s", ev_danger ? "yes" : "no"); + iprintf("response send buffer size: %zu bytes", resp_send_buffer_size); + iprintf("announce send buffer size: %zu bytes", anno_send_buffer_size); + iprintf("event file descriptor: %i", event_fd); + iprintf("event thread started: %s", ev_thread_started ? "yes" : "no"); + /* TODO list devices -- with_mutex(dev_mutex, ); */ } - |