static status eventPopupGesture(PopupGesture g, EventObj ev) { if ( g->status == NAME_active && isUpEvent(ev) ) { PceWindow sw; if ( !(sw = getWindowGraphical(ev->receiver)) ) sw = ev->window; if ( notNil(g->current) && g->current->displayed == OFF ) { send(g->current, NAME_open, ev->receiver, getAreaPositionEvent(ev, DEFAULT), EAV); attributeObject(g, NAME_Stayup, ON); grabPointerWindow(sw, ON); focusWindow(sw, ev->receiver, (Recogniser) g, g->cursor, NIL); } else if ( valInt(getClickTimeEvent(ev)) < 400 && getAttributeObject(g, NAME_Stayup) != ON ) { attributeObject(g, NAME_Stayup, ON); grabPointerWindow(sw, ON); focusWindow(sw, ev->receiver, (Recogniser) g, g->cursor, NIL); } else { send(g, NAME_terminate, EAV); if ( isNil(g->current) ) { grabPointerWindow(sw, OFF); focusWindow(sw, NIL, NIL, NIL, NIL); deleteAttributeObject(g, NAME_Stayup); assign(g, status, NAME_inactive); } } succeed; } else if ( notNil(g->current) && g->current->displayed == ON ) return postEvent(ev, (Graphical) g->current, DEFAULT); if ( eventGesture(g, ev) ) succeed; if ( g->status == NAME_active && isAEvent(ev, NAME_keyboard) ) { Name key; TRY(updatePopupGesture(g, ev)); key = characterName(getIdEvent(ev)); if ( send(g->current, NAME_key, key, EAV) ) { Any context = g->context; PopupObj current = g->current; assign(g, context, NIL); assign(g, current, NIL); send(current, NAME_execute, context, EAV); succeed; } else send(g, NAME_cancel, ev, EAV); } fail; }
void ppc::Desktop::registerInput(sf::Event ev) { //first check if the mouse clicked in the focused window. //if the window clicked in a window that wasnt focused, //then focus that window. //for any mouse event if (ev.type == sf::Event::MouseButtonPressed) { for (auto it = windows_.begin(); it != windows_.end(); ++it) { sf::FloatRect winBounds = (*it)->getBounds(); if (winBounds.contains(float(ev.mouseButton.x), float(ev.mouseButton.y))) { focusWindow(*it); break; } } } if (ev.type == sf::Event::MouseMoved) { ev.mouseMove.x -= int(focused_->getPosition().x); ev.mouseMove.y -= int(focused_->getPosition().y); } else if ((ev.type == sf::Event::MouseButtonPressed) || (ev.type == sf::Event::MouseButtonReleased)){ ev.mouseButton.x -= int(focused_->getPosition().x); ev.mouseButton.y -= int(focused_->getPosition().y); } focused_->registerInput(ev); }
static status terminatePopupGesture(PopupGesture g, EventObj ev) { Any context = g->context; PopupObj current = g->current; if ( notNil(current) ) { postEvent(ev, (Graphical) current, DEFAULT); if ( current->displayed == OFF ) /* for stayup */ { PceWindow sw; if ( !(sw = getWindowGraphical(ev->receiver)) ) sw = ev->window; assign(g, context, NIL); assign(g, current, NIL); grabPointerWindow(sw, OFF); send(current, NAME_execute, context, EAV); focusWindow(sw, NIL, NIL, NIL, NIL); } } succeed; }
void ppc::Desktop::destroyWindow(WindowInterface* wi) { if (wi == nullptr || wi == desktopWindow_) return; for (auto it = windows_.begin(); it != windows_.end(); ++it) { if (*it == wi) { delete *it; windows_.erase(it); focusWindow(desktopWindow_); return; } } }
// this method makes the widget appear to the toolkit as if it has been // destructed - all that remains to do is destroy the window and // recover the memory for the widget (delete widget). // this method is primarily used from MSWidget::destroy to allow // callback safe destruction of widgets void MSWidget::prepareForDestruction(void) { freeze(); MSWidget *pTopWidget=top(); if (_window!=0) _server->widgetHashTable()->remove(_window); // no more events if (pTopWidget!=0) pTopWidget->removeFromFocusList(this); if (pTopWidget!=0&&pTopWidget->inputFocus()==this) (void)pTopWidget->traverseFocus(0); if (focusWindow()==this) _focusWindow=0; childDestroyNotify(); activateCallback(MSWidgetCallback::destroy); removeAllCallbacks(); }
void ppc::Desktop::update(sf::Time& deltaTime){ //No reverse itors needed for (size_t i = 0; i < windows_.size(); ) { windows_.at(i)->update(deltaTime); if (!windows_.at(i)->isOpen()) { delete windows_.at(i); windows_.erase(windows_.begin() + i); focusWindow(desktopWindow_); } else { ++i; } //dont increment if you delete it } }
void CoreManager::removeWindow(FreeWindow& window) { Windows::iterator i; for (i = windows.begin(); i != windows.end(); i++) if (*i == &window) break; g_assert(i != windows.end()); windows.erase(i); focusWindow(); redraw(); }
void CoreManager::addWindow(FreeWindow& window) { Windows::iterator i = findWindow(window); if (i != windows.end()) { /* Window is already added, addWindow() was called to bring the window to * the top. */ windows.erase(i); windows.push_back(&window); } else { windows.push_back(&window); window.onScreenResized(); } focusWindow(); redraw(); }