All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sikuli.basics.MacHotkeyManager Maven / Gradle / Ivy

/*
 * Copyright 2010-2014, Sikuli.org, sikulix.com
 * Released under the MIT License.
 *
 * modified RaiMan 2013
 */
package org.sikuli.basics;

import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import org.sikuli.script.RunTime;

// http://lists.apple.com/archives/mac-games-dev/2001/Sep/msg00113.html
// full key table: http://www.mactech.com/articles/mactech/Vol.04/04.12/Macinkeys/
// modifiers code: http://www.mactech.com/macintosh-c/chap02-1.html
public class MacHotkeyManager extends HotkeyManager {

  static final int CARBON_MASK_CMD = 0x0100;
  static final int CARBON_MASK_SHIFT = 0x0200;
  static final int CARBON_MASK_OPT = 0x0800;
  static final int CARBON_MASK_CTRL = 0x1000;

  static {
    RunTime.loadLibrary("MacHotkeyManager");
  }

  @Override
  public boolean _addHotkey(int keyCode, int modifiers, HotkeyListener listener) {
    int ckey = convertToCarbonKey(keyCode);
    int cmod = convertToCarbonModifiers(modifiers);
    boolean ret = installGlobalHotkey(keyCode, modifiers, ckey, cmod, listener);
    return ret;
  }

  @Override
  public boolean _removeHotkey(int keyCode, int modifiers) {
    int ckey = convertToCarbonKey(keyCode);
    int cmod = convertToCarbonModifiers(modifiers);
    return uninstallGlobalHotkey(ckey, cmod);
  }

  private native boolean installGlobalHotkey(int jKey, int jMod, int keyCode, int modifiers, HotkeyListener listener);

  private native boolean uninstallGlobalHotkey(int keyCode, int modifiers);

  @Override
  public native void cleanUp();

  private int convertToCarbonModifiers(int mod) {
    int cmod = 0;
    if ((mod & InputEvent.SHIFT_MASK) != 0) {
      cmod |= CARBON_MASK_SHIFT;
    }
    if ((mod & InputEvent.META_MASK) != 0) {
      cmod |= CARBON_MASK_CMD;
    }
    if ((mod & InputEvent.ALT_MASK) != 0) {
      cmod |= CARBON_MASK_OPT;
    }
    if ((mod & InputEvent.CTRL_MASK) != 0) {
      cmod |= CARBON_MASK_CTRL;
    }
    return cmod;
  }

  private int convertToCarbonKey(int keycode) {
    switch (keycode) {
      case KeyEvent.VK_BACK_SPACE:
        return 0x33;
      case KeyEvent.VK_TAB:
        return 0x30;
      case KeyEvent.VK_CLEAR:
        return 0x47;
      case KeyEvent.VK_ENTER:
        return 0x24;
      case KeyEvent.VK_SHIFT:
        return 0xF0;
      case KeyEvent.VK_CONTROL:
        return 0xF1;
      case KeyEvent.VK_META:
        return 0xF2;
      case KeyEvent.VK_PAUSE:
        return 0x71; // = F15
      case KeyEvent.VK_ESCAPE:
        return 0x35;
      case KeyEvent.VK_SPACE:
        return 0x31;
      case KeyEvent.VK_OPEN_BRACKET:
        return 0x21;
      case KeyEvent.VK_BACK_SLASH:
        return 0x2A;
      case KeyEvent.VK_CLOSE_BRACKET:
        return 0x1E;
      case KeyEvent.VK_SLASH:
        return 0x2C;
      case KeyEvent.VK_PERIOD:
        return 0x2F;
      case KeyEvent.VK_COMMA:
        return 0x2B;
      case KeyEvent.VK_SEMICOLON:
        return 0x29;
      case KeyEvent.VK_END:
        return 0x77;
      case KeyEvent.VK_HOME:
        return 0x73;
      case KeyEvent.VK_LEFT:
        return 0x7B;
      case KeyEvent.VK_UP:
        return 0x7E;
      case KeyEvent.VK_RIGHT:
        return 0x7C;
      case KeyEvent.VK_DOWN:
        return 0x7D;
      case KeyEvent.VK_PRINTSCREEN:
        return 0x69; // F13
      case KeyEvent.VK_INSERT:
        return 0x72; // help
      case KeyEvent.VK_DELETE:
        return 0x75;
      case KeyEvent.VK_HELP:
        return 0x72;
      case KeyEvent.VK_0:
        return 0x1D;
      case KeyEvent.VK_1:
        return 0x12;
      case KeyEvent.VK_2:
        return 0x13;
      case KeyEvent.VK_3:
        return 0x14;
      case KeyEvent.VK_4:
        return 0x15;
      case KeyEvent.VK_5:
        return 0x17;
      case KeyEvent.VK_6:
        return 0x16;
      case KeyEvent.VK_7:
        return 0x1A;
      case KeyEvent.VK_8:
        return 0x1C;
      case KeyEvent.VK_9:
        return 0x19;
      case KeyEvent.VK_MINUS:
        return 0x1B;
      case KeyEvent.VK_EQUALS:
        return 0x18;
      case KeyEvent.VK_A:
        return 0x00;
      case KeyEvent.VK_B:
        return 0x0B;
      case KeyEvent.VK_C:
        return 0x08;
      case KeyEvent.VK_D:
        return 0x02;
      case KeyEvent.VK_E:
        return 0x0E;
      case KeyEvent.VK_F:
        return 0x03;
      case KeyEvent.VK_G:
        return 0x05;
      case KeyEvent.VK_H:
        return 0x04;
      case KeyEvent.VK_I:
        return 0x22;
      case KeyEvent.VK_J:
        return 0x26;
      case KeyEvent.VK_K:
        return 0x28;
      case KeyEvent.VK_L:
        return 0x25;
      case KeyEvent.VK_M:
        return 0x2E;
      case KeyEvent.VK_N:
        return 0x2D;
      case KeyEvent.VK_O:
        return 0x1F;
      case KeyEvent.VK_P:
        return 0x23;
      case KeyEvent.VK_Q:
        return 0x0C;
      case KeyEvent.VK_R:
        return 0x0F;
      case KeyEvent.VK_S:
        return 0x01;
      case KeyEvent.VK_T:
        return 0x11;
      case KeyEvent.VK_U:
        return 0x20;
      case KeyEvent.VK_V:
        return 0x09;
      case KeyEvent.VK_W:
        return 0x0D;
      case KeyEvent.VK_X:
        return 0x07;
      case KeyEvent.VK_Y:
        return 0x10;
      case KeyEvent.VK_Z:
        return 0x06;
      case KeyEvent.VK_NUMPAD0:
        return 0x52;
      case KeyEvent.VK_NUMPAD1:
        return 0x53;
      case KeyEvent.VK_NUMPAD2:
        return 0x54;
      case KeyEvent.VK_NUMPAD3:
        return 0x55;
      case KeyEvent.VK_NUMPAD4:
        return 0x56;
      case KeyEvent.VK_NUMPAD5:
        return 0x57;
      case KeyEvent.VK_NUMPAD6:
        return 0x58;
      case KeyEvent.VK_NUMPAD7:
        return 0x59;
      case KeyEvent.VK_NUMPAD8:
        return 0x5B;
      case KeyEvent.VK_NUMPAD9:
        return 0x5C;
      case KeyEvent.VK_MULTIPLY:
        return 0x43;
      case KeyEvent.VK_ADD:
        return 0x45;
      case KeyEvent.VK_SEPARATOR:
        return 0xFF; // not supported with Button or GetKeys
      case KeyEvent.VK_SUBTRACT:
        return 0x4E;
      case KeyEvent.VK_DECIMAL:
        return 0x41;
      case KeyEvent.VK_DIVIDE:
        return 0x4B;
      case KeyEvent.VK_F1:
        return 0x7A;
      case KeyEvent.VK_F2:
        return 0x7B;
      case KeyEvent.VK_F3:
        return 0x63;
      case KeyEvent.VK_F4:
        return 0x76;
      case KeyEvent.VK_F5:
        return 0x60;
      case KeyEvent.VK_F6:
        return 0x61;
      case KeyEvent.VK_F7:
        return 0x62;
      case KeyEvent.VK_F8:
        return 0x64;
      case KeyEvent.VK_F9:
        return 0x65;
      case KeyEvent.VK_F10:
        return 0x6D;
      case KeyEvent.VK_F11:
        return 0x67;
      case KeyEvent.VK_F12:
        return 0x6F;
      case KeyEvent.VK_F13:
        return 0x69;
      case KeyEvent.VK_F14:
        return 0x6B;
      case KeyEvent.VK_F15:
        return 0x71;
      case KeyEvent.VK_NUM_LOCK:
        return 0x47;
      default:
        return 0xFF;
    }

  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy