/*
* Copyright (c) 2010-2016, Sikuli.org, sikulix.com
* Released under the MIT License.
*
*/
package org.sikuli.basics;
import com.melloware.jintellitype.JIntellitype;
import java.util.*;
import org.sikuli.basics.Debug;
public class WindowsHotkeyManager extends HotkeyManager {
private Map<Integer, HotkeyData> _idCallbackMap = new HashMap<Integer, HotkeyData>();
private int _gHotkeyId = 1;
class HotkeyData {
int key, modifiers;
HotkeyListener listener;
public HotkeyData(int key_, int mod_, HotkeyListener l_) {
key = key_;
modifiers = mod_;
listener = l_;
}
}
class JIntellitypeHandler implements com.melloware.jintellitype.HotkeyListener {
@Override
public void onHotKey(int id) {
Debug.log(4, "Hotkey pressed");
HotkeyData data = _idCallbackMap.get(id);
HotkeyEvent e = new HotkeyEvent(data.key, data.modifiers);
data.listener.invokeHotkeyPressed(e);
}
}
@Override
public boolean _addHotkey(int keyCode, int modifiers, HotkeyListener listener) {
JIntellitype itype = null;
try {
itype = JIntellitype.getInstance();
} catch (Exception ex) {
Debug.error("WindowsHotkeyManager: JIntellitype problem: %s", ex.getMessage());
}
if (itype == null) {
System.exit(1);
}
if (_gHotkeyId == 1) {
itype.addHotKeyListener(new JIntellitypeHandler());
}
_removeHotkey(keyCode, modifiers);
int id = _gHotkeyId++;
HotkeyData data = new HotkeyData(keyCode, modifiers, listener);
_idCallbackMap.put(id, data);
itype.registerHotKey(id, translateMod(modifiers), keyCode);
return true;
}
@Override
public boolean _removeHotkey(int keyCode, int modifiers) {
for (Map.Entry<Integer, HotkeyData> entry : _idCallbackMap.entrySet()) {
HotkeyData data = entry.getValue();
if (data.key == keyCode && data.modifiers == modifiers) {
JIntellitype itype = JIntellitype.getInstance();
int id = entry.getKey();
itype.unregisterHotKey(id);
_idCallbackMap.remove(id);
return true;
}
}
return false;
}
@Override
public void cleanUp() {
JIntellitype itype = JIntellitype.getInstance();
for (Map.Entry<Integer, HotkeyData> entry : _idCallbackMap.entrySet()) {
int id = entry.getKey();
itype.unregisterHotKey(id);
}
_gHotkeyId = 1;
_idCallbackMap.clear();
itype.cleanUp();
}
private int translateMod(int mod) {
int newMod = 0;
if (1 == (mod & 1)) {
newMod += 4;
}
if (2 == (mod & 2)) {
newMod += 2;
}
if (4 == (mod & 4)) {
newMod += 8;
}
if (8 == (mod & 8)) {
newMod += 1;
}
return newMod;
}
}