aboutsummaryrefslogtreecommitdiffstats
path: root/src/window/EventsManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/window/EventsManager.cpp')
-rw-r--r--src/window/EventsManager.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/window/EventsManager.cpp b/src/window/EventsManager.cpp
new file mode 100644
index 0000000..ddf2901
--- /dev/null
+++ b/src/window/EventsManager.cpp
@@ -0,0 +1,127 @@
+#include <stdio.h>
+#include <GLFW/glfw3.h>
+
+#include "Window.hpp"
+#include "EventsManager.hpp"
+#include "Events.hpp"
+
+struct lStorage EventsManager::listeners(2);
+
+void EventsManager::PollEvents()
+{
+ int max = listeners.max_n, i;
+ for(i = 0; i < max; i++) {
+ if(!listeners.list[i])
+ continue;
+
+ listeners.list[i]->NextFrame();
+ }
+ glfwPollEvents();
+}
+
+void EventsManager::AddListener(Events *e, int listen)
+{
+ if(listen <= 0)
+ return;
+
+ GLFWwindow *win = e->GetWindow()->GetWin();
+ if(listen & EM_LISTEN_KEY)
+ glfwSetKeyCallback(win, key_callback);
+ if(listen & EM_LISTEN_CURSOR)
+ glfwSetCursorPosCallback(win, cursor_pos_callback);
+ if(listen & EM_LISTEN_MBUTTON)
+ glfwSetMouseButtonCallback(win, mouse_button_callback);
+ if(listen & EM_LISTEN_WINDOWSIZE)
+ glfwSetWindowSizeCallback(win, window_size_callback);
+ if(listen & EM_LISTEN_MSCROLL)
+ glfwSetScrollCallback(win, scroll_callback);
+
+ listeners.Add(e, win, listen);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+void EventsManager::key_callback(GLFWwindow *window, int key, int scancode,
+ int action, int mode)
+{
+ int max = listeners.max_n, i;
+ for(i = 0; i < max; i++) {
+ if(!listeners.list[i])
+ continue;
+ if(!(listeners.listen_events[i] & EM_LISTEN_KEY))
+ continue;
+ if(listeners.win[i] != window)
+ continue;
+
+ //fprintf(stderr, "key_callback\n");
+ listeners.list[i]->KeyHandle(key, scancode, action, mode);
+ }
+}
+
+void EventsManager::cursor_pos_callback(GLFWwindow *window, double xpos,
+ double ypos)
+{
+ int max = listeners.max_n, i;
+ for(i = 0; i < max; i++) {
+ if(!listeners.list[i])
+ continue;
+ if(!(listeners.listen_events[i] & EM_LISTEN_CURSOR))
+ continue;
+ if(listeners.win[i] != window)
+ continue;
+
+ //fprintf(stderr, "cursor_pos_callback\n");
+ listeners.list[i]->CursorPosHandle(xpos, ypos);
+ }
+}
+
+void EventsManager::mouse_button_callback(GLFWwindow *window, int button,
+ int action, int mode)
+{
+ int max = listeners.max_n, i;
+ for(i = 0; i < max; i++) {
+ if(!listeners.list[i])
+ continue;
+ if(!(listeners.listen_events[i] & EM_LISTEN_MBUTTON))
+ continue;
+ if(listeners.win[i] != window)
+ continue;
+
+ //fprintf(stderr, "mouse_button_callback\n");
+ listeners.list[i]->MouseButtonHandle(button, action, mode);
+ }
+}
+
+void EventsManager::window_size_callback(GLFWwindow* window,
+ int width, int height)
+{
+ int max = listeners.max_n, i;
+ for(i = 0; i < max; i++) {
+ if(!listeners.list[i])
+ continue;
+ if(!(listeners.listen_events[i] & EM_LISTEN_WINDOWSIZE))
+ continue;
+ if(listeners.win[i] != window)
+ continue;
+
+ //fprintf(stderr, "window_size_callback\n");
+ listeners.list[i]->WindowResizeHandle(width, height);
+ }
+}
+
+void EventsManager::scroll_callback(GLFWwindow* window,
+ double xoffset, double yoffset)
+{
+ int max = listeners.max_n, i;
+ for(i = 0; i < max; i++) {
+ if(!listeners.list[i])
+ continue;
+ if(!(listeners.listen_events[i] & EM_LISTEN_MSCROLL))
+ continue;
+ if(listeners.win[i] != window)
+ continue;
+
+ //fprintf(stderr, "scroll_callback\n");
+ listeners.list[i]->MouseScrollHandle(xoffset, yoffset);
+ }
+}