forked from Bananymous/banan-os
				
			WindowServer: Fix crash when window closes while being "button window"
This commit is contained in:
		
							parent
							
								
									8496726ab1
								
							
						
					
					
						commit
						8c9ab2d68c
					
				|  | @ -512,7 +512,9 @@ void WindowServer::on_mouse_button(LibInput::MouseButtonEvent event) | |||
| 	} | ||||
| 
 | ||||
| 	BAN::RefPtr<Window> target_window; | ||||
| 	if (!event.pressed) | ||||
| 	if (m_state == State::Fullscreen) | ||||
| 		target_window = m_focused_window; | ||||
| 	if (!event.pressed && !target_window) | ||||
| 		target_window = m_mouse_button_windows[button_idx]; | ||||
| 	for (size_t i = m_client_windows.size(); i > 0 && !target_window; i--) | ||||
| 		if (m_client_windows[i - 1]->full_area().contains(m_cursor) && m_client_windows[i - 1]->get_attributes().shown) | ||||
|  | @ -556,7 +558,7 @@ void WindowServer::on_mouse_button(LibInput::MouseButtonEvent event) | |||
| 			if (event.button == LibInput::MouseButton::Left && !event.pressed && target_window->close_button_area().contains(m_cursor)) | ||||
| 			{ | ||||
| 				LibGUI::EventPacket::CloseWindowEvent packet; | ||||
| 				if (auto ret = packet.send_serialized(m_focused_window->client_fd()); ret.is_error()) | ||||
| 				if (auto ret = packet.send_serialized(target_window->client_fd()); ret.is_error()) | ||||
| 					dwarnln("could not send close window event: {}", ret.error()); | ||||
| 				break; | ||||
| 			} | ||||
|  | @ -568,9 +570,9 @@ void WindowServer::on_mouse_button(LibInput::MouseButtonEvent event) | |||
| 				LibGUI::EventPacket::MouseButtonEvent packet; | ||||
| 				packet.event.button = event.button; | ||||
| 				packet.event.pressed = event.pressed; | ||||
| 				packet.event.x = m_cursor.x - m_focused_window->client_x(); | ||||
| 				packet.event.y = m_cursor.y - m_focused_window->client_y(); | ||||
| 				if (auto ret = packet.send_serialized(m_focused_window->client_fd()); ret.is_error()) | ||||
| 				packet.event.x = m_cursor.x - target_window->client_x(); | ||||
| 				packet.event.y = m_cursor.y - target_window->client_y(); | ||||
| 				if (auto ret = packet.send_serialized(target_window->client_fd()); ret.is_error()) | ||||
| 				{ | ||||
| 					dwarnln("could not send mouse button event: {}", ret.error()); | ||||
| 					return; | ||||
|  | @ -1410,6 +1412,10 @@ void WindowServer::remove_client_fd(int fd) | |||
| 		invalidate(m_framebuffer.area()); | ||||
| 	} | ||||
| 
 | ||||
| 	for (auto& window : m_mouse_button_windows) | ||||
| 		if (window && window->client_fd() == fd) | ||||
| 			window.clear(); | ||||
| 
 | ||||
| 	for (size_t i = 0; i < m_client_windows.size(); i++) | ||||
| 	{ | ||||
| 		auto window = m_client_windows[i]; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue