summaryrefslogtreecommitdiff
path: root/libwinnie/src/wm.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libwinnie/src/wm.cc')
-rw-r--r--libwinnie/src/wm.cc841
1 files changed, 456 insertions, 385 deletions
diff --git a/libwinnie/src/wm.cc b/libwinnie/src/wm.cc
index 4d0f6d0..86562ba 100644
--- a/libwinnie/src/wm.cc
+++ b/libwinnie/src/wm.cc
@@ -22,12 +22,12 @@ Author: Eleni Maria Stea <elene.mst@gmail.com>
#include <algorithm>
#include <limits.h>
#include <stdexcept>
-#include <stdio.h> // TODO
#include <stdint.h>
+#include <stdio.h>
+#include "mouse_cursor.h"
#include "sdl/gfx.h"
#include "sdl/mouse.h"
-#include "mouse_cursor.h"
#include "text.h"
#include "window.h"
#include "winnie.h"
@@ -41,539 +41,610 @@ static void display(Window *win);
static void mouse(Window *win, int bn, bool pressed, int x, int y);
static void motion(Window *win, int x, int y);
-bool init_window_manager()
+bool
+init_window_manager()
{
- void *wm_mem;
- if(!(wm_mem = malloc(sizeof *wm))) {
- return false;
- }
+ void *wm_mem;
+ if (!(wm_mem = malloc(sizeof *wm))) {
+ return false;
+ }
- wm = new (wm_mem) WindowManager;
+ wm = new (wm_mem) WindowManager;
- get_subsys()->wm_offset = (intptr_t)(wm);
+ get_subsys()->wm_offset = (intptr_t) (wm);
- return true;
+ return true;
}
-void destroy_window_manager()
+void
+destroy_window_manager()
{
- wm->~WindowManager();
- free(wm);
+ wm->~WindowManager();
+ free(wm);
}
-void WindowManager::create_frame(Window *win)
+void
+WindowManager::create_frame(Window *win)
{
- Window *frame = new Window;
- Window *parent = win->get_parent();
+ Window *frame = new Window;
+ Window *parent = win->get_parent();
- frame->set_display_callback(display);
- frame->set_mouse_button_callback(mouse);
- frame->set_mouse_motion_callback(motion);
- frame->set_focusable(false);
- frame->add_child(win);
+ frame->set_display_callback(display);
+ frame->set_mouse_button_callback(mouse);
+ frame->set_mouse_motion_callback(motion);
+ frame->set_focusable(false);
+ frame->add_child(win);
- windows.push_back(frame);
+ windows.push_back(frame);
- Rect win_rect = win->get_rect();
- frame->move(win_rect.x - frame_thickness,
- win_rect.y - frame_thickness - titlebar_thickness);
- frame->resize(win_rect.width + frame_thickness * 2,
- win_rect.height + frame_thickness * 2 + titlebar_thickness);
+ Rect win_rect = win->get_rect();
+ frame->move(win_rect.x - frame_thickness,
+ win_rect.y - frame_thickness - titlebar_thickness);
+ frame->resize(win_rect.width + frame_thickness * 2,
+ win_rect.height + frame_thickness * 2 + titlebar_thickness);
- win->move(frame_thickness, frame_thickness + titlebar_thickness);
- parent->add_child(frame);
+ win->move(frame_thickness, frame_thickness + titlebar_thickness);
+ parent->add_child(frame);
}
-void WindowManager::destroy_frame(Window *win)
+void
+WindowManager::destroy_frame(Window *win)
{
- Window *frame = win->parent;
- if(!frame) {
- return;
- }
+ Window *frame = win->parent;
+ if (!frame) {
+ return;
+ }
- if(grab_win == win) {
- release_mouse();
- }
+ if (grab_win == win) {
+ release_mouse();
+ }
- std::list<Window*>::iterator it;
- it = std::find(windows.begin(), windows.end(), frame);
- if(it != windows.end()) {
- root_win->add_child(win);
- windows.erase(it);
- delete frame;
- }
+ std::list<Window *>::iterator it;
+ it = std::find(windows.begin(), windows.end(), frame);
+ if (it != windows.end()) {
+ root_win->add_child(win);
+ windows.erase(it);
+ delete frame;
+ }
}
WindowManager::WindowManager()
{
- if(!wm) {
- wm = this;
- } else {
- throw std::runtime_error("Trying to create a second instance of WindowManager!\n");
- }
+ if (!wm) {
+ wm = this;
+ } else {
+ throw std::runtime_error(
+ "Trying to create a second instance of WindowManager!\n");
+ }
- root_win = new Window;
- root_win->resize(get_screen_size().width, get_screen_size().height);
- root_win->move(0, 0);
- root_win->set_managed(false);
+ root_win = new Window;
+ root_win->resize(get_screen_size().width, get_screen_size().height);
+ root_win->move(0, 0);
+ root_win->set_managed(false);
- grab_win = 0;
- focused_win = 0;
- background = 0;
+ grab_win = 0;
+ focused_win = 0;
+ background = 0;
- bg_color[0] = 210;
- bg_color[1] = 106;
- bg_color[2] = 106;
+ bg_color[0] = 210;
+ bg_color[1] = 106;
+ bg_color[2] = 106;
- frame_thickness = 6;
- titlebar_thickness = 18;
+ frame_thickness = 6;
+ titlebar_thickness = 18;
- set_focused_frame_color(64, 64, 64);
- set_unfocused_frame_color(160, 160, 160);
- set_bevel_size(2);
+ 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();
+ mouse_cursor.set_image(mouse_cursor_width, mouse_cursor_height);
+ unsigned char *pixels = mouse_cursor.get_image();
- for(int i=0; i<mouse_cursor_height; i++) {
- for(int j=0; j<mouse_cursor_width; j++) {
- int val = mouse_cursor_bw[i * mouse_cursor_width + j];
- *pixels++ = val;
- *pixels++ = val;
- *pixels++ = val;
- *pixels++ = 255;
- }
- }
+ for (int i = 0; i < mouse_cursor_height; i++) {
+ for (int j = 0; j < mouse_cursor_width; j++) {
+ int val = mouse_cursor_bw[i * mouse_cursor_width + j];
+ *pixels++ = val;
+ *pixels++ = val;
+ *pixels++ = val;
+ *pixels++ = 255;
+ }
+ }
}
-WindowManager::~WindowManager()
-{
- delete root_win;
-}
+WindowManager::~WindowManager() { delete root_win; }
-void WindowManager::invalidate_region(const Rect &rect)
+void
+WindowManager::invalidate_region(const Rect &rect)
{
- dirty_rects.push_back(rect);
+ dirty_rects.push_back(rect);
}
-void WindowManager::process_windows()
+void
+WindowManager::process_windows()
{
- if(dirty_rects.empty()) {
- return;
- }
+ if (dirty_rects.empty()) {
+ return;
+ }
- std::list<Rect>::iterator drit = dirty_rects.begin();
- Rect uni = *drit++;
- while(drit != dirty_rects.end()) {
- uni = rect_union(uni, *drit++);
- }
- dirty_rects.clear();
+ std::list<Rect>::iterator drit = dirty_rects.begin();
+ Rect uni = *drit++;
+ while (drit != dirty_rects.end()) {
+ uni = rect_union(uni, *drit++);
+ }
+ dirty_rects.clear();
- wait_vsync();
+ wait_vsync();
- if(!background) {
- fill_rect(uni, bg_color[0], bg_color[1], bg_color[2]);
- }
- else {
- blit(background->pixels, Rect(0, 0, background->width, background->height),
- get_framebuffer(), get_screen_size(), 0, 0);
- }
+ if (!background) {
+ fill_rect(uni, bg_color[0], bg_color[1], bg_color[2]);
+ } else {
+ blit(background->pixels,
+ Rect(0, 0, background->width, background->height),
+ get_framebuffer(),
+ get_screen_size(),
+ 0,
+ 0);
+ }
- root_win->draw_children(uni);
+ root_win->draw_children(uni);
- // draw mouse cursor
- int mouse_x, mouse_y;
- get_pointer_pos(&mouse_x, &mouse_y);
+ // draw mouse cursor
+ int mouse_x, mouse_y;
+ get_pointer_pos(&mouse_x, &mouse_y);
- blit_key(mouse_cursor.get_image(), mouse_cursor.get_rect(),
- get_framebuffer(), get_screen_size(), mouse_x, mouse_y,
- 0, 0, 0);
+ blit_key(mouse_cursor.get_image(),
+ mouse_cursor.get_rect(),
+ get_framebuffer(),
+ get_screen_size(),
+ mouse_x,
+ mouse_y,
+ 0,
+ 0,
+ 0);
- Rect mouse_rect(mouse_x, mouse_y, mouse_cursor.get_width(), mouse_cursor.get_height());
- invalidate_region(mouse_rect);
+ Rect mouse_rect(
+ mouse_x, mouse_y, mouse_cursor.get_width(), mouse_cursor.get_height());
+ invalidate_region(mouse_rect);
- gfx_update(uni);
+ gfx_update(uni);
}
-void WindowManager::add_window(Window *win)
+void
+WindowManager::add_window(Window *win)
{
- if(!win || win == root_win) {
- return;
- }
+ if (!win || win == root_win) {
+ return;
+ }
- root_win->add_child(win);
+ root_win->add_child(win);
- if(windows.empty()) {
- focused_win = win;
- }
+ if (windows.empty()) {
+ focused_win = win;
+ }
- if(win->get_managed()) {
- create_frame(win);
- }
+ if (win->get_managed()) {
+ create_frame(win);
+ }
- windows.push_back(win);
+ windows.push_back(win);
}
-void WindowManager::remove_window(Window *win)
+void
+WindowManager::remove_window(Window *win)
{
- std::list<Window*>::iterator it;
- it = std::find(windows.begin(), windows.end(), win);
+ std::list<Window *>::iterator it;
+ it = std::find(windows.begin(), windows.end(), win);
- if(it != windows.end()) {
- windows.erase(it);
- }
+ if (it != windows.end()) {
+ windows.erase(it);
+ }
}
-void WindowManager::set_focused_window(Window *win)
+void
+WindowManager::set_focused_window(Window *win)
{
- if(win && win == focused_win) {
- return;
- }
+ if (win && win == focused_win) {
+ return;
+ }
- if(focused_win) {
- // invalidate the frame (if any)
- Window *parent = focused_win->get_parent();
- if(parent && parent != root_win) {
- parent->invalidate();
- }
- }
+ if (focused_win) {
+ // invalidate the frame (if any)
+ Window *parent = focused_win->get_parent();
+ if (parent && parent != root_win) {
+ parent->invalidate();
+ }
+ }
- if(!win) {
- focused_win = 0;
- return;
- }
+ if (!win) {
+ focused_win = 0;
+ return;
+ }
- if(win->get_focusable()) {
- focused_win = win;
- 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;
- }
- }
+ 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;
+ focused_win = 0;
}
-const Window *WindowManager::get_focused_window() const
+const Window *
+WindowManager::get_focused_window() const
{
- return focused_win;
+ return focused_win;
}
-Window *WindowManager::get_focused_window()
+Window *
+WindowManager::get_focused_window()
{
- return focused_win;
+ return focused_win;
}
-Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y)
+Window *
+WindowManager::get_window_at_pos(int pointer_x, int pointer_y)
{
- Window *root_win = wm->get_root_window();
- Window **children = root_win->get_children();
- for(int i=root_win->get_children_count() - 1; i>=0; i--) {
- if(children[i]->contains_point(pointer_x, pointer_y)) {
- return children[i];
- }
- }
+ Window *root_win = wm->get_root_window();
+ Window **children = root_win->get_children();
+ for (int i = root_win->get_children_count() - 1; i >= 0; i--) {
+ if (children[i]->contains_point(pointer_x, pointer_y)) {
+ return children[i];
+ }
+ }
- return 0;
+ return 0;
}
-Window *WindowManager::get_root_window() const
+Window *
+WindowManager::get_root_window() const
{
- return root_win;
+ return root_win;
}
-void WindowManager::set_focused_frame_color(int r, int g, int b)
+void
+WindowManager::set_focused_frame_color(int r, int g, int b)
{
- frame_fcolor[0] = r;
- frame_fcolor[1] = g;
- frame_fcolor[2] = b;
+ frame_fcolor[0] = r;
+ frame_fcolor[1] = g;
+ frame_fcolor[2] = b;
}
-void WindowManager::get_focused_frame_color(int *r, int *g, int *b) const
+void
+WindowManager::get_focused_frame_color(int *r, int *g, int *b) const
{
- *r = frame_fcolor[0];
- *g = frame_fcolor[1];
- *b = frame_fcolor[2];
+ *r = frame_fcolor[0];
+ *g = frame_fcolor[1];
+ *b = frame_fcolor[2];
}
-void WindowManager::set_unfocused_frame_color(int r, int g, int b)
+void
+WindowManager::set_unfocused_frame_color(int r, int g, int b)
{
- frame_ucolor[0] = r;
- frame_ucolor[1] = g;
- frame_ucolor[2] = b;
+ frame_ucolor[0] = r;
+ frame_ucolor[1] = g;
+ frame_ucolor[2] = b;
}
-void WindowManager::get_unfocused_frame_color(int *r, int *g, int *b) const
+void
+WindowManager::get_unfocused_frame_color(int *r, int *g, int *b) const
{
- *r = frame_ucolor[0];
- *g = frame_ucolor[1];
- *b = frame_ucolor[2];
+ *r = frame_ucolor[0];
+ *g = frame_ucolor[1];
+ *b = frame_ucolor[2];
}
-void WindowManager::set_frame_size(int sz)
+void
+WindowManager::set_frame_size(int sz)
{
- frame_thickness = sz;
+ frame_thickness = sz;
}
-int WindowManager::get_frame_size() const
+int
+WindowManager::get_frame_size() const
{
- return frame_thickness;
+ return frame_thickness;
}
-void WindowManager::set_titlebar_size(int sz)
+void
+WindowManager::set_titlebar_size(int sz)
{
- titlebar_thickness = sz;
+ titlebar_thickness = sz;
}
-int WindowManager::get_titlebar_size() const
+int
+WindowManager::get_titlebar_size() const
{
- return titlebar_thickness;
+ return titlebar_thickness;
}
-void WindowManager::set_bevel_size(int sz)
+void
+WindowManager::set_bevel_size(int sz)
{
- bevel_sz = sz;
+ bevel_sz = sz;
}
-int WindowManager::get_bevel_size() const
+int
+WindowManager::get_bevel_size() const
{
- return bevel_sz;
+ return bevel_sz;
}
-void WindowManager::set_background_color(int r, int g, int b)
+void
+WindowManager::set_background_color(int r, int g, int b)
{
- bg_color[0] = r;
- bg_color[1] = g;
- bg_color[2] = b;
+ bg_color[0] = r;
+ bg_color[1] = g;
+ bg_color[2] = b;
}
-void WindowManager::get_background_color(int *r, int *g, int *b) const
+void
+WindowManager::get_background_color(int *r, int *g, int *b) const
{
- *r = bg_color[0];
- *g = bg_color[1];
- *b = bg_color[2];
+ *r = bg_color[0];
+ *g = bg_color[1];
+ *b = bg_color[2];
}
-void WindowManager::set_background(const Pixmap *pixmap)
+void
+WindowManager::set_background(const Pixmap *pixmap)
{
- if(background) {
- delete background;
- }
+ if (background) {
+ delete background;
+ }
- if(pixmap) {
- background = new Pixmap(*pixmap);
- }
- else {
- background = 0;
- }
+ if (pixmap) {
+ background = new Pixmap(*pixmap);
+ } else {
+ background = 0;
+ }
}
-const Pixmap *WindowManager::get_background() const
+const Pixmap *
+WindowManager::get_background() const
{
- return background;
+ return background;
}
-Window *WindowManager::get_grab_window() const
+Window *
+WindowManager::get_grab_window() const
{
- return grab_win;
+ return grab_win;
}
-void WindowManager::grab_mouse(Window *win)
+void
+WindowManager::grab_mouse(Window *win)
{
- grab_win = win;
+ grab_win = win;
}
-void WindowManager::release_mouse()
+void
+WindowManager::release_mouse()
{
- grab_win = 0;
+ grab_win = 0;
}
-void WindowManager::raise_window(Window *win)
+void
+WindowManager::raise_window(Window *win)
{
- if(!win) {
- return;
- }
+ if (!win) {
+ return;
+ }
- Window *parent = win->get_parent();
- if(parent != root_win) {
- if(parent->get_parent() == root_win) {
- win = parent;
- }
- else {
- return;
- }
- }
+ Window *parent = win->get_parent();
+ if (parent != root_win) {
+ if (parent->get_parent() == root_win) {
+ win = parent;
+ } else {
+ return;
+ }
+ }
- root_win->remove_child(win);
- root_win->add_child(win);
+ root_win->remove_child(win);
+ root_win->add_child(win);
}
-void WindowManager::sink_window(Window *win)
+void
+WindowManager::sink_window(Window *win)
{
- if(!win) {
- return;
- }
+ if (!win) {
+ return;
+ }
- std::list<Window*>::iterator it;
- it = std::find(windows.begin(), windows.end(), win);
- if(it != windows.end()) {
- windows.erase(it);
- windows.push_front(win);
- }
+ std::list<Window *>::iterator it;
+ it = std::find(windows.begin(), windows.end(), win);
+ if (it != windows.end()) {
+ windows.erase(it);
+ windows.push_front(win);
+ }
}
-void WindowManager::maximize_window(Window *win)
+void
+WindowManager::maximize_window(Window *win)
{
- win->normal_rect = win->rect;
-
- Rect rect = get_screen_size();
-
- Window *frame;
- if((frame = win->get_parent())) {
- frame->normal_rect = frame->rect;
- frame->resize(rect.width, rect.height);
- frame->move(rect.x, rect.y);
+ win->normal_rect = win->rect;
- rect.width -= frame_thickness * 2;
- rect.height -= frame_thickness * 2 + titlebar_thickness;
- }
- else {
- win->move(0, 0);
- }
+ Rect rect = get_screen_size();
- win->resize(rect.width, rect.height);
- win->set_state(Window::STATE_MAXIMIZED);
+ Window *frame;
+ if ((frame = win->get_parent())) {
+ frame->normal_rect = frame->rect;
+ frame->resize(rect.width, rect.height);
+ frame->move(rect.x, rect.y);
- invalidate_region(rect);
-}
-
-void WindowManager::unmaximize_window(Window *win)
-{
- win->resize(win->normal_rect.width, win->normal_rect.height);
- win->move(win->normal_rect.x, win->normal_rect.y);
+ rect.width -= frame_thickness * 2;
+ rect.height -= frame_thickness * 2 + titlebar_thickness;
+ } else {
+ win->move(0, 0);
+ }
- Window *frame;
- if((frame = win->get_parent())) {
- frame->resize(frame->normal_rect.width, frame->normal_rect.height);
- frame->move(frame->normal_rect.x, frame->normal_rect.y);
- }
+ win->resize(rect.width, rect.height);
+ win->set_state(Window::STATE_MAXIMIZED);
- win->set_state(Window::STATE_NORMAL);
+ invalidate_region(rect);
}
-static void display(Window *win)
-{
- //frame display:
- Window *child = win->get_children()[0];
- int r, g, b;
- Rect rect = win->get_absolute_rect();
-
- int tbar = wm->get_titlebar_size();
- int frm = wm->get_frame_size();
-
-
-
- if(child == wm->get_focused_window()) {
- wm->get_focused_frame_color(&r, &g, &b);
- }
- else {
- wm->get_unfocused_frame_color(&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);
+void
+WindowManager::unmaximize_window(Window *win)
+{
+ win->resize(win->normal_rect.width, win->normal_rect.height);
+ win->move(win->normal_rect.x, win->normal_rect.y);
+
+ Window *frame;
+ if ((frame = win->get_parent())) {
+ frame->resize(frame->normal_rect.width, frame->normal_rect.height);
+ frame->move(frame->normal_rect.x, frame->normal_rect.y);
+ }
+
+ win->set_state(Window::STATE_NORMAL);
+}
+
+static void
+display(Window *win)
+{
+ // frame display:
+ Window *child = win->get_children()[0];
+ int r, g, b;
+ Rect rect = win->get_absolute_rect();
+
+ int tbar = wm->get_titlebar_size();
+ int frm = wm->get_frame_size();
+
+ if (child == wm->get_focused_window()) {
+ wm->get_focused_frame_color(&r, &g, &b);
+ } else {
+ wm->get_unfocused_frame_color(&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;
-static void mouse(Window *win, int bn, bool pressed, int x, int y)
-{
- static long last_click = 0;
-
- if(bn == 0) {
- if(pressed) {
- wm->grab_mouse(win);
- wm->raise_window(win);
- prev_x = x;
- prev_y = y;
- }
- else {
- long time = winnie_get_time();
- if((time - last_click) < DCLICK_INTERVAL) {
- Window *child = win->get_children()[0];
- Window::State state = child->get_state();
- if(state == Window::STATE_MAXIMIZED) {
- wm->unmaximize_window(child);
- }
- else if(state == Window::STATE_NORMAL) {
- wm->maximize_window(child);
- }
- }
- last_click = time;
-
- wm->release_mouse();
- }
- }
-}
-
-static void motion(Window *win, int x, int y)
-{
- int left_bn = get_button(0);
-
- if(left_bn) {
- int dx = x - prev_x;
- int dy = y - prev_y;
- prev_x = x - dx;
- prev_y = y - dy;
-
- if(win->get_children()[0]->get_state() != Window::STATE_MAXIMIZED) {
- Rect rect = win->get_rect();
- win->move(rect.x + dx, rect.y + dy);
- }
- }
+static void
+mouse(Window *win, int bn, bool pressed, int x, int y)
+{
+ static long last_click = 0;
+
+ if (bn == 0) {
+ if (pressed) {
+ wm->grab_mouse(win);
+ wm->raise_window(win);
+ prev_x = x;
+ prev_y = y;
+ } else {
+ long time = winnie_get_time();
+ if ((time - last_click) < DCLICK_INTERVAL) {
+ Window *child = win->get_children()[0];
+ Window::State state = child->get_state();
+ if (state == Window::STATE_MAXIMIZED) {
+ wm->unmaximize_window(child);
+ } else if (state == Window::STATE_NORMAL) {
+ wm->maximize_window(child);
+ }
+ }
+ last_click = time;
+
+ wm->release_mouse();
+ }
+ }
+}
+
+static void
+motion(Window *win, int x, int y)
+{
+ int left_bn = get_button(0);
+
+ if (left_bn) {
+ int dx = x - prev_x;
+ int dy = y - prev_y;
+ prev_x = x - dx;
+ prev_y = y - dy;
+
+ if (win->get_children()[0]->get_state() != Window::STATE_MAXIMIZED) {
+ Rect rect = win->get_rect();
+ win->move(rect.x + dx, rect.y + dy);
+ }
+ }
}