mowc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/mowc
Log | Files | Refs

commit 346caef87a910c87787bdc14dc71cfc97929abdd
parent 9820663609e071119a02cdd037d44e5442ebaf00
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Tue, 15 Jun 2021 15:52:00 -0500

dialer: interact with atd

Diffstat:
Mclients/dialer.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 71 insertions(+), 2 deletions(-)

diff --git a/clients/dialer.c b/clients/dialer.c @@ -1,7 +1,10 @@ +#include <poll.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/socket.h> +#include <sys/un.h> #include <unistd.h> #include <wld/wayland.h> #include <wld/wld.h> @@ -73,6 +76,9 @@ struct { unsigned int tw, th; enum button pressed, current; +int sock; +struct pollfd fds[2]; + static void wmping(void *data, struct xdg_wm_base *wm, uint32_t serial); static void xdgsurfconfigure(void *data, struct xdg_surface *surf, uint32_t serial); static void toplevelconfigure(void *data, struct xdg_toplevel *toplevel, int32_t w, int32_t h, struct wl_array *states); @@ -300,6 +306,9 @@ tidone(void *data, struct zwp_text_input_v3 *zwp_text_input_v3, uint32_t serial) if (strchr(DIALING_DIGITS, *next) != NULL) { wl.number[len+i] = *next; wl.number[len+i+1] = '\0'; + } else if (*next == '\n') { + atd_cmd_dial(fds[1].fd, wl.number); + fds[1].events = POLLIN; } } @@ -386,12 +395,72 @@ wlinit(void) drw_resize(wl.drw, wl.surface, wl.w, wl.h); draw(); + wl_display_roundtrip(wl.dpy); } int main(int argc, char *argv[]) { + struct sockaddr_un addr = { + .sun_family = AF_UNIX, + .sun_path = "/tmp/atd-socket" + }; + + char status = 0; + ssize_t ret; + + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock == -1) { + fprintf(stderr, "failed to open socket\n"); + return 1; + } + + int con = connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)); + if (con == -1) { + fprintf(stderr, "failed to connect\n"); + close(sock); + return 1; + } + wlinit(); - while (wl_display_dispatch(wl.dpy) != -1); - return 0; + + fds[0].fd = wl_display_get_fd(wl.dpy); + fds[0].events = POLLIN; + fds[1].fd = sock; + fds[1].events = 0; + while (true) { + if (poll(fds, sizeof(fds) / sizeof(fds[0]), -1) == -1) { + warn("poll failed\n"); + break; + } + + if (fds[0].revents & POLLIN) { + if (wl_display_dispatch(wl.dpy) == -1) { + warn("Wayland dispatch failed\n"); + break; + } + } + + if (fds[1].revents & POLLIN) { + ret = read(fds[1].fd, &status, 1); + if (ret == -1) { + warn("failed to read from atd\n"); + break; + } + + if (ret == 1) { + switch (status) { + case STATUS_OK: + exit(0); + case STATUS_ERROR: + warn("failed to dial number\n"); + } + } + } + + wl_display_flush(wl.dpy); + } + + close(fds[1].fd); + return 1; }