#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include #include "log.h" #include "config.h" #include "login_window.h" static GtkWidget *window, *scrolled, *list_box; static GSClient *gs_client = NULL; static gchar *html_to_pango(const char *content) { gchar *result1, *result2; GRegex *regex_tag, *regex_attr; GError *error = NULL; if (!content) { return NULL; } regex_tag = g_regex_new( "(

|

|

|
|
)", G_REGEX_CASELESS, 0, &error); if (!regex_tag) { log_msg(LOG_WARNING, "html_to_pango", error->message); g_free(error); return NULL; } result1 = g_regex_replace(regex_tag, content, -1, 0, "", 0, &error); if (!result1) { log_msg(LOG_WARNING, "html_to_pango", error->message); g_free(error); return NULL; } regex_attr = g_regex_new("(class|target|rel|data-user|data-tag)=\"(.|\n)*?\"", G_REGEX_CASELESS, 0, &error); if (!regex_attr) { log_msg(LOG_WARNING, "html_to_pango", error->message); g_free(error); return NULL; } result2 = g_regex_replace(regex_attr, result1, -1, 0, "", 0, &error); free(result1); if (!result1) { log_msg(LOG_WARNING, "html_to_pango", error->message); g_free(error); return NULL; } return result2; } static gboolean timeline_loaded(gpointer data) { struct gs_timeline *t = data; for (size_t i = 0; i < t->size; i++) { GtkBuilder *post_builder; GObject *post_box, *post_content_label; GObject *display_name, *username; GObject *replies_count, *reblogs_count, *favourites_count; GObject *avatar; GdkPixbuf *avatar_pixbuf; char *content_markup; content_markup = html_to_pango(t->statuses[i]->content); if (!content_markup) { continue; } post_builder = gtk_builder_new_from_file("data/post.ui"); post_box = gtk_builder_get_object(post_builder, "post_box"); post_content_label = gtk_builder_get_object(post_builder, "content_text"); gtk_label_set_markup(GTK_LABEL(post_content_label), content_markup); avatar = gtk_builder_get_object(post_builder, "avatar"); avatar_pixbuf = gdk_pixbuf_new_from_file_at_size("data/avi.png", 40, 40, NULL); gtk_image_set_from_pixbuf(GTK_IMAGE(avatar), avatar_pixbuf); display_name = gtk_builder_get_object(post_builder, "display_name"); gtk_label_set_text( GTK_LABEL(display_name), t->statuses[i]->account->display_name); username = gtk_builder_get_object(post_builder, "username"); gtk_label_set_text( GTK_LABEL(username), t->statuses[i]->account->username); replies_count = gtk_builder_get_object(post_builder, "replies_count"); gchar *repc = g_strdup_printf("%d", t->statuses[i]->replies_count); gtk_label_set_text(GTK_LABEL(replies_count), repc); g_free(repc); reblogs_count = gtk_builder_get_object(post_builder, "reblogs_count"); gchar *rebc = g_strdup_printf("%d", t->statuses[i]->reblogs_count); gtk_label_set_text(GTK_LABEL(reblogs_count), rebc); g_free(rebc); favourites_count = gtk_builder_get_object(post_builder, "favourites_count"); gchar *fc = g_strdup_printf("%d", t->statuses[i]->favourites_count); gtk_label_set_text(GTK_LABEL(favourites_count), fc); g_free(fc); gtk_list_box_prepend(GTK_LIST_BOX(list_box), GTK_WIDGET(post_box)); gtk_widget_show_all(GTK_WIDGET(post_box)); } /* gtk_spinner_stop(GTK_SPINNER(spinner)); */ gs_timeline_free(t); return G_SOURCE_REMOVE; } static gpointer load_timeline(gpointer data) { struct gs_timeline *t; t = gs_timeline_get(gs_client, 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_main_window(GtkApplication *app, gpointer user_data) { gs_client = 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); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); 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), scrolled); gtk_container_add(GTK_CONTAINER(scrolled), list_box); gtk_widget_show_all(window); if (!gs_auth_is_logged_in(client)) { create_login_dialog(); } if (!gs_auth_is_logged_in(client)) { log_msg(LOG_ERROR, "create_main_window", "login is required to view timeline"); } g_thread_new("load_timeline_thread", &load_timeline, client); }