OLD | NEW |
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2008 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 "base/message_pump_glib.h" | 5 #include "base/message_pump_glib.h" |
6 | 6 |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <math.h> | 8 #include <math.h> |
9 | 9 |
10 #include "base/eintr_wrapper.h" | 10 #include "base/eintr_wrapper.h" |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 | 146 |
147 MessagePumpForUI::~MessagePumpForUI() { | 147 MessagePumpForUI::~MessagePumpForUI() { |
148 gdk_event_handler_set(reinterpret_cast<GdkEventFunc>(gtk_main_do_event), | 148 gdk_event_handler_set(reinterpret_cast<GdkEventFunc>(gtk_main_do_event), |
149 this, NULL); | 149 this, NULL); |
150 g_source_destroy(work_source_); | 150 g_source_destroy(work_source_); |
151 g_source_unref(work_source_); | 151 g_source_unref(work_source_); |
152 close(wakeup_pipe_read_); | 152 close(wakeup_pipe_read_); |
153 close(wakeup_pipe_write_); | 153 close(wakeup_pipe_write_); |
154 } | 154 } |
155 | 155 |
156 void MessagePumpForUI::Run(Delegate* delegate) { | 156 void MessagePumpForUI::RunWithDispatcher(Delegate* delegate, |
| 157 Dispatcher* dispatcher) { |
157 #ifndef NDEBUG | 158 #ifndef NDEBUG |
158 // Make sure we only run this on one thread. GTK only has one message pump | 159 // Make sure we only run this on one thread. GTK only has one message pump |
159 // so we can only have one UI loop per process. | 160 // so we can only have one UI loop per process. |
160 static PlatformThreadId thread_id = PlatformThread::CurrentId(); | 161 static PlatformThreadId thread_id = PlatformThread::CurrentId(); |
161 DCHECK(thread_id == PlatformThread::CurrentId()) << | 162 DCHECK(thread_id == PlatformThread::CurrentId()) << |
162 "Running MessagePumpForUI on two different threads; " | 163 "Running MessagePumpForUI on two different threads; " |
163 "this is unsupported by GLib!"; | 164 "this is unsupported by GLib!"; |
164 #endif | 165 #endif |
165 | 166 |
166 RunState state; | 167 RunState state; |
167 state.delegate = delegate; | 168 state.delegate = delegate; |
| 169 state.dispatcher = dispatcher; |
168 state.should_quit = false; | 170 state.should_quit = false; |
169 state.run_depth = state_ ? state_->run_depth + 1 : 1; | 171 state.run_depth = state_ ? state_->run_depth + 1 : 1; |
170 state.has_work = false; | 172 state.has_work = false; |
171 | 173 |
172 RunState* previous_state = state_; | 174 RunState* previous_state = state_; |
173 state_ = &state; | 175 state_ = &state; |
174 | 176 |
175 // We really only do a single task for each iteration of the loop. If we | 177 // We really only do a single task for each iteration of the loop. If we |
176 // have done something, assume there is likely something more to do. This | 178 // have done something, assume there is likely something more to do. This |
177 // will mean that we don't block on the message pump until there was nothing | 179 // will mean that we don't block on the message pump until there was nothing |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 | 304 |
303 void MessagePumpForUI::ScheduleDelayedWork(const Time& delayed_work_time) { | 305 void MessagePumpForUI::ScheduleDelayedWork(const Time& delayed_work_time) { |
304 // We need to wake up the loop in case the poll timeout needs to be | 306 // We need to wake up the loop in case the poll timeout needs to be |
305 // adjusted. This will cause us to try to do work, but that's ok. | 307 // adjusted. This will cause us to try to do work, but that's ok. |
306 delayed_work_time_ = delayed_work_time; | 308 delayed_work_time_ = delayed_work_time; |
307 ScheduleWork(); | 309 ScheduleWork(); |
308 } | 310 } |
309 | 311 |
310 // static | 312 // static |
311 void MessagePumpForUI::EventDispatcher(GdkEvent* event, gpointer data) { | 313 void MessagePumpForUI::EventDispatcher(GdkEvent* event, gpointer data) { |
312 reinterpret_cast<MessagePumpForUI*>(data)->WillProcessEvent(event); | 314 MessagePumpForUI* message_pump = reinterpret_cast<MessagePumpForUI*>(data); |
313 gtk_main_do_event(event); | 315 |
314 reinterpret_cast<MessagePumpForUI*>(data)->DidProcessEvent(event); | 316 message_pump->WillProcessEvent(event); |
| 317 if (message_pump->state_->dispatcher) { |
| 318 if (!message_pump->state_->dispatcher->Dispatch(event)) |
| 319 message_pump->state_->should_quit = true; |
| 320 } else { |
| 321 gtk_main_do_event(event); |
| 322 } |
| 323 message_pump->DidProcessEvent(event); |
315 } | 324 } |
316 | 325 |
317 } // namespace base | 326 } // namespace base |
OLD | NEW |