aboutsummaryrefslogtreecommitdiff
path: root/src/dwm.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-02-08 11:49:08 +0100
committerFederico Angelilli <code@fedang.net>2024-02-08 11:49:08 +0100
commit09505cb480274bdc154c1b4ae3dd6988e56b4368 (patch)
tree537e3ac6a13057cbc2518b5fc9abf5c65e04a3ab /src/dwm.c
parentef94d81050bb4d3b90b69441cbff97440e1f3664 (diff)
Update dwm ipc and fix spacing
Diffstat (limited to 'src/dwm.c')
-rw-r--r--src/dwm.c379
1 files changed, 193 insertions, 186 deletions
diff --git a/src/dwm.c b/src/dwm.c
index 513f08a..1ac0271 100644
--- a/src/dwm.c
+++ b/src/dwm.c
@@ -19,18 +19,21 @@ typedef struct {
struct DwmIpc {
GSource source;
- GSocket *socket;
- State *state;
+ GSocket *socket;
+ State *state;
+ Color color;
+ Color selected;
+ Button *tags[9];
};
typedef enum {
- IPC_TYPE_RUN_COMMAND = 0,
- IPC_TYPE_GET_MONITORS = 1,
- IPC_TYPE_GET_TAGS = 2,
- IPC_TYPE_GET_LAYOUTS = 3,
- IPC_TYPE_GET_DWM_CLIENT = 4,
- IPC_TYPE_SUBSCRIBE = 5,
- IPC_TYPE_EVENT = 6
+ IPC_TYPE_RUN_COMMAND = 0,
+ IPC_TYPE_GET_MONITORS = 1,
+ IPC_TYPE_GET_TAGS = 2,
+ IPC_TYPE_GET_LAYOUTS = 3,
+ IPC_TYPE_GET_DWM_CLIENT = 4,
+ IPC_TYPE_SUBSCRIBE = 5,
+ IPC_TYPE_EVENT = 6
} DwmIpcMessage;
#define IPC_EVENT_TAG_CHANGE "tag_change_event"
@@ -42,201 +45,194 @@ typedef enum {
static void ipc_send(DwmIpc *dwm, DwmIpcMessage msg_type, uint8_t *msg, uint32_t msg_size)
{
- DwmIpcHeader header;
- memcpy(header.magic, IPC_MAGIC, IPC_MAGIC_LEN);
- header.size = msg_size;
- header.type = msg_type;
-
- GError *error = NULL;
-
- gssize size = 0;
- while (size < sizeof(DwmIpcHeader)) {
- gssize sent = g_socket_send(dwm->socket, (void *)&header + size, sizeof(DwmIpcHeader) - size, NULL, &error);
- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
- g_error_free(error);
- continue;
- }
- g_assert(sent != -1);
- size += sent;
- }
-
- size = 0;
- while (size < msg_size) {
- gssize sent = g_socket_send(dwm->socket, msg + size, msg_size - size, NULL, &error);
- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
- g_error_free(error);
- continue;
- }
- g_assert(sent != -1);
- size += sent;
- }
-
- log_debug("Sent ipc message [type=%d, size=%d]", msg_type, msg_size);
+ DwmIpcHeader header;
+ memcpy(header.magic, IPC_MAGIC, IPC_MAGIC_LEN);
+ header.size = msg_size;
+ header.type = msg_type;
+
+ GError *error = NULL;
+
+ gssize size = 0;
+ while (size < sizeof(DwmIpcHeader)) {
+ gssize sent = g_socket_send(dwm->socket, (void *)&header + size, sizeof(DwmIpcHeader) - size, NULL, &error);
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
+ g_error_free(error);
+ continue;
+ }
+ g_assert(sent != -1);
+ size += sent;
+ }
+
+ size = 0;
+ while (size < msg_size) {
+ gssize sent = g_socket_send(dwm->socket, msg + size, msg_size - size, NULL, &error);
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
+ g_error_free(error);
+ continue;
+ }
+ g_assert(sent != -1);
+ size += sent;
+ }
+
+ log_debug("Sent ipc message [type=%d, size=%d]", msg_type, msg_size);
}
static void ipc_subscribe(DwmIpc *dwm, const char *event)
{
- // {
- // "event": "<event>",
- // "action": "subscribe"
- // }
+ // {
+ // "event": "<event>",
+ // "action": "subscribe"
+ // }
- JsonBuilder *builder = json_builder_new();
+ JsonBuilder *builder = json_builder_new();
- json_builder_begin_object(builder);
+ json_builder_begin_object(builder);
- json_builder_set_member_name(builder, "event");
- json_builder_add_string_value(builder, event);
+ json_builder_set_member_name(builder, "event");
+ json_builder_add_string_value(builder, event);
- json_builder_set_member_name(builder, "action");
- json_builder_add_string_value(builder, "subscribe");
+ json_builder_set_member_name(builder, "action");
+ json_builder_add_string_value(builder, "subscribe");
- json_builder_end_object(builder);
+ json_builder_end_object(builder);
- JsonNode *root = json_builder_get_root(builder);
+ JsonNode *root = json_builder_get_root(builder);
- JsonGenerator *gen = json_generator_new();
- json_generator_set_root(gen, root);
+ JsonGenerator *gen = json_generator_new();
+ json_generator_set_root(gen, root);
- gsize msg_len = 0;
- gchar *msg = json_generator_to_data(gen, &msg_len);
+ gsize msg_len = 0;
+ gchar *msg = json_generator_to_data(gen, &msg_len);
- log_info("Subscribing to dwm ipc: %s", msg);
- ipc_send(dwm, IPC_TYPE_SUBSCRIBE, msg, msg_len);
+ log_info("Subscribing to dwm ipc: %s", msg);
+ ipc_send(dwm, IPC_TYPE_SUBSCRIBE, msg, msg_len);
- json_node_free(root);
- g_object_unref(gen);
- g_object_unref(builder);
- g_free(msg);
+ json_node_free(root);
+ g_object_unref(gen);
+ g_object_unref(builder);
+ g_free(msg);
}
static void ipc_handle(DwmIpc *dwm, DwmIpcMessage type, char *reply, uint32_t reply_size)
{
- GError *error = NULL;
- JsonParser *parser = json_parser_new();
- if (!json_parser_load_from_data(parser, reply, reply_size - 1, &error)) {
- log_warning("Failed to parse dwm ipc reply: %s", error->message);
- g_error_free(error);
- return;
- }
-
- JsonReader *reader = json_reader_new(json_parser_get_root(parser));
-
- if (type == IPC_TYPE_EVENT) {
- if (json_reader_read_member(reader, IPC_EVENT_TAG_CHANGE)) {
- log_debug("Reading dwm ipc event [event=%s]", IPC_EVENT_TAG_CHANGE);
-
- json_reader_read_member(reader, "new_state");
- json_reader_read_member(reader, "selected");
- long selected = json_reader_get_int_value(reader);
- json_reader_end_member (reader);
- json_reader_end_member (reader);
- json_reader_end_member (reader);
-
- log_debug("Dwm tag mask: %ld", selected);
-
- for (int i = 0; i < 9; i++) {
- Button *btn = g_list_nth_data(dwm->state->btns, i);
- g_assert_nonnull(btn);
-
- Color color = { 0.4, 0.4, 0.4, 1 };
- Color sel_color = { 0.3, 0.5, 0.2, 1 };
-
- if (selected & (1 << i))
- btn->color = sel_color;
- else
- btn->color = color;
- }
-
- state_redraw(dwm->state, false);
- } else if (json_reader_read_member(reader, IPC_EVENT_CLIENT_FOCUS_CHANGE)) {
- log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_CLIENT_FOCUS_CHANGE);
- // TODO
-
- } else if (json_reader_read_member(reader, IPC_EVENT_LAYOUT_CHANGE)) {
- log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_LAYOUT_CHANGE);
- // TODO
-
- } else if (json_reader_read_member(reader, IPC_EVENT_MONITOR_FOCUS_CHANGE)) {
- log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_MONITOR_FOCUS_CHANGE);
- // TODO
-
- } else if (json_reader_read_member(reader, IPC_EVENT_FOCUSED_TITLE_CHANGE)) {
- log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_TITLE_CHANGE);
- // TODO
-
- } else if (json_reader_read_member(reader, IPC_EVENT_FOCUSED_STATE_CHANGE)) {
- log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_STATE_CHANGE);
- // TODO
-
- } else {
- log_warning("Unrecognized dwm ipc event");
- }
- } else {
- log_debug("Ignoring dwm ipc message [type=%d]", type);
- }
-
- g_object_unref (reader);
- g_object_unref (parser);
+ GError *error = NULL;
+ JsonParser *parser = json_parser_new();
+ if (!json_parser_load_from_data(parser, reply, reply_size - 1, &error)) {
+ log_warning("Failed to parse dwm ipc reply: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ JsonReader *reader = json_reader_new(json_parser_get_root(parser));
+
+ if (type == IPC_TYPE_EVENT) {
+ if (json_reader_read_member(reader, IPC_EVENT_TAG_CHANGE)) {
+ log_debug("Reading dwm ipc event [event=%s]", IPC_EVENT_TAG_CHANGE);
+
+ json_reader_read_member(reader, "new_state");
+ json_reader_read_member(reader, "selected");
+ long selected = json_reader_get_int_value(reader);
+ json_reader_end_member (reader);
+ json_reader_end_member (reader);
+ json_reader_end_member (reader);
+
+ log_debug("Dwm tag mask: %ld", selected);
+
+ // FIXME: Why is it so slow??
+ if (dwm->tags[0] != NULL) {
+ for (int i = 0; i < 9; i++)
+ dwm->tags[i]->color = selected & (1 << i) ? dwm->selected : dwm->color;
+
+ state_redraw(dwm->state, false);
+ }
+ } else if (json_reader_read_member(reader, IPC_EVENT_CLIENT_FOCUS_CHANGE)) {
+ log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_CLIENT_FOCUS_CHANGE);
+ // TODO
+
+ } else if (json_reader_read_member(reader, IPC_EVENT_LAYOUT_CHANGE)) {
+ log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_LAYOUT_CHANGE);
+ // TODO
+
+ } else if (json_reader_read_member(reader, IPC_EVENT_MONITOR_FOCUS_CHANGE)) {
+ log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_MONITOR_FOCUS_CHANGE);
+ // TODO
+
+ } else if (json_reader_read_member(reader, IPC_EVENT_FOCUSED_TITLE_CHANGE)) {
+ log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_TITLE_CHANGE);
+ // TODO
+
+ } else if (json_reader_read_member(reader, IPC_EVENT_FOCUSED_STATE_CHANGE)) {
+ log_info("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_STATE_CHANGE);
+ // TODO
+
+ } else {
+ log_warning("Unrecognized dwm ipc event");
+ }
+ } else {
+ log_debug("Ignoring dwm ipc message [type=%d]", type);
+ }
+
+ g_object_unref (reader);
+ g_object_unref (parser);
}
static gboolean source_check(GSource *source)
{
DwmIpc *dwm = (DwmIpc *)source;
GIOCondition flags = g_socket_condition_check(dwm->socket, G_IO_IN);
- return flags & G_IO_IN;
+ return flags & G_IO_IN;
}
static gboolean source_dispatch(GSource *source, GSourceFunc callback, gpointer data)
{
DwmIpc *dwm = (DwmIpc *)source;
- DwmIpcHeader header;
- GError *error = NULL;
-
- gssize size = 0;
- while (size < sizeof(DwmIpcHeader)) {
- gssize read = g_socket_receive(dwm->socket, (void *)&header + size, sizeof(DwmIpcHeader) - size, NULL, &error);
- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
- g_error_free(error);
- continue;
- }
- g_assert(read != -1);
- size += read;
- }
-
- if (memcmp(&header, IPC_MAGIC, IPC_MAGIC_LEN) != 0) {
- log_warning("Erroneous ipc message");
- return G_SOURCE_CONTINUE;;
- }
-
- uint32_t reply_size;
- memcpy(&reply_size, (void *)&header + IPC_MAGIC_LEN, sizeof(uint32_t));
-
- uint8_t msg_type;
- memcpy(&msg_type, (void *)&header + IPC_MAGIC_LEN + sizeof(uint32_t), sizeof(uint8_t));
-
- char *reply = g_malloc(reply_size);
-
- size = 0;
- while (size < reply_size) {
- gssize read = g_socket_receive(dwm->socket, reply + size, reply_size - size, NULL, NULL);
- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
- g_error_free(error);
- continue;
- }
- g_assert(read != -1);
- size += read;
- }
-
- //log_debug("Received dwm ipc response: %s", reply);
- ipc_handle(dwm, msg_type, reply, reply_size);
+ DwmIpcHeader header;
+ GError *error = NULL;
+
+ gssize size = 0;
+ while (size < sizeof(DwmIpcHeader)) {
+ gssize read = g_socket_receive(dwm->socket, (void *)&header + size, sizeof(DwmIpcHeader) - size, NULL, &error);
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
+ g_error_free(error);
+ continue;
+ }
+ g_assert(read != -1);
+ size += read;
+ }
+
+ if (memcmp(&header, IPC_MAGIC, IPC_MAGIC_LEN) != 0) {
+ log_warning("Erroneous ipc message");
+ return G_SOURCE_CONTINUE;;
+ }
+
+ uint32_t reply_size;
+ memcpy(&reply_size, (void *)&header + IPC_MAGIC_LEN, sizeof(uint32_t));
+
+ uint8_t msg_type;
+ memcpy(&msg_type, (void *)&header + IPC_MAGIC_LEN + sizeof(uint32_t), sizeof(uint8_t));
+
+ char *reply = g_malloc(reply_size);
+
+ size = 0;
+ while (size < reply_size) {
+ gssize read = g_socket_receive(dwm->socket, reply + size, reply_size - size, NULL, NULL);
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
+ g_error_free(error);
+ continue;
+ }
+ g_assert(read != -1);
+ size += read;
+ }
+
+ //log_debug("Received dwm ipc response: %s", reply);
+ ipc_handle(dwm, msg_type, reply, reply_size);
return G_SOURCE_CONTINUE;
}
static void source_finalize(GSource *source)
{
- g_object_unref(((DwmIpc *)source)->socket);
+ g_object_unref(((DwmIpc *)source)->socket);
}
static GSourceFuncs source_fns = {
@@ -251,31 +247,40 @@ DwmIpc *dwm_create(State *state, const char *socket)
DwmIpc *dwm = (DwmIpc *)g_source_new(&source_fns, sizeof(DwmIpc));
g_source_set_static_name((GSource *)dwm, "DwmIpc");
- GError *error = NULL;
- dwm->socket = g_socket_new(G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, 0, &error);
- g_assert_nonnull(dwm->socket);
+ GError *error = NULL;
+ dwm->socket = g_socket_new(G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, 0, &error);
+ g_assert_nonnull(dwm->socket);
- GSocketAddress *addr = g_unix_socket_address_new(socket);
+ GSocketAddress *addr = g_unix_socket_address_new(socket);
+ if (!g_socket_connect(dwm->socket, addr, NULL, &error)) {
+ g_assert_nonnull(error);
+ log_error("Failed to connect to %s: %s", socket, error->message);
+ }
- if (!g_socket_connect(dwm->socket, addr, NULL, &error)) {
- g_assert_nonnull(error);
- log_error("Failed to connect to %s: %s", socket, error->message);
- }
+ dwm->state = state;
+ dwm->tags[0] = NULL;
+
+ const char *events[] = {
+ IPC_EVENT_TAG_CHANGE,
+ IPC_EVENT_FOCUSED_STATE_CHANGE,
+ };
+ for (int i = 0; i < G_N_ELEMENTS(events); ++i)
+ ipc_subscribe(dwm, events[i]);
g_source_attach((GSource *)dwm, NULL);
+ log_debug("Attached dwm ipc source");
- dwm->state = state;
+ return dwm;
+}
- const char *events[] = {
- IPC_EVENT_TAG_CHANGE,
- IPC_EVENT_FOCUSED_STATE_CHANGE,
- };
- for (int i = 0; i < G_N_ELEMENTS(events); ++i)
- ipc_subscribe(dwm, events[i]);
+static void change_tag_action(Button *btn)
+{
+ ButtonSimple *sbtn = CAST(btn, ButtonSimple);
- log_debug("Attached dwm ipc source");
+ g_assert(sbtn->text[0] >= 1 && sbtn->text[0] <= 9);
+ int n = sbtn->text[0] - '0';
- return dwm;
+ log_debug("Toggled tag %d",n );
}
void dwm_destroy(DwmIpc *dwm)
@@ -283,3 +288,5 @@ void dwm_destroy(DwmIpc *dwm)
g_source_destroy((GSource *)dwm);
g_source_unref((GSource *)dwm);
}
+
+// vim: ts=4 sw=4 et