aboutsummaryrefslogtreecommitdiff
path: root/src/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dwm.c')
-rw-r--r--src/dwm.c216
1 files changed, 129 insertions, 87 deletions
diff --git a/src/dwm.c b/src/dwm.c
index 7bfa453..66756a7 100644
--- a/src/dwm.c
+++ b/src/dwm.c
@@ -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)