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"
75#define PRIGHT_KEY 0x27
100#define PF1_KEY 0xFFBE
101#define PF12_KEY 0XFFC9
102#define PALT_KEY 0XFFE9
103#define PCTL_KEY 0XFFE3
104#define PSFT_KEY 0XFFE1
105#define PDEL_KEY 0XFF9F
165int platform2web3dActionKey(
int platformKey)
170 if(platformKey >= PF1_KEY && platformKey <= PF12_KEY)
171 key = platformKey - PF1_KEY + F1_KEY;
176 key = HOME_KEY;
break;
178 key = END_KEY;
break;
180 key = PGDN_KEY;
break;
182 key = PGUP_KEY;
break;
186 key = DOWN_KEY;
break;
188 key = LEFT_KEY;
break;
190 key = RIGHT_KEY;
break;
192 key = DEL_KEY;
break;
194 key = ALT_KEY;
break;
196 key = CTL_KEY;
break;
198 key = SFT_KEY;
break;
219void *Component_KeyDevice_constructor(){
224void Component_KeyDevice_init(
struct tComponent_KeyDevice *t){
227 t->prv = Component_KeyDevice_constructor();
238static void sendToSS(
struct X3D_Node *wsk,
int key,
int upDown);
239static void sendToKS(
struct X3D_Node* wsk,
int key,
int upDown);
249int KeySensorNodePresent() {
255 if (p->keySink == NULL)
return FALSE;
257 for (count=0; count < vectorSize(p->keySink); count++) {
260 node = vector_get(
struct X3D_Node*,p->keySink,count);
261 if(node && node->_nodeType == NODE_KeySensor)
262 if (X3D_KEYSENSOR(node)->enabled)
return TRUE;
263 if(node && node->_nodeType == NODE_StringSensor)
264 if (X3D_STRINGSENSOR(node)->enabled)
return TRUE;
271void addNodeToKeySensorList(
struct X3D_Node* node) {
272 if ((node->_nodeType == NODE_KeySensor) || (node->_nodeType == NODE_StringSensor)) {
276 p->keySink = newVector(
struct X3D_Node*,4);
277 vector_pushBack(
struct X3D_Node*,p->keySink,node);
282int removeNodeFromVector(
int iaction,
struct Vector *v,
struct X3D_Node *node);
283void removeNodeFromKeySensorList(
struct X3D_Node* node) {
284 if ((node->_nodeType == NODE_KeySensor) || (node->_nodeType == NODE_StringSensor)) {
287 if(p->keySink && node)
288 removeNodeFromVector(0, p->keySink, node);
292void killKeySensorNodeList() {
294 FREE_IF_NZ(p->keySink);
298 deleteVector(
struct X3D_Node*, p->keySink);
305void updateSingletonStringSensor(){
314 if (p->keySink == NULL)
return;
316 singleton = snode = other = NULL;
317 for (count=0; count < vectorSize(p->keySink); count++) {
319 printf (
"sendKeyToKeySensor, sending key %d to %d of %d\n",
key,count,p->keySinkCurMax);
321 node = vector_get(
struct X3D_Node*,p->keySink,count);
324 if (checkNode(node,__FILE__,__LINE__)) {
325 if (node->_nodeType == NODE_StringSensor ){
327 if(snode->singleton == TRUE)
328 if(snode->enabled == TRUE && snode->__oldEnabled == FALSE){
337 if(!singleton)
return;
339 for (count=0; count < vectorSize(p->keySink); count++) {
341 printf (
"sendKeyToKeySensor, sending key %d to %d of %d\n",
key,count,p->keySinkCurMax);
343 node = vector_get(
struct X3D_Node*,p->keySink,count);
346 if (checkNode(node,__FILE__,__LINE__)) {
347 if (node->_nodeType == NODE_StringSensor && node != X3D_NODE(singleton) ){
349 if(other->singleton == TRUE)
350 if(other->enabled == TRUE){
351 other->__oldEnabled = other->enabled;
352 other->enabled = FALSE;
360void sendKeyToKeySensor(
const char key,
int upDown) {
364 if (p->keySink == NULL)
return;
366 updateSingletonStringSensor();
367 for (count=0; count < vectorSize(p->keySink); count++) {
369 printf (
"sendKeyToKeySensor, sending key %d to %d of %d\n",
key,count,p->keySinkCurMax);
371 node = vector_get(
struct X3D_Node*,p->keySink,count);
374 if (checkNode(node,__FILE__,__LINE__)) {
375 if(upDown%10 == KEYDOWN || upDown%10 == KEYUP)
376 if (node->_nodeType == NODE_KeySensor ) sendToKS(node, (
int)
key&0xFFFF, upDown);
377 if(upDown == KEYPRESS)
378 if (node->_nodeType == NODE_StringSensor ) sendToSS(node, (
int)
key&0xFFFF, upDown);
386static void sendToKS(
struct X3D_Node* wsk,
int key,
int upDown) {
390 #define MYN X3D_KEYSENSOR(wsk)
396 if (MYN->__oldEnabled != MYN->enabled) {
397 MYN->__oldEnabled = MYN->enabled;
398 MARK_EVENT(X3D_NODE(MYN),offsetof (
struct X3D_KeySensor, enabled));
404 isDown = upDown%10 == KeyPress;
405 isActionKey = upDown / 10;
432 MYN->actionKeyPress = actionKey;
433 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, actionKeyPress));
435 MYN->actionKeyRelease = actionKey;
436 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, actionKeyRelease));
441 MYN->altKey = isDown;
442 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, altKey));
445 MYN->controlKey = isDown;
446 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, controlKey));
449 MYN->shiftKey = isDown;
450 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, shiftKey));
457 if ((MYN->keyPress->len != 2) || (MYN->keyRelease->len != 2)) {
458 FREE_IF_NZ(MYN->keyPress->strptr);
459 FREE_IF_NZ(MYN->keyRelease->strptr);
460 MYN->keyPress = newASCIIString (
"a");
461 MYN->keyRelease = newASCIIString (
"a");
465 MYN->keyPress->strptr[0] = (char) (
key&0xFF);
466 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, keyPress));
468 MYN->keyRelease->strptr[0] = (char) (
key&0xFF);
469 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, keyRelease));
474 MYN->isActive = isDown;
475 MARK_EVENT(X3D_NODE(MYN), offsetof (
struct X3D_KeySensor, isActive));
480static void (*fwl_clipboard_copy)(
char *str) = NULL;
481static void (*fwl_clipboard_paste)() = NULL;
486void fwl_set_clipboard_copy(
void (*fn)(
char *)){
487 fwl_clipboard_copy = fn;
489void fwl_set_clipboard_paste(
void (*fn)()){
490 fwl_clipboard_paste = fn;
492static void sendToSS(
struct X3D_Node *wsk,
int key,
int upDown) {
494 #define MYN X3D_STRINGSENSOR(wsk)
495 #define MAXSTRINGLEN 512
502 if (MYN->__oldEnabled != MYN->enabled) {
503 MYN->__oldEnabled = MYN->enabled;
506 if (!MYN->enabled)
return;
530 if (upDown != KEYPRESS)
return;
534 if (!MYN->_initialized) {
535 FREE_IF_NZ(MYN->enteredText->strptr);
536 FREE_IF_NZ(MYN->finalText->strptr);
537 MYN->enteredText->strptr = MALLOC(
char *, MAXSTRINGLEN+1);
538 MYN->finalText->strptr = MALLOC(
char *, MAXSTRINGLEN+1);
539 MYN->enteredText->len=1;
540 MYN->finalText->len=1;
541 MYN->enteredText->strptr[0] =
'\0';
542 MYN->finalText->strptr[0] =
'\0';
543 MYN->_initialized = TRUE;
544 MYN->isActive = FALSE;
548 if(fwl_clipboard_paste){
549 if (!MYN->isActive) {
550 MYN->isActive = TRUE;
553 fwl_clipboard_paste();
558 if(fwl_clipboard_copy){
560 fwl_clipboard_copy(MYN->finalText->strptr);
564 if ((MYN->deletionAllowed) && ((
key==DEL_KEY) || (
key == 8))) {
567 MYN->enteredText->len = 1;
568 MYN->enteredText->strptr[0] =
'\0';
569 MYN->isActive = TRUE;
572 if (MYN->enteredText->len > 1) {
573 MYN->enteredText->len--;
574 MYN->enteredText->strptr[MYN->enteredText->len-1] =
'\0';
578 if ((
key != RTN_KEY) && !((
key == DEL_KEY)||(
key == 8)) && (MYN->enteredText->len < MAXSTRINGLEN-1)) {
579 MYN->enteredText->strptr[MYN->enteredText->len-1] = (char)
key;
580 MYN->enteredText->strptr[MYN->enteredText->len] =
'\0';
581 MYN->enteredText->len++;
584 if (!MYN->isActive) {
585 MYN->isActive = TRUE;
596 printf (
"found return!\n");
597 printf (
"current enteredText :%s: len %d\n",MYN->enteredText->strptr, strlen(MYN->enteredText->strptr));
598 printf (
"current finalText :%s: len %d\n",MYN->finalText->strptr,strlen(MYN->finalText->strptr));
602 memcpy(MYN->finalText->strptr, MYN->enteredText->strptr, MAXSTRINGLEN);
603 MYN->finalText->len = MYN->enteredText->len;
605 printf (
"final finalText :%s: len %d\n",MYN->finalText->strptr,strlen(MYN->finalText->strptr));
613 MYN->isActive = FALSE;
617 printf (
"finalText:%s:\n",MYN->finalText->strptr);