Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into resize
Browse files Browse the repository at this point in the history
* upstream/master: (23 commits)
  MAINT: Add mne.surface to docstring tests (mne-tools#7930)
  MRG: Add smoothing controller to TimeViewer for the notebook backend (mne-tools#7928)
  MRG: TimeViewer matplotlib figure color (mne-tools#7925)
  fix typos (mne-tools#7924)
  MRG, ENH: Add method to project onto max power ori (mne-tools#7883)
  WIP: Warn if untested NIRX device (mne-tools#7905)
  MRG, BUG: Fix bug with volume morph and subject_to!="fsaverage" (mne-tools#7896)
  MRG, MAINT: Clean up use of bool, float, int (mne-tools#7917)
  ENH: Better error message for incompatible Evoked objects (mne-tools#7910)
  try to fix nullcontext (mne-tools#7908)
  WIP: Fix Travis (mne-tools#7906)
  WIP: Prototype of notebook viz (screencast) (mne-tools#7758)
  MRG, FIX: Speed up I/O tests, mark some slow (mne-tools#7904)
  Proper attribution for Blender tutorial (mne-tools#7900)
  MAINT: Check usage [ci skip] (mne-tools#7902)
  Allow find_bad_channels_maxwell() to return scores (mne-tools#7845)
  Warn if NIRx directory structure has been modified from original format (mne-tools#7898)
  Pin pvyista to 0.24.3 (mne-tools#7899)
  MRG: Add support for reading and writing sufaces to .obj (mne-tools#7824)
  Fix _auto_topomap_coords docstring. (mne-tools#7895)
  ...
  • Loading branch information
larsoner committed Jun 25, 2020
2 parents a6da011 + c9064e7 commit 3f48e4e
Show file tree
Hide file tree
Showing 139 changed files with 2,090 additions and 620 deletions.
7 changes: 5 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
name: Install 3D rendering libraries \ PyQt5 dependencies \ graphviz \ optipng (for optimized images)
command: |
sudo apt-get install libosmesa6 libglx-mesa0 libopengl0 libglx0 libdbus-1-3 \
libxkbcommon-x11-0 \
libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xfixes0 libxcb-xinerama0 \
graphviz \
optipng
Expand All @@ -81,7 +81,6 @@ jobs:
command: |
python -m pip install --user --upgrade --progress-bar off pip numpy setuptools
python -m pip install --user --upgrade --progress-bar off -f "https://vtk.org/download" "vtk>=9"
python -m pip install --user --upgrade --progress-bar off https://github.com/enthought/mayavi/zipball/master
python -m pip install --user --upgrade --progress-bar off -r requirements.txt
python -m pip uninstall -yq pysurfer mayavi
python -m pip install --user --upgrade --progress-bar off --pre sphinx
Expand All @@ -94,6 +93,10 @@ jobs:
paths:
- ~/.cache/pip

- run:
name: Check PyQt5
command: LD_DEBUG=libs python -c "from PyQt5.QtWidgets import QApplication, QWidget; app = QApplication([])"

# Look at what we have and fail early if there is some library conflict
- run:
name: Check installation
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ coverage
.pytest_cache/
__pycache__/
prof/
mne/viz/_brain/tests/.ipynb_checkpoints

dist/
doc/_build/
Expand Down
30 changes: 15 additions & 15 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ addons:
apt:
packages:
- libxkbcommon-x11-0
- libxcb*
- libosmesa6
- libglx-mesa0
- libopengl0
Expand Down Expand Up @@ -52,22 +53,21 @@ before_install:
- if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1400x900x24 -ac +extension GLX +render -noreset;
fi;
- if [ -z "$CONDA_ENV" ] && [ -z "$CONDA_DEPENDENCIES" ]; then
pip uninstall -yq numpy;
pip install -i "https://pypi.anaconda.org/scipy-wheels-nightly/simple" --pre numpy;
pip install -f "https://7933911d6844c6c53a7d-47bd50c35cd79bd838daf386af554a83.ssl.cf2.rackcdn.com" scipy pandas scikit-learn matplotlib h5py Pillow;
pip install -f "https://vtk.org/download" "vtk>=9";
pip install https://github.com/enthought/mayavi/zipball/master;
pip install $PIP_DEPENDENCIES;
pip install --upgrade -r requirements.txt;
- |
if [ -z "$CONDA_ENV" ] && [ -z "$CONDA_DEPENDENCIES" ]; then
pip uninstall -yq numpy
pip install -i "https://pypi.anaconda.org/scipy-wheels-nightly/simple" --pre numpy
pip install -f "https://7933911d6844c6c53a7d-47bd50c35cd79bd838daf386af554a83.ssl.cf2.rackcdn.com" scipy pandas scikit-learn matplotlib h5py Pillow
pip install -f "https://vtk.org/download" "vtk>=9"
pip install --upgrade -r requirements.txt
else
git clone https://github.com/astropy/ci-helpers.git;
source ci-helpers/travis/setup_conda.sh;
git clone https://github.com/astropy/ci-helpers.git
source ci-helpers/travis/setup_conda.sh
if [ ! -z "$CONDA_ENV" ]; then
conda activate base;
conda env update --file $CONDA_ENV;
pip uninstall -yq mne;
fi;
conda activate base
conda env update --file $CONDA_ENV
pip uninstall -yq mne
fi
fi
# Always install these via pip so we get the latest possible versions (testing bugfixes)
- pip install --upgrade "pytest<5.4" pytest-sugar pytest-cov pytest-mock pytest-timeout pytest-xdist codecov
Expand Down Expand Up @@ -141,7 +141,7 @@ script:
pip install -e .;
python mne/tests/test_evoked.py;
fi;
- echo pytest -m "${CONDITION}" --cov=mne -n 1 ${USE_DIRS}
- echo 'pytest -m "${CONDITION}" --cov=mne -n 1 ${USE_DIRS}'
- pytest -m "${CONDITION}" --tb=short --cov=mne -n 1 ${USE_DIRS}
# run the minimal one with the testing data
- if [ "${DEPS}" == "minimal" ]; then
Expand Down
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ recursive-include mne mne/datasets *.csv
include mne/io/edf/gdf_encodes.txt
include mne/datasets/sleep_physionet/SHA1SUMS
include mne/externals/tqdm/_tqdm/tqdm.1
include mne/viz/_brain/tests/test.ipynb

### Exclude

Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,10 @@ flake:
@echo "flake8 passed"

codespell: # running manually
@codespell --builtin clear,rare,informal,names -w -i 3 -q 3 -S $(CODESPELL_SKIPS) --ignore-words=ignore_words.txt $(CODESPELL_DIRS)
@codespell --builtin clear,rare,informal,names,usage -w -i 3 -q 3 -S $(CODESPELL_SKIPS) --ignore-words=ignore_words.txt $(CODESPELL_DIRS)

codespell-error: # running on travis
@codespell --builtin clear,rare,informal,names -i 0 -q 7 -S $(CODESPELL_SKIPS) --ignore-words=ignore_words.txt $(CODESPELL_DIRS)
@codespell --builtin clear,rare,informal,names,usage -i 0 -q 7 -S $(CODESPELL_SKIPS) --ignore-words=ignore_words.txt $(CODESPELL_DIRS)

pydocstyle:
@echo "Running pydocstyle"
Expand Down
67 changes: 53 additions & 14 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,9 @@ jobs:
- job: Style
pool:
vmImage: 'ubuntu-18.04'
strategy:
matrix:
Python37-64bit-fast:
PYTHON_VERSION: '3.7'
PYTHON_ARCH: 'x64'
variables:
PYTHON_VERSION: '3.8'
PYTHON_ARCH: 'x64'
steps:
- task: UsePythonVersion@0
inputs:
Expand All @@ -28,6 +26,7 @@ jobs:
addToPath: true
displayName: 'Get Python'
- bash: |
set -e
python -m pip install --upgrade pip setuptools
python -m pip install numpy scipy matplotlib sphinx pytest pytest-cov pytest-timeout pytest-sugar flake8
displayName: Install dependencies
Expand Down Expand Up @@ -89,7 +88,7 @@ jobs:
OPENBLAS_NUM_THREADS: '1'
steps:
- bash: |
sudo apt install libxkbcommon-x11-0 xvfb tcsh
sudo apt install libxkbcommon-x11-0 xvfb tcsh libxcb*
displayName: 'Install Ubuntu dependencies'
- bash: |
source tools/get_minimal_commands.sh
Expand Down Expand Up @@ -124,16 +123,55 @@ jobs:
displayName: 'Get test data'
- script: pytest -m "ultraslowtest" --tb=short --cov=mne -n 1 mne
displayName: 'Run ultraslow tests'
- script: codecov --root %BUILD_REPOSITORY_LOCALPATH% -t %CODECOV_TOKEN%
- script: codecov --root $BUILD_REPOSITORY_LOCALPATH -t $CODECOV_TOKEN
displayName: 'Codecov'
env:
CODECOV_TOKEN: $(CODECOV_TOKEN)
condition: always()
condition: succeededOrFailed()
- task: PublishTestResults@2
inputs:
testResultsFiles: 'junit-*.xml'
testRunTitle: 'Publish test results for Python $(python.version)'
condition: always()
testRunTitle: 'Publish test results for $(Agent.JobName)'
failTaskOnFailedTests: true
condition: succeededOrFailed()


- job: Notebook
pool:
vmImage: 'ubuntu-18.04'
variables:
CONDA_ENV: 'server_environment.yml'
steps:
- bash: |
set -e
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh --progress=dot:mega
bash miniconda.sh -b -p ~/miniconda
source ~/miniconda/etc/profile.d/conda.sh
conda activate base
conda env update --file $CONDA_ENV
pip uninstall -yq mne
pip install -ve .
pip install pytest pytest-cov pytest-timeout pytest-sugar pytest-xdist flake8 codecov
echo "##vso[task.setvariable variable=PATH]${PATH}"
echo "##vso[task.setvariable variable=LD_LIBRARY_PATH]${LD_LIBRARY_PATH}"
displayName: 'Install dependencies'
- script: mne sys_info
displayName: 'Print config and test access to commands'
- script: python -c "import mne; mne.datasets.testing.data_path(verbose=True)"
displayName: 'Get test data'
- script: pytest --tb=short --cov=mne mne/viz
displayName: 'Run viz tests'
- script: codecov --root $BUILD_REPOSITORY_LOCALPATH -t $CODECOV_TOKEN
displayName: 'Codecov'
env:
CODECOV_TOKEN: $(CODECOV_TOKEN)
condition: succeededOrFailed()
- task: PublishTestResults@2
inputs:
testResultsFiles: 'junit-*.xml'
testRunTitle: 'Publish test results for $(Agent.JobName)'
failTaskOnFailedTests: true
condition: succeededOrFailed()


- job: Windows
Expand Down Expand Up @@ -220,15 +258,16 @@ jobs:
displayName: Print NumPy config
- script: python -c "import mne; mne.datasets.testing.data_path(verbose=True)"
displayName: 'Get test data'
- script: pytest -m "not ultraslowtest" --tb=short --cov=mne -n 1 mne
- script: pytest -m "not slowtest" --tb=short --cov=mne -n 1 mne
displayName: 'Run tests'
- script: codecov --root %BUILD_REPOSITORY_LOCALPATH% -t %CODECOV_TOKEN%
displayName: 'Codecov'
env:
CODECOV_TOKEN: $(CODECOV_TOKEN)
condition: always()
condition: succeededOrFailed()
- task: PublishTestResults@2
inputs:
testResultsFiles: 'junit-*.xml'
testRunTitle: 'Publish test results for Python $(python.version)'
condition: always()
testRunTitle: 'Publish test results for $(Agent.JobName) $(TEST_MODE) $(PYTHON_VERSION)'
failTaskOnFailedTests: true
condition: succeededOrFailed()
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion doc/_templates/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
{% endblock %}

{# put the sidebar before the body #}
{% block sidebar1 %}{{ sidebar() }}{% endblock %}
{% block sidebar1 %}{% endblock %}
{% block sidebar2 %}{% endblock %}

{%- block footer %}
Expand Down
26 changes: 26 additions & 0 deletions doc/changes/latest.inc
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,18 @@ Changelog

- Add :meth:`mne.MixedSourceEstimate.surface` and :meth:`mne.MixedSourceEstimate.volume` methods to allow surface and volume extraction by `Eric Larson`_

- Add :meth:`mne.VectorSourceEstimate.project` to project vector source estimates onto the direction of maximum source power by `Eric Larson`_

- Add support to :func:`mne.extract_label_time_course` for vector-valued and volumetric source estimates by `Eric Larson`_

- Add method :meth:`mne.VolSourceEstimate.in_label` by `Eric Larson`_

- Add support for mixed source spaces to :func:`mne.compute_source_morph` by `Eric Larson`_

- Add support for omitting the SDR step in volumetric morphing by passing ``n_iter_sdr=()`` to `mne.compute_source_morph` by `Eric Larson`_

- Add support for passing a string argument to ``bg_img`` in `mne.viz.plot_volume_source_estimates` by `Eric Larson`_

- Add support for providing the destination surface source space in the ``src_to`` argument of :func:`mne.compute_source_morph` by `Eric Larson`_

- Add ``tol_kind`` option to :func:`mne.compute_rank` by `Eric Larson`_
Expand Down Expand Up @@ -73,6 +79,8 @@ Changelog

- Add estimation method legend to :func:`mne.viz.plot_snr_estimate` by `Eric Larson`_

- Add support to `mne.SourceSpaces.export_volume` for ``mri_resolution='sparse'`` to color only the nearest-neighbor voxels instead of entire regions by `Eric Larson`_

- Add ``axes`` argument to :func:`mne.viz.plot_evoked_white`, :meth:`mne.Evoked.plot_white`, and :func:`mne.viz.plot_snr_estimate` by `Eric Larson`_

- Add ``sources`` and ``detectors`` options for fNIRS use of :meth:`mne.viz.plot_alignment` allowing plotting of optode locations in addition to channel midpoint ``channels`` and ``path`` between fNIRS optodes by `Kyle Mathewson`_
Expand All @@ -85,12 +93,20 @@ Changelog

- BIDS conformity: When saving FIF files to disk and the files are split into parts, the ``split_naming='bids'`` parameter now uses a "_split-%d" naming instead of the previous "_part-%d", by `Stefan Appelhoff`_

- Add better error message when trying to save incompatible `~mne.Evoked` objects to the same file by `Eric Larson`_

- Add support for loading complex numbers from mat files by `Thomas Hartmann`_

- Add generic reader function :func:`mne.io.read_raw` that loads files based on their extensions (it wraps the underlying specific ``read_raw_xxx`` functions) by `Clemens Brunner`_

- Add ``'auto'`` option to :meth:`mne.preprocessing.ICA.find_bads_ecg` to automatically determine the threshold for CTPS method by `Yu-Han Luo`_

- Add a ``notebook`` 3d backend for visualization in jupyter notebook with :func:`mne.viz.set_3d_backend` by`Guillaume Favelier`_

- Add support for reading and writing surfaces in Wavefront .obj format to the :func:`mne.read_surface` and :func:`mne.write_surface` by `Marijn van Vliet`_

- Add tutorial on how to manually fix BEM meshes in Blender by `Marijn van Vliet`_ and `Ezequiel Mikulan`_

Bug
~~~

Expand All @@ -100,10 +116,16 @@ Bug
- Fix bug with :func:`mne.setup_volume_source_space` when ``volume_label`` was supplied where voxels slightly (in a worst case, about 37% times ``pos`` in distance) outside the voxel-grid-based bounds of regions were errantly included, by `Eric Larson`_
- Fix bug with `mne.SourceSpaces.export_volume` with ``use_lut=False`` where no values were written by `Eric Larson`_
- Fix bug with :func:`mne.preprocessing.annotate_movement` where bad data segments, specified in ``raw.annotations``, would be handled incorrectly by `Luke Bloy`_
- Fix bug with :func:`mne.compute_source_morph` when more than one volume source space was present (e.g., when using labels) where only the first label would be interpolated when ``mri_resolution=True`` by `Eric Larson`_
- Fix bug with :func:`mne.compute_source_morph` when morphing to a volume source space when ``src_to`` is used and the destination subject is not ``fsaverage`` by `Eric Larson`_
- Fix bug with :func:`mne.compute_source_morph` where outermost voxels in the destination source space could be errantly omitted by `Eric Larson`_
- Fix bug with :func:`mne.minimum_norm.compute_source_psd_epochs` and :func:`mne.minimum_norm.source_band_induced_power` raised errors when ``method='eLORETA'`` by `Eric Larson`_
- Fix bug with :func:`mne.minimum_norm.apply_inverse` where the explained variance did not work for complex data by `Eric Larson`_
Expand Down Expand Up @@ -132,6 +154,8 @@ Bug
- Fix default to be ``foreground=None`` in :func:`mne.viz.plot_source_estimates` to use white or black text based on the background color by `Eric Larson`_
- Fix bug with writing EGI and CTF `mne.Info` to H5 format, e.g., with `mne.time_frequency.AverageTFR.save` by `Eric Larson`_
- Fix bug with :func:`mne.io.Raw.plot` where toggling all projectors did not actually take effect by `Eric Larson`_
- Fix bug with :func:`mne.read_epochs` when loading data in complex format with ``preload=False`` by `Eric Larson`_
Expand Down Expand Up @@ -211,6 +235,8 @@ API

- The method ``stc_mixed.plot_surface`` for a :class:`mne.MixedSourceEstimate` has been deprecated in favor of :meth:`stc.surface().plot(...) <mne.MixedSourceEstimate.surface>` by `Eric Larson`_

- The method ``stc.normal`` for :class:`mne.VectorSourceEstimate` has been deprecated in favor of :meth:`stc.project('nn', src) <mne.VectorSourceEstimate.project>` by `Eric Larson`_

- Add ``use_dev_head_trans`` parameter to :func:`mne.preprocessing.annotate_movement` to allow choosing the device to head transform is used to define the fixed cHPI coordinates by `Luke Bloy`_

- The function ``mne.channels.read_dig_captrack`` will be deprecated in version 0.22 in favor of :func:`mne.channels.read_dig_captrak` to correct the spelling error: "captraCK" -> "captraK", by `Stefan Appelhoff`_
Expand Down
2 changes: 2 additions & 0 deletions doc/changes/names.inc
Original file line number Diff line number Diff line change
Expand Up @@ -305,3 +305,5 @@
.. _Lx37: https://github.com/Lx37
.. _Kyle Mathewson: https://github.com/kylemath
.. _Ezequiel Mikulan: https://github.com/ezemikulan
2 changes: 1 addition & 1 deletion doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@
# There are some problems with dipy's redirect:
# https://github.com/nipy/dipy/issues/1955
'dipy': ('https://dipy.org/documentation/latest',
'https://dipy.org/documentation/1.0.0./objects.inv/'),
'https://dipy.org/documentation/1.1.1./objects.inv/'),
'mne_realtime': ('https://mne.tools/mne-realtime', None),
'picard': ('https://pierreablin.github.io/picard/', None),
}
Expand Down
4 changes: 2 additions & 2 deletions doc/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@
<li style="background: url('_static/funding/anr.svg') no-repeat left top; background-size: 24px 10px;"><b>Agence Nationale de la Recherche:</b> 14-NEUC-0002-01<br><b>IDEX</b> Paris-Saclay, 11-IDEX-0003-02</li>
<li style="background: url('_static/funding/cds.png') no-repeat left top; background-size: 24px 24px;"><b>Paris-Saclay Center for Data Science:</b> <a href="http://www.datascience-paris-saclay.fr"/>PARIS-SACLAY</a></li>
<li style="background: url('_static/funding/google.svg') no-repeat left top; background-size: 24px 24px;"><b>Google:</b> Summer of code (×6)</li>
<li style="background: url('_static/funding/amazon.svg') no-repeat left top; background-size: 24px 24px;"><b>Amazon:</b> - AWS Research Grants</li>
<li style="background: url('_static/funding/czi.svg') no-repeat left top; background-size: 24px 24px;"><b>Chan Zuckerberg Initiative:</b> - <a href="https://chanzuckerberg.com/eoss/proposals/improving-usability-of-core-neuroscience-analysis-tools-with-mne-python/">Essential Open Source Software for Science</a></li>
<li style="background: url('_static/funding/amazon.svg') no-repeat left top; background-size: 24px 24px;"><b>Amazon:</b> AWS Research Grants</li>
<li style="background: url('_static/funding/czi.svg') no-repeat left top; background-size: 24px 24px;"><b>Chan Zuckerberg Initiative:</b> <a href="https://chanzuckerberg.com/eoss/proposals/improving-usability-of-core-neuroscience-analysis-tools-with-mne-python/">Essential Open Source Software for Science</a></li>
</ul>
</div>
</div>
Expand Down
13 changes: 13 additions & 0 deletions doc/install/advanced.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,19 @@ If you use another Python setup and you encounter some difficulties please
report them on the `MNE mailing list`_ or on the `GitHub issues page`_ to get
assistance.

It is also possible to interact with the 3D plots without installing Qt by using
the notebook 3d backend:

.. code-block:: ipython
In [1]: import mne
In [2]: mne.viz.set_3d_backend("notebook")
The notebook 3d backend requires PyVista to be installed along with other packages,
please follow :doc:`mne_python`


.. _installing_master:

Using the development version of MNE-Python (latest master)
Expand Down
7 changes: 7 additions & 0 deletions doc/install/mne_python.rst
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ Once you have Anaconda installed, the easiest way to install
MNE-Python with all dependencies is update your base Anaconda environment:

.. _environment file: https://raw.githubusercontent.com/mne-tools/mne-python/master/environment.yml
.. _server environment file: https://raw.githubusercontent.com/mne-tools/mne-python/master/server_environment.yml

.. collapse:: |linux| Linux

Expand Down Expand Up @@ -179,6 +180,11 @@ you can create a new dedicated environment (here called "mne") with
.. collapse:: |hand-stop-o| If you are installing on a headless server...
:class: danger

With `pyvista`_:
Follow the steps described in :ref:`standard_instructions`
but use `server environment file`_ instead of `environment file`_.

With `mayavi`_:
Installing `mayavi`_ requires a running `X server`_. If you are
installing MNE-Python into a computer with no display connected to it, you
can try removing `mayavi`_ from the :file:`environment.yml` file before
Expand Down Expand Up @@ -294,6 +300,7 @@ Python development are:
.. LINKS
.. _`mayavi`: https://docs.enthought.com/mayavi/mayavi/
.. _`pyvista`: https://docs.pyvista.org/
.. _`X server`: https://en.wikipedia.org/wiki/X_Window_System
.. _`xvfb`: https://en.wikipedia.org/wiki/Xvfb
.. _`off-screen rendering`: https://docs.enthought.com/mayavi/mayavi/tips.html#off-screen-rendering
Expand Down
Loading

0 comments on commit 3f48e4e

Please sign in to comment.