summaryrefslogtreecommitdiff
path: root/plugingui/eventhandler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugingui/eventhandler.cc')
-rw-r--r--plugingui/eventhandler.cc194
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;
+ }
+}