| OLD | NEW | 
|    1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2013 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 "ui/base/x/selection_requestor.h" |    5 #include "ui/base/x/selection_requestor.h" | 
|    6  |    6  | 
|    7 #include "base/message_loop/message_pump_aurax11.h" |    7 #include "base/message_loop/message_pump_aurax11.h" | 
|    8 #include "base/run_loop.h" |    8 #include "base/run_loop.h" | 
|    9 #include "ui/base/x/selection_utils.h" |    9 #include "ui/base/x/selection_utils.h" | 
|   10 #include "ui/base/x/x11_util.h" |   10 #include "ui/base/x/x11_util.h" | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|   31       selection_name_(selection_name), |   31       selection_name_(selection_name), | 
|   32       current_target_(None), |   32       current_target_(None), | 
|   33       returned_property_(None), |   33       returned_property_(None), | 
|   34       atom_cache_(x_display_, kAtomsToCache) { |   34       atom_cache_(x_display_, kAtomsToCache) { | 
|   35 } |   35 } | 
|   36  |   36  | 
|   37 SelectionRequestor::~SelectionRequestor() {} |   37 SelectionRequestor::~SelectionRequestor() {} | 
|   38  |   38  | 
|   39 bool SelectionRequestor::PerformBlockingConvertSelection( |   39 bool SelectionRequestor::PerformBlockingConvertSelection( | 
|   40     Atom target, |   40     Atom target, | 
|   41     unsigned char** out_data, |   41     scoped_refptr<base::RefCountedMemory>* out_data, | 
|   42     size_t* out_data_bytes, |   42     size_t* out_data_bytes, | 
|   43     size_t* out_data_items, |   43     size_t* out_data_items, | 
|   44     Atom* out_type) { |   44     Atom* out_type) { | 
|   45   // The name of the property we're asking to be set on |x_window_|. |   45   // The name of the property we're asking to be set on |x_window_|. | 
|   46   Atom property_to_set = atom_cache_.GetAtom(kChromeSelection); |   46   Atom property_to_set = atom_cache_.GetAtom(kChromeSelection); | 
|   47  |   47  | 
|   48   XConvertSelection(x_display_, |   48   XConvertSelection(x_display_, | 
|   49                     selection_name_, |   49                     selection_name_, | 
|   50                     target, |   50                     target, | 
|   51                     property_to_set, |   51                     property_to_set, | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|   66   current_target_ = None; |   66   current_target_ = None; | 
|   67  |   67  | 
|   68   if (returned_property_ != property_to_set) |   68   if (returned_property_ != property_to_set) | 
|   69     return false; |   69     return false; | 
|   70  |   70  | 
|   71   return ui::GetRawBytesOfProperty(x_window_, returned_property_, |   71   return ui::GetRawBytesOfProperty(x_window_, returned_property_, | 
|   72                                    out_data, out_data_bytes, out_data_items, |   72                                    out_data, out_data_bytes, out_data_items, | 
|   73                                    out_type); |   73                                    out_type); | 
|   74 } |   74 } | 
|   75  |   75  | 
|   76 scoped_ptr<SelectionData> SelectionRequestor::RequestAndWaitForTypes( |   76 SelectionData SelectionRequestor::RequestAndWaitForTypes( | 
|   77     const std::vector< ::Atom>& types) { |   77     const std::vector< ::Atom>& types) { | 
|   78   for (std::vector< ::Atom>::const_iterator it = types.begin(); |   78   for (std::vector< ::Atom>::const_iterator it = types.begin(); | 
|   79        it != types.end(); ++it) { |   79        it != types.end(); ++it) { | 
|   80     unsigned char* data = NULL; |   80     scoped_refptr<base::RefCountedMemory> data; | 
|   81     size_t data_bytes = 0; |   81     size_t data_bytes = 0; | 
|   82     ::Atom type = None; |   82     ::Atom type = None; | 
|   83     if (PerformBlockingConvertSelection(*it, |   83     if (PerformBlockingConvertSelection(*it, | 
|   84                                         &data, |   84                                         &data, | 
|   85                                         &data_bytes, |   85                                         &data_bytes, | 
|   86                                         NULL, |   86                                         NULL, | 
|   87                                         &type) && |   87                                         &type) && | 
|   88         type == *it) { |   88         type == *it) { | 
|   89       scoped_ptr<SelectionData> data_out(new SelectionData); |   89       return SelectionData(type, data); | 
|   90       data_out->Set(type, (char*)data, data_bytes, true); |  | 
|   91       return data_out.Pass(); |  | 
|   92     } |   90     } | 
|   93   } |   91   } | 
|   94  |   92  | 
|   95   return scoped_ptr<SelectionData>(); |   93   return SelectionData(); | 
|   96 } |   94 } | 
|   97  |   95  | 
|   98 void SelectionRequestor::OnSelectionNotify(const XSelectionEvent& event) { |   96 void SelectionRequestor::OnSelectionNotify(const XSelectionEvent& event) { | 
|   99   if (!in_nested_loop_) { |   97   if (!in_nested_loop_) { | 
|  100     // This shouldn't happen; we're not waiting on the X server for data, but |   98     // This shouldn't happen; we're not waiting on the X server for data, but | 
|  101     // any client can send any message... |   99     // any client can send any message... | 
|  102     return; |  100     return; | 
|  103   } |  101   } | 
|  104  |  102  | 
|  105   if (selection_name_ == event.selection && |  103   if (selection_name_ == event.selection && | 
|  106       current_target_ == event.target) { |  104       current_target_ == event.target) { | 
|  107     returned_property_ = event.property; |  105     returned_property_ = event.property; | 
|  108   } else { |  106   } else { | 
|  109     // I am assuming that if some other client sent us a message after we've |  107     // I am assuming that if some other client sent us a message after we've | 
|  110     // asked for data, but it's malformed, we should just treat as if they sent |  108     // asked for data, but it's malformed, we should just treat as if they sent | 
|  111     // us an error message. |  109     // us an error message. | 
|  112     returned_property_ = None; |  110     returned_property_ = None; | 
|  113   } |  111   } | 
|  114  |  112  | 
|  115   quit_closure_.Run(); |  113   quit_closure_.Run(); | 
|  116 } |  114 } | 
|  117  |  115  | 
|  118 }  // namespace ui |  116 }  // namespace ui | 
| OLD | NEW |