#include "gfxcons.h" #include <kernel/driver.h> #include <os/os.h> #include <gui/messages.h> /***************************************************************************** * CGfxConsole * *****************************************************************************/ HRESULT ConsoleWndProc(IWindow* wnd, dword message, dword params) { ISurface* surf; rectangle_t rect; switch (message) { case WM_PAINT: surf = wnd->GetSurface(); surf->GetClipRect(&rect); surf->FillRect(&rect, surf->ColourMatch(0)); surf->Release(); } return wnd->DefWndProc(message, params); } CGfxConsole::CGfxConsole() { IWindowServer* srv; windowdef_t def; m_width = 35; m_height = 22; def.size = sizeof(def); def.flags = WIN_TITLE | WIN_WIDTH | WIN_HEIGHT | WIN_WNDPROC; def.title = L"Console"; def.width = 8 * m_width + 8; def.height = 8 * m_height + 8 + 4 + 12; def.wndproc = ConsoleWndProc; srv = OpenServer(); if (srv) { m_font = srv->GetFont(0); m_wnd = srv->CreateWindow(&def); m_surf = m_wnd->GetSurface(); srv->Release(); } Clear(); } CGfxConsole::~CGfxConsole() { m_wnd->Release(); m_surf->Release(); m_font->Release(); } void CGfxConsole::UpdateCursor() { /*IMsgQueue* queue = (IMsgQueue*) thrGetTls(); msg_t msg; HRESULT (*wndproc) (IWindow*, dword, dword); if (queue && SUCCEEDED(queue->PeekMessage(&msg, true))) { wndproc = (HRESULT (*) (IWindow*, dword, dword)) msg.wnd->GetAttrib(ATTR_WNDPROC); if (wndproc) wndproc(msg.wnd, msg.message, msg.params); else msg.wnd->DefWndProc(msg.message, msg.params); }*/ } void CGfxConsole::Output(int x, int y, wchar_t c, word attrib) { wchar_t str[2] = { c, '\0' }; m_surf->FillRect(rectangle_t(x * 8, y * 8, x * 8 + 8, y * 8 + 8), attrib >> 12); m_font->DrawText(m_surf, x * 8, y * 8, str, (attrib >> 8) & 0xff); } void CGfxConsole::Clear() { m_surf->FillRect(rectangle_t(0, 0, m_width * 8, m_height * 8), m_attrib >> 12); m_con_x = m_con_y = 0; UpdateCursor(); } void CGfxConsole::Scroll(int dx, int dy) { //i386_llmemcpy(0xa0000, 0xa0000 - dy * m_width * 64, 64 * m_width * (m_height + dy)); //m_surf->FillRect(rectangle_t(0, (m_height - 1) * 8, m_width * 8, m_height * 8), m_attrib >> 12); Clear(); }