void TCOD_noteye_check() { if(!tnoteye.mode) return; TCOD_noteye_init(); if(delayed) TCOD_noteye_sendscreen(tbuffer); int i; for(i=0; i < MAXCLIENT; i++) if(client[i] == NULL) break; if(i < MAXCLIENT && i < tnoteye.maxClients) { TCPsocket skt = SDLNet_TCP_Accept(server->socket); if(skt) { client[i] = new NTCPStream(skt); client[i]->writeStr("NotEye stream"); client[i]->writeInt(NOTEYEVER); client[i]->writeStr(tnoteye.name); if(scr) { TCOD_noteye_render(); client[i]->writeInt(nepScreen); client[i]->writeScr(scr); client[i]->flush(); } } } for(int i=0; i < tnoteye.maxClients; i++) while(client[i] && client[i]->ready()) { if(client[i]->eof()) { delete client[i]; client[i] = NULL; } else { int nep = client[i]->readInt(); if(nep == nepKey) { SDL_Event ev; SDL_KeyboardEvent& kev(ev.key); kev.keysym.sym = SDLKey(client[i]->readInt()); kev.keysym.mod = SDLMod(client[i]->readInt()); ev.type = client[i]->readInt() == evKeyDown ? SDL_KEYDOWN : SDL_KEYUP; kev.keysym.unicode = client[i]->readInt(); SDL_PushEvent(&ev); } else if(nep == nepMouse) { tnoteye.x = client[i]->readInt(); tnoteye.y = client[i]->readInt(); tnoteye.state = client[i]->readInt(); tnoteye.active = true; } else if(nep == nepMessage) { string s = client[i]->readStr(); TCOD_noteye_writestr(s.c_str()); } else fprintf(stderr, "Unknown NEP: %d\n", nep); } } }
void InternalProcess::sendKey(int symbol, int mod, bool down, int unicode) { int neve = (eve + 1) % IBUFSIZE; if(neve != evs) { SDL_Event *ev = new SDL_Event; ev->type = down ? SDL_KEYDOWN : SDL_KEYUP; SDL_KeyboardEvent& kev(ev->key); kev.keysym.sym = (SDLKey) symbol; kev.keysym.mod = (SDLMod) mod; kev.keysym.unicode = unicode; evbuf[eve] = ev; eve = neve; // todo: free them if unused } }
int noteye_eventtokey(SDL_Event *ev) { SDL_KeyboardEvent& kev(ev->key); // int mod = kev.keysym.mod; if(ev->type == SDL_TEXTINPUT) return kev.keysym.sym; bool down = ev->type == SDL_KEYDOWN; int retkey = 0; if(!down) return 0; int sym = kev.keysym.sym; #define Snd(key, x) else if(sym == SDLK_ ## key) retkey = x; #define SndKP(key, x) else if(sym == SDLK_KP_ ## key) retkey = x; if(sym == SDLK_LSHIFT) return 0; else if(sym == SDLK_RSHIFT) return 0; else if(sym == SDLK_LCTRL) return 0; else if(sym == SDLK_RCTRL) return 0; else if(sym == SDLK_LALT) return 0; else if(sym == SDLK_RALT) return 0; else if(sym == SDLK_CAPSLOCK) return 0; else if(sym == SDLK_RETURN) retkey = '\n'; Snd(KP_ENTER, '\n') Snd(BACKSPACE, '\b') Snd(TAB, '\t') Snd(F1, KEY_F0+1) Snd(F2, KEY_F0+2) Snd(F3, KEY_F0+3) Snd(F4, KEY_F0+4) Snd(F5, KEY_F0+5) Snd(F6, KEY_F0+6) Snd(F7, KEY_F0+7) Snd(F8, KEY_F0+8) Snd(F9, KEY_F0+9) Snd(F10, KEY_F0+10) Snd(F11, KEY_F0+11) Snd(F12, KEY_F0+12) // linux terminal Snd(UP, D_UP) Snd(DOWN, D_DOWN) Snd(RIGHT, D_RIGHT) Snd(LEFT, D_LEFT) Snd(HOME, D_HOME) Snd(END, D_END) Snd(PAGEUP, D_PGUP) Snd(PAGEDOWN, D_PGDN) SndKP(8, D_UP) SndKP(2, D_DOWN) SndKP(6, D_RIGHT) SndKP(4, D_LEFT) SndKP(7, D_HOME) SndKP(1, D_END) SndKP(9, D_PGUP) SndKP(3, D_PGDN) SndKP(5, D_CTR) #undef Snd #undef SndKP if(sym > 0 && sym < 32) return sym; if(sym >= 'a' && sym <= 'z' && (ev->key.keysym.mod & (KMOD_LCTRL|KMOD_RCTRL))) return sym - 96; // added by JT: maybe we need to do this differently, but it seems to work if(sym >= 'a' && sym <= 'z' && (ev->key.keysym.mod & KMOD_LALT)) return sym; // use this for NotEye specials if((sym >= 1024 && sym < 0x10000000) || sym < 0) return sym; return retkey; }
int noteye_eventtokey(SDL_Event *ev) { SDL_KeyboardEvent& kev(ev->key); int symbol = kev.keysym.sym; int mod = kev.keysym.mod; bool down = ev->type == SDL_KEYDOWN; int unicode = kev.keysym.unicode; int retkey; if(!down) return 0; int sym = symbol; char ac = unicode; #define Snd(key, x) else if(sym == SDLK_ ## key) retkey = x; if(sym == SDLK_LSHIFT) return 0; else if(sym == SDLK_RSHIFT) return 0; else if(sym == SDLK_LCTRL) return 0; else if(sym == SDLK_RCTRL) return 0; else if(sym == SDLK_LALT) return 0; else if(sym == SDLK_RALT) return 0; else if(sym == SDLK_CAPSLOCK) return 0; else if(sym == SDLK_RETURN) retkey = '\n'; Snd(BACKSPACE, '\b') Snd(TAB, '\t') Snd(F1, KEY_F0+1) Snd(F2, KEY_F0+2) Snd(F3, KEY_F0+3) Snd(F4, KEY_F0+4) Snd(F5, KEY_F0+5) Snd(F6, KEY_F0+6) Snd(F7, KEY_F0+7) Snd(F8, KEY_F0+8) Snd(F9, KEY_F0+9) Snd(F10, KEY_F0+10) Snd(F11, KEY_F0+11) Snd(F12, KEY_F0+12) // linux terminal Snd(UP, D_UP) Snd(DOWN, D_DOWN) Snd(RIGHT, D_RIGHT) Snd(LEFT, D_LEFT) Snd(HOME, D_HOME) Snd(END, D_END) Snd(PAGEUP, D_PGUP) Snd(PAGEDOWN, D_PGDN) Snd(KP8, D_UP) Snd(KP2, D_DOWN) Snd(KP6, D_RIGHT) Snd(KP4, D_LEFT) Snd(KP7, D_HOME) Snd(KP1, D_END) Snd(KP9, D_PGUP) Snd(KP3, D_PGDN) Snd(KP5, D_CTR) #undef Snd else retkey = ac; return retkey; }
void AQWebApplication::handleWebEvent(const QString &msgEvent) { QStringList args(QStringList::split(AQ_MSG_SEP, msgEvent, true)); AQ::EventType evT = webEventTypeToAQEventType(args[0]); QWidget *w; AQWidgetInfo *wInfo; if (evT != AQ::XProgressDialog) { w = AQ_WIDGET(args[1].toULongLong(0, 36)); wInfo = createdWidgets_.find(w); if (!wInfo) return; } switch (evT) { case AQ::MouseButtonPress: { QWidget *popup = activePopupWidget(); if (popup && popup != w->topLevelWidget()) popup->close(); w->raise(); w->setActiveWindow(); QPoint local(args[2].toInt(), args[3].toInt()); QPoint global(w->mapToGlobal(local)); QCursor::setPos(global); QMouseEvent mev(QEvent::MouseButtonPress, local, global, toQtButton(args[4]), toQtButtonState(args[5])); qt_sendSpontaneousEvent(w, &mev); break; } case AQ::MouseButtonRelease: { QPoint local(args[2].toInt(), args[3].toInt()); QPoint global(w->mapToGlobal(local)); QCursor::setPos(global); QMouseEvent mev(QEvent::MouseButtonRelease, local, global, toQtButton(args[4]), toQtButtonState(args[5])); qt_sendSpontaneousEvent(w, &mev); break; } case AQ::MouseButtonDblClick: { QPoint local(args[2].toInt(), args[3].toInt()); QPoint global(w->mapToGlobal(local)); QCursor::setPos(global); QMouseEvent mev(QEvent::MouseButtonDblClick, local, global, toQtButton(args[4]), toQtButtonState(args[5])); qt_sendSpontaneousEvent(w, &mev); break; } case AQ::MouseMove: { QPoint local(args[2].toInt(), args[3].toInt()); QPoint global(w->mapToGlobal(local)); QCursor::setPos(global); QMouseEvent mev(QEvent::MouseMove, local, global, toQtButton(args[4]), toQtButtonState(args[5])); qt_sendSpontaneousEvent(w, &mev); break; } case AQ::KeyPress: case AQ::KeyRelease: { int keyCode = args[2].toInt(); QWidget *keywidget = QWidget::keyboardGrabber(); bool grabbed = false; if (keywidget) { grabbed = true; } else { keywidget = focusWidget(); if (!keywidget) { keywidget = activePopupWidget(); if (!keywidget) { keywidget = activeWindow(); if (!keywidget) keywidget = w->topLevelWidget(); } } } if (keyCode < 0) { QKeyEvent kev((QEvent::Type) evT, 0, keyCode, toQtButtonState(args[3]), QChar(-keyCode)); qt_sendSpontaneousEvent(keywidget, &kev); } else { if (evT == AQ::KeyPress && !grabbed) { QKeyEvent a((QEvent::Type) evT, toQtKey(keyCode), keyCode, toQtButtonState(args[3])); if (qt_tryAccelEvent(keywidget, &a)) return; } QKeyEvent kev((QEvent::Type) evT, toQtKey(keyCode), keyCode, toQtButtonState(args[3])); qt_sendSpontaneousEvent(keywidget, &kev); } break; } case AQ::Move: if (w != desktop_) { ignoreEvents_ = true; w->move(args[2].toInt(), args[3].toInt()); ignoreEvents_ = false; } break; case AQ::Resize: if (w != desktop_) { //ignoreEvents_ = true; w->resize(args[2].toInt(), args[3].toInt()); //ignoreEvents_ = false; } else { int wt = args[2].toInt(); int ht = args[3].toInt(); desktopGeometry_.setRect(0, 0, wt, ht); desktop()->resize(wt, ht); postAQEvent(new AQEvent(w, new QResizeEvent(QSize(wt, ht), QSize()))); emit desktop()->resized(0); if (!initDone_) QTimer::singleShot(0, this, SLOT(init())); } break; case AQ::XUpload: { QFileDialog *fd = ::qt_cast<QFileDialog *>(w); if (fd) fd->rereadDir(); break; } case AQ::XProgressDialog: { uint pid = args[1].toUInt(); if (args.size() == 2) { QProgressDialog *pd = progressDialogs_.take(pid); if (pd) { pd->close(); pd->deleteLater(); } } else { QProgressDialog *pd = progressDialogs_.find(pid); if (!pd) { pd = new QProgressDialog(args[2], QString(), args[3].section(';', 1, 1).toInt()); progressDialogs_.insert(pid, pd); } pd->setProgress(args[3].section(';', 0, 0).toInt()); } break; } case AQ::WindowStateChange: { w->setWindowState(args[2].toInt()); break; } default: { QEvent ev((QEvent::Type) evT); qt_sendSpontaneousEvent(w, &ev); } } }