/* * Copyright (c) 2010-2016, Sikuli.org, sikulix.com * Released under the MIT License. * */ package org.sikuli.basics; import org.sikuli.script.RunTime; import java.util.*; import jxgrabkey.HotkeyConflictException; import jxgrabkey.JXGrabKey; import org.sikuli.basics.Debug; import org.sikuli.script.RunTime; public class LinuxHotkeyManager extends HotkeyManager { static{ RunTime.loadLibrary("JXGrabKey"); } class HotkeyData { int key, modifiers; HotkeyListener listener; public HotkeyData(int key_, int mod_, HotkeyListener l_){ key = key_; modifiers = mod_; listener = l_; } }; class MyHotkeyHandler implements jxgrabkey.HotkeyListener{ 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); } }; private Map<Integer, HotkeyData> _idCallbackMap = new HashMap<Integer,HotkeyData >(); private int _gHotkeyId = 1; public boolean _addHotkey(int keyCode, int modifiers, HotkeyListener listener){ JXGrabKey grabKey = JXGrabKey.getInstance(); if(_gHotkeyId == 1){ grabKey.addHotkeyListener(new MyHotkeyHandler()); } _removeHotkey(keyCode, modifiers); int id = _gHotkeyId++; HotkeyData data = new HotkeyData(keyCode, modifiers, listener); _idCallbackMap.put(id, data); try{ //JXGrabKey.setDebugOutput(true); grabKey.registerAwtHotkey(id, modifiers, keyCode); }catch(HotkeyConflictException e){ Debug.error("Hot key conflicts"); return false; } return true; } 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){ JXGrabKey grabKey = JXGrabKey.getInstance(); int id = entry.getKey(); grabKey.unregisterHotKey(id); _idCallbackMap.remove(id); return true; } } return false; } public void cleanUp(){ JXGrabKey grabKey = JXGrabKey.getInstance(); for( Map.Entry<Integer, HotkeyData> entry : _idCallbackMap.entrySet() ){ int id = entry.getKey(); grabKey.unregisterHotKey(id); } _gHotkeyId = 1; _idCallbackMap.clear(); grabKey.getInstance().cleanUp(); } }