aboutsummaryrefslogtreecommitdiffstats
path: root/src/libgamma_Partition.c
blob: 65bf2e00b0b1e286f9eb23aeb5ec8863cbdfe7c2 (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
/**
 * jlibgamma -- Display server abstraction layer for gamma ramp and Java
 * Copyright (C) 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/>.
 */
#include "libgamma_Partition.h"

#include <errno.h>
#include <stdlib.h>

#include <libgamma.h>


#define J  JNIEnv* env, jclass class


/**
 * Make a failure-return.
 * 
 * @param   error_code  The error code returned from the failing function or zero to read `errno`.
 * @return              The object to return.
 */
static jlongArray fail(JNIEnv* env, int error_code)
{
  jlongArray rc = (*env)->NewLongArray(env, 3);
  jlong e, z = 0;
  if ((error_code == LIBGAMMA_ERRNO_SET) || !error_code)
    error_code = errno;
  e = (jlong)error_code;
  (*env)->SetLongArrayRegion(env, rc, 0, 1, &z);
  (*env)->SetLongArrayRegion(env, rc, 1, 1, &z);
  (*env)->SetLongArrayRegion(env, rc, 2, 1, &e);
  return rc;
}


/**
 * Make a success-return.
 * 
 * @param   state  The native object.
 * @param   count  The subelement count.
 * @return         The object to return.
 */
static jlongArray ok(JNIEnv* env, void* state, size_t count)
{
  jlong a = (jlong)(size_t)state;
  jlong b = (jlong)count, z = 0;
  jlongArray rc = (*env)->NewLongArray(env, 3);
  (*env)->SetLongArrayRegion(env, rc, 0, 1, &a);
  (*env)->SetLongArrayRegion(env, rc, 1, 1, &b);
  (*env)->SetLongArrayRegion(env, rc, 2, 1, &z);
  return rc;
}


/**
 * 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.
 */
jlongArray Java_libgamma_Partition_libgamma_1partition_1create(J, jlong site, jint partition)
{
  libgamma_partition_state_t* state = malloc(sizeof(libgamma_partition_state_t));
  void* super = (void*)(size_t)site;
  int r;
  if (state == NULL)
    return fail(env, 0);
  r = libgamma_partition_initialise(state, super, partition);
  if (r != 0)
    return fail(env, r);
  return ok(env, state, state->crtcs_available);
  (void) class;
}


/**
 * Release all resources held by a partition state
 * and free the partition state pointer.
 * 
 * @param  address  The partition state.
 */
void Java_libgamma_Partition_libgamma_1partition_1free(J, jlong address)
{
  void* this = (void*)(size_t)address;
  libgamma_partition_free(this);
  (void) env;
  (void) class;
}


/**
 * 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.
 */
jint Java_libgamma_Partition_libgamma_1partition_1restore(J, jlong address)
{
  void* this = (void*)(size_t)address;
  int r = libgamma_partition_restore(this);
  if (r != 0)
    return r == LIBGAMMA_ERRNO_SET ? errno : r;
  return 0;
  (void) env;
  (void) class;
}