diff options
Diffstat (limited to 'plugingui/eventhandler.cc')
-rw-r--r-- | plugingui/eventhandler.cc | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/plugingui/eventhandler.cc b/plugingui/eventhandler.cc new file mode 100644 index 0000000..cec5fab --- /dev/null +++ b/plugingui/eventhandler.cc @@ -0,0 +1,194 @@ +/* -*- 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; + } +} |