| 498 | } |
| 499 | |
| 500 | void TouchDispatcher::dispatch() { |
| 501 | if (!_events.empty() && !_handlers.empty()) { |
| 502 | for (auto it = _handlers.rbegin(); it != _handlers.rend(); ++it) { |
| 503 | auto handler = it->lock(); |
| 504 | for (auto eit = _events.begin(); eit != _events.end();) { |
| 505 | auto e = std::any_cast<SDL_Event>(&(*eit)); |
| 506 | if (handler && handler->handle(*e)) { |
| 507 | eit = _events.erase(eit); |
| 508 | } else { |
| 509 | ++eit; |
| 510 | } |
| 511 | } |
| 512 | if (_events.empty()) { |
| 513 | break; |
| 514 | } |
| 515 | } |
| 516 | } |
| 517 | clearHandlers(); |
| 518 | } |
| 519 | |
| 520 | void TouchDispatcher::clearHandlers() { |
| 521 | _handlers.clear(); |