Commit 528ccfbfcf18a2f1fe2bdb5cfca7626fa2596a2f
1 parent
953d553a
Exists in
master
and in
1 other branch
Disabling "apply" button when host & service name are not set on host
properties widget.
Showing
2 changed files
with
54 additions
and
68 deletions
Show diff stats
src/dialogs/settings/host.c
| ... | ... | @@ -317,28 +317,60 @@ static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidget |
| 317 | 317 | |
| 318 | 318 | } |
| 319 | 319 | |
| 320 | -static void oversize_changed(GtkEditable *editable, GtkWidget *settings) | |
| 321 | -{ | |
| 320 | +static gboolean oversize_validate(GtkEditable *editable) { | |
| 321 | + | |
| 322 | 322 | const gchar * chars = gtk_editable_get_chars(editable,0,-1); |
| 323 | - gboolean valid = TRUE; | |
| 324 | - char junk; | |
| 325 | - unsigned int ovc = 0, ovr = 0; | |
| 326 | 323 | |
| 327 | - if(*chars) | |
| 328 | - { | |
| 324 | + if(*chars) { | |
| 325 | + char junk; | |
| 326 | + unsigned int ovc = 0, ovr = 0; | |
| 327 | + | |
| 329 | 328 | if(sscanf(chars, "%ux%u%c", &ovc, &ovr, &junk) != 2) |
| 330 | - { | |
| 331 | - valid = FALSE; | |
| 332 | - debug("Can't parse \"%s\"",chars); | |
| 333 | - } | |
| 334 | - else if( (ovc * ovr) > 0x4000) | |
| 335 | - { | |
| 336 | - valid = FALSE; | |
| 337 | - debug("Invalid values on \"%s\"",chars); | |
| 338 | - } | |
| 329 | + return FALSE; | |
| 330 | + | |
| 331 | + if( (ovc * ovr) > 0x4000) | |
| 332 | + return FALSE; | |
| 333 | + | |
| 339 | 334 | } |
| 340 | 335 | |
| 341 | - v3270_settings_set_valid(settings,valid); | |
| 336 | + return TRUE; | |
| 337 | +} | |
| 338 | + | |
| 339 | +static void update_valid(V3270HostSelectWidget *settings, gboolean valid) { | |
| 340 | + | |
| 341 | + if(valid) { | |
| 342 | + | |
| 343 | + // Check required inputs. | |
| 344 | + | |
| 345 | + static const int required[] = { ENTRY_HOSTNAME, ENTRY_SRVCNAME }; | |
| 346 | + size_t ix; | |
| 347 | + | |
| 348 | + for(ix = 0; ix < G_N_ELEMENTS(required); ix++) { | |
| 349 | + const gchar * chars = gtk_editable_get_chars(GTK_EDITABLE(settings->input.entry[required[ix]]),0,-1); | |
| 350 | + if(!*chars) { | |
| 351 | + valid = FALSE; | |
| 352 | + break; | |
| 353 | + } | |
| 354 | + } | |
| 355 | + } | |
| 356 | + | |
| 357 | + if(valid) { | |
| 358 | + valid = oversize_validate(GTK_EDITABLE(settings->input.entry[ENTRY_OVERSIZE])); | |
| 359 | + } | |
| 360 | + | |
| 361 | + v3270_settings_set_valid(GTK_WIDGET(settings),valid); | |
| 362 | + | |
| 363 | +} | |
| 364 | + | |
| 365 | +static void required_changed(GtkEditable *editable, GtkWidget *settings) { | |
| 366 | + | |
| 367 | + const gchar * chars = gtk_editable_get_chars(editable,0,-1); | |
| 368 | + update_valid(GTK_V3270HostSelectWidget(settings),(*chars ? TRUE : FALSE)); | |
| 369 | + | |
| 370 | +} | |
| 371 | + | |
| 372 | +static void oversize_changed(GtkEditable *editable, GtkWidget *settings) { | |
| 373 | + update_valid(GTK_V3270HostSelectWidget(settings), oversize_validate(editable)); | |
| 342 | 374 | } |
| 343 | 375 | |
| 344 | 376 | static void remap_file_changed(GtkEditable *editable, V3270HostSelectWidget *settings) |
| ... | ... | @@ -454,24 +486,6 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) |
| 454 | 486 | { |
| 455 | 487 | v3270_settings_create_entry_fields(entryfields, G_N_ELEMENTS(entryfields), grids, widget->input.entry); |
| 456 | 488 | |
| 457 | - /* | |
| 458 | - size_t entry; | |
| 459 | - | |
| 460 | - for(entry = 0; entry < G_N_ELEMENTS(entryfields); entry++) | |
| 461 | - { | |
| 462 | - widget->input.entry[entry] = GTK_ENTRY(gtk_entry_new()); | |
| 463 | - gtk_entry_set_max_length(widget->input.entry[entry],entryfields[entry].max_length); | |
| 464 | - gtk_entry_set_width_chars(widget->input.entry[entry],entryfields[entry].width_chars); | |
| 465 | - | |
| 466 | - v3270_grid_attach( | |
| 467 | - GTK_GRID(grids[entryfields[entry].grid]), | |
| 468 | - (struct v3270_entry_field *) & entryfields[entry], | |
| 469 | - GTK_WIDGET(widget->input.entry[entry]) | |
| 470 | - ); | |
| 471 | - | |
| 472 | - } | |
| 473 | - */ | |
| 474 | - | |
| 475 | 489 | // Custom settings |
| 476 | 490 | gtk_entry_set_placeholder_text(widget->input.entry[ENTRY_SRVCNAME],"telnet"); |
| 477 | 491 | |
| ... | ... | @@ -486,6 +500,8 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) |
| 486 | 500 | g_signal_connect(G_OBJECT(widget->input.entry[ENTRY_REMAP_FILE]),"changed",G_CALLBACK(remap_file_changed),widget); |
| 487 | 501 | |
| 488 | 502 | g_signal_connect(G_OBJECT(widget->input.entry[ENTRY_OVERSIZE]),"changed",G_CALLBACK(oversize_changed),widget); |
| 503 | + g_signal_connect(G_OBJECT(widget->input.entry[ENTRY_HOSTNAME]),"changed",G_CALLBACK(required_changed),widget); | |
| 504 | + g_signal_connect(G_OBJECT(widget->input.entry[ENTRY_SRVCNAME]),"changed",G_CALLBACK(required_changed),widget); | |
| 489 | 505 | |
| 490 | 506 | } |
| 491 | 507 | |
| ... | ... | @@ -607,38 +623,6 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) |
| 607 | 623 | |
| 608 | 624 | } |
| 609 | 625 | |
| 610 | - | |
| 611 | - /* | |
| 612 | - // Create combo boxes | |
| 613 | - { | |
| 614 | - size_t combo, item; | |
| 615 | - | |
| 616 | - for(combo = 0; combo < G_N_ELEMENTS(combos); combo++) { | |
| 617 | - | |
| 618 | - | |
| 619 | - widget->input.combos[combo] = GTK_COMBO_BOX(gtk_combo_box_new_with_model(model)); | |
| 620 | - | |
| 621 | - if(combos[combo].tooltip) | |
| 622 | - gtk_widget_set_tooltip_markup(GTK_WIDGET(widget->input.combos[combo]),combos[combo].tooltip); | |
| 623 | - | |
| 624 | - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.combos[combo]), text_renderer, TRUE); | |
| 625 | - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.combos[combo]), text_renderer, "text", 0, NULL); | |
| 626 | - | |
| 627 | - for(item = 0; combos[combo].labels[item]; item++) | |
| 628 | - { | |
| 629 | - GtkTreeIter iter; | |
| 630 | - gtk_list_store_append((GtkListStore *) model, &iter); | |
| 631 | - gtk_list_store_set((GtkListStore *) model, &iter, 0, g_dgettext(GETTEXT_PACKAGE, combos[combo].labels[item]), 1, combos[combo].values[item], -1); | |
| 632 | - } | |
| 633 | - | |
| 634 | - v3270_grid_attach(GTK_GRID(grids[EMULATION]), (struct v3270_entry_field *) & combos[combo], GTK_WIDGET(widget->input.combos[combo])); | |
| 635 | - | |
| 636 | - } | |
| 637 | - | |
| 638 | - } | |
| 639 | - | |
| 640 | - */ | |
| 641 | - | |
| 642 | 626 | gtk_widget_show_all(GTK_WIDGET(widget)); |
| 643 | 627 | |
| 644 | 628 | } |
| ... | ... | @@ -908,5 +892,7 @@ static void load(GtkWidget *w, GtkWidget *terminal) |
| 908 | 892 | // Load unlock delay |
| 909 | 893 | gtk_spin_button_set_value(widget->input.unlock_delay, lib3270_get_unlock_delay(hSession)); |
| 910 | 894 | |
| 895 | + update_valid(widget,TRUE); | |
| 896 | + | |
| 911 | 897 | } |
| 912 | 898 | ... | ... |
src/include/hostselect.h
| ... | ... | @@ -45,7 +45,7 @@ |
| 45 | 45 | |
| 46 | 46 | G_BEGIN_DECLS |
| 47 | 47 | |
| 48 | -/*--[ Progress widget ]------------------------------------------------------------------------------*/ | |
| 48 | +/*--[ Host selection dialog ]------------------------------------------------------------------------*/ | |
| 49 | 49 | |
| 50 | 50 | #define GTK_TYPE_V3270HostSelectWidget (V3270HostSelectWidget_get_type ()) |
| 51 | 51 | #define GTK_V3270HostSelectWidget(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270HostSelectWidget, V3270HostSelectWidget)) | ... | ... |