mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 14:42:44 +00:00 
			
		
		
		
	WindowServer: Support resizing windows.
This is pretty limited and not entirely stable, but it does work! :^)
This commit is contained in:
		
							parent
							
								
									a9911fca80
								
							
						
					
					
						commit
						59b8183c4b
					
				
					 11 changed files with 112 additions and 13 deletions
				
			
		|  | @ -389,8 +389,11 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault) | ||||||
| RetainPtr<PhysicalPage> MemoryManager::allocate_physical_page(ShouldZeroFill should_zero_fill) | RetainPtr<PhysicalPage> MemoryManager::allocate_physical_page(ShouldZeroFill should_zero_fill) | ||||||
| { | { | ||||||
|     InterruptDisabler disabler; |     InterruptDisabler disabler; | ||||||
|     if (1 > m_free_physical_pages.size()) |     if (1 > m_free_physical_pages.size()) { | ||||||
|  |         kprintf("FUCK! No physical pages available.\n"); | ||||||
|  |         ASSERT_NOT_REACHED(); | ||||||
|         return { }; |         return { }; | ||||||
|  |     } | ||||||
| #ifdef MM_DEBUG | #ifdef MM_DEBUG | ||||||
|     dbgprintf("MM: allocate_physical_page vending P%x (%u remaining)\n", m_free_physical_pages.last()->paddr().get(), m_free_physical_pages.size()); |     dbgprintf("MM: allocate_physical_page vending P%x (%u remaining)\n", m_free_physical_pages.last()->paddr().get(), m_free_physical_pages.size()); | ||||||
| #endif | #endif | ||||||
|  | @ -406,8 +409,11 @@ RetainPtr<PhysicalPage> MemoryManager::allocate_physical_page(ShouldZeroFill sho | ||||||
| RetainPtr<PhysicalPage> MemoryManager::allocate_supervisor_physical_page() | RetainPtr<PhysicalPage> MemoryManager::allocate_supervisor_physical_page() | ||||||
| { | { | ||||||
|     InterruptDisabler disabler; |     InterruptDisabler disabler; | ||||||
|     if (1 > m_free_supervisor_physical_pages.size()) |     if (1 > m_free_supervisor_physical_pages.size()) { | ||||||
|  |         kprintf("FUCK! No physical pages available.\n"); | ||||||
|  |         ASSERT_NOT_REACHED(); | ||||||
|         return { }; |         return { }; | ||||||
|  |     } | ||||||
| #ifdef MM_DEBUG | #ifdef MM_DEBUG | ||||||
|     dbgprintf("MM: allocate_supervisor_physical_page vending P%x (%u remaining)\n", m_free_supervisor_physical_pages.last()->paddr().get(), m_free_supervisor_physical_pages.size()); |     dbgprintf("MM: allocate_supervisor_physical_page vending P%x (%u remaining)\n", m_free_supervisor_physical_pages.last()->paddr().get(), m_free_supervisor_physical_pages.size()); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -2444,9 +2444,11 @@ void SharedBuffer::destroy_if_unused() | ||||||
|     if (!m_pid1_retain_count && !m_pid2_retain_count) { |     if (!m_pid1_retain_count && !m_pid2_retain_count) { | ||||||
|         LOCKER(shared_buffers().lock()); |         LOCKER(shared_buffers().lock()); | ||||||
| #ifdef SHARED_BUFFER_DEBUG | #ifdef SHARED_BUFFER_DEBUG | ||||||
|         dbgprintf("Destroying unused SharedBuffer{%p} (pid1: %d, pid2: %d)\n", this, m_pid1, m_pid2); |         dbgprintf("Destroying unused SharedBuffer{%p} id: %d (pid1: %d, pid2: %d)\n", this, m_shared_buffer_id, m_pid1, m_pid2); | ||||||
| #endif | #endif | ||||||
|  |         size_t count_before = shared_buffers().resource().size(); | ||||||
|         shared_buffers().resource().remove(m_shared_buffer_id); |         shared_buffers().resource().remove(m_shared_buffer_id); | ||||||
|  |         ASSERT(count_before != shared_buffers().resource().size()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -2473,6 +2475,7 @@ int Process::sys$create_shared_buffer(pid_t peer_pid, size_t size, void** buffer | ||||||
|     LOCKER(shared_buffers().lock()); |     LOCKER(shared_buffers().lock()); | ||||||
|     int shared_buffer_id = ++s_next_shared_buffer_id; |     int shared_buffer_id = ++s_next_shared_buffer_id; | ||||||
|     auto shared_buffer = make<SharedBuffer>(m_pid, peer_pid, size); |     auto shared_buffer = make<SharedBuffer>(m_pid, peer_pid, size); | ||||||
|  |     shared_buffer->m_shared_buffer_id = shared_buffer_id; | ||||||
|     shared_buffer->m_pid1_region = allocate_region_with_vmo(LinearAddress(), shared_buffer->size(), shared_buffer->m_vmo.copy_ref(), 0, "SharedBuffer", true, true); |     shared_buffer->m_pid1_region = allocate_region_with_vmo(LinearAddress(), shared_buffer->size(), shared_buffer->m_vmo.copy_ref(), 0, "SharedBuffer", true, true); | ||||||
|     shared_buffer->m_pid1_region->set_shared(true); |     shared_buffer->m_pid1_region->set_shared(true); | ||||||
|     *buffer = shared_buffer->m_pid1_region->laddr().as_ptr(); |     *buffer = shared_buffer->m_pid1_region->laddr().as_ptr(); | ||||||
|  | @ -2491,7 +2494,7 @@ int Process::sys$release_shared_buffer(int shared_buffer_id) | ||||||
|         return -EINVAL; |         return -EINVAL; | ||||||
|     auto& shared_buffer = *(*it).value; |     auto& shared_buffer = *(*it).value; | ||||||
| #ifdef SHARED_BUFFER_DEBUG | #ifdef SHARED_BUFFER_DEBUG | ||||||
|     dbgprintf("%s(%u): Releasing shared buffer %d\n", name().characters(), pid(), shared_buffer_id); |     dbgprintf("%s(%u): Releasing shared buffer %d, buffer count: %u\n", name().characters(), pid(), shared_buffer_id, shared_buffers().resource().size()); | ||||||
| #endif | #endif | ||||||
|     shared_buffer.release(*this); |     shared_buffer.release(*this); | ||||||
|     return 0; |     return 0; | ||||||
|  | @ -2507,7 +2510,7 @@ void* Process::sys$get_shared_buffer(int shared_buffer_id) | ||||||
|     if (shared_buffer.pid1() != m_pid && shared_buffer.pid2() != m_pid) |     if (shared_buffer.pid1() != m_pid && shared_buffer.pid2() != m_pid) | ||||||
|         return (void*)-EINVAL; |         return (void*)-EINVAL; | ||||||
| #ifdef SHARED_BUFFER_DEBUG | #ifdef SHARED_BUFFER_DEBUG | ||||||
|     dbgprintf("%s(%u): Retaining shared buffer %d\n", name().characters(), pid(), shared_buffer_id); |     dbgprintf("%s(%u): Retaining shared buffer %d, buffer count: %u\n", name().characters(), pid(), shared_buffer_id, shared_buffers().resource().size()); | ||||||
| #endif | #endif | ||||||
|     return shared_buffer.retain(*this); |     return shared_buffer.retain(*this); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -121,6 +121,11 @@ void GEventLoop::handle_paint_event(const WSAPI_ServerMessage& event, GWindow& w | ||||||
|     post_event(&window, make<GPaintEvent>(event.paint.rect)); |     post_event(&window, make<GPaintEvent>(event.paint.rect)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void GEventLoop::handle_resize_event(const WSAPI_ServerMessage& event, GWindow& window) | ||||||
|  | { | ||||||
|  |     post_event(&window, make<GResizeEvent>(event.window.old_rect.size, event.window.rect.size)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void GEventLoop::handle_window_activation_event(const WSAPI_ServerMessage& event, GWindow& window) | void GEventLoop::handle_window_activation_event(const WSAPI_ServerMessage& event, GWindow& window) | ||||||
| { | { | ||||||
| #ifdef GEVENTLOOP_DEBUG | #ifdef GEVENTLOOP_DEBUG | ||||||
|  | @ -303,6 +308,9 @@ void GEventLoop::wait_for_event() | ||||||
|         case WSAPI_ServerMessage::Type::WindowLeft: |         case WSAPI_ServerMessage::Type::WindowLeft: | ||||||
|             handle_window_entered_or_left_event(event, *window); |             handle_window_entered_or_left_event(event, *window); | ||||||
|             break; |             break; | ||||||
|  |         case WSAPI_ServerMessage::Type::WindowResized: | ||||||
|  |             handle_resize_event(event, *window); | ||||||
|  |             break; | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -43,6 +43,7 @@ private: | ||||||
|     void wait_for_event(); |     void wait_for_event(); | ||||||
|     bool drain_messages_from_server(); |     bool drain_messages_from_server(); | ||||||
|     void handle_paint_event(const WSAPI_ServerMessage&, GWindow&); |     void handle_paint_event(const WSAPI_ServerMessage&, GWindow&); | ||||||
|  |     void handle_resize_event(const WSAPI_ServerMessage&, GWindow&); | ||||||
|     void handle_mouse_event(const WSAPI_ServerMessage&, GWindow&); |     void handle_mouse_event(const WSAPI_ServerMessage&, GWindow&); | ||||||
|     void handle_key_event(const WSAPI_ServerMessage&, GWindow&); |     void handle_key_event(const WSAPI_ServerMessage&, GWindow&); | ||||||
|     void handle_window_activation_event(const WSAPI_ServerMessage&, GWindow&); |     void handle_window_activation_event(const WSAPI_ServerMessage&, GWindow&); | ||||||
|  |  | ||||||
|  | @ -209,6 +209,13 @@ void GWindow::event(GEvent& event) | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (event.type() == GEvent::Resize) { | ||||||
|  |         m_pending_paint_event_rects.clear(); | ||||||
|  |         m_rect_when_windowless = { { }, static_cast<GResizeEvent&>(event).size() }; | ||||||
|  |         m_main_widget->set_relative_rect({ { }, static_cast<GResizeEvent&>(event).size() }); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     GObject::event(event); |     GObject::event(event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -68,6 +68,7 @@ struct WSAPI_ServerMessage { | ||||||
|         KeyUp, |         KeyUp, | ||||||
|         WindowActivated, |         WindowActivated, | ||||||
|         WindowDeactivated, |         WindowDeactivated, | ||||||
|  |         WindowResized, | ||||||
|         WindowCloseRequest, |         WindowCloseRequest, | ||||||
|         MenuItemActivated, |         MenuItemActivated, | ||||||
|         DidCreateMenubar, |         DidCreateMenubar, | ||||||
|  | @ -92,6 +93,7 @@ struct WSAPI_ServerMessage { | ||||||
|     union { |     union { | ||||||
|         struct { |         struct { | ||||||
|             WSAPI_Rect rect; |             WSAPI_Rect rect; | ||||||
|  |             WSAPI_Rect old_rect; | ||||||
|         } window; |         } window; | ||||||
|         struct { |         struct { | ||||||
|             WSAPI_Rect rect; |             WSAPI_Rect rect; | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ public: | ||||||
|         WindowActivated, |         WindowActivated, | ||||||
|         WindowDeactivated, |         WindowDeactivated, | ||||||
|         WindowCloseRequest, |         WindowCloseRequest, | ||||||
|  |         WindowResized, | ||||||
| 
 | 
 | ||||||
|         __Begin_API_Client_Requests, |         __Begin_API_Client_Requests, | ||||||
|         APICreateMenubarRequest, |         APICreateMenubarRequest, | ||||||
|  | @ -451,3 +452,20 @@ private: | ||||||
|     unsigned m_buttons { 0 }; |     unsigned m_buttons { 0 }; | ||||||
|     MouseButton m_button { MouseButton::None }; |     MouseButton m_button { MouseButton::None }; | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | class WSResizeEvent final : public WSMessage { | ||||||
|  | public: | ||||||
|  |     WSResizeEvent(const Rect& old_rect, const Rect& rect) | ||||||
|  |         : WSMessage(WSMessage::WindowResized) | ||||||
|  |         , m_old_rect(old_rect) | ||||||
|  |         , m_rect(rect) | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     Rect old_rect() const { return m_old_rect; } | ||||||
|  |     Rect rect() const { return m_rect; } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     Rect m_old_rect; | ||||||
|  |     Rect m_rect; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | @ -48,7 +48,6 @@ void WSWindow::set_rect(const Rect& rect) | ||||||
|         else if (m_client) { |         else if (m_client) { | ||||||
|             m_backing = m_client->create_shared_bitmap(m_has_alpha_channel ? GraphicsBitmap::Format::RGBA32 : GraphicsBitmap::Format::RGB32, m_rect.size()); |             m_backing = m_client->create_shared_bitmap(m_has_alpha_channel ? GraphicsBitmap::Format::RGBA32 : GraphicsBitmap::Format::RGB32, m_rect.size()); | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
|     WSWindowManager::the().notify_rect_changed(*this, old_rect, rect); |     WSWindowManager::the().notify_rect_changed(*this, old_rect, rect); | ||||||
| } | } | ||||||
|  | @ -125,6 +124,11 @@ void WSWindow::on_message(WSMessage& message) | ||||||
|     case WSMessage::WindowCloseRequest: |     case WSMessage::WindowCloseRequest: | ||||||
|         server_message.type = WSAPI_ServerMessage::Type::WindowCloseRequest; |         server_message.type = WSAPI_ServerMessage::Type::WindowCloseRequest; | ||||||
|         break; |         break; | ||||||
|  |     case WSMessage::WindowResized: | ||||||
|  |         server_message.type = WSAPI_ServerMessage::Type::WindowResized; | ||||||
|  |         server_message.window.old_rect = static_cast<WSResizeEvent&>(message).old_rect(); | ||||||
|  |         server_message.window.rect = static_cast<WSResizeEvent&>(message).rect(); | ||||||
|  |         break; | ||||||
|     default: |     default: | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -40,6 +40,7 @@ public: | ||||||
|     void set_rect(const Rect&); |     void set_rect(const Rect&); | ||||||
|     void set_rect(int x, int y, int width, int height) { set_rect({ x, y, width, height }); } |     void set_rect(int x, int y, int width, int height) { set_rect({ x, y, width, height }); } | ||||||
|     void set_rect_without_repaint(const Rect& rect) { m_rect = rect; } |     void set_rect_without_repaint(const Rect& rect) { m_rect = rect; } | ||||||
|  |     void set_rect_from_window_manager_resize(const Rect&); | ||||||
| 
 | 
 | ||||||
|     void move_to(const Point& position) { set_rect({ position, size() }); } |     void move_to(const Point& position) { set_rect({ position, size() }); } | ||||||
|     void move_to(int x, int y) { move_to({ x, y }); } |     void move_to(int x, int y) { move_to({ x, y }); } | ||||||
|  | @ -54,9 +55,6 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual void on_message(WSMessage&) override; |     virtual void on_message(WSMessage&) override; | ||||||
| 
 | 
 | ||||||
|     bool is_being_dragged() const { return m_is_being_dragged; } |  | ||||||
|     void set_is_being_dragged(bool b) { m_is_being_dragged = b; } |  | ||||||
| 
 |  | ||||||
|     GraphicsBitmap* backing() { return m_backing.ptr(); } |     GraphicsBitmap* backing() { return m_backing.ptr(); } | ||||||
| 
 | 
 | ||||||
|     void set_global_cursor_tracking_enabled(bool); |     void set_global_cursor_tracking_enabled(bool); | ||||||
|  | @ -75,7 +73,6 @@ private: | ||||||
|     String m_title; |     String m_title; | ||||||
|     Rect m_rect; |     Rect m_rect; | ||||||
|     WSWindowType m_type { WSWindowType::Normal }; |     WSWindowType m_type { WSWindowType::Normal }; | ||||||
|     bool m_is_being_dragged { false }; |  | ||||||
|     bool m_global_cursor_tracking_enabled { false }; |     bool m_global_cursor_tracking_enabled { false }; | ||||||
|     bool m_visible { true }; |     bool m_visible { true }; | ||||||
|     bool m_has_alpha_channel { false }; |     bool m_has_alpha_channel { false }; | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ | ||||||
| 
 | 
 | ||||||
| //#define DEBUG_COUNTERS
 | //#define DEBUG_COUNTERS
 | ||||||
| //#define DEBUG_WID_IN_TITLE_BAR
 | //#define DEBUG_WID_IN_TITLE_BAR
 | ||||||
|  | #define RESIZE_DEBUG | ||||||
| 
 | 
 | ||||||
| static const int window_titlebar_height = 16; | static const int window_titlebar_height = 16; | ||||||
| 
 | 
 | ||||||
|  | @ -472,7 +473,6 @@ void WSWindowManager::handle_titlebar_mouse_event(WSWindow& window, WSMouseEvent | ||||||
|         m_drag_window = window.make_weak_ptr();; |         m_drag_window = window.make_weak_ptr();; | ||||||
|         m_drag_origin = event.position(); |         m_drag_origin = event.position(); | ||||||
|         m_drag_window_origin = window.position(); |         m_drag_window_origin = window.position(); | ||||||
|         window.set_is_being_dragged(true); |  | ||||||
|         invalidate(window); |         invalidate(window); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  | @ -487,6 +487,17 @@ void WSWindowManager::handle_close_button_mouse_event(WSWindow& window, WSMouseE | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void WSWindowManager::start_window_resize(WSWindow& window, WSMouseEvent& event) | ||||||
|  | { | ||||||
|  | #ifdef RESIZE_DEBUG | ||||||
|  |     printf("[WM] Begin resizing WSWindow{%p}\n", &window); | ||||||
|  | #endif | ||||||
|  |     m_resize_window = window.make_weak_ptr();; | ||||||
|  |     m_resize_origin = event.position(); | ||||||
|  |     m_resize_window_original_rect = window.rect(); | ||||||
|  |     invalidate(window); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_window) | void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_window) | ||||||
| { | { | ||||||
|     event_window = nullptr; |     event_window = nullptr; | ||||||
|  | @ -497,7 +508,6 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_ | ||||||
|             printf("[WM] Finish dragging WSWindow{%p}\n", m_drag_window.ptr()); |             printf("[WM] Finish dragging WSWindow{%p}\n", m_drag_window.ptr()); | ||||||
| #endif | #endif | ||||||
|             invalidate(*m_drag_window); |             invalidate(*m_drag_window); | ||||||
|             m_drag_window->set_is_being_dragged(false); |  | ||||||
|             m_drag_window = nullptr; |             m_drag_window = nullptr; | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  | @ -516,6 +526,38 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (m_resize_window) { | ||||||
|  |         if (event.type() == WSMessage::MouseUp && event.button() == MouseButton::Right) { | ||||||
|  | #ifdef RESIZE_DEBUG | ||||||
|  |             printf("[WM] Finish resizing WSWindow{%p}\n", m_resize_window.ptr()); | ||||||
|  | #endif | ||||||
|  |             invalidate(*m_resize_window); | ||||||
|  |             m_resize_window = nullptr; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (event.type() == WSMessage::MouseMove) { | ||||||
|  |             auto old_rect = m_resize_window->rect(); | ||||||
|  |             int dx = event.x() - m_resize_origin.x(); | ||||||
|  |             int dy = event.y() - m_resize_origin.y(); | ||||||
|  |             auto new_rect = m_resize_window_original_rect; | ||||||
|  |             new_rect.set_width(new_rect.width() + dx); | ||||||
|  |             new_rect.set_height(new_rect.height() + dy); | ||||||
|  | #ifdef RESIZE_DEBUG | ||||||
|  |             dbgprintf("[WM] Resizing [original: %s] now: %s\n", | ||||||
|  |                 m_resize_window_original_rect.to_string().characters(), | ||||||
|  |                 new_rect.to_string().characters()); | ||||||
|  | #endif | ||||||
|  |             if (new_rect.width() < 50) | ||||||
|  |                 new_rect.set_width(50); | ||||||
|  |             if (new_rect.height() < 50) | ||||||
|  |                 new_rect.set_height(50); | ||||||
|  |             m_resize_window->set_rect(new_rect); | ||||||
|  |             WSMessageLoop::the().post_message(m_resize_window.ptr(), make<WSResizeEvent>(old_rect, new_rect)); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { |     for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { | ||||||
|         if (!window->global_cursor_tracking()) |         if (!window->global_cursor_tracking()) | ||||||
|             continue; |             continue; | ||||||
|  | @ -559,6 +601,10 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_ | ||||||
|                 move_to_front(window); |                 move_to_front(window); | ||||||
|                 set_active_window(&window); |                 set_active_window(&window); | ||||||
|             } |             } | ||||||
|  |             if (event.type() == WSMessage::MouseDown && event.button() == MouseButton::Right) { | ||||||
|  |                 start_window_resize(window, event); | ||||||
|  |                 return IterationDecision::Abort; | ||||||
|  |             } | ||||||
|             event_window = &window; |             event_window = &window; | ||||||
|             // FIXME: Should we just alter the coordinates of the existing MouseEvent and pass it through?
 |             // FIXME: Should we just alter the coordinates of the existing MouseEvent and pass it through?
 | ||||||
|             Point position { event.x() - window.rect().x(), event.y() - window.rect().y() }; |             Point position { event.x() - window.rect().x(), event.y() - window.rect().y() }; | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ class CharacterBitmap; | ||||||
| class GraphicsBitmap; | class GraphicsBitmap; | ||||||
| 
 | 
 | ||||||
| enum class IterationDecision { Continue, Abort }; | enum class IterationDecision { Continue, Abort }; | ||||||
|  | enum class ResizeDirection { None, Left, UpLeft, Up, UpRight, Right, DownRight, Down, DownLeft }; | ||||||
| 
 | 
 | ||||||
| class WSWindowManager : public WSMessageReceiver { | class WSWindowManager : public WSMessageReceiver { | ||||||
| public: | public: | ||||||
|  | @ -76,6 +77,7 @@ private: | ||||||
|     void handle_menubar_mouse_event(WSMouseEvent&); |     void handle_menubar_mouse_event(WSMouseEvent&); | ||||||
|     void handle_titlebar_mouse_event(WSWindow&, WSMouseEvent&); |     void handle_titlebar_mouse_event(WSWindow&, WSMouseEvent&); | ||||||
|     void handle_close_button_mouse_event(WSWindow&, WSMouseEvent&); |     void handle_close_button_mouse_event(WSWindow&, WSMouseEvent&); | ||||||
|  |     void start_window_resize(WSWindow&, WSMouseEvent&); | ||||||
|     void handle_client_request(WSAPIClientRequest&); |     void handle_client_request(WSAPIClientRequest&); | ||||||
| 
 | 
 | ||||||
|     void set_active_window(WSWindow*); |     void set_active_window(WSWindow*); | ||||||
|  | @ -113,11 +115,16 @@ private: | ||||||
| 
 | 
 | ||||||
|     WeakPtr<WSWindow> m_active_window; |     WeakPtr<WSWindow> m_active_window; | ||||||
|     WeakPtr<WSWindow> m_hovered_window; |     WeakPtr<WSWindow> m_hovered_window; | ||||||
|     WeakPtr<WSWindow> m_drag_window; |  | ||||||
| 
 | 
 | ||||||
|  |     WeakPtr<WSWindow> m_drag_window; | ||||||
|     Point m_drag_origin; |     Point m_drag_origin; | ||||||
|     Point m_drag_window_origin; |     Point m_drag_window_origin; | ||||||
| 
 | 
 | ||||||
|  |     WeakPtr<WSWindow> m_resize_window; | ||||||
|  |     Rect m_resize_window_original_rect; | ||||||
|  |     Point m_resize_origin; | ||||||
|  |     ResizeDirection m_resize_direction { ResizeDirection::None }; | ||||||
|  | 
 | ||||||
|     Rect m_last_cursor_rect; |     Rect m_last_cursor_rect; | ||||||
| 
 | 
 | ||||||
|     unsigned m_compose_count { 0 }; |     unsigned m_compose_count { 0 }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling