diff options
Diffstat (limited to 'src/main_window.c')
-rw-r--r-- | src/main_window.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/main_window.c b/src/main_window.c new file mode 100644 index 0000000..048de51 --- /dev/null +++ b/src/main_window.c @@ -0,0 +1,167 @@ +#define _POSIX_C_SOURCE 200809L +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <gtk-3.0/gtk/gtk.h> +#include "auth.h" +#include "http.h" +#include "timeline.h" +#include "log.h" +#include "config.h" +#include "login_window.h" +#include "string-util.h" + +static GtkWidget *window, *scrolled, *list_box; + +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( + "(<p>|</p>|<br></br>|<br/>|<br />)", 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 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)); */ + 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_main_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); + + 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 (!is_logged_in()) { + create_login_dialog(); + } + if (!is_logged_in()) { + log_msg(LOG_ERROR, "create_main_window", + "login is required to view timeline"); + } + g_thread_new("load_timeline_thread", &load_timeline, NULL); +} |