| /* gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice.c |
| Copyright (C) 2006 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath 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 2, or (at your option) |
| any later version. |
| |
| GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| #include <jcl.h> |
| |
| #include <gdk/gdk.h> |
| #include <gdk/gdkx.h> |
| |
| #ifdef HAVE_XRANDR |
| #include <X11/Xlib.h> |
| #include <X11/extensions/Xrandr.h> |
| #endif |
| |
| #include "gdkdisplay.h" |
| |
| #include "gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice.h" |
| |
| struct state_table *cp_gtk_native_screen_state_table; |
| |
| jclass gdkScreenGraphicsDevice_class; |
| |
| JNIEXPORT void JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_initStaticState |
| (JNIEnv *env, jclass klazz) |
| { |
| gdkScreenGraphicsDevice_class = (*env)->NewGlobalRef |
| (env, klazz); |
| |
| NSA_SCREEN_INIT(env, gdkScreenGraphicsDevice_class); |
| } |
| |
| JNIEXPORT jobject JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_nativeGetFixedDisplayMode |
| (JNIEnv *env, jobject obj, jobject gdkGraphicsEnv __attribute__((unused))) |
| { |
| jclass displayMode_class; |
| jmethodID displayMode_ctor; |
| GdkScreen *screen; |
| jobject fixedDisplayMode = NULL; |
| #ifdef HAVE_XRANDR |
| int temp1, temp2; |
| GdkDisplay *display; |
| |
| display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, gdkGraphicsEnv); |
| |
| gdk_threads_enter(); |
| |
| if (!XRRQueryExtension(GDK_DISPLAY_XDISPLAY(display), &temp1, &temp2)) |
| { |
| displayMode_class = (*env)->FindClass(env, "java/awt/DisplayMode"); |
| displayMode_ctor = (*env)->GetMethodID(env, |
| displayMode_class, |
| "<init>", |
| "(IIII)V"); |
| |
| screen = (GdkScreen *) NSA_GET_SCREEN_PTR(env, obj); |
| |
| fixedDisplayMode = (*env)->NewObject(env, |
| displayMode_class, |
| displayMode_ctor, |
| gdk_screen_get_width(screen), |
| gdk_screen_get_height(screen), |
| -1, |
| 0); |
| } |
| |
| gdk_threads_leave(); |
| |
| #else |
| |
| displayMode_class = (*env)->FindClass(env, "java/awt/DisplayMode"); |
| displayMode_ctor = (*env)->GetMethodID(env, |
| displayMode_class, |
| "<init>", |
| "(IIII)V"); |
| |
| screen = (GdkScreen *) NSA_GET_SCREEN_PTR(env, obj); |
| |
| fixedDisplayMode = (*env)->NewObject(env, |
| displayMode_class, |
| displayMode_ctor, |
| gdk_screen_get_width(screen), |
| gdk_screen_get_height(screen), |
| -1, |
| 0); |
| |
| #endif |
| return fixedDisplayMode; |
| } |
| |
| JNIEXPORT jstring JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_nativeGetIDString |
| (JNIEnv *env, jobject obj) |
| { |
| GdkScreen *screen; |
| gchar* displayName; |
| jstring string; |
| |
| screen = (GdkScreen *) NSA_GET_SCREEN_PTR(env, obj); |
| |
| gdk_threads_enter(); |
| |
| displayName = gdk_screen_make_display_name(screen); |
| |
| gdk_threads_leave(); |
| |
| string = (*env)->NewStringUTF(env, displayName); |
| |
| g_free(displayName); |
| |
| return string; |
| } |
| |
| JNIEXPORT jint JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_nativeGetDisplayModeRate |
| (JNIEnv *env, jobject obj __attribute__((unused)), jobject gdkGraphicsEnv __attribute__((unused))) |
| { |
| #ifdef HAVE_XRANDR |
| |
| GdkDisplay *display; |
| XRRScreenConfiguration *config; |
| int rate; |
| |
| display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, gdkGraphicsEnv); |
| |
| gdk_threads_enter(); |
| |
| config = XRRGetScreenInfo (GDK_DISPLAY_XDISPLAY(display), GDK_ROOT_WINDOW()); |
| |
| rate = (int) XRRConfigCurrentRate (config); |
| |
| XRRFreeScreenConfigInfo (config); |
| |
| gdk_threads_leave(); |
| |
| return rate; |
| #else |
| JCL_ThrowException(env, |
| "java/lang/InternalError", |
| "Method should not have been invoked."); |
| |
| return -1; |
| #endif |
| } |
| |
| JNIEXPORT jint JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_nativeGetDisplayModeIndex |
| (JNIEnv *env, jobject obj __attribute__((unused)), jobject gdkGraphicsEnv __attribute__((unused))) |
| { |
| #ifdef HAVE_XRANDR |
| |
| GdkDisplay *display; |
| XRRScreenConfiguration *config; |
| SizeID index; |
| Rotation rotation; |
| |
| display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, gdkGraphicsEnv); |
| |
| gdk_threads_enter(); |
| |
| config = XRRGetScreenInfo (GDK_DISPLAY_XDISPLAY(display), GDK_ROOT_WINDOW()); |
| |
| index = XRRConfigCurrentConfiguration (config, &rotation); |
| |
| XRRFreeScreenConfigInfo (config); |
| |
| gdk_threads_leave(); |
| |
| return (int) index; |
| |
| #else |
| |
| JCL_ThrowException(env, |
| "java/lang/InternalError", |
| "Method should not have been invoked."); |
| |
| return -1; |
| |
| #endif |
| } |
| |
| JNIEXPORT jobjectArray JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_nativeGetDisplayModes |
| (JNIEnv *env, jobject obj __attribute__((unused)), jobject gdkGraphicsEnv __attribute__((unused))) |
| { |
| #ifdef HAVE_XRANDR |
| GdkDisplay *display; |
| XRRScreenConfiguration *config; |
| XRRScreenSize *screenSizes; |
| int nsizes = 0, nrates = 0, i = 0; |
| jclass x11DisplayMode_class; |
| jmethodID x11DisplayMode_ctor; |
| jobjectArray array; |
| jobject instance; |
| short *rates; |
| jshortArray shortArray; |
| |
| display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, gdkGraphicsEnv); |
| |
| gdk_threads_enter(); |
| |
| config = XRRGetScreenInfo (GDK_DISPLAY_XDISPLAY(display), GDK_ROOT_WINDOW()); |
| |
| screenSizes = XRRConfigSizes(config, &nsizes); |
| |
| x11DisplayMode_class = (*env)->FindClass(env, "gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice$X11DisplayMode"); |
| |
| x11DisplayMode_ctor = (*env)->GetMethodID(env, x11DisplayMode_class, "<init>", "(II[S)V"); |
| |
| array = (*env)->NewObjectArray(env, nsizes, x11DisplayMode_class, NULL); |
| |
| for (; i < nsizes ; i++) |
| { |
| /* Retrieves refresh rate information. */ |
| rates = XRRConfigRates(config, i, &nrates); |
| |
| /* Create a Java short array and put them in. */ |
| shortArray = (*env)->NewShortArray(env, nrates); |
| (*env)->SetShortArrayRegion(env, shortArray, 0, nrates, (jshort *) rates); |
| |
| /* Create a GdkScreenGraphicsDevice.X11DisplayMode instance. */ |
| instance = (*env)->NewObject(env, |
| x11DisplayMode_class, |
| x11DisplayMode_ctor, |
| screenSizes[i].width, |
| screenSizes[i].height, |
| shortArray); |
| |
| /* Put it into the result array. */ |
| (*env)->SetObjectArrayElement(env, array, i, instance); |
| } |
| |
| /* Free everything acquired by xlib. */ |
| XRRFreeScreenConfigInfo (config); |
| |
| gdk_threads_leave(); |
| |
| return array; |
| #else |
| JCL_ThrowException(env, |
| "java/lang/InternalError", |
| "Method should not have been invoked."); |
| |
| return NULL; |
| |
| #endif |
| } |
| |
| JNIEXPORT void JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_nativeSetDisplayMode |
| (JNIEnv *env, jobject obj __attribute__((unused)), jobject gdkGraphicsEnv __attribute__((unused)), jint index __attribute__((unused)), jshort rate __attribute__((unused))) |
| { |
| #ifdef HAVE_XRANDR |
| GdkDisplay *display; |
| XRRScreenConfiguration *config; |
| Rotation rotation; |
| |
| display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, gdkGraphicsEnv); |
| |
| gdk_threads_enter(); |
| |
| config = XRRGetScreenInfo (GDK_DISPLAY_XDISPLAY(display), GDK_ROOT_WINDOW()); |
| |
| /* The rotation is not exposed to the Java API. So we retrieve its current |
| * value and set it to the same when switching resolution. |
| */ |
| XRRConfigCurrentConfiguration (config, &rotation); |
| |
| XRRSetScreenConfigAndRate (GDK_DISPLAY_XDISPLAY(display), |
| config, |
| GDK_ROOT_WINDOW(), |
| index, |
| rotation, |
| rate, |
| CurrentTime); |
| |
| XRRFreeScreenConfigInfo(config); |
| |
| gdk_threads_leave(); |
| |
| #else |
| JCL_ThrowException(env, |
| "java/lang/InternalError", |
| "Method should not have been invoked."); |
| #endif |
| } |
| |
| JNIEXPORT jobject JNICALL |
| Java_gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice_nativeGetBounds |
| (JNIEnv *env, jobject obj) |
| { |
| jclass rectangle_class; |
| jmethodID rectangle_ctor; |
| GdkScreen *screen; |
| GdkWindow *window; |
| int x, y, w, h; |
| jobject instance; |
| |
| rectangle_class = (*env)->FindClass(env, "java/awt/Rectangle"); |
| |
| rectangle_ctor = (*env)->GetMethodID |
| (env, rectangle_class, "<init>", "(IIII)V"); |
| |
| screen = (GdkScreen *) NSA_GET_SCREEN_PTR(env, obj); |
| |
| gdk_threads_enter(); |
| |
| window = gdk_screen_get_root_window(screen); |
| |
| gdk_window_get_geometry(window, &x, &y, &w, &h, NULL); |
| |
| gdk_threads_leave(); |
| |
| instance = (*env)->NewObject(env, |
| rectangle_class, |
| rectangle_ctor, |
| x, y, w, h); |
| |
| return instance; |
| } |