//
// "$Id: Fl_get_key_mac.cxx,v 1.8 2004/11/12 06:50:17 spitzak Exp $"
//
// MacOS keyboard state routines for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2003 by Bill Spitzak and others.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems to "fltk-bugs@fltk.org".
//
// Return the current state of a key. Keys are named by fltk symbols,
// which are actually X keysyms. So this has to translate to macOS
// symbols.
#include <fltk/events.h>
#include <fltk/x.h>
using namespace fltk;
// convert an FLTK (X) keysym to a MacOS symbol:
// See also the inverse converter in mac.cxx
// This table is in numeric order by FLTK symbol order for binary search:
static const struct {unsigned short vk, fltk;} vktab[] = {
{ 49, ' ' }, { 39, '\'' }, { 43, ',' }, { 27, '-' },
{ 47, '.' }, { 44, '/' },
{ 29, '0' }, { 18, '1' }, { 19, '2' }, { 20, '3' },
{ 21, '4' }, { 23, '5' }, { 22, '6' }, { 26, '7' },
{ 28, '8' }, { 25, '9' }, { 41, ';' }, { 24, '=' },
{ 0, 'A' }, { 11, 'B' }, { 8, 'C' }, { 2, 'D' },
{ 14, 'E' }, { 3, 'F' }, { 5, 'G' }, { 4, 'H' },
{ 34, 'I' }, { 38, 'J' }, { 40, 'K' }, { 37, 'L' },
{ 46, 'M' }, { 45, 'N' }, { 31, 'O' }, { 35, 'P' },
{ 12, 'Q' }, { 15, 'R' }, { 1, 'S' }, { 17, 'T' },
{ 32, 'U' }, { 9, 'V' }, { 13, 'W' }, { 7, 'X' },
{ 16, 'Y' }, { 6, 'Z' },
{ 33, '[' }, { 30, ']' }, { 50, '`' }, { 42, '|' },
{ 51, BackSpaceKey }, { 48, TabKey }, { 36, ReturnKey }, { 127, PauseKey },
{ 107, ScrollLockKey }, { 53, EscapeKey }, { 115, HomeKey }, {123, LeftKey},
{ 126, UpKey }, { 124, RightKey }, { 125, DownKey }, { 116, PageUpKey },
{ 121, PageDownKey }, { 119, EndKey }, { 113, PrintKey}, {127, InsertKey},
{ 127, fltk::MenuKey }, { 114, HelpKey }, { 71, NumLockKey },
{ 76, KeypadEnter }, { 67, MultiplyKey }, { 69, AddKey}, { 78, SubtractKey},
{ 65, DecimalKey }, { 75, DivideKey },
{ 82, Keypad0 }, { 83, Keypad1 }, { 84, Keypad2 }, { 85, Keypad3 },
{ 86, Keypad4 }, { 87, Keypad5 }, { 88, Keypad6 }, { 89, Keypad7 },
{ 91, Keypad8 }, { 92, Keypad9 }, { 81, Keypad+'=' },
{ 122, F1Key }, { 120, F2Key }, { 99, F3Key }, { 118, F4Key },
{ 96, F5Key }, { 97, F6Key }, { 98, F7Key }, { 100, F8Key },
{ 101, F9Key }, { 109, F10Key }, { 103, F11Key }, { 111, F12Key },
{ 56, LeftShiftKey }, { 56, RightShiftKey },
{ 59, LeftCtrlKey }, { 59, RightCtrlKey },
{ 57, CapsLockKey },
{ 55, LeftMetaKey }, { 55, RightMetaKey },
{ 58, LeftAltKey }, { 58, RightAltKey },
};
static unsigned short fltk2mac(unsigned fltk) {
if (fltk >= 'a' && fltk <= 'z') fltk-=('a'-'A');
int a = 0;
int b = sizeof(vktab)/sizeof(*vktab);
while (a < b) {
int c = (a+b)/2;
if (vktab[c].fltk == fltk) return vktab[c].vk;
if (vktab[c].fltk < fltk) a = c+1; else b = c;
}
return 127;
}
//: returns true, if that key was pressed during the last event
bool fltk::event_key_state(unsigned k) {
return get_key_state(k);
}
//#include <stdio.h>
//: returns true, if that key is pressed right now
bool fltk::get_key_state(unsigned k) {
KeyMap foo;
GetKeys(foo);
#ifdef MAC_TEST_FOR_KEYCODES
static int cnt = 0;
if (cnt++>1024) {
cnt = 0;
printf("%08x %08x %08x %08x\n", (ulong*)(foo)[3], (ulong*)(foo)[2], (ulong*)(foo)[1], (ulong*)(foo)[0]);
}
#endif
int i = fltk2mac(k);
unsigned char *b = (unsigned char*)foo;
return (b[i>>3]>>(i&7))&1;
}
//
// End of "$Id: Fl_get_key_mac.cxx,v 1.8 2004/11/12 06:50:17 spitzak Exp $".
//