--- /dev/null
+/* stdint.h: ISO/IEC 9899:1999 7.18 Integer types.
+
+ Placed in the public domain by John Marshall.
+
+ This file is part of prc-tools, but is not licensed in the same way as the
+ majority of prc-tools. The contents of this file are in the public domain.
+
+ One particular consequence of this is that you may use this header file
+ in Palm OS executables without concern that doing so by itself causes
+ the resulting executable to be covered by any particular license, such as
+ the GNU General Public License that covers much of the rest of prc-tools.
+ However this does not invalidate any other reasons why the executable
+ might be covered by such a license (such as the use of functions from
+ other header files that are so-covered). */
+
+#ifndef _PRC_TOOLS_STDINT_H
+#define _PRC_TOOLS_STDINT_H
+
+/* 7.18.1 Integer types. */
+
+typedef signed char int8_t, int_least8_t, int_fast8_t;
+typedef unsigned char uint8_t, uint_least8_t, uint_fast8_t;
+typedef signed short int int16_t, int_least16_t;
+typedef unsigned short int uint16_t, uint_least16_t;
+typedef signed int int_fast16_t;
+typedef unsigned int uint_fast16_t;
+typedef signed long int int32_t, int_least32_t, int_fast32_t;
+typedef unsigned long int uint32_t, uint_least32_t, uint_fast32_t;
+typedef signed long long int int64_t, int_least64_t, int_fast64_t;
+typedef unsigned long long int uint64_t, uint_least64_t, uint_fast64_t;
+
+typedef signed long int intptr_t;
+typedef unsigned long int uintptr_t;
+
+typedef signed long long int intmax_t;
+typedef unsigned long long int uintmax_t;
+
+/* 7.18.2 Limits of specified-width integer types. */
+
+#if !defined __cplusplus || defined __STDC_LIMIT_MACROS
+
+#define INT8_MIN (-128)
+#define INT8_MAX (+127)
+#define UINT8_MAX (+255)
+
+#define INT16_MIN (-32767 - 1)
+#define INT16_MAX (+32767)
+#define UINT16_MAX (+65535U)
+
+#define INT32_MIN (-2147483647L - 1)
+#define INT32_MAX (+2147483647L)
+#define UINT32_MAX (+4294967295UL)
+
+#define INT64_MIN (-9223372036854775807LL - 1)
+#define INT64_MAX (+9223372036854775807LL)
+#define UINT64_MAX (+18446744073709551615ULL)
+
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+
+#define INT_LEAST64_MIN INT64_MIN
+#define INT_LEAST64_MAX INT64_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
+
+#define INT_FAST8_MIN INT8_MIN
+#define INT_FAST8_MAX INT8_MAX
+#define UINT_FAST8_MAX UINT8_MAX
+
+#if __INT_MAX__ == 32767
+#define INT_FAST16_MIN INT16_MIN
+#define INT_FAST16_MAX INT16_MAX
+#define UINT_FAST16_MAX UINT16_MAX
+#else
+#define INT_FAST16_MIN INT32_MIN
+#define INT_FAST16_MAX INT32_MAX
+#define UINT_FAST16_MAX UINT32_MAX
+#endif
+
+#define INT_FAST32_MIN INT32_MIN
+#define INT_FAST32_MAX INT32_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+
+#define INT_FAST64_MIN INT64_MIN
+#define INT_FAST64_MAX INT64_MAX
+#define UINT_FAST64_MAX UINT64_MAX
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+
+#define INTMAX_MIN INT64_MIN
+#define INTMAX_MAX INT64_MAX
+#define UINTMAX_MAX UINT64_MAX
+
+/* 7.18.3 Limits of other integer types [no sig_atomic_t, wchar_t, wint_t]. */
+
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+
+#define SIZE_MAX UINT32_MAX
+
+#endif
+
+/* 7.18.4 Macros for integer constants. */
+
+#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
+
+#define INT8_C(n) n
+#define UINT8_C(n) n ## U
+#define INT16_C(n) n
+#define UINT16_C(n) n ## U
+#define INT32_C(n) n ## L
+#define UINT32_C(n) n ## UL
+#define INT64_C(n) n ## LL
+#define UINT64_C(n) n ## ULL
+
+#define INTMAX_C(n) n ## LL
+#define UINTMAX_C(n) n ## ULL
+
+#endif
+
+#endif
FrmDrawForm(FrmGetActiveForm());
}
-
+static unsigned char altsym_symbol_map[32] = {
+ /* SP */ ' ', /* ! */ '|', /* " */ '~', /* # */ '{',
+ /* $ */ '%', /* % */ '%', /* & */ '&', /* ' */ '`',
+ /* ( */ '[', /* ) */ ']', /* * */ '^', /* + */ '=',
+ /* , */ '<', /* - */ '_', /* . */ '>', /* / */ '\\',
+ /* 0 */ ')', /* 1 */ '!', /* 2 */ '@', /* 3 */ '#',
+ /* 4 */ '$', /* 5 */ '%', /* 6 */ '^', /* 7 */ '&',
+ /* 8 */ '*', /* 9 */ '(', /* : */ ';', /* ; */ ':',
+ /* < */ ',', /* = */ '+', /* > */ '.', /* ? */ '}'
+};
+
+static unsigned char altsym_treo_map[26] = {
+ /* A */ '&', /* B */ '{', /* C */ '*', /* D */ '$', /* E */ '!',
+ /* F */ '%', /* G */ '^', /* H */ '%', /* I */ '&', /* J */ '|',
+ /* K */ ';', /* L */ '`', /* M */ '<', /* N */ '}', /* O */ '~',
+ /* P */ '%', /* Q */ '\\', /* R */ '@', /* S */ '_', /* T */ '#',
+ /* U */ ']', /* V */ '(', /* W */ '=', /* X */ '&', /* Y */ '[',
+ /* Z */ '^'
+};
+
+static unsigned char altsym_tungsten_map[26] = {
+ /* A */ ';', /* B */ '|', /* C */ ']', /* D */ '=', /* E */ '#',
+ /* F */ '_', /* G */ '^', /* H */ '-', /* I */ '*', /* J */ '~',
+ /* K */ '`', /* L */ '&', /* M */ '}', /* N */ '<', /* O */ '(',
+ /* P */ ')', /* Q */ '!', /* R */ '$', /* S */ '\\', /* T */ '%',
+ /* U */ '&', /* V */ '{', /* W */ '@', /* X */ '[', /* Y */ '^',
+ /* Z */ '%'
+
+};
+
+static unsigned char altsym_character(unsigned char c)
+{
+ if (c == '@') return '&';
+ if (c == '_') return '-';
+ if (c >= 0x20 && c < 0x40) return altsym_symbol_map[c - 0x20];
+ if (deviceTreo6x0) {
+ if (c >= 'A' && c <= 'Z') return altsym_treo_map[c - 'A'];
+ if (c >= 'a' && c <= 'z') return altsym_treo_map[c - 'a'];
+ } else {
+ // for now, use tungsten layout on all but treo
+ // note there is currently no way to get altPressed on the tungsten
+ if (c >= 'A' && c <= 'Z') return altsym_tungsten_map[c - 'A'];
+ if (c >= 'a' && c <= 'z') return altsym_tungsten_map[c - 'a'];
+ }
+ return c;
+}
static unsigned char control_character(unsigned char c)
{
return c;
}
+static struct {
+ Boolean pressed; // active - affects characters
+ Boolean locked; // locked - does not reset on keypress
+ int gsiState; // indicator to display - 0=off, 1=down, 2=lock
+ int onPress; // new state if button is pressed
+ int onRelease; // new state if button is released
+} altStateTable[] = {
+ { 0, 0, 0, 1, 0 }, // state 0 - clear
+ { 1, 1, 1, 7, 3 }, // state 1 - held
+ { 1, 1, 1, 1, 0 }, // state 2 - held+
+ { 1, 0, 1, 4, 3 }, // state 3 - set
+ { 1, 1, 1, 6, 5 }, // state 4 - held set
+ { 1, 1, 2, 6, 5 }, // state 5 - locked
+ { 1, 1, 1, 0, 0 }, // state 6 - locked held
+ { 1, 1, 2, 0, 0 }, // state 7 - double-press
+ { 0, 0, 0, 1, 8 }, // state 8 - locked, masked by graffiti
+};
+#define NUM_ALTSTATES (sizeof(altStateTable)/sizeof(altStateTable[0]))
+
// ctrl or shift locked down (i.e. don't release after sending a key)
static Boolean ctrlLocked = 0;
static Boolean shiftLocked = 0;
+static Boolean altPressed = 0;
+static Boolean altLocked = 0;
+static int altState = 0;
+static Boolean altSavedCapsLock = 0;
+static Boolean altSavedNumLock = 0;
+
static Boolean jogPressed = 0;
static Boolean jogPressedCtrl = 0;
static Boolean jogPressedMeta = 0;
static Boolean keyPressedDuringJogPress = 0;
static Boolean jogMovedDuringJogPress = 0;
+static Boolean scrollByPage = 0;
static Boolean CtrlPressed(void)
else shiftLocked = 0;
}
+static void AltSetState(int newstate)
+{
+ UInt16 tst;
+ Boolean ast;
+
+ if (newstate < 0 || newstate > NUM_ALTSTATES) return;
+
+ altPressed = altStateTable[newstate].pressed;
+ altLocked = altStateTable[newstate].locked;
+ if (altStateTable[newstate].gsiState != altStateTable[altState].gsiState) {
+ switch (altStateTable[newstate].gsiState) {
+ case 0: // not active; display GSI
+ GrfSetState(altSavedCapsLock, altSavedNumLock, 0);
+ if (PrvObjectVisibleByID(TerminalCtrlButtonID))
+ {
+ PrvHideObjectByID(TerminalAltPressedBitmapID);
+ PrvHideObjectByID(TerminalAltLockedBitmapID);
+ }
+ GsiEnable(1);
+ break;
+
+ case 1: // active
+ GrfGetState(&altSavedCapsLock, &altSavedNumLock, &tst, &ast);
+ GrfSetState(0, 0, 0);
+ GsiEnable(0);
+ if (PrvObjectVisibleByID(TerminalCtrlButtonID))
+ {
+ PrvHideObjectByID(TerminalAltLockedBitmapID);
+ PrvShowObjectByID(TerminalAltPressedBitmapID);
+ }
+ break;
+
+ case 2: // locked
+ altSavedCapsLock = altSavedNumLock = 0;
+ GrfSetState(0, 0, 0);
+ GsiEnable(0);
+ if (PrvObjectVisibleByID(TerminalCtrlButtonID))
+ {
+ PrvHideObjectByID(TerminalAltPressedBitmapID);
+ PrvShowObjectByID(TerminalAltLockedBitmapID);
+ }
+ break;
+ }
+ }
+
+ altState = newstate;
+}
+
+static void AltPress(Boolean down)
+{
+ if (down)
+ AltSetState(altStateTable[altState].onPress);
+ else
+ AltSetState(altStateTable[altState].onRelease);
+}
+
static void MetaPress(Boolean down, Boolean lockDown)
{
// nothing here yet
if (!shiftLocked && !PrvGetControlValue(TerminalTABCCapsButtonID)) {
ShiftPress(0, 0);
}
+ if (altState == 1)
+ AltSetState(2);
+ else if (!altLocked && altState != 8)
+ AltSetState(0);
}
titleShown = true;
ctrlLocked = 0;
shiftLocked = 0;
+ altPressed = 0;
+ altLocked = 0;
+ altState = 0;
+ altSavedCapsLock = altSavedNumLock = 0;
jogPressed = 0;
jogPressedCtrl = 0;
jogPressedMeta = 0;
keyPressedDuringJogPress = 0;
jogMovedDuringJogPress = 0;
+ scrollByPage = 0;
// check for device-specific hacks and features
CheckDevice();
PrvGetObjectIndexByID(TerminalTextGadgetID),
VT100EventHandler);
SetTitleBar(! PrefsGetInt(prefHideTitleBar, 0));
+
+ PrvHideObjectByID(TerminalAltPressedBitmapID);
+ PrvHideObjectByID(TerminalAltLockedBitmapID);
+ GsiEnable(1);
{
int top = PrefsGetInt(prefTopPane, topNone);
if (c == 10) c = 13;
// remap DEL or BS based on backspace configuration
if (c == 8 || c == 127) c = Backspace();
+ if (altPressed) c = altsym_character(c);
+
// remap ` based on backquote configuration
if (c == '`') c = Backquote();
}
return true;
}
- else if (chr == vchrThumbWheelUp || chr == vchrJogUp) {
+ else if (chr == 0x1609 &&
+ !(e->data.keyDown.modifiers & autoRepeatKeyMask)) {
+ AltPress(1);
+ return true;
+ }
+ else if (chr == 0x161b) {
+ // Treo volume up -> scroll up
+ if (ss) {
+ if (scrollByPage)
+ ssh_scroll(ss, -(ssh_visible_height(ss)-1));
+ else
+ ssh_scroll(ss, -1);
+ }
+ return true;
+ }
+ else if (chr == 0x161c) {
+ // Treo volume down -> scroll down
+ if (ss) {
+ if (scrollByPage)
+ ssh_scroll(ss, (ssh_visible_height(ss)-1));
+ else
+ ssh_scroll(ss, 1);
+ }
+ return true;
+ }
+ else if (chr == 0x161f) {
+ // Treo side button -> toggle scroll mode
+ scrollByPage = !scrollByPage;
+ return true;
+ }
+ else if (chr == vchrThumbWheelUp || chr == vchrJogUp) {
// scroll up (fixme how far?)
if (ss) ssh_scroll(ss, -1);
return true;
return false;
}
+ case keyHoldEvent:
+ if (e->data.keyHold.chr == 0x1609) {
+ // Treo alt key, held down
+ if (altState == 1)
+ AltSetState(2);
+ return true;
+ }
+ return false;
+
+ case keyUpEvent:
+ if (e->data.keyUp.chr == 0x1609) {
+ // Treo alt key, released
+ AltPress(0);
+ return true;
+ }
+ return false;
+
case winExitEvent:
if ((FormPtr)e->data.winExit.exitWindow ==
FrmGetFormPtr(TerminalFormID))
static Boolean IsStealableVchr(EventPtr e)
{
+ if (e->data.keyDown.chr == 0x1609) return true; // treo alt
+ if (e->data.keyDown.chr == 0x161b) return true; // volume up
+ if (e->data.keyDown.chr == 0x161c) return true; // volume down
if (e->data.keyDown.chr == vchrKeyboard) return true;
if (e->data.keyDown.chr == vchrKeyboardAlpha) return true;
if (e->data.keyDown.chr == vchrKeyboardNumeric) return true;
// Terminal form wants to catch some key events before the system uses them:
// - keyboard vchrs to display its own keyboard
+// - Treo alt key for second symbol shift level
// - Sony jog wheel and Treo 5-way vchrs
Boolean TerminalFormStealEvent(EventPtr e)
{
if (FrmGetActiveFormID() != TerminalFormID) return false;
if (e->eType != keyDownEvent) return false;
+ // Special processing per event type
+ switch (e->eType) {
+ case keyDownEvent:
+ // keycode debugging
+ if (TerminalWindowActive) {
+ FieldPtr displayField;
+ char keytext[40];
+ Boolean caps, num, autoshift;
+ UInt16 shift;
+
+ GrfGetState(&caps, &num, &shift, &autoshift);
+ sprintf(keytext, "+c:%04x k:%04x m:%04x %s%s%s%d",
+ e->data.keyDown.chr, e->data.keyDown.keyCode,
+ e->data.keyDown.modifiers,
+ caps ? "C" : "-", num ? "N" : "-",
+ autoshift ? "N" : "-", shift);
+
+ displayField = PrvGetObjectByID(TerminalHostFieldID);
+ PrvSetFieldToValue(displayField, keytext);
+ FldDrawField(displayField);
+ }
+
+ // any keyboard modifier press turns off alt
+ if (e->data.keyDown.chr == 0x160d) {
+ if (altState == 5 || altState == 8)
+ AltSetState(8);
+ else
+ AltSetState(0);
+ }
+
+ // steal some key-down events for the form event handler
+ break;
+
+ case keyHoldEvent:
+ // keycode debugging
+ if (TerminalWindowActive) {
+ FieldPtr displayField;
+ char keytext[40];
+ Boolean caps, num, autoshift;
+ UInt16 shift;
+
+ GrfGetState(&caps, &num, &shift, &autoshift);
+ sprintf(keytext, "*c:%04x k:%04x m:%04x %s%s%s%d",
+ e->data.keyDown.chr, e->data.keyDown.keyCode,
+ e->data.keyDown.modifiers,
+ caps ? "C" : "-", num ? "N" : "-",
+ autoshift ? "N" : "-", shift);
+
+ displayField = PrvGetObjectByID(TerminalHostFieldID);
+ PrvSetFieldToValue(displayField, keytext);
+ FldDrawField(displayField);
+ }
+
+ // steal some key-hold events for the form event handler
+ break;
+
+ case keyUpEvent:
+ // keycode debugging
+ if (TerminalWindowActive) {
+ FieldPtr displayField;
+ char keytext[40];
+ Boolean caps, num, autoshift;
+ UInt16 shift;
+
+ GrfGetState(&caps, &num, &shift, &autoshift);
+ sprintf(keytext, "-c:%04x k:%04x m:%04x %s%s%s%d",
+ e->data.keyUp.chr, e->data.keyUp.keyCode,
+ e->data.keyUp.modifiers,
+ caps ? "C" : "-", num ? "N" : "-",
+ autoshift ? "N" : "-", shift);
+
+ displayField = PrvGetObjectByID(TerminalHostFieldID);
+ PrvSetFieldToValue(displayField, keytext);
+ FldDrawField(displayField);
+ }
+
+ // steal some key-up events for the form event handler
+ break;
+
+ default:
+ // don't steal other events
+ return false;
+ }
+
// steal some virtual chars anytime
if (EvtKeydownIsVirtual(e) && IsStealableVchr(e)) return true;
return false;
}
+// Special handling _after_ an event is processed
+void TerminalFormPostEvent(EventPtr e)
+{
+ // don't process if terminal is not active
+ if (FrmGetActiveFormID() != TerminalFormID) return;
+
+ // Special processing per event type
+ switch (e->eType) {
+ case keyUpEvent:
+ // if a keyboard modifier was released, update alt state
+ if (e->data.keyDown.chr == 0x160d) {
+ Boolean caps, num, autoshift;
+ UInt16 shift;
+
+ GrfGetState(&caps, &num, &shift, &autoshift);
+ if (caps || num) {
+ // any lock state resets saved alt lock
+ AltSetState(0);
+ } else if (altState == 8 && !shift) {
+ // no modifiers still down; restore alt lock state
+ AltSetState(5);
+ }
+ }
+ default:
+ }
+}
// Resize the terminal form
void TerminalFormResize(FormPtr frmP, Int16 dh, Int16 dv)