win: Run async open dialog in new thread
This commit is contained in:
		
					parent
					
						
							
								98127ba13c
							
						
					
				
			
			
				commit
				
					
						253bacdf1d
					
				
			
		
					 2 changed files with 38 additions and 9 deletions
				
			
		|  | @ -15,6 +15,7 @@ | ||||||
| #include "base/strings/string_util.h" | #include "base/strings/string_util.h" | ||||||
| #include "base/strings/string_split.h" | #include "base/strings/string_split.h" | ||||||
| #include "base/strings/utf_string_conversions.h" | #include "base/strings/utf_string_conversions.h" | ||||||
|  | #include "base/threading/thread.h" | ||||||
| #include "base/win/registry.h" | #include "base/win/registry.h" | ||||||
| #include "third_party/wtl/include/atlapp.h" | #include "third_party/wtl/include/atlapp.h" | ||||||
| #include "third_party/wtl/include/atldlgs.h" | #include "third_party/wtl/include/atldlgs.h" | ||||||
|  | @ -113,6 +114,26 @@ class FileDialog { | ||||||
|   DISALLOW_COPY_AND_ASSIGN(FileDialog); |   DISALLOW_COPY_AND_ASSIGN(FileDialog); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | struct RunState { | ||||||
|  |   base::Thread* dialog_thread; | ||||||
|  |   base::MessageLoop* ui_message_loop; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void RunOpenDialogInNewThread(const RunState& run_state, | ||||||
|  |                               atom::NativeWindow* parent, | ||||||
|  |                               const std::string& title, | ||||||
|  |                               const base::FilePath& default_path, | ||||||
|  |                               const Filters& filters, | ||||||
|  |                               int properties, | ||||||
|  |                               const OpenDialogCallback& callback) { | ||||||
|  |   std::vector<base::FilePath> paths; | ||||||
|  |   bool result = ShowOpenDialog(parent, title, default_path, filters, properties, | ||||||
|  |                                &paths); | ||||||
|  |   run_state.ui_message_loop->PostTask(FROM_HERE, | ||||||
|  |                                       base::Bind(callback, result, paths)); | ||||||
|  |   run_state.ui_message_loop->DeleteSoon(FROM_HERE, run_state.dialog_thread); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| }  // namespace
 | }  // namespace
 | ||||||
| 
 | 
 | ||||||
| bool ShowOpenDialog(atom::NativeWindow* parent_window, | bool ShowOpenDialog(atom::NativeWindow* parent_window, | ||||||
|  | @ -162,20 +183,27 @@ bool ShowOpenDialog(atom::NativeWindow* parent_window, | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ShowOpenDialog(atom::NativeWindow* parent_window, | void ShowOpenDialog(atom::NativeWindow* parent, | ||||||
|                     const std::string& title, |                     const std::string& title, | ||||||
|                     const base::FilePath& default_path, |                     const base::FilePath& default_path, | ||||||
|                     const Filters& filters, |                     const Filters& filters, | ||||||
|                     int properties, |                     int properties, | ||||||
|                     const OpenDialogCallback& callback) { |                     const OpenDialogCallback& callback) { | ||||||
|   std::vector<base::FilePath> paths; |   base::Thread* thread = new base::Thread("AtomShell_FileDialogThread"); | ||||||
|   bool result = ShowOpenDialog(parent_window, |   thread->init_com_with_mta(false); | ||||||
|                                title, |   if (!thread->Start()) | ||||||
|                                default_path, |     return; | ||||||
|                                filters, | 
 | ||||||
|                                properties, |   if (parent) | ||||||
|                                &paths); |     EnableWindow( | ||||||
|   callback.Run(result, paths); |         static_cast<atom::NativeWindowViews*>(parent)->GetAcceleratedWidget(), | ||||||
|  |         FALSE); | ||||||
|  | 
 | ||||||
|  |   RunState state = { thread, base::MessageLoop::current() }; | ||||||
|  |   thread->message_loop()->PostTask( | ||||||
|  |       FROM_HERE, | ||||||
|  |       base::Bind(&RunOpenDialogInNewThread, state, parent, title, default_path, | ||||||
|  |                  filters, properties, callback)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ShowSaveDialog(atom::NativeWindow* parent_window, | bool ShowSaveDialog(atom::NativeWindow* parent_window, | ||||||
|  |  | ||||||
|  | @ -136,6 +136,7 @@ | ||||||
|       4005,  # (node.h) macro redefinition |       4005,  # (node.h) macro redefinition | ||||||
|       4189,  # local variable is initialized but not referenced |       4189,  # local variable is initialized but not referenced | ||||||
|       4201,  # (uv.h) nameless struct/union |       4201,  # (uv.h) nameless struct/union | ||||||
|  |       4503,  # decorated name length exceeded, name was truncated | ||||||
|       4800,  # (v8.h) forcing value to bool 'true' or 'false' |       4800,  # (v8.h) forcing value to bool 'true' or 'false' | ||||||
|       4819,  # The file contains a character that cannot be represented in the current code page |       4819,  # The file contains a character that cannot be represented in the current code page | ||||||
|       4996,  # (atlapp.h) 'GetVersionExW': was declared deprecated |       4996,  # (atlapp.h) 'GetVersionExW': was declared deprecated | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cheng Zhao
				Cheng Zhao