commit f1a97c6

wf  ·  2026-05-18 16:12:59 +0000 UTC
parent 1ee9d60
Largely clean up code
7 files changed,  +77, -119
+0, -1
1@@ -17,7 +17,6 @@ It is also very heavily configurable and makes a point of exposing as much of th
2 TODO
3 ----
4 
5- * Improve code quality; remove some hacky stuff
6  * Add `subscribe` command
7 
8 Requirements
+0, -3
 1@@ -6,9 +6,6 @@
 2 #define SOCK_PATH  "/tmp/.howl.sock"
 3 #define MAXSIZE    256
 4 
 5-static int sfd;
 6-static int cfd;
 7-
 8 extern void _inf(const char *, ...);
 9 extern void _wrn(const char *, ...);
10 extern void _err(int, const char *, ...);
+3, -3
 1@@ -17,16 +17,16 @@ enum cmd {
 2 	cmd_focus_next,
 3 	cmd_close,
 4 	cmd_workspace,
 5-	cmd_send_workspace,
 6+	cmd_move_workspace,
 7 	cmd_get_geometry,
 8-	cmd_get_screen_geometry,
 9-	cmd_list_windows,
10 	cmd_get_pid,
11 	cmd_get_title,
12 	cmd_get_app_id,
13 	cmd_get_focus,
14 	cmd_get_workspace,
15+	cmd_get_screen_geometry,
16 	cmd_get_cursor_position,
17+	cmd_list_windows,
18 	cmd_bind,
19 	cmd_unbind,
20 	cmd_modkey,
+33, -56
  1@@ -32,16 +32,16 @@ static const struct command commands[] = {
  2 	{ "focus_next",          cmd_focus_next,          0, false },
  3 	{ "close",               cmd_close,               0, false },
  4 	{ "workspace",           cmd_workspace,           1, false },
  5-	{ "move_workspace",      cmd_send_workspace,      1, false },
  6+	{ "move_workspace",      cmd_move_workspace,      1, false },
  7 	{ "get_geometry",        cmd_get_geometry,        0, false },
  8 	{ "get_pid",             cmd_get_pid,             0, false },
  9 	{ "get_title",           cmd_get_title,           0, false },
 10 	{ "get_app_id",          cmd_get_app_id,          0, false },
 11 	{ "get_focus",           cmd_get_focus,           0, false },
 12 	{ "get_workspace",       cmd_get_workspace,       0, false },
 13-	{ "list_windows",        cmd_list_windows,        0, false },
 14 	{ "get_screen_geometry", cmd_get_screen_geometry, 0, false },
 15 	{ "get_cursor_position", cmd_get_cursor_position, 0, false },
 16+	{ "list_windows",        cmd_list_windows,        0, false },
 17 	{ "bind",                cmd_bind,                2, false },
 18 	{ "unbind",              cmd_unbind,              1, false },
 19 	{ "modkey",              cmd_modkey,              1, true  },
 20@@ -58,86 +58,64 @@ static const struct command commands[] = {
 21 
 22 static int
 23 ipc_msg(const struct command *cmd, int argc, char **argv) {
 24-	struct sockaddr_un addr;
 25-	char msg[MAXSIZE] = "", *data[8];
 26+	char buf[512];
 27+	size_t n = 0;
 28 
 29-	memset(&addr, 0, sizeof(struct sockaddr_un));
 30+	struct sockaddr_un addr = {0};
 31 	addr.sun_family = AF_UNIX;
 32 	strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1);
 33 
 34-	cfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
 35-	if (cfd == -1) {
 36+	int fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
 37+	if (fd < 0) {
 38 		perror("couldn't open IPC socket");
 39 		return 1;
 40 	}
 41 
 42-	if (connect(cfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
 43+	if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
 44 		perror("couldn't connect to IPC socket");
 45-		close(cfd);
 46+		close(fd);
 47 		return 1;
 48 	}
 49 
 50 	if (cmd->config) {
 51-		static char b0[5], b1[5];
 52-		snprintf(b0, sizeof b0, "%d", cmd_config);
 53-		snprintf(b1, sizeof b1, "%d", cmd->id);
 54-		data[0] = b0;
 55-		data[1] = b1;
 56+		int r = snprintf(buf + n, sizeof(buf) - n, "%d %d", cmd_config, cmd->id);
 57+		n += r;
 58 	} else {
 59-		static char b0[5];
 60-		snprintf(b0, sizeof b0, "%d", cmd->id);
 61-		data[0] = b0;
 62+		int r = snprintf(buf + n, sizeof(buf) - n, "%d", cmd->id);
 63+		n += r;
 64 	}
 65 
 66-	/* XXX: this is a horrible mess */
 67-	int o = cmd->config ? 2 : 1;
 68-	for (int i = 0; i < argc - 2; i++)
 69-		data[i + o] = argv[i + 2];
 70-	data[o + (argc - 2)] = NULL;
 71-
 72-	msg[0] = '\0';
 73-	for (int i = 0; data[i] != NULL; i++) {
 74-		strcat(msg, " ");
 75-		strcat(msg, data[i]);
 76+	for (int i = 2; i < argc; i++) {
 77+		int r = snprintf(buf + n, sizeof(buf) - n, " %s", argv[i]);
 78+		n += r;
 79 	}
 80 
 81-	if (send(cfd, msg, strlen(msg), 0) == -1) {
 82+	buf[n] = '\0';
 83+	if (write(fd, buf, strlen(buf)) < 0) {
 84 		perror("couldn't send IPC message");
 85+		close(fd);
 86 		return 1;
 87 	}
 88 
 89-	char resp[MAXSIZE];
 90-	ssize_t n;
 91-
 92-	if ((n = read(cfd, resp, sizeof(resp) - 1)) < 0) {
 93-		/* read error */
 94+	char buf2[512];
 95+	if ((n = read(fd, buf2, sizeof(buf2) - 1)) <= 0) {
 96 		perror("couldn't read from IPC socket");
 97+		close(fd);
 98 		return 1;
 99 	}
100+	buf2[n] = '\0';
101 
102-	if (n == 0) {
103-		/* EOF */
104-		perror("unexpected EOF on IPC socket");
105-		return 1;
106-	}
107-
108-	if (n > 0) {
109-		char *msg2;
110-		long ret = strtol(resp, &msg2, 10);
111-		if (msg2 == resp) {
112-			ret = 0;
113-		}
114+	char *ans;
115+	long ret = strtol(buf2, &ans, 10);
116+	if (ans == buf2)
117+		ret = 0;
118 
119-		while (*msg2 == ' ')
120-			msg2++;
121-
122-		if (strcmp(msg2, "") != 0)
123-			printf("%s", msg2);
124-		return (int)ret;
125-	}
126+	while (*ans == ' ')
127+		ans++;
128 
129-	close(cfd);
130-	return 1; /* NOTREACHED */
131+	if (strcmp(ans, "") != 0)
132+		printf("%s", ans);
133+	return (int)ret;
134 }
135 
136 int
137@@ -153,8 +131,7 @@ main(int argc, char **argv) {
138 				fprintf(stderr, "Wrong number of arguments for %s (need %d)\n", commands[i].name, commands[i].argc);
139 				return 1;
140 			}
141-			int ret = ipc_msg(&commands[i], argc, argv);
142-			return ret;
143+			return ipc_msg(&commands[i], argc, argv);
144 		}
145 	}
146 	
+15, -28
  1@@ -40,7 +40,7 @@ extern status ipc_focus_prev(char **);
  2 extern status ipc_focus_next(char **);
  3 extern status ipc_close(char **);
  4 extern status ipc_workspace(char **);
  5-extern status ipc_send_workspace(char **);
  6+extern status ipc_move_workspace(char **);
  7 extern status ipc_get_geometry(char **);
  8 extern status ipc_get_pid(char **);
  9 extern status ipc_get_title(char **);
 10@@ -75,6 +75,8 @@ static struct swc_screen_handler scr_handler = {
 11 	.usable_geometry_changed = on_scr_geometry
 12 };
 13 
 14+static int ipc_fd;
 15+
 16 typedef status (*cmd_handler_t)(char **);
 17 static const cmd_handler_t cmd_handler [cmd_last] = {
 18 	[cmd_move]                = ipc_move,
 19@@ -92,7 +94,7 @@ static const cmd_handler_t cmd_handler [cmd_last] = {
 20 	[cmd_focus_next]          = ipc_focus_next,
 21 	[cmd_close]               = ipc_close,
 22 	[cmd_workspace]           = ipc_workspace,
 23-	[cmd_send_workspace]      = ipc_send_workspace,
 24+	[cmd_move_workspace]      = ipc_move_workspace,
 25 	[cmd_get_geometry]        = ipc_get_geometry,
 26 	[cmd_get_pid]             = ipc_get_pid,
 27 	[cmd_get_title]           = ipc_get_title,
 28@@ -111,22 +113,19 @@ static const cmd_handler_t cmd_handler [cmd_last] = {
 29 static int
 30 ipc_handler(int fd, uint32_t mask, void *data) {
 31 	if (mask & WL_EVENT_HANGUP) {
 32-		/* conn. closed */
 33 		_wrn("IPC socket connection closed prematurely: %s", strerror(errno));
 34 		return 0;
 35 	}
 36 
 37-	if (mask & WL_EVENT_ERROR) {
 38-		/* conn. error */
 39 		_wrn("IPC socket connection error: %s", strerror(errno));
 40 		return 0;
 41 	}
 42 
 43 	if (mask & WL_EVENT_READABLE) {
 44-		if (fd != sfd)
 45+		if (fd != ipc_fd)
 46 			return 0;
 47 
 48-		int afd = accept(sfd, NULL, NULL);
 49+		int afd = accept(ipc_fd, NULL, NULL);
 50 		if (afd == -1) {
 51 			_wrn("couldn't accept incoming connection on IPC socket: %s", strerror(errno));
 52 			goto end;
 53@@ -136,13 +135,11 @@ ipc_handler(int fd, uint32_t mask, void *data) {
 54 		ssize_t n;
 55 
 56 		if ((n = read(afd, buf, sizeof(buf) - 1)) < 0) {
 57-			/* read error */
 58 			_wrn("couldn't read from IPC socket: %s", strerror(errno));
 59 			goto end;
 60 		}
 61 
 62 		if (n == 0) {
 63-			/* EOF */
 64 			_wrn("unexpected EOF on IPC socket: %s", strerror(errno));
 65 			goto end;
 66 		}
 67@@ -194,24 +191,22 @@ end:
 68 
 69 static void
 70 setup_ipc(void) {
 71-	struct sockaddr_un addr;
 72-
 73-	sfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
 74-	if (sfd == -1)
 75+	ipc_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
 76+	if (ipc_fd == -1)
 77 		_err(1, "couldn't open IPC socket: %s", strerror(errno));
 78 
 79-	memset(&addr, 0, sizeof(addr));
 80+	struct sockaddr_un addr = {0};
 81 	addr.sun_family = AF_UNIX;
 82 	strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1);
 83 
 84 	unlink(SOCK_PATH);
 85-	if (bind(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
 86+	if (bind(ipc_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
 87 		_err(1, "couldn't bind IPC socket: %s", strerror(errno));
 88 
 89-	if (listen(sfd, 5) == -1)
 90+	if (listen(ipc_fd, 5) < 0)
 91 		_err(1, "couldn't listen on IPC socket: %s", strerror(errno));
 92 
 93-	wl_event_loop_add_fd(wm.loop, sfd, WL_EVENT_READABLE | WL_EVENT_HANGUP | WL_EVENT_ERROR, ipc_handler, NULL);
 94+	wl_event_loop_add_fd(wm.loop, ipc_fd, WL_EVENT_READABLE | WL_EVENT_HANGUP | WL_EVENT_ERROR, ipc_handler, NULL);
 95 
 96 	_inf("set up IPC socket");
 97 }
 98@@ -308,7 +303,7 @@ cleanup(void) {
 99 
100 	free(decor);
101 
102-	close(sfd);
103+	close(ipc_fd);
104 	unlink(SOCK_PATH);
105 }
106 
107@@ -488,20 +483,13 @@ sync_windows(void) {
108 		if (c->ws == wm.ws) {
109 			c->visible = true;
110 			swc_window_show(c->win);
111-		}
112-		else {
113+		} else {
114 			c->visible = false;
115 			swc_window_hide(c->win);
116 		}
117 	}
118 }
119 
120-
121-/*
122- * TODO: These 4 functions should probably be grouped together & moved.
123- * Maybe this is a good enough reason for a rehaul?
124- */
125- 
126 void
127 ws_go_to(uint8_t ws) {
128 	struct client *c;
129@@ -531,8 +519,7 @@ ws_move_to(uint8_t ws, struct client *c) {
130 	if (c->ws == wm.ws) {
131 		c->visible = true;
132 		swc_window_show(c->win);
133-	}
134-	else {
135+	} else {
136 		c->visible = false;
137 		swc_window_hide(c->win);
138 	}
+26, -26
 1@@ -305,7 +305,7 @@ ipc_workspace(char **arg) {
 2 }
 3 
 4 status
 5-ipc_send_workspace(char **arg) {
 6+ipc_move_workspace(char **arg) {
 7 	if (arg[1] == NULL)
 8 		return (status){ false, "" };
 9 
10@@ -396,6 +396,31 @@ ipc_get_workspace(char **arg) {
11 	return s;
12 }
13 
14+status
15+ipc_get_screen_geometry(char **arg) {
16+	status s = {0};
17+
18+	if (!wm.scr)
19+		return (status){ false, "" };
20+
21+	snprintf(s.msg, sizeof(s.msg), "%" PRIu32 " %" PRIu32 "\n", wm.scr->width, wm.scr->height);
22+
23+	s.ok = true;
24+	return s;
25+}
26+
27+status
28+ipc_get_cursor_position(char **arg) {
29+	status s = {0};
30+
31+	int32_t cx = 0, cy = 0;
32+	if (swc_cursor_position(&cx, &cy))
33+		snprintf(s.msg, sizeof(s.msg), "%d %d\n", cx / 256, cy / 256);
34+
35+	s.ok = true;
36+	return s;
37+}
38+
39 status
40 ipc_list_windows(char **arg) {
41 	status s = {0};
42@@ -453,31 +478,6 @@ ipc_list_windows(char **arg) {
43 	return s;
44 }
45 
46-status
47-ipc_get_screen_geometry(char **arg) {
48-	status s = {0};
49-
50-	if (!wm.scr)
51-		return (status){ false, "" };
52-
53-	snprintf(s.msg, sizeof(s.msg), "%" PRIu32 " %" PRIu32 "\n", wm.scr->width, wm.scr->height);
54-
55-	s.ok = true;
56-	return s;
57-}
58-
59-status
60-ipc_get_cursor_position(char **arg) {
61-	status s = {0};
62-
63-	int32_t cx = 0, cy = 0;
64-	if (swc_cursor_position(&cx, &cy))
65-		snprintf(s.msg, sizeof(s.msg), "%d %d\n", cx / 256, cy / 256);
66-
67-	s.ok = true;
68-	return s;
69-}
70-
71 /*********/
72 
73 status
+0, -2
1@@ -8,8 +8,6 @@
2 #include "howl.h"
3 #include "types.h"
4 
5-extern void cleanup(void);
6-
7 extern struct wm wm;
8 
9 void