#include "Window.h" #include #include #include #include #include LinkedList g_windows; void Window::draw(ui::Canvas& screen) { dirty = false; auto window = screen.subcanvas(surface); window.subcanvas(contents).fill(pixels, contents.width); wchar_t buffer[4096]; Utf8StringDecoder decoder(name.chars()); decoder.decode(buffer, sizeof(buffer)).release_value(); auto font = ui::Font::default_font(); auto titlebar_canvas = window.subcanvas(titlebar); titlebar_canvas.fill(ui::GRAY); auto textarea = titlebar_canvas.subcanvas(ui::Rect { 10, 10, titlebar_canvas.width - 10, titlebar_canvas.height }); font->render(buffer, ui::BLACK, textarea); static SharedPtr g_close_icon; if (!g_close_icon) g_close_icon = ui::Image::load("/usr/share/icons/16x16/app-close.tga").release_value(); auto close_area = window.subcanvas(close_button); close_area.fill(g_close_icon->pixels(), g_close_icon->width()); } void Window::focus() { // Bring the window to the front of the list. g_windows.remove(this); g_windows.append(this); } Window::Window(ui::Rect r, String&& n) : surface(r), name(move(n)) { auto font = ui::Font::default_font(); if (surface.width < 36) surface.width = 36; if (surface.height < (font->height() + 20)) surface.height = font->height() + 20; titlebar = ui::Rect { 0, 0, surface.width, font->height() + 20 }; close_button = ui::Rect { surface.width - 26, 10, 16, 16 }; contents = ui::Rect { 0, font->height() + 20, surface.width, surface.height - (font->height() + 20) }; g_windows.append(this); } int Window::titlebar_height() { auto font = ui::Font::default_font(); return font->height() + 20; } Window::~Window() { usize size = contents.width * contents.height * 4; munmap(pixels, size); }