#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include "auth.h" #include "register.h" #include "http.h" #include "timeline.h" #include "main_window.h" #include "log.h" GtkApplication *application; GObject *login_dialog; GObject *instance_domain_entry, *email_entry, *password_entry; GObject *login_button, *cancel_button; GObject *spinner; static gboolean login_completed(gpointer data) { int *val_ptr = data; gtk_spinner_stop(GTK_SPINNER(spinner)); if (*val_ptr) { free(val_ptr); log_msg(LOG_WARNING, "login_callback", "login failed"); return G_SOURCE_REMOVE; } else { free(val_ptr); gtk_widget_destroy(GTK_WIDGET(login_dialog)); return G_SOURCE_REMOVE; } } static gpointer user_register(gpointer data) { int *val_ptr; const char *instance_name, *email, *password; instance_name = gtk_entry_get_text(GTK_ENTRY(instance_domain_entry)); email = gtk_entry_get_text(GTK_ENTRY(email_entry)); password = gtk_entry_get_text(GTK_ENTRY(password_entry)); val_ptr = malloc(sizeof(int)); *val_ptr = register_app(instance_name); if (*val_ptr) { log_msg(LOG_WARNING, "user_register", "registration failed"); } *val_ptr = login(email, password); if (*val_ptr) { log_msg(LOG_WARNING, "user_register", "login failed"); } gdk_threads_add_idle(login_completed, val_ptr); return NULL; } static void submit_login_form() { gtk_spinner_start(GTK_SPINNER(spinner)); g_thread_new("register", user_register, NULL); return; } static bool is_form_valid() { if (strlen(gtk_entry_get_text(GTK_ENTRY(instance_domain_entry))) < 1 || strlen(gtk_entry_get_text(GTK_ENTRY(email_entry))) < 1 || strlen(gtk_entry_get_text(GTK_ENTRY(password_entry))) < 1) return false; return true; } static void login_button_click(GtkButton *button, gpointer user_data) { g_print("clicked\n"); if (is_form_valid()) submit_login_form(); } static void form_on_activate(GtkEntry *entry, gpointer user_data) { if (is_form_valid()) submit_login_form(); } static void login_form_changed(GtkWidget *widget, gpointer data) { if (is_form_valid()) gtk_widget_set_sensitive(GTK_WIDGET(login_button), true); else gtk_widget_set_sensitive(GTK_WIDGET(login_button), false); } int create_login_dialog() { GtkBuilder *login_builder; login_builder = gtk_builder_new_from_file("data/login_window.ui"); login_dialog = gtk_builder_get_object(login_builder, "login_dialog"); instance_domain_entry = gtk_builder_get_object(login_builder, "instance_name"); g_signal_connect(G_OBJECT(instance_domain_entry), "changed", G_CALLBACK(login_form_changed), NULL); g_signal_connect(GTK_ENTRY(instance_domain_entry), "activate", G_CALLBACK(form_on_activate), NULL); email_entry = gtk_builder_get_object(login_builder, "email"); g_signal_connect(G_OBJECT(email_entry), "changed", G_CALLBACK(login_form_changed), NULL); g_signal_connect(GTK_ENTRY(email_entry), "activate", G_CALLBACK(form_on_activate), NULL); password_entry = gtk_builder_get_object(login_builder, "password"); g_signal_connect(G_OBJECT(password_entry), "changed", G_CALLBACK(login_form_changed), NULL); g_signal_connect(GTK_ENTRY(password_entry), "activate", G_CALLBACK(form_on_activate), NULL); login_button = gtk_builder_get_object(login_builder, "login_button"); g_signal_connect(GTK_BUTTON(login_button), "clicked", G_CALLBACK(login_button_click), NULL); cancel_button = gtk_builder_get_object(login_builder, "cancel_button"); spinner = gtk_builder_get_object(login_builder, "spinner"); return gtk_dialog_run(GTK_DIALOG(login_dialog)); }