diff options
Diffstat (limited to '')
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | src/blueshift_drm_c.c | 45 | ||||
-rw-r--r-- | src/blueshift_drm_c.h | 235 | ||||
-rw-r--r-- | src/blueshift_randr_c.c | 39 | ||||
-rw-r--r-- | src/blueshift_randr_c.h | 99 | ||||
-rw-r--r-- | src/blueshift_vidmode_c.c | 8 | ||||
-rw-r--r-- | src/blueshift_vidmode_c.h | 67 |
7 files changed, 411 insertions, 89 deletions
@@ -48,7 +48,10 @@ PKGCONFIG ?= pkg-config # Optimisation settings for C code compilation OPTIMISE ?= -Og -g # Warnings settings for C code compilation -WARN = -Wall -Wextra -pedantic +WARN = -Wall -Wextra -pedantic -Wdouble-promotion -Wformat=2 -Winit-self -Wmissing-include-dirs \ + -Wtrampolines -Wfloat-equal -Wmissing-prototypes +# Warnings violated by Cython and therefore excluded: (TODO) +# -Wswitch-default -Wshadow # The C standard for C code compilation STD = c99 LIBS_idcrtc = xcb-randr @@ -104,7 +107,7 @@ bin/%.so: obj/%.o obj/%_c.o @mkdir -p bin $(CC) $(FLAGS) $$($(PKGCONFIG) --libs $($(LIBS_))) -shared -o $@ $^ -obj/%.o: src/%.c +obj/%.o: src/%.c src/%.h @mkdir -p obj $(CC) $(FLAGS) -c -o $@ $< diff --git a/src/blueshift_drm_c.c b/src/blueshift_drm_c.c index a521545..1d04f86 100644 --- a/src/blueshift_drm_c.c +++ b/src/blueshift_drm_c.c @@ -14,46 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <alloca.h> - -#ifndef O_CLOEXEC - #define O_CLOEXEC 02000000 -#endif - -/* Requires video group */ -#include <xf86drm.h> -#include <xf86drmMode.h> - - - -/** - * Resources for an open connection to a graphics card - */ -typedef struct _card_connection -{ - /** - * File descriptor for the connection - */ - int fd; - - /** - * Card resources - */ - drmModeRes* res; - - /** - * Resources for open connectors - */ - drmModeConnector** connectors; - -} card_connection; +#include "blueshift_drm_c.h" /** @@ -91,7 +52,7 @@ static long card_connection_reuse_size = 0; /** * Free all resources, but you need to close all connections first */ -void blueshift_drm_close() +void blueshift_drm_close(void) { if (card_connections) free(card_connections); @@ -113,7 +74,7 @@ void blueshift_drm_close() * * @return The number of cards present on the system */ -int blueshift_drm_card_count() +int blueshift_drm_card_count(void) { long maxlen = strlen(DRM_DIR_NAME) + strlen(DRM_DEV_NAME) + 10; char* pathname = alloca(maxlen * sizeof(char)); diff --git a/src/blueshift_drm_c.h b/src/blueshift_drm_c.h new file mode 100644 index 0000000..3a4f738 --- /dev/null +++ b/src/blueshift_drm_c.h @@ -0,0 +1,235 @@ +/** + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef BLUESHIFT_DRM_C_H +#define BLUESHIFT_DRM_C_H + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <alloca.h> + +#ifndef O_CLOEXEC + #define O_CLOEXEC 02000000 +#endif + +/* Requires video group */ +#include <xf86drm.h> +#include <xf86drmMode.h> + + + +/** + * Resources for an open connection to a graphics card + */ +typedef struct _card_connection +{ + /** + * File descriptor for the connection + */ + int fd; + + /** + * Card resources + */ + drmModeRes* res; + + /** + * Resources for open connectors + */ + drmModeConnector** connectors; + +} card_connection; + + + +/** + * Free all resources, but you need to close all connections first + */ +void blueshift_drm_close(void); + +/** + * Get the number of cards present on the system + * + * @return The number of cards present on the system + */ +int blueshift_drm_card_count(void); + +/** + * Open connection to a graphics card + * + * @param card_index The index of the graphics card + * @return -1 on failure, otherwise an identifier for the connection to the card + */ +int blueshift_drm_open_card(int card_index); + +/** + * Update the resource, required after `blueshift_drm_open_card` + * + * @param connection The identifier for the connection to the card + */ +void blueshift_drm_update_card(int connection); + +/** + * Close connection to the graphics card + * + * @param connection The identifier for the connection to the card + */ +void blueshift_drm_close_card(int connection); + +/** + * Return the number of CRTC:s on the opened card + * + * @param connection The identifier for the connection to the card + * @return The number of CRTC:s on the opened card + */ +int blueshift_drm_crtc_count(int connection); + +/** + * Return the number of connectors on the opened card + * + * @param connection The identifier for the connection to the card + * @return The number of connectors on the opened card + */ +int blueshift_drm_connector_count(int connection); + +/** + * Return the size of the gamma ramps on a CRTC + * + * @param connection The identifier for the connection to the card + * @param crtc_index The index of the CRTC + * @return The size of the gamma ramps on a CRTC + */ +int blueshift_drm_gamma_size(int connection, int crtc_index); + +/** + * Get the current gamma ramps of a monitor + * + * @param connection The identifier for the connection to the card + * @param crtc_index The index of the CRTC to read from + * @param gamma_size The size a gamma ramp + * @param red Storage location for the red gamma ramp + * @param green Storage location for the green gamma ramp + * @param blue Storage location for the blue gamma ramp + * @return Zero on success + */ +int blueshift_drm_get_gamma_ramps(int connection, int crtc_index, int gamma_size, uint16_t* red, uint16_t* green, uint16_t* blue); + +/** + * Set the gamma ramps of the of a monitor + * + * @param connection The identifier for the connection to the card + * @param crtc_index The index of the CRTC to read from + * @param gamma_size The size a gamma ramp + * @param red The red gamma ramp + * @param green The green gamma ramp + * @param blue The blue gamma ramp + * @return Zero on success + */ +int blueshift_drm_set_gamma_ramps(int connection, int crtc_index, int gamma_size, uint16_t* red, uint16_t* green, uint16_t* blue); + +/** + * Acquire information about a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + */ +void blueshift_drm_open_connector(int connection, int connector_index); + +/** + * Release information about a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + */ +void blueshift_drm_close_connector(int connection, int connector_index); + +/** + * Get the physical width the monitor connected to a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + * @return The physical width of the monitor in millimetres, 0 if unknown or not connected + */ +int blueshift_drm_get_width(int connection, int connector_index); + +/** + * Get the physical height the monitor connected to a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + * @return The physical height of the monitor in millimetres, 0 if unknown or not connected + */ +int blueshift_drm_get_height(int connection, int connector_index); + +/** + * Get whether a monitor is connected to a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + * @return 1 if there is a connection, 0 otherwise, -1 if unknown + */ +int blueshift_drm_is_connected(int connection, int connector_index); + +/** + * Get the index of the CRTC of the monitor connected to a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + * @return The index of the CRTC + */ +int blueshift_drm_get_crtc(int connection, int connector_index); + +/** + * Get the index of the type of a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + * @return The connector type by index, 0 for unknown + */ +int blueshift_drm_get_connector_type_index(int connection, int connector_index); + +/** + * Get the name of the type of a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + * @return The connector type by name, "Unknown" if not identifiable, + * "Unrecognised" if Blueshift does not recognise it. + */ +const char* blueshift_drm_get_connector_type_name(int connection, int connector_index); + +/** + * Get the extended display identification data for the monitor connected to a connector + * + * @param connection The identifier for the connection to the card + * @param connector_index The index of the connector + * @param edid Storage location for the EDID, it should be 128 bytes, 256 bytes + zero termination if hex + * @param size The size allocated to `edid` excluding your zero termination + * @param hexadecimal Whether to convert to hexadecimal representation, this is preferable + * @return The length of the found value, 0 if none, as if hex is false + */ +long blueshift_drm_get_edid(int connection, int connector_index, char* edid, long size, int hexadecimal); + + + +#endif + diff --git a/src/blueshift_randr_c.c b/src/blueshift_randr_c.c index ef3c2a5..ddc19b9 100644 --- a/src/blueshift_randr_c.c +++ b/src/blueshift_randr_c.c @@ -14,44 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <stdlib.h> -#include <stdio.h> -#include <inttypes.h> - -#include <xcb/xcb.h> -#include <xcb/randr.h> - - - -/** - * The major version of RandR the program expects - */ -#define RANDR_VERSION_MAJOR 1U - -/** - * The minor version of RandR the program expects - */ -#define RANDR_VERSION_MINOR 3U - - - -/** - * Data structure for CRTC caches - */ -typedef struct blueshift_randr_crtc -{ - /** - * Size of colour curves on the X-axis - */ - unsigned int curve_size; - - /** - * CRT controller - */ - xcb_randr_crtc_t* crtc; - -} blueshift_randr_crtc_t; - +#include "blueshift_randr_c.h" /** diff --git a/src/blueshift_randr_c.h b/src/blueshift_randr_c.h new file mode 100644 index 0000000..5bae1de --- /dev/null +++ b/src/blueshift_randr_c.h @@ -0,0 +1,99 @@ +/** + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef BLUESHIFT_RANDR_C_H +#define BLUESHIFT_RANDR_C_H + + +#include <stdlib.h> +#include <stdio.h> +#include <inttypes.h> + +#include <xcb/xcb.h> +#include <xcb/randr.h> + + + +/** + * The major version of RandR the program expects + */ +#define RANDR_VERSION_MAJOR 1U + +/** + * The minor version of RandR the program expects + */ +#define RANDR_VERSION_MINOR 3U + + + +/** + * Data structure for CRTC caches + */ +typedef struct blueshift_randr_crtc +{ + /** + * Size of colour curves on the X-axis + */ + unsigned int curve_size; + + /** + * CRT controller + */ + xcb_randr_crtc_t* crtc; + +} blueshift_randr_crtc_t; + + + +/** + * Start stage of colour curve control + * + * @param use_screen The screen to use + * @return Zero on success + */ +int blueshift_randr_open(int use_screen); + +/** + * Gets the current colour curves + * + * @param use_crtc The CRTC to use + * @return {the size of the red curve, *the red curve, + * the size of the green curve, *the green curve, + * the size of the blue curve, *the blue curve}, + * needs to be free:d. `NULL` on error. + */ +uint16_t* blueshift_randr_read(int use_crtc); + +/** + * Apply stage of colour curve control + * + * @param use_crtcs Mask of CRTC:s to use + * @param r_curve The red colour curve + * @param g_curve The green colour curve + * @param b_curve The blue colour curve + * @return Zero on success + */ +int blueshift_randr_apply(uint64_t use_crtcs, uint16_t* r_curve, uint16_t* g_curve, uint16_t* b_curve); + +/** + * Resource freeing stage of colour curve control + */ +void blueshift_randr_close(void); + + + +#endif + diff --git a/src/blueshift_vidmode_c.c b/src/blueshift_vidmode_c.c index 72c8053..2f393c5 100644 --- a/src/blueshift_vidmode_c.c +++ b/src/blueshift_vidmode_c.c @@ -14,13 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <stdlib.h> -#include <stdio.h> -#include <inttypes.h> - -#include <X11/Xlib.h> -#include <X11/extensions/xf86vmode.h> - +#include "blueshift_vidmode_c.h" /** diff --git a/src/blueshift_vidmode_c.h b/src/blueshift_vidmode_c.h new file mode 100644 index 0000000..c99f841 --- /dev/null +++ b/src/blueshift_vidmode_c.h @@ -0,0 +1,67 @@ +/** + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef BLUESHIFT_VIDMODE_C_H +#define BLUESHIFT_VIDMODE_C_H + + +#include <stdlib.h> +#include <stdio.h> +#include <inttypes.h> + +#include <X11/Xlib.h> +#include <X11/extensions/xf86vmode.h> + + + +/** + * Start stage of colour curve control + * + * @param use_screen The screen to use + * @return Zero on error, otherwise the size of colours curves + */ +int blueshift_vidmode_open(int use_screen); + +/** + * Gets the current colour curves + * + * @param use_crtc The CRTC to use + * @param r_gamma Storage location for the red colour curve + * @param g_gamma Storage location for the green colour curve + * @param b_gamma Storage location for the blue colour curve + * @return Zero on success + */ +int blueshift_vidmode_read(int use_crtc, uint16_t* r_gamma, uint16_t* g_gamma, uint16_t* b_gamma); + +/** + * Apply stage of colour curve control + * + * @param use_crtcs Mask of CRTC:s to use + * @param r_curve The red colour curve + * @param g_curve The green colour curve + * @param b_curve The blue colour curve + * @return Zero on success + */ +int blueshift_vidmode_apply(uint64_t use_crtcs, uint16_t* r_curve, uint16_t* g_curve, uint16_t* b_curve); + +/** + * Resource freeing stage of colour curve control + */ +void blueshift_vidmode_close(void); + + +#endif + |