diff --git a/Makefile.in b/Makefile.in index 4f7e2e5..8a858c3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -109,7 +109,8 @@ DEPENDS= \ src/filetransfer/marshal.h \ src/filetransfer/private.h \ src/terminal/marshal.h \ - src/trace/marshal.h + src/trace/marshal.h \ + src/dialogs/settings/marshal.h DATE_FMT = +%Y%m%d ifdef SOURCE_DATE_EPOCH @@ -239,6 +240,14 @@ src/terminal/marshal.h: \ @$(GENMARSHAL) --prefix=v3270 --header $< > $@ +src/dialogs/settings/marshal.h: \ + src/dialogs/settings/marshal + + @echo $@ ... + @$(MKDIR) $(@D) + + @$(GENMARSHAL) --prefix=v3270 --header $< > $@ + $(OBJDIR)/marshal/v3270.c: \ src/terminal/marshal diff --git a/src/dialogs/settings/host.c b/src/dialogs/settings/host.c index 25c984b..d7efffe 100644 --- a/src/dialogs/settings/host.c +++ b/src/dialogs/settings/host.c @@ -323,14 +323,16 @@ static void update_valid(V3270HostSelectWidget *settings, gboolean valid) { } -/* -static void required_changed(GtkEditable *editable, GtkWidget *settings) { +static void url_valid(GtkWidget G_GNUC_UNUSED(*url), gboolean valid, V3270HostSelectWidget *settings) { - const gchar * chars = gtk_editable_get_chars(editable,0,-1); - update_valid(GTK_V3270HostSelectWidget(settings),(*chars ? TRUE : FALSE)); + if(valid) { + update_valid(settings,valid); + return; + } + + v3270_settings_set_valid(GTK_WIDGET(settings),valid); } -*/ static void oversize_changed(GtkEditable *editable, GtkWidget *settings) { update_valid(GTK_V3270HostSelectWidget(settings), oversize_validate(editable)); @@ -418,6 +420,8 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) GtkWidget *grids[GRID_COUNT]; grids[CONNECTION] = widget->input.url = v3270_url_edit_new(); + g_signal_connect(grids[CONNECTION],"valid",G_CALLBACK(url_valid),widget); + grids[EMULATION] = gtk_grid_new(); // Connection properties diff --git a/src/dialogs/settings/marshal b/src/dialogs/settings/marshal new file mode 100644 index 0000000..ffd6617 --- /dev/null +++ b/src/dialogs/settings/marshal @@ -0,0 +1,2 @@ +VOID:BOOLEAN + diff --git a/src/dialogs/settings/url.c b/src/dialogs/settings/url.c index f593651..888d32c 100644 --- a/src/dialogs/settings/url.c +++ b/src/dialogs/settings/url.c @@ -30,7 +30,21 @@ */ #include "private.h" + #include "marshal.h" #include + #include + + enum { + PROP_0, + PROP_URL + }; + + enum { + SIGNAL_VALID, + LAST_SIGNAL + }; + + static guint signals[LAST_SIGNAL] = { 0 }; struct _V3270URLEdit { @@ -46,12 +60,16 @@ /// @brief Current URL gchar *url; + /// @brief Is the entry valid? + gboolean isValid; + }; struct _V3270URLEditClass { GtkGridClass parent; + GParamSpec *url; }; @@ -73,9 +91,101 @@ G_OBJECT_CLASS(V3270URLEdit_parent_class)->finalize(object); } + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { + + switch(prop_id) { + case PROP_URL: + v3270_url_edit_set_url(GTK_WIDGET(object),g_value_get_string(value)); + break; + } + } + + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { + switch(prop_id) { + case PROP_URL: + g_value_set_string(value,v3270_url_edit_get_url(GTK_WIDGET(object))); + break; + } + } + static void V3270URLEdit_class_init(V3270URLEditClass *klass) { - G_OBJECT_CLASS(klass)->finalize = finalize; + GObjectClass *goc = G_OBJECT_CLASS(klass); + + goc->finalize = finalize; + goc->set_property = set_property; + goc->get_property = get_property; + + klass->url = + g_param_spec_string( + "url", "url", + _( "TN3270 Host URL" ), + lib3270_get_default_host(NULL), + G_PARAM_READWRITE + ); + + g_object_class_install_property( + goc, + PROP_URL, + klass->url + ); + + signals[SIGNAL_VALID] = + g_signal_new( + I_("valid"), + G_OBJECT_CLASS_TYPE(goc), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + v3270_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN, 0 + ); + + } + + static void entry_changed(GtkEntry *entry, V3270URLEdit *widget) { + + g_object_notify_by_pspec(G_OBJECT(widget),GTK_V3270URLEdit_GET_CLASS(widget)->url); + + gboolean isValid = (gtk_entry_get_text(entry)[0] != 0); + if(widget->isValid == isValid) { + return; + } + + if(isValid) { + + size_t ix; + + // Verify entry-fields + GtkWidget *widgets[] = { + widget->entry.host, + widget->entry.service + }; + + for(ix = 0; ix < G_N_ELEMENTS(widgets); ix++) { + + const gchar *str = gtk_entry_get_text(GTK_ENTRY(widgets[ix])); + while(*str && isspace(*str)) { + str++; + } + + if(!*str) { + isValid = FALSE; + break; + } + + } + + } + + if(isValid == widget->isValid) { + return; + } + + debug("The URL box is %s", isValid ? "valid" : "invalid"); + + widget->isValid = isValid; + g_signal_emit(widget, signals[SIGNAL_VALID], 0, isValid); } @@ -83,6 +193,8 @@ size_t ix; + widget->isValid = FALSE; + // Table of constants. static const struct _labels { int row; @@ -122,6 +234,7 @@ gtk_entry_set_width_chars(GTK_ENTRY(widget->entry.host),50); gtk_widget_set_tooltip_text(widget->entry.host,g_dgettext(GETTEXT_PACKAGE,labels[0].tooltip)); gtk_grid_attach(GTK_GRID(widget),widget->entry.host,1,0,5,1); + g_signal_connect(widget->entry.host,"changed",G_CALLBACK(entry_changed),widget); } // Create the service/port field. @@ -132,6 +245,7 @@ gtk_entry_set_width_chars(GTK_ENTRY(widget->entry.service),7); gtk_widget_set_tooltip_text(widget->entry.service,g_dgettext(GETTEXT_PACKAGE,labels[1].tooltip)); gtk_grid_attach(GTK_GRID(widget),widget->entry.service,1,1,1,1); + g_signal_connect(widget->entry.service,"changed",G_CALLBACK(entry_changed),widget); } // Create the security dropbox. -- libgit2 0.21.2