From 8a180486226576173c4850960825bb9cbe91945b Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Sat, 29 Jul 2017 20:50:07 +0200 Subject: Lower GTK and Qt version requirements For GTK lower than 3.20 there is no GtkFileChooserNative so fallback to using GtkFileChooserDialog --- configure.ac | 4 ++-- src/gui_gtk.cc | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index 2d7c041..0633a84 100644 --- a/configure.ac +++ b/configure.ac @@ -141,7 +141,7 @@ AC_ARG_ENABLE([gtk], [AC_HELP_STRING([--disable-gtk], [do not use GTK even if found])], [gtk_check=$enableval], [gtk_check=yes]) AS_IF([test x$gtk_check = xyes], - [gtk_need="gtk+-3.0 >= 3.20" + [gtk_need="gtk+-3.0 >= 3.18" PKG_CHECK_EXISTS([$gtk_need], [PKG_CHECK_MODULES([GTK], [$gtk_need]) have_gtk=1]) @@ -156,7 +156,7 @@ AC_ARG_ENABLE([qt], [AC_HELP_STRING([--disable-qt], [do not use QT even if found])], [qt_check=$enableval], [qt_check=yes]) AS_IF([test x$qt_check = xyes], - [qt_need="Qt5Widgets >= 5.8.0" + [qt_need="Qt5Widgets >= 5.5.0" PKG_CHECK_EXISTS([$qt_need], [PKG_CHECK_MODULES([QT], [$qt_need]) PKG_CHECK_VAR([QT_CONFIG], [Qt5Core], [qt_config]) diff --git a/src/gui_gtk.cc b/src/gui_gtk.cc index 20b23ec..574cf84 100644 --- a/src/gui_gtk.cc +++ b/src/gui_gtk.cc @@ -720,26 +720,47 @@ public: std::string file_dialog(std::string const& title, std::string const& file, uint8_t flags, std::vector const& filter) override { - shared_gobject chooser(gtk_file_chooser_native_new( + GtkFileChooser* chooser; +#if GTK_CHECK_VERSION(3, 20, 0) + shared_gobject native(gtk_file_chooser_native_new( title.c_str(), reinterpret_cast(impl()), flags & GuiFile::FILE_SAVE ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN, nullptr, nullptr)); + chooser = GTK_FILE_CHOOSER(native.get()); +#else + auto widget = gtk_file_chooser_dialog_new( + title.c_str(), + reinterpret_cast(impl()), + flags & GuiFile::FILE_SAVE ? GTK_FILE_CHOOSER_ACTION_SAVE + : GTK_FILE_CHOOSER_ACTION_OPEN, + "_Cancel", + GTK_RESPONSE_CANCEL, + flags & GuiFile::FILE_SAVE ? "_Save" : "_Open", + GTK_RESPONSE_ACCEPT, + NULL); + chooser = GTK_FILE_CHOOSER(widget); +#endif if (flags & GuiFile::FILE_SAVE) { - gtk_file_chooser_set_do_overwrite_confirmation( - GTK_FILE_CHOOSER(chooser.get()), true); + gtk_file_chooser_set_do_overwrite_confirmation(chooser, true); } if (file.empty()) { - gtk_file_chooser_set_filename( - GTK_FILE_CHOOSER(chooser.get()), file.c_str()); + gtk_file_chooser_set_filename(chooser, file.c_str()); } - set_filter(GTK_FILE_CHOOSER(chooser.get()), filter); + set_filter(chooser, filter); std::string ret_file; - auto ret = gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser.get())); +#if GTK_CHECK_VERSION(3, 20, 0) + auto ret = gtk_native_dialog_run(GTK_NATIVE_DIALOG(native.get())); +#else + auto ret = gtk_dialog_run(GTK_DIALOG(widget)); +#endif if (ret == GTK_RESPONSE_ACCEPT) { - ret_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser.get())); + ret_file = gtk_file_chooser_get_filename(chooser); } +#if !GTK_CHECK_VERSION(3, 20, 0) + gtk_widget_destroy(widget); +#endif return ret_file; } @@ -1168,11 +1189,24 @@ public: g_signal_connect(G_OBJECT(v->chooser_), "file-set", G_CALLBACK(file_set), value.get()); } else { +#if GTK_CHECK_VERSION(3, 20, 0) auto chooser = gtk_file_chooser_native_new( v->label_.c_str(), GTK_WINDOW(dialog_), GTK_FILE_CHOOSER_ACTION_SAVE, nullptr, nullptr); +#else + auto chooser = gtk_file_chooser_dialog_new( + v->label_.c_str(), + GTK_WINDOW(dialog_), + GTK_FILE_CHOOSER_ACTION_SAVE, + "_Cancel", + GTK_RESPONSE_CANCEL, + "_Save", + GTK_RESPONSE_ACCEPT, + NULL); +#endif + extra = gtk_button_new_with_label("..."); g_signal_connect(G_OBJECT(extra), "clicked", G_CALLBACK(show_filechooser), v); @@ -1258,7 +1292,11 @@ public: v->value_.clear(); } } else { +#if GTK_CHECK_VERSION(3, 20, 0) g_object_unref(v->chooser_); +#else + gtk_widget_destroy(GTK_WIDGET(v->chooser_)); +#endif } v->chooser_ = nullptr; break; @@ -1385,7 +1423,11 @@ protected: static void show_filechooser(GtkButton*, gpointer user_data) { auto value = reinterpret_cast(user_data); +#if GTK_CHECK_VERSION(3, 20, 0) auto ret = gtk_native_dialog_run(GTK_NATIVE_DIALOG(value->chooser_)); +#else + auto ret = gtk_dialog_run(GTK_DIALOG(value->chooser_)); +#endif if (ret == GTK_RESPONSE_ACCEPT) { auto file = gtk_file_chooser_get_filename(value->chooser_); value->value_ = file; -- cgit v1.2.3-70-g09d2