/* winnie - an experimental window system Copyright (C) 2013 Eleni Maria Stea This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see . Author: Eleni Maria Stea */ #ifdef WINNIE_SDL #include #include "mouse.h" #include "shalloc.h" #include "wm.h" #include "window.h" #include "winnie.h" extern SDL_Event sdl_event; struct Mouse { int pointer_x; int pointer_y; int bnstate; }; static Mouse *mouse; bool init_mouse() { if(!(mouse = (Mouse*)sh_malloc(sizeof *mouse))) { return false; } get_subsys()->mouse_offset = (int)((char*)mouse - (char*)get_pool()); memset(mouse, 0, sizeof *mouse); return true; } void destroy_mouse() { sh_free(mouse); } bool client_open_mouse(void *smem_start, int offset) { mouse = (Mouse*)((unsigned char*)smem_start + offset); return true; } void client_close_mouse() { } void set_mouse_bounds(const Rect &rect) { } int get_mouse_fd() { return -1; } void process_mouse_event() { int bn; MouseMotionFuncType motion_callback = 0; MouseButtonFuncType button_callback = 0; Window *win; if(!(win = wm->get_grab_window())) { win = wm->get_window_at_pos(mouse->pointer_x, mouse->pointer_y); if(win) { wm->set_focused_window(win); } else { wm->set_focused_window(0); } } switch(sdl_event.type) { case SDL_MOUSEMOTION: mouse->pointer_x = sdl_event.motion.x; mouse->pointer_y = sdl_event.motion.y; if(win && (motion_callback = win->get_mouse_motion_callback())) { Rect rect = win->get_absolute_rect(); motion_callback(win, mouse->pointer_x - rect.x, mouse->pointer_y - rect.y); } break; case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: bn = sdl_event.button.button - SDL_BUTTON_LEFT; if(sdl_event.button.state == SDL_PRESSED) { mouse->bnstate |= 1 << bn; } else { mouse->bnstate &= ~(1 << bn); } if(win && (button_callback = win->get_mouse_button_callback())) { Rect rect = win->get_absolute_rect(); button_callback(win, bn, sdl_event.button.state, mouse->pointer_x - rect.x, mouse->pointer_y - rect.y); } } } void get_pointer_pos(int *x, int *y) { *x = mouse->pointer_x; *y = mouse->pointer_y; } int get_button_state() { return mouse->bnstate; } int get_button(int bn) { if(bn < 0 || bn >= 3) { return 0; } return (mouse->bnstate & (1 << bn)) != 0; } #endif // WINNIE_SDL