summaryrefslogtreecommitdiff
path: root/libwinnie
diff options
context:
space:
mode:
Diffstat (limited to 'libwinnie')
-rw-r--r--libwinnie/Makefile5
-rw-r--r--libwinnie/src/event.h4
-rw-r--r--libwinnie/src/gfx.cc2
-rw-r--r--libwinnie/src/sdl/event.cc51
-rw-r--r--libwinnie/src/sdl/gfx.cc2
-rw-r--r--libwinnie/src/wm.cc97
-rw-r--r--libwinnie/src/wm.h10
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;