summaryrefslogtreecommitdiff
path: root/src/main_window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main_window.c')
-rw-r--r--src/main_window.c167
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);
+}