| Index: chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc
|
| diff --git a/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc b/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc
|
| index 6a0cb7cb8957ab5ace97619c5bbc2c51ddd44b7f..05a0932b367a1021bc52e3f4b49d26c63875a7ff 100644
|
| --- a/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc
|
| +++ b/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc
|
| @@ -2,6 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include <gdk/gdkx.h>
|
| #include <gtk/gtk.h>
|
| #include <sys/stat.h>
|
| #include <sys/types.h>
|
| @@ -29,6 +30,7 @@
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/shell_dialogs/select_file_dialog.h"
|
| #include "ui/strings/grit/ui_strings.h"
|
| +#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
|
| #include "ui/views/widget/desktop_aura/x11_desktop_handler.h"
|
|
|
| namespace {
|
| @@ -57,6 +59,9 @@ class SelectFileDialogImplGTK : public SelectFileDialogImpl,
|
| explicit SelectFileDialogImplGTK(Listener* listener,
|
| ui::SelectFilePolicy* policy);
|
|
|
| + // Close the file dialog.
|
| + void Close() override;
|
| +
|
| protected:
|
| ~SelectFileDialogImplGTK() override;
|
|
|
| @@ -289,6 +294,39 @@ void SelectFileDialogImplGTK::SelectFileImpl(
|
| gtk_window_present_with_time(GTK_WINDOW(dialog), time);
|
| }
|
|
|
| +void SelectFileDialogImplGTK::Close() {
|
| + // Close the file-picker by sending an ESC key event to it.
|
| +
|
| + // Get the focused dialog.
|
| + XID focused_window = 0;
|
| + int revert = 0;
|
| + XGetInputFocus(gfx::GetXDisplay(), &focused_window, &revert);
|
| +
|
| + // Check if the focused window is the file-picker dialog.
|
| + bool is_dialog_focused = false;
|
| + for (auto it = dialogs_.begin(); it != dialogs_.end(); ++it) {
|
| + if (focused_window == GDK_WINDOW_XID(gtk_widget_get_window(*it))) {
|
| + is_dialog_focused = true;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + if (!is_dialog_focused) {
|
| + NOTREACHED() << "Cannot find the focused dialog";
|
| + return;
|
| + }
|
| +
|
| + // Send an ESC key event to the focused dialog.
|
| + XKeyEvent event = {0};
|
| + event.display = gfx::GetXDisplay();
|
| + event.window = focused_window;
|
| + event.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Escape);
|
| + event.type = KeyPress;
|
| +
|
| + XSendEvent(gfx::GetXDisplay(), focused_window, True, KeyPressMask,
|
| + reinterpret_cast<XEvent*>(&event));
|
| +}
|
| +
|
| void SelectFileDialogImplGTK::AddFilters(GtkFileChooser* chooser) {
|
| for (size_t i = 0; i < file_types_.extensions.size(); ++i) {
|
| GtkFileFilter* filter = NULL;
|
|
|