MouseMotionFuncType motion_callback = 0;
MouseButtonFuncType button_callback = 0;
- Window *top;
- if(!(top = wm->get_grab_window())) {
- top = wm->get_window_at_pos(pointer_x, pointer_y);
- if(top) {
- wm->set_focused_window(top);
+ Window *win;
+ if(!(win = wm->get_grab_window())) {
+ win = wm->get_window_at_pos(pointer_x, pointer_y);
+ if(win) {
+ wm->set_focused_window(win);
}
else {
wm->set_focused_window(0);
case SDL_MOUSEMOTION:
pointer_x = sdl_event.motion.x;
pointer_y = sdl_event.motion.y;
- if(top && (motion_callback = top->get_mouse_motion_callback())) {
- Rect rect = top->get_absolute_rect();
- motion_callback(top, pointer_x - rect.x, pointer_y - rect.y);
+ if(win && (motion_callback = win->get_mouse_motion_callback())) {
+ Rect rect = win->get_absolute_rect();
+ motion_callback(win, pointer_x - rect.x, pointer_y - rect.y);
}
break;
else {
bnstate &= ~(1 << bn);
}
- if(top && (button_callback = top->get_mouse_button_callback())) {
- Rect rect = top->get_absolute_rect();
- button_callback(top, bn, sdl_event.button.state, pointer_x - rect.x, pointer_y - rect.y);
+ if(win && (button_callback = win->get_mouse_button_callback())) {
+ Rect rect = win->get_absolute_rect();
+ button_callback(win, bn, sdl_event.button.state, pointer_x - rect.x, pointer_y - rect.y);
}
}
}
#include <algorithm>
+#include <stdio.h> //TODO
#include <string.h>
#include "gfx.h"
wm->invalidate_region(abs_rect);
}
-void Window::draw(const Rect &dirty_region)
+void Window::draw(Rect *dirty_region)
{
Rect abs_rect = get_absolute_rect();
- Rect intersect = rect_intersection(abs_rect, dirty_region);
+ Rect intersect = rect_intersection(abs_rect, *dirty_region);
if(intersect.width && intersect.height) {
if(callbacks.display) {
callbacks.display(this);
dirty = false;
draw_children(abs_rect);
+ *dirty_region = rect_union(*dirty_region, abs_rect);
}
}
void Window::draw_children(const Rect &dirty_region)
{
+ Rect drect = dirty_region;
for(size_t i=0; i<children.size(); i++) {
- children[i]->draw(dirty_region);
+ children[i]->draw(&drect);
}
}
*/
void invalidate();
- void draw(const Rect &dirty_region);
+ void draw(Rect *dirty_region);
void draw_children(const Rect &dirty_region);
unsigned char *get_win_start_on_fb();
grab_win = 0;
}
+void WindowManager::raise_window(Window *win)
+{
+ if(!win) {
+ return;
+ }
+
+ Window *parent = win->get_parent();
+ if(parent != root_win) {
+ if(parent->get_parent() == root_win) {
+ win = parent;
+ }
+ else {
+ return;
+ }
+ }
+
+ root_win->remove_child(win);
+ root_win->add_child(win);
+}
+
+void WindowManager::sink_window(Window *win)
+{
+ if(!win) {
+ return;
+ }
+
+ std::list<Window*>::iterator it;
+ it = std::find(windows.begin(), windows.end(), win);
+ if(it != windows.end()) {
+ windows.erase(it);
+ windows.push_front(win);
+ }
+}
+
static void display(Window *win)
{
//frame display:
if(bn == 0) {
if(pressed) {
wm->grab_mouse(win);
+ wm->raise_window(win);
prev_x = x;
prev_y = y;
}
static void motion(Window *win, int x, int y)
{
int left_bn = get_button(0);
+ int right_button = get_button(2);
+
if(left_bn) {
int dx = x - prev_x;
int dy = y - prev_y;
void grab_mouse(Window *win);
void release_mouse();
+
+ void raise_window(Window *win);
+ void sink_window(Window *win);
};
extern WindowManager *wm;