/*
 * Apple // emulator for *ix
 *
 * This software package is subject to the GNU General Public License
 * version 3 or later (your choice) as published by the Free Software
 * Foundation.
 *
 * Copyright 1994 Alexander Jean-Claude Bottema
 * Copyright 1995 Stephen Lee
 * Copyright 1997, 1998 Aaron Culliney
 * Copyright 1998, 1999, 2000 Michael Deutschmann
 * Copyright 2013-2015 Aaron Culliney
 *
 */

#include "common.h"

#ifndef A2_KEYS_H
#define A2_KEYS_H

// NOTES:
// Ugh, key mapping is a bit schizophrenic...  It was originally based on
// Linux/SVGAlib raw scancodes that were mapped to a regular or special keycode
// through a particular map that corresponded to whether a modifier key such as
// shift, control, caps, or a combo, or no modifer was also pressed.  The
// emulator makes use of both the raw scancodes and the mapped values.

// ----------------------------------------------------------------------------
// Scancodes aka "raw" values (range 0-127)

// raw key scancodes

#define SCODE_ESC       1

#define SCODE_BS        14
#define SCODE_TAB       15
#define SCODE_RET       28
#define SCODE_L_CTRL    29
#define SCODE_L_SHIFT   42
#define SCODE_R_SHIFT   54
#define SCODE_L_ALT     56
#define SCODE_CAPS      58

#define SCODE_F1        59
#define SCODE_F2        60
#define SCODE_F3        61
#define SCODE_F4        62
#define SCODE_F5        63
#define SCODE_F6        64
#define SCODE_F7        65
#define SCODE_F8        66
#define SCODE_F9        67
#define SCODE_F10       68
#define SCODE_F11       69
#define SCODE_F12       70

#define SCODE_KPAD_UL   71
#define SCODE_KPAD_U    72
#define SCODE_KPAD_UR   73
#define SCODE_KPAD_L    75
#define SCODE_KPAD_C    76
#define SCODE_KPAD_R    77
#define SCODE_KPAD_DL   79
#define SCODE_KPAD_D    80
#define SCODE_KPAD_DR   81

#define SCODE_R_CTRL    97
#define SCODE_PRNT      99
#define SCODE_R_ALT     100
#define SCODE_BRK       101

#define SCODE_HOME      102
#define SCODE_U         103
#define SCODE_PGUP      104
#define SCODE_L         105
#define SCODE_R         106
#define SCODE_END       107
#define SCODE_D         108
#define SCODE_PGDN      109
#define SCODE_INS       110
#define SCODE_DEL       111

#define SCODE_PAUSE     119

// ----------------------------------------------------------------------------
// Keycodes (range 0-255)

// Apple //e special keycodes

#define kLT     8
#define kTAB    9
#define kDN     10
#define kUP     11
#define kRET    13
#define kRT     21
#define kESC    27
#define kDEL    127

// Emulator special keycodes (> 127)

#define kF1     128
#define kF2     129
#define kF3     130
#define kF4     131
#define kF5     132
#define kF6     133
#define kF7     134
#define kF8     135
#define kF9     136
#define kF10    137
#define kF11    138
#define kF12    139

// Emulated Joystick
#define J_U     141
#define J_D     142
#define J_L     143
#define J_R     144
#define JUL     145
#define JUR     146
#define JDL     147
#define JDR     148
#define J_C     154

#define JB0     149 // Alt-L
#define JB1     150 // Alt-R
#define JB2     151 // NOTE : unused ...

#define kPAUSE  155

#define kPGUP   162 // Also : JUR
#define kHOME   163 // Also : JUL
#define kPGDN   164 // Also : JDR
#define kEND    165 // Also : JDL

// ----------------------------------------------------------------------------

extern bool caps_lock;

int c_mygetch(int block);
int c_rawkey();
#ifdef INTERFACE_CLASSIC
void c_keys_set_key(int key);
bool c_keys_is_interface_key(int key);
#endif
int c_keys_is_shifted();
int c_keys_ascii_to_scancode(int ch);
void c_keys_handle_input(int scancode, int pressed, int is_cooked);

#if INTERFACE_TOUCH
// is the touch keyboard module itself available?
extern bool (*keydriver_isTouchKeyboardAvailable)(void);

// enable/disable touch keyboard HUD element
extern void (*keydriver_setTouchKeyboardEnabled)(bool enabled);

// grant/remove ownership of touch screen
extern void (*keydriver_setTouchKeyboardOwnsScreen)(bool pwnd);

// query touch screen ownership
extern bool (*keydriver_ownsScreen)(void);

// set visibility
extern void (*keydriver_setVisibilityWhenOwnsScreen)(float inactiveAlpha, float activeAlpha);

// set visibility
extern void (*keydriver_setLowercaseEnabled)(bool enabled);

// keyboard read callback
extern void (*keydriver_keyboardReadCallback)(void);

// begin calibration mode
extern void (*keydriver_beginCalibration)(void);

// end calibration mode
extern void (*keydriver_endCalibration)(void);

// load an alternate keyboard variant
extern void (*keydriver_loadAltKbd)(const char *kbdPath);
#endif

#endif
