aboutsummaryrefslogtreecommitdiffstats
path: root/src/libgamma/Site.java
blob: a23ce2954648dbc3b648d985d500382c8271cbb5 (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
148
149
150
151
152
153
154
155
/**
 * jlibgamma — Display server abstraction layer for gamma ramp and Java
 * 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/>.
 */
package libgamma;


/**
 * Site state.
 * 
 * On operating systems that integrate a graphical environment
 * there is usually just one site. However, one systems with
 * pluggable graphics, like Unix-like systems such as GNU/Linux
 * and the BSD:s, there can usually be any (feasible) number of
 * sites. In X.org parlance they are called displays.
 */
public class Site
{
    /**
     * Type initialiser.
     */
    static
    {
	Libgamma.initialise();
    }
    
    
    
    /**
     * Constructor.
     * 
     * @param  method  The adjustmet method.
     * @param  site    The site identifier.
     */
    public Site(AdjustmentMethod method, String site) throws LibgammaException
    {
	this.method = method;
	this.site = site;
	long[] r = libgamma_site_create(method.value, site);
	this.address = r[0];
	this.partitions_available = (int)(r[1]);
	if (r[2] != 0)
	    throw new LibgammaException((int)(r[2]));
    }
    
    
    /**
     * This field specifies, for the methods if this library,
     * which adjustment method (display server and protocol)
     * is used to adjust the gamma ramps.
     */
    public final AdjustmentMethod method;
    
    /**
     * The site identifier. It can either be {@code null} or
     * a string. {@code null} indicates the default site. On
     * systems like the Unix-like systems, where the graphics
     * are pluggable, this is usually resolved by an environment
     * variable, such as "DISPLAY" for X.org.
     */
    public final String site;
    
    /**
     * The number of partitions that is available on this site.
     * Probably the majority of display server only one partition
     * per site. However, X.org can, and traditional used to have
     * on multi-headed environments, multiple partitions per site.
     * In X.org partitions are called 'screens'. It is not to be
     * confused with monitor. A screen is a collection of monitors,
     * and the mapping from monitors to screens is a surjection.
     * On hardware-level adjustment methods, such as Direct
     * Rendering Manager, a partition is a graphics card.
     */
    public final int partitions_available;
    
    /**
     * The address of the native object.
     */
    final long address;
    
    
    /**
     * Release resources.
     */
    public void close()
    {
	libgamma_site_free(this.address);
    }
    
    /**
     * Restore the gamma ramps all CRTC:s within the site to the system settings.
     */
    public void restore() throws LibgammaException
    {
	int r = libgamma_site_restore(this.address);
	if (r != 0)
	    throw new LibgammaException(r);
    }
    
    
    /**
     * {@inheritDoc}
     */
    public String toString()
    {
	return "<Site: method = " + this.method.toString() + ", " +
	                "site = " + (this.site == null ? "<null>" : this.site) + ", " +
        "partitions_available = " + Integer.toString(this.partitions_available) + ">";
    }
    
    
    
    
    /**
     * Create a site state.
     * 
     * @param   method  The adjustment method (display server and protocol.)
     * @param   site    The site identifier.
     * @return          Element 0:  The value for {@link #address}.
     *                  Element 1:  The value for {@link #partitions_available}
     *                  Element 2:  Error code, zero on success.
     */
    private static native long[] libgamma_site_create(int method, String site);
    
    /**
     * Release all resources held by a site state
     * and free the site state pointer.
     * 
     * @param  address  The site state.
     */
    private static native void libgamma_site_free(long address);
    
    /**
     * Restore the gamma ramps all CRTC:s within a site to the system settings.
     * 
     * @param   address  The site state.
     * @return           Zero on success, and error code on failure.
     */
    private static native int libgamma_site_restore(long address);
    
}