diff --git a/Kernel/i386.cpp b/Kernel/i386.cpp index 631aa32527..4a0d1faeb8 100644 --- a/Kernel/i386.cpp +++ b/Kernel/i386.cpp @@ -150,6 +150,35 @@ void exception_6_handler(RegisterDump& regs) current->crash(); } +// 7: FPU exception +EH_ENTRY_NO_CODE(7); +void exception_7_handler(RegisterDump& regs) +{ + (void)regs; +#ifdef FPU_EXCEPTION_DEBUG + kprintf("%s FPU exception: %u(%s)\n", current->isRing0() ? "Kernel" : "Process", current->pid(), current->name().characters()); + + word ss; + dword esp; + if (current->isRing0()) { + ss = regs.ds; + esp = regs.esp; + } else { + ss = regs.ss_if_crossRing; + esp = regs.esp_if_crossRing; + } + + kprintf("pc=%w:%x ds=%w es=%w fs=%w gs=%w\n", regs.cs, regs.eip, regs.ds, regs.es, regs.fs, regs.gs); + kprintf("stk=%w:%x\n", ss, esp); + kprintf("eax=%x ebx=%x ecx=%x edx=%x\n", regs.eax, regs.ebx, regs.ecx, regs.edx); + kprintf("ebp=%x esp=%x esi=%x edi=%x\n", regs.ebp, esp, regs.esi, regs.edi); +#endif + + // FIXME: Do stuff. + asm volatile("clts"); +} + + // 13: General Protection Fault EH_ENTRY(13); void exception_13_handler(RegisterDumpWithExceptionCode& regs) @@ -280,7 +309,6 @@ EH(2, "Unknown error") EH(3, "Breakpoint") EH(4, "Overflow") EH(5, "Bounds check") -EH(7, "Coprocessor not available") EH(8, "Double fault") EH(9, "Coprocessor segment overrun") EH(10, "Invalid TSS") @@ -408,7 +436,7 @@ void idt_init() register_interrupt_handler(0x04, _exception4); register_interrupt_handler(0x05, _exception5); register_interrupt_handler(0x06, exception_6_entry); - register_interrupt_handler(0x07, _exception7); + register_interrupt_handler(0x07, exception_7_entry); register_interrupt_handler(0x08, _exception8); register_interrupt_handler(0x09, _exception9); register_interrupt_handler(0x0a, _exception10); diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 4df345664e..0e1f835d8f 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -138,6 +138,10 @@ void init() gdt_init(); idt_init(); +#ifndef NO_FPU + asm volatile("fninit"); +#endif + VFS::initialize_globals(); vfs = new VFS; diff --git a/SharedGraphics/Color.h b/SharedGraphics/Color.h index 11758c6f2c..b38ecbb5ab 100644 --- a/SharedGraphics/Color.h +++ b/SharedGraphics/Color.h @@ -29,6 +29,10 @@ public: Color(byte r, byte g, byte b) : m_value((r << 16) | (g << 8) | b) { } Color(RGBA32 rgba) : m_value(rgba) { } + int red() const { return (m_value >> 16) & 0xff; } + int green() const { return (m_value >> 8) & 0xff; } + int blue() const { return m_value & 0xff; } + RGBA32 value() const { return m_value; } private: diff --git a/SharedGraphics/Painter.cpp b/SharedGraphics/Painter.cpp index d41af4324c..78bf292499 100644 --- a/SharedGraphics/Painter.cpp +++ b/SharedGraphics/Painter.cpp @@ -74,6 +74,45 @@ void Painter::fill_rect(const Rect& a_rect, Color color) } } +void Painter::fill_rect_with_gradient(const Rect& a_rect, Color gradient_start, Color gradient_end) +{ +#ifdef NO_FPU + return fill_rect(a_rect, gradient_start); +#endif + auto rect = a_rect; + rect.move_by(m_translation); + auto clipped_rect = Rect::intersection(rect, m_clip_rect); + if (clipped_rect.is_empty()) + return; + + int x_offset = clipped_rect.x() - rect.x(); + + RGBA32* dst = m_target->scanline(clipped_rect.top()) + clipped_rect.left(); + const unsigned dst_skip = m_target->width(); + + float increment = (1.0/((rect.width())/255.0)); + + int r2 = gradient_start.red(); + int g2 = gradient_start.green(); + int b2 = gradient_start.blue(); + int r1 = gradient_end.red(); + int g1 = gradient_end.green(); + int b1 = gradient_end.blue(); + + for (int i = clipped_rect.height() - 1; i >= 0; --i) { + float c = x_offset * increment; + for (int j = 0; j < clipped_rect.width(); ++j) { + dst[j] = Color( + r1 / 255.0 * c + r2 / 255.0 * (255 - c), + g1 / 255.0 * c + g2 / 255.0 * (255 - c), + b1 / 255.0 * c + b2 / 255.0 * (255 - c) + ).value(); + c += increment; + } + dst += dst_skip; + } +} + void Painter::draw_rect(const Rect& a_rect, Color color) { Rect rect = a_rect; diff --git a/SharedGraphics/Painter.h b/SharedGraphics/Painter.h index 5c433d56f8..45e4f6f08c 100644 --- a/SharedGraphics/Painter.h +++ b/SharedGraphics/Painter.h @@ -23,6 +23,7 @@ public: explicit Painter(GraphicsBitmap&); ~Painter(); void fill_rect(const Rect&, Color); + void fill_rect_with_gradient(const Rect&, Color gradient_start, Color gradient_end); void draw_rect(const Rect&, Color); void draw_bitmap(const Point&, const CharacterBitmap&, Color = Color()); void set_pixel(const Point&, Color); diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index 309a59ed20..f747cc44b5 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -121,12 +121,15 @@ WSWindowManager::WSWindowManager() m_front_painter = make(*m_front_bitmap); m_back_painter = make(*m_back_bitmap); - m_background_color = Color(0, 72, 96); - m_active_window_border_color = Color(0, 64, 192); + m_background_color = Color(50, 50, 50); + m_active_window_border_color = Color(110, 34, 9); + m_active_window_border_color2 = Color(244, 202, 158); m_active_window_title_color = Color::White; - m_inactive_window_border_color = Color(64, 64, 64); - m_inactive_window_title_color = Color::White; - m_dragging_window_border_color = Color(32, 96, 216); + m_inactive_window_border_color = Color(128, 128, 128); + m_inactive_window_border_color2 = Color(192, 192, 192); + m_inactive_window_title_color = Color(213, 208, 199); + m_dragging_window_border_color = Color(161, 50, 13); + m_dragging_window_border_color2 = Color(250, 220, 187); m_dragging_window_title_color = Color::White; m_cursor_bitmap_inner = CharacterBitmap::create_from_ascii(cursor_bitmap_inner_ascii, 12, 17); @@ -161,25 +164,29 @@ void WSWindowManager::paint_window_frame(WSWindow& window) Color title_color; Color border_color; + Color border_color2; if (&window == m_drag_window.ptr()) { border_color = m_dragging_window_border_color; + border_color2 = m_dragging_window_border_color2; title_color = m_dragging_window_title_color; } else if (&window == m_active_window.ptr()) { border_color = m_active_window_border_color; + border_color2 = m_active_window_border_color2; title_color = m_active_window_title_color; } else { border_color = m_inactive_window_border_color; + border_color2 = m_inactive_window_border_color2; title_color = m_inactive_window_title_color; } - m_back_painter->fill_rect(titleBarRect, border_color); + m_back_painter->fill_rect_with_gradient(titleBarRect, border_color, border_color2); m_back_painter->draw_rect(borderRect, Color::MidGray); m_back_painter->draw_rect(outerRect, border_color); m_back_painter->draw_rect(inner_border_rect, border_color); m_back_painter->draw_text(titleBarTitleRect, window.title(), Painter::TextAlignment::CenterLeft, title_color); - Color metadata_color(204, 204, 204); + Color metadata_color(96, 96, 96); char buffer[64]; ksprintf(buffer, "%d:%d", window.pid(), window.window_id()); m_back_painter->draw_text(titleBarTitleRect, buffer, Painter::TextAlignment::CenterRight, metadata_color); diff --git a/WindowServer/WSWindowManager.h b/WindowServer/WSWindowManager.h index 27b8dbe862..8af6937f92 100644 --- a/WindowServer/WSWindowManager.h +++ b/WindowServer/WSWindowManager.h @@ -58,10 +58,13 @@ private: Color m_background_color; Color m_active_window_border_color; + Color m_active_window_border_color2; Color m_active_window_title_color; Color m_inactive_window_border_color; + Color m_inactive_window_border_color2; Color m_inactive_window_title_color; Color m_dragging_window_border_color; + Color m_dragging_window_border_color2; Color m_dragging_window_title_color; HashTable m_windows;