// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
// Test for releasing graphics resources from a non-current
// render window with vtkGPUVolumeRayCastMapper
// Thanks to Stephan Rademacher for providing the testing code.

#include "vtkColorTransferFunction.h"
#include "vtkCommand.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkNew.h"
#include "vtkPiecewiseFunction.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkSmartVolumeMapper.h"
#include "vtkStructuredPoints.h"
#include "vtkStructuredPointsReader.h"
#include "vtkTestUtilities.h"
#include "vtkTesting.h"
#include "vtkVolume.h"
#include "vtkVolumeProperty.h"

//------------------------------------------------------------------------------
static const char* TestRemoveVolumeNonCurrentContextLog =
  "# StreamVersion 1\n"
  "EnterEvent 263 265 0 0 0 0 0\n"
  "MouseMoveEvent 259 229 0 0 0 0 0\n"
  "MouseMoveEvent 261 299 0 0 0 0 0\n"
  "LeaveEvent 261 300 0 0 0 0 0\n"
  "EnterEvent 263 296 0 0 0 0 0\n"
  "MouseMoveEvent 268 283 0 0 0 0 0\n"
  "MouseMoveEvent 287 224 0 0 0 0 0\n"
  "LeftButtonPressEvent 287 224 0 0 0 0 0\n"
  "StartInteractionEvent 287 224 0 0 0 0 0\n"
  "TimerEvent 287 224 0 0 0 0 0\n"
  "RenderEvent 287 224 0 0 0 0 0\n"
  "TimerEvent 287 224 0 0 0 0 0\n"

  "TimerEvent 287 224 0 0 0 0 0\n"

  "TimerEvent 287 224 0 0 0 0 0\n"

  "TimerEvent 287 224 0 0 0 0 0\n"

  "TimerEvent 287 224 0 0 0 0 0\n"

  "TimerEvent 287 224 0 0 0 0 0\n"

  "TimerEvent 287 224 0 0 0 0 0\n"

  "MouseMoveEvent 287 223 0 0 0 0 0\n"
  "InteractionEvent 287 223 0 0 0 0 0\n"
  "TimerEvent 287 223 0 0 0 0 0\n"
  "RenderEvent 287 223 0 0 0 0 0\n"
  "MouseMoveEvent 287 218 0 0 0 0 0\n"
  "InteractionEvent 287 218 0 0 0 0 0\n"
  "TimerEvent 287 218 0 0 0 0 0\n"

  "MouseMoveEvent 287 212 0 0 0 0 0\n"
  "InteractionEvent 287 212 0 0 0 0 0\n"
  "TimerEvent 287 212 0 0 0 0 0\n"

  "MouseMoveEvent 287 203 0 0 0 0 0\n"
  "InteractionEvent 287 203 0 0 0 0 0\n"
  "TimerEvent 287 203 0 0 0 0 0\n"

  "MouseMoveEvent 287 196 0 0 0 0 0\n"
  "InteractionEvent 287 196 0 0 0 0 0\n"
  "TimerEvent 287 196 0 0 0 0 0\n"

  "TimerEvent 287 196 0 0 0 0 0\n"

  "MouseMoveEvent 287 188 0 0 0 0 0\n"
  "InteractionEvent 287 188 0 0 0 0 0\n"
  "MouseMoveEvent 287 180 0 0 0 0 0\n"
  "InteractionEvent 287 180 0 0 0 0 0\n"
  "TimerEvent 287 180 0 0 0 0 0\n"

  "MouseMoveEvent 287 175 0 0 0 0 0\n"
  "InteractionEvent 287 175 0 0 0 0 0\n"
  "TimerEvent 287 175 0 0 0 0 0\n"

  "TimerEvent 287 175 0 0 0 0 0\n"
  "RenderEvent 287 175 0 0 0 0 0\n"
  "MouseMoveEvent 287 170 0 0 0 0 0\n"
  "InteractionEvent 287 170 0 0 0 0 0\n"
  "TimerEvent 287 170 0 0 0 0 0\n"

  "MouseMoveEvent 288 164 0 0 0 0 0\n"
  "InteractionEvent 288 164 0 0 0 0 0\n"
  "MouseMoveEvent 289 160 0 0 0 0 0\n"
  "InteractionEvent 289 160 0 0 0 0 0\n"
  "TimerEvent 289 160 0 0 0 0 0\n"

  "TimerEvent 289 160 0 0 0 0 0\n"

  "MouseMoveEvent 290 155 0 0 0 0 0\n"
  "InteractionEvent 290 155 0 0 0 0 0\n"
  "TimerEvent 290 155 0 0 0 0 0\n"

  "MouseMoveEvent 292 150 0 0 0 0 0\n"
  "InteractionEvent 292 150 0 0 0 0 0\n"
  "MouseMoveEvent 292 143 0 0 0 0 0\n"
  "InteractionEvent 292 143 0 0 0 0 0\n"
  "TimerEvent 292 143 0 0 0 0 0\n"

  "TimerEvent 292 143 0 0 0 0 0\n"

  "MouseMoveEvent 294 137 0 0 0 0 0\n"
  "InteractionEvent 294 137 0 0 0 0 0\n"
  "TimerEvent 294 137 0 0 0 0 0\n"

  "MouseMoveEvent 295 130 0 0 0 0 0\n"
  "InteractionEvent 295 130 0 0 0 0 0\n"
  "TimerEvent 295 130 0 0 0 0 0\n"
  "RenderEvent 295 130 0 0 0 0 0\n"
  "MouseMoveEvent 296 126 0 0 0 0 0\n"
  "InteractionEvent 296 126 0 0 0 0 0\n"
  "TimerEvent 296 126 0 0 0 0 0\n"

  "MouseMoveEvent 299 120 0 0 0 0 0\n"
  "InteractionEvent 299 120 0 0 0 0 0\n"
  "TimerEvent 299 120 0 0 0 0 0\n"

  "MouseMoveEvent 301 116 0 0 0 0 0\n"
  "InteractionEvent 301 116 0 0 0 0 0\n"
  "TimerEvent 301 116 0 0 0 0 0\n"

  "MouseMoveEvent 303 110 0 0 0 0 0\n"
  "InteractionEvent 303 110 0 0 0 0 0\n"
  "TimerEvent 303 110 0 0 0 0 0\n"

  "MouseMoveEvent 305 107 0 0 0 0 0\n"
  "InteractionEvent 305 107 0 0 0 0 0\n"
  "TimerEvent 305 107 0 0 0 0 0\n"

  "MouseMoveEvent 308 103 0 0 0 0 0\n"
  "InteractionEvent 308 103 0 0 0 0 0\n"
  "TimerEvent 308 103 0 0 0 0 0\n"

  "MouseMoveEvent 311 99 0 0 0 0 0\n"
  "InteractionEvent 311 99 0 0 0 0 0\n"
  "TimerEvent 311 99 0 0 0 0 0\n"
  "RenderEvent 311 99 0 0 0 0 0\n"
  "MouseMoveEvent 314 97 0 0 0 0 0\n"
  "InteractionEvent 314 97 0 0 0 0 0\n"
  "TimerEvent 314 97 0 0 0 0 0\n"

  "MouseMoveEvent 317 94 0 0 0 0 0\n"
  "InteractionEvent 317 94 0 0 0 0 0\n"
  "TimerEvent 317 94 0 0 0 0 0\n"

  "MouseMoveEvent 320 93 0 0 0 0 0\n"
  "InteractionEvent 320 93 0 0 0 0 0\n"
  "TimerEvent 320 93 0 0 0 0 0\n"

  "MouseMoveEvent 324 91 0 0 0 0 0\n"
  "InteractionEvent 324 91 0 0 0 0 0\n"
  "TimerEvent 324 91 0 0 0 0 0\n"

  "MouseMoveEvent 329 89 0 0 0 0 0\n"
  "InteractionEvent 329 89 0 0 0 0 0\n"
  "TimerEvent 329 89 0 0 0 0 0\n"

  "MouseMoveEvent 334 88 0 0 0 0 0\n"
  "InteractionEvent 334 88 0 0 0 0 0\n"
  "TimerEvent 334 88 0 0 0 0 0\n"

  "MouseMoveEvent 338 87 0 0 0 0 0\n"
  "InteractionEvent 338 87 0 0 0 0 0\n"
  "TimerEvent 338 87 0 0 0 0 0\n"

  "MouseMoveEvent 344 86 0 0 0 0 0\n"
  "InteractionEvent 344 86 0 0 0 0 0\n"
  "TimerEvent 344 86 0 0 0 0 0\n"
  "RenderEvent 344 86 0 0 0 0 0\n"
  "MouseMoveEvent 350 85 0 0 0 0 0\n"
  "InteractionEvent 350 85 0 0 0 0 0\n"
  "TimerEvent 350 85 0 0 0 0 0\n"

  "MouseMoveEvent 355 85 0 0 0 0 0\n"
  "InteractionEvent 355 85 0 0 0 0 0\n"
  "TimerEvent 355 85 0 0 0 0 0\n"

  "MouseMoveEvent 359 84 0 0 0 0 0\n"
  "InteractionEvent 359 84 0 0 0 0 0\n"
  "TimerEvent 359 84 0 0 0 0 0\n"

  "MouseMoveEvent 363 84 0 0 0 0 0\n"
  "InteractionEvent 363 84 0 0 0 0 0\n"
  "TimerEvent 363 84 0 0 0 0 0\n"

  "MouseMoveEvent 367 83 0 0 0 0 0\n"
  "InteractionEvent 367 83 0 0 0 0 0\n"
  "TimerEvent 367 83 0 0 0 0 0\n"

  "MouseMoveEvent 370 83 0 0 0 0 0\n"
  "InteractionEvent 370 83 0 0 0 0 0\n"
  "TimerEvent 370 83 0 0 0 0 0\n"

  "MouseMoveEvent 372 83 0 0 0 0 0\n"
  "InteractionEvent 372 83 0 0 0 0 0\n"
  "TimerEvent 372 83 0 0 0 0 0\n"

  "MouseMoveEvent 374 83 0 0 0 0 0\n"
  "InteractionEvent 374 83 0 0 0 0 0\n"
  "TimerEvent 374 83 0 0 0 0 0\n"
  "RenderEvent 374 83 0 0 0 0 0\n"
  "TimerEvent 374 83 0 0 0 0 0\n"

  "MouseMoveEvent 375 83 0 0 0 0 0\n"
  "InteractionEvent 375 83 0 0 0 0 0\n"
  "TimerEvent 375 83 0 0 0 0 0\n"

  "TimerEvent 375 83 0 0 0 0 0\n"

  "TimerEvent 375 83 0 0 0 0 0\n"

  "TimerEvent 375 83 0 0 0 0 0\n"

  "MouseMoveEvent 375 84 0 0 0 0 0\n"
  "InteractionEvent 375 84 0 0 0 0 0\n"
  "TimerEvent 375 84 0 0 0 0 0\n"

  "MouseMoveEvent 375 86 0 0 0 0 0\n"
  "InteractionEvent 375 86 0 0 0 0 0\n"
  "MouseMoveEvent 372 90 0 0 0 0 0\n"
  "InteractionEvent 372 90 0 0 0 0 0\n"
  "TimerEvent 372 90 0 0 0 0 0\n"

  "TimerEvent 372 90 0 0 0 0 0\n"
  "RenderEvent 372 90 0 0 0 0 0\n"
  "MouseMoveEvent 370 94 0 0 0 0 0\n"
  "InteractionEvent 370 94 0 0 0 0 0\n"
  "TimerEvent 370 94 0 0 0 0 0\n"

  "MouseMoveEvent 368 98 0 0 0 0 0\n"
  "InteractionEvent 368 98 0 0 0 0 0\n"
  "MouseMoveEvent 366 102 0 0 0 0 0\n"
  "InteractionEvent 366 102 0 0 0 0 0\n"
  "TimerEvent 366 102 0 0 0 0 0\n"

  "TimerEvent 366 102 0 0 0 0 0\n"

  "MouseMoveEvent 362 106 0 0 0 0 0\n"
  "InteractionEvent 362 106 0 0 0 0 0\n"
  "TimerEvent 362 106 0 0 0 0 0\n"

  "MouseMoveEvent 359 111 0 0 0 0 0\n"
  "InteractionEvent 359 111 0 0 0 0 0\n"
  "TimerEvent 359 111 0 0 0 0 0\n"

  "MouseMoveEvent 357 117 0 0 0 0 0\n"
  "InteractionEvent 357 117 0 0 0 0 0\n"
  "TimerEvent 357 117 0 0 0 0 0\n"

  "MouseMoveEvent 353 122 0 0 0 0 0\n"
  "InteractionEvent 353 122 0 0 0 0 0\n"
  "TimerEvent 353 122 0 0 0 0 0\n"

  "MouseMoveEvent 350 128 0 0 0 0 0\n"
  "InteractionEvent 350 128 0 0 0 0 0\n"
  "TimerEvent 350 128 0 0 0 0 0\n"
  "RenderEvent 350 128 0 0 0 0 0\n"
  "MouseMoveEvent 347 133 0 0 0 0 0\n"
  "InteractionEvent 347 133 0 0 0 0 0\n"
  "TimerEvent 347 133 0 0 0 0 0\n"

  "MouseMoveEvent 343 138 0 0 0 0 0\n"
  "InteractionEvent 343 138 0 0 0 0 0\n"
  "TimerEvent 343 138 0 0 0 0 0\n"

  "MouseMoveEvent 339 144 0 0 0 0 0\n"
  "InteractionEvent 339 144 0 0 0 0 0\n"
  "TimerEvent 339 144 0 0 0 0 0\n"

  "MouseMoveEvent 337 148 0 0 0 0 0\n"
  "InteractionEvent 337 148 0 0 0 0 0\n"
  "TimerEvent 337 148 0 0 0 0 0\n"

  "MouseMoveEvent 335 151 0 0 0 0 0\n"
  "InteractionEvent 335 151 0 0 0 0 0\n"
  "TimerEvent 335 151 0 0 0 0 0\n"

  "MouseMoveEvent 334 154 0 0 0 0 0\n"
  "InteractionEvent 334 154 0 0 0 0 0\n"
  "TimerEvent 334 154 0 0 0 0 0\n"

  "MouseMoveEvent 331 156 0 0 0 0 0\n"
  "InteractionEvent 331 156 0 0 0 0 0\n"
  "TimerEvent 331 156 0 0 0 0 0\n"

  "MouseMoveEvent 329 160 0 0 0 0 0\n"
  "InteractionEvent 329 160 0 0 0 0 0\n"
  "TimerEvent 329 160 0 0 0 0 0\n"
  "RenderEvent 329 160 0 0 0 0 0\n"
  "MouseMoveEvent 328 162 0 0 0 0 0\n"
  "InteractionEvent 328 162 0 0 0 0 0\n"
  "TimerEvent 328 162 0 0 0 0 0\n"

  "MouseMoveEvent 327 164 0 0 0 0 0\n"
  "InteractionEvent 327 164 0 0 0 0 0\n"
  "TimerEvent 327 164 0 0 0 0 0\n"

  "MouseMoveEvent 326 165 0 0 0 0 0\n"
  "InteractionEvent 326 165 0 0 0 0 0\n"
  "TimerEvent 326 165 0 0 0 0 0\n"

  "MouseMoveEvent 325 168 0 0 0 0 0\n"
  "InteractionEvent 325 168 0 0 0 0 0\n"
  "TimerEvent 325 168 0 0 0 0 0\n"

  "MouseMoveEvent 324 170 0 0 0 0 0\n"
  "InteractionEvent 324 170 0 0 0 0 0\n"
  "TimerEvent 324 170 0 0 0 0 0\n"

  "MouseMoveEvent 322 172 0 0 0 0 0\n"
  "InteractionEvent 322 172 0 0 0 0 0\n"
  "TimerEvent 322 172 0 0 0 0 0\n"

  "MouseMoveEvent 321 173 0 0 0 0 0\n"
  "InteractionEvent 321 173 0 0 0 0 0\n"
  "TimerEvent 321 173 0 0 0 0 0\n"

  "MouseMoveEvent 319 173 0 0 0 0 0\n"
  "InteractionEvent 319 173 0 0 0 0 0\n"
  "TimerEvent 319 173 0 0 0 0 0\n"
  "RenderEvent 319 173 0 0 0 0 0\n"
  "MouseMoveEvent 318 174 0 0 0 0 0\n"
  "InteractionEvent 318 174 0 0 0 0 0\n"
  "TimerEvent 318 174 0 0 0 0 0\n"

  "MouseMoveEvent 315 175 0 0 0 0 0\n"
  "InteractionEvent 315 175 0 0 0 0 0\n"
  "TimerEvent 315 175 0 0 0 0 0\n"

  "MouseMoveEvent 313 175 0 0 0 0 0\n"
  "InteractionEvent 313 175 0 0 0 0 0\n"
  "TimerEvent 313 175 0 0 0 0 0\n"

  "MouseMoveEvent 312 176 0 0 0 0 0\n"
  "InteractionEvent 312 176 0 0 0 0 0\n"
  "TimerEvent 312 176 0 0 0 0 0\n"

  "MouseMoveEvent 311 176 0 0 0 0 0\n"
  "InteractionEvent 311 176 0 0 0 0 0\n"
  "TimerEvent 311 176 0 0 0 0 0\n"

  "TimerEvent 311 176 0 0 0 0 0\n"

  "MouseMoveEvent 310 176 0 0 0 0 0\n"
  "InteractionEvent 310 176 0 0 0 0 0\n"
  "TimerEvent 310 176 0 0 0 0 0\n"
  "RenderEvent 310 176 0 0 0 0 0\n"
  "MouseMoveEvent 309 177 0 0 0 0 0\n"
  "InteractionEvent 309 177 0 0 0 0 0\n"
  "MouseMoveEvent 308 177 0 0 0 0 0\n"
  "InteractionEvent 308 177 0 0 0 0 0\n"
  "TimerEvent 308 177 0 0 0 0 0\n"

  "TimerEvent 308 177 0 0 0 0 0\n"

  "MouseMoveEvent 308 178 0 0 0 0 0\n"
  "InteractionEvent 308 178 0 0 0 0 0\n"
  "TimerEvent 308 178 0 0 0 0 0\n"

  "TimerEvent 308 178 0 0 0 0 0\n"

  "TimerEvent 308 178 0 0 0 0 0\n"

  "TimerEvent 308 178 0 0 0 0 0\n"

  "TimerEvent 308 178 0 0 0 0 0\n"

  "TimerEvent 308 178 0 0 0 0 0\n"
  "RenderEvent 308 178 0 0 0 0 0\n"
  "LeftButtonReleaseEvent 308 178 0 0 0 0 0\n"
  "EndInteractionEvent 308 178 0 0 0 0 0\n"
  "RenderEvent 308 178 0 0 0 0 0\n"
  "MouseMoveEvent 327 178 0 0 0 0 0\n"
  "MouseMoveEvent 327 178 0 0 0 0 0\n"
  "MouseMoveEvent 439 127 0 0 0 0 0\n"
  "MouseMoveEvent 439 127 0 0 0 0 0\n"
  "LeaveEvent 516 89 0 0 0 0 0\n"
  "EnterEvent 447 175 0 0 0 0 0\n"
  "MouseMoveEvent 447 175 0 0 0 0 0\n"
  "MouseMoveEvent 447 175 0 0 0 0 0\n"
  "MouseMoveEvent 301 177 0 0 0 0 0\n"
  "MouseMoveEvent 301 177 0 0 0 0 0\n"
  "LeftButtonPressEvent 301 177 0 0 0 0 0\n"
  "StartInteractionEvent 301 177 0 0 0 0 0\n"
  "LeftButtonReleaseEvent 301 177 0 0 0 0 0\n"
  "EndInteractionEvent 301 177 0 0 0 0 0\n"
  "RenderEvent 301 177 0 0 0 0 0\n"
  "MouseMoveEvent 300 178 0 0 0 0 0\n"
  "MouseMoveEvent 270 218 0 0 0 0 0\n"
  "LeftButtonPressEvent 270 218 0 0 0 0 0\n"
  "StartInteractionEvent 270 218 0 0 0 0 0\n"
  "MouseMoveEvent 269 219 0 0 0 0 0\n"
  "InteractionEvent 269 219 0 0 0 0 0\n"
  "TimerEvent 269 219 0 0 0 0 0\n"
  "RenderEvent 269 219 0 0 0 0 0\n"
  "TimerEvent 269 219 0 0 0 0 0\n"

  "MouseMoveEvent 269 220 0 0 0 0 0\n"
  "InteractionEvent 269 220 0 0 0 0 0\n"
  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"
  "RenderEvent 269 220 0 0 0 0 0\n"
  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"

  "TimerEvent 269 220 0 0 0 0 0\n"

  "MouseMoveEvent 269 219 0 0 0 0 0\n"
  "InteractionEvent 269 219 0 0 0 0 0\n"
  "TimerEvent 269 219 0 0 0 0 0\n"
  "RenderEvent 269 219 0 0 0 0 0\n"
  "MouseMoveEvent 269 213 0 0 0 0 0\n"
  "InteractionEvent 269 213 0 0 0 0 0\n"
  "TimerEvent 269 213 0 0 0 0 0\n"

  "MouseMoveEvent 269 202 0 0 0 0 0\n"
  "InteractionEvent 269 202 0 0 0 0 0\n"
  "TimerEvent 269 202 0 0 0 0 0\n"

  "MouseMoveEvent 269 189 0 0 0 0 0\n"
  "InteractionEvent 269 189 0 0 0 0 0\n"
  "TimerEvent 269 189 0 0 0 0 0\n"

  "MouseMoveEvent 269 175 0 0 0 0 0\n"
  "InteractionEvent 269 175 0 0 0 0 0\n"
  "TimerEvent 269 175 0 0 0 0 0\n"

  "MouseMoveEvent 269 167 0 0 0 0 0\n"
  "InteractionEvent 269 167 0 0 0 0 0\n"
  "TimerEvent 269 167 0 0 0 0 0\n"

  "MouseMoveEvent 269 160 0 0 0 0 0\n"
  "InteractionEvent 269 160 0 0 0 0 0\n"
  "TimerEvent 269 160 0 0 0 0 0\n"

  "MouseMoveEvent 269 154 0 0 0 0 0\n"
  "InteractionEvent 269 154 0 0 0 0 0\n"
  "TimerEvent 269 154 0 0 0 0 0\n"

  "MouseMoveEvent 269 152 0 0 0 0 0\n"
  "InteractionEvent 269 152 0 0 0 0 0\n"
  "TimerEvent 269 152 0 0 0 0 0\n"
  "RenderEvent 269 152 0 0 0 0 0\n"
  "MouseMoveEvent 269 150 0 0 0 0 0\n"
  "InteractionEvent 269 150 0 0 0 0 0\n"
  "TimerEvent 269 150 0 0 0 0 0\n"

  "MouseMoveEvent 270 149 0 0 0 0 0\n"
  "InteractionEvent 270 149 0 0 0 0 0\n"
  "TimerEvent 270 149 0 0 0 0 0\n"

  "MouseMoveEvent 270 148 0 0 0 0 0\n"
  "InteractionEvent 270 148 0 0 0 0 0\n"
  "TimerEvent 270 148 0 0 0 0 0\n"

  "TimerEvent 270 148 0 0 0 0 0\n"

  "MouseMoveEvent 270 148 0 0 0 0 0\n"
  "InteractionEvent 270 148 0 0 0 0 0\n"
  "TimerEvent 270 148 0 0 0 0 0\n"

  "MouseMoveEvent 271 146 0 0 0 0 0\n"
  "InteractionEvent 271 146 0 0 0 0 0\n"
  "MouseMoveEvent 272 144 0 0 0 0 0\n"
  "InteractionEvent 272 144 0 0 0 0 0\n"
  "TimerEvent 272 144 0 0 0 0 0\n"

  "TimerEvent 272 144 0 0 0 0 0\n"
  "RenderEvent 272 144 0 0 0 0 0\n"
  "MouseMoveEvent 273 142 0 0 0 0 0\n"
  "InteractionEvent 273 142 0 0 0 0 0\n"
  "TimerEvent 273 142 0 0 0 0 0\n"

  "MouseMoveEvent 275 140 0 0 0 0 0\n"
  "InteractionEvent 275 140 0 0 0 0 0\n"
  "MouseMoveEvent 277 138 0 0 0 0 0\n"
  "InteractionEvent 277 138 0 0 0 0 0\n"
  "TimerEvent 277 138 0 0 0 0 0\n"

  "TimerEvent 277 138 0 0 0 0 0\n"

  "TimerEvent 277 138 0 0 0 0 0\n"

  "TimerEvent 277 138 0 0 0 0 0\n"
  "RenderEvent 277 138 0 0 0 0 0\n"
  "TimerEvent 277 138 0 0 0 0 0\n"
  "RenderEvent 277 138 0 0 0 0 0\n"
  "LeftButtonReleaseEvent 277 138 0 0 0 0 0\n"
  "EndInteractionEvent 277 138 0 0 0 0 0\n"
  "RenderEvent 277 138 0 0 0 0 0\n"
  "KeyPressEvent 277 138 0 0 57 1 9\n"
  "CharEvent 277 138 0 0 57 1 9\n"
  "KeyReleaseEvent 277 138 0 0 57 1 9\n"
  "MouseMoveEvent 277 140 0 0 0 0 9\n"
  "MouseMoveEvent 277 140 0 0 0 0 9\n"
  "MouseMoveEvent 277 145 0 0 0 0 9\n";

//------------------------------------------------------------------------------
class TestRemoveVolumeNonCurrentContextCallback : public vtkCommand
{
public:
  static TestRemoveVolumeNonCurrentContextCallback* New()
  {
    return new TestRemoveVolumeNonCurrentContextCallback;
  }

  void Execute(vtkObject* caller, unsigned long eventId, void* vtkNotUsed(callData)) override
  {
    if (eventId != vtkCommand::KeyPressEvent)
    {
      return;
    }

    vtkRenderWindowInteractor* interactor = static_cast<vtkRenderWindowInteractor*>(caller);
    if (interactor == nullptr)
    {
      return;
    }

    char* pressedKey = interactor->GetKeySym();

    if (strcmp(pressedKey, "9") == 0)
    {
      renderer2->RemoveAllViewProps();
      renderWindow1->Render();
      renderWindow2->Render();
    }
  }

  vtkRenderer* renderer1;
  vtkRenderer* renderer2;
  vtkRenderWindow* renderWindow1;
  vtkRenderWindow* renderWindow2;
};

//------------------------------------------------------------------------------
int TestRemoveVolumeNonCurrentContext(int argc, char* argv[])
{
  const char* volumeFile = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/ironProt.vtk");
  vtkNew<vtkStructuredPointsReader> pointsReader;
  pointsReader->SetFileName(volumeFile);
  pointsReader->Update();
  delete[] volumeFile;

  vtkNew<vtkColorTransferFunction> colorTransferFunction;
  colorTransferFunction->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
  colorTransferFunction->AddRGBPoint(64.0, 1.0, 0.0, 0.0);
  colorTransferFunction->AddRGBPoint(128.0, 0.0, 0.0, 1.0);
  colorTransferFunction->AddRGBPoint(192.0, 0.0, 1.0, 0.0);
  colorTransferFunction->AddRGBPoint(255.0, 0.0, 0.2, 0.0);

  vtkNew<vtkPiecewiseFunction> opacityTransferFunction;
  opacityTransferFunction->AddPoint(0, 0.0);
  opacityTransferFunction->AddPoint(255, 1.0);

  vtkNew<vtkVolumeProperty> volumeProperty;
  volumeProperty->SetColor(colorTransferFunction);
  volumeProperty->SetScalarOpacity(opacityTransferFunction);

  // Create the first renderwindow/renderer/mapper.
  // This is the renderer that will experience problems later on.
  vtkNew<vtkSmartVolumeMapper> smartMapper1;
  smartMapper1->SetInputConnection(pointsReader->GetOutputPort());

  vtkNew<vtkVolume> volume1;
  volume1->SetMapper(smartMapper1);
  volume1->SetProperty(volumeProperty);

  vtkNew<vtkRenderer> renderer1;
  vtkNew<vtkRenderWindow> renderWindow1;
  vtkNew<vtkRenderWindowInteractor> interactor1;
  vtkNew<vtkInteractorStyleTrackballCamera> interactorStyle;
  interactor1->SetInteractorStyle(interactorStyle);

  renderWindow1->SetParentId(nullptr);
  renderWindow1->AddRenderer(renderer1);
  renderWindow1->SetWindowName("Victim");
  renderWindow1->SetSize(500, 300);
  renderWindow1->SetPosition(100, 100);
  interactor1->SetRenderWindow(renderWindow1);

  renderer1->AddVolume(volume1);
  renderer1->SetBackground(1.0, 1.0, 1.0);

  // Create the second renderwindow/renderer/mapper.
  // This is the renderer we later remove all the actors from,
  // triggering the problems in the first renderer
  vtkNew<vtkSmartVolumeMapper> smartMapper2;
  smartMapper2->SetInputConnection(pointsReader->GetOutputPort());

  vtkNew<vtkVolume> volume2;
  volume2->SetMapper(smartMapper2);
  volume2->SetProperty(volumeProperty);

  vtkNew<vtkRenderer> renderer2;
  vtkNew<vtkRenderWindow> renderWindow2;
  vtkNew<vtkRenderWindowInteractor> interactor2;

  renderWindow2->SetParentId(nullptr);
  renderWindow2->AddRenderer(renderer2);
  renderWindow2->SetWindowName("Villain");
  renderWindow2->SetSize(300, 300);
  renderWindow2->SetPosition(650, 100);
  interactor2->SetRenderWindow(renderWindow2);

  renderer2->AddVolume(volume2);
  renderer2->SetBackground(1.0, 1.0, 1.0);

  // Create callback so we can trigger the problem
  vtkNew<TestRemoveVolumeNonCurrentContextCallback> callback;
  callback->renderer1 = renderer1;
  callback->renderer2 = renderer2;
  callback->renderWindow1 = renderWindow1;
  callback->renderWindow2 = renderWindow2;
  interactor1->AddObserver("KeyPressEvent", callback);

  // Let's go
  interactor1->Initialize();
  renderWindow1->Render();
  renderWindow2->Render();
  renderWindow1->MakeCurrent();
  //  interactor1->SetKeyEventInformation(0, 0, 0, 0, "9");
  //  interactor1->InvokeEvent(vtkCommand::KeyPressEvent, nullptr);
  //  int retval = vtkTesting::Test(argc, argv, renderWindow1, 15);
  //  if (retval == vtkRegressionTester::DO_INTERACTOR)
  //    {
  //    interactor1->Start();
  //    }
  //  return !retval;
  return vtkTesting::InteractorEventLoop(
    argc, argv, interactor1, TestRemoveVolumeNonCurrentContextLog);
}
