#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include "auth.h" #include "http.h" #include "timeline.h" #include "log.h" static GtkWidget *window, *spinner, *list_box; static gboolean timeline_loaded(gpointer data) { struct timeline *t = data; GtkWidget *label; for (size_t i = 0; i < t->size; i++) { label = gtk_label_new(t->statuses[i]->content); gtk_widget_show(GTK_WIDGET(label)); gtk_list_box_prepend(GTK_LIST_BOX(list_box), GTK_WIDGET(label)); } gtk_spinner_stop(GTK_SPINNER(spinner)); timeline_free(t); return G_SOURCE_REMOVE; } static gpointer load_timeline(gpointer data) { struct timeline *t; t = get_timeline(NULL, NULL, NULL, 20); if (!t) { log_msg(LOG_WARNING, "load_timeline", "failed"); return NULL; } gdk_threads_add_idle(timeline_loaded, t); return NULL; } void create_timeline_window(GtkApplication *app, gpointer user_data) { window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_application(GTK_WINDOW(window), GTK_APPLICATION(app)); gtk_window_set_title(GTK_WINDOW(window), "ap_client"); gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); gtk_container_set_border_width(GTK_CONTAINER(window), 10); gtk_window_set_destroy_with_parent(GTK_WINDOW(window), true); list_box = gtk_list_box_new(); gtk_widget_set_valign(GTK_WIDGET(list_box), GTK_ALIGN_CENTER); gtk_widget_set_halign(GTK_WIDGET(list_box), GTK_ALIGN_CENTER); spinner = gtk_spinner_new(); gtk_spinner_start(GTK_SPINNER(spinner)); gtk_container_add(GTK_CONTAINER(list_box), spinner); gtk_container_add(GTK_CONTAINER(window), list_box); gtk_widget_show_all(window); g_thread_new("load_timeline_thread", &load_timeline, NULL); }