35 #include <libFreeWRL.h>
37 #include "../vrml_parser/Structs.h"
38 #include "../main/headers.h"
39 #include "../input/EAIHelpers.h"
40 #include "../vrml_parser/CRoutes.h"
42 #include "Component_KeyDevice.h"
43 #include "ui/common.h"
68 #if defined (_MSC_VER)
70 #define PHOME_KEY 0x24
71 #define PPGDN_KEY 0x22
72 #define PLEFT_KEY 0x25
75 #define PRIGHT_KEY 0x27
76 #define PPGUP_KEY 0x21
77 #define PDOWN_KEY 0x28
83 #define PDEL_KEY 0x2E //2E is DELETE 0x08 is backspace. Problem '.' is ascii 2E.
96 #define PRIGHT_KEY 108
99 #define PF1_KEY 0xFFBE
100 #define PF12_KEY 0XFFC9
101 #define PALT_KEY 0XFFE9 //left, and 0XFFEA //0XFFE7
102 #define PCTL_KEY 0XFFE3 //left, and 0XFFE4 on right
103 #define PSFT_KEY 0XFFE1 //left, and 0XFFE2 on right
104 #define PDEL_KEY 0XFF9F //on numpad, and 0XFFFF near Insert //0x08
163 int platform2web3dActionKey(
int platformKey)
168 if(platformKey >= PF1_KEY && platformKey <= PF12_KEY)
169 key = platformKey - PF1_KEY + F1_KEY;
174 key = HOME_KEY;
break;
176 key = END_KEY;
break;
178 key = PGDN_KEY;
break;
180 key = PGUP_KEY;
break;
184 key = DOWN_KEY;
break;
186 key = LEFT_KEY;
break;
188 key = RIGHT_KEY;
break;
190 key = DEL_KEY;
break;
192 key = ALT_KEY;
break;
194 key = CTL_KEY;
break;
196 key = SFT_KEY;
break;
217 void *Component_KeyDevice_constructor(){
222 void Component_KeyDevice_init(
struct tComponent_KeyDevice *t){
225 t->prv = Component_KeyDevice_constructor();
236 static void sendToSS(
struct X3D_Node *wsk,
int key,
int upDown);
237 static void sendToKS(
struct X3D_Node* wsk,
int key,
int upDown);
247 int KeySensorNodePresent() {
253 if (p->keySink == NULL)
return FALSE;
255 for (count=0; count < vectorSize(p->keySink); count++) {
258 node = vector_get(
struct X3D_Node*,p->keySink,count);
259 if(node && node->_nodeType == NODE_KeySensor)
260 if (X3D_KEYSENSOR(node)->enabled)
return TRUE;
261 if(node && node->_nodeType == NODE_StringSensor)
262 if (X3D_STRINGSENSOR(node)->enabled)
return TRUE;
269 void addNodeToKeySensorList(
struct X3D_Node* node) {
270 if ((node->_nodeType == NODE_KeySensor) || (node->_nodeType == NODE_StringSensor)) {
274 p->keySink = newVector(
struct X3D_Node*,4);
275 vector_pushBack(
struct X3D_Node*,p->keySink,node);
280 int removeNodeFromVector(
int iaction,
struct Vector *v,
struct X3D_Node *node);
281 void removeNodeFromKeySensorList(
struct X3D_Node* node) {
282 if ((node->_nodeType == NODE_KeySensor) || (node->_nodeType == NODE_StringSensor)) {
285 if(p->keySink && node)
286 removeNodeFromVector(0, p->keySink, node);
290 void killKeySensorNodeList() {
292 FREE_IF_NZ(p->keySink);
296 deleteVector(
struct X3D_Node*, p->keySink);
303 void sendKeyToKeySensor(
const char key,
int upDown) {
307 if (p->keySink == NULL)
return;
309 for (count=0; count < vectorSize(p->keySink); count++) {
311 printf (
"sendKeyToKeySensor, sending key %d to %d of %d\n",key,count,p->keySinkCurMax);
313 node = vector_get(
struct X3D_Node*,p->keySink,count);
316 if (checkNode(node,__FILE__,__LINE__)) {
317 if(upDown%10 == KEYDOWN || upDown%10 == KEYUP)
318 if (node->_nodeType == NODE_KeySensor ) sendToKS(node, (
int)key&0xFFFF, upDown);
319 if(upDown == KEYPRESS)
320 if (node->_nodeType == NODE_StringSensor ) sendToSS(node, (
int)key&0xFFFF, upDown);
327 static void sendToKS(
struct X3D_Node* wsk,
int key,
int upDown) {
331 #define MYN X3D_KEYSENSOR(wsk)
337 if (MYN->__oldEnabled != MYN->enabled) {
338 MYN->__oldEnabled = MYN->enabled;
339 MARK_EVENT(X3D_NODE(MYN),offsetof (
struct X3D_KeySensor, enabled));
345 isDown = upDown%10 == KeyPress;
346 isActionKey = upDown / 10;
373 MYN->actionKeyPress = actionKey;
374 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, actionKeyPress));
376 MYN->actionKeyRelease = actionKey;
377 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, actionKeyRelease));
382 MYN->altKey = isDown;
383 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, altKey));
386 MYN->controlKey = isDown;
387 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, controlKey));
390 MYN->shiftKey = isDown;
391 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, shiftKey));
398 if ((MYN->keyPress->len != 2) || (MYN->keyRelease->len != 2)) {
399 FREE_IF_NZ(MYN->keyPress->strptr);
400 FREE_IF_NZ(MYN->keyRelease->strptr);
401 MYN->keyPress = newASCIIString (
"a");
402 MYN->keyRelease = newASCIIString (
"a");
406 MYN->keyPress->strptr[0] = (char) (key&0xFF);
407 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, keyPress));
409 MYN->keyRelease->strptr[0] = (char) (key&0xFF);
410 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, keyRelease));
415 MYN->isActive = isDown;
416 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, isActive));
420 static void sendToSS(
struct X3D_Node *wsk,
int key,
int upDown) {
422 #define MYN X3D_STRINGSENSOR(wsk)
423 #define MAXSTRINGLEN 512
430 if (MYN->__oldEnabled != MYN->enabled) {
431 MYN->__oldEnabled = MYN->enabled;
434 if (!MYN->enabled)
return;
458 if (upDown != KEYPRESS)
return;
462 if (!MYN->_initialized) {
463 FREE_IF_NZ(MYN->enteredText->strptr);
464 FREE_IF_NZ(MYN->finalText->strptr);
465 MYN->enteredText->strptr = MALLOC(
char *, MAXSTRINGLEN+1);
466 MYN->finalText->strptr = MALLOC(
char *, MAXSTRINGLEN+1);
467 MYN->enteredText->len=1;
468 MYN->finalText->len=1;
469 MYN->enteredText->strptr[0] =
'\0';
470 MYN->finalText->strptr[0] =
'\0';
471 MYN->_initialized = TRUE;
472 MYN->isActive = FALSE;
476 if ((MYN->deletionAllowed) && (key==DEL_KEY)) {
477 if (MYN->enteredText->len > 1) {
478 MYN->enteredText->len--;
479 MYN->enteredText->strptr[MYN->enteredText->len-1] =
'\0';
483 if ((key != RTN_KEY) && (key != DEL_KEY) && (MYN->enteredText->len < MAXSTRINGLEN-1)) {
484 MYN->enteredText->strptr[MYN->enteredText->len-1] = (char)key;
485 MYN->enteredText->strptr[MYN->enteredText->len] =
'\0';
486 MYN->enteredText->len++;
489 if (!MYN->isActive) {
490 MYN->isActive = TRUE;
501 printf (
"found return!\n");
502 printf (
"current enteredText :%s:\n",MYN->enteredText->strptr);
503 printf (
"current finalText :%s:\n",MYN->finalText->strptr);
506 memcpy(MYN->finalText->strptr, MYN->enteredText->strptr, MAXSTRINGLEN);
507 MYN->finalText->len = MYN->enteredText->len;
508 MYN->enteredText->len=1;
509 MYN->enteredText->strptr[0] =
'\0';
513 MYN->isActive = FALSE;
517 printf (
"finalText:%s:\n",MYN->finalText->strptr);