From d114b136897ca569d819da5f9b75bd08f9cbe2c0 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Thu, 21 Feb 2013 15:36:09 +0200 Subject: [PATCH] *in progress* f***ed up :p TODO: 1- v-sync 2- relative pos --- src/geom.h | 2 +- src/gfx.cc | 8 ++++++ src/window.cc | 24 ++++++++++++++++++ src/window.h | 7 ++++++ src/wm.cc | 78 +++++++++++++++++++++++++++++++++++++++++++++------------ 5 files changed, 102 insertions(+), 17 deletions(-) diff --git a/src/geom.h b/src/geom.h index 9c00b41..8b596ce 100644 --- a/src/geom.h +++ b/src/geom.h @@ -2,7 +2,7 @@ #define GEOM_H_ struct Rect { - int x, y; + mutable int x, y; int width, height; }; diff --git a/src/gfx.cc b/src/gfx.cc index 5c04d1e..45c918b 100644 --- a/src/gfx.cc +++ b/src/gfx.cc @@ -92,6 +92,14 @@ void clear_screen(int r, int g, int b) void fill_rect(const Rect &rect, int r, int g, int b) { + if(rect.x < 0) { + rect.x = 0; + } + + if(rect.y < 0) { + rect.y = 0; + } + unsigned char *fb = framebuffer + (rect.x + screen_rect.width * rect.y) * 4; for(int i=0; ifocusable = focusable; +} + +bool Window::get_focusable() const +{ + return focusable; +} + void Window::set_display_callback(DisplayFuncType func) { callbacks.display = func; @@ -172,6 +183,19 @@ void Window::remove_child(Window *win) } } +Window **Window::get_children() +{ + if(children.empty()) { + return 0; + } + return &children[0]; +} + +int Window::get_children_count() const +{ + return (int)children.size(); +} + const Window *Window::get_parent() const { return parent; diff --git a/src/window.h b/src/window.h index 040f6b5..1eebed0 100644 --- a/src/window.h +++ b/src/window.h @@ -17,6 +17,7 @@ private: bool dirty; bool managed; // whether the wm manages (+decorates) this win + bool focusable; public: Window(); @@ -45,6 +46,9 @@ public: void set_managed(bool managed); bool get_managed() const; + void set_focusable(bool focusable); + bool get_focusable() const; + void set_display_callback(DisplayFuncType func); void set_keyboard_callback(KeyboardFuncType func); void set_mouse_button_callback(MouseButtonFuncType func); @@ -59,6 +63,9 @@ public: void add_child(Window *win); void remove_child(Window *win); + Window **get_children(); + int get_children_count() const; + const Window *get_parent() const; Window *get_parent(); diff --git a/src/wm.cc b/src/wm.cc index d3b3c95..ec73a5b 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -1,5 +1,6 @@ #include #include +#include // TODO #include "gfx.h" #include "wm.h" @@ -11,7 +12,7 @@ WindowManager *wm; static WindowManager wminst; static void display(Window *win); -static void mouse(Window *win, int key, bool pressed); +static void mouse(Window *win, int bn, bool pressed); static void motion(Window *win, int x, int y); void WindowManager::create_frame(Window *win) @@ -20,11 +21,13 @@ void WindowManager::create_frame(Window *win) Window *parent = win->get_parent(); frame->set_display_callback(display); -// frame->set_mouse_button_callback(mouse); -// frame->set_mouse_motion_callback(motion); + frame->set_mouse_button_callback(mouse); + frame->set_mouse_motion_callback(motion); frame->add_child(win); - frames.push_back(frame); + frame->set_focusable(false); + + windows.push_back(frame); Rect win_rect = win->get_rect(); frame->move(win_rect.x - frame_thickness, @@ -43,10 +46,10 @@ void WindowManager::destroy_frame(Window *win) } std::list::iterator it; - it = std::find(frames.begin(), frames.end(), frame); - if(it != frames.end()) { + it = std::find(windows.begin(), windows.end(), frame); + if(it != windows.end()) { root_win->add_child(win); - frames.erase(it); + windows.erase(it); delete frame; } } @@ -160,7 +163,25 @@ void WindowManager::remove_window(Window *win) void WindowManager::set_focused_window(Window *win) { - focused_win = win; + if(!win) { + focused_win = 0; + return; + } + + if(win->get_focusable()) { + focused_win = win; + return; + } + + Window **children = win->get_children(); + for(int i=0; iget_children_count(); i++) { + if(children[0]->get_focusable()) { + set_focused_window(children[0]); + return; + } + } + + focused_win = 0; } const Window *WindowManager::get_focused_window() const @@ -175,17 +196,17 @@ Window *WindowManager::get_focused_window() Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y) { - Window *win = 0; std::list::reverse_iterator rit = windows.rbegin(); while(rit != windows.rend()) { - if((*rit)->contains_point(pointer_x, pointer_y)) { - win = *rit; - break; + Window *w = *rit++; + Window *parent = w->get_parent(); + + if(parent == root_win && w->contains_point(pointer_x, pointer_y)) { + return w; } - rit++; } - return win; + return 0; } static void display(Window *win) @@ -196,5 +217,30 @@ static void display(Window *win) } } -//static void mouse(Window *win, int key, bool pressed); -//static void motion(Window *win, int x, int y); +static int prev_x = -1, prev_y; + +static void mouse(Window *win, int bn, bool pressed) +{ + printf("mouse callback (%d, %s)\n", bn, pressed ? "pressed" : "released"); + if(bn == 0) { + if(pressed) { + get_pointer_pos(&prev_x, &prev_y); + } else { + prev_x = -1; + } + } +} + +static void motion(Window *win, int x, int y) +{ + int left_bn = get_button(0); + if(left_bn && prev_x != -1) { + int dx = x - prev_x; + int dy = y - prev_y; + prev_x = x; + prev_y = y; + + Rect rect = win->get_rect(); + win->move(rect.x + dx, rect.y + dy); + } +} -- 1.7.10.4