/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include "awt_p.h"
#include "awt.h"
#include "color.h"
#include <java_awt_DisplayMode.h>
#include <sun_awt_X11GraphicsEnvironment.h>
#include <sun_awt_X11GraphicsDevice.h>
#include <sun_awt_X11GraphicsConfig.h>
#ifndef HEADLESS
#include "Xrandr.h"
#include "GLXGraphicsConfig.h"
#endif /* !HEADLESS */
#include <jni.h>
#include <jni_util.h>
#include <jvm.h>
#include <jvm_md.h>
#include <jlong.h>
#include <stdlib.h>
#include "awt_GraphicsEnv.h"
#include "awt_Window.h"
#include "awt_util.h"
#include "gdefs.h"
#include <dlfcn.h>
#include "Trace.h"
#ifdef NETSCAPE
#include <signal.h>
extern int awt_init_xt;
#endif
#ifndef HEADLESS
/*
* Set in initDisplay() to indicate whether we should attempt to initialize
* GLX for the default configuration.
*/
#endif /* !HEADLESS */
#ifdef HEADLESS
#define Display void
#endif /* HEADLESS */
/** Convenience macro for loading the lock-related method IDs. */
do { \
method_name, method_sig); \
} while (0)
extern struct WindowIDs mWindowIDs;
extern struct MWindowPeerIDs mWindowPeerIDs;
#ifndef HEADLESS
#endif /* HEADLESS */
/* AWT and Xinerama
*
* As of fix 4356756, AWT is Xinerama-aware. X11GraphicsDevices are created for
* each screen of a Xinerama setup, though X11 itself still only sees a single
* display.
* In many places where we talk to X11, a xinawareScreen variable is used to
* pass the correct Display value, depending on the circumstances (a single
* X display, multiple X displays, or a single X display with multiple
* Xinerama screens).
*
* Solaris and Linux differ in the functions used to access Xinerama-related
* data. This is in part because at this time, the X consortium has not
* finalized the "official" Xinerama API. Once this spec is available, and
* both OSes are conformant, one code base should be sufficient for Xinerama
* operation on both OSes. Until then, some of the Xinerama-related code
* is ifdef'd appropriately. -bchristi, 7/12/01
*/
typedef struct {
int screen_number;
short x_org;
short y_org;
short width;
short height;
#else /* SOLARIS */
int* num_framebuffers);
int* x, int* y);
#endif
{
x11GraphicsConfigIDs.screen = (*env)->GetFieldID (env, cls, "screen", "Lsun/awt/X11GraphicsDevice;");
return;
}
}
{
}
#ifndef HEADLESS
/*
* XIOErrorHandler
*/
{
if (awtLockInited) {
jio_fprintf(stderr, "X connection to %s host broken (explicit kill or server shutdown)\n", XDisplayName(NULL));
}
/*SignalError(lockedee->lastpc, lockedee, "fp/ade/gui/GUIException", "I/O error"); */
}
return 0;
}
static AwtGraphicsConfigDataPtr
long mask)
{
int visualsMatched, i;
if (visualList) {
for (i = 0; i < visualsMatched; i++) {
/* we can't use awtJNI_CreateColorData here, because it'll pull,
SystemColor, which in turn will cause toolkit to be reinitialized */
if (awtCreateX11Colormap(defaultConfig)) {
/* Allocate white and black pixels for this visual */
return defaultConfig;
}
}
free((void *)defaultConfig);
}
return NULL;
}
/* default config is based on X11 screen. All Xinerama screens of that X11
screen will have the same default config */
/* Need more notes about which fields of the structure are based on the X
screen, and which are based on the Xinerama screen */
static AwtGraphicsConfigDataPtr
int xinawareScreen = 0;
char *forcedVisualStr;
long mask;
forcedVisualID > 0)
{
} else {
}
} else {
if (glxRequested &&
{
/* we've found the best visual for use with GLX, so use it */
} else {
/* otherwise, continue looking for the best X11 visual */
}
}
/* try the best, or forced visual */
if (defaultConfig) {
return defaultConfig;
}
/* try the default visual */
if (defaultConfig) {
return defaultConfig;
}
/* try any TrueColor */
if (defaultConfig) {
return defaultConfig;
}
/* try 8-bit PseudoColor */
if (defaultConfig) {
return defaultConfig;
}
/* try any 8-bit */
if (defaultConfig) {
return defaultConfig;
}
/* we tried everything, give up */
awt_display = NULL;
return NULL;
}
static void
int i;
int nConfig;
int ind;
int xinawareScreen;
if (usingXinerama) {
xinawareScreen = 0;
}
else {
}
AWT_LOCK ();
/* REMIND.. remove when we have support for the color classes below */
/* viTmp.depth = 1; */
/* viTmp.class = StaticGray; */
/* pVI1sg = XGetVisualInfo (awt_display, VisualDepthMask | VisualClassMask, */
/* viTmp, &n1sg); */
if (graphicsConfigs == NULL) {
NULL);
AWT_UNLOCK();
return;
}
/*
* After a display change event, the default config field will have
* been reset, so we need to recreate the default config here.
*/
}
graphicsConfigs[0] = defaultConfig;
// Only use the RENDER extension if it is available on the X server
{
#ifdef MACOSX
#else
#endif
if (xrenderLibHandle == NULL) {
RTLD_LAZY | RTLD_GLOBAL);
}
#ifndef __linux__ /* SOLARIS */
if (xrenderLibHandle == NULL) {
RTLD_LAZY | RTLD_GLOBAL);
}
#endif
if (xrenderLibHandle != NULL) {
"XRenderFindVisualFormat");
}
}
for (i = 0; i < nTrue; i++) {
/* Skip the non-supported 12-bit TrueColor visual */
continue;
} else {
}
sizeof (XVisualInfo));
if (xrenderFindVisualFormat != NULL) {
if (format &&
{
sizeof(*format));
}
}
}
if (xrenderLibHandle != NULL) {
}
for (i = 0; i < n8p; i++) {
continue;
} else {
}
sizeof (XVisualInfo));
}
for (i = 0; i < n12p; i++) {
continue;
} else {
}
sizeof (XVisualInfo));
}
for (i = 0; i < n8s; i++) {
continue;
} else {
}
sizeof (XVisualInfo));
}
for (i = 0; i < n8gs; i++) {
continue;
} else {
}
sizeof (XVisualInfo));
}
for (i = 0; i < n8sg; i++) {
continue;
} else {
}
sizeof (XVisualInfo));
}
for (i = 0; i < n1sg; i++) {
continue;
} else {
}
sizeof (XVisualInfo));
}
if (n8p != 0)
if (n12p != 0)
if (n8s != 0)
if (n8gs != 0)
if (n8sg != 0)
if (n1sg != 0)
AWT_UNLOCK ();
}
/*
* Determing if this top-level has been moved onto another Xinerama screen.
* Called from awt_TopLevel.c
*
* ASSUME: wdata != null
*/
#ifndef HEADLESS
int i;
int amt;
int totAmt = 0;
int largestAmt = 0;
int largestAmtScr = 0;
int horiz;
int vert;
if (!usingXinerama) { return; }
/* assert that peer implements WindowPeer */
/* decide which screen we're on
* if we're spanning, figure out which screen we're most on
*/
for (i = 0; i < awt_numScreens; i++) {
/* calc how much of window is on this screen */
/* completely on this screen - done! */
largestAmtScr = i;
break;
}
if (amt > largestAmt) {
largestAmt = amt;
largestAmtScr = i;
}
}
}
#ifndef XAWT
/* check if we're on a new screen */
/* update peer, target Comp */
}
#endif /* XAWT */
}
#endif /* HEADLESS */
#ifndef HEADLESS
static void xinerama_init_linux()
{
/* load library */
RTLD_LAZY | RTLD_GLOBAL);
}
if (XineramaQueryScreens != NULL) {
DTRACE_PRINTLN("calling XineramaQueryScreens func on Linux");
DTRACE_PRINTLN("Enabling Xinerama support");
/* set global number of screens */
/* stuff values into fbrects */
}
} else {
DTRACE_PRINTLN("calling XineramaQueryScreens didn't work");
}
} else {
DTRACE_PRINTLN("couldn't load XineramaQueryScreens symbol");
}
} else {
}
}
#endif
static void xinerama_init_solaris()
{
/* load and run XineramaGetInfo */
/* load library */
if (XineramaSolarisFunc != NULL) {
DTRACE_PRINTLN("calling XineramaGetInfo func on Solaris");
{
DTRACE_PRINTLN("Enabling Xinerama support");
/* set global number of screens */
} else {
DTRACE_PRINTLN("calling XineramaGetInfo didn't work");
}
} else {
DTRACE_PRINTLN("couldn't load XineramaGetInfo symbol");
}
} else {
}
}
#endif
/*
* Checks if Xinerama is running and perform Xinerama-related
* platform dependent initialization.
*/
static void xineramaInit(void) {
&first_event, &first_error);
if (!gotXinExt) {
DTRACE_PRINTLN("Xinerama extension is not available");
return;
}
DTRACE_PRINTLN("Xinerama extension is available");
#else /* Solaris */
#endif /* __linux__ || MACOSX */
}
#endif /* HEADLESS */
Display *
{
int i;
#ifdef NETSCAPE
#endif
if (awt_display) {
return awt_display;
}
#ifdef NETSCAPE
/* Disable interrupts during XtOpenDisplay to avoid bugs in unix os select
code: some unix systems don't implement SA_RESTART properly and
because of this, select returns with EINTR. Most implementations of
gethostbyname don't cope with EINTR properly and as a result we get
stuck (forever) in the gethostbyname code
*/
#endif
/* Load AWT lock-related methods in SunToolkit */
if (XkbIgnoreExtension(True)) {
printf("Ignoring XKB.\n");
}
}
#ifdef NETSCAPE
#endif
if (!dpy) {
sizeof(errmsg),
"Can't connect to X11 window server using '%s' as the value of the DISPLAY variable.",
return NULL;
}
/* set awt_numScreens, and whether or not we're using Xinerama */
xineramaInit();
if (!usingXinerama) {
}
/* Allocate screen data structure array */
if (x11Screens == NULL) {
NULL);
return NULL;
}
for (i = 0; i < awt_numScreens; i++) {
if (usingXinerama) {
/* All Xinerama screens use the same X11 root for now */
}
else {
}
}
return dpy;
}
#endif /* !HEADLESS */
/*
* Class: sun_awt_X11GraphicsEnvironment
* Method: getDefaultScreenNum
* Signature: ()I
*/
{
#ifdef HEADLESS
return (jint)0;
#else
return DefaultScreen(awt_display);
#endif /* !HEADLESS */
}
#ifndef HEADLESS
}
}
}
#endif
#ifdef HEADLESS
return NULL;
}
#else
}
return &(x11Screens[screen]);
}
#endif /* !HEADLESS */
/*
* Class: sun_awt_X11GraphicsEnvironment
* Method: initDisplay
* Signature: (Z)V
*/
{
#ifndef HEADLESS
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsEnvironment
* Method: initGLX
* Signature: ()Z
*/
{
#ifndef HEADLESS
AWT_LOCK();
AWT_UNLOCK();
return glxAvailable;
#else
return JNI_FALSE;
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsEnvironment
* Method: getNumScreens
* Signature: ()I
*/
{
#ifdef HEADLESS
return (jint)0;
#else
return awt_numScreens;
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: getDisplay
* Signature: ()J
*/
{
#ifdef HEADLESS
return NULL;
#else
return ptr_to_jlong(awt_display);
#endif /* !HEADLESS */
}
#ifdef MITSHM
extern int mitShmPermissionMask;
int a, b, c;
AWT_LOCK();
if (canUseShmExt != UNSET_MITSHM) {
*shmExt = canUseShmExt;
AWT_UNLOCK();
return;
}
/**
* XShmQueryExtension returns False in remote server case.
* Unfortunately it also returns True in ssh case, so
* we need to test that we can actually do XShmAttach.
*/
if (XShmQueryExtension(awt_display)) {
AWT_UNLOCK();
"TryInitMITShm: shmget has failed: %s",
return;
}
AWT_UNLOCK();
"TryInitMITShm: shmat has failed: %s",
return;
}
/**
* Get rid of the id now to reduce chances of leaking
* system resources.
*/
if (xShmAttachResult == JNI_TRUE) {
/* check if we can use shared pixmaps */
(Bool*)&canUseShmExtPixmaps);
}
*shmExt = canUseShmExt;
}
AWT_UNLOCK();
}
/*
* Must be called with the acquired AWT lock.
*/
/*
* XShmAttachHandler will set its internal flag to JNI_TRUE, if any Shm error occurs.
*/
"()Lsun/awt/X11/XErrorHandler$XShmAttachHandler;", JNI_TRUE,
}
#endif /* MITSHM */
/*
* Class: sun_awt_X11GraphicsEnvironment
* Method: checkShmExt
* Signature: ()I
*/
{
#ifdef MITSHM
#endif
return shmExt;
}
/*
* Class: sun_awt_X11GraphicsEnvironment
* Method: getDisplayString
*/
{
#ifdef HEADLESS
#else
#endif /* HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: getNumConfigs
* Signature: ()I
*/
{
#ifdef HEADLESS
return (jint)0;
#else
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: getConfigVisualId
* Signature: (I)I
*/
{
#ifdef HEADLESS
return (jint)0;
#else
int visNum;
if (index == 0) {
} else {
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: getConfigDepth
* Signature: (I)I
*/
{
#ifdef HEADLESS
return (jint)0;
#else
int visNum;
if (index == 0) {
} else {
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: getConfigColormap
* Signature: (I)I
*/
{
#ifdef HEADLESS
return (jint)0;
#else
int visNum;
if (index == 0) {
} else {
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: resetNativeData
* Signature: (I)V
*/
{
#ifndef HEADLESS
/*
* Reset references to the various configs; the actual native config data
* will be free'd later by the Disposer mechanism when the Java-level
* X11GraphicsConfig objects go away. By setting these values to NULL,
* we ensure that they will be reinitialized as necessary (for example,
* see the getNumConfigs() method).
*/
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: dispose
* Signature: (J)V
*/
{
#ifndef HEADLESS
return;
}
AWT_LOCK();
}
}
}
if (aData->monoPixmap) {
}
if (aData->monoPixmapGC) {
}
if (aData->color_data) {
}
AWT_UNLOCK();
/*
* The native GLXGraphicsConfig data needs to be disposed separately
* on the OGL queue flushing thread (should not be called while
* the AWT lock is held).
*/
"disposeGraphicsConfig", "(J)V",
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: getXResolution
* Signature: ()I
*/
{
#ifdef HEADLESS
return (jdouble)0;
#else
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: getYResolution
* Signature: ()I
*/
{
#ifdef HEADLESS
return (jdouble)0;
#else
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: getNumColors
* Signature: ()I
*/
{
#ifdef HEADLESS
return (jint)0;
#else
return adata->awt_num_colors;
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: init
* Signature: (I)V
*/
{
#ifndef HEADLESS
int i, n;
int depth;
/* If haven't gotten all of the configs yet, do it now. */
if (asd.numConfigs == 0) {
}
/* Check the graphicsConfig for this visual */
for (i = 0; i < asd.numConfigs; i++) {
break;
}
}
/* If didn't find the visual, throw an exception... */
return;
}
/* adata->awt_cmap initialization has been deferred to
* makeColorModel call
*/
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: makeColorModel
* Signature: ()Ljava/awt/image/ColorModel
*/
{
#ifdef HEADLESS
return NULL;
#else
/*
* If awt is not locked yet, return null since the toolkit is not
* initialized yet.
*/
if (!awtLockInited) {
return NULL;
}
AWT_LOCK ();
/* If colormap entry of adata is NULL, need to create it now */
}
/* Make Color Model object for this GraphicsConfiguration */
AWT_UNLOCK ();
return colorModel;
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: getBounds
*/
{
#ifdef HEADLESS
return NULL;
#else
if (usingXinerama) {
}
else {
}
return NULL;
}
}
return bounds;
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: createBackBuffer
* Signature: (JI)J
*/
{
AWT_LOCK();
"Could not query double-buffer extension");
AWT_UNLOCK();
return (jlong)0;
}
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: destroyBackBuffer
* Signature: (J)V
*/
{
AWT_LOCK();
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: swapBuffers
* Signature: (JI)V
*/
{
AWT_LOCK();
}
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: isTranslucencyCapable
* Signature: (J)V
*/
{
#ifdef HEADLESS
return JNI_FALSE;
#else
return JNI_FALSE;
}
#endif
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: isDBESupported
* Signature: ()Z
*/
{
#ifdef HEADLESS
return JNI_FALSE;
#else
AWT_LOCK();
return ret;
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: getDoubleBufferVisuals
* Signature: (I)V
*/
{
#ifndef HEADLESS
int i, n = 1;
int xinawareScreen;
if (usingXinerama) {
xinawareScreen = 0;
}
else {
}
"(I)V");
AWT_LOCK();
if (visScreenInfo == NULL) {
AWT_UNLOCK();
return;
}
for (i = 0; i < visScreenInfo->count; i++) {
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsEnvironment
* Method: pRunningXinerama
* Signature: ()Z
*/
{
#ifdef HEADLESS
return false;
#else
return usingXinerama;
#endif /* HEADLESS */
}
/*
* Can return NULL.
*
* Class: sun_awt_X11GraphicsEnvironment
* Method: getXineramaCenterPoint
*/
{
#ifndef HEADLESS /* return NULL in HEADLESS, Linux */
int x,y;
AWT_LOCK();
if (XineramaSolarisCenterFunc != NULL) {
(XineramaSolarisCenterFunc)(awt_display, 0, &x, &y);
} else {
DTRACE_PRINTLN("unable to call XineramaSolarisCenterFunc: symbol is null");
}
#endif /* __linux __ || MACOSX */
#endif /* HEADLESS */
return point;
}
/**
* Begin DisplayMode/FullScreen support
*/
#ifndef HEADLESS
typedef Status
typedef XRRScreenConfiguration*
typedef void
typedef short*
typedef short
typedef XRRScreenSize*
int *nsizes);
typedef SizeID
typedef Status
int size_index,
short rate,
typedef Rotation
#define LOAD_XRANDR_FUNC(f) \
do { \
"X11GD_InitXrandrFuncs: Could not load %s", #f); \
return JNI_FALSE; \
} \
} while (0)
static jboolean
{
RTLD_LAZY | RTLD_LOCAL);
}
"X11GD_InitXrandrFuncs: Could not open libXrandr.so.2");
return JNI_FALSE;
}
"X11GD_InitXrandrFuncs: XRRQueryVersion returned an error status");
return JNI_FALSE;
}
if (usingXinerama) {
/*
* We can proceed as long as this is RANDR 1.2 or above.
* As of Xorg server 1.3 onwards the Xinerama backend may actually be
* a fake one provided by RANDR itself. See Java bug 6636469 for info.
*/
"Xinerama is active and Xrandr version is %d.%d",
return JNI_FALSE;
}
/*
* REMIND: Fullscreen mode doesn't work quite right with multi-monitor
* setups and RANDR 1.2. So for now we also require a single screen.
*/
if (awt_numScreens > 1 ) {
"Multiple screens in use");
return JNI_FALSE;
}
}
return JNI_TRUE;
}
static jobject
{
"Could not get display mode class");
return NULL;
}
"Could not get display mode constructor");
return NULL;
}
// early versions of xrandr may report "empty" rates (6880694)
if (validRefreshRate <= 0) {
}
}
static void
{
"Could not get class java.util.ArrayList");
return;
}
"Could not get method java.util.ArrayList.add()");
return;
}
}
}
static void
{
"_NET_WM_STATE_FULLSCREEN", False);
unsigned int numchildren;
return;
}
/*
* Note: the Window passed to this method is typically the "content
* window" of the top-level, but we need the actual shell window for
* the purposes of constructing the XEvent. Therefore, we walk up the
* window hierarchy here to find the true top-level.
*/
do {
&children, &numchildren))
{
return;
}
}
break;
}
&event);
}
#endif /* !HEADLESS */
/*
* Class: sun_awt_X11GraphicsDevice
* Method: initXrandrExtension
* Signature: ()Z
*/
{
#ifdef HEADLESS
return JNI_FALSE;
#else
AWT_LOCK();
if (ret) {
}
return ret;
#endif /* HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: getCurrentDisplayMode
* Signature: (I)Ljava/awt/DisplayMode;
*/
{
#ifdef HEADLESS
return NULL;
#else
AWT_LOCK();
short curRate;
int nsizes;
(curSizeIndex < nsizes))
{
curRate);
}
}
return displayMode;
#endif /* HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: enumDisplayModes
*/
{
#ifndef HEADLESS
AWT_LOCK();
int nsizes, i, j;
for (i = 0; i < nsizes; i++) {
int nrates;
for (j = 0; j < nrates; j++) {
rates[j]);
}
}
}
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: configDisplayMode
* Signature: (IIII)V
*/
{
#ifndef HEADLESS
AWT_LOCK();
int nsizes;
int i, j;
/* find the size index that matches the requested dimensions */
for (i = 0; i < nsizes; i++) {
/* we've found our size index... */
int nrates;
/* now find rate that matches requested refresh rate */
for (j = 0; j < nrates; j++) {
if (rates[j] == refreshRate) {
/* we've found our rate; break out of the loop */
chosenSizeIndex = i;
chosenRate = rates[j];
break;
}
}
break;
}
}
}
if (foundConfig) {
/* issue XSync to ensure immediate mode change */
if (status == RRSetConfigSuccess) {
}
}
}
if (!success) {
}
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: enterFullScreenExclusive
* Signature: (J)V
*/
{
#ifndef HEADLESS
AWT_LOCK();
AWT_UNLOCK();
#endif /* !HEADLESS */
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: exitFullScreenExclusive
* Signature: (J)V
*/
{
#ifndef HEADLESS
AWT_LOCK();
AWT_UNLOCK();
#endif /* !HEADLESS */
}
/**
* End DisplayMode/FullScreen support
*/