#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include "auth.h" #include "http.h" #include "timeline.h" #include "window.h" static GtkWidget *window; static GtkWidget *box; static GtkWidget *instance_name_box, *email_box, *password_box; static GtkWidget *submit_button; static GtkWidget *spinner; static void login_callback(bool success) { if (!success) { fprintf(stderr, "login_callback(): login failed\n"); gtk_spinner_stop(GTK_SPINNER(spinner)); return; } printf("login success\n"); gtk_spinner_stop(GTK_SPINNER(spinner)); } static void register_callback(bool success) { if (!success) { gtk_spinner_stop(GTK_SPINNER(spinner)); fprintf(stderr, "register_callback(): register failed\n"); return; } printf("register success\n"); const char *email, *password; email = gtk_entry_get_text(GTK_ENTRY(email_box)); password = gtk_entry_get_text(GTK_ENTRY(password_box)); if (login(email, password, &login_callback)) { gtk_spinner_stop(GTK_SPINNER(spinner)); return; } } static void submit_login_form() { gtk_spinner_start(GTK_SPINNER(spinner)); const char *instance_name; instance_name = gtk_entry_get_text(GTK_ENTRY(instance_name_box)); if (register_app(instance_name, ®ister_callback)) { gtk_spinner_stop(GTK_SPINNER(spinner)); return; } } static void submit_button_clicked(GtkButton *button, gpointer user_data) { submit_login_form(); } static void form_on_activate(GtkEntry *entry, gpointer user_data) { submit_login_form(); } static bool is_form_valid() { if (strlen(gtk_entry_get_text(GTK_ENTRY(instance_name_box))) < 1 || strlen(gtk_entry_get_text(GTK_ENTRY(email_box))) < 1 || strlen(gtk_entry_get_text(GTK_ENTRY(password_box))) < 1) return false; return true; } static void on_form_changed(GtkWidget *widget, gpointer data) { if (is_form_valid()) gtk_widget_set_sensitive(GTK_WIDGET(submit_button), true); else gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false); } static void activate(GtkApplication *app, gpointer user_data) { window = gtk_application_window_new(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); box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); gtk_widget_set_valign(GTK_WIDGET(box), GTK_ALIGN_CENTER); gtk_widget_set_halign(GTK_WIDGET(box), GTK_ALIGN_CENTER); instance_name_box = gtk_entry_new(); gtk_entry_set_placeholder_text( GTK_ENTRY(instance_name_box), "Instance domain"); g_signal_connect(GTK_ENTRY(instance_name_box), "activate", G_CALLBACK(form_on_activate), NULL); g_signal_connect(G_OBJECT(instance_name_box), "changed", G_CALLBACK(on_form_changed), NULL); email_box = gtk_entry_new(); gtk_entry_set_placeholder_text(GTK_ENTRY(email_box), "Email"); gtk_entry_set_input_purpose(GTK_ENTRY(email_box), GTK_INPUT_PURPOSE_EMAIL); g_signal_connect(GTK_ENTRY(email_box), "activate", G_CALLBACK(form_on_activate), NULL); g_signal_connect(G_OBJECT(email_box), "changed", G_CALLBACK(on_form_changed), NULL); password_box = gtk_entry_new(); gtk_entry_set_placeholder_text(GTK_ENTRY(password_box), "Password"); gtk_entry_set_input_purpose( GTK_ENTRY(password_box), GTK_INPUT_PURPOSE_PASSWORD); gtk_entry_set_visibility(GTK_ENTRY(password_box), false); g_signal_connect(GTK_ENTRY(password_box), "activate", G_CALLBACK(form_on_activate), NULL); g_signal_connect(G_OBJECT(password_box), "changed", G_CALLBACK(on_form_changed), NULL); submit_button = gtk_button_new(); g_signal_connect(GTK_BUTTON(submit_button), "clicked", G_CALLBACK(submit_button_clicked), G_OBJECT(window)); gtk_button_set_label(GTK_BUTTON(submit_button), "Submit"); gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false); spinner = gtk_spinner_new(); gtk_container_add(GTK_CONTAINER(window), box); gtk_container_add(GTK_CONTAINER(box), instance_name_box); gtk_container_add(GTK_CONTAINER(box), email_box); gtk_container_add(GTK_CONTAINER(box), password_box); gtk_container_add(GTK_CONTAINER(box), submit_button); gtk_container_add(GTK_CONTAINER(box), spinner); gtk_widget_show_all(window); } int main(int argc, char **argv) { /* gtk_init(&argc, &argv); */ /* create_main_window(); */ /* gtk_main(); */ if (http_init()) { fprintf(stderr, "main(): failed to load http library\n"); return EXIT_FAILURE; } GtkApplication *app; int status; app = gtk_application_new("org.gtk.ap_client", G_APPLICATION_FLAGS_NONE); g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); status = g_application_run(G_APPLICATION(app), argc, argv); g_object_unref(app); http_cleanup(); auth_cleanup(); return status; /* char *text; */ /* struct timeline *t; */ /* char *url = "https://mstdn.io/api/v1/timelines/home"; */ /* char *token = */ /* "580acfb412e927c2030fb5519f417b03ced1482c862d44376922cd81ee8a3655"; */ /* text = request(url, token); */ /* if (!text) { */ /* fprintf(stderr, "main(): failed to get http response\n"); */ /* return EXIT_FAILURE; */ /* } */ /* t = timeline_from_json(text); */ /* if (t == NULL) { */ /* fprintf(stderr, "main(): failed to parse timeline\n"); */ /* return EXIT_FAILURE; */ /* } */ /* for (size_t i = 0; i < t->size; i++) { */ /* printf("status id: %s\n", t->statuses[i]->id); */ /* printf("content: %s\n", t->statuses[i]->content); */ /* printf("reblog count: %d\n", t->statuses[i]->reblogs_count); */ /* printf("fav count: %d\n", t->statuses[i]->favourites_count); */ /* printf("\n"); */ /* } */ /* free(text); */ /* timeline_free(t); */ }