text: /*
   * Copyright (c) 2019 - 2020 Andri Yngvason
   *
   * Permission to use, copy, modify, and/or distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
   * copyright notice and this permission notice appear in all copies.
   *
   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
   * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
   * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
   * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
   * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
   * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
   * PERFORMANCE OF THIS SOFTWARE.
   */
  
  #pragma once
  
  #include <stdbool.h>
  
  #include "wlr-screencopy-unstable-v1.h"
  #include "frame-capture.h"
  #include "smooth.h"
  
  struct zwlr_screencopy_manager_v1;
  struct zwlr_screencopy_frame_v1;
  struct wl_output;
  struct wl_buffer;
  struct wl_shm;
  struct aml_timer;
  struct renderer;
  
  enum screencopy_status {
  	SCREENCOPY_STATUS_CAPTURING = 0,
  	SCREENCOPY_STATUS_FATAL,
  	SCREENCOPY_STATUS_FAILED,
  	SCREENCOPY_STATUS_DONE,
  };
  
  struct screencopy {
  	struct frame_capture frame_capture;
  
  	struct wl_shm* wl_shm;
  	struct wl_buffer* buffer;
  
  	void* pixels;
  	size_t bufsize;
  
  	struct zwlr_screencopy_manager_v1* manager;
  	struct zwlr_screencopy_frame_v1* frame;
  
  	uint64_t last_time;
  	uint64_t start_time;
  	struct aml_timer* timer;
  
  	struct smooth delay_smoother;
  	double delay;
  	bool is_immediate_copy;
  };
  
  void screencopy_init(struct screencopy* self);
  void screencopy_destroy(struct screencopy* self);
  