aboutsummaryrefslogblamecommitdiffstats
path: root/libaxl-display-info.h
blob: 71cf80fd5b3572d2b168353be9f4784af48149ce (plain) (tree)












































































































































































































































































































                                                                                                       
/* See LICENSE file for copyright and license details. */

/**
 * The highest number of the `struct_version` field in
 * `struct libaxl_display_info` that this header file
 * supports
 */
#define LIBAXL_DISPLAY_INFO_VERSION 0

/**
 * Standard byte orders
 */
enum libaxl_byte_order {
	/**
	 * Least significant byte first
	 */
	LIBAXL_LSB_FIRST,

	/**
	 * Most significant byte first
	 */
	LIBAXL_MSB_FIRST
};

/**
 * Standard bit orders
 */
enum libaxl_bit_order {
	/**
	 * Least significant bit leftmost
	 */
	LIBAXL_LSB_LEFTMOST,

	/**
	 * Most significant bit leftmost
	 */
	LIBAXL_MSB_LEFTMOST
};

struct libaxl_format {
	uint8_t depth;
	uint8_t bits_per_pixel;
	uint8_t scanline_pad;
	uint8_t __unused[5];
};

struct libaxl_visual_type {
	libaxl_visual_t visual_id;
	uint8_t class;                /* LIBAXL_STATIC_GRAY, LIBAXL_GRAY_SCALE, LIBAXL_STATIC_COLOR,
	                               * LIBAXL_PSEUDO_COLOR, LIBAXL_TRUE_COLOR, LIBAXL_DIRECT_COLOR */
	uint8_t bits_per_rgb_value;
	uint16_t colormap_entries;
	uint32_t red_mask;
	uint32_t green_mask;
	uint32_t blue_mask;
	uint32_t __unused;
};

struct libaxl_depth {
	uint8_t depth;
	uint8_t __pad;
	uint16_t number_of_visuals;
	uint32_t __unused;
	struct libaxl_visual_type visuals[];
};

/**
 * Screen information
 */
struct libaxl_screen {
	/**
	 * The root window of the screen
	 * 
	 * This is always an LIBAXL_INPUT_OUTPUT window
	 */
	libaxl_window_t root;

	/**
	 * The map initially associated with the root window
	 * 
	 * Windows with minimal colour requires may want to
	 * use this colormap if they use the same depth as
	 * the root window.
	 */
	libaxl_colormap_t default_colormap;

	/**
	 * Bright colour usable for implementing monochrome
	 * applications using `.default_colormap`
	 * 
	 * This colour is permanently allocated
	 * 
	 * May be set to a dark colour on some screens
	 * (that what the colours to be inverted); the
	 * actual RGB value is unspecified and may any
	 * colour and not necessarily black or white
	 */
	uint32_t white_pixel;

	/**
	 * Dark colour usable for implementing monochrome
	 * applications using `.default_colormap`
	 * 
	 * This colour is permanently allocated
	 * 
	 * May be set to a bright colour on some screens
	 * (that what the colours to be inverted); the
	 * actual RGB value is unspecified and may any
	 * colour and not necessarily black or white
	 */
	uint32_t black_pixel;

	uint32_t current_input_masks; /* TODO SETofEVENTS */

	/**
	 * The width, in pixels, of the root window;
	 * which cannot be changed in the core protocol
	 * 
	 * This value will not update when root window
	 * is resized, but new connections may get an
	 * update value
	 */
	uint16_t width_in_pixels;

	/**
	 * The height, in pixels, of the root window;
	 * which cannot be changed in the core protocol
	 * 
	 * This value will not update when root window
	 * is resized, but new connections may get an
	 * update value
	 */
	uint16_t height_in_pixels;

	/**
	 * The width, in millimeters, of the root window;
	 * which cannot be changed in the core protocol
	 * 
	 * This value will not update when root window
	 * is resized or the monitor is changed
	 * 
	 * Note that the horizontal and vertical DPI
	 * (dots per inch) of a monitor are not
	 * necessarily equal to each other
	 */
	uint16_t width_in_millimeters;

	/**
	 * The height, in millimeters, of the root window;
	 * which cannot be changed in the core protocol
	 * 
	 * This value will not update when root window
	 * is resized or the monitor is changed
	 * 
	 * Note that the horizontal and vertical DPI
	 * (dots per inch) of a monitor are not
	 * necessarily equal to each other
	 */
	uint16_t height_in_millimeters;

	uint16_t min_installed_maps;
	uint16_t max_installed_maps;
	libaxl_visual_t root_visual;
	uint8_t backing_stores;
	libaxl_bool_t save_under;
	uint8_t root_depth;
	uint8_t number_of_allowed_depths;
	struct libaxl_depth allowed_depths[];
};

/**
 * Information about the display, display server, and connection
 */
struct libaxl_display_info {
	/**
	 * The version number of this structure that this library uses.
	 * When using dynamic linking, is important use the version that
	 * is the lowest of the number stored in this field and the
	 * number stored in the LIBAXL_DISPLAY_INFO_VERSION constant.
	 */
	int struct_version; /* TODO set when creating LIBAXL_CONNECTION */

	/* SINCE STRUCT VERSION 0: */

	/**
	 * The major number of version of the protocol negotiated
	 * between the client and the server. This is not necessarily
	 * the same number as returned in the second parameter of
	 * the libaxl_receive_handshake() function.
	 */
	int protocol_version_major;

	/**
	 * The minor number of version of the protocol negotiated
	 * between the client and the server. This is not necessarily
	 * the same number as returned in the third parameter of
	 * the libaxl_receive_handshake() function.
	 */
	int protocol_version_minor;

	/**
	 * The version of the protocol negotiated between the client
	 * and the server, encoded as the sum of the major number
	 * multipled by 10000 and the minor number.
	 */
	int protocol_version;

	/**
	 * The byte order generally used in communication with the
	 * display server
	 */
	enum libaxl_byte_order protocol_byte_order;

	/**
	 * The byte order used in images
	 */
	enum libaxl_byte_order image_byte_order;

	/**
	 * The smallest keycode transmitted by the server
	 * 
	 * Will never be less than 8
	 */
	unsigned int min_keycode;

	/**
	 * The greatest keycode transmitted by the server
	 * 
	 * This field has the `unsigned int` type rather than the
	 * `libaxl_keycode_t` type because the latter is restricted
	 * to 8-bits, and a future version of the protocol could
	 * theoretically use a larger value
	 */
	unsigned int max_keycode;

	/**
	 * Some identification of the owner of the server implementation
	 */
	const char *vendor;

	/**
	 * Release number for the implementation. The vendor controls
	 * the semantics of this number.
	 */
	uint32_t vendor_release;

	/**
	 * The bit order used in the units in the scanlines of bitmaps
	 */
	enum libaxl_bit_order bitmap_format_bit_order;

	/**
	 * Number of bits (will be a multiple of 8) that the scanlines
	 * in bitmaps are quantised into units of
	 * 
	 * Will never greater than `bitmap_format_scanline_pad`
	 */
	size_t bitmap_format_scanline_unit;

	/**
	 * Number of bits (will be a multiple of 8), that scanlines in
	 * bitmaps are padded to
	 */
	size_t bitmap_format_scanline_pad;

	/**
	 * The server may retain recent pointer motion history with
	 * finer granularity than is reported by LIBAXL_EVENT_MOTION_NOTIFY
	 * events, and which may be requested with
	 * LIBAXL_REQUEST_GET_MOTION_EVENTS requests
	 */
	size_t motion_buffer_size;

	/**
	 * The maximum value that can may appear in the length field
	 * in requests (that field is filled in by the library). Any
	 * requests larger than this (it is in byte-quads, meaning
	 * that it is multipled by 4 to get limit in bytes) generate
	 * a LIBAXL_ERROR_LENGTH error and the request is discarded.
	 * 
	 * This field will always be at least 4096 (meaning 16384 bytes)
	 */
	size_t maximum_request_length;

	/**
	 * The number of elements in `.formats`
	 */
	size_t nformats;

	const struct libaxl_format *formats; /* TODO doc */

	/**
	 * The number of elements in `.screens`
	 */
	size_t nscreens;

	/**
	 * List of all screens in the display
	 */
	const struct libaxl_format *screens;
};