Exemple #1
0
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;
}
Exemple #2
0
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;
}