/*
* DWN - Desktop Window Manager
* retoor <retoor@molodetz.nl>
* Screenshot capture API
*/
#ifndef DWN_SCREENSHOT_H
#define DWN_SCREENSHOT_H
#include <stdbool.h>
#include <stddef.h>
#include <pthread.h>
#include <X11/Xlib.h>
typedef enum {
SCREENSHOT_OK = 0,
SCREENSHOT_ERROR_INVALID_ARG,
SCREENSHOT_ERROR_X11,
SCREENSHOT_ERROR_PNG,
SCREENSHOT_ERROR_NO_MEMORY,
SCREENSHOT_ERROR_WINDOW_NOT_FOUND
} ScreenshotStatus;
typedef enum {
SCREENSHOT_STATE_IDLE,
SCREENSHOT_STATE_PENDING,
SCREENSHOT_STATE_COMPLETED,
SCREENSHOT_STATE_ERROR
} ScreenshotState;
typedef enum {
SCREENSHOT_MODE_FULLSCREEN,
SCREENSHOT_MODE_WINDOW,
SCREENSHOT_MODE_ACTIVE,
SCREENSHOT_MODE_AREA
} ScreenshotMode;
typedef struct {
unsigned char *data;
size_t size;
int width;
int height;
} ScreenshotResult;
typedef struct ScreenshotRequest {
ScreenshotMode mode;
Window window;
int x, y, width, height;
ScreenshotResult result;
ScreenshotStatus status;
ScreenshotState state;
void (*callback)(struct ScreenshotRequest *req);
void *user_data;
pthread_t thread;
struct ScreenshotRequest *next;
} ScreenshotRequest;
bool screenshot_init(void);
void screenshot_cleanup(void);
ScreenshotStatus screenshot_capture_fullscreen(ScreenshotResult *result);
ScreenshotStatus screenshot_capture_window(Window window, ScreenshotResult *result);
ScreenshotStatus screenshot_capture_active(ScreenshotResult *result);
ScreenshotStatus screenshot_capture_area(int x, int y, int width, int height, ScreenshotResult *result);
ScreenshotRequest *screenshot_capture_async(ScreenshotMode mode,
void (*callback)(ScreenshotRequest *));
ScreenshotRequest *screenshot_capture_window_async(Window window,
void (*callback)(ScreenshotRequest *));
ScreenshotRequest *screenshot_capture_area_async(int x, int y, int w, int h,
void (*callback)(ScreenshotRequest *));
void screenshot_process_pending(void);
void screenshot_cancel(ScreenshotRequest *req);
char *screenshot_to_base64(const ScreenshotResult *result, size_t *out_len);
void screenshot_result_free(ScreenshotResult *result);
const char *screenshot_status_string(ScreenshotStatus status);
#endif