Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: chrome/browser/ui/gtk/dialogs_kde.cc

Issue 8524019: Linux: Use --embed for dialogs on KDE3; Clean up dialogs_kde.cc. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/gtk/dialogs_common.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <gdk/gdkx.h> 5 #include <gdk/gdkx.h>
6 #include <gtk/gtk.h> 6 #include <gtk/gtk.h>
7 #include <map> 7
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/file_util.h"
14 #include "base/logging.h" 13 #include "base/logging.h"
15 #include "base/message_loop.h"
16 #include "base/mime_util.h" 14 #include "base/mime_util.h"
15 #include "base/nix/xdg_util.h"
17 #include "base/process_util.h" 16 #include "base/process_util.h"
18 #include "base/string_number_conversions.h" 17 #include "base/string_number_conversions.h"
19 #include "base/string_util.h" 18 #include "base/string_util.h"
20 #include "base/sys_string_conversions.h"
21 #include "base/threading/thread.h"
22 #include "base/threading/thread_restrictions.h"
23 #include "base/utf_string_conversions.h" 19 #include "base/utf_string_conversions.h"
24 #include "chrome/browser/ui/gtk/dialogs_common.h" 20 #include "chrome/browser/ui/gtk/dialogs_common.h"
25 #include "chrome/browser/ui/shell_dialogs.h"
26 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/browser_thread.h"
27 #include "grit/generated_resources.h" 22 #include "grit/generated_resources.h"
28 #include "ui/base/l10n/l10n_util.h" 23 #include "ui/base/l10n/l10n_util.h"
29 24
30 using content::BrowserThread; 25 using content::BrowserThread;
31 26
27 namespace {
28
29 std::string GetTitle(const std::string& title, int message_id) {
30 return title.empty() ? l10n_util::GetStringUTF8(message_id) : title;
31 }
32
33 } // namespace
34
32 // Implementation of SelectFileDialog that shows a KDE common dialog for 35 // Implementation of SelectFileDialog that shows a KDE common dialog for
33 // choosing a file or folder. This acts as a modal dialog. 36 // choosing a file or folder. This acts as a modal dialog.
34 class SelectFileDialogImplKDE : public SelectFileDialogImpl { 37 class SelectFileDialogImplKDE : public SelectFileDialogImpl {
35 public: 38 public:
36 explicit SelectFileDialogImplKDE(Listener* listener); 39 SelectFileDialogImplKDE(Listener* listener,
40 base::nix::DesktopEnvironment desktop);
37 ~SelectFileDialogImplKDE(); 41 ~SelectFileDialogImplKDE();
38 42
39 protected: 43 protected:
40 // SelectFileDialog implementation. 44 // SelectFileDialog implementation.
41 // |params| is user data we pass back via the Listener interface. 45 // |params| is user data we pass back via the Listener interface.
42 virtual void SelectFileImpl(Type type, 46 virtual void SelectFileImpl(Type type,
43 const string16& title, 47 const string16& title,
44 const FilePath& default_path, 48 const FilePath& default_path,
45 const FileTypeInfo* file_types, 49 const FileTypeInfo* file_types,
46 int file_type_index, 50 int file_type_index,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 void SelectSingleFileHelper(const std::string& output, int exit_code, 103 void SelectSingleFileHelper(const std::string& output, int exit_code,
100 void* params, bool allow_folder); 104 void* params, bool allow_folder);
101 105
102 void OnSelectSingleFileDialogResponse(const std::string& output, 106 void OnSelectSingleFileDialogResponse(const std::string& output,
103 int exit_code, void* params); 107 int exit_code, void* params);
104 void OnSelectMultiFileDialogResponse(const std::string& output, 108 void OnSelectMultiFileDialogResponse(const std::string& output,
105 int exit_code, void* params); 109 int exit_code, void* params);
106 void OnSelectSingleFolderDialogResponse(const std::string& output, 110 void OnSelectSingleFolderDialogResponse(const std::string& output,
107 int exit_code, void* params); 111 int exit_code, void* params);
108 112
113 // Should be either DESKTOP_ENVIRONMENT_KDE3 or DESKTOP_ENVIRONMENT_KDE4.
114 base::nix::DesktopEnvironment desktop_;
115
109 DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImplKDE); 116 DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImplKDE);
110 }; 117 };
111 118
119 // static
112 SelectFileDialogImpl* SelectFileDialogImpl::NewSelectFileDialogImplKDE( 120 SelectFileDialogImpl* SelectFileDialogImpl::NewSelectFileDialogImplKDE(
113 Listener* listener) { 121 Listener* listener, base::nix::DesktopEnvironment desktop) {
114 return new SelectFileDialogImplKDE(listener); 122 return new SelectFileDialogImplKDE(listener, desktop);
115 } 123 }
116 124
117 SelectFileDialogImplKDE::SelectFileDialogImplKDE(Listener* listener) 125 SelectFileDialogImplKDE::SelectFileDialogImplKDE(
118 : SelectFileDialogImpl(listener) { 126 Listener* listener,
127 base::nix::DesktopEnvironment desktop)
128 : SelectFileDialogImpl(listener),
129 desktop_(desktop) {
130 DCHECK(desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE3 ||
131 desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE4);
119 } 132 }
120 133
121 SelectFileDialogImplKDE::~SelectFileDialogImplKDE() { 134 SelectFileDialogImplKDE::~SelectFileDialogImplKDE() {
122 } 135 }
123 136
124 // We ignore |default_extension|. 137 // We ignore |default_extension|.
125 void SelectFileDialogImplKDE::SelectFileImpl( 138 void SelectFileDialogImplKDE::SelectFileImpl(
126 Type type, 139 Type type,
127 const string16& title, 140 const string16& title,
128 const FilePath& default_path, 141 const FilePath& default_path,
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 240
228 void SelectFileDialogImplKDE::GetKDialogCommandLine(const std::string& type, 241 void SelectFileDialogImplKDE::GetKDialogCommandLine(const std::string& type,
229 const std::string& title, const FilePath& path, 242 const std::string& title, const FilePath& path,
230 gfx::NativeWindow parent, bool file_operation, bool multiple_selection, 243 gfx::NativeWindow parent, bool file_operation, bool multiple_selection,
231 CommandLine* command_line) { 244 CommandLine* command_line) {
232 if (!command_line) { 245 if (!command_line) {
233 VLOG(1) << "Command line for KDialog is NULL" << std::endl; 246 VLOG(1) << "Command line for KDialog is NULL" << std::endl;
234 return; 247 return;
235 } 248 }
236 // Attach to the current Chrome window. 249 // Attach to the current Chrome window.
237 GdkWindow* gdk_window = 250 GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET((parent)));
238 gtk_widget_get_window(GTK_WIDGET((parent)));
239 int window_id = GDK_DRAWABLE_XID(gdk_window); 251 int window_id = GDK_DRAWABLE_XID(gdk_window);
240 command_line->AppendSwitchNative("--attach", base::IntToString(window_id)); 252 command_line->AppendSwitchNative(
253 desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE3 ? "--embed" : "--attach",
254 base::IntToString(window_id));
241 // Set the correct title for the dialog. 255 // Set the correct title for the dialog.
242 if (!title.empty()) { 256 if (!title.empty())
243 command_line->AppendSwitchNative("--title", title); 257 command_line->AppendSwitchNative("--title", title);
244 }
245 // Enable multiple file selection if we need to. 258 // Enable multiple file selection if we need to.
246 if (multiple_selection) { 259 if (multiple_selection) {
247 command_line->AppendSwitch("--multiple"); 260 command_line->AppendSwitch("--multiple");
248 command_line->AppendSwitch("--separate-output"); 261 command_line->AppendSwitch("--separate-output");
249 } 262 }
250 command_line->AppendSwitch(type); 263 command_line->AppendSwitch(type);
251 // The path should never be empty. If it is, set it to PWD. 264 // The path should never be empty. If it is, set it to PWD.
252 if (path.empty()) { 265 if (path.empty())
253 command_line->AppendArgPath(FilePath(".")); 266 command_line->AppendArgPath(FilePath("."));
254 } else { 267 else
255 command_line->AppendArgPath(path); 268 command_line->AppendArgPath(path);
256 }
257 // Depending on the type of the operation we need, get the path to the 269 // Depending on the type of the operation we need, get the path to the
258 // file/folder and set up mime type filters. 270 // file/folder and set up mime type filters.
259 if (file_operation) { 271 if (file_operation)
260 command_line->AppendArg(GetMimeTypeFilterString()); 272 command_line->AppendArg(GetMimeTypeFilterString());
261 }
262 VLOG(1) << "KDialog command line: " 273 VLOG(1) << "KDialog command line: "
263 << command_line->GetCommandLineString() << std::endl; 274 << command_line->GetCommandLineString() << std::endl;
264 } 275 }
265 276
266 void SelectFileDialogImplKDE::FileSelected(const FilePath& path, void* params) { 277 void SelectFileDialogImplKDE::FileSelected(const FilePath& path, void* params) {
267 if (type_ == SELECT_SAVEAS_FILE) 278 if (type_ == SELECT_SAVEAS_FILE)
268 *last_saved_path_ = path.DirName(); 279 *last_saved_path_ = path.DirName();
269 else if (type_ == SELECT_OPEN_FILE) 280 else if (type_ == SELECT_OPEN_FILE)
270 *last_opened_path_ = path.DirName(); 281 *last_opened_path_ = path.DirName();
271 else if (type_ == SELECT_FOLDER) 282 else if (type_ == SELECT_FOLDER)
(...skipping 14 matching lines...) Expand all
286 } 297 }
287 298
288 void SelectFileDialogImplKDE::FileNotSelected(void* params) { 299 void SelectFileDialogImplKDE::FileNotSelected(void* params) {
289 if (listener_) 300 if (listener_)
290 listener_->FileSelectionCanceled(params); 301 listener_->FileSelectionCanceled(params);
291 } 302 }
292 303
293 void SelectFileDialogImplKDE::CreateSelectFolderDialog( 304 void SelectFileDialogImplKDE::CreateSelectFolderDialog(
294 const std::string& title, const FilePath& default_path, 305 const std::string& title, const FilePath& default_path,
295 gfx::NativeWindow parent, void *params) { 306 gfx::NativeWindow parent, void *params) {
296 std::string title_string = !title.empty() ? title :
297 l10n_util::GetStringUTF8(IDS_SELECT_FOLDER_DIALOG_TITLE);
298
299 Task* dialog_task = 307 Task* dialog_task =
300 NewRunnableMethod( 308 NewRunnableMethod(
301 this, &SelectFileDialogImplKDE::CallKDialogOutput, 309 this, &SelectFileDialogImplKDE::CallKDialogOutput,
302 std::string("--getexistingdirectory"), title, 310 std::string("--getexistingdirectory"),
311 GetTitle(title, IDS_SELECT_FOLDER_DIALOG_TITLE),
303 default_path.empty() ? *last_opened_path_ : default_path, 312 default_path.empty() ? *last_opened_path_ : default_path,
304 parent, false, false, params, 313 parent, false, false, params,
305 &SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse); 314 &SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse);
306 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task); 315 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task);
307 } 316 }
308 317
309 void SelectFileDialogImplKDE::CreateFileOpenDialog( 318 void SelectFileDialogImplKDE::CreateFileOpenDialog(
310 const std::string& title, const FilePath& default_path, 319 const std::string& title, const FilePath& default_path,
311 gfx::NativeWindow parent, void* params) { 320 gfx::NativeWindow parent, void* params) {
312 std::string title_string = !title.empty() ? title :
313 l10n_util::GetStringUTF8(IDS_OPEN_FILE_DIALOG_TITLE);
314
315 Task* dialog_task = 321 Task* dialog_task =
316 NewRunnableMethod( 322 NewRunnableMethod(
317 this, &SelectFileDialogImplKDE::CallKDialogOutput, 323 this, &SelectFileDialogImplKDE::CallKDialogOutput,
318 std::string("--getopenfilename"), title, 324 std::string("--getopenfilename"),
325 GetTitle(title, IDS_OPEN_FILE_DIALOG_TITLE),
319 default_path.empty() ? *last_opened_path_ : default_path, 326 default_path.empty() ? *last_opened_path_ : default_path,
320 parent, true, false, params, 327 parent, true, false, params,
321 &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse); 328 &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse);
322 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task); 329 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task);
323 } 330 }
324 331
325 void SelectFileDialogImplKDE::CreateMultiFileOpenDialog( 332 void SelectFileDialogImplKDE::CreateMultiFileOpenDialog(
326 const std::string& title, const FilePath& default_path, 333 const std::string& title, const FilePath& default_path,
327 gfx::NativeWindow parent, void* params) { 334 gfx::NativeWindow parent, void* params) {
328 std::string title_string = !title.empty() ? title :
329 l10n_util::GetStringUTF8(IDS_OPEN_FILES_DIALOG_TITLE);
330
331 Task* dialog_task = 335 Task* dialog_task =
332 NewRunnableMethod( 336 NewRunnableMethod(
333 this, &SelectFileDialogImplKDE::CallKDialogOutput, 337 this, &SelectFileDialogImplKDE::CallKDialogOutput,
334 std::string("--getopenfilename"), title, 338 std::string("--getopenfilename"),
339 GetTitle(title, IDS_OPEN_FILES_DIALOG_TITLE),
335 default_path.empty() ? *last_opened_path_ : default_path, 340 default_path.empty() ? *last_opened_path_ : default_path,
336 parent, true, true, params, 341 parent, true, true, params,
337 &SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse); 342 &SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse);
338 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task); 343 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task);
339 } 344 }
340 345
341 void SelectFileDialogImplKDE::CreateSaveAsDialog( 346 void SelectFileDialogImplKDE::CreateSaveAsDialog(
342 const std::string& title, const FilePath& default_path, 347 const std::string& title, const FilePath& default_path,
343 gfx::NativeWindow parent, void* params) { 348 gfx::NativeWindow parent, void* params) {
344 std::string title_string = !title.empty() ? title :
345 l10n_util::GetStringUTF8(IDS_SAVE_AS_DIALOG_TITLE);
346
347 Task* dialog_task = 349 Task* dialog_task =
348 NewRunnableMethod( 350 NewRunnableMethod(
349 this, &SelectFileDialogImplKDE::CallKDialogOutput, 351 this, &SelectFileDialogImplKDE::CallKDialogOutput,
350 std::string("--getsavefilename"), title, 352 std::string("--getsavefilename"),
353 GetTitle(title, IDS_SAVE_AS_DIALOG_TITLE),
351 default_path.empty() ? *last_saved_path_ : default_path, 354 default_path.empty() ? *last_saved_path_ : default_path,
352 parent, true, false, params, 355 parent, true, false, params,
353 &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse); 356 &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse);
354 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task); 357 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, dialog_task);
355 } 358 }
356 359
357 void SelectFileDialogImplKDE::SelectSingleFileHelper(const std::string& output, 360 void SelectFileDialogImplKDE::SelectSingleFileHelper(const std::string& output,
358 int exit_code, void* params, bool allow_folder) { 361 int exit_code, void* params, bool allow_folder) {
359 VLOG(1) << "[kdialog] SingleFileResponse: " << output << std::endl; 362 VLOG(1) << "[kdialog] SingleFileResponse: " << output << std::endl;
360 if (exit_code != 0 || output.empty()) { 363 if (exit_code != 0 || output.empty()) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 continue; 409 continue;
407 filenames_fp.push_back(path); 410 filenames_fp.push_back(path);
408 } 411 }
409 412
410 if (filenames_fp.empty()) { 413 if (filenames_fp.empty()) {
411 FileNotSelected(params); 414 FileNotSelected(params);
412 return; 415 return;
413 } 416 }
414 MultiFilesSelected(filenames_fp, params); 417 MultiFilesSelected(filenames_fp, params);
415 } 418 }
416
OLDNEW
« no previous file with comments | « chrome/browser/ui/gtk/dialogs_common.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698