From 8c72d071d453f95ba5fba8e2a35bd332ae6ec453 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Thu, 4 Sep 2014 09:25:01 +0200 Subject: add states MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/libgamma/CRTC.java | 135 ++++++++++++++++++++++++++++++++++++++ src/libgamma/CRTCInformation.java | 18 +++++ src/libgamma/Partition.java | 124 ++++++++++++++++++++++++++++++++++ src/libgamma/Site.java | 134 +++++++++++++++++++++++++++++++++++++ 4 files changed, 411 insertions(+) create mode 100644 src/libgamma/CRTC.java create mode 100644 src/libgamma/Partition.java create mode 100644 src/libgamma/Site.java diff --git a/src/libgamma/CRTC.java b/src/libgamma/CRTC.java new file mode 100644 index 0000000..8ae4d2a --- /dev/null +++ b/src/libgamma/CRTC.java @@ -0,0 +1,135 @@ +/** + * 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 . + */ +package libgamma; + + +/** + * Cathode ray tube controller state. + * + * The CRTC controls the gamma ramps for the + * monitor that is plugged in to the connector + * that the CRTC belongs to. + */ +public class CRTC +{ + /** + * Constructor. + * + * @param partition The partition this CRTC belongs to. + * @param crtc The index of the CRTC within its partition. + */ + public CRTC(Partition partition, int crtc) throws LibgammaException + { + this.partition = partition; + this.crtc = crtc; + long[] r = libgamma_crtc_create(partition.address, crtc); + this.address = r[0]; + if (r[1] != 0) + throw new LibgammaException((int)(r[1])); + } + + + /** + * The partition this CRTC belongs to. + */ + public final Partition partition; + + /** + * The index of the CRTC within its partition. + */ + public final int crtc; + + /** + * The address of the native object. + */ + final long address; + + + /** + * Release resources. + */ + public void close() + { + libgamma_crtc_free(this.address); + } + + /** + * Restore the gamma ramps for the CRTC to the system settings. + */ + public void restore() throws LibgammaException + { + int r = libgamma_crtc_restore(this.address); + if (r != 0) + throw new LibgammaException(r); + } + + /** + * Read information about the CRTC. + * + * @param fields OR:ed identifiers for the information about the CRTC that should be read. + * @return Information about the CRTC. + */ + public CRTCInformation get_information(int fields) + { + Object[] r = libgamma_get_crtc_information(this.address, fields); + byte[] edid = (byte[])(r[0]); + String connector_name = (String)(r[1]); + float[] gamma = (float[])(r[2]); + int[] ints = (int[])(r[3]); + return new CRTCInformation(edid, connector_name, gamma, ints); + } + + + + /** + * Create a CRTC state. + * + * @param partition The partition state for the partition that the CRTC belongs to. + * @param crtc The index of the CRTC within the partition. + * @return Element 0: The value for {@link #address}. + * Element 1: Error code, zero on success. + */ + private static native long[] libgamma_crtc_create(long partition, int crtc); + + /** + * Release all resources held by a CRTC state + * and free the CRTC state pointer. + * + * @param address The CRTC state. + */ + private static native void libgamma_crtc_free(long address); + + /** + * Restore the gamma ramps for a CRTC to the system settings for that CRTC. + * + * @param address The CRTC state. + * @return Zero on success, and error code on failure. + */ + private static native int libgamma_crtc_restore(long address); + + /** + * Read information about a CRTC. + * + * @param crtc The state of the CRTC whose information should be read. + * @param fields OR:ed identifiers for the information about the CRTC that should be read. + * @return Input parameters for the constructor of {@link CRTCInformation} + */ + private static native Object[] libgamma_get_crtc_information(long crtc, int fields); + +} + diff --git a/src/libgamma/CRTCInformation.java b/src/libgamma/CRTCInformation.java index 307ec8b..9da17f7 100644 --- a/src/libgamma/CRTCInformation.java +++ b/src/libgamma/CRTCInformation.java @@ -203,6 +203,18 @@ public class CRTCInformation this.connector_type = ConnectorType.VALUES[ints[22]]; this.connector_type_error = make_error(ints[23]); this.gamma_error = make_error(ints[24]); + + this.has_error = (this.edid_error != null) + || (this.width_mm_error != null) + || (this.height_mm_error != null) + || (this.width_mm_edid_error != null) + || (this.height_mm_edid_error != null) + || (this.gamma_size_error != null) + || (this.gamma_depth_error != null) + || (this.gamma_support_error != null) + || (this.subpixel_order_error != null) + || (this.connector_name_error != null) + || (this.connector_type_error != null); } @@ -453,6 +465,12 @@ public class CRTCInformation public final LibgammaException gamma_error; + /** + * Whether any of the error fields are non-{@code null}. + */ + public final boolean has_error; + + /** * Convert a raw representation of an EDID to a lowercase hexadecimal representation. diff --git a/src/libgamma/Partition.java b/src/libgamma/Partition.java new file mode 100644 index 0000000..407c2d6 --- /dev/null +++ b/src/libgamma/Partition.java @@ -0,0 +1,124 @@ +/** + * 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 . + */ +package libgamma; + + +/** + * Partition state. + * + * 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 class Partition +{ + /** + * Constructor. + * + * @param site The site this partition belongs to. + * @param partition The index of the partition. + */ + public Partition(Site site, int partition) throws LibgammaException + { + this.site = site; + this.partition = partition; + long[] r = libgamma_partition_create(site.address, partition); + this.address = r[0]; + this.crtcs_available = (int)(r[1]); + if (r[2] != 0) + throw new LibgammaException((int)(r[2])); + } + + + /** + * The site this partition belongs to. + */ + public final Site site; + + /** + * The index of the partition. + */ + public final int partition; + + /** + * The number of CRTC:s that are available under this + * partition. Note that the CRTC:s are not necessarily + * online. + */ + public final int crtcs_available; + + /** + * The address of the native object. + */ + final long address; + + + /** + * Release resources. + */ + public void close() + { + libgamma_partition_free(this.address); + } + + /** + * Restore the gamma ramps all CRTC:s within the partition to the system settings. + */ + public void restore() throws LibgammaException + { + int r = libgamma_partition_restore(this.address); + if (r != 0) + throw new LibgammaException(r); + } + + + + /** + * Create a partition state. + * + * @param site The site state for the site that the partition belongs to. + * @param partition The index of the partition within the site. + * @return Element 0: The value for {@link #address}. + * Element 1: The value for {@link #crtcs_available} + * Element 2: Error code, zero on success. + */ + private static native long[] libgamma_partition_create(long site, int partition); + + /** + * Release all resources held by a partition state + * and free the partition state pointer. + * + * @param address The partition state. + */ + private static native void libgamma_partition_free(long address); + + /** + * Restore the gamma ramps all CRTC:s within a partition to the system settings. + * + * @param address The partition state. + * @return Zero on success, and error code on failure. + */ + private static native int libgamma_partition_restore(long address); + +} + diff --git a/src/libgamma/Site.java b/src/libgamma/Site.java new file mode 100644 index 0000000..9555656 --- /dev/null +++ b/src/libgamma/Site.java @@ -0,0 +1,134 @@ +/** + * 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 . + */ +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 +{ + /** + * 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); + } + + + + + /** + * 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); + +} + -- cgit v1.2.3-70-g09d2