From 18aa4e842c332f25b041cc8b2e47090539197113 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Sat, 16 Feb 2013 14:26:42 +0200 Subject: [PATCH] *work in progress* dirty rectangles, psaux device --- src/geom.h | 3 --- src/gfx.cc | 23 +++++++++++++++-------- src/gfx.h | 3 ++- src/mouse.cc | 18 ++++++++++++++++-- src/wm.cc | 28 ++++++++++++++++++++-------- src/wm.h | 2 ++ 6 files changed, 55 insertions(+), 22 deletions(-) diff --git a/src/geom.h b/src/geom.h index c294b54..9c00b41 100644 --- a/src/geom.h +++ b/src/geom.h @@ -6,10 +6,7 @@ struct Rect { int width, height; }; -// TODO probably need to implement something like this: -/* Rect rect_union(const Rect &a, const Rect &b); Rect rect_intersection(const Rect &a, const Rect &b); -*/ #endif // GEOM_H_ diff --git a/src/gfx.cc b/src/gfx.cc index 54ed7f9..0afa479 100644 --- a/src/gfx.cc +++ b/src/gfx.cc @@ -14,7 +14,7 @@ #define FRAMEBUFFER_SIZE(xsz, ysz, bpp) ((xsz) * (ysz) * (bpp) / CHAR_BIT) -static unsigned char* framebuffer; +static unsigned char *framebuffer; static int dev_fd = -1; static Rect screen_rect; @@ -65,7 +65,7 @@ void destroy_gfx() framebuffer = 0; } -unsigned char* get_framebuffer() +unsigned char *get_framebuffer() { return framebuffer; } @@ -82,12 +82,19 @@ int get_color_depth() void clear_screen(int r, int g, int b) { - unsigned char* fb = framebuffer; - for(int i=0; i +#include +#include +#include + +#include +#include +#include +#include + #include "mouse.h" #include "geom.h" @@ -7,13 +17,17 @@ static int pointer_x, pointer_y; bool init_mouse() { - // TODO open /dev/psaux (see O_NONBLOCK comment below) + if((dev_fd = open("/dev/psaux", O_NONBLOCK)) == -1) { + fprintf(stderr, "Cannot open /dev/psaux : %s\n", strerror(errno)); + return false; + } + return true; } void destroy_mouse() { - // TODO close /dev/psaux + close(dev_fd); } void set_mouse_bounds(const Rect &rect) diff --git a/src/wm.cc b/src/wm.cc index 0428a7c..16b5a2a 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -1,8 +1,8 @@ #include +#include "gfx.h" #include "wm.h" #include "window.h" - WindowManager *wm; static WindowManager wminst; @@ -13,6 +13,10 @@ WindowManager::WindowManager() } else { throw std::runtime_error("Trying to create a second instance of WindowManager!\n"); } + + bg_color[0] = 210; + bg_color[1] = 106; + bg_color[2] = 106; } void WindowManager::invalidate_region(const Rect &rect) @@ -22,15 +26,23 @@ void WindowManager::invalidate_region(const Rect &rect) void WindowManager::process_windows() { - //TODO: - //sta dirty rectangles na brw to union - //na eleg3w poia einai sto dirty area k na ta kanw dirty - //na ka8arizw ta dirty areas - //prwta render to bg - //meta ola ta dirty: + if(dirty_rects.empty()) { + return; + } + + std::list::iterator drit = dirty_rects.begin(); + Rect uni = *drit++; + while(drit != dirty_rects.end()) { + uni = rect_union(uni, *drit++); + } + dirty_rects.clear(); + + fill_rect(uni, bg_color[0], bg_color[1], bg_color[2]); + std::list::iterator it = windows.begin(); while(it != windows.end()) { - if((*it)->dirty) { + Rect intersect = rect_intersection((*it)->rect, uni); + if(intersect.width && intersect.height) { (*it)->draw(); } } diff --git a/src/wm.h b/src/wm.h index 27ae316..a754186 100644 --- a/src/wm.h +++ b/src/wm.h @@ -11,6 +11,8 @@ private: std::list windows; std::list dirty_rects; + int bg_color[3]; + public: WindowManager(); -- 1.7.10.4