diff --git a/src/dialogs/dialog.c b/src/dialogs/dialog.c index 57ff11d..f578a36 100644 --- a/src/dialogs/dialog.c +++ b/src/dialogs/dialog.c @@ -54,13 +54,10 @@ #elif GTK_CHECK_VERSION(3,12,0) - gboolean use_header; - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); - GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_DIALOG, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", (v3270_dialog_get_use_header() ? 1 : 0), NULL )); diff --git a/src/dialogs/load.c b/src/dialogs/load.c index 48d91f5..c000172 100644 --- a/src/dialogs/load.c +++ b/src/dialogs/load.c @@ -233,14 +233,11 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ { g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - gboolean use_header; - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); - // Create dialog V3270LoadDialog * dialog = V3270_LOAD_DIALOG( g_object_new( GTK_TYPE_V3270LoadDialog, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", (v3270_dialog_get_use_header() ? 1 : 0), NULL) ); diff --git a/src/dialogs/popups.c b/src/dialogs/popups.c index 51c5d9f..bd3cf4b 100644 --- a/src/dialogs/popups.c +++ b/src/dialogs/popups.c @@ -32,6 +32,7 @@ #include #include #include + #include #include /*--[ Implement ]------------------------------------------------------------------------------------*/ diff --git a/src/dialogs/print/settingsdialog.c b/src/dialogs/print/settingsdialog.c index 6c58f9d..66ef8ac 100644 --- a/src/dialogs/print/settingsdialog.c +++ b/src/dialogs/print/settingsdialog.c @@ -454,13 +454,10 @@ static void V3270FTSettingsDialog_init(V3270FTSettingsDialog *widget) LIB3270_EXPORT GtkWidget * v3270_ft_settings_dialog_new(GtkWidget *parent) { - gboolean use_header; - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); - GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_V3270_FT_DIALOG, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", (v3270_dialog_get_use_header() ? 1 : 0), NULL )); diff --git a/src/dialogs/save/private.h b/src/dialogs/save/private.h index aaef6bb..ad92193 100644 --- a/src/dialogs/save/private.h +++ b/src/dialogs/save/private.h @@ -49,7 +49,7 @@ GtkWidget * terminal; GtkWidget * filename; GtkWidget * charset; - GtkWidget * format; + GtkComboBox * format; LIB3270_CONTENT_OPTION mode; }; diff --git a/src/dialogs/save/save.c b/src/dialogs/save/save.c index ba23e44..9336c01 100644 --- a/src/dialogs/save/save.c +++ b/src/dialogs/save/save.c @@ -63,13 +63,6 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ -/* - static void V3270SaveDialog_finalize(V3270SaveDialog *object) - { - V3270SaveDialog *dialog = V3270_SAVE_DIALOG(object); - } -*/ - static void V3270SaveDialog_class_init(V3270SaveDialogClass G_GNUC_UNUSED(*klass)) { @@ -78,16 +71,6 @@ } - static void cancel_operation(GtkButton G_GNUC_UNUSED(*button), GtkDialog *dialog) - { - gtk_dialog_response(dialog,GTK_RESPONSE_CANCEL); - } - - static void apply_operation(GtkButton G_GNUC_UNUSED(*button), GtkDialog *dialog) - { - gtk_dialog_response(dialog,GTK_RESPONSE_APPLY); - } - #ifdef WIN32 static void icon_press(GtkEntry G_GNUC_UNUSED(*entry), G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270SaveDialog *widget) { @@ -138,27 +121,42 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ #endif // _WIN32 - static void filename_changed(GtkEntry *entry, GtkComboBox *formats) + static void filename_changed(GtkEntry *entry, V3270SaveDialog *dialog) { const gchar * text = gtk_entry_get_text(entry); + GtkWidget * button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY); - if(!(text && *text)) + if(!(text && *text)) { + gtk_widget_set_sensitive(button,FALSE); return; + } + + if(g_str_has_suffix(text,G_DIR_SEPARATOR_S)) { + gtk_widget_set_sensitive(button,FALSE); + return; + } + + g_autofree gchar * dirname = g_path_get_dirname(text); + g_autofree gchar * basename = g_path_get_basename(text); - const gchar * extension = strrchr(text,'.'); + gtk_widget_set_sensitive(button,g_file_test(dirname,G_FILE_TEST_IS_DIR) && *basename && (*basename != '.')); + + debug("*************[%s]***********",basename); + + const gchar * extension = strrchr(basename,'.'); if(!extension) return; extension++; - const gchar * format = gtk_combo_box_get_active_id(formats); + const gchar * format = gtk_combo_box_get_active_id(dialog->format); if(*format == '.') format++; if(g_ascii_strcasecmp(extension,format) == 0) return; - gint column = gtk_combo_box_get_id_column(formats); - GtkTreeModel * model = gtk_combo_box_get_model(formats); + gint column = gtk_combo_box_get_id_column(dialog->format); + GtkTreeModel * model = gtk_combo_box_get_model(dialog->format); GtkTreeIter iter; debug("id_column=%d",column); @@ -172,7 +170,7 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ if(g_ascii_strcasecmp(extension,id + (*id == '.' ? 1 : 0)) == 0) { - gtk_combo_box_set_active_iter(formats,&iter); + gtk_combo_box_set_active_iter(dialog->format,&iter); break; } @@ -228,7 +226,6 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ // Setup visual elements // https://developer.gnome.org/hig/stable/visual-layout.html.en GtkWidget *widget; - GtkWidget *button; GtkBox * box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); gtk_window_set_resizable(GTK_WINDOW(dialog),FALSE); @@ -284,9 +281,9 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ gtk_widget_set_valign(widget,GTK_ALIGN_CENTER); gtk_grid_attach(grid,widget,2,1,1,1); - dialog->format = gtk_combo_box_text_new(); + dialog->format = GTK_COMBO_BOX(gtk_combo_box_text_new()); - gtk_grid_attach(grid,dialog->format,3,1,1,1); + gtk_grid_attach(grid,GTK_WIDGET(dialog->format),3,1,1,1); for(ix=0;ixfilename,"changed",G_CALLBACK(filename_changed),dialog->format); + g_signal_connect(dialog->filename,"changed",G_CALLBACK(filename_changed),dialog); g_signal_connect(dialog->format,"changed",G_CALLBACK(fileformat_changed),dialog->filename); } @@ -328,41 +325,19 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ // Buttons // https://developer.gnome.org/icon-naming-spec/ -#ifdef _WIN32 - widget = NULL; -#elif GTK_CHECK_VERSION(3,14,0) - widget = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); -#else - widget = NULL; -#endif // GTK(3,14,0) - - if(widget) - { - // Have header bar - button = gtk_button_new_with_mnemonic(_("_Cancel")); - gtk_widget_set_tooltip_markup(button,_("Click to cancel operation")); - gtk_header_bar_pack_start(GTK_HEADER_BAR(widget),button); - g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(cancel_operation),dialog); - - button = gtk_button_new_with_mnemonic(_("_Save")); - gtk_widget_set_tooltip_markup(button,_("Click to save file")); - gtk_header_bar_pack_end(GTK_HEADER_BAR(widget),button); - g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(apply_operation),dialog); + gtk_dialog_add_buttons( + GTK_DIALOG (dialog), + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_APPLY, + NULL + ); + + if(!v3270_dialog_get_use_header()) { + GtkWidget * content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + gtk_box_set_spacing(GTK_BOX(content_area),3); } - else - { - gtk_box_set_spacing( - GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), - 18 - ); - gtk_dialog_add_buttons( - GTK_DIALOG (dialog), - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_Save"), GTK_RESPONSE_APPLY, - NULL - ); - } + gtk_widget_set_sensitive(gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY),FALSE); } @@ -377,14 +352,11 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ N_("Save copy"), }; - gboolean use_header; - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); - // Create dialog V3270SaveDialog * dialog = V3270_SAVE_DIALOG( g_object_new( GTK_TYPE_V3270SaveDialog, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", v3270_dialog_get_use_header() ? 1 : 0, NULL) ); diff --git a/src/dialogs/security.c b/src/dialogs/security.c index fe818b5..43fab71 100644 --- a/src/dialogs/security.c +++ b/src/dialogs/security.c @@ -215,12 +215,10 @@ #if GTK_CHECK_VERSION(3,12,0) - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); - GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_DIALOG, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", (v3270_dialog_get_use_header() ? 1 : 0), NULL )); diff --git a/src/dialogs/settings/dialog.c b/src/dialogs/settings/dialog.c index 64fbc01..69ff8a9 100644 --- a/src/dialogs/settings/dialog.c +++ b/src/dialogs/settings/dialog.c @@ -48,19 +48,6 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ -/* -static gboolean on_tab_focus(V3270Settings *settings, GdkEvent G_GNUC_UNUSED(*event), V3270SettingsDialog *dialog) -{ - debug("title: %s",settings->title); - debug("label: %s",settings->label); - - if(settings->title) - gtk_window_set_title(dialog,settings->title); - - return FALSE; -} -*/ - static void on_switch_page(GtkNotebook G_GNUC_UNUSED(*notebook), V3270Settings *settings, guint G_GNUC_UNUSED(page_num), V3270SettingsDialog *dialog) { debug("title: %s",settings->title); @@ -215,15 +202,9 @@ static void V3270SettingsDialog_init(V3270SettingsDialog *dialog) GtkWidget * content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); // Get use of header bar. -#ifndef _WIN32 - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &dialog->has_subtitle, NULL); -#endif // _WIN32 - - // https://developer.gnome.org/hig/stable/visual-layout.html.en - //gtk_box_set_spacing(GTK_BOX(content_area),18); - //gtk_container_set_border_width(GTK_CONTAINER(content_area),18); + dialog->has_subtitle = v3270_dialog_get_use_header(); -// gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); gtk_dialog_add_buttons( @@ -236,11 +217,6 @@ static void V3270SettingsDialog_init(V3270SettingsDialog *dialog) // Create notebook for settings widgets dialog->tabs = GTK_NOTEBOOK(gtk_notebook_new()); -#ifdef _WIN32 - gtk_widget_set_margin_bottom(GTK_WIDGET(dialog->tabs),3); -// gtk_notebook_set_show_border(dialog->tabs, TRUE); -#endif // _WIN32 - gtk_notebook_set_scrollable(dialog->tabs,TRUE); gtk_notebook_set_show_tabs(dialog->tabs,FALSE); g_signal_connect(G_OBJECT(dialog->tabs), "page-added", G_CALLBACK(on_page_changed), dialog); @@ -248,29 +224,20 @@ static void V3270SettingsDialog_init(V3270SettingsDialog *dialog) g_signal_connect(G_OBJECT(dialog->tabs), "switch-page", G_CALLBACK(on_switch_page), dialog); gtk_box_pack_start(GTK_BOX(content_area),GTK_WIDGET(dialog->tabs),TRUE,TRUE,0); - + if(!dialog->has_subtitle) { + gtk_box_set_spacing(GTK_BOX(content_area),3); + gtk_widget_set_margin_bottom(content_area,3); + } } GtkWidget * v3270_settings_dialog_new() { -#ifdef _WIN32 - - GtkWidget * dialog = - GTK_WIDGET(g_object_new( - GTK_TYPE_V3270_SETTINGS_DIALOG, - "use-header-bar", FALSE, - NULL - )); - -#elif GTK_CHECK_VERSION(3,12,0) - - gboolean use_header; - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); +#if GTK_CHECK_VERSION(3,12,0) GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_V3270_SETTINGS_DIALOG, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", (v3270_dialog_get_use_header() ? 1 : 0), NULL )); diff --git a/src/dialogs/tools.c b/src/dialogs/tools.c index 9d9d8f2..e57b34d 100644 --- a/src/dialogs/tools.c +++ b/src/dialogs/tools.c @@ -216,4 +216,22 @@ } + gboolean v3270_dialog_get_use_header() { + +#ifdef DEBUG + return FALSE; +#endif // DEBUG + +#ifdef _WIN32 + return FALSE; +#elif GTK_CHECK_VERSION(3,12,0) + gboolean use_header; + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); + return use_header; +#else + return FALSE; +#endif // _WIN32 + + } + diff --git a/src/dialogs/transfer.c b/src/dialogs/transfer.c index 6b293a7..4a0229f 100644 --- a/src/dialogs/transfer.c +++ b/src/dialogs/transfer.c @@ -126,12 +126,10 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt #if GTK_CHECK_VERSION(3,12,0) - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); - GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_DIALOG, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", (v3270_dialog_get_use_header() ? 1 : 0), NULL )); diff --git a/src/filetransfer/v3270ft.c b/src/filetransfer/v3270ft.c index 68debed..6fdbd45 100644 --- a/src/filetransfer/v3270ft.c +++ b/src/filetransfer/v3270ft.c @@ -726,13 +726,10 @@ LIB3270_EXPORT GtkWidget * v3270ft_new(GtkWidget *parent) { #if GTK_CHECK_VERSION(3,12,0) - gboolean use_header; - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); - GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_V3270FT, - "use-header-bar", (use_header ? 1 : 0), + "use-header-bar", (v3270_dialog_get_use_header() ? 1 : 0), NULL )); diff --git a/src/include/internals.h b/src/include/internals.h index 55d49c1..9557193 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -193,6 +193,8 @@ G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget); #endif // ! GTK 3.12 + G_GNUC_INTERNAL gboolean v3270_dialog_get_use_header(); + G_GNUC_INTERNAL void v3270_grid_attach(GtkGrid *grid, const struct v3270_entry_field * description, GtkWidget *widget); // Toggle button widget -- libgit2 0.21.2