bool dirty;
bool managed; // whether the wm manages (+decorates) this win
+ bool focusable;
public:
Window();
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);
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();
#include <algorithm>
#include <stdexcept>
+#include <stdio.h> // TODO
#include "gfx.h"
#include "wm.h"
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)
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,
}
std::list<Window*>::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;
}
}
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; i<win->get_children_count(); i++) {
+ if(children[0]->get_focusable()) {
+ set_focused_window(children[0]);
+ return;
+ }
+ }
+
+ focused_win = 0;
}
const Window *WindowManager::get_focused_window() const
Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y)
{
- Window *win = 0;
std::list<Window*>::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)
}
}
-//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);
+ }
+}