From 957b8633ae93bc0efbb0b8eff1f40db6cb660485 Mon Sep 17 00:00:00 2001 From: Sebastien Vincent Date: Tue, 6 Mar 2012 09:47:38 +0000 Subject: [PATCH] Introduces new configuration from to setup global shortcut entry. Allows also to use special key detection for headset button _for MS Windows only_. --- lib/native/linux-64/libglobalshortcut.so | Bin 26136 -> 35497 bytes lib/native/linux/libglobalshortcut.so | Bin 22444 -> 29538 bytes lib/native/mac/libglobalshortcut.jnilib | Bin 113752 -> 105552 bytes lib/native/windows-64/globalshortcut.dll | Bin 75264 -> 76800 bytes lib/native/windows/globalshortcut.dll | Bin 57344 -> 65024 bytes resources/languages/resources.properties | 3 + ..._impl_globalshortcut_NativeKeyboardHook.cc | 28 ++ ...impl_globalshortcut_NativeKeyboardHook.cpp | 99 +++- ...r_impl_globalshortcut_NativeKeyboardHook.h | 24 + ...r_impl_globalshortcut_NativeKeyboardHook.m | 28 ++ .../GlobalShortcutServiceImpl.java | 149 +++++- .../globalshortcut/NativeKeyboardHook.java | 84 ++++ .../keybindings/KeybindingsServiceImpl.java | 22 +- .../GlobalShortcutConfigForm.java | 180 ++----- .../globalchooser/GlobalShortcutDialog.java | 475 ++++++++++++++++++ .../globalchooser/GlobalShortcutEntry.java | 7 + .../keybindingChooser.manifest.mf | 3 + .../globalshortcut/GlobalShortcutService.java | 21 + .../util/swing/SIPCommDialog.java | 14 +- .../util/swing/SIPCommTextField.java | 5 + 20 files changed, 977 insertions(+), 165 deletions(-) create mode 100644 src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java diff --git a/lib/native/linux-64/libglobalshortcut.so b/lib/native/linux-64/libglobalshortcut.so index fc01cb1cbc4b8d341c1d5a6bbe6601b58e39e5be..648db1f476ea864938a86cb88323e13aac7ce87b 100755 GIT binary patch literal 35497 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 diff --git a/lib/native/linux/libglobalshortcut.so b/lib/native/linux/libglobalshortcut.so index a3253051d73e251b72c971b6cfdfc55f7a1a4bdc..428f50e69d56ac37efaadca111036db41c929c40 100755 GIT binary patch literal 29538 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 diff --git a/lib/native/mac/libglobalshortcut.jnilib b/lib/native/mac/libglobalshortcut.jnilib index 261f936c41145ab6de76f2825e5a21723d991fc4..28d6bf9d9ca9dfcbd7cac1b7252ec8f5aa7ace49 100755 GIT binary patch delta 18178 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 delta 25407 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 VO4$M30po$n*Q<{tM{3^n{68{~&XfQE delta 16910 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 BJ;wk5 diff --git a/lib/native/windows/globalshortcut.dll b/lib/native/windows/globalshortcut.dll index 3b6e4d8e0dd858710ed9b99d3ce9e46b9f2fde30..15de04079ca7118561dd38135d9af11f596493da 100644 GIT binary patch delta 26518 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 Sx5s_xGVU407rD%yZ2hGT44A0R98z`qs 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 L@8KWk4*Gupz?B2M diff --git a/resources/languages/resources.properties b/resources/languages/resources.properties index b07324794..a0ff1228a 100644 --- a/resources/languages/resources.properties +++ b/resources/languages/resources.properties @@ -1122,6 +1122,9 @@ plugin.keybindings.globalchooser.MUTE_CALLS=Mute calls plugin.keybindings.globalchooser.SHORTCUT_NAME=Name plugin.keybindings.globalchooser.SHORTCUT_PRIMARY=Primary shortcut plugin.keybindings.globalchooser.SHORTCUT_SECOND=Second shortcut +plugin.keybindings.globalchooser.PRESS_BTN=Press to set shortcut +plugin.keybindings.globalchooser.PRESS_BTN_DOWN=Waiting +plugin.keybindings.globalchooser.ENABLE_SPECIAL=Enable special key detection plugin.keybindings.PLUGIN_NAME=Keybindings plugin.keybindings.CHAT=Chat plugin.keybindings.MAIN=Main diff --git a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cc b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cc index 350144807..4d8c41f6b 100644 --- a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cc +++ b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cc @@ -922,3 +922,31 @@ JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_Native } } +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_registerSpecial + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jint keycode) +{ + (void)jniEnv; + (void)clazz; + (void)ptr; + (void)keycode; + return JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_unregisterSpecial + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jint keycode) +{ + (void)jniEnv; + (void)clazz; + (void)ptr; + (void)keycode; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_detectSpecialKeyPress + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jboolean enable) +{ + (void)jniEnv; + (void)clazz; + (void)ptr; + (void)enable; +} + diff --git a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cpp b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cpp index 119b51cc6..2ab0db464 100644 --- a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cpp +++ b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.cpp @@ -61,6 +61,8 @@ class keyboard_hook HWND hwnd; /**< Handle of the window that will receive event. */ int hotkey_next_id; /**< Next ID to use for a new hotkey. */ std::list keystrokes; /**< List of keystrokes registered. */ + std::list specials; /**< List of special keystrokes registered. */ + bool detect; /**< If we are in detection mode. */ }; /** @@ -653,13 +655,13 @@ static int convertWindowsKeycodeToJava(int keycode) else if(keycode == VK_PERIOD) ret = JVK_PERIOD; else if(keycode == VK_DOLLAR) - ret = JVK_DOLLAR; - else if(keycode == VK_LESS) - ret = JVK_LESS; - else if(keycode == VK_GREATER) - ret = JVK_GREATER; - else if(keycode == VK_SLASH) - ret = JVK_SLASH; + ret = JVK_DOLLAR; + else if(keycode == VK_LESS) + ret = JVK_LESS; + else if(keycode == VK_GREATER) + ret = JVK_GREATER; + else if(keycode == VK_SLASH) + ret = JVK_SLASH; } return ret; } @@ -872,6 +874,39 @@ static void RegisterWindowClassW(HINSTANCE hInstance) } } +/** + * \brief Callback handler for low-level keyboard press/release. + * \param nCode code + * \param wParam wParam + * \param lParam lParam + * \return CallNextHookEx return value + */ +LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) +{ + KBDLLHOOKSTRUCT* kbd = (KBDLLHOOKSTRUCT*)lParam; + int pressed = wParam == WM_KEYDOWN; + + if(pressed && kbd->vkCode > 160) + { + if(g_keyboard_hook.detect) + { + notify(kbd->vkCode, 16367); + } + else + { + for(std::list::const_iterator it = g_keyboard_hook.specials.begin() ; it != g_keyboard_hook.specials.end() ; ++it) + { + if((*it)== kbd->vkCode) + { + notify((*it), 16367); + break; + } + } + } + } + return CallNextHookEx(g_keyboard_hook.hook, nCode, wParam, lParam); +} + /** * \brief Thread that create window and that monitor event related to it. * \param pThreadParam thread parameter @@ -887,6 +922,7 @@ static unsigned WINAPI CreateWndThreadW(LPVOID pThreadParam) HWND hWnd = CreateWindowW(WINDOW_SHORTCUT_NAME, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); + keyboard->hook = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0); if(hWnd == NULL) { @@ -926,6 +962,7 @@ JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_Native HANDLE hThread = NULL; UINT uThreadId = 0; + keyboard->detect = false; hThread = (HANDLE)_beginthreadex(NULL, 0, &CreateWndThreadW, keyboard, 0, &uThreadId); if(!hThread) { @@ -940,6 +977,7 @@ JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_Native { keyboard_hook* keyboard = (keyboard_hook*)ptr; + UnhookWindowsHookEx(keyboard->hook); keyboard->hook = 0; keyboard->running = 0; } @@ -1017,3 +1055,50 @@ JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_Native } } +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_registerSpecial + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jint keycode) +{ + struct keyboard_hook* keyboard = (struct keyboard_hook*)ptr; + + if(keyboard && keyboard->hook != NULL) + { + keyboard->specials.push_back((int)keycode); + return JNI_TRUE; + } + return JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_unregisterSpecial + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jint keycode) +{ + struct keyboard_hook* keyboard = (struct keyboard_hook*)ptr; + + if(keyboard) + { + for(std::list::iterator it = keyboard->specials.begin() ; + it != keyboard->specials.end() ; ++it) + { + if((*it) == keycode) + { + keyboard->specials.erase(it); + return; + } + } + } +} + +/* + * Class: net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook + * Method: detectSpecialKeyPress + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_detectSpecialKeyPress + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jboolean enable) +{ + struct keyboard_hook* keyboard = (struct keyboard_hook*)ptr; + + if(keyboard) + { + keyboard->detect = (enable == JNI_TRUE) ? true : false; + } +} diff --git a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.h b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.h index 75025f931..2ca41310a 100644 --- a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.h +++ b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.h @@ -55,6 +55,30 @@ JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_impl_globalshortcut_Na JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_unregisterShortcut (JNIEnv *, jclass, jlong, jint, jint); +/* + * Class: net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook + * Method: registerSpecial + * Signature: (JI)Z + */ +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_registerSpecial + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook + * Method: unregisterSpecial + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_unregisterSpecial + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook + * Method: detectSpecialKeyPress + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_detectSpecialKeyPress + (JNIEnv *, jclass, jlong, jboolean); + #ifdef __cplusplus } #endif diff --git a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.m b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.m index f46e3f9b7..2e78b2978 100644 --- a/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.m +++ b/src/native/globalshortcut/net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook.m @@ -938,3 +938,31 @@ JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_Native } } +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_registerSpecial + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jint keycode) +{ + (void)jniEnv; + (void)clazz; + (void)ptr; + (void)keycode; + return JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_unregisterSpecial + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jint keycode) +{ + (void)jniEnv; + (void)clazz; + (void)ptr; + (void)keycode; +} + +JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_globalshortcut_NativeKeyboardHook_detectSpecialKeyPress + (JNIEnv* jniEnv, jclass clazz, jlong ptr, jboolean enable) +{ + (void)jniEnv; + (void)clazz; + (void)ptr; + (void)enable; +} + diff --git a/src/net/java/sip/communicator/impl/globalshortcut/GlobalShortcutServiceImpl.java b/src/net/java/sip/communicator/impl/globalshortcut/GlobalShortcutServiceImpl.java index d1cda5624..9268dc3e5 100644 --- a/src/net/java/sip/communicator/impl/globalshortcut/GlobalShortcutServiceImpl.java +++ b/src/net/java/sip/communicator/impl/globalshortcut/GlobalShortcutServiceImpl.java @@ -38,6 +38,11 @@ public class GlobalShortcutServiceImpl private final Map> mapActions = new HashMap>(); + /** + * List of notifiers when special key detection is enabled. + */ + private final List specialKeyNotifiers = + new ArrayList(); /** * If the service is running or not. */ @@ -58,6 +63,16 @@ public class GlobalShortcutServiceImpl */ private final UIShortcut uiShortcut = new UIShortcut(); + /** + * Last special key detected. + */ + private AWTKeyStroke specialKeyDetected = null; + + /** + * Object to synchronize special key detection. + */ + private final Object specialKeySyncRoot = new Object(); + /** * Initializes the GlobalShortcutServiceImpl. */ @@ -90,6 +105,7 @@ public void registerShortcut(GlobalShortcutListener listener, synchronized(mapActions) { List keystrokes = mapActions.get(listener); + boolean ok = false; if(keyStroke == null) { @@ -98,21 +114,38 @@ public void registerShortcut(GlobalShortcutListener listener, if(keystrokes != null) { - if(keyboardHook.registerShortcut(keyStroke.getKeyCode(), - getModifiers(keyStroke))) + if(keyStroke.getModifiers() != SPECIAL_KEY_MODIFIERS) + { + ok = keyboardHook.registerShortcut(keyStroke.getKeyCode(), + getModifiers(keyStroke)); + } + else { - if(add) - keystrokes.add(keyStroke); + ok = keyboardHook.registerSpecial(keyStroke.getKeyCode()); + } + + if(ok && add) + { + keystrokes.add(keyStroke); } } else { keystrokes = new ArrayList(); - if(keyboardHook.registerShortcut(keyStroke.getKeyCode(), - getModifiers(keyStroke))) + + if(keyStroke.getModifiers() != SPECIAL_KEY_MODIFIERS) { - if(add) - keystrokes.add(keyStroke); + ok = keyboardHook.registerShortcut(keyStroke.getKeyCode(), + getModifiers(keyStroke)); + } + else + { + ok = keyboardHook.registerSpecial(keyStroke.getKeyCode()); + } + + if(ok && add) + { + keystrokes.add(keyStroke); } } @@ -160,8 +193,15 @@ public void unregisterShortcut(GlobalShortcutListener listener, ks = l; } - keyboardHook.unregisterShortcut(keyStroke.getKeyCode(), - getModifiers(keyStroke)); + if(modifiers != SPECIAL_KEY_MODIFIERS) + { + keyboardHook.unregisterShortcut(keyStroke.getKeyCode(), + getModifiers(keyStroke)); + } + else + { + keyboardHook.unregisterSpecial(keyStroke.getKeyCode()); + } if(remove) { @@ -228,6 +268,30 @@ public void stop() */ public synchronized void receiveKey(int keycode, int modifiers) { + if(keyboardHook.isSpecialKeyDetection()) + { + specialKeyDetected = AWTKeyStroke.getAWTKeyStroke(keycode, + modifiers); + + synchronized(specialKeySyncRoot) + { + specialKeySyncRoot.notify(); + } + + GlobalShortcutEvent evt = new GlobalShortcutEvent( + specialKeyDetected); + List copyListeners = + new ArrayList(specialKeyNotifiers); + + for(GlobalShortcutListener l : copyListeners) + { + l.shortcutReceived(evt); + } + + // if special key detection is enabled, disable all other shortcuts + return; + } + synchronized(mapActions) { // compare keycode/modifiers to keystroke @@ -239,7 +303,9 @@ public synchronized void receiveKey(int keycode, int modifiers) for(AWTKeyStroke l : lst) { if(l.getKeyCode() == keycode && - getModifiers(l) == modifiers) + (getModifiers(l) == modifiers || + (modifiers == SPECIAL_KEY_MODIFIERS && + l.getModifiers() == modifiers))) { // notify corresponding listeners GlobalShortcutEvent evt = new GlobalShortcutEvent(l); @@ -381,6 +447,67 @@ public void setEnable(boolean enable) } } + /** + * Enable or disable special key detection. + * + * @param enable enable or not special key detection. + * @param callback object to be notified + */ + public synchronized void setSpecialKeyDetection(boolean enable, + GlobalShortcutListener callback) + { + keyboardHook.detectSpecialKeyPress(enable); + + if(specialKeyNotifiers.contains(callback) == enable) + { + return; + } + + if(enable) + { + specialKeyNotifiers.add(callback); + } + else + { + specialKeyNotifiers.remove(callback); + } + } + + /** + * Get special keystroke or null if not supported or user cancels. If no + * special key is detected for 5 seconds, it returns null + * + * @return special keystroke or null if not supported or user cancels + */ + public AWTKeyStroke getSpecialKey() + { + AWTKeyStroke ret = null; + + specialKeyDetected = null; + keyboardHook.detectSpecialKeyPress(true); + + // Windows only for the moment + if(OSUtils.IS_WINDOWS) + { + synchronized(specialKeySyncRoot) + { + try + { + specialKeySyncRoot.wait(5000); + } + catch(InterruptedException e) + { + } + } + + ret = specialKeyDetected; + specialKeyDetected = null; + } + + keyboardHook.detectSpecialKeyPress(false); + return ret; + } + /** * Simple test. */ diff --git a/src/net/java/sip/communicator/impl/globalshortcut/NativeKeyboardHook.java b/src/net/java/sip/communicator/impl/globalshortcut/NativeKeyboardHook.java index e2101c4e9..b61971b55 100644 --- a/src/net/java/sip/communicator/impl/globalshortcut/NativeKeyboardHook.java +++ b/src/net/java/sip/communicator/impl/globalshortcut/NativeKeyboardHook.java @@ -34,6 +34,11 @@ public class NativeKeyboardHook */ private static long ptr = 0; + /** + * If the special key detection is enable. + */ + private boolean specialKeydetection = false; + /** * Constructor. */ @@ -105,6 +110,57 @@ public synchronized void unregisterShortcut(int keycode, unregisterShortcut(ptr, keycode, modifiers); } + /** + * Register a special key shortcut (for example key coming from headset). + * + * @param keycode keycode of the shortcut + * @param modifiers modifiers (CTRL, ALT, ...) + * @return true if success, false otherwise + */ + public synchronized boolean registerSpecial(int keycode) + { + if(ptr != 0) + return registerSpecial(ptr, keycode); + + return false; + } + + /** + * Unregister a special key shortcut (for example key coming from headset). + * + * @param keycode keycode of the shortcut + * @param modifiers modifiers (CTRL, ALT, ...) + */ + public synchronized void unregisterSpecial(int keycode) + { + if(ptr != 0) + unregisterSpecial(ptr, keycode); + } + + /** + * Detect special key press. + * + * @param enable enable or not the special key press detection. + */ + public synchronized void detectSpecialKeyPress(boolean enable) + { + if(ptr != 0) + { + detectSpecialKeyPress(ptr, enable); + this.specialKeydetection = enable; + } + } + + /** + * Returns whether or not special key detection is enabled. + * + * @return true if special key detection is enabled, false otherwise + */ + public boolean isSpecialKeyDetection() + { + return specialKeydetection; + } + /** * Native method to initialize NativeKeyboardHook. * @@ -141,6 +197,7 @@ private static native void setDelegate(long ptr, * @param ptr native pointer * @param keycode keycode of the shortcut * @param modifiers modifiers (CTRL, ALT, ...) + * @return true if registration is successful, false otherwise */ private static native boolean registerShortcut(long ptr, int keycode, int modifiers); @@ -155,6 +212,33 @@ private static native boolean registerShortcut(long ptr, int keycode, private static native void unregisterShortcut(long ptr, int keycode, int modifiers); + /** + * Native method to register a special key shortcut (for example key coming + * from a headset). + * + * @param ptr native pointer + * @param keycode keycode of the shortcut + * @return true if registration is successful, false otherwise + */ + private static native boolean registerSpecial(long ptr, int keycode); + + /** + * Native method to unregister a special key shortcut (for example key + * coming from a headset). + * + * @param ptr native pointer + * @param keycode keycode of the shortcut + */ + private static native void unregisterSpecial(long ptr, int keycode); + + /** + * Native method to ook for special key press. + * + * @param ptr native pointer + * @param enable enable or not the special key press detection. + */ + private static native void detectSpecialKeyPress(long ptr, boolean enable); + static { try diff --git a/src/net/java/sip/communicator/impl/keybindings/KeybindingsServiceImpl.java b/src/net/java/sip/communicator/impl/keybindings/KeybindingsServiceImpl.java index a7a7a4fca..108905116 100644 --- a/src/net/java/sip/communicator/impl/keybindings/KeybindingsServiceImpl.java +++ b/src/net/java/sip/communicator/impl/keybindings/KeybindingsServiceImpl.java @@ -183,16 +183,16 @@ synchronized void start(BundleContext bc) Map customTmp = new LinkedHashMap(customBindings); - for (Map.Entry shortcut2action : defaultBindings - .entrySet()) + for (Map.Entry shortcut2action : + defaultBindings.entrySet()) { String action = shortcut2action.getValue(); if (customTmp.containsValue(action)) { KeyStroke custom = null; - for (Map.Entry customShortcut2action : customTmp - .entrySet()) + for(Map.Entry customShortcut2action : + customTmp.entrySet()) { if (customShortcut2action.getValue().equals(action)) { @@ -383,9 +383,15 @@ public Map> getGlobalShortcutFromConfiguration() { kss.add(AWTKeyStroke.getAWTKeyStroke(shortcut)); } + + // second shortcut is always "special" if(shortcut2 != null) { - kss.add(AWTKeyStroke.getAWTKeyStroke(shortcut2)); + //16367 is the combination of all possible modifiers + //(shift ctrl meta alt altGraph button1 button2 button3 pressed) + //it is used to distinguish special key (headset) and others + int nb = Integer.parseInt(shortcut2); + kss.add(AWTKeyStroke.getAWTKeyStroke(nb, 16367)); } gBindings.put(name, kss); } @@ -417,8 +423,10 @@ public void saveGlobalShortcutFromConfiguration() configService.setProperty(shortcut, kss.size() > 0 ? kss.get(0) : null); - configService.setProperty(shortcut2, kss.size() > 1 ? - kss.get(1) : null); + // second shortcut is special + configService.setProperty(shortcut2, + (kss.size() > 1 && kss.get(1) != null) ? + kss.get(1).getKeyCode() : null); } } diff --git a/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutConfigForm.java b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutConfigForm.java index 65e955d28..034d6d8c4 100644 --- a/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutConfigForm.java +++ b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutConfigForm.java @@ -61,16 +61,6 @@ public class GlobalShortcutConfigForm private GlobalShortcutTableModel tableModel = new GlobalShortcutTableModel(); - /** - * Current selected row. - */ - private int currentRow = -1; - - /** - * Current selected row. - */ - private int currentColumn = -1; - /** * Constructor */ @@ -97,152 +87,76 @@ private void initComponents() @Override public void mouseClicked(MouseEvent e) { - if(e.getClickCount() >= 1) + if(e.getClickCount() >= 2) { int row = GlobalShortcutConfigForm.this.shortcutsTable. getSelectedRow(); - int column = GlobalShortcutConfigForm.this.shortcutsTable. - getSelectedColumn(); - - if(currentRow != -1 && currentColumn != -1) - return; - - if(row >= 0 && column >= 1) - { - currentRow = row; - currentColumn = column; - - if(column == 1) - GlobalShortcutConfigForm.this.tableModel.getEntryAt( - row).setEditShortcut1(true); - else if(column == 2) - GlobalShortcutConfigForm.this.tableModel.getEntryAt( - row).setEditShortcut2(true); - else - return; - - KeybindingChooserActivator.getGlobalShortcutService(). - setEnable(false); - refresh(); - shortcutsTable.setRowSelectionInterval(row, row); - } - } - } - }); - - shortcutsTable.addKeyListener(new KeyAdapter() - { - private KeyEvent buffer = null; - - @Override - public void keyPressed(KeyEvent event) - { - if(currentRow == -1 || currentColumn == -1) - return; - - // delete shortcut - if(event.getKeyCode() == KeyEvent.VK_BACK_SPACE) - { GlobalShortcutEntry en = - GlobalShortcutConfigForm.this.tableModel.getEntryAt( - currentRow); - List kss = new ArrayList(); - if(currentColumn == 1) - { - kss.add(null); - kss.add(en.getShortcut2()); - } - else if(currentColumn == 2) - { - kss.add(en.getShortcut()); - kss.add(null); - } - - currentRow = -1; - currentColumn = -1; - en.setShortcuts(kss); - en.setEditShortcut1(false); - en.setEditShortcut2(false); - GlobalShortcutConfigForm.this.saveConfig(); - GlobalShortcutConfigForm.this.refresh(); - } - else - { - // Reports KEY_PRESSED events on release to support - // modifiers - this.buffer = event; - } - } + GlobalShortcutConfigForm.this.tableModel. + getEntryAt(row); + List kss = new ArrayList(); - @Override - public void keyReleased(KeyEvent event) - { - if (buffer != null) - { - AWTKeyStroke input = KeyStroke.getKeyStrokeForEvent(buffer); - buffer = null; - - if(currentRow != -1) - { - GlobalShortcutEntry en = - GlobalShortcutConfigForm.this.tableModel.getEntryAt( - currentRow); - List kss = new ArrayList(); + GlobalShortcutDialog dialog = + new GlobalShortcutDialog((Dialog) + GlobalShortcutConfigForm.this.getTopLevelAncestor(), + en); - if(currentColumn == 1) // shortcut 1 - { - kss.add(input); - kss.add(en.getShortcut2()); - } - else if(currentColumn == 2) // shortcut 2 - { - kss.add(en.getShortcut()); - kss.add(input); - } - else - { - return; - } + kss.add(en.getShortcut()); + kss.add(en.getShortcut2()); - en.setShortcuts(kss); - en.setEditShortcut1(false); - en.setEditShortcut2(false); + KeybindingChooserActivator.getGlobalShortcutService(). + setEnable(false); + int ret = dialog.showDialog(); + if(ret == 1) + { + // ok button clicked kss = new ArrayList(); - List lst = tableModel.getEntries(); + List lst = + tableModel.getEntries(); - for(GlobalShortcutEntry e : lst) + for(GlobalShortcutEntry ee : lst) { - boolean isEntry = (e == en); - AWTKeyStroke s1 = isEntry && - currentColumn == 1 ? null : e.getShortcut(); - AWTKeyStroke s2 = isEntry && - currentColumn == 2 ? null : e.getShortcut2(); - - if(s1 != null && - s1.getKeyCode() == input.getKeyCode() && - s1.getModifiers() == input.getModifiers()) + boolean isEntry = (ee == en); + AWTKeyStroke s1 = isEntry ? null : + ee.getShortcut(); + AWTKeyStroke s2 = isEntry ? null : + ee.getShortcut2(); + + if(s1 != null && en.getShortcut() != null && + s1.getKeyCode() == en.getShortcut(). + getKeyCode() && + s1.getModifiers() == en.getShortcut(). + getModifiers()) { kss.add(null); - kss.add(e.getShortcut2()); - e.setShortcuts(kss); + kss.add(ee.getShortcut2()); + ee.setShortcuts(kss); break; } - else if(s2 != null && - s2.getKeyCode() == input.getKeyCode() && - s2.getModifiers() == input.getModifiers()) + else if(s2 != null && en.getShortcut2() != null && + s2.getKeyCode() == en.getShortcut2(). + getKeyCode() && + s2.getModifiers() == en.getShortcut2(). + getModifiers()) { - kss.add(e.getShortcut()); + kss.add(ee.getShortcut()); kss.add(null); - e.setShortcuts(kss); + ee.setShortcuts(kss); break; } } - currentRow = -1; - currentColumn = -1; + KeybindingChooserActivator.getGlobalShortcutService(). + setEnable(true); GlobalShortcutConfigForm.this.saveConfig(); GlobalShortcutConfigForm.this.refresh(); + KeybindingChooserActivator.getGlobalShortcutService(). + setEnable(true); + } + else + { + en.setShortcuts(kss); } } } diff --git a/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java new file mode 100644 index 000000000..12a8727f0 --- /dev/null +++ b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java @@ -0,0 +1,475 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.plugin.keybindingchooser.globalchooser; + +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; // disambiguation + +import javax.swing.*; + +import net.java.sip.communicator.plugin.keybindingchooser.*; +import net.java.sip.communicator.service.globalshortcut.*; +import net.java.sip.communicator.util.*; +import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; +import net.java.sip.communicator.util.swing.plaf.*; + +/** + * Dialog to choose the shortcut. + * + * @author Sebastien Vincent + */ +public class GlobalShortcutDialog + extends SIPCommDialog + implements ActionListener, + GlobalShortcutListener +{ + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + + /** + * Text displayed when no shortcut is configured. + */ + private static final String PRESS_TO_SETUP_SHORTCUT = + Resources.getString("plugin.keybindings.globalchooser.PRESS_BTN"); + + /** + * The global shortcut entry. + */ + private final GlobalShortcutEntry entry; + + /** + * OK button. + */ + private final JButton btnOK = new JButton( + Resources.getString("service.gui.OK")); + + /** + * Cancel button. + */ + private final JButton btnCancel = new JButton( + Resources.getString("service.gui.CANCEL")); + + /** + * Enable or not special key for shortcut. + */ + private final JCheckBox specialBox = new SIPCommCheckBox( + Resources.getString("plugin.keybindings.globalchooser.ENABLE_SPECIAL")); + + /** + * First shortcut field. + */ + private final ShortcutField fldShortcut = new ShortcutField( + PRESS_TO_SETUP_SHORTCUT); + + /** + * Secondary shortcut field. + */ + private final ShortcutField fldShortcut2 = new ShortcutField( + PRESS_TO_SETUP_SHORTCUT); + + /** + * Return code. + */ + private int retCode = 0; + + /** + * Constructor. + * + * @param dialog root dialog + * @param entry the global shortcut entry + */ + public GlobalShortcutDialog(Dialog dialog, GlobalShortcutEntry entry) + { + super(dialog); + + setModal(true); + setTitle("Global shortcut: " + entry.getAction()); + this.entry = entry; + init(); + } + + /** + * Initialize components. + */ + private void init() + { + TransparentPanel mainPanel = new TransparentPanel(new BorderLayout()); + JPanel btnPanel = new TransparentPanel( + new FlowLayout(FlowLayout.RIGHT)); + JPanel shortcutPanel = new TransparentPanel( + new GridLayout(0, 2, 0, 10)); + + btnOK.addActionListener(this); + btnCancel.addActionListener(this); + + KeyAdapter keyAdapter = new KeyAdapter() + { + private KeyEvent buffer = null; + + @Override + public void keyPressed(KeyEvent event) + { + if(event.getKeyCode() == KeyEvent.VK_ESCAPE) + { + SIPCommTextField field = + (SIPCommTextField)event.getSource(); + + AWTKeyStroke ks = null; + + if(field == fldShortcut) + { + ks = entry.getShortcut(); + } + else if(field == fldShortcut2) + { + ks = entry.getShortcut2(); + } + + if(ks == null) + field.setText(PRESS_TO_SETUP_SHORTCUT); + else + { + + if(ks.getModifiers() == + GlobalShortcutService.SPECIAL_KEY_MODIFIERS) + { + field.setText("Special"); + } + else + { + field.setText(GlobalShortcutEntry.getShortcutText( + entry.getShortcut())); + } + } + btnOK.requestFocusInWindow(); + return; + } + + if(event.getKeyCode() == 0) + return; + + // Reports KEY_PRESSED events on release to support modifiers + this.buffer = event; + } + + @Override + public void keyReleased(KeyEvent event) + { + if (buffer != null) + { + SIPCommTextField field = + (SIPCommTextField)event.getSource(); + AWTKeyStroke input = KeyStroke.getKeyStrokeForEvent(buffer); + buffer = null; + + GlobalShortcutEntry en = entry; + List kss = new ArrayList(); + + kss.add(input); + kss.add(en.getShortcut2()); + + en.setShortcuts(kss); + en.setEditShortcut1(false); + en.setEditShortcut2(false); + field.setText(GlobalShortcutEntry.getShortcutText( + input)); + btnOK.requestFocus(); + } + } + }; + + AWTKeyStroke ks = entry.getShortcut(); + AWTKeyStroke ks2 = entry.getShortcut2(); + + if(ks != null) + { + if(ks.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS) + { + fldShortcut.setText(GlobalShortcutEntry.getShortcutText(ks)); + } + else + { + fldShortcut.setText("Special"); + } + } + + if(ks2 != null) + { + + if(ks2.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS) + { + fldShortcut2.setText(GlobalShortcutEntry.getShortcutText(ks2)); + } + else + { + fldShortcut2.setText("Special"); + } + } + + fldShortcut.addKeyListener(keyAdapter); + fldShortcut2.addKeyListener(keyAdapter); + + specialBox.addItemListener(new ItemListener() + { + public void itemStateChanged(ItemEvent evt) + { + KeybindingChooserActivator.getGlobalShortcutService(). + setSpecialKeyDetection( + (evt.getStateChange() == ItemEvent.SELECTED), + GlobalShortcutDialog.this); + } + }); + + shortcutPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, + 10)); + shortcutPanel.add(new JLabel("Primary shortcut")); + shortcutPanel.add(fldShortcut); + shortcutPanel.add(new JLabel("Secondary shortcut")); + shortcutPanel.add(fldShortcut2); + + if(OSUtils.IS_WINDOWS) + { + shortcutPanel.add(new TransparentPanel()); + shortcutPanel.add(specialBox); + } + + mainPanel.add(shortcutPanel, BorderLayout.CENTER); + + btnPanel.add(btnOK); + btnPanel.add(btnCancel); + mainPanel.add(btnPanel, BorderLayout.SOUTH); + + btnOK.requestFocus(); + + getContentPane().add(mainPanel); + pack(); + } + + /** + * {@inheritDoc} + */ + @Override + protected void close(boolean isEscaped) + { + super.close(isEscaped); + KeybindingChooserActivator.getGlobalShortcutService(). + setSpecialKeyDetection(false, this); + } + + /** + * Show the dialog and returns if the user has modified something (create + * or modify entry). + * + * @return true if the user has modified something (create + * or modify entry), false otherwise. + */ + public int showDialog() + { + setVisible(true); + + // as the dialog is modal, wait for OK/Cancel button retCode + setVisible(false); + return retCode; + } + + /** + * {@inheritDoc} + */ + public void actionPerformed(ActionEvent evt) + { + Object obj = evt.getSource(); + + if(obj == btnOK) + { + retCode = 1; + dispose(); + } + else if(obj == btnCancel) + { + retCode = 0; + dispose(); + } + } + + /** + * {@inheritDoc} + */ + public void shortcutReceived(GlobalShortcutEvent evt) + { + AWTKeyStroke ksr = evt.getKeyStroke(); + + if(ksr.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS) + { + return; + } + + if(!fldShortcut.isFocusOwner() && !fldShortcut2.isFocusOwner()) + return; + + List kss = new ArrayList(); + + if(fldShortcut.isFocusOwner()) + { + kss.add(ksr); + kss.add(entry.getShortcut2()); + fldShortcut.setText("Special"); + } + else if(fldShortcut2.isFocusOwner()) + { + kss.add(entry.getShortcut()); + kss.add(ksr); + fldShortcut2.setText("Special"); + } + entry.setShortcuts(kss); + KeybindingChooserActivator.getGlobalShortcutService(). + setSpecialKeyDetection(false, this); + } + + /** + * Clear the text field. + * + * @param ui TextFieldUI to clear + */ + public void clearTextField(SIPCommTextFieldUI ui) + { + List kss = new ArrayList(); + + if(ui == fldShortcut.getUI()) + { + kss.add(null); + kss.add(entry.getShortcut2()); + entry.setShortcuts(kss); + btnOK.requestFocusInWindow(); + } + else if(ui == fldShortcut2.getUI()) + { + kss.add(entry.getShortcut()); + kss.add(null); + entry.setShortcuts(kss); + btnOK.requestFocusInWindow(); + } + } + + /** + * A custom call field. + */ + private class ShortcutField + extends SIPCommTextField + implements Skinnable + { + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + + /** + * The text field ui. + */ + private ShortcutFieldUI textFieldUI; + + /** + * Creates an instance of the CallField. + * + * @param text + */ + public ShortcutField(String text) + { + super(text); + + textFieldUI = new ShortcutFieldUI(); + textFieldUI.setDeleteButtonEnabled(true); + + this.setPreferredSize(new Dimension(200, 23)); + this.setUI(textFieldUI); + this.setBorder(null); + this.setOpaque(false); + + this.setDragEnabled(true); + + loadSkin(); + } + + /** + * Reloads text field UI defs. + */ + public void loadSkin() + { + textFieldUI.loadSkin(); + } + } + + public class ShortcutFieldUI + extends SIPCommTextFieldUI + implements Skinnable + { + /** + * Creates a SIPCommTextFieldUI. + */ + public ShortcutFieldUI() + { + loadSkin(); + } + + /** + * Adds the custom mouse listeners defined in this class to the installed + * listeners. + */ + protected void installListeners() + { + super.installListeners(); + } + + /** + * {@inheritDoc} + */ + protected void updateDeleteIcon(MouseEvent evt) + { + super.updateDeleteIcon(evt); + + Rectangle deleteRect = getDeleteButtonRect(); + if(deleteRect.contains(evt.getX(), evt.getY()) && + evt.getID() == MouseEvent.MOUSE_CLICKED) + { + clearTextField(this); + } + } + + /** + * Implements parent paintSafely method and enables antialiasing. + * @param g the Graphics object that notified us + */ + protected void paintSafely(Graphics g) + { + customPaintBackground(g); + super.paintSafely(g); + } + + /** + * Paints the background of the associated component. + * @param g the Graphics object used for painting + */ + protected void customPaintBackground(Graphics g) + { + Graphics2D g2 = (Graphics2D) g.create(); + + try + { + AntialiasingManager.activateAntialiasing(g2); + super.customPaintBackground(g2); + } + finally + { + g2.dispose(); + } + } + } +} diff --git a/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutEntry.java b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutEntry.java index f68c31f4a..bcb85104a 100644 --- a/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutEntry.java +++ b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutEntry.java @@ -10,6 +10,8 @@ import java.awt.*; import java.awt.event.*; +import net.java.sip.communicator.service.globalshortcut.*; + /** * Entry for a global shortcut. * @@ -104,6 +106,11 @@ public static String getShortcutText(AWTKeyStroke shortcut) int keycode = shortcut.getKeyCode(); int modifiers = shortcut.getModifiers(); + if(modifiers == GlobalShortcutService.SPECIAL_KEY_MODIFIERS) + { + return "Special"; + } + // Indicates modifiers of the keystroke boolean shiftMask = (modifiers & InputEvent.SHIFT_MASK) != 0; boolean ctrlMask = (modifiers & InputEvent.CTRL_MASK) != 0; diff --git a/src/net/java/sip/communicator/plugin/keybindingchooser/keybindingChooser.manifest.mf b/src/net/java/sip/communicator/plugin/keybindingchooser/keybindingChooser.manifest.mf index 1bb8e9043..85d2bcbd2 100644 --- a/src/net/java/sip/communicator/plugin/keybindingchooser/keybindingChooser.manifest.mf +++ b/src/net/java/sip/communicator/plugin/keybindingchooser/keybindingChooser.manifest.mf @@ -12,6 +12,9 @@ Import-Package: org.osgi.framework, net.java.sip.communicator.service.globalshortcut, net.java.sip.communicator.util, net.java.sip.communicator.util.swing, + net.java.sip.communicator.util.swing.plaf, + net.java.sip.communicator.util.skin, javax.swing, + javax.swing.plaf, javax.swing.event, javax.swing.table diff --git a/src/net/java/sip/communicator/service/globalshortcut/GlobalShortcutService.java b/src/net/java/sip/communicator/service/globalshortcut/GlobalShortcutService.java index 2753c92f2..f9f2cf373 100644 --- a/src/net/java/sip/communicator/service/globalshortcut/GlobalShortcutService.java +++ b/src/net/java/sip/communicator/service/globalshortcut/GlobalShortcutService.java @@ -16,6 +16,11 @@ */ public interface GlobalShortcutService { + /** + * Value for AWTKeyStroke's modifiers that specify a "special" key shortcut. + */ + public static final int SPECIAL_KEY_MODIFIERS = 16367; + /** * Registers an action to execute when the keystroke is typed. * @@ -34,6 +39,22 @@ public void registerShortcut(GlobalShortcutListener l, public void unregisterShortcut(GlobalShortcutListener l, AWTKeyStroke keyStroke); + /** + * Enable or disable special key detection. + * + * @param enable enable or not special key detection. + * @param callback object to be notified + */ + public void setSpecialKeyDetection(boolean enable, + GlobalShortcutListener callback); + + /** + * Get special keystroke or null if not supported or user cancels. + * + * @return special keystroke or null if not supported or user cancels + */ + public AWTKeyStroke getSpecialKey(); + /** * Reload global shortcuts. */ diff --git a/src/net/java/sip/communicator/util/swing/SIPCommDialog.java b/src/net/java/sip/communicator/util/swing/SIPCommDialog.java index 511df08f5..e1b01282c 100644 --- a/src/net/java/sip/communicator/util/swing/SIPCommDialog.java +++ b/src/net/java/sip/communicator/util/swing/SIPCommDialog.java @@ -144,7 +144,7 @@ private void initInputMap() amap.put("close", new CloseAction()); imap = this.getRootPane().getInputMap( - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + JComponent.WHEN_IN_FOCUSED_WINDOW); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "close"); @@ -176,7 +176,7 @@ public void actionPerformed(ActionEvent e) /** * Adds a key - action pair for this frame. - * + * * @param keyStroke the key combination * @param action the action which will be executed when user presses the * given key combination @@ -184,9 +184,9 @@ public void actionPerformed(ActionEvent e) protected void addKeyBinding(KeyStroke keyStroke, Action action) { String actionID = action.getClass().getName(); - + amap.put(actionID, action); - + imap.put(keyStroke, actionID); } @@ -268,8 +268,8 @@ private void setCenterLocation() } /** - * Checks whether the current component will - * exceeds the screen size and if it do will set a default size + * Checks whether the current component will + * exceeds the screen size and if it do will set a default size */ private void ensureOnScreenLocationAndSize() { @@ -429,6 +429,6 @@ public void dispose() */ protected void close(boolean isEscaped) { - + } } diff --git a/src/net/java/sip/communicator/util/swing/SIPCommTextField.java b/src/net/java/sip/communicator/util/swing/SIPCommTextField.java index 5ce51d05a..151dc7c4c 100644 --- a/src/net/java/sip/communicator/util/swing/SIPCommTextField.java +++ b/src/net/java/sip/communicator/util/swing/SIPCommTextField.java @@ -28,6 +28,11 @@ public class SIPCommTextField KeyListener, DocumentListener { + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + /** * The default text. */