From e60bf0b098e297adbaba51600854c14196a5fc6b Mon Sep 17 00:00:00 2001 From: Ciure Andrei Date: Thu, 11 Oct 2018 07:23:28 +0300 Subject: [PATCH] Backed out changeset 8ed536957a4b (bug 1490186) for FilePicker.cpp build bustages CLOSED TREE --- widget/gtk/nsFilePicker.cpp | 129 ++++++++++-------------------------- widget/gtk/nsFilePicker.h | 17 ++--- 2 files changed, 38 insertions(+), 108 deletions(-) diff --git a/widget/gtk/nsFilePicker.cpp b/widget/gtk/nsFilePicker.cpp index dd9b4bce315e..5caa99b71bf6 100644 --- a/widget/gtk/nsFilePicker.cpp +++ b/widget/gtk/nsFilePicker.cpp @@ -197,7 +197,7 @@ ReadMultipleFiles(gpointer filename, gpointer array) } void -nsFilePicker::ReadValuesFromFileChooser(void *file_chooser) +nsFilePicker::ReadValuesFromFileChooser(GtkWidget *file_chooser) { mFiles.Clear(); @@ -389,10 +389,19 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback) if (!mOkButtonLabel.IsEmpty()) { accept_button = buttonLabel.get(); } else { - accept_button = nullptr; + accept_button = (action == GTK_FILE_CHOOSER_ACTION_SAVE) ? + GTK_STOCK_SAVE : GTK_STOCK_OPEN; } - void *file_chooser = GtkFileChooserNew(title.get(), parent_widget, action, accept_button); + GtkWidget *file_chooser = + gtk_file_chooser_dialog_new(title.get(), parent_widget, action, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + accept_button, GTK_RESPONSE_ACCEPT, + nullptr); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(file_chooser), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); // If we have --enable-proxy-bypass-protection, then don't allow // remote URLs to be used. @@ -408,7 +417,11 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback) g_signal_connect(file_chooser, "update-preview", G_CALLBACK(UpdateFilePreviewWidget), img_preview); } - GtkFileChooserSetModal(file_chooser, parent_widget, TRUE); + GtkWindow *window = GTK_WINDOW(file_chooser); + gtk_window_set_modal(window, TRUE); + if (parent_widget) { + gtk_window_set_destroy_with_parent(window, TRUE); + } NS_ConvertUTF16toUTF8 defaultName(mDefault); switch (mMode) { @@ -446,21 +459,18 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback) // Otherwise, if our dialog gets destroyed, we'll lose the dialog's // delegate by the time this gets processed in the event loop. // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1166741 - if (GTK_IS_DIALOG(file_chooser)) { - GtkDialog *dialog = GTK_DIALOG(file_chooser); - GtkContainer *area = GTK_CONTAINER(gtk_dialog_get_content_area(dialog)); - gtk_container_forall(area, [](GtkWidget *widget, - gpointer data) { - if (GTK_IS_FILE_CHOOSER_WIDGET(widget)) { - auto result = static_cast(data); - *result = GTK_FILE_CHOOSER_WIDGET(widget); - } - }, &mFileChooserDelegate); + GtkDialog *dialog = GTK_DIALOG(file_chooser); + GtkContainer *area = GTK_CONTAINER(gtk_dialog_get_content_area(dialog)); + gtk_container_forall(area, [](GtkWidget *widget, + gpointer data) { + if (GTK_IS_FILE_CHOOSER_WIDGET(widget)) { + auto result = static_cast(data); + *result = GTK_FILE_CHOOSER_WIDGET(widget); + } + }, &mFileChooserDelegate); - if (mFileChooserDelegate != nullptr) { - g_object_ref(mFileChooserDelegate); - } - } + if (mFileChooserDelegate) + g_object_ref(mFileChooserDelegate); #endif gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser), @@ -468,9 +478,7 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback) } } - if (GTK_IS_DIALOG(file_chooser)) { - gtk_dialog_set_default_response(GTK_DIALOG(file_chooser), GTK_RESPONSE_ACCEPT); - } + gtk_dialog_set_default_response(GTK_DIALOG(file_chooser), GTK_RESPONSE_ACCEPT); int32_t count = mFilters.Length(); for (int32_t i = 0; i < count; ++i) { @@ -514,13 +522,14 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback) mCallback = aCallback; NS_ADDREF_THIS(); g_signal_connect(file_chooser, "response", G_CALLBACK(OnResponse), this); - GtkFileChooserShow(file_chooser); + g_signal_connect(file_chooser, "destroy", G_CALLBACK(OnDestroy), this); + gtk_widget_show(file_chooser); return NS_OK; } /* static */ void -nsFilePicker::OnResponse(void* file_chooser, gint response_id, +nsFilePicker::OnResponse(GtkWidget* file_chooser, gint response_id, gpointer user_data) { static_cast(user_data)-> @@ -535,7 +544,7 @@ nsFilePicker::OnDestroy(GtkWidget* file_chooser, gpointer user_data) } void -nsFilePicker::Done(void* file_chooser, gint response) +nsFilePicker::Done(GtkWidget* file_chooser, gint response) { mRunning = false; @@ -579,7 +588,7 @@ nsFilePicker::Done(void* file_chooser, gint response) // requests that any remaining references be released, but the reference // count will not be decremented again if GtkWindow's reference has already // been released. - GtkFileChooserDestroy(file_chooser); + gtk_widget_destroy(file_chooser); #ifdef MOZ_WIDGET_GTK if (mFileChooserDelegate) { @@ -604,73 +613,3 @@ nsFilePicker::Done(void* file_chooser, gint response) } NS_RELEASE_THIS(); } - -// All below functions available as of GTK 3.20+ - -void * -nsFilePicker::GtkFileChooserNew( - const gchar *title, GtkWindow *parent, - GtkFileChooserAction action, - const gchar *accept_label) -{ - static auto sGtkFileChooserNativeNewPtr = (GtkFileChooserNative * (*)( - const gchar *, GtkWindow *, - GtkFileChooserAction, - const gchar *, const gchar *)) - dlsym(RTLD_DEFAULT, "gtk_file_chooser_native_new"); - if (sGtkFileChooserNativeNewPtr != nullptr) { - return (*sGtkFileChooserNativeNewPtr)(title, parent, action, accept_label, nullptr); - } - if (accept_label == nullptr) { - accept_label = (action == GTK_FILE_CHOOSER_ACTION_SAVE) - ? GTK_STOCK_SAVE : GTK_STOCK_OPEN; - } - GtkWidget *file_chooser = gtk_file_chooser_dialog_new(title, parent, action, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - accept_label, GTK_RESPONSE_ACCEPT, nullptr); - gtk_dialog_set_alternative_button_order(GTK_DIALOG(file_chooser), - GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); - return file_chooser; -} - -void -nsFilePicker::GtkFileChooserShow(void *file_chooser) -{ - static auto sGtkNativeDialogShowPtr = (void (*)(void *)) - dlsym(RTLD_DEFAULT, "gtk_native_dialog_show"); - if (sGtkNativeDialogShowPtr != nullptr) { - (*sGtkNativeDialogShowPtr)(file_chooser); - } else { - g_signal_connect(file_chooser, "destroy", G_CALLBACK(OnDestroy), this); - gtk_widget_show(GTK_WIDGET(file_chooser)); - } -} - -void -nsFilePicker::GtkFileChooserDestroy(void *file_chooser) -{ - static auto sGtkNativeDialogDestroyPtr = (void (*)(void *)) - dlsym(RTLD_DEFAULT, "gtk_native_dialog_destroy"); - if (sGtkNativeDialogDestroyPtr != nullptr) { - (*sGtkNativeDialogDestroyPtr)(file_chooser); - } else { - gtk_widget_destroy(GTK_WIDGET(file_chooser)); - } -} - -void -nsFilePicker::GtkFileChooserSetModal(void *file_chooser, - GtkWindow *parent_widget, gboolean modal) -{ - static auto sGtkNativeDialogSetModalPtr = (void (*)(void *, gboolean)) - dlsym(RTLD_DEFAULT, "gtk_native_dialog_set_modal"); - if (sGtkNativeDialogSetModalPtr != nullptr) { - (*sGtkNativeDialogSetModalPtr)(file_chooser, modal); - } else { - GtkWindow *window = GTK_WINDOW(file_chooser); - gtk_window_set_modal(window, modal); - if (parent_widget != nullptr) { - gtk_window_set_destroy_with_parent(window, modal); - } - } -} diff --git a/widget/gtk/nsFilePicker.h b/widget/gtk/nsFilePicker.h index 1ebe06f8838b..a90ac28c7dce 100644 --- a/widget/gtk/nsFilePicker.h +++ b/widget/gtk/nsFilePicker.h @@ -48,12 +48,12 @@ protected: virtual ~nsFilePicker(); nsresult Show(int16_t *aReturn) override; - void ReadValuesFromFileChooser(void *file_chooser); + void ReadValuesFromFileChooser(GtkWidget *file_chooser); - static void OnResponse(void* file_chooser, gint response_id, + static void OnResponse(GtkWidget* dialog, gint response_id, gpointer user_data); - static void OnDestroy(GtkWidget* file_chooser, gpointer user_data); - void Done(void* file_chooser, gint response_id); + static void OnDestroy(GtkWidget* dialog, gpointer user_data); + void Done(GtkWidget* dialog, gint response_id); nsCOMPtr mParentWidget; nsCOMPtr mCallback; @@ -74,15 +74,6 @@ protected: private: static nsIFile *mPrevDisplayDirectory; - void *GtkFileChooserNew( - const gchar *title, GtkWindow *parent, - GtkFileChooserAction action, - const gchar *accept_label); - void GtkFileChooserShow(void *file_chooser); - void GtkFileChooserDestroy(void *file_chooser); - void GtkFileChooserSetModal(void *file_chooser, GtkWindow* parent_widget, - gboolean modal); - #ifdef MOZ_WIDGET_GTK GtkFileChooserWidget *mFileChooserDelegate; #endif