From 4bffdd239488360c4c37f0aca51d590718a10234 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 18 Jan 2019 15:55:28 +0100 Subject: [PATCH] WindowServer: Use a different border color for windows being dragged. Also get rid of an unnecessary invalidation on drag end. --- WindowServer/WSWindowManager.cpp | 51 ++++++++++++++++++++------------ WindowServer/WSWindowManager.h | 7 +++-- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index 21132c86f9..0a769e6d2b 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -127,6 +127,9 @@ WSWindowManager::WSWindowManager() 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_dragging_window_title_color = Color::White; + m_cursor_bitmap_inner = CharacterBitmap::create_from_ascii(cursor_bitmap_inner_ascii, 12, 17); m_cursor_bitmap_outer = CharacterBitmap::create_from_ascii(cursor_bitmap_outer_ascii, 12, 17); @@ -157,14 +160,25 @@ void WSWindowManager::paint_window_frame(WSWindow& window) window.height() + 2 }; - auto titleColor = &window == activeWindow() ? m_active_window_title_color : m_inactive_window_title_color; - auto borderColor = &window == activeWindow() ? m_active_window_border_color : m_inactive_window_border_color; + Color title_color; + Color border_color; - m_back_painter->fill_rect(titleBarRect, borderColor); + if (&window == m_drag_window.ptr()) { + border_color = m_dragging_window_border_color; + title_color = m_dragging_window_title_color; + } else if (&window == m_active_window.ptr()) { + border_color = m_active_window_border_color; + title_color = m_active_window_title_color; + } else { + border_color = m_inactive_window_border_color; + title_color = m_inactive_window_title_color; + } + + m_back_painter->fill_rect(titleBarRect, border_color); m_back_painter->draw_rect(borderRect, Color::MidGray); - m_back_painter->draw_rect(outerRect, borderColor); - m_back_painter->draw_rect(inner_border_rect, borderColor); - m_back_painter->draw_text(titleBarTitleRect, window.title(), Painter::TextAlignment::CenterLeft, titleColor); + 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); } void WSWindowManager::add_window(WSWindow& window) @@ -172,7 +186,7 @@ void WSWindowManager::add_window(WSWindow& window) LOCKER(m_lock); m_windows.set(&window); m_windows_in_order.append(&window); - if (!activeWindow()) + if (!active_window()) set_active_window(&window); } @@ -192,7 +206,7 @@ void WSWindowManager::remove_window(WSWindow& window) invalidate(window); m_windows.remove(&window); m_windows_in_order.remove(&window); - if (!activeWindow() && !m_windows.is_empty()) + if (!active_window() && !m_windows.is_empty()) set_active_window(*m_windows.begin()); } @@ -216,7 +230,7 @@ void WSWindowManager::handle_titlebar_mouse_event(WSWindow& window, MouseEvent& #ifdef DRAG_DEBUG printf("[WM] Begin dragging WSWindow{%p}\n", &window); #endif - m_dragWindow = window.makeWeakPtr();; + m_drag_window = window.makeWeakPtr();; m_drag_origin = event.position(); m_drag_window_origin = window.position(); m_drag_start_rect = outerRectForWindow(window.rect()); @@ -228,30 +242,29 @@ void WSWindowManager::handle_titlebar_mouse_event(WSWindow& window, MouseEvent& void WSWindowManager::process_mouse_event(MouseEvent& event) { if (event.type() == WSEvent::MouseUp && event.button() == MouseButton::Left) { - if (m_dragWindow) { + if (m_drag_window) { #ifdef DRAG_DEBUG printf("[WM] Finish dragging WSWindow{%p}\n", m_dragWindow.ptr()); #endif - invalidate(m_drag_start_rect); - invalidate(*m_dragWindow); - m_dragWindow->set_is_being_dragged(false); - m_drag_end_rect = outerRectForWindow(m_dragWindow->rect()); - m_dragWindow = nullptr; + invalidate(*m_drag_window); + m_drag_window->set_is_being_dragged(false); + m_drag_end_rect = outerRectForWindow(m_drag_window->rect()); + m_drag_window = nullptr; return; } } if (event.type() == WSEvent::MouseMove) { - if (m_dragWindow) { - auto old_window_rect = m_dragWindow->rect(); + if (m_drag_window) { + auto old_window_rect = m_drag_window->rect(); Point pos = m_drag_window_origin; #ifdef DRAG_DEBUG dbgprintf("[WM] Dragging [origin: %d,%d] now: %d,%d\n", m_dragOrigin.x(), m_dragOrigin.y(), event.x(), event.y()); #endif pos.move_by(event.x() - m_drag_origin.x(), event.y() - m_drag_origin.y()); - m_dragWindow->set_position_without_repaint(pos); + m_drag_window->set_position_without_repaint(pos); invalidate(outerRectForWindow(old_window_rect)); - invalidate(outerRectForWindow(m_dragWindow->rect())); + invalidate(outerRectForWindow(m_drag_window->rect())); return; } } diff --git a/WindowServer/WSWindowManager.h b/WindowServer/WSWindowManager.h index 9df93d8515..4b429ace26 100644 --- a/WindowServer/WSWindowManager.h +++ b/WindowServer/WSWindowManager.h @@ -25,7 +25,7 @@ public: void notify_title_changed(WSWindow&); void notify_rect_changed(WSWindow&, const Rect& oldRect, const Rect& newRect); - WSWindow* activeWindow() { return m_active_window.ptr(); } + WSWindow* active_window() { return m_active_window.ptr(); } void move_to_front(WSWindow&); @@ -62,12 +62,15 @@ private: Color m_inactive_window_border_color; Color m_inactive_window_title_color; + Color m_dragging_window_border_color; + Color m_dragging_window_title_color; + HashTable m_windows; InlineLinkedList m_windows_in_order; WeakPtr m_active_window; - WeakPtr m_dragWindow; + WeakPtr m_drag_window; Point m_drag_origin; Point m_drag_window_origin;