static void _j4status_i3focus_window_callback(GObject *object, i3ipcWindowEvent *event, gpointer user_data) { J4statusSection *section = user_data; gboolean focused; g_object_get(event->container, "focused", &focused, NULL); if ( focused ) j4status_section_set_value(section, g_strdup(i3ipc_con_get_name(event->container))); }
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; }