diff options
author | Eleni Maria Stea <elene.mst@gmail.com> | 2013-04-18 10:03:07 +0300 |
---|---|---|
committer | Eleni Maria Stea <elene.mst@gmail.com> | 2013-04-18 10:03:07 +0300 |
commit | ba5399dd00001b5abf21bd1b859bbfc39b8cbdbb (patch) | |
tree | 4afc27af0a009ed9390f222e2723723a81f455fa /libwinnie | |
parent | 1eb2a154bd2294c20b37ce67ab17e8a2e90f6ee1 (diff) |
new clients - license
Diffstat (limited to 'libwinnie')
-rw-r--r-- | libwinnie/Makefile | 5 | ||||
-rw-r--r-- | libwinnie/src/event.h | 4 | ||||
-rw-r--r-- | libwinnie/src/gfx.cc | 2 | ||||
-rw-r--r-- | libwinnie/src/sdl/event.cc | 51 | ||||
-rw-r--r-- | libwinnie/src/sdl/gfx.cc | 2 | ||||
-rw-r--r-- | libwinnie/src/wm.cc | 97 | ||||
-rw-r--r-- | libwinnie/src/wm.h | 10 |
7 files changed, 153 insertions, 18 deletions
diff --git a/libwinnie/Makefile b/libwinnie/Makefile index fac3426..763cb59 100644 --- a/libwinnie/Makefile +++ b/libwinnie/Makefile @@ -8,13 +8,10 @@ dbg = -g opt = -O3 -ffast-math -march=native inc = -Isrc -backend = SDL +include ../backend.mk ifeq ($(backend), SDL) - def = -DWINNIE_SDL libs = -lSDL -else - def = -DWINNIE_FBDEV endif CXX = g++ diff --git a/libwinnie/src/event.h b/libwinnie/src/event.h index b3635c1..46c3b77 100644 --- a/libwinnie/src/event.h +++ b/libwinnie/src/event.h @@ -40,4 +40,8 @@ struct Callbacks { void process_events(); +enum TimerMode {TIMER_ONESHOT, TIMER_REPEAT}; + +void set_window_timer(Window *win, unsigned int msec, TimerMode mode = TIMER_ONESHOT); + #endif diff --git a/libwinnie/src/gfx.cc b/libwinnie/src/gfx.cc index f55c7b0..212ed38 100644 --- a/libwinnie/src/gfx.cc +++ b/libwinnie/src/gfx.cc @@ -306,7 +306,7 @@ void draw_polygon(Pixmap *pixmap, int *vpos, int *vtex, int num_verts, int r, in } unsigned char *pixptr = pixmap->pixels + (i * pixmap->width + x) * 4; - for(int j=0; j<dx; j++) { + for(int j=0; j<=dx; j++) { pixptr[roffs] = r; pixptr[goffs] = g; pixptr[boffs] = b; diff --git a/libwinnie/src/sdl/event.cc b/libwinnie/src/sdl/event.cc index 91b12b2..889e153 100644 --- a/libwinnie/src/sdl/event.cc +++ b/libwinnie/src/sdl/event.cc @@ -28,6 +28,10 @@ Author: Eleni Maria Stea <elene.mst@gmail.com> #include "mouse.h" #include "wm.h" +enum { + TIMER_EVENT = SDL_USEREVENT +}; + SDL_Event sdl_event; void process_events() { @@ -49,10 +53,57 @@ void process_events() break; case SDL_QUIT: exit(0); + + case TIMER_EVENT: + { + Window *win = (Window*)sdl_event.user.data1; + TimerFuncType func = win->get_timer_callback(); + if(func) { + func(win); + } else { + fprintf(stderr, "timer gone off but window has no timer callback!\n"); + } + } + break; + default: break; } } while(SDL_PollEvent(&sdl_event)); } +struct TimerData { + SDL_TimerID sdl_timer; + Window *win; + TimerMode mode; +}; + +static unsigned int timer_callback(unsigned int interval, void *cls) +{ + TimerData *td = (TimerData*)cls; + + SDL_Event ev; + ev.type = TIMER_EVENT; + ev.user.data1 = td->win; + SDL_PushEvent(&ev); + + if(td->mode == TIMER_ONESHOT) { + delete td; + return 0; + } + return interval; // repeat at same interval +} + +void set_window_timer(Window *win, unsigned int msec, TimerMode mode) +{ + if(!win->get_timer_callback()) { + fprintf(stderr, "trying to start a timer without having a timer callback!\n"); + return; + } + TimerData *td = new TimerData; + td->win = win; + td->mode = mode; + td->sdl_timer = SDL_AddTimer(msec, timer_callback, td); +} + #endif // WINNIE_SDL diff --git a/libwinnie/src/sdl/gfx.cc b/libwinnie/src/sdl/gfx.cc index c15cd78..edce8ba 100644 --- a/libwinnie/src/sdl/gfx.cc +++ b/libwinnie/src/sdl/gfx.cc @@ -41,7 +41,7 @@ static Graphics *gfx; bool init_gfx() { - if(SDL_Init(SDL_INIT_VIDEO) == -1) { + if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { fprintf(stderr, "failed to initialize SDL\n"); return false; } diff --git a/libwinnie/src/wm.cc b/libwinnie/src/wm.cc index 9faef1a..6ffb61b 100644 --- a/libwinnie/src/wm.cc +++ b/libwinnie/src/wm.cc @@ -136,11 +136,12 @@ WindowManager::WindowManager() bg_color[1] = 106; bg_color[2] = 106; - frame_thickness = 8; - titlebar_thickness = 16; + frame_thickness = 6; + titlebar_thickness = 18; - set_focused_frame_color(0, 0, 0); - set_unfocused_frame_color(200, 200, 200); + set_focused_frame_color(64, 64, 64); + set_unfocused_frame_color(160, 160, 160); + set_bevel_size(2); mouse_cursor.set_image(mouse_cursor_width, mouse_cursor_height); unsigned char *pixels = mouse_cursor.get_image(); @@ -325,6 +326,36 @@ void WindowManager::get_unfocused_frame_color(int *r, int *g, int *b) const *b = frame_ucolor[2]; } +void WindowManager::set_frame_size(int sz) +{ + frame_thickness = sz; +} + +int WindowManager::get_frame_size() const +{ + return frame_thickness; +} + +void WindowManager::set_titlebar_size(int sz) +{ + titlebar_thickness = sz; +} + +int WindowManager::get_titlebar_size() const +{ + return titlebar_thickness; +} + +void WindowManager::set_bevel_size(int sz) +{ + bevel_sz = sz; +} + +int WindowManager::get_bevel_size() const +{ + return bevel_sz; +} + void WindowManager::set_background_color(int r, int g, int b) { bg_color[0] = r; @@ -410,7 +441,7 @@ void WindowManager::sink_window(Window *win) void WindowManager::maximize_window(Window *win) { win->normal_rect = win->rect; - + Rect rect = get_screen_size(); Window *frame; @@ -428,6 +459,8 @@ void WindowManager::maximize_window(Window *win) win->resize(rect.width, rect.height); win->set_state(Window::STATE_MAXIMIZED); + + invalidate_region(rect); } void WindowManager::unmaximize_window(Window *win) @@ -449,22 +482,62 @@ static void display(Window *win) //frame display: Window *child = win->get_children()[0]; int r, g, b; - Rect abs_rect = win->get_absolute_rect(); + Rect rect = win->get_absolute_rect(); + + int tbar = wm->get_titlebar_size(); + int frm = wm->get_frame_size(); + - //TODO 5 not hardcoded - set_text_position(abs_rect.x + 5, abs_rect.y + 15); - set_text_color(255, 255, 255); if(child == wm->get_focused_window()) { wm->get_focused_frame_color(&r, &g, &b); - fill_rect(abs_rect, r, g, b); } else { wm->get_unfocused_frame_color(&r, &g, &b); - fill_rect(win->get_absolute_rect(), r, g, b); } + // draw the four frame sides (top, bottom, left, right) + fill_rect(Rect(rect.x, rect.y, rect.width, frm), r, g, b); + fill_rect(Rect(rect.x, rect.y + rect.height - frm, rect.width, frm), r, g, b); + fill_rect(Rect(rect.x, rect.y + frm, frm, rect.height - 2 * frm), r, g, b); + fill_rect(Rect(rect.x + rect.width - frm, rect.y + frm, frm, rect.height - 2 * frm), r, g, b); + // draw the titlebar + fill_rect(Rect(rect.x + frm, rect.y + frm, rect.width - 2 * frm, tbar), r, g, b); + + + int val = (r + g + b) / 3; + int roffs = val < 128 ? r / 2 : (255 - r) / 2; + int goffs = val < 128 ? g / 2 : (255 - g) / 2; + int boffs = val < 128 ? b / 2 : (255 - b) / 2; + + // draw bevels + int dark_r = r - roffs; + int dark_g = g - goffs; + int dark_b = b - boffs; + + int lt_r = r + roffs; + int lt_g = g + goffs; + int lt_b = b + boffs; + + + set_text_position(rect.x + frm + 2, rect.y + frm + tbar - 5); + set_text_color(80, 80, 80); draw_text(child->get_title()); + set_text_position(rect.x + frm + 1, rect.y + frm + tbar - 6); + set_text_color(255, 255, 255); + draw_text(child->get_title()); + + int bevel = wm->get_bevel_size(); + fill_rect(Rect(rect.x, rect.y, bevel, rect.height), lt_r, lt_g, lt_b); + fill_rect(Rect(rect.x, rect.y + rect.height - bevel, rect.width, bevel), dark_r, dark_g, dark_b); + fill_rect(Rect(rect.x + rect.width - bevel, rect.y, bevel, rect.height), dark_r, dark_g, dark_b); + fill_rect(Rect(rect.x, rect.y, rect.width, bevel), lt_r, lt_g, lt_b); + + Rect inner = Rect(rect.x + frm, rect.y + frm + tbar, rect.width - frm * 2, rect.height - frm * 2 - tbar); + fill_rect(Rect(inner.x - bevel, inner.y + inner.height, inner.width + 2 * bevel, bevel), lt_r, lt_g, lt_b); + fill_rect(Rect(inner.x - bevel, inner.y - bevel, bevel, inner.height + 2 * bevel), dark_r, dark_g, dark_b); + fill_rect(Rect(inner.x + inner.width, inner.y - bevel, bevel, inner.height + 2 * bevel), lt_r, lt_g, lt_b); + fill_rect(Rect(inner.x - bevel, inner.y - bevel, inner.width + 2 * bevel, bevel), dark_r, dark_g, dark_b); } static int prev_x, prev_y; @@ -474,7 +547,7 @@ static void mouse(Window *win, int bn, bool pressed, int x, int y) static long last_click = 0; if(bn == 0) { - if(pressed) { + if(pressed) { wm->grab_mouse(win); wm->raise_window(win); prev_x = x; diff --git a/libwinnie/src/wm.h b/libwinnie/src/wm.h index 39ee0a0..48fffc5 100644 --- a/libwinnie/src/wm.h +++ b/libwinnie/src/wm.h @@ -47,6 +47,7 @@ private: int titlebar_thickness; int frame_fcolor[3]; int frame_ucolor[3]; + int bevel_sz; Window *root_win; Window *focused_win; @@ -81,6 +82,15 @@ public: void set_unfocused_frame_color(int r, int g, int b); void get_unfocused_frame_color(int *r, int *g, int *b) const; + void set_frame_size(int sz); + int get_frame_size() const; + + void set_titlebar_size(int sz); + int get_titlebar_size() const; + + void set_bevel_size(int sz); + int get_bevel_size() const; + void set_background_color(int r, int g, int b); void get_background_color(int *r, int *g, int *b) const; |