/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * eventhandler.cc * * Sun Oct 9 18:58:29 CEST 2011 * Copyright 2011 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of DrumGizmo. * * DrumGizmo is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * DrumGizmo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with DrumGizmo; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "eventhandler.h" #include "window.h" #include "painter.h" GUI::EventHandler::EventHandler(GUI::NativeWindow *n, GUI::Window *w) { native = n; window = w; last_click = 0; last_was_dbl_click = false; } bool GUI::EventHandler::hasEvent() { return native->hasEvent(); } GUI::Event *GUI::EventHandler::getNextEvent() { return native->getNextEvent(); } void GUI::EventHandler::registerCloseHandler(void (*handler)(void *), void *ptr) { this->closeHandler = handler; this->closeHandlerPtr = ptr; } void GUI::EventHandler::processEvents() { while(hasEvent()) { Painter p(window); // Make sure we only redraw buffer one time. Event *event = getNextEvent(); if(event == NULL) continue; // Widget *widget = gctx->widgets[event->window_id]; switch(event->type()) { case Event::Repaint: // window->repaint((RepaintEvent*)event); window->redraw(); break; case Event::Resize: { // window->repaint((RepaintEvent*)event) ResizeEvent *re = (ResizeEvent*)event; if(re->width != window->width() || re->height != window->height()) { window->resized(re->width, re->height); //window->repaint_r(NULL); } } break; case Event::MouseMove: { MouseMoveEvent *me = (MouseMoveEvent*)event; Widget *w = window->find(me->x, me->y); Widget *oldw = window->mouseFocus(); if(w != oldw) { // Send focus leave to oldw if(oldw) oldw->mouseLeaveEvent(); // Send focus enter to w if(w) w->mouseEnterEvent(); window->setMouseFocus(w); } if(window->buttonDownFocus()) { Widget *w = window->buttonDownFocus(); /* if(me->x < w->x()) me->x = w->x(); if(me->x > w->x() + w->width()) me->x = w->x() + w->width(); if(me->y < w->y()) me->y = w->y(); if(me->y > w->y() + w->height()) me->y = w->y() + w->height(); */ me->x -= w->windowX(); me->y -= w->windowY(); window->buttonDownFocus()->mouseMoveEvent(me); break; } if(w) { me->x -= w->windowX(); me->y -= w->windowY(); w->mouseMoveEvent(me); } } break; case Event::Button: { if(last_was_dbl_click) { last_was_dbl_click = false; continue; } ButtonEvent *be = (ButtonEvent *)event; last_was_dbl_click = be->doubleclick; Widget *w = window->find(be->x, be->y); if(window->buttonDownFocus()) { if(be->direction == -1) { Widget *w = window->buttonDownFocus(); /* if(be->x < w->x()) be->x = w->x(); if(be->x > w->x() + w->width()) be->x = w->x() + w->width(); if(be->y < w->y()) be->y = w->y(); if(be->y > w->y() + w->height()) be->y = w->y() + w->height(); */ be->x -= w->windowX(); be->y -= w->windowY(); w->buttonEvent(be); break; } else { window->setButtonDownFocus(NULL); } } if(w) { be->x -= w->windowX(); be->y -= w->windowY(); w->buttonEvent(be); if(be->direction == 1) { if(w->catchMouse()) window->setButtonDownFocus(w); } if(w->isFocusable()) window->setKeyboardFocus(w); } } break; case Event::Scroll: { ScrollEvent *se = (ScrollEvent *)event; Widget *w = window->find(se->x, se->y); //printf("scroller (%d,%d) %p\n", se->x, se->y, w); if(w) { se->x -= w->windowX(); se->y -= w->windowY(); w->scrollEvent(se); } } break; case Event::Key: // window->key((KeyEvent*)event); // lineedit->keyEvent((KeyEvent*)event); if(window->keyboardFocus()) window->keyboardFocus()->keyEvent((KeyEvent*)event); break; case Event::Close: if(closeHandler) closeHandler(closeHandlerPtr); //delete window; //window = NULL; break; } delete event; } }