json_t* format_workspaces (i3ipcConnection *conn) { json_t *json_data_object = json_object(); json_t *json_desktops_array = json_array(); json_object_set_new(json_data_object, "desktops", json_desktops_array); GSList *workspaces = i3ipc_connection_get_workspaces(conn, NULL); workspaces = g_slist_sort(workspaces, (GCompareFunc)workspace_comparator); for (unsigned char i = 0; i < g_slist_length(workspaces); i++) { GSList *workspace = g_slist_nth(workspaces, i); i3ipcWorkspaceReply *data = workspace->data; json_t *json_desktop = json_object(); json_object_set_new(json_desktop, "name", json_string(data->name)); json_object_set_new(json_desktop, "clients_len", json_integer(i)); json_object_set_new(json_desktop, "is_urgent", json_boolean(data->urgent)); json_array_append_new(json_desktops_array, json_desktop); if (data->focused) { json_object_set_new(json_data_object, "current_desktop", json_integer(i)); } } return json_data_object; }
static Window *visible_windows_on_all_outputs(i3ipcCon *root, SortMethod sort_method) { GSList *raw_replies = i3ipc_connection_get_workspaces(connection, NULL); GSList *replies = g_slist_reverse(raw_replies); // i3ipc-glib reverses the order internally if (sort_method == BY_NUMBER) { replies = g_slist_sort(replies, compare_workspace_nums); } else if (sort_method == BY_LOCATION) { GSList *outputs = i3ipc_connection_get_outputs(connection, NULL); replies = g_slist_sort_with_data(replies, compare_workspace_position, outputs); g_slist_free_full(outputs, (GDestroyNotify) i3ipc_output_reply_free); } GList *workspaces = i3ipc_con_workspaces(root); Window *res = NULL; const GSList *reply; i3ipcWorkspaceReply *curr_reply; for (reply = replies; reply; reply = reply->next) { curr_reply = reply->data; if (!curr_reply->visible) continue; const GList *ws; i3ipcCon *curr_ws; for (ws = workspaces; ws; ws = ws->next) { curr_ws = ws->data; const char *name = i3ipc_con_get_name(curr_ws); if (strcmp(curr_reply->name, name) == 0) { i3ipcCon *con = con_get_visible_container(curr_ws); res = window_append(res, visible_windows(con)); break; } } } g_slist_free_full(replies, (GDestroyNotify) i3ipc_workspace_reply_free); g_list_free(workspaces); return res; }