Merge
authorddehaven
Mon, 14 Mar 2016 07:28:14 -0700
changeset 36879 03f281d85885
parent 36878 1da705f6ced2 (current diff)
parent 36877 f4cb1a1ebfb4 (diff)
child 36880 3a05117c7611
Merge
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m	Fri Mar 11 11:42:43 2016 -0800
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m	Mon Mar 14 07:28:14 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,12 +29,12 @@
 #import <JavaNativeFoundation/JavaNativeFoundation.h>
 #import <ApplicationServices/ApplicationServices.h>
 
+#import "CRobotKeyCode.h"
 #import "LWCToolkit.h"
 #import "sun_lwawt_macosx_CRobot.h"
 #import "java_awt_event_InputEvent.h"
 #import "sizecalc.h"
 
-
 // Starting number for event numbers generated by Robot.
 // Apple docs don't mention at all what are the requirements
 // for these numbers. It seems that they must be higher
@@ -354,241 +354,10 @@
     }
 }
 
-// NOTE: Don't modify this table directly. It is machine generated. See below.
-static const unsigned char javaToMacKeyCode[] = {
-    127,    //     0     0 VK_UNDEFINED                      No_Equivalent
-    127,    //     1   0x1 Not_Used
-    127,    //     2   0x2 Not_Used
-    127,    //     3   0x3 VK_CANCEL                         No_Equivalent
-    127,    //     4   0x4 Not_Used
-    127,    //     5   0x5 Not_Used
-    127,    //     6   0x6 Not_Used
-    127,    //     7   0x7 Not_Used
-     51,    //     8   0x8 VK_BACK_SPACE
-     48,    //     9   0x9 VK_TAB
-     36,    //    10   0xa VK_ENTER
-    127,    //    11   0xb Not_Used
-     71,    //    12   0xc VK_CLEAR
-    127,    //    13   0xd Not_Used
-    127,    //    14   0xe Not_Used
-    127,    //    15   0xf Not_Used
-     56,    //    16  0x10 VK_SHIFT
-     59,    //    17  0x11 VK_CONTROL
-     58,    //    18  0x12 VK_ALT
-    113,    //    19  0x13 VK_PAUSE
-     57,    //    20  0x14 VK_CAPS_LOCK
-    127,    //    21  0x15 VK_KANA                           No_Equivalent
-    127,    //    22  0x16 Not_Used
-    127,    //    23  0x17 Not_Used
-    127,    //    24  0x18 VK_FINAL                          No_Equivalent
-    127,    //    25  0x19 VK_KANJI                          No_Equivalent
-    127,    //    26  0x1a Not_Used
-     53,    //    27  0x1b VK_ESCAPE
-    127,    //    28  0x1c VK_CONVERT                        No_Equivalent
-    127,    //    29  0x1d VK_NONCONVERT                     No_Equivalent
-    127,    //    30  0x1e VK_ACCEPT                         No_Equivalent
-    127,    //    31  0x1f VK_MODECHANGE                     No_Equivalent
-     49,    //    32  0x20 VK_SPACE
-    116,    //    33  0x21 VK_PAGE_UP
-    121,    //    34  0x22 VK_PAGE_DOWN
-    119,    //    35  0x23 VK_END
-    115,    //    36  0x24 VK_HOME
-    123,    //    37  0x25 VK_LEFT
-    126,    //    38  0x26 VK_UP
-    124,    //    39  0x27 VK_RIGHT
-    125,    //    40  0x28 VK_DOWN
-    127,    //    41  0x29 Not_Used
-    127,    //    42  0x2a Not_Used
-    127,    //    43  0x2b Not_Used
-     43,    //    44  0x2c VK_COMMA
-     27,    //    45  0x2d VK_MINUS
-     47,    //    46  0x2e VK_PERIOD
-     44,    //    47  0x2f VK_SLASH
-     29,    //    48  0x30 VK_0
-     18,    //    49  0x31 VK_1
-     19,    //    50  0x32 VK_2
-     20,    //    51  0x33 VK_3
-     21,    //    52  0x34 VK_4
-     23,    //    53  0x35 VK_5
-     22,    //    54  0x36 VK_6
-     26,    //    55  0x37 VK_7
-     28,    //    56  0x38 VK_8
-     25,    //    57  0x39 VK_9
-    127,    //    58  0x3a Not_Used
-     41,    //    59  0x3b VK_SEMICOLON
-    127,    //    60  0x3c Not_Used
-     24,    //    61  0x3d VK_EQUALS
-    127,    //    62  0x3e Not_Used
-    127,    //    63  0x3f Not_Used
-    127,    //    64  0x40 Not_Used
-      0,    //    65  0x41 VK_A
-     11,    //    66  0x42 VK_B
-      8,    //    67  0x43 VK_C
-      2,    //    68  0x44 VK_D
-     14,    //    69  0x45 VK_E
-      3,    //    70  0x46 VK_F
-      5,    //    71  0x47 VK_G
-      4,    //    72  0x48 VK_H
-     34,    //    73  0x49 VK_I
-     38,    //    74  0x4a VK_J
-     40,    //    75  0x4b VK_K
-     37,    //    76  0x4c VK_L
-     46,    //    77  0x4d VK_M
-     45,    //    78  0x4e VK_N
-     31,    //    79  0x4f VK_O
-     35,    //    80  0x50 VK_P
-     12,    //    81  0x51 VK_Q
-     15,    //    82  0x52 VK_R
-      1,    //    83  0x53 VK_S
-     17,    //    84  0x54 VK_T
-     32,    //    85  0x55 VK_U
-      9,    //    86  0x56 VK_V
-     13,    //    87  0x57 VK_W
-      7,    //    88  0x58 VK_X
-     16,    //    89  0x59 VK_Y
-      6,    //    90  0x5a VK_Z
-     33,    //    91  0x5b VK_OPEN_BRACKET
-     42,    //    92  0x5c VK_BACK_SLASH
-     30,    //    93  0x5d VK_CLOSE_BRACKET
-    127,    //    94  0x5e Not_Used
-    127,    //    95  0x5f Not_Used
-     82,    //    96  0x60 VK_NUMPAD0
-     83,    //    97  0x61 VK_NUMPAD1
-     84,    //    98  0x62 VK_NUMPAD2
-     85,    //    99  0x63 VK_NUMPAD3
-     86,    //   100  0x64 VK_NUMPAD4
-     87,    //   101  0x65 VK_NUMPAD5
-     88,    //   102  0x66 VK_NUMPAD6
-     89,    //   103  0x67 VK_NUMPAD7
-     91,    //   104  0x68 VK_NUMPAD8
-     92,    //   105  0x69 VK_NUMPAD9
-     67,    //   106  0x6a VK_MULTIPLY
-     69,    //   107  0x6b VK_ADD
-    127,    //   108  0x6c VK_SEPARATER                      No_Equivalent
-     78,    //   109  0x6d VK_SUBTRACT
-     65,    //   110  0x6e VK_DECIMAL
-     75,    //   111  0x6f VK_DIVIDE
-    122,    //   112  0x70 VK_F1
-    120,    //   113  0x71 VK_F2
-     99,    //   114  0x72 VK_F3
-    118,    //   115  0x73 VK_F4
-     96,    //   116  0x74 VK_F5
-     97,    //   117  0x75 VK_F6
-     98,    //   118  0x76 VK_F7
-    100,    //   119  0x77 VK_F8
-    101,    //   120  0x78 VK_F9
-    109,    //   121  0x79 VK_F10
-    103,    //   122  0x7a VK_F11
-    111,    //   123  0x7b VK_F12
-    127,    //   124  0x7c Not_Used
-    127,    //   125  0x7d Not_Used
-    127,    //   126  0x7e Not_Used
-    117,    //   127  0x7f VK_DELETE
-    127,    //   128  0x80 VK_DEAD_GRAVE                     No_Equivalent
-    127,    //   129  0x81 VK_DEAD_ACUTE                     No_Equivalent
-    127,    //   130  0x82 VK_DEAD_CIRCUMFLEX                No_Equivalent
-    127,    //   131  0x83 VK_DEAD_TILDE                     No_Equivalent
-    127,    //   132  0x84 VK_DEAD_MACRON                    No_Equivalent
-    127,    //   133  0x85 VK_DEAD_BREVE                     No_Equivalent
-    127,    //   134  0x86 VK_DEAD_ABOVEDOT                  No_Equivalent
-    127,    //   135  0x87 VK_DEAD_DIAERESIS                 No_Equivalent
-    127,    //   136  0x88 VK_DEAD_ABOVERING                 No_Equivalent
-    127,    //   137  0x89 VK_DEAD_DOUBLEACUTE               No_Equivalent
-    127,    //   138  0x8a VK_DEAD_CARON                     No_Equivalent
-    127,    //   139  0x8b VK_DEAD_CEDILLA                   No_Equivalent
-    127,    //   140  0x8c VK_DEAD_OGONEK                    No_Equivalent
-    127,    //   141  0x8d VK_DEAD_IOTA                      No_Equivalent
-    127,    //   142  0x8e VK_DEAD_VOICED_SOUND              No_Equivalent
-    127,    //   143  0x8f VK_DEAD_SEMIVOICED_SOUND          No_Equivalent
-    127,    //   144  0x90 VK_NUM_LOCK                       No_Equivalent
-    107,    //   145  0x91 VK_SCROLL_LOCK
-    127,    //   146  0x92 Not_Used
-    127,    //   147  0x93 Not_Used
-    127,    //   148  0x94 Not_Used
-    127,    //   149  0x95 Not_Used
-    127,    //   150  0x96 VK_AMPERSAND                      No_Equivalent
-    127,    //   151  0x97 VK_ASTERISK                       No_Equivalent
-    127,    //   152  0x98 VK_QUOTEDBL                       No_Equivalent
-    127,    //   153  0x99 VK_LESS                           No_Equivalent
-    105,    //   154  0x9a VK_PRINTSCREEN
-    127,    //   155  0x9b VK_INSERT                         No_Equivalent
-    114,    //   156  0x9c VK_HELP
-     55,    //   157  0x9d VK_META
-    127,    //   158  0x9e Not_Used
-    127,    //   159  0x9f Not_Used
-    127,    //   160  0xa0 VK_GREATER                        No_Equivalent
-    127,    //   161  0xa1 VK_BRACELEFT                      No_Equivalent
-    127,    //   162  0xa2 VK_BRACERIGHT                     No_Equivalent
-    127,    //   163  0xa3 Not_Used
-    127,    //   164  0xa4 Not_Used
-    127,    //   165  0xa5 Not_Used
-    127,    //   166  0xa6 Not_Used
-    127,    //   167  0xa7 Not_Used
-    127,    //   168  0xa8 Not_Used
-    127,    //   169  0xa9 Not_Used
-    127,    //   170  0xaa Not_Used
-    127,    //   171  0xab Not_Used
-    127,    //   172  0xac Not_Used
-    127,    //   173  0xad Not_Used
-    127,    //   174  0xae Not_Used
-    127,    //   175  0xaf Not_Used
-    127,    //   176  0xb0 Not_Used
-    127,    //   177  0xb1 Not_Used
-    127,    //   178  0xb2 Not_Used
-    127,    //   179  0xb3 Not_Used
-    127,    //   180  0xb4 Not_Used
-    127,    //   181  0xb5 Not_Used
-    127,    //   182  0xb6 Not_Used
-    127,    //   183  0xb7 Not_Used
-    127,    //   184  0xb8 Not_Used
-    127,    //   185  0xb9 Not_Used
-    127,    //   186  0xba Not_Used
-    127,    //   187  0xbb Not_Used
-    127,    //   188  0xbc Not_Used
-    127,    //   189  0xbd Not_Used
-    127,    //   190  0xbe Not_Used
-    127,    //   191  0xbf Not_Used
-     50,    //   192  0xc0 VK_BACK_QUOTE
-    127,    //   193  0xc1 Not_Used
-    127,    //   194  0xc2 Not_Used
-    127,    //   195  0xc3 Not_Used
-    127,    //   196  0xc4 Not_Used
-    127,    //   197  0xc5 Not_Used
-    127,    //   198  0xc6 Not_Used
-    127,    //   199  0xc7 Not_Used
-    127,    //   200  0xc8 Not_Used
-    127,    //   201  0xc9 Not_Used
-    127,    //   202  0xca Not_Used
-    127,    //   203  0xcb Not_Used
-    127,    //   204  0xcc Not_Used
-    127,    //   205  0xcd Not_Used
-    127,    //   206  0xce Not_Used
-    127,    //   207  0xcf Not_Used
-    127,    //   208  0xd0 Not_Used
-    127,    //   209  0xd1 Not_Used
-    127,    //   210  0xd2 Not_Used
-    127,    //   211  0xd3 Not_Used
-    127,    //   212  0xd4 Not_Used
-    127,    //   213  0xd5 Not_Used
-    127,    //   214  0xd6 Not_Used
-    127,    //   215  0xd7 Not_Used
-    127,    //   216  0xd8 Not_Used
-    127,    //   217  0xd9 Not_Used
-    127,    //   218  0xda Not_Used
-    127,    //   219  0xdb Not_Used
-    127,    //   220  0xdc Not_Used
-    127,    //   221  0xdd Not_Used
-     39     //   222  0xde VK_QUOTE
-};
-
-// NOTE: All values above 222 don't have an equivalent on MacOSX.
 static inline CGKeyCode GetCGKeyCode(jint javaKeyCode)
 {
-    if (javaKeyCode > 222) {
-        return 127;
-    } else {
-        return javaToMacKeyCode[javaKeyCode];
-    }
+    CRobotKeyCodeMapping *keyCodeMapping = [CRobotKeyCodeMapping sharedInstance];
+    return [keyCodeMapping getOSXKeyCodeForJavaKey:javaKeyCode];
 }
 
 static int GetClickCount(BOOL isDown) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobotKeyCode.h	Mon Mar 14 07:28:14 2016 -0700
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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.
+ */
+
+#import <Foundation/Foundation.h>
+
+#ifndef KeyCodeConverter_CRobotKeyCode_h
+#define KeyCodeConverter_CRobotKeyCode_h
+
+const static int OSX_kVK_ANSI_A                 = 0x00;
+const static int OSX_kVK_ANSI_S                 = 0x01;
+const static int OSX_kVK_ANSI_D                 = 0x02;
+const static int OSX_kVK_ANSI_F                 = 0x03;
+const static int OSX_kVK_ANSI_H                 = 0x04;
+const static int OSX_kVK_ANSI_G                 = 0x05;
+const static int OSX_kVK_ANSI_Z                 = 0x06;
+const static int OSX_kVK_ANSI_X                 = 0x07;
+const static int OSX_kVK_ANSI_C                 = 0x08;
+const static int OSX_kVK_ANSI_V                 = 0x09;
+const static int OSX_kVK_ISO_Section            = 0x0A;
+const static int OSX_kVK_ANSI_B                 = 0x0B;
+const static int OSX_kVK_ANSI_Q                 = 0x0C;
+const static int OSX_kVK_ANSI_W                 = 0x0D;
+const static int OSX_kVK_ANSI_E                 = 0x0E;
+const static int OSX_kVK_ANSI_R                 = 0x0F;
+const static int OSX_kVK_ANSI_Y                 = 0x10;
+const static int OSX_kVK_ANSI_T                 = 0x11;
+const static int OSX_kVK_ANSI_1                 = 0x12;
+const static int OSX_kVK_ANSI_2                 = 0x13;
+const static int OSX_kVK_ANSI_3                 = 0x14;
+const static int OSX_kVK_ANSI_4                 = 0x15;
+const static int OSX_kVK_ANSI_6                 = 0x16;
+const static int OSX_kVK_ANSI_5                 = 0x17;
+const static int OSX_kVK_ANSI_Equal             = 0x18;
+const static int OSX_kVK_ANSI_9                 = 0x19;
+const static int OSX_kVK_ANSI_7                 = 0x1A;
+const static int OSX_kVK_ANSI_Minus             = 0x1B;
+const static int OSX_kVK_ANSI_8                 = 0x1C;
+const static int OSX_kVK_ANSI_0                 = 0x1D;
+const static int OSX_kVK_ANSI_RightBracket      = 0x1E;
+const static int OSX_kVK_ANSI_O                 = 0x1F;
+const static int OSX_kVK_ANSI_U                 = 0x20;
+const static int OSX_kVK_ANSI_LeftBracket       = 0x21;
+const static int OSX_kVK_ANSI_I                 = 0x22;
+const static int OSX_kVK_ANSI_P                 = 0x23;
+const static int OSX_kVK_ANSI_L                 = 0x25;
+const static int OSX_kVK_ANSI_J                 = 0x26;
+const static int OSX_kVK_ANSI_Quote             = 0x27;
+const static int OSX_kVK_ANSI_K                 = 0x28;
+const static int OSX_kVK_ANSI_Semicolon         = 0x29;
+const static int OSX_kVK_ANSI_Backslash         = 0x2A;
+const static int OSX_kVK_ANSI_Comma             = 0x2B;
+const static int OSX_kVK_ANSI_Slash             = 0x2C;
+const static int OSX_kVK_ANSI_N                 = 0x2D;
+const static int OSX_kVK_ANSI_M                 = 0x2E;
+const static int OSX_kVK_ANSI_Period            = 0x2F;
+const static int OSX_kVK_ANSI_Grave             = 0x32;
+const static int OSX_kVK_ANSI_KeypadDecimal     = 0x41;
+const static int OSX_kVK_ANSI_KeypadMultiply    = 0x43;
+const static int OSX_kVK_ANSI_KeypadPlus        = 0x45;
+const static int OSX_kVK_ANSI_KeypadClear       = 0x47;
+const static int OSX_kVK_ANSI_KeypadDivide      = 0x4B;
+const static int OSX_kVK_ANSI_KeypadEnter       = 0x4C;
+const static int OSX_kVK_ANSI_KeypadMinus       = 0x4E;
+const static int OSX_kVK_ANSI_KeypadEquals      = 0x51;
+const static int OSX_kVK_ANSI_Keypad0           = 0x52;
+const static int OSX_kVK_ANSI_Keypad1           = 0x53;
+const static int OSX_kVK_ANSI_Keypad2           = 0x54;
+const static int OSX_kVK_ANSI_Keypad3           = 0x55;
+const static int OSX_kVK_ANSI_Keypad4           = 0x56;
+const static int OSX_kVK_ANSI_Keypad5           = 0x57;
+const static int OSX_kVK_ANSI_Keypad6           = 0x58;
+const static int OSX_kVK_ANSI_Keypad7           = 0x59;
+const static int OSX_kVK_ANSI_Keypad8           = 0x5B;
+const static int OSX_kVK_ANSI_Keypad9           = 0x5C;
+const static int OSX_kVK_Return                 = 0x24;
+const static int OSX_kVK_Tab                    = 0x30;
+const static int OSX_kVK_Space                  = 0x31;
+const static int OSX_Delete                     = 0x33;
+const static int OSX_Escape                     = 0x35;
+const static int OSX_Command                    = 0x37;
+const static int OSX_Shift                      = 0x38;
+const static int OSX_CapsLock                   = 0x39;
+const static int OSX_Option                     = 0x3A;
+const static int OSX_Control                    = 0x3B;
+const static int OSX_RightShift                 = 0x3C;
+const static int OSX_RightOption                = 0x3D;
+const static int OSX_RightControl               = 0x3E;
+const static int OSX_Function                   = 0x3F;
+const static int OSX_F17                        = 0x40;
+const static int OSX_VolumeUp                   = 0x48;
+const static int OSX_VolumeDown                 = 0x49;
+const static int OSX_Mute                       = 0x4A;
+const static int OSX_F18                        = 0x4F;
+const static int OSX_F19                        = 0x50;
+const static int OSX_F20                        = 0x5A;
+const static int OSX_F5                         = 0x60;
+const static int OSX_F6                         = 0x61;
+const static int OSX_F7                         = 0x62;
+const static int OSX_F3                         = 0x63;
+const static int OSX_F8                         = 0x64;
+const static int OSX_F9                         = 0x65;
+const static int OSX_F11                        = 0x67;
+const static int OSX_F13                        = 0x69;
+const static int OSX_F16                        = 0x6A;
+const static int OSX_F14                        = 0x6B;
+const static int OSX_F10                        = 0x6D;
+const static int OSX_F12                        = 0x6F;
+const static int OSX_F15                        = 0x71;
+const static int OSX_Help                       = 0x72;
+const static int OSX_Home                       = 0x73;
+const static int OSX_PageUp                     = 0x74;
+const static int OSX_ForwardDelete              = 0x75;
+const static int OSX_F4                         = 0x76;
+const static int OSX_End                        = 0x77;
+const static int OSX_F2                         = 0x78;
+const static int OSX_PageDown                   = 0x79;
+const static int OSX_F1                         = 0x7A;
+const static int OSX_LeftArrow                  = 0x7B;
+const static int OSX_RightArrow                 = 0x7C;
+const static int OSX_DownArrow                  = 0x7D;
+const static int OSX_UpArrow                    = 0x7E;
+const static int OSX_Undefined                  = 0x7F;
+
+@interface CRobotKeyCodeMapping : NSObject {
+
+}
+
+@property (readwrite, retain) NSDictionary *javaToMacKeyMap;
+
++ (CRobotKeyCodeMapping *)sharedInstance ;
+- (int)getOSXKeyCodeForJavaKey:(int) javaKey;
+
+@end
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobotKeyCode.m	Mon Mar 14 07:28:14 2016 -0700
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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.
+ */
+
+#import "CRobotKeyCode.h"
+#import "java_awt_event_KeyEvent.h"
+
+@implementation CRobotKeyCodeMapping
+
+@synthesize javaToMacKeyMap;
+
++(CRobotKeyCodeMapping *) sharedInstance {
+    static CRobotKeyCodeMapping *instance = nil;
+    static dispatch_once_t executeOnce;
+
+    dispatch_once(&executeOnce, ^{
+        instance = [[CRobotKeyCodeMapping alloc] init];
+    });
+
+    return instance;
+}
+
+-(id) init {
+    self = [super init];
+
+    if (nil != self) {
+        javaToMacKeyMap = [NSDictionary dictionaryWithObjectsAndKeys :
+            [NSNumber numberWithInt : OSX_Delete], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_BACK_SPACE],
+            [NSNumber numberWithInt : OSX_kVK_Tab], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_TAB],
+            [NSNumber numberWithInt : OSX_kVK_Return], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_ENTER],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_KeypadClear], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_CLEAR],
+            [NSNumber numberWithInt : OSX_Shift], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_SHIFT],
+            [NSNumber numberWithInt : OSX_Control], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_CONTROL],
+            [NSNumber numberWithInt : OSX_Option], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_ALT],
+            [NSNumber numberWithInt : OSX_CapsLock], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_CAPS_LOCK],
+            [NSNumber numberWithInt : OSX_Escape], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_ESCAPE],
+            [NSNumber numberWithInt : OSX_kVK_Space], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_SPACE],
+            [NSNumber numberWithInt : OSX_PageUp], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_PAGE_UP],
+            [NSNumber numberWithInt : OSX_PageDown], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_PAGE_DOWN],
+            [NSNumber numberWithInt : OSX_End], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_END],
+            [NSNumber numberWithInt : OSX_Home], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_HOME],
+            [NSNumber numberWithInt : OSX_LeftArrow], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_LEFT],
+            [NSNumber numberWithInt : OSX_UpArrow], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_UP],
+            [NSNumber numberWithInt : OSX_RightArrow], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_RIGHT],
+            [NSNumber numberWithInt : OSX_DownArrow], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_DOWN],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Comma], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_COMMA],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Minus], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_MINUS],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Period], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_PERIOD],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Slash], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_SLASH],
+
+            [NSNumber numberWithInt : OSX_kVK_ANSI_0], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_0],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_1], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_1],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_2], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_2],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_3], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_3],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_4], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_4],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_5], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_5],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_6], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_6],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_7], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_7],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_8], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_8],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_9], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_9],
+
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Semicolon], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_SEMICOLON],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Equal], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_EQUALS],
+
+            [NSNumber numberWithInt : OSX_kVK_ANSI_A], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_A],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_B], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_B],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_C], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_C],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_D], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_D],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_E], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_E],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_F], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_G], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_G],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_H], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_H],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_I], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_I],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_J], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_J],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_K], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_K],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_L], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_L],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_M], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_M],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_N], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_N],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_O], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_O],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_P], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_P],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Q], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_Q],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_R], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_R],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_S], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_S],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_T], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_T],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_U], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_U],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_V], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_V],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_W], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_W],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_X], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_X],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Y], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_Y],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Z], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_Z],
+
+            [NSNumber numberWithInt : OSX_kVK_ANSI_LeftBracket], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_OPEN_BRACKET],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Backslash], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_BACK_SLASH],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_RightBracket], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_CLOSE_BRACKET],
+
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad0], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD0],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad1], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD1],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad2], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD2],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad3], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD3],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad4], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD4],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad5], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD5],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad6], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD6],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad7], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD7],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad8], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD8],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Keypad9], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_NUMPAD9],
+
+            [NSNumber numberWithInt : OSX_kVK_ANSI_KeypadMultiply], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_MULTIPLY],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_KeypadPlus], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_ADD],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_KeypadMinus], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_SUBTRACT],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_KeypadDecimal], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_DECIMAL],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_KeypadDivide], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_DIVIDE],
+
+            [NSNumber numberWithInt : OSX_F1], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F1],
+            [NSNumber numberWithInt : OSX_F2], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F2],
+            [NSNumber numberWithInt : OSX_F3], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F3],
+            [NSNumber numberWithInt : OSX_F4], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F4],
+            [NSNumber numberWithInt : OSX_F5], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F5],
+            [NSNumber numberWithInt : OSX_F6], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F6],
+            [NSNumber numberWithInt : OSX_F7], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F7],
+            [NSNumber numberWithInt : OSX_F8], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F8],
+            [NSNumber numberWithInt : OSX_F9], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F9],
+            [NSNumber numberWithInt : OSX_F10], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F10],
+            [NSNumber numberWithInt : OSX_F11], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F11],
+            [NSNumber numberWithInt : OSX_F12], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F12],
+
+            [NSNumber numberWithInt : OSX_ForwardDelete], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_DELETE],
+            [NSNumber numberWithInt : OSX_Help], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_HELP],
+            [NSNumber numberWithInt : OSX_Command], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_META],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Grave], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_BACK_QUOTE],
+            [NSNumber numberWithInt : OSX_kVK_ANSI_Quote], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_QUOTE],
+
+            [NSNumber numberWithInt : OSX_F13], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F13],
+            [NSNumber numberWithInt : OSX_F14], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F14],
+            [NSNumber numberWithInt : OSX_F15], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F15],
+            [NSNumber numberWithInt : OSX_F16], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F16],
+            [NSNumber numberWithInt : OSX_F17], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F17],
+            [NSNumber numberWithInt : OSX_F18], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F18],
+            [NSNumber numberWithInt : OSX_F19], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F19],
+            [NSNumber numberWithInt : OSX_F20], [NSNumber numberWithInt : java_awt_event_KeyEvent_VK_F20],
+
+            nil];
+    }
+
+    return self;
+}
+
+-(int) getOSXKeyCodeForJavaKey : (int) javaKey {
+    id val = [javaToMacKeyMap objectForKey : [NSNumber numberWithInt : javaKey]];
+	
+    if (nil != val) {
+        return [val intValue];
+    } else {
+        return OSX_Undefined;
+    }
+}
+
+@end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/multiresolution/MultiresolutionIconTest.java	Mon Mar 14 07:28:14 2016 -0700
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8150724 8151303
+ * @author a.stepanov
+ * @summary Check that correct resolution variants are chosen for icons
+ *          when multiresolution image is used for their construction.
+ *
+ * @requires (os.family != "mac")
+ *
+ * @library ../../../../lib/testlibrary/
+ * @build ExtendedRobot
+ * @run main/othervm/timeout=240 -Dsun.java2d.uiScale=1 MultiresolutionIconTest
+ * @run main/othervm/timeout=240 -Dsun.java2d.uiScale=2 MultiresolutionIconTest
+ */
+
+
+// TODO: please remove the "@requires" tag after 8151303 fix
+
+
+import java.awt.*;
+import java.awt.event.InputEvent;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BaseMultiResolutionImage;
+import java.awt.image.BufferedImage;
+import javax.swing.*;
+
+public class MultiresolutionIconTest extends JFrame {
+
+    private final static int SZ = 100;
+    private final static int N = 5; // number of components
+
+    private final static String SCALE = "sun.java2d.uiScale";
+    private final static Color C1X = Color.RED;
+    private final static Color C2X = Color.BLUE;
+
+    private JLabel lbl;
+    private JTabbedPane tabbedPane;
+
+    private final ExtendedRobot r;
+
+    private static BufferedImage generateImage(int sz, Color c) {
+
+        BufferedImage img = new BufferedImage(sz, sz, BufferedImage.TYPE_INT_RGB);
+        Graphics g = img.getGraphics();
+        g.setColor(c);
+        g.fillRect(0, 0, sz, sz);
+        return img;
+    }
+
+    public MultiresolutionIconTest(UIManager.LookAndFeelInfo lf) throws Exception {
+
+        UIManager.setLookAndFeel(lf.getClassName());
+        r = new ExtendedRobot();
+        SwingUtilities.invokeAndWait(this::UI);
+    }
+
+    private void UI() {
+
+        setUndecorated(true);
+
+        BufferedImage img1x = generateImage(SZ / 2, C1X);
+        BufferedImage img2x = generateImage(SZ, C2X);
+        BaseMultiResolutionImage mri = new BaseMultiResolutionImage(
+            new BufferedImage[]{img1x, img2x});
+        Icon icon = new ImageIcon(mri);
+
+        // hardcoded icon size for OS X (Mac OS X L&F) - see JDK-8151060
+        BufferedImage tab1x = generateImage(16, C1X);
+        BufferedImage tab2x = generateImage(32, C2X);
+        BaseMultiResolutionImage tabMRI = new BaseMultiResolutionImage(
+            new BufferedImage[]{tab1x, tab2x});
+        Icon tabIcon = new ImageIcon(tabMRI);
+
+        setSize((N + 1) * SZ, SZ);
+        setLocation(50, 50);
+
+        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        getContentPane().setLayout(new GridLayout(1, 1));
+
+        JPanel p = new JPanel();
+        p.setLayout(new GridLayout(1, N));
+
+        JButton btn = new JButton(icon);
+        p.add(btn);
+
+        JToggleButton tbn = new JToggleButton(icon);
+        p.add(tbn);
+
+        JRadioButton rbn = new JRadioButton(icon);
+        rbn.setHorizontalAlignment(SwingConstants.CENTER);
+        p.add(rbn);
+
+        JCheckBox cbx = new JCheckBox(icon);
+        cbx.setHorizontalAlignment(SwingConstants.CENTER);
+        p.add(cbx);
+
+        lbl = new JLabel(icon);
+        p.add(lbl);
+
+        tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
+        tabbedPane.addTab("", tabIcon, p);
+        getContentPane().add(tabbedPane);
+
+        setResizable(false);
+        setVisible(true);
+    }
+
+    private static boolean is2x() {
+
+        AffineTransform tr = GraphicsEnvironment.getLocalGraphicsEnvironment().
+            getDefaultScreenDevice().getDefaultConfiguration().
+            getDefaultTransform();
+        return (Math.min(tr.getScaleX(), tr.getScaleY()) > 1.001);
+    }
+
+    private boolean checkPressedColor(int x, int y, Color ok) {
+
+        r.mouseMove(x, y);
+        r.waitForIdle();
+        r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
+        r.waitForIdle(100);
+        Color c = r.getPixelColor(x, y);
+        r.waitForIdle(100);
+        r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
+        r.waitForIdle(100);
+        if (!c.equals(ok)) { return false; }
+        // check the icon's color hasn't changed
+        // after the mouse was released
+        c = r.getPixelColor(x, y);
+        return c.equals(ok);
+    }
+
+    private boolean checkTabIcon(
+        int xStart, int xEnd, int yStart, int yEnd, Color ok, Color nok) {
+
+        for (int y = yStart; y < yEnd; y += 2) {
+            for (int x = xStart; x < xEnd; x += 2) {
+                Color c = r.getPixelColor(x, y);
+                if (c.equals(nok)) { return false; }
+                else if (c.equals(ok)) {
+                    // shift a bit to avoid the selection effects
+                    return checkPressedColor(x + 5, y + 5, ok);
+                }
+            }
+        }
+
+        return false; // didn't find the icon
+    }
+
+
+    private void doTest() {
+
+        r.waitForIdle(2000);
+        String scale = System.getProperty(SCALE);
+        System.out.println("scale = " + scale);
+        Color
+            expected   = is2x() ? C2X : C1X,
+            unexpected = is2x() ? C1X : C2X;
+
+        Point p = lbl.getLocationOnScreen();
+        int x = p.x + lbl.getWidth() / 2;
+        int y = p.y + lbl.getHeight() / 2;
+        int w = lbl.getWidth();
+
+        boolean ok = true, curr;
+        Color c;
+        String components[] = new String[]{
+            "JLabel", "JCheckBox", "JRadioButton", "JToggleButton", "JButton"};
+        for (int i = 0; i < N; i++) {
+
+            curr = true;
+            int t = x - i * w;
+
+            // check icon color
+            c = r.getPixelColor(t, y);
+            System.out.print(components[i] + " icon: ");
+            if (!c.equals(expected)) {
+                curr = false;
+            } else {
+                // check icon color when mouse button pressed - see JDK-8151303
+                curr = checkPressedColor(t, y, expected);
+            }
+
+            System.out.println(curr ? "ok" : "nok");
+            ok = ok && curr;
+
+            r.waitForIdle();
+        }
+
+        int x0 = tabbedPane.getLocationOnScreen().x;
+        int x1 = x - ((N - 1) * w + w / 2);
+        int y0 = getLocationOnScreen().y;
+        int y1 = y0 + getHeight();
+        curr = checkTabIcon(x0, x1, y0, y1, expected, unexpected);
+
+        System.out.println("JTabbedPane icon: " + (curr ? "ok" : "nok"));
+        ok = ok && curr;
+
+        if (!ok) { throw new RuntimeException("test failed"); }
+
+        r.waitForIdle();
+        dispose();
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        // TODO: remove is2x() check after JDK-8150844 fix
+        if (is2x() != "2".equals(System.getProperty(SCALE))) { return; }
+
+        for (UIManager.LookAndFeelInfo LF: UIManager.getInstalledLookAndFeels()) {
+            System.out.println("\nL&F: " + LF.getName());
+            (new MultiresolutionIconTest(LF)).doTest();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/keyboard/AllKeyCode/AllKeyCode.java	Mon Mar 14 07:28:14 2016 -0700
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+/*
+  @test
+  @bug 8149456 8147834 8150230
+  @requires os.family == "mac"
+  @summary KeyEvents for all keys
+  @run main AllKeyCode
+*/
+
+import java.awt.AWTException;
+import java.awt.GridBagLayout;
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.Frame;
+import java.awt.TextArea;
+
+public class AllKeyCode extends Frame {
+
+    private static Frame frame;
+    private static TextArea textArea;
+    private static KeyListener keyListener;
+    private static int allKeyArr[];
+    private static int keyPressedIndex;
+
+    AllKeyCode() {
+        AllKeyCode.allKeyArr = new int[] {
+            KeyEvent.VK_BACK_SPACE,
+            KeyEvent.VK_TAB,
+            KeyEvent.VK_ENTER,
+            KeyEvent.VK_CLEAR,
+            KeyEvent.VK_SHIFT,
+            KeyEvent.VK_CONTROL,
+            KeyEvent.VK_ALT,
+            KeyEvent.VK_CAPS_LOCK,
+            KeyEvent.VK_ESCAPE,
+            KeyEvent.VK_SPACE,
+            KeyEvent.VK_PAGE_UP,
+            KeyEvent.VK_PAGE_DOWN,
+            KeyEvent.VK_END,
+            KeyEvent.VK_HOME,
+            KeyEvent.VK_LEFT,
+            KeyEvent.VK_UP,
+            KeyEvent.VK_RIGHT,
+            KeyEvent.VK_DOWN,
+            KeyEvent.VK_COMMA,
+            KeyEvent.VK_MINUS,
+            KeyEvent.VK_PERIOD,
+            KeyEvent.VK_SLASH,
+            KeyEvent.VK_0,
+            KeyEvent.VK_1,
+            KeyEvent.VK_2,
+            KeyEvent.VK_3,
+            KeyEvent.VK_4,
+            KeyEvent.VK_5,
+            KeyEvent.VK_6,
+            KeyEvent.VK_7,
+            KeyEvent.VK_8,
+            KeyEvent.VK_9,
+            KeyEvent.VK_SEMICOLON,
+            KeyEvent.VK_EQUALS,
+            KeyEvent.VK_A,
+            KeyEvent.VK_B,
+            KeyEvent.VK_C,
+            KeyEvent.VK_D,
+            KeyEvent.VK_E,
+            KeyEvent.VK_F,
+            KeyEvent.VK_G,
+            KeyEvent.VK_H,
+            KeyEvent.VK_I,
+            KeyEvent.VK_J,
+            KeyEvent.VK_K,
+            KeyEvent.VK_L,
+            KeyEvent.VK_M,
+            KeyEvent.VK_N,
+            KeyEvent.VK_O,
+            KeyEvent.VK_P,
+            KeyEvent.VK_Q,
+            KeyEvent.VK_R,
+            KeyEvent.VK_S,
+            KeyEvent.VK_T,
+            KeyEvent.VK_U,
+            KeyEvent.VK_V,
+            KeyEvent.VK_W,
+            KeyEvent.VK_X,
+            KeyEvent.VK_Y,
+            KeyEvent.VK_Z,
+            KeyEvent.VK_OPEN_BRACKET,
+            KeyEvent.VK_BACK_SLASH,
+            KeyEvent.VK_CLOSE_BRACKET,
+            KeyEvent.VK_NUMPAD0,
+            KeyEvent.VK_NUMPAD1,
+            KeyEvent.VK_NUMPAD2,
+            KeyEvent.VK_NUMPAD3,
+            KeyEvent.VK_NUMPAD4,
+            KeyEvent.VK_NUMPAD5,
+            KeyEvent.VK_NUMPAD6,
+            KeyEvent.VK_NUMPAD7,
+            KeyEvent.VK_NUMPAD8,
+            KeyEvent.VK_NUMPAD9,
+            KeyEvent.VK_MULTIPLY,
+            KeyEvent.VK_ADD,
+            KeyEvent.VK_SUBTRACT,
+            KeyEvent.VK_DECIMAL,
+            KeyEvent.VK_DIVIDE,
+            KeyEvent.VK_F1,
+            KeyEvent.VK_F2,
+            KeyEvent.VK_F3,
+            KeyEvent.VK_F4,
+            KeyEvent.VK_F5,
+            KeyEvent.VK_F6,
+            KeyEvent.VK_F7,
+            KeyEvent.VK_F8,
+            KeyEvent.VK_F9,
+            KeyEvent.VK_F10,
+            KeyEvent.VK_F11,
+            KeyEvent.VK_F12,
+            KeyEvent.VK_DELETE,
+            KeyEvent.VK_HELP,
+            KeyEvent.VK_META,
+            KeyEvent.VK_BACK_QUOTE,
+            KeyEvent.VK_QUOTE,
+            KeyEvent.VK_F13,
+            KeyEvent.VK_F14,
+            KeyEvent.VK_F15,
+            KeyEvent.VK_F16,
+            KeyEvent.VK_F17,
+            KeyEvent.VK_F18,
+            KeyEvent.VK_F19,
+            KeyEvent.VK_F20
+        };
+
+        keyPressedIndex = -1;
+    }
+
+    private void createAndShowGUI() {
+        frame = new Frame("Function Key Keycodes");
+        textArea = new TextArea();
+        textArea.setFocusable(true);
+        frame.add(textArea);
+        frame.pack();
+        frame.setSize(200, 200);
+
+        textArea.addKeyListener(keyListener = new KeyListener() {
+
+            @Override
+            public void keyTyped(KeyEvent ke) {
+            }
+
+            @Override
+            public void keyPressed(KeyEvent ke) {
+                if (allKeyArr[keyPressedIndex] != ke.getKeyCode()) {
+                    throw new RuntimeException("Wrong keycode received");
+                }
+            }
+
+            @Override
+            public void keyReleased(KeyEvent ke) {
+            }
+        });
+        frame.setVisible(true);
+    }
+
+    private void removeListener() {
+        if (keyListener != null) {
+            textArea.removeKeyListener(keyListener);
+            keyListener = null;
+        }
+    }
+
+    @Override
+    public void dispose() {
+        if (null != frame) {
+            frame.dispose();
+            frame = null;
+        }
+    }
+
+    public void generateFunctionKeyPress() {
+        try {
+            Robot robot = new Robot();
+            robot.waitForIdle();
+
+            for (int i = 0; i < allKeyArr.length; i++) {
+                keyPressedIndex = i;
+                robot.keyPress(allKeyArr[i]);
+                robot.keyRelease(allKeyArr[i]);
+                robot.waitForIdle();
+            }
+            removeListener();
+
+        } catch (AWTException e) {
+            throw new RuntimeException("Robot creation failed");
+        }
+    }
+
+    public static void main(String args[]) {
+        AllKeyCode allKeyObj = new AllKeyCode();
+        allKeyObj.createAndShowGUI();
+        allKeyObj.generateFunctionKeyPress();
+        allKeyObj.dispose();
+
+        System.out.println("Test Passed");
+    }
+}
--- a/jdk/test/java/awt/print/PrinterJob/MultiMonPrintDlgTest.java	Fri Mar 11 11:42:43 2016 -0800
+++ b/jdk/test/java/awt/print/PrinterJob/MultiMonPrintDlgTest.java	Mon Mar 14 07:28:14 2016 -0700
@@ -43,16 +43,18 @@
  */
 public class MultiMonPrintDlgTest implements ActionListener {
 
-    Frame primaryFrame = null;
-    Frame secFrame = null;
-    GraphicsDevice gd[] = GraphicsEnvironment.getLocalGraphicsEnvironment().
+    private static boolean testPassed;
+    private static Thread mainThread;
+    private static boolean testGeneratedInterrupt;
+    private static int sleepTime = 30000;
+    private static String message = "User has not executed the test";
+
+    static Frame primaryFrame = null;
+    static Frame secFrame = null;
+    static GraphicsDevice gd[] = GraphicsEnvironment.getLocalGraphicsEnvironment().
                             getScreenDevices();
 
-    public MultiMonPrintDlgTest() throws Exception {
-        if (gd.length <= 1) {
-            System.out.println("This test should be run only on dual-monitor systems. Aborted!!");
-            return;
-        }
+    private static void init() throws Exception {
 
         String[] instructions =
             {
@@ -70,6 +72,10 @@
                     instructions,
                     "information", JOptionPane.INFORMATION_MESSAGE);
         });
+    }
+
+    private void executeTest() {
+
         GraphicsDevice defDev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
         int x = 0;
         Frame f = null;
@@ -95,31 +101,67 @@
     }
 
     public void actionPerformed (ActionEvent ae) {
-        try {
-            javax.print.attribute.PrintRequestAttributeSet prSet =
-                  new javax.print.attribute.HashPrintRequestAttributeSet();
-            java.awt.print.PrinterJob.getPrinterJob().pageDialog(prSet);
-            Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
-            int dialogButton = JOptionPane.showConfirmDialog (w,
-                            "Did the pageDialog shown in non-default monitor?",
-                            null, JOptionPane.YES_NO_OPTION);
-            if(dialogButton == JOptionPane.NO_OPTION) {
-                throw new RuntimeException("PageDialog is shown in wrong monitor");
-            }
+        javax.print.attribute.PrintRequestAttributeSet prSet =
+              new javax.print.attribute.HashPrintRequestAttributeSet();
+        java.awt.print.PrinterJob.getPrinterJob().pageDialog(prSet);
+        Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
+        int dialogButton = JOptionPane.showConfirmDialog (w,
+                        "Did the pageDialog shown in non-default monitor?",
+                        null, JOptionPane.YES_NO_OPTION);
+        if(dialogButton == JOptionPane.NO_OPTION) {
+            fail("PageDialog is shown in wrong monitor");
+        } else {
             java.awt.print.PrinterJob.getPrinterJob().printDialog(prSet);
             dialogButton = JOptionPane.showConfirmDialog (w,
-                            "Did the printDialog shown in non-default monitor?",
-                            null, JOptionPane.YES_NO_OPTION);
+                        "Did the printDialog shown in non-default monitor?",
+                        null, JOptionPane.YES_NO_OPTION);
             if(dialogButton == JOptionPane.NO_OPTION) {
-                throw new RuntimeException("PrintDialog is shown in wrong monitor");
+                fail("PrintDialog is shown in wrong monitor");
+            } else {
+                pass();
             }
-        } finally {
-            primaryFrame.dispose();
-            secFrame.dispose();
         }
     }
 
+    private static void dispose() {
+        primaryFrame.dispose();
+        secFrame.dispose();
+    }
+
+    public static synchronized void pass() {
+        testPassed = true;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    public static synchronized void fail(String msg) {
+        testPassed = false;
+        message = msg;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
     public static void main (String args[]) throws Exception {
+        if (gd.length <= 1) {
+            System.out.println("This test should be run only on dual-monitor systems. Aborted!!");
+            return;
+        }
+        init();
         MultiMonPrintDlgTest test = new MultiMonPrintDlgTest();
+        test.executeTest();
+        mainThread = Thread.currentThread();
+
+        try {
+            mainThread.sleep(sleepTime);
+        } catch (InterruptedException ex) {
+            dispose();
+            if (!testPassed && testGeneratedInterrupt) {
+                throw new RuntimeException(message);
+            }
+        }
+        if (!testGeneratedInterrupt) {
+            dispose();
+            throw new RuntimeException(message);
+        }
     }
 }