text: // This file is required by the index.html file and will
  // be executed in the renderer process for that window.
  // No Node.js APIs are available in this process because
  // `nodeIntegration` is turned off. Use `preload.js` to
  // selectively enable features needed in the rendering
  // process.
  
  class Renderer {
    constructor() {
      let c1 = document.getElementById('my_canvas_ipmi');
      let c2 = document.getElementById('my_canvas_dbus');
      let c3 = document.getElementById('my_canvas_boost_asio_handler');
      this.canvas1 = c1;
      this.canvas2 = c2;
      this.canvas3 = c3;
      this.width1 = c1.width; this.height1 = c1.height;
      this.width2 = c2.width; this.height2 = c2.height;
      this.width3 = c3.width; this.height3 = c3.height;
      this.ctx1 = this.canvas1.getContext('2d');
      this.ctx2 = this.canvas2.getContext('2d');
      this.ctx3 = this.canvas3.getContext('2d');
      this.frame_count = 0;
      this.addBindings();
      this.addListeners();
      this.update();
      this.run();
    }
  
    addBindings() {
      this.update = this.update.bind(this);
      this.run = this.run.bind(this);
    }
  
    addListeners() {
      window.addEventListener('resize', this.update);
    }
  
    update() {
      console.log('update, ' + window.innerWidth + ' x ' + window.innerHeight);
      if (false) {
        this.width1 = window.innerWidth;
        this.height1 = window.innerHeight;
        this.canvas1.width = this.width1;
        this.canvas1.height = this.height1;
      }
    }
  
    run() {
      draw_timeline(this.ctx1);
      draw_timeline_dbus(this.ctx2);
      draw_timeline_boost_asio_handler(this.ctx3);
      window.requestAnimationFrame(this.run);
    }
  }
  
  g_renderer = new Renderer();