summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/gtk/bookmark_manager_gtk.cc5
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc5
-rw-r--r--chrome/browser/gtk/dialogs_gtk.cc14
3 files changed, 18 insertions, 6 deletions
diff --git a/chrome/browser/gtk/bookmark_manager_gtk.cc b/chrome/browser/gtk/bookmark_manager_gtk.cc
index dab3508..e1c43ae 100644
--- a/chrome/browser/gtk/bookmark_manager_gtk.cc
+++ b/chrome/browser/gtk/bookmark_manager_gtk.cc
@@ -328,6 +328,11 @@ void BookmarkManagerGtk::InitWidgets() {
gtk_window_set_title(GTK_WINDOW(window_),
l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TITLE).c_str());
+ // Add this window to its own unique window group to allow for
+ // window-to-parent modality.
+ gtk_window_group_add_window(gtk_window_group_new(), GTK_WINDOW(window_));
+ g_object_unref(gtk_window_get_group(GTK_WINDOW(window_)));
+
// Set the default size of the bookmark manager.
int width, height;
gtk_util::GetWidgetSizeFromResources(window_,
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index de819b0..e716d79 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -385,6 +385,11 @@ BrowserWindowGtk::BrowserWindowGtk(Browser* browser)
gtk_widget_add_events(GTK_WIDGET(window_), GDK_BUTTON_PRESS_MASK |
GDK_POINTER_MOTION_MASK);
+ // Add this window to its own unique window group to allow for
+ // window-to-parent modality.
+ gtk_window_group_add_window(gtk_window_group_new(), window_);
+ g_object_unref(gtk_window_get_group(window_));
+
SetWindowIcon();
SetBackgroundColor();
SetGeometryHints();
diff --git a/chrome/browser/gtk/dialogs_gtk.cc b/chrome/browser/gtk/dialogs_gtk.cc
index 62de9ce6..3a32526 100644
--- a/chrome/browser/gtk/dialogs_gtk.cc
+++ b/chrome/browser/gtk/dialogs_gtk.cc
@@ -27,11 +27,7 @@ static const int kPreviewHeight = 512;
// Implementation of SelectFileDialog that shows a Gtk common dialog for
// choosing a file or folder.
-// This acts as a modal dialog. Ideally we want to only act modally for the
-// parent window and allow other toplevel chrome windows to still function while
-// the dialog is showing, but we need the GtkWindowGroup or something similar to
-// get that, and that API is only available in more recent versions of GTK.
-// TODO(port): fix modality: crbug.com/8727
+// This acts as a modal dialog.
class SelectFileDialogImpl : public SelectFileDialog {
public:
explicit SelectFileDialogImpl(Listener* listener);
@@ -208,7 +204,13 @@ void SelectFileDialogImpl::SelectFile(
gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview_);
params_map_[dialog] = params;
- gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+
+ // Set window-to-parent modality by adding the dialog to the same window
+ // group as the parent, and calling gtk_grab_add(...)
+ gtk_window_group_add_window(gtk_window_get_group(owning_window),
+ GTK_WINDOW(dialog));
+ gtk_grab_add(dialog);
+
gtk_widget_show_all(dialog);
}