void InputContext_Impl::process_messages() { throw_if_disposed(); std::vector< std::pair<InputEvent, std::weak_ptr<InputDevice_Impl> > >::size_type pos, size; // Fetch latest events received: std::unique_lock<std::recursive_mutex> mutex_lock(mutex); std::vector< std::pair<InputEvent, std::weak_ptr<InputDevice_Impl> > > cur_events = events; events.clear(); mutex_lock.unlock(); size = cur_events.size(); for (pos = 0; pos < size; pos++) { if (is_disposed()) // Exit the function now if a previous input event has caused the input context to be disposed break; InputEvent event = cur_events[pos].first; if (cur_events[pos].second.expired()) continue; event.device = InputDevice(cur_events[pos].second); switch (event.type) { case InputEvent::pressed: event.device.sig_key_down()(event); break; case InputEvent::released: event.device.sig_key_up()(event); break; case InputEvent::doubleclick: event.device.sig_key_dblclk()(event); break; case InputEvent::pointer_moved: event.device.sig_pointer_move()(event); break; case InputEvent::axis_moved: event.device.sig_axis_move()(event); break; case InputEvent::proximity_change: event.device.sig_proximity_change()(event); break; default: // Added to stop the compiler warning about "no_key" not handled in switch break; } } }
void DisposableObject::throw_if_disposed() const { if (is_disposed()) throw Exception("Object was disposed"); }