mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 11:47:45 +00:00
WindowServer: Use a different border color for windows being dragged.
Also get rid of an unnecessary invalidation on drag end.
This commit is contained in:
parent
7e044cf293
commit
4bffdd2394
2 changed files with 37 additions and 21 deletions
|
@ -127,6 +127,9 @@ WSWindowManager::WSWindowManager()
|
||||||
m_inactive_window_border_color = Color(64, 64, 64);
|
m_inactive_window_border_color = Color(64, 64, 64);
|
||||||
m_inactive_window_title_color = Color::White;
|
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_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);
|
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
|
window.height() + 2
|
||||||
};
|
};
|
||||||
|
|
||||||
auto titleColor = &window == activeWindow() ? m_active_window_title_color : m_inactive_window_title_color;
|
Color title_color;
|
||||||
auto borderColor = &window == activeWindow() ? m_active_window_border_color : m_inactive_window_border_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(borderRect, Color::MidGray);
|
||||||
m_back_painter->draw_rect(outerRect, borderColor);
|
m_back_painter->draw_rect(outerRect, border_color);
|
||||||
m_back_painter->draw_rect(inner_border_rect, borderColor);
|
m_back_painter->draw_rect(inner_border_rect, border_color);
|
||||||
m_back_painter->draw_text(titleBarTitleRect, window.title(), Painter::TextAlignment::CenterLeft, titleColor);
|
m_back_painter->draw_text(titleBarTitleRect, window.title(), Painter::TextAlignment::CenterLeft, title_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WSWindowManager::add_window(WSWindow& window)
|
void WSWindowManager::add_window(WSWindow& window)
|
||||||
|
@ -172,7 +186,7 @@ void WSWindowManager::add_window(WSWindow& window)
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
m_windows.set(&window);
|
m_windows.set(&window);
|
||||||
m_windows_in_order.append(&window);
|
m_windows_in_order.append(&window);
|
||||||
if (!activeWindow())
|
if (!active_window())
|
||||||
set_active_window(&window);
|
set_active_window(&window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,7 +206,7 @@ void WSWindowManager::remove_window(WSWindow& window)
|
||||||
invalidate(window);
|
invalidate(window);
|
||||||
m_windows.remove(&window);
|
m_windows.remove(&window);
|
||||||
m_windows_in_order.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());
|
set_active_window(*m_windows.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,7 +230,7 @@ void WSWindowManager::handle_titlebar_mouse_event(WSWindow& window, MouseEvent&
|
||||||
#ifdef DRAG_DEBUG
|
#ifdef DRAG_DEBUG
|
||||||
printf("[WM] Begin dragging WSWindow{%p}\n", &window);
|
printf("[WM] Begin dragging WSWindow{%p}\n", &window);
|
||||||
#endif
|
#endif
|
||||||
m_dragWindow = window.makeWeakPtr();;
|
m_drag_window = window.makeWeakPtr();;
|
||||||
m_drag_origin = event.position();
|
m_drag_origin = event.position();
|
||||||
m_drag_window_origin = window.position();
|
m_drag_window_origin = window.position();
|
||||||
m_drag_start_rect = outerRectForWindow(window.rect());
|
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)
|
void WSWindowManager::process_mouse_event(MouseEvent& event)
|
||||||
{
|
{
|
||||||
if (event.type() == WSEvent::MouseUp && event.button() == MouseButton::Left) {
|
if (event.type() == WSEvent::MouseUp && event.button() == MouseButton::Left) {
|
||||||
if (m_dragWindow) {
|
if (m_drag_window) {
|
||||||
#ifdef DRAG_DEBUG
|
#ifdef DRAG_DEBUG
|
||||||
printf("[WM] Finish dragging WSWindow{%p}\n", m_dragWindow.ptr());
|
printf("[WM] Finish dragging WSWindow{%p}\n", m_dragWindow.ptr());
|
||||||
#endif
|
#endif
|
||||||
invalidate(m_drag_start_rect);
|
invalidate(*m_drag_window);
|
||||||
invalidate(*m_dragWindow);
|
m_drag_window->set_is_being_dragged(false);
|
||||||
m_dragWindow->set_is_being_dragged(false);
|
m_drag_end_rect = outerRectForWindow(m_drag_window->rect());
|
||||||
m_drag_end_rect = outerRectForWindow(m_dragWindow->rect());
|
m_drag_window = nullptr;
|
||||||
m_dragWindow = nullptr;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.type() == WSEvent::MouseMove) {
|
if (event.type() == WSEvent::MouseMove) {
|
||||||
if (m_dragWindow) {
|
if (m_drag_window) {
|
||||||
auto old_window_rect = m_dragWindow->rect();
|
auto old_window_rect = m_drag_window->rect();
|
||||||
Point pos = m_drag_window_origin;
|
Point pos = m_drag_window_origin;
|
||||||
#ifdef DRAG_DEBUG
|
#ifdef DRAG_DEBUG
|
||||||
dbgprintf("[WM] Dragging [origin: %d,%d] now: %d,%d\n", m_dragOrigin.x(), m_dragOrigin.y(), event.x(), event.y());
|
dbgprintf("[WM] Dragging [origin: %d,%d] now: %d,%d\n", m_dragOrigin.x(), m_dragOrigin.y(), event.x(), event.y());
|
||||||
#endif
|
#endif
|
||||||
pos.move_by(event.x() - m_drag_origin.x(), event.y() - m_drag_origin.y());
|
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(old_window_rect));
|
||||||
invalidate(outerRectForWindow(m_dragWindow->rect()));
|
invalidate(outerRectForWindow(m_drag_window->rect()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ public:
|
||||||
void notify_title_changed(WSWindow&);
|
void notify_title_changed(WSWindow&);
|
||||||
void notify_rect_changed(WSWindow&, const Rect& oldRect, const Rect& newRect);
|
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&);
|
void move_to_front(WSWindow&);
|
||||||
|
|
||||||
|
@ -62,12 +62,15 @@ private:
|
||||||
Color m_inactive_window_border_color;
|
Color m_inactive_window_border_color;
|
||||||
Color m_inactive_window_title_color;
|
Color m_inactive_window_title_color;
|
||||||
|
|
||||||
|
Color m_dragging_window_border_color;
|
||||||
|
Color m_dragging_window_title_color;
|
||||||
|
|
||||||
HashTable<WSWindow*> m_windows;
|
HashTable<WSWindow*> m_windows;
|
||||||
InlineLinkedList<WSWindow> m_windows_in_order;
|
InlineLinkedList<WSWindow> m_windows_in_order;
|
||||||
|
|
||||||
WeakPtr<WSWindow> m_active_window;
|
WeakPtr<WSWindow> m_active_window;
|
||||||
|
|
||||||
WeakPtr<WSWindow> m_dragWindow;
|
WeakPtr<WSWindow> m_drag_window;
|
||||||
|
|
||||||
Point m_drag_origin;
|
Point m_drag_origin;
|
||||||
Point m_drag_window_origin;
|
Point m_drag_window_origin;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue