jdk/src/macosx/native/sun/awt/CGraphicsDevice.m
author alexsch
Thu, 21 Mar 2013 16:50:35 +0400
changeset 16470 ccc74e8572d5
parent 15989 0fe0985a7bde
child 16840 64446d4710c4
permissions -rw-r--r--
8007146: [macosx] Setting a display mode crashes JDK under VNC Reviewed-by: serb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     1
/*
15989
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
     2
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     4
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    10
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    15
 * accompanied this code).
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    16
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    20
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    23
 * questions.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    24
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    25
15989
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
    26
#import "LWCToolkit.h"
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
    27
#import "ThreadUtilities.h"
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    28
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    29
/*
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    30
 * Convert the mode string to the more convinient bits per pixel value
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    31
 */
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
    32
static int getBPPFromModeString(CFStringRef mode)
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    33
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    34
    if ((CFStringCompare(mode, CFSTR(kIO30BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo)) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    35
        // This is a strange mode, where we using 10 bits per RGB component and pack it into 32 bits
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    36
        // Java is not ready to work with this mode but we have to specify it as supported
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    37
        return 30;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    38
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    39
    else if (CFStringCompare(mode, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    40
        return 32;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    41
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    42
    else if (CFStringCompare(mode, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    43
        return 16;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    44
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    45
    else if (CFStringCompare(mode, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    46
        return 8;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    47
    }
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
    48
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    49
    return 0;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    50
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    51
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    52
static BOOL isValidDisplayMode(CGDisplayModeRef mode){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    53
    return (1 < CGDisplayModeGetWidth(mode) && 1 < CGDisplayModeGetHeight(mode));
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    54
}
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    55
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    56
static CFMutableArrayRef getAllValidDisplayModes(jint displayID){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    57
    CFArrayRef allModes = CGDisplayCopyAllDisplayModes(displayID, NULL);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    58
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    59
    CFIndex numModes = CFArrayGetCount(allModes);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    60
    CFMutableArrayRef validModes = CFArrayCreateMutable(kCFAllocatorDefault, numModes + 1, NULL);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    61
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    62
    CFIndex n;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    63
    for (n=0; n < numModes; n++) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    64
        CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    65
        if (cRef != NULL && isValidDisplayMode(cRef)) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    66
            CFArrayAppendValue(validModes, cRef);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    67
        }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    68
    }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    69
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    70
    CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(displayID);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    71
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    72
    BOOL containsCurrentMode = NO;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    73
    numModes = CFArrayGetCount(validModes);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    74
    for (n=0; n < numModes; n++) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    75
        if(CFArrayGetValueAtIndex(validModes, n) == currentMode){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    76
            containsCurrentMode = YES;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    77
            break;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    78
        }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    79
    }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    80
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    81
    if (!containsCurrentMode) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    82
        CFArrayAppendValue(validModes, currentMode);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    83
    }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    84
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    85
    return validModes;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    86
}
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    87
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    88
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    89
 * Find the best possible match in the list of display modes that we can switch to based on
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    90
 * the provided parameters.
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    91
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    92
static CGDisplayModeRef getBestModeForParameters(CFArrayRef allModes, int w, int h, int bpp, int refrate) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    93
    CGDisplayModeRef bestGuess = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    94
    CFIndex numModes = CFArrayGetCount(allModes), n;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    95
    int thisBpp = 0;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    96
    for(n = 0; n < numModes; n++ ) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    97
        CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    98
        if(cRef == NULL) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    99
            continue;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   100
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   101
        CFStringRef modeString = CGDisplayModeCopyPixelEncoding(cRef);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   102
        thisBpp = getBPPFromModeString(modeString);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   103
        CFRelease(modeString);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   104
        if (thisBpp != bpp || (int)CGDisplayModeGetHeight(cRef) != h || (int)CGDisplayModeGetWidth(cRef) != w) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   105
            // One of the key parameters does not match
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   106
            continue;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   107
        }
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   108
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   109
        if (refrate == 0) { // REFRESH_RATE_UNKNOWN
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   110
            return cRef;
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   111
        }
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   112
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   113
        // Refresh rate might be 0 in display mode and we ask for specific display rate
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   114
        // but if we do not find exact match then 0 refresh rate might be just Ok
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   115
        if (CGDisplayModeGetRefreshRate(cRef) == refrate) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   116
            // Exact match
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   117
            return cRef;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   118
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   119
        if (CGDisplayModeGetRefreshRate(cRef) == 0) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   120
            // Not exactly what was asked for, but may fit our needs if we don't find an exact match
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   121
            bestGuess = cRef;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   122
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   123
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   124
    return bestGuess;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   125
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   126
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   127
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   128
 * Create a new java.awt.DisplayMode instance based on provided CGDisplayModeRef
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   129
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   130
static jobject createJavaDisplayMode(CGDisplayModeRef mode, JNIEnv *env, jint displayID) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   131
    jobject ret = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   132
    jint h, w, bpp, refrate;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   133
    JNF_COCOA_ENTER(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   134
    CFStringRef currentBPP = CGDisplayModeCopyPixelEncoding(mode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   135
    bpp = getBPPFromModeString(currentBPP);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   136
    refrate = CGDisplayModeGetRefreshRate(mode);
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   137
    h = CGDisplayModeGetHeight(mode);
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   138
    w = CGDisplayModeGetWidth(mode);
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   139
    CFRelease(currentBPP);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   140
    static JNF_CLASS_CACHE(jc_DisplayMode, "java/awt/DisplayMode");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   141
    static JNF_CTOR_CACHE(jc_DisplayMode_ctor, jc_DisplayMode, "(IIII)V");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   142
    ret = JNFNewObject(env, jc_DisplayMode_ctor, w, h, bpp, refrate);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   143
    JNF_COCOA_EXIT(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   144
    return ret;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   145
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   146
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   147
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   148
/*
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   149
 * Class:     sun_awt_CGraphicsDevice
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   150
 * Method:    nativeGetXResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   151
 * Signature: (I)D
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   152
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   153
JNIEXPORT jdouble JNICALL
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   154
Java_sun_awt_CGraphicsDevice_nativeGetXResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   155
  (JNIEnv *env, jclass class, jint displayID)
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   156
{
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   157
    // TODO: this is the physically correct answer, but we probably want
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   158
    // to use NSScreen API instead...
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   159
    CGSize size = CGDisplayScreenSize(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   160
    CGRect rect = CGDisplayBounds(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   161
    // 1 inch == 25.4 mm
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   162
    jfloat inches = size.width / 25.4f;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   163
    jfloat dpi = rect.size.width / inches;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   164
    return dpi;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   165
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   166
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   167
/*
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   168
 * Class:     sun_awt_CGraphicsDevice
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   169
 * Method:    nativeGetYResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   170
 * Signature: (I)D
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   171
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   172
JNIEXPORT jdouble JNICALL
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   173
Java_sun_awt_CGraphicsDevice_nativeGetYResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   174
  (JNIEnv *env, jclass class, jint displayID)
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   175
{
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   176
    // TODO: this is the physically correct answer, but we probably want
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   177
    // to use NSScreen API instead...
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   178
    CGSize size = CGDisplayScreenSize(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   179
    CGRect rect = CGDisplayBounds(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   180
    // 1 inch == 25.4 mm
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   181
    jfloat inches = size.height / 25.4f;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   182
    jfloat dpi = rect.size.height / inches;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   183
    return dpi;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   184
}
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   185
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   186
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   187
 * Class:     sun_awt_CGraphicsDevice
15989
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   188
 * Method:    nativeGetScreenInsets
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   189
 * Signature: (I)D
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   190
 */
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   191
JNIEXPORT jobject JNICALL
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   192
Java_sun_awt_CGraphicsDevice_nativeGetScreenInsets
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   193
  (JNIEnv *env, jclass class, jint displayID)
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   194
{
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   195
    jobject ret = NULL;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   196
    __block NSRect frame = NSZeroRect;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   197
    __block NSRect visibleFrame = NSZeroRect;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   198
JNF_COCOA_ENTER(env);
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   199
    
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   200
    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   201
        NSArray *screens = [NSScreen screens];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   202
        for (NSScreen *screen in screens) {
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   203
            NSDictionary *screenInfo = [screen deviceDescription];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   204
            NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   205
            if ([screenID pointerValue] == displayID){
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   206
                frame = [screen frame];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   207
                visibleFrame = [screen visibleFrame];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   208
                break;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   209
            }
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   210
        }
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   211
    }];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   212
    // Convert between Cocoa's coordinate system and Java.
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   213
    jint bottom = visibleFrame.origin.y - frame.origin.y;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   214
    jint top = frame.size.height - visibleFrame.size.height - bottom;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   215
    jint left = visibleFrame.origin.x - frame.origin.x;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   216
    jint right = frame.size.width - visibleFrame.size.width - left;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   217
    
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   218
    static JNF_CLASS_CACHE(jc_Insets, "java/awt/Insets");
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   219
    static JNF_CTOR_CACHE(jc_Insets_ctor, jc_Insets, "(IIII)V");
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   220
    ret = JNFNewObject(env, jc_Insets_ctor, top, left, bottom, right);
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   221
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   222
JNF_COCOA_EXIT(env);
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   223
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   224
    return ret;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   225
}
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   226
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   227
/*
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   228
 * Class:     sun_awt_CGraphicsDevice
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   229
 * Method:    nativeSetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   230
 * Signature: (IIIII)V
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   231
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   232
JNIEXPORT void JNICALL
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   233
Java_sun_awt_CGraphicsDevice_nativeSetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   234
(JNIEnv *env, jclass class, jint displayID, jint w, jint h, jint bpp, jint refrate)
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   235
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   236
    JNF_COCOA_ENTER(env);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   237
    CFArrayRef allModes = getAllValidDisplayModes(displayID);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   238
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   239
    CGDisplayModeRef closestMatch = getBestModeForParameters(allModes, (int)w, (int)h, (int)bpp, (int)refrate);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   240
    __block CGError retCode = kCGErrorSuccess;
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   241
    if (closestMatch != NULL) {
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   242
        [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   243
            CGDisplayConfigRef config;
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   244
            retCode = CGBeginDisplayConfiguration(&config);
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   245
            if (retCode == kCGErrorSuccess) {
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   246
                CGConfigureDisplayWithDisplayMode(config, displayID, closestMatch, NULL);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   247
                retCode = CGCompleteDisplayConfiguration(config, kCGConfigureForAppOnly);
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   248
            }
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   249
        }];
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   250
    } else {
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   251
        [JNFException raise:env as:kIllegalArgumentException reason:"Invalid display mode"];
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   252
    }
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   253
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   254
    if (retCode != kCGErrorSuccess){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   255
        [JNFException raise:env as:kIllegalArgumentException reason:"Unable to set display mode!"];
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   256
    }    
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   257
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   258
    CFRelease(allModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   259
    JNF_COCOA_EXIT(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   260
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   261
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   262
 * Class:     sun_awt_CGraphicsDevice
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   263
 * Method:    nativeGetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   264
 * Signature: (I)Ljava/awt/DisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   265
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   266
JNIEXPORT jobject JNICALL
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   267
Java_sun_awt_CGraphicsDevice_nativeGetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   268
(JNIEnv *env, jclass class, jint displayID)
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   269
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   270
    jobject ret = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   271
    CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(displayID);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   272
    ret = createJavaDisplayMode(currentMode, env, displayID);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   273
    CGDisplayModeRelease(currentMode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   274
    return ret;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   275
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   276
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   277
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   278
 * Class:     sun_awt_CGraphicsDevice
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   279
 * Method:    nativeGetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   280
 * Signature: (I)[Ljava/awt/DisplayModes
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   281
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   282
JNIEXPORT jobjectArray JNICALL
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   283
Java_sun_awt_CGraphicsDevice_nativeGetDisplayModes
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   284
(JNIEnv *env, jclass class, jint displayID)
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   285
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   286
    jobjectArray jreturnArray = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   287
    JNF_COCOA_ENTER(env);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   288
    CFArrayRef allModes = getAllValidDisplayModes(displayID);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   289
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   290
    CFIndex numModes = CFArrayGetCount(allModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   291
    static JNF_CLASS_CACHE(jc_DisplayMode, "java/awt/DisplayMode");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   292
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   293
    jreturnArray = JNFNewObjectArray(env, &jc_DisplayMode, (jsize) numModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   294
    if (!jreturnArray) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   295
        NSLog(@"CGraphicsDevice can't create java array of DisplayMode objects");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   296
        return nil;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   297
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   298
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   299
    CFIndex n;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   300
    for (n=0; n < numModes; n++) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   301
        CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   302
        if (cRef != NULL) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   303
            jobject oneMode = createJavaDisplayMode(cRef, env, displayID);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   304
            (*env)->SetObjectArrayElement(env, jreturnArray, n, oneMode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   305
            if ((*env)->ExceptionOccurred(env)) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   306
                (*env)->ExceptionDescribe(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   307
                (*env)->ExceptionClear(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   308
                continue;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   309
            }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   310
            (*env)->DeleteLocalRef(env, oneMode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   311
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   312
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   313
    CFRelease(allModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   314
    JNF_COCOA_EXIT(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   315
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   316
    return jreturnArray;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   317
}