GnomeUI binding of the new --startup-* options.
[udpgate.git] / src / ui-gnome.c
index ebeb4e0..f706abc 100644 (file)
 #include <string.h>
 #include <gtk/gtkmain.h>
 #include <libgnomeui/gnome-app-util.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkcheckbutton.h>
 
 #include "network.h"
+#include "packet.h"
+#include "startup.h"
 
 
 /* Config: */
 #define DAEMON_CHECK_INTERVAL_MS 100
+#define EXTERNAL_STARTUP_CHECK_INTERVAL_MS 1000
 #define PORT_RANGE_BEGIN 2048
 #define PORT_RANGE_END 10240
 
@@ -52,14 +57,26 @@ static GtkButton *ButtonStop;
 static GtkHBox *PortHBox;
 static GnomeAppBar *AppBar;
 static GtkEntry *PortEntry;
+static GtkEntry *HostIPEntry;
+static GtkLabel *AutostartLabel;
+static GtkCheckButton *AutostartCheckButton;
 
 
 static void state_start_stop(void)
 {
 pid_t daemon_pid;
+gboolean daemon_running;
+static gboolean last_daemon_running,last_daemon_running_set=FALSE;
 
        daemon_pid=is_daemon_running();
-       gboolean daemon_running=((pid_t)-1!=daemon_pid);
+       daemon_running=((pid_t)-1!=daemon_pid);
+
+       /* Cache the result; maybe not needed. */
+       if (last_daemon_running_set && last_daemon_running==daemon_running)
+               return;
+       last_daemon_running=daemon_running;
+       last_daemon_running_set=TRUE;
+
        gtk_widget_set_sensitive(GTK_WIDGET(ButtonStart),!daemon_running);
        gtk_widget_set_sensitive(GTK_WIDGET(ButtonStop) , daemon_running);
        gtk_widget_set_sensitive(GTK_WIDGET(PortHBox)   ,!daemon_running);
@@ -76,6 +93,15 @@ static gboolean daemon_check_timeout_func(gpointer data /* unused */)
        return TRUE;    /* continue running */
 }
 
+static gboolean external_startup_check_timeout_func(gpointer data /* unused */)
+{
+gboolean state_startup_is_on;
+
+       if (startup_query(&state_startup_is_on))
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(AutostartCheckButton),state_startup_is_on);
+       return TRUE;    /* continue running */
+}
+
 void on_PortButtonRandom_clicked(GtkButton *button,gpointer user_data)
 {
        g_return_if_fail(GTK_IS_BUTTON(button));
@@ -90,27 +116,21 @@ void on_PortButtonRandom_clicked(GtkButton *button,gpointer user_data)
 void on_AutostartCheckButton_toggled(GtkToggleButton *togglebutton,gpointer user_data)
 {
        g_return_if_fail(GTK_IS_TOGGLE_BUTTON(togglebutton));
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(AutostartCheckButton)))
+               startup_on();
+       else
+               startup_off();
+       external_startup_check_timeout_func(NULL);      /* data; unused */
 }
 
 void on_ButtonStart_clicked(GtkButton *button,gpointer user_data)
 {
-const gchar *port_string;
-char *endp;
-long port_long;
-
        g_return_if_fail(GTK_IS_BUTTON(button));
 
-       port_string=gtk_entry_get_text(PortEntry);
-       port_long=strtol(port_string,&endp,0);
-       if (endp && *endp) {
-               g_warning(_("Invalid port specification, offending string: %s"),endp);
+       if (!optarg_port_set_string(gtk_entry_get_text(PortEntry)))
                return;
-               }
-       if (port_long<1 || port_long>=G_MAXINT || (endp && *endp)) {
-               g_warning(_("Invalid port integer number specification (%ld)"),port_long);
-               return;
-               }
-       network_start(port_long);
+       network_start(optarg_port);
 }
 
 void on_ButtonStop_clicked(GtkButton *button,gpointer user_data)
@@ -124,12 +144,29 @@ void on_ButtonHide_clicked(GtkButton *button,gpointer user_data)
 {
        g_return_if_fail(GTK_IS_BUTTON(button));
 
+       /* update config file */
+       optarg_port_set_string(gtk_entry_get_text(PortEntry));
+
        /* Do not: gtk_main_quit();
         * as 'App' widget will quit our gtk_main() automatically.
         */
        gtk_widget_destroy(GTK_WIDGET(App));
 }
 
+static void ui_gnome_network_notify_hostip(guint32 hostip_guint32)
+{
+       if (!hostip_guint32) {
+               if (is_daemon_running()==(pid_t)-1)
+                       gtk_entry_set_text(HostIPEntry,_("(unknown; Start the daemon)"));
+               else
+                       gtk_entry_set_text(HostIPEntry,_("(unknown; detecting...)"));
+               }
+       else {
+               gtk_entry_set_text(HostIPEntry,HOSTIP_GUINT32_TO_STRING(hostip_guint32));
+               }
+}
+
+static guint ui_gnome_g_log_handler_handler_id;
 static void ui_gnome_g_log_handler(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,gpointer user_data)
 {
 GtkWidget *dialog;
@@ -147,6 +184,16 @@ GtkWidget *dialog;
        /* 'dialog' gets destroyed automatically */
 }
 
+static void ui_gnome_interactive(void)
+{
+       gtk_main();
+       network_notify_hostip=NULL;
+       g_log_remove_handler(
+                       G_LOG_DOMAIN,   /* log_domain; "Captive" */
+                       ui_gnome_g_log_handler_handler_id);     /* handler_id */
+       network_detach();
+}
+
 /* of "ui-gnome-interface.h": */
 GtkWidget *create_App(void);
 /* of "ui-gnome-support.h": */
@@ -161,23 +208,43 @@ gboolean ui_gnome_init(void)
        PortHBox=GTK_HBOX(lookup_widget(GTK_WIDGET(App),"PortHBox"));
        AppBar=GNOME_APPBAR(lookup_widget(GTK_WIDGET(App),"AppBar"));
        PortEntry=GTK_ENTRY(lookup_widget(GTK_WIDGET(App),"PortEntry"));
+       HostIPEntry=GTK_ENTRY(lookup_widget(GTK_WIDGET(App),"HostIPEntry"));
+       AutostartLabel=GTK_LABEL(lookup_widget(GTK_WIDGET(App),"AutostartLabel"));
+       AutostartCheckButton=GTK_CHECK_BUTTON(lookup_widget(GTK_WIDGET(App),"AutostartCheckButton"));
 
        /* ui_gnome_g_log_handler() needs 'App'. */
-       g_log_set_handler(
+       ui_gnome_g_log_handler_handler_id=g_log_set_handler(
                        G_LOG_DOMAIN,   /* log_domain; "Captive" */
-                       G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL,    /* log_levels */
+                       (G_LOG_LEVEL_MASK|G_LOG_FLAG_FATAL)&~(0
+                                       |G_LOG_LEVEL_MESSAGE
+                                       |G_LOG_LEVEL_INFO
+                                       |G_LOG_LEVEL_DEBUG),    /* log_levels */
                        ui_gnome_g_log_handler, /* log_func */
                        NULL);  /* user_data */
 
+       ui_gnome_network_notify_hostip(0);
+       gtk_entry_set_text(PortEntry,udpgate_printf_alloca("%d",(int)optarg_port));
+       if (!startup_init()) {
+               gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(AutostartCheckButton),TRUE);
+               gtk_widget_set_sensitive(GTK_WIDGET(AutostartLabel),FALSE);
+               gtk_widget_set_sensitive(GTK_WIDGET(AutostartCheckButton),FALSE);
+               }
+       daemon_check_timeout_func(NULL);        /* data; unused */
+       external_startup_check_timeout_func(NULL);      /* data; unused */
+
        gtk_widget_show_all(GTK_WIDGET(App));
        g_timeout_add(
                        DAEMON_CHECK_INTERVAL_MS,       /* interval */
                        daemon_check_timeout_func,      /* function */
                        NULL);  /* data; unused */
-       return TRUE;
-}
+       g_timeout_add(
+                       EXTERNAL_STARTUP_CHECK_INTERVAL_MS,     /* interval */
+                       external_startup_check_timeout_func,    /* function */
+                       NULL);  /* data; unused */
 
-void ui_gnome_interactive(void)
-{
-       gtk_main();
+       network_notify_hostip=ui_gnome_network_notify_hostip;
+
+       ui_interactive=ui_gnome_interactive;
+
+       return TRUE;
 }