diff options
| author | Federico Angelilli <code@fedang.net> | 2024-03-08 00:40:38 +0100 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-03-08 00:45:38 +0100 |
| commit | 4df262ade044448f83092ab157a15b4a3f170eec (patch) | |
| tree | 2f01ce7978e115fed595d0a908e0827b934eddac /src/dwm.c | |
| parent | 04275df210744923651c6119e64301a8e2d45e77 (diff) | |
Refactor dwm ipc send and add get_tags
Diffstat (limited to 'src/dwm.c')
| -rw-r--r-- | src/dwm.c | 216 |
1 files changed, 129 insertions, 87 deletions
@@ -17,19 +17,6 @@ typedef struct { uint8_t type; } __attribute__((packed)) DwmIpcHeader; -struct DwmIpc { - GSocket *socket; - GSource *source; - State *state; - Color color; - Color text_color; - Color selected; - Button *tags[9]; - Button *title; - bool change_title; - bool hidden_title; -}; - typedef enum { IPC_TYPE_RUN_COMMAND = 0, IPC_TYPE_GET_MONITORS = 1, @@ -149,7 +136,7 @@ static void ipc_run_command(DwmIpc *dwm, const char *cmd, JsonNode **args) gsize msg_len = 0; gchar *msg = json_generator_to_data(gen, &msg_len); - log_debug("Sending command to dwm ipc: %s", msg); + log_debug("Sending run_command to dwm ipc: %s", msg); ipc_send(dwm, IPC_TYPE_RUN_COMMAND, msg, msg_len); json_node_free(root); @@ -158,6 +145,12 @@ static void ipc_run_command(DwmIpc *dwm, const char *cmd, JsonNode **args) g_free(msg); } +static void ipc_get_tags(DwmIpc *dwm) +{ + log_debug("Sending get_tags to dwm ipc"); + ipc_send(dwm, IPC_TYPE_GET_TAGS, "", 1); +} + #define JSON_FIELD(reader, member) (json_reader_end_member(reader), json_reader_read_member(reader, member)) static void ipc_handle(DwmIpc *dwm, DwmIpcMessage type, char *reply, uint32_t reply_size) @@ -172,86 +165,128 @@ static void ipc_handle(DwmIpc *dwm, DwmIpcMessage type, char *reply, uint32_t re 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("Handling dwm ipc event [event=%s]", IPC_EVENT_TAG_CHANGE); + switch (type) { + case IPC_TYPE_EVENT: + { + if (json_reader_read_member(reader, IPC_EVENT_TAG_CHANGE)) { + log_debug("Handling 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("Selected tag mask: %ld", selected); + + 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_FIELD(reader, IPC_EVENT_CLIENT_FOCUS_CHANGE)) { + log_debug("Handling dwm ipc event [event=%s]", IPC_EVENT_CLIENT_FOCUS_CHANGE); + + json_reader_read_member(reader, "new_win_id"); + long win_id = json_reader_get_int_value(reader); + json_reader_end_member(reader); + json_reader_end_member(reader); + + char *msg = g_strdup_printf("{ \"client_window_id\": %ld }\n", win_id); + dwm->change_title = true; + ipc_send(dwm, IPC_TYPE_GET_DWM_CLIENT, msg, strlen(msg)); + g_free(msg); + } else if (JSON_FIELD(reader, IPC_EVENT_LAYOUT_CHANGE)) { + log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_LAYOUT_CHANGE); + // TODO + + } else if (JSON_FIELD(reader, IPC_EVENT_MONITOR_FOCUS_CHANGE)) { + log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_MONITOR_FOCUS_CHANGE); + // TODO + + } else if (JSON_FIELD(reader, IPC_EVENT_FOCUSED_TITLE_CHANGE)) { + log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_TITLE_CHANGE); + // TODO + + } else if (JSON_FIELD(reader, IPC_EVENT_FOCUSED_STATE_CHANGE)) { + log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_STATE_CHANGE); + // TODO + + } else { + const char *event = "?"; + if (json_reader_read_element(reader, 0)) + event = json_reader_get_string_value(reader); + + log_warning("Unrecognized dwm ipc event: %s", event); + } + break; + } - 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); + case IPC_TYPE_GET_DWM_CLIENT: + { + log_debug("Received dwm client information message [type=%d]", type); + + if (dwm->change_title) { + json_reader_read_member(reader, "name"); + const char *title = json_reader_get_string_value(reader); + + log_debug("Changing current program title: %s", title ? title : "?"); + if (title == NULL || *title == '\0') { + state_remove_button(dwm->state, dwm->title); + dwm->hidden_title = true; + } else { + button_simple_set_text(dwm->title, g_strdup(title), dwm->text_color); + if (dwm->hidden_title) { + state_add_button(dwm->state, dwm->title); + state_order_button(dwm->state); + dwm->hidden_title = false; + } + } + + dwm->change_title = false; + state_redraw(dwm->state, true); + json_reader_end_member(reader); + } + break; + } - log_debug("Selected tag mask: %ld", selected); + case IPC_TYPE_GET_TAGS: + { + log_debug("Received dwm tag information message [type=%d]", type); - if (dwm->tags[0] != NULL) { - for (int i = 0; i < 9; i++) - dwm->tags[i]->color = selected & (1 << i) ? dwm->selected : dwm->color; + guint index = 0; + while (json_reader_read_element(reader, index)) { - state_redraw(dwm->state, false); - } - } else if (JSON_FIELD(reader, IPC_EVENT_CLIENT_FOCUS_CHANGE)) { - log_debug("Handling dwm ipc event [event=%s]", IPC_EVENT_CLIENT_FOCUS_CHANGE); - - json_reader_read_member(reader, "new_win_id"); - long win_id = json_reader_get_int_value(reader); - json_reader_end_member(reader); - json_reader_end_member(reader); - - char *msg = g_strdup_printf("{ \"client_window_id\": %ld }\n", win_id); - dwm->change_title = true; - ipc_send(dwm, IPC_TYPE_GET_DWM_CLIENT, msg, strlen(msg)); - g_free(msg); - } else if (JSON_FIELD(reader, IPC_EVENT_LAYOUT_CHANGE)) { - log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_LAYOUT_CHANGE); - // TODO - - } else if (JSON_FIELD(reader, IPC_EVENT_MONITOR_FOCUS_CHANGE)) { - log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_MONITOR_FOCUS_CHANGE); - // TODO - - } else if (JSON_FIELD(reader, IPC_EVENT_FOCUSED_TITLE_CHANGE)) { - log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_TITLE_CHANGE); - // TODO - - } else if (JSON_FIELD(reader, IPC_EVENT_FOCUSED_STATE_CHANGE)) { - log_debug("Ignoring dwm ipc event [event=%s]", IPC_EVENT_FOCUSED_STATE_CHANGE); - // TODO - - } else { - const char *event = "?"; - if (json_reader_read_element(reader, 0)) - event = json_reader_get_string_value(reader); - - log_warning("Unrecognized dwm ipc event: %s", event); - } - } else if (type == IPC_TYPE_GET_DWM_CLIENT) { - log_debug("Received dwm client information message [type=%d]", type); - - if (dwm->change_title) { - json_reader_read_member(reader, "name"); - const char *title = json_reader_get_string_value(reader); - - log_debug("Changing current program title: %s", title ? title : "?"); - if (title == NULL || strlen(title) == 0) { - state_remove_button(dwm->state, dwm->title); - dwm->hidden_title = true; - } else { - button_simple_set_text(dwm->title, g_strdup(title), dwm->text_color); - if (dwm->hidden_title) { - state_add_button(dwm->state, dwm->title); - dwm->hidden_title = false; + json_reader_read_member(reader, "bit_mask"); + int mask = json_reader_get_int_value(reader); + json_reader_end_element(reader); + + // XXX: Handle nicely + g_assert_cmpint(mask, ==, 1 << index); + + // Set the tag names accordingly + json_reader_read_member(reader, "name"); + const char *name = json_reader_get_string_value(reader); + json_reader_end_element(reader); + + g_assert(index < 9); + button_simple_set_text(dwm->tags[index], g_strdup(name), dwm->text_color); + + json_reader_end_element(reader); + index++; } + + break; } - dwm->change_title = false; - state_redraw(dwm->state, true); - json_reader_end_member(reader); - } - } else { - log_debug("Ignoring dwm ipc message [type=%d]", type); - //log_debug("%s", reply); + default: + { + log_debug("Ignoring dwm ipc message [type=%d]", type); + //log_debug("%s", reply); + break; + } } g_object_unref(reader); @@ -380,8 +415,15 @@ void dwm_register_tags(DwmIpc *dwm, Color color, Color selected, Color text_colo state_add_button(dwm->state, dwm->tags[i]); } + // This will set the tag names + ipc_get_tags(dwm); + dwm->title = button_simple_create(PANGO_ALIGN_CENTER, color, line_color); dwm->hidden_title = true; + + // FIXME: Set the first tag + CAST(dwm->tags[0], ButtonSimple)->action(dwm->tags[0]); + dwm->tags[0]->color = dwm->selected; } void dwm_destroy(DwmIpc *dwm) |
