ensure_cursor_node_within_viewport = function()
	local snode = Cursor_node.surface_node
	local dirty
	-- check Viewport.y
	if snode.y < Viewport.y then
		Viewport.y = snode.y - 50
		dirty = true
	end
	local limit = snode.y + box_height(snode)
	if Viewport.y < limit - App.screen.height/Viewport.zoom then
		Viewport.y = limit - (App.screen.height-50)/Viewport.zoom
		dirty = true
	end
	-- check Viewport.x
	if Cursor_node.surface_node.x < Viewport.x then
		Viewport.x = Cursor_node.surface_node.x - 50
		dirty = true
	end
	limit = snode.x + 600
	if Viewport.x < limit - App.screen.width/Viewport.zoom then
		Viewport.x = limit - (App.screen.width-50)/Viewport.zoom
		dirty = true
	end
	-- refresh if necessary
	if dirty then
		B()
	end
end