X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=main.c;fp=main.c;h=0545ec446e40de9e77ab6728b13f01a2bdf02f35;hb=dc0e64a4c244fa084eb7bfce4503404824ada6ef;hp=17618644e3639710519f12699300ce1259407c60;hpb=9e71dc8c3f23425cdd4453402b7c2ba204a6e5e0;p=ovirt-viewer.git diff --git a/main.c b/main.c index 1761864..0545ec4 100644 --- a/main.c +++ b/main.c @@ -39,10 +39,6 @@ #include #endif -#ifndef G_THREADS_ENABLED -#error "This program requires GLib threads, and cannot be compiled without." -#endif - #include "internal.h" /*#define HTTPS "https"*/ @@ -60,17 +56,21 @@ gboolean check_cert = TRUE; static void start_ui (void); static GtkWidget *menu_item_new (int which_menu); static void connect_to_wui (GtkWidget *, gpointer); +static void login_to_wui (GtkWidget *, gpointer); static gboolean delete_event (GtkWidget *widget, GdkEvent *event, gpointer data); static void destroy (GtkWidget *widget, gpointer data); /* For any widgets accessed from multiple functions. */ +static GtkWidget *window; static GtkWidget *connection_area; static GtkWidget *ca_hostname; static GtkWidget *ca_button; +static GtkWidget *ca_error; static GtkWidget *login_area; static GtkWidget *la_username; static GtkWidget *la_password; static GtkWidget *la_button; +static GdkCursor *busy_cursor; /* Menus. */ enum menuNums { @@ -201,7 +201,6 @@ main (int argc, char *argv[]) static void start_ui (void) { - GtkWidget *window; GtkWidget *vbox; GtkWidget *menubar; GtkWidget *file; @@ -225,6 +224,11 @@ start_ui (void) /* Parse styles. */ gtk_rc_parse_string (styles); + /* Busy cursor, used by main_busy() function. + * XXX This cursor is crap - how can we use the Bluecurve/theme cursor? + */ + busy_cursor = gdk_cursor_new (GDK_WATCH); + /* Window. */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 800, 600); @@ -282,10 +286,12 @@ start_ui (void) ca_hostname = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (ca_hostname), 24); ca_button = gtk_button_new_with_label ("Connect"); + ca_error = gtk_label_new (NULL); gtk_box_pack_start (GTK_BOX (ca_hbox), ca_hostname, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (ca_hbox), ca_button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (ca_vbox), ca_label, FALSE, FALSE, 4); gtk_box_pack_start (GTK_BOX (ca_vbox), ca_hbox, TRUE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (ca_vbox), ca_error, TRUE, FALSE, 4); gtk_container_add (GTK_CONTAINER (connection_area), ca_vbox); gtk_widget_set_name (connection_area, "ovirt-viewer-connection-area"); @@ -308,6 +314,9 @@ start_ui (void) gtk_widget_set_name (login_area, "ovirt-viewer-login-area"); + g_signal_connect (G_OBJECT (la_button), "clicked", + G_CALLBACK (login_to_wui), NULL); + /* Tabbed notebook. */ notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_LEFT); @@ -388,3 +397,144 @@ connect_to_wui (GtkWidget *widget, gpointer data) wui_thread_send_connect (uri); } + +static void +login_to_wui (GtkWidget *widget, gpointer data) +{ + const char *username, *password; + + username = gtk_entry_get_text (GTK_ENTRY (la_username)); + if (STREQ (username, "")) return; + password = gtk_entry_get_text (GTK_ENTRY (la_password)); + + wui_thread_send_login (username, password); +} + +/* The WUI thread has changed its state to connected. */ +gboolean +main_connected (gpointer data) +{ + DEBUG ("connected"); + + gtk_label_set_text (GTK_LABEL (ca_error), NULL); + + gtk_widget_hide (connection_area); + if (!wui_thread_is_logged_in ()) + gtk_widget_show (login_area); + return FALSE; +} + +/* The WUI thread has changed its state to disconnected. */ +gboolean +main_disconnected (gpointer data) +{ + DEBUG ("disconnected"); + gtk_widget_show (connection_area); + gtk_widget_hide (login_area); + return FALSE; +} + +/* The WUI thread has changed its state to logged in. */ +gboolean +main_logged_in (gpointer data) +{ + DEBUG ("logged in"); + gtk_widget_hide (login_area); + return FALSE; +} + +/* The WUI thread has changed its state to logged out. */ +gboolean +main_logged_out (gpointer data) +{ + DEBUG ("logged out"); + if (wui_thread_is_connected ()) + gtk_widget_show (login_area); + return FALSE; +} + +/* The WUI thread has changed its state to busy. */ +gboolean +main_busy (gpointer data) +{ + GdkWindow *gdk_window; + + DEBUG ("busy"); + + gdk_window = gtk_widget_get_window (window); + if (gdk_window) { + gdk_window_set_cursor (gdk_window, busy_cursor); + gdk_flush (); + } + + return FALSE; +} + +/* The WUI thread has changed its state to idle. */ +gboolean +main_idle (gpointer data) +{ + GdkWindow *gdk_window; + + DEBUG ("idle"); + + gdk_window = gtk_widget_get_window (window); + if (gdk_window) { + gdk_window_set_cursor (gdk_window, NULL); + gdk_flush (); + } + + return FALSE; +} + +/* The WUI thread had a connection error. This function must + * free the string. + */ +gboolean +main_connection_error (gpointer _str) +{ + char *str = (char *) _str; + + DEBUG ("connection error: %s", str); + + gtk_label_set_text (GTK_LABEL (ca_error), str); + g_free (str); + + return FALSE; +} + +/* The WUI thread had a login error. This function must + * free the string. + */ +gboolean +main_login_error (gpointer _str) +{ + char *str = (char *) _str; + + DEBUG ("login error: %s", str); + + /* + gtk_label_set_text (GTK_LABEL (ca_error), str); + */ + g_free (str); + + return FALSE; +} + +/* The WUI thread reports a general status error. This function + * must free the string. + */ +gboolean +main_status_error (gpointer _str) +{ + char *str = (char *) _str; + + DEBUG ("status error: %s", str); + + /* + gtk_label_set_text (GTK_LABEL (ca_error), str); + */ + g_free (str); + + return FALSE; +}