Index: modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWTK.java =================================================================== --- modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWTK.java (revision 561952) +++ modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWTK.java (working copy) @@ -89,6 +89,15 @@ return null; } + public boolean getLockingState(int keyCode) { + // TODO implement + return false; + } + + public void setLockingState(int keyCode, boolean on) { + // TODO implement + } + private final LinuxWindowFactory windowFactory = new LinuxWindowFactory(); private final LinuxEventQueue eventQueue = new LinuxEventQueue(windowFactory); private final GraphicsFactory graphicsFactory = new org.apache.harmony.awt.gl.linux.LinuxGraphics2DFactory(); Index: modules/awt/src/main/java/common/java/awt/Toolkit.java =================================================================== --- modules/awt/src/main/java/common/java/awt/Toolkit.java (revision 561952) +++ modules/awt/src/main/java/common/java/awt/Toolkit.java (working copy) @@ -28,6 +28,7 @@ import java.awt.event.AWTEventListener; import java.awt.event.AWTEventListenerProxy; import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; import java.awt.im.InputMethodHighlight; import java.awt.image.ColorModel; import java.awt.image.ImageObserver; @@ -795,16 +796,16 @@ } } - public boolean getLockingKeyState(int a0) throws UnsupportedOperationException, org.apache.harmony.luni.util.NotImplementedException { - lockAWT(); - try { - } finally { - unlockAWT(); + public boolean getLockingKeyState(int keyCode) throws UnsupportedOperationException { + + if (keyCode != KeyEvent.VK_CAPS_LOCK && + keyCode != KeyEvent.VK_NUM_LOCK && + keyCode != KeyEvent.VK_SCROLL_LOCK && + keyCode != KeyEvent.VK_KANA_LOCK) { + throw new IllegalArgumentException(); } - if (true) { - throw new RuntimeException("Method is not implemented"); //TODO: implement //$NON-NLS-1$ - } - return true; + + return wtk.getLockingState(keyCode); } public int getMaximumCursorColors() throws HeadlessException { @@ -952,16 +953,16 @@ } } - public void setLockingKeyState(int a0, boolean a1) throws UnsupportedOperationException, org.apache.harmony.luni.util.NotImplementedException { - lockAWT(); - try { - } finally { - unlockAWT(); + public void setLockingKeyState(int keyCode, boolean on) throws UnsupportedOperationException { + + if (keyCode != KeyEvent.VK_CAPS_LOCK && + keyCode != KeyEvent.VK_NUM_LOCK && + keyCode != KeyEvent.VK_SCROLL_LOCK && + keyCode != KeyEvent.VK_KANA_LOCK) { + throw new IllegalArgumentException(); } - if (true) { - throw new RuntimeException("Method is not implemented"); //TODO: implement //$NON-NLS-1$ - } - return; + + wtk.setLockingState(keyCode, on); } void onQueueEmpty() { Index: modules/awt/src/main/java/common/org/apache/harmony/awt/wtk/WTK.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/wtk/WTK.java (revision 561952) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/wtk/WTK.java (working copy) @@ -58,4 +58,10 @@ * @return implementation of NativeIM */ public abstract NativeIM getNativeIM(); + + /** + * Perform platform specific operations with locking keys. + */ + public abstract boolean getLockingState(int keyCode); + public abstract void setLockingState(int keyCode, boolean on); } Index: modules/awt/src/main/java/windows/org/apache/harmony/awt/wtk/windows/WinWTK.java =================================================================== --- modules/awt/src/main/java/windows/org/apache/harmony/awt/wtk/windows/WinWTK.java (revision 561952) +++ modules/awt/src/main/java/windows/org/apache/harmony/awt/wtk/windows/WinWTK.java (working copy) @@ -27,6 +27,13 @@ public class WinWTK extends WTK { + static { + System.loadLibrary("gl"); //$NON-NLS-1$ + } + + private static native boolean nativeGetLockingState(int keyCode); + private static native void nativeSetLockingState(int keyCode, boolean on); + /** * @see org.apache.harmony.awt.wtk.WTK#getGraphicsFactory() */ @@ -98,6 +105,14 @@ return im; } + public boolean getLockingState(int keyCode) { + return nativeGetLockingState(keyCode); + } + + public void setLockingState(int keyCode, boolean on) { + nativeSetLockingState(keyCode, on); + } + private final WinSystemProperties systemProperties = new WinSystemProperties(); private final WinEventQueue eventQueue = new WinEventQueue(systemProperties); private final GraphicsFactory graphicsFactory = new org.apache.harmony.awt.gl.windows.WinGraphics2DFactory(); Index: modules/awt/src/main/native/gl/windows/LockingKeys.cpp =================================================================== --- modules/awt/src/main/native/gl/windows/LockingKeys.cpp (revision 0) +++ modules/awt/src/main/native/gl/windows/LockingKeys.cpp (revision 0) @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @author Ilya Berezhniuk + * @version $Revision$ + * + */ + +#include +#include "exceptions.h" + +// C declarations +extern "C" { +JNIEXPORT jboolean JNICALL Java_org_apache_harmony_awt_wtk_windows_WinWTK_nativeGetLockingState + (JNIEnv *env, jclass cls, jint keyCode); +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_wtk_windows_WinWTK_nativeSetLockingState + (JNIEnv *env, jclass cls, jint keyCode, jboolean on); +} + + +static inline bool is_kana_present() +{ + return (MapVirtualKey(VK_KANA, 0) != 0); +} + +// Translate Java VK to Win32 VK +static inline int get_virt_locking_key(jint code) +{ + switch (code) + { + case 20:/*VK_CAPS_LOCK*/ + return VK_CAPITAL; + case 144:/*VK_NUM_LOCK*/ + return VK_NUMLOCK; + case 145:/*VK_SCROLL_LOCK*/ + return VK_SCROLL; + case 262:/*VK_KANA_LOCK*/ + return VK_KANA; + } + + return 0; +} + + +/* + * Class: org_apache_harmony_awt_wtk_windows_WinWTK + * Method: nativeGetLockingState + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_org_apache_harmony_awt_wtk_windows_WinWTK_nativeGetLockingState + (JNIEnv *env, jclass cls, jint keyCode) +{ + int vk = get_virt_locking_key(keyCode); + + if (vk == 0) + return JNI_FALSE; + + if (vk == VK_KANA && !is_kana_present()) + { + throwNewExceptionByName(env, "java/lang/UnsupportedOperationException", + "Keyboard doesn't have KANA key"); + return JNI_FALSE; // We shouldn't reach this return + } + + return (GetKeyState(vk) & 1) ? JNI_TRUE : JNI_FALSE; +} + +/* + * Class: org_apache_harmony_awt_wtk_windows_WinWTK + * Method: nativeSetLockingState + * Signature: (IZ)V + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_wtk_windows_WinWTK_nativeSetLockingState + (JNIEnv *env, jclass cls, jint keyCode, jboolean on) +{ + int vk = get_virt_locking_key(keyCode); + + if (vk == 0) + return; + + if (vk == VK_KANA && !is_kana_present()) + { + throwNewExceptionByName(env, "java/lang/UnsupportedOperationException", + "Keyboard doesn't have KANA key"); + return; // We shouldn't reach this return + } + + bool enabled = ((GetKeyState(vk) & 1) != 0); + + if ((enabled && on) || (!enabled && !on)) + return; + + LPARAM extra = GetMessageExtraInfo(); + + INPUT inp[2] = {{INPUT_KEYBOARD}, {INPUT_KEYBOARD}}; + inp[0].ki.wVk = inp[1].ki.wVk = vk; + inp[0].ki.time = inp[1].ki.time = 0; + inp[0].ki.dwExtraInfo = inp[1].ki.dwExtraInfo = extra; + inp[0].ki.dwFlags = 0; + inp[1].ki.dwFlags = KEYEVENTF_KEYUP; + + SendInput(2, inp, sizeof(INPUT)); +} Property changes on: modules/awt/src/main/native/gl/windows/LockingKeys.cpp ___________________________________________________________________ Name: svn:executable + * Index: modules/awt/src/main/native/gl/windows/makefile =================================================================== --- modules/awt/src/main/native/gl/windows/makefile (revision 561952) +++ modules/awt/src/main/native/gl/windows/makefile (working copy) @@ -23,7 +23,7 @@ LIBNAME=$(LIBPATH)$(LIBBASE).lib HYLDFLAGS = $(HYLDFLAGS) -def:$(LIBBASE).def -HYCFLAGS = $(HYCFLAGS) /I$(SHAREDSUB)include /I$(SHAREDSUB) \ +HYCFLAGS = $(HYCFLAGS) /D_WIN32_WINNT=0x0500 /I$(SHAREDSUB)include /I$(SHAREDSUB) \ /I$(PNG_DIR) /Iinclude BUILDFILES = \ @@ -32,6 +32,7 @@ WinGDIPGraphics2D.obj \ WinGraphicsEnvironment.obj \ WinThemeGraphics.obj \ + LockingKeys.obj \ $(SHAREDSUB)blitter.obj \ $(SHAREDSUB)gifdecoder.obj \ $(SHAREDSUB)LUTTables.obj \