void ewol::context::InputManager::newLayerSet() { for(int32_t iii=0; iii<MAX_MANAGE_INPUT; iii++) { // remove the property of this input ... abortElement(m_eventInputSaved, iii, gale::key::type::finger); cleanElement(m_eventInputSaved, iii); abortElement(m_eventMouseSaved, iii, gale::key::type::mouse); cleanElement(m_eventMouseSaved, iii); } }
gale::context::InputManager::InputManager(gale::Context& _context) : m_grabApplication(), m_context(_context) { setDpi(200); GALE_INFO("Init (start)"); for(int32_t iii=0; iii<MAX_MANAGE_INPUT; iii++) { // remove the property of this input ... cleanElement(m_eventInputSaved, iii); cleanElement(m_eventMouseSaved, iii); } GALE_INFO("Init (end)"); }
int list2_removeCurrentElement(struct list2 * listContext) { int error; struct list2_element * element; // Verifica se os dados são válidos if ( (!(listContext)) || (!(listContext->current)) ) { return E_NULL_PARAMETER; }; // Elemento atual da lista element = listContext->current; // Elemento anterior aponta para o próximo elemento if (element->previous) { (element->previous)->next = element->next; } else { listContext->first = element->next; }; // Elemento anterior aponta para o próximo elemento if (element->next) { (element->next)->previous = element->previous; } else { listContext->last = element->previous; }; // O elemento corrente passa a ser o próximo elemento. listContext->current = element->next; // Limpa o elemento error = cleanElement(element); // Se ocorrer erro limpando o elemento. if (error) { return error; }; // Decrementa o número de elementos. (listContext->numElements)--; if (!(listContext->current)) { return E_NO_MORE_ELEMENTS; }; return E_OK; };
void gale::context::InputManager::state(enum gale::key::type _type, int _pointerID, bool _isDown, vec2 _pos) { if (MAX_MANAGE_INPUT <= _pointerID) { // reject pointer == > out of IDs... return; } EVENT_DEBUG("event pointerId=" << _pointerID); // convert position in open-GL coordonates ... InputPoperty *eventTable = nullptr; InputLimit localLimit; if (_type == gale::key::typeMouse) { eventTable = m_eventMouseSaved; localLimit = m_eventMouseLimit; } else if (_type == gale::key::typeFinger) { eventTable = m_eventInputSaved; localLimit = m_eventInputLimit; } else { GALE_ERROR("Unknown type of event"); return; } if( _pointerID > MAX_MANAGE_INPUT || _pointerID <= 0) { // not manage input return; } // get the curent time ... int64_t currentTime = gale::getTime(); ememory::SharedPtr<gale::Application::Windows> tmpWindows = m_context.getWindows(); if (true == _isDown) { EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [DOWN] " << _pos); if(true == eventTable[_pointerID].isUsed) { // we have an event previously ... check delay between click and offset position if (currentTime - eventTable[_pointerID].lastTimeEvent > localLimit.sepatateTime) { cleanElement(eventTable, _pointerID); } else if( abs(eventTable[_pointerID].downStart.x() - _pos.x()) >= localLimit.DpiOffset || abs(eventTable[_pointerID].downStart.y() - _pos.y()) >= localLimit.DpiOffset ){ cleanElement(eventTable, _pointerID); } } if(true == eventTable[_pointerID].isUsed) { // save start time eventTable[_pointerID].lastTimeEvent = currentTime; // generate DOWN Event EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [DOWN] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, eventTable[_pointerID].curentApplicationEvent.lock(), eventTable[_pointerID].destinationInputId, gale::key::statusDown, _pos); } else { // Mark it used : eventTable[_pointerID].isUsed = true; // Save current position : eventTable[_pointerID].downStart = _pos; // save start time eventTable[_pointerID].lastTimeEvent = currentTime; // set the element inside ... eventTable[_pointerID].isInside = true; ememory::SharedPtr<gale::Application> tmpApplication = m_grabApplication.lock(); // get destination Application : if(nullptr != tmpWindows) { if ( tmpApplication != nullptr && _type == gale::key::typeMouse) { eventTable[_pointerID].curentApplicationEvent = tmpApplication; } else { eventTable[_pointerID].curentApplicationEvent = tmpWindows->getApplicationAtPos(_pos); } } else { eventTable[_pointerID].curentApplicationEvent.reset(); } tmpApplication = eventTable[_pointerID].curentApplicationEvent.lock(); if (tmpApplication != nullptr) { eventTable[_pointerID].origin = tmpApplication->getOrigin(); eventTable[_pointerID].size = tmpApplication->getSize(); eventTable[_pointerID].destinationInputId = localGetDestinationId(_type, tmpApplication, _pointerID); } else { eventTable[_pointerID].destinationInputId = -1; } // generate DOWN Event EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [DOWN] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, tmpApplication, eventTable[_pointerID].destinationInputId, gale::key::statusDown, _pos); } } else { EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [UP] " << _pos); if(false == eventTable[_pointerID].isUsed) { // bad case ... ??? GALE_DEBUG("Up event without previous down ... "); // Mark it un-used : eventTable[_pointerID].isUsed = false; // revove the Application ... eventTable[_pointerID].curentApplicationEvent.reset(); } else { ememory::SharedPtr<gale::Application> tmpApplication = eventTable[_pointerID].curentApplicationEvent.lock(); // generate UP Event EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [UP] " << _pos); eventTable[_pointerID].posEvent = _pos; // send up event after the single event to prevent multiple Application getting elements localEventInput(_type, tmpApplication, _pointerID, gale::key::statusUp, _pos); // generate event (single) if( abs(eventTable[_pointerID].downStart.x() - _pos.x()) < localLimit.DpiOffset && abs(eventTable[_pointerID].downStart.y() - _pos.y()) < localLimit.DpiOffset ){ // Save current position : eventTable[_pointerID].downStart = _pos; // save start time eventTable[_pointerID].lastTimeEvent = currentTime; int32_t nbClickMax = 0; if(tmpApplication != nullptr) { nbClickMax = tmpApplication->getMouseLimit(); if (nbClickMax>5) { nbClickMax = 5; } } // in grab mode the single to quinte event are not generated .... if( ( m_grabApplication.lock() == nullptr || _type != gale::key::typeMouse ) && eventTable[_pointerID].nbClickEvent < nbClickMax) { // generate event SINGLE : eventTable[_pointerID].nbClickEvent++; EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [" << eventTable[_pointerID].nbClickEvent << "] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, tmpApplication, eventTable[_pointerID].destinationInputId, (enum gale::key::status)(gale::key::statusSingle + eventTable[_pointerID].nbClickEvent-1), _pos); if( eventTable[_pointerID].nbClickEvent >= nbClickMax) { eventTable[_pointerID].nbClickEvent = 0; } } else { eventTable[_pointerID].nbClickEvent = 0; } } // send up event after the single event to prevent multiple Application getting elements localEventInput(_type, tmpApplication, _pointerID, gale::key::statusUpAfter, _pos); // specific for tuch event if (_type == gale::key::typeFinger) { cleanElement(eventTable, _pointerID); } } } }
void ewol::context::InputManager::state(enum gale::key::type _type, int _pointerID, bool _isDown, vec2 _pos) { if (_pointerID >= MAX_MANAGE_INPUT) { // reject pointer == > out of IDs... return; } EVENT_DEBUG("event pointerId=" << _pointerID); // convert position in open-GL coordonates ... InputPoperty *eventTable = nullptr; InputLimit localLimit; if (_type == gale::key::type::mouse) { eventTable = m_eventMouseSaved; localLimit = m_eventMouseLimit; } else if (_type == gale::key::type::finger) { eventTable = m_eventInputSaved; localLimit = m_eventInputLimit; } else { EWOL_ERROR("Unknown type of event"); return; } if( _pointerID > MAX_MANAGE_INPUT || _pointerID <= 0) { // not manage input return; } // get the curent time ... echrono::Clock currentTime = echrono::Clock::now(); ewol::widget::WindowsShared tmpWindows = m_context.getWindows(); if (_isDown == true) { EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [DOWN] " << _pos); if(eventTable[_pointerID].isUsed == true) { // we have an event previously ... check delay between click and offset position if (currentTime - eventTable[_pointerID].lastTimeEvent > localLimit.sepatateTime) { cleanElement(eventTable, _pointerID); } else if( std::abs(eventTable[_pointerID].downStart.x() - _pos.x()) >= localLimit.DpiOffset || std::abs(eventTable[_pointerID].downStart.y() - _pos.y()) >= localLimit.DpiOffset ){ cleanElement(eventTable, _pointerID); } } if(eventTable[_pointerID].isUsed == true) { // save start time eventTable[_pointerID].lastTimeEvent = currentTime; // generate DOWN Event EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [DOWN] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, eventTable[_pointerID].curentWidgetEvent.lock(), eventTable[_pointerID].destinationInputId, gale::key::status::down, _pos); } else { // Mark it used : eventTable[_pointerID].isUsed = true; // Save current position : eventTable[_pointerID].downStart = _pos; // save start time eventTable[_pointerID].lastTimeEvent = currentTime; // set the element inside ... eventTable[_pointerID].isInside = true; ewol::WidgetShared tmpWidget = m_grabWidget.lock(); // get destination widget : if(tmpWindows != nullptr) { if ( tmpWidget != nullptr && _type == gale::key::type::mouse) { eventTable[_pointerID].curentWidgetEvent = tmpWidget; } else { tmpWidget = tmpWindows->getWidgetAtPos(_pos); eventTable[_pointerID].curentWidgetEvent = tmpWidget; if (tmpWidget != nullptr) { EVENT_DEBUG("Get widget at pos=" << _pos << " type: " << tmpWidget->getObjectType()); } else { EVENT_DEBUG("Get widget at pos=" << _pos << " NO WIDGET"); } } } else { eventTable[_pointerID].curentWidgetEvent.reset(); } tmpWidget = eventTable[_pointerID].curentWidgetEvent.lock(); if (tmpWidget != nullptr) { eventTable[_pointerID].origin = tmpWidget->getOrigin(); eventTable[_pointerID].size = tmpWidget->getSize(); eventTable[_pointerID].destinationInputId = localGetDestinationId(_type, tmpWidget, _pointerID); } else { eventTable[_pointerID].destinationInputId = -1; } // generate DOWN Event EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [DOWN] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, tmpWidget, eventTable[_pointerID].destinationInputId, gale::key::status::down, _pos); } } else { EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [UP] " << _pos); ewol::WidgetShared tmpWidget = eventTable[_pointerID].curentWidgetEvent.lock(); if(eventTable[_pointerID].isUsed == false) { // bad case ... ??? EWOL_DEBUG("Up event without previous down ... "); // Mark it un-used : eventTable[_pointerID].isUsed = false; // revove the widget ... eventTable[_pointerID].curentWidgetEvent.reset(); } else if (tmpWidget == nullptr) { // The widget has been removed: EVENT_DEBUG(" Object Removed ..."); // Mark it un-used : eventTable[_pointerID].isUsed = false; // revove the widget ... eventTable[_pointerID].curentWidgetEvent.reset(); } else { // generate UP Event EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [UP] " << _pos); eventTable[_pointerID].posEvent = _pos; // send up event after the single event to prevent multiple widget getting elements localEventInput(_type, tmpWidget, _pointerID, gale::key::status::up, _pos); // generate event (single) if( std::abs(eventTable[_pointerID].downStart.x() - _pos.x()) < localLimit.DpiOffset && std::abs(eventTable[_pointerID].downStart.y() - _pos.y()) < localLimit.DpiOffset ){ // Save current position : eventTable[_pointerID].downStart = _pos; // save start time eventTable[_pointerID].lastTimeEvent = currentTime; int32_t nbClickMax = 0; if(tmpWidget != nullptr) { nbClickMax = tmpWidget->getMouseLimit(); if (nbClickMax>5) { nbClickMax = 5; } } // in grab mode the single to quinte event are not generated .... if( ( m_grabWidget.lock() == nullptr || _type != gale::key::type::mouse ) && eventTable[_pointerID].nbClickEvent < nbClickMax) { // generate event SINGLE : eventTable[_pointerID].nbClickEvent++; EVENT_DEBUG("GUI : Input ID=" << _pointerID << " == >" << eventTable[_pointerID].destinationInputId << " [" << eventTable[_pointerID].nbClickEvent << "] " << _pos); eventTable[_pointerID].posEvent = _pos; localEventInput(_type, tmpWidget, eventTable[_pointerID].destinationInputId, (enum gale::key::status)(uint32_t(gale::key::status::pressSingle) + eventTable[_pointerID].nbClickEvent-1), _pos); if( eventTable[_pointerID].nbClickEvent >= nbClickMax) { eventTable[_pointerID].nbClickEvent = 0; } } else { eventTable[_pointerID].nbClickEvent = 0; } } // send up event after the single event to prevent multiple widget getting elements localEventInput(_type, tmpWidget, _pointerID, gale::key::status::upAfter, _pos); // specific for tuch event if (_type == gale::key::type::finger) { cleanElement(eventTable, _pointerID); } } } }