diff options
-rw-r--r-- | chrome/browser/gtk/bookmark_manager_gtk.cc | 5 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.cc | 5 | ||||
-rw-r--r-- | chrome/browser/gtk/dialogs_gtk.cc | 14 |
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); } |