예제 #1
0
int PollReactor::Demultiplex(EventHandlerMap & handlers,
                        RegHandlerVec & list,
                        MSEC timeout)
{
    if (pollSize_ == 0) return 0;
    int ret = Poll::poll(&pollfds_[0], pollSize_, timeout);
    if (ret > 0)
    {
        for (int i = 0; i < ret; ++i)
        {
            struct pollfd & e = pollfds_[0];
            HANDLE h = e.fd;
            EventHandlerMapIter iter = handlers.find(h);
            if (iter == handlers.end()) continue;
            RegHandler & rh = iter->second;
            EventHandler * handler = rh.handler;
            assert(handler);
            if (!handler) continue;
            if ((e.revents & POLLERR) || (e.revents & POLLNVAL) || (e.revents & POLLHUP))
                rh.revents |= EventHandler::ERROR_MASK;
            else
            {
                if (e.revents & POLLIN)
                    rh.revents |= EventHandler::READ_MASK;
                if (e.revents & POLLOUT)
                    rh.revents |= EventHandler::WRITE_MASK;
            }
            list.push_back(&rh);
        }
    }
    return 0;
}
예제 #2
0
파일: EventManager.cpp 프로젝트: ktj007/mmo
// Loads a window and binds the event handler for it.
bool EventManager::LoadWindow(const Rocket::Core::String& window_name)
{
    // Set the event handler for the new screen, if one has been registered.
    EventHandler* old_event_handler = event_handler;
    EventHandlerMap::iterator iterator = event_handlers.find(window_name);
    if (iterator != event_handlers.end())
        event_handler = (*iterator).second;
    else
        event_handler = NULL;

    // Attempt to load the referenced RML document.

    char path[1024];
    GetMmoResourcePath(path, 1024, (window_name + ".rml").CString());

    Rocket::Core::ElementDocument* document = gContext->LoadDocument(path);
    if (document == NULL)
    {
        event_handler = old_event_handler;
        return false;
    }

    // Set the element's title on the title; IDd 'title' in the RML.
    Rocket::Core::Element* title = document->GetElementById("title");
    if (title != NULL)
        title->SetInnerRML(document->GetTitle());

    document->Focus();
    document->Show();

    // Remove the caller's reference.
    document->RemoveReference();

    return true;
}
예제 #3
0
// Registers a new event handler with the manager.
void EventManager::RegisterEventHandler(const Rocket::Core::String& handler_name, EventHandler* handler)
{
    // Release any handler bound under the same name.
    EventHandlerMap::iterator iterator = event_handlers.find(handler_name);
    if (iterator != event_handlers.end())
        delete (*iterator).second;

    event_handlers[handler_name] = handler;
}
예제 #4
0
// Loads a window and binds the event handler for it.
Rocket::Core::ElementDocument* EventManager::LoadWindow(const Rocket::Core::String& window_name)
{
    // Set the event handler for the new screen, if one has been registered.
    EventHandler* old_event_handler = event_handler;
    EventHandlerMap::iterator iterator = event_handlers.find(window_name);
    if (iterator != event_handlers.end())
    {
        event_handler = iterator->second;
        //Rocket::Core::Log::Message(Rocket::Core::Log::LT_INFO, "%s", window_name.CString());
    }
    else
        event_handler = NULL;

    // Attempt to load the referenced RML document.
    Rocket::Core::String document_path = Rocket::Core::String("data/") + window_name + Rocket::Core::String(".rml");
    Rocket::Core::ElementDocument* document = Context->LoadDocument(document_path.CString());
    if (document == nullptr)
    {
        event_handler = old_event_handler;
        return nullptr;
    }

    document->SetId(window_name);

    // Set the element's title on the title; IDd 'title' in the RML.
    Rocket::Core::Element* title = document->GetElementById("title");
    if (title != NULL)
        title->SetInnerRML(document->GetTitle());

    document->Focus();
    document->Show();

    // Remove the caller's reference.
    document->RemoveReference();

    return document;
}