#include "Window.h" #include #include #include #include LinkedList g_windows; static SharedPtr g_close_icon; void Window::draw(ui::Canvas& screen) { auto window = screen.subcanvas(surface); window.subcanvas(contents).fill(color); 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); if (g_close_icon) { 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, ui::Color c, StringView n) : surface(r), color(c), name(n) { auto font = ui::Font::default_font(); 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); if (!g_close_icon) g_close_icon = ui::Image::load("/usr/share/icons/16x16/app-close.tga").value_or({}); }