diff options
Diffstat (limited to 'src/timeline_window.c')
-rw-r--r-- | src/timeline_window.c | 81 |
1 files changed, 70 insertions, 11 deletions
diff --git a/src/timeline_window.c b/src/timeline_window.c index 516f2d6..4b17824 100644 --- a/src/timeline_window.c +++ b/src/timeline_window.c @@ -8,19 +8,74 @@ #include "http.h" #include "timeline.h" #include "log.h" +#include "string-util.h" -static GtkWidget *window, *spinner, *list_box; +static GtkWidget *window, *scrolled, *list_box; + +static gchar *html_to_pango(const char *content) +{ + char *str1, *str2; + gchar *result; + GRegex *regex = NULL; + GError *error = NULL; + + if (!content) { + return NULL; + } + + str1 = str_replace(content, "<p>", ""); + if (!str1) { + log_msg(LOG_WARNING, "html_to_pango", "failed to parse html"); + return NULL; + } + str2 = str_replace(str1, "</p>", ""); + free(str1); + if (!str2) { + log_msg(LOG_WARNING, "html_to_pango", "failed to parse html"); + return NULL; + } + + regex = g_regex_new("(class|target|rel)=\"(.|\n)*?\"", G_REGEX_CASELESS, 0, &error); + if (!regex) { + log_msg(LOG_WARNING, "html_to_pango", error->message); + g_free(error); + return NULL; + } + + result = g_regex_replace(regex, str2, -1, 0, "", 0, &error); + free(str2); + if (!result) { + log_msg(LOG_WARNING, "html_to_pango", error->message); + g_free(error); + return NULL; + } + + return result; +} 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)); + GtkBuilder *post_builder; + GObject *post_box, *post_content_label; + 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); + + 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)); + /* gtk_spinner_stop(GTK_SPINNER(spinner)); */ timeline_free(t); return G_SOURCE_REMOVE; } @@ -44,17 +99,21 @@ void create_timeline_window(GtkApplication *app, gpointer user_data) 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); + + 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); + /* 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_container_add(GTK_CONTAINER(window), scrolled); + gtk_container_add(GTK_CONTAINER(scrolled), list_box); gtk_widget_show_all(window); g_thread_new("load_timeline_thread", &load_timeline, NULL); |