+#include <errno.h>
+#include <unistd.h>
+#include <sys/select.h>
#include "event.h"
+#include "wm.h"
+#include "keyboard.h"
+#include "mouse.h"
-static DisplayFuncType display_func;
-static KeyboardFuncType keyboard_func;
-static MouseButtonFuncType mouse_button_func;
-static MouseMotionFuncType mouse_motion_func;
-
-void set_display_callback(DisplayFuncType display)
-{
- display_func = display;
-}
-
-void set_keyboard_callback(KeyboardFuncType keyboard)
+void process_events()
{
- keyboard_func = keyboard;
-}
+ int keyb_fd = get_keyboard_fd();
+ int mouse_fd = get_mouse_fd();
-void set_mouse_button_callback(MouseButtonFuncType mouse_button)
-{
- mouse_button_func = mouse_button;
-}
+ for(;;) {
+ fd_set read_set;
-void set_mouse_motion_callback(MouseMotionFuncType mouse_motion)
-{
- mouse_motion_func = mouse_motion;
-}
+ FD_ZERO(&read_set);
+ FD_SET(keyb_fd, &read_set);
+ FD_SET(mouse_fd, &read_set);
-DisplayFuncType get_display_callback()
-{
- return display_func;
-}
+ int maxfd = keyb_fd > mouse_fd ? keyb_fd : mouse_fd;
-KeyboardFuncType get_keyboard_callback()
-{
- return keyboard_func;
-}
+ while(select(maxfd + 1, &read_set, 0, 0, 0) == -1 && errno == EINTR);
-MouseButtonFuncType get_mouse_button_callback()
-{
- return mouse_button_func;
-}
+ if(FD_ISSET(keyb_fd, &read_set)) {
+ process_keyboard_event();
+ }
+ if(FD_ISSET(mouse_fd, &read_set)) {
+ process_mouse_event();
+ }
-MouseMotionFuncType get_mouse_motion_callback()
-{
- return mouse_motion_func;
+ wm->process_windows();
+ }
}
#ifndef EVENT_H_
#define EVENT_H_
-typedef void (*DisplayFuncType)();
-typedef void (*KeyboardFuncType)(int key, bool pressed);
-typedef void (*MouseButtonFuncType)(int bn, bool pressed);
-typedef void (*MouseMotionFuncType)(int x, int y);
+class Window;
-void set_display_callback(DisplayFuncType display);
-void set_keyboard_callback(KeyboardFuncType keyboard);
-void set_mouse_button_callback(MouseButtonFuncType mouse_button);
-void set_mouse_motion_callback(MouseMotionFuncType mouse_motion);
+typedef void (*DisplayFuncType)(Window* win);
+typedef void (*KeyboardFuncType)(Window* win, int key, bool pressed);
+typedef void (*MouseButtonFuncType)(Window *win, int bn, bool pressed);
+typedef void (*MouseMotionFuncType)(Window *win, int x, int y);
-DisplayFuncType get_display_callback();
-KeyboardFuncType get_keyboard_callback();
-MouseButtonFuncType get_mouse_button_callback();
-MouseMotionFuncType get_mouse_motion_callback();
+struct Callbacks {
+ DisplayFuncType display;
+ KeyboardFuncType keyboard;
+ MouseButtonFuncType button;
+ MouseMotionFuncType motion;
+};
+
+void process_events();
#endif