summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile14
-rw-r--r--TODO1
-rw-r--r--src/blueshift_drm.pyx307
-rw-r--r--src/blueshift_drm_c.c11
4 files changed, 319 insertions, 14 deletions
diff --git a/Makefile b/Makefile
index bdc5bdd..9d3f78a 100644
--- a/Makefile
+++ b/Makefile
@@ -37,9 +37,9 @@ COMMAND ?= blueshift
PKGNAME ?= blueshift
# Bindings for display server access
-SERVER_BINDINGS ?= randr vidmode
+SERVER_BINDINGS ?= randr vidmode drm
# Executable bindings for display server access
-EXECS ?= idcrtc iccprofile drm
+EXECS ?= idcrtc iccprofile
# Executable library files
EXECLIBS = $(foreach E,$(EXECS),blueshift_$(E))
@@ -62,7 +62,7 @@ FLAGS = $$($(PKGCONFIG) --cflags $(LIBS)) -std=$(STD) $(WARN) $(OPTIMISE) -fPIC
# Resource files
DATAFILES = 2deg 10deg redshift redshift_old
# Python source files
-PYFILES = __main__.py colour.py curve.py monitor.py solar.py icc.py adhoc.py
+PYFILES = __main__.py colour.py curve.py monitor.py solar.py icc.py adhoc.py backlight.py
# Library files
CBINDINGS = $(foreach B,$(SERVER_BINDINGS),blueshift_$(B).so)
# Configuration script example files
@@ -95,11 +95,7 @@ bin/blueshift_iccprofile: obj/blueshift_iccprofile.o
@mkdir -p bin
$(CC) $(FLAGS) $$($(PKGCONFIG) --libs $($(LIBS_))) -o $@ $^
-bin/blueshift_drm: LIBS_=LIBS_drm
-bin/blueshift_drm: obj/blueshift_drm_c.o
- @mkdir -p bin
- $(CC) $(FLAGS) $$($(PKGCONFIG) --libs $($(LIBS_))) -o $@ $^
-
+bin/blueshift_drm.so: LIBS_=LIBS_drm
bin/blueshift_randr.so: LIBS_=LIBS_randr
bin/blueshift_vidmode.so: LIBS_=LIBS_vidmode
bin/%.so: obj/%.o obj/%_c.o
@@ -325,5 +321,5 @@ uninstall:
.PHONY: all
clean:
- -rm -r bin obj src/blueshift_randr.c src/blueshift_vidmode.c blueshift.{info,pdf,ps,dvi}
+ -rm -r bin obj src/blueshift_{randr,vidmode,drm}.c blueshift.{info,pdf,ps,dvi}
diff --git a/TODO b/TODO
index cf27481..47c3b2b 100644
--- a/TODO
+++ b/TODO
@@ -10,4 +10,5 @@ Medium priority:
Low priority:
Add wayland support
Add mir support
+ Do less malloc:s and free:s
diff --git a/src/blueshift_drm.pyx b/src/blueshift_drm.pyx
new file mode 100644
index 0000000..30f07c1
--- /dev/null
+++ b/src/blueshift_drm.pyx
@@ -0,0 +1,307 @@
+# -*- python -*-
+
+# 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/>.
+
+cimport cython
+from libc.stdlib cimport malloc, free
+
+
+cdef extern void blueshift_drm_close()
+cdef extern int blueshift_drm_card_count()
+cdef extern int blueshift_drm_open_card(int card_index)
+cdef extern void blueshift_drm_update_card(int connection)
+cdef extern void blueshift_drm_close_card(int connection)
+cdef extern int blueshift_drm_crtc_count(int connection)
+cdef extern int blueshift_drm_connector_count(int connection)
+cdef extern int blueshift_drm_gamma_size(int connection, int crtc_index)
+cdef extern int blueshift_drm_get_gamma_ramps(int connection, int crtc_index, int gamma_size,
+ unsigned short int* red,
+ unsigned short int* green,
+ unsigned short int* blue)
+cdef extern int blueshift_drm_set_gamma_ramps(int connection, int crtc_index, int gamma_size,
+ unsigned short int* red,
+ unsigned short int* green,
+ unsigned short int* blue)
+cdef extern void blueshift_drm_open_connector(int connection, int connector_index)
+cdef extern void blueshift_drm_close_connector(int connection, int connector_index)
+cdef extern int blueshift_drm_get_width(int connection, int connector_index)
+cdef extern int blueshift_drm_get_height(int connection, int connector_index)
+cdef extern int blueshift_drm_is_connected(int connection, int connector_index)
+cdef extern int blueshift_drm_get_crtc(int connection, int connector_index)
+cdef extern int blueshift_drm_get_connector_type_index(int connection, int connector_index)
+cdef extern const char* blueshift_drm_get_connector_type_name(int connection, int connector_index)
+cdef extern long int blueshift_drm_get_edid(int connection, int connector_index, char* edid,
+ long int size, int hexadecimal)
+
+
+def drm_close():
+ '''
+ Free all resources, but you need to close all connections first
+ '''
+ blueshift_drm_close()
+
+
+def drm_card_count():
+ '''
+ Get the number of cards present on the system
+
+ @return :int The number of cards present on the system
+ '''
+ return blueshift_drm_card_count()
+
+
+def drm_open_card(int card_index):
+ '''
+ Open connection to a graphics card
+
+ @param card_index The index of the graphics card
+ @return :int -1 on failure, otherwise an identifier for the connection to the card
+ '''
+ return blueshift_drm_open_card(card_index)
+
+
+def drm_update_card(int connection):
+ '''
+ Update the resource, required after `blueshift_drm_open_card`
+
+ @param connection The identifier for the connection to the card
+ '''
+ blueshift_drm_update_card(connection)
+
+
+def drm_close_card(int connection):
+ '''
+ Close connection to the graphics card
+
+ @param connection The identifier for the connection to the card
+ '''
+ blueshift_drm_close_card(connection)
+
+
+def drm_crtc_count(int connection):
+ '''
+ Return the number of CRTC:s on the opened card
+
+ @param connection The identifier for the connection to the card
+ @return :int The number of CRTC:s on the opened card
+ '''
+ return blueshift_drm_crtc_count(connection)
+
+
+def drm_connector_count(int connection):
+ '''
+ Return the number of connectors on the opened card
+
+ @param connection The identifier for the connection to the card
+ @return :int The number of connectors on the opened card
+ '''
+ return blueshift_drm_connector_count(connection)
+
+
+def drm_gamma_size(int connection, int crtc_index):
+ '''
+ 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 :int The size of the gamma ramps on a CRTC
+ '''
+ return blueshift_drm_gamma_size(connection, crtc_index)
+
+
+def drm_get_gamma_ramps(int connection, int crtc_index, int gamma_size):
+ '''
+ Get 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
+ @return :(r:list<int>, g:list<int>, b:list<int>)? The current red, green and blue colour curves
+ '''
+ cdef unsigned short int* r
+ cdef unsigned short int* g
+ cdef unsigned short int* b
+ r = <unsigned short int*>malloc(gamma_size * 2)
+ g = <unsigned short int*>malloc(gamma_size * 2)
+ b = <unsigned short int*>malloc(gamma_size * 2)
+ if (r is NULL) or (g is NULL) or (b is NULL):
+ raise MemoryError()
+ rc = blueshift_drm_get_gamma_ramps(connection, crtc_index, gamma_size, r, g, b)
+ if rc == 0:
+ rc_r, rc_g, rc_b = [], [], []
+ for i in range(gamma_size):
+ rc_r.append(r[i])
+ rc_g.append(g[i])
+ rc_b.append(b[i])
+ free(r)
+ free(g)
+ free(b)
+ return (rc_r, rc_g, rc_b)
+ else:
+ free(r)
+ free(g)
+ free(b)
+ return None
+
+
+def drm_set_gamma_ramps(int connection, int crtc_index, int gamma_size, r_curve, g_curve, b_curve):
+ '''
+ 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 r_curve:list<unsigned short int> The red gamma ramp
+ @param g_curve:list<unsigned short int> The green gamma ramp
+ @param b_curve:list<unsigned short int> The blue gamma ramp
+ @return :int Zero on success
+ '''
+ cdef unsigned short int* r
+ cdef unsigned short int* g
+ cdef unsigned short int* b
+ r = <unsigned short int*>malloc(gamma_size * 2)
+ g = <unsigned short int*>malloc(gamma_size * 2)
+ b = <unsigned short int*>malloc(gamma_size * 2)
+ if (r is NULL) or (g is NULL) or (b is NULL):
+ raise MemoryError()
+ for i in range(gamma_size):
+ r[i] = r_curve[i] & 0xFFFF
+ g[i] = g_curve[i] & 0xFFFF
+ b[i] = b_curve[i] & 0xFFFF
+ rc = blueshift_drm_set_gamma_ramps(connection, crtc_index, gamma_size, r, g, b)
+ free(r)
+ free(g)
+ free(b)
+ return rc
+
+
+def drm_open_connector(int connection, int connector_index):
+ '''
+ Acquire information about a connector
+
+ @param connection The identifier for the connection to the card
+ @param connector_index The index of the connector
+ '''
+ blueshift_drm_open_connector(connection, connector_index)
+
+
+def drm_close_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
+ '''
+ blueshift_drm_close_connector(connection, connector_index)
+
+
+def drm_get_width(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 :int The physical width of the monitor in millimetres, 0 if unknown or not connected
+ '''
+ return blueshift_drm_get_width(connection, connector_index)
+
+
+def drm_get_height(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 :int The physical height of the monitor in millimetres, 0 if unknown or not connected
+ '''
+ return blueshift_drm_get_height(connection, connector_index)
+
+
+def drm_is_connected(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 :int 1 if there is a connection, 0 otherwise, -1 if unknown
+ '''
+ return blueshift_drm_is_connected(connection, connector_index)
+
+
+def drm_get_crtc(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 :int The index of the CRTC
+ '''
+ return blueshift_drm_get_crtc(connection, connector_index)
+
+
+def drm_get_connector_type_index(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 :int The connector type by index, 0 for unknown
+ '''
+ return blueshift_drm_get_connector_type_index(connection, connector_index)
+
+
+def drm_get_connector_type_name(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 :str The connector type by name, "Unknown" if not identifiable,
+ "Unrecognised" if Blueshift does not recognise it.
+ '''
+ return <bytes>blueshift_drm_get_connector_type_name(connection, connector_index)
+
+
+def drm_get_edid(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
+ @return :str? The extended display identification data for the monitor
+ '''
+ cdef long int size
+ cdef long int got
+ cdef char* edid
+ cdef bytes rc
+
+ size = 256
+ edid = <char*>malloc(size + 1)
+ got = blueshift_drm_get_edid(connection, connector_index, edid, size, 1)
+
+ if got == 0:
+ free(edid)
+ return None
+
+ if got * 2 > size:
+ size = got
+ blueshift_drm_get_edid(connection, connector_index, edid, size, 1)
+
+ edid[got * 2] = 0
+ rc = edid
+ free(edid)
+ return rc
+
diff --git a/src/blueshift_drm_c.c b/src/blueshift_drm_c.c
index 121b689..a521545 100644
--- a/src/blueshift_drm_c.c
+++ b/src/blueshift_drm_c.c
@@ -89,7 +89,7 @@ static long card_connection_reuse_size = 0;
/**
- * Free all resources, but your need to close all connections first
+ * Free all resources, but you need to close all connections first
*/
void blueshift_drm_close()
{
@@ -446,10 +446,10 @@ const char* blueshift_drm_get_connector_type_name(int connection, int connector_
* @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 hex Whether to convert to hexadecimal representation, this is preferable
+ * @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 hex)
+long blueshift_drm_get_edid(int connection, int connector_index, char* edid, long size, int hexadecimal)
{
card_connection* card = card_connections + connection;
drmModeConnector* connector = *(card->connectors + connector_index);
@@ -464,7 +464,7 @@ long blueshift_drm_get_edid(int connection, int connector_index, char* edid, lon
if (!strcmp("EDID", prop->name))
{
drmModePropertyBlobRes* blob = drmModeGetPropertyBlob(fd, connector->prop_values[prop_i]);
- if (hex)
+ if (hexadecimal)
{
rc += blob->length;
uint32_t n = size / 2;
@@ -489,7 +489,7 @@ long blueshift_drm_get_edid(int connection, int connector_index, char* edid, lon
}
-
+/*
int main(int argc, char** argv)
{
int card_n = blueshift_drm_card_count();
@@ -607,4 +607,5 @@ int main(int argc, char** argv)
blueshift_drm_close();
return 0;
}
+*/