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