commit 346caef87a910c87787bdc14dc71cfc97929abdd
parent 9820663609e071119a02cdd037d44e5442ebaf00
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Tue, 15 Jun 2021 15:52:00 -0500
dialer: interact with atd
Diffstat:
M | clients/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;
}