#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include "main_window.h" #include "log.h" static GSClient *gs_client = NULL; 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) { gtk_spinner_stop(GTK_SPINNER(spinner)); gtk_widget_destroy(GTK_WIDGET(login_dialog)); return G_SOURCE_REMOVE; } static gboolean login_failed(gpointer data) { gtk_spinner_stop(GTK_SPINNER(spinner)); return G_SOURCE_REMOVE; } static gpointer user_register(gpointer data) { const char *instance_name, *email, *password; struct gs_app *app; 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)); app = gs_app_register(instance_name); if (*val_ptr) { log_msg(LOG_WARNING, "user_register", "registration failed"); } gs_client = gs_client_new(instance_name, app->client_id, app->client_secret); if (gs_auth_authenticate(gs_client, email, password)) { log_msg(LOG_WARNING, "user_register", "login failed"); gdk_threads_add_idle(login_failed, NULL); return; } gdk_threads_add_idle(login_completed, NULL); 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) { 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(gpointer data) { 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)); }