aboutsummaryrefslogtreecommitdiffstats
path: root/src/libgamma_facade.py
blob: 5920a5b35e4cca2413de01cc645b4adf4dbb6140 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# -*- python -*-
'''
pylibgamma — Python 3 wrapper for libgamma
Copyright © 2014  Mattias Andrée (maandree@member.fsf.org)

This library 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 library 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 library.  If not, see <http://www.gnu.org/licenses/>.
'''


from libgamma_method import MethodCapabilities



def list_methods(operation : int) -> list:
    '''
    List available adjustment methods by their order of preference based on the environment.
    
    @param  operation    Allowed values:
                           0: Methods that the environment suggests will work, excluding fake.
                           1: Methods that the environment suggests will work, including fake.
                           2: All real non-fake methods.
                           3: All real methods.
                           4: All methods.
                         Other values invoke undefined behaviour.
    @return  :list<int>  A list of available adjustment methods.
    '''
    from libgamma_native_facade import libgamma_native_list_methods
    return libgamma_native_list_methods(operation)


def is_method_available(method : int) -> bool:
    '''
    Check whether an adjustment method is available, non-existing (invalid) methods will be
    identified as not available under the rationale that the library may be out of date.
    
    @param   method  The adjustment method.
    @return          Whether the adjustment method is available.
    '''
    from libgamma_native_facade import libgamma_native_is_method_available
    return not libgamma_native_is_method_available(method) == 0


def method_capabilities(method : int) -> MethodCapabilities:
    '''
    Return the capabilities of an adjustment method.
    
    @param  this    The data structure to fill with the method's capabilities
    @param  method  The adjustment method (display server and protocol).
    '''
    from libgamma_native_facade import libgamma_native_method_capabilities
    caps = libgamma_native_method_capabilities(method)
    return MethodCapabilities(*caps)


def method_default_site(method : int) -> str:
    '''
    Return the default site for an adjustment method.
    
    @param   method  The adjustment method (display server and protocol.)
    @return          The default site, `None` if it cannot be determined or
                     if multiple sites are not supported by the adjustment
                     method.
    '''
    from libgamma_native_facade import libgamma_native_method_default_site
    return libgamma_native_method_default_site(method)


def method_default_site_variable(method : int) -> str:
    '''
    Return the default variable that determines
    the default site for an adjustment method.
    
    @param   method  The adjustment method (display server and protocol.)
    @return          The environ variables that is used to determine the
                     default site. `None` if there is none, that is, if
                     the method does not support multiple sites.
    '''
    from libgamma_native_facade import libgamma_native_method_default_site_variable
    return libgamma_native_method_default_site_variable(method)



def behex_edid(edid : bytes) -> str:
    '''
    Convert a raw representation of an EDID to a lowercase hexadecimal representation.
    
    @param   edid  The EDID in raw representation.
    @return        The EDID in lowercase hexadecimal representation.
    '''
    return behex_edid_lowercase(edid)


def behex_edid_lowercase(edid : bytes) -> str:
    '''
    Convert a raw representation of an EDID to a lowercase hexadecimal representation.
    
    @param   edid  The EDID in raw representation.
    @return        The EDID in lowercase hexadecimal representation.
    '''
    rc = ''
    for b in edid:
        rc += '0123456789abcdef'[(b >> 4) & 15]
        rc += '0123456789abcdef'[(b >> 0) & 15]
    return rc


def behex_edid_uppercase(edid : bytes) -> str:
    '''
    Convert a raw representation of an EDID to an uppercase hexadecimal representation.
    
    @param   edid  The EDID in raw representation.
    @return        The EDID in uppercase hexadecimal representation.
    '''
    rc = ''
    for b in edid:
        rc += '0123456789ABCDEF'[(b >> 4) & 15]
        rc += '0123456789ABCDEF'[(b >> 0) & 15]
    return rc


def unhex_edid(edid : str) -> bytes:
    '''
    Convert an hexadecimal representation of an EDID to a raw representation.
    
    @param   edid  The EDID in hexadecimal representation.
    @return        The EDID in raw representation.
    '''
    rc = []
    edid = edid.lower()
    for i in range(0, len(edid), 2):
        a, b = edid[i + 0], edid[i + 1]
        a = '0123456789abcdef'.find(a) << 4
        b = '0123456789abcdef'.find(b) << 0
        rc.append(a | b)
    return bytes(rc)