📄 evt.cc
字号:
"(IIIII)Ljava/awt/KeyEvt;"); getPaintEvent = env->GetStaticMethodID( PaintEvent, "getEvent", "(IIIIII)Ljava/awt/PaintEvt;"); getWMEvent = env->GetStaticMethodID( WMEvent, "getEvent", "(II)Ljava/awt/WMEvent;"); Component = env->FindClass( "java/awt/Component"); return env->NewObjectArray( X->nWindows, Component, NULL);}jobject processEvent(JNIEnv* env, Toolkit* X, QEvent* event, int index){ switch(event->type()) { case QEvent::Clipboard: { return clearJavaClipboard(env); } case QEvent::Show: case QEvent::Hide: { int id = 0; if (event->type() == QEvent::Show ) { if ( (X->windows[X->srcIdx].flags & WND_MAPPED) == 0 ){ id = WINDOW_DEICONIFIED; X->windows[X->srcIdx].flags |= WND_MAPPED; } } else { if ( (X->windows[X->srcIdx].flags & WND_MAPPED) != 0 ){ id = WINDOW_ICONIFIED; X->windows[X->srcIdx].flags &= ~WND_MAPPED; } } if ( id ) { return env->CallStaticObjectMethod( WindowEvent, getWindowEvent, X->srcIdx, id); } else { // we do the ComponentEvent show/hide in Java return 0; } } case QEvent::Destroy: { DBG(AWT_EVT, qqDebug("processing Destroy: SrcIdx=%d\n", index)); /* * We should get this just for windows which have been destroyed from an * external client, since removeNotify() calls evtUnregisterSource() (i.e. * removes windows properly from the dispatch table) */ X->windows[X->srcIdx].flags &= ~WND_MAPPED; return env->CallStaticObjectMethod( WMEvent, getWMEvent, index, WM_KILLED); } case QEvent::Reparent: { DBG(AWT_EVT, qqDebug("processing Reparent: SrcIdx=%d\n", index)); return NULL; } case QEvent::FocusIn: case QEvent::FocusOut: { DBG(AWT_EVT, qqDebug("processing %s: SrcIdx=%d\n",(event->type() == QEvent::FocusIn)?"FocusIn":"FocusOut",index)); int evtId; int et = event->type(); if ( et == QEvent::FocusIn ) { evtId = FOCUS_GAINED; } else { evtId = FOCUS_LOST; } if (checkSource( X, index) ){ return env->CallStaticObjectMethod( FocusEvent, getFocusEvent, index, evtId, JNI_FALSE); } else { return NULL; } } case QEvent::KeyPress: case QEvent::KeyRelease: { DBG(AWT_EVT, qqDebug("processing %s: SrcIdx=%d\n",(event->type() == QEvent::KeyPress)?"KeyPress":"KeyRelease",index)); QKeyEvent *keyEvent = (QKeyEvent*)event; int n, keyCode, keyChar, mod; /* * We should eventually support input methods here. * Note that 'keysym' is queried separately (with a standard state), to * ensure the "one physical key -> one keycode" invariant */ int keysym; n = keyEvent->count(); keysym = keyEvent->key(); if ( (keysym >= 0x1000) || (n == 0) ) { keyCode = QFKeyCode[keysym & 0xff]; /* * There are some "control keys" that should generate KEY_TYPED events * (enter, cancel, backspace, del, tab). This is flagged by a negative * value and leads to non-zero keyChars */ if ( keyCode < 0 ){ keyChar = keyCode = -keyCode; } else { /* a "pure" function key */ keyChar = 0; } } else { keyChar = keyEvent->ascii();//(unsigned char)X->buf[0]; keyCode = QLKeyCode[keysym & 0xff]; } int evtId = (((QEvent*)keyEvent)->type() == QEvent::KeyPress)? KEY_PRESSED : KEY_RELEASED; mod = keyMod(keyEvent->state()); DBG(AWT_EVT, qqDebug("KeyEvent: idx=%d keyCode=%d keyChar=%c mod=%d\n", index, keyCode,keyChar,mod)); return env->CallStaticObjectMethod( KeyEvent, getKeyEvent, index, evtId, keyCode, keyChar, mod); } case QEvent::MouseButtonPress: { DBG(AWT_EVT, qqDebug("processing MouseButtonPress Event SrcIdx=%d\n", index)); QMouseEvent* mouseEvent = (QMouseEvent*)event; // check the diff between event.xbutton.button and QMouseEvent::button() if (checkSource( X, index) ){ env->CallStaticObjectMethod( FocusEvent, getFocusEvent, index, FOCUS_GAINED, JNI_FALSE); } else { return NULL; } return env->CallStaticObjectMethod(MouseEvent, getMouseEvent, index, MOUSE_PRESSED, mapButton(mouseEvent->button()), mouseEvent->x(), mouseEvent->y()); } case QEvent::MouseButtonRelease: { DBG(AWT_EVT, qqDebug("processing MouseButtonRelease Event SrcIdx=%d\n", index)); QMouseEvent* mouseEvent = (QMouseEvent*)event; // check the diff between event.xbutton.button and QMouseEvent::button() return env->CallStaticObjectMethod(MouseEvent, getMouseEvent, index, MOUSE_RELEASED, mapButton(mouseEvent->button()), mouseEvent->x(), mouseEvent->y()); } case QEvent::MouseMove: { DBG(AWT_EVT, qqDebug("processing MouseMove Event SrcIdx=%d\n", index)); QMouseEvent* mouseEvent = (QMouseEvent*)event; return env->CallStaticObjectMethod(MouseEvent, getMouseEvent, index, MOUSE_MOVED, 0, mouseEvent->x(), mouseEvent->y()); } case QEvent::Paint: { DBG(AWT_EVT, qqDebug("processing Paint Event SrcIdx=%d\n", index)); QPaintEvent* paintEvent = (QPaintEvent*)event; QRect rect=paintEvent->rect(); return env->CallStaticObjectMethod(PaintEvent, getPaintEvent, index, UPDATE, rect.x(), rect.y(), rect.width(), rect.height()); } case QEvent::Move: { DBG(AWT_EVT, qqDebug("processing Move Event SrcIdx=%d\n", index)); QMoveEvent* moveEvent = (QMoveEvent*)event; QPoint pos, data; pos = moveEvent->pos(); data = moveEvent->oldPos(); return env->CallStaticObjectMethod( ComponentEvent, getComponentEvent, index, COMPONENT_RESIZED, pos.x(), pos.y(), data.x(), data.y()); } case QEvent::Resize: { DBG(AWT_EVT, qqDebug("processing Resize Event SrcIdx=%d\n", index)); QResizeEvent* resizeEvent = (QResizeEvent*)event; QSize size, data; size = resizeEvent->size(); data = resizeEvent->oldSize(); return env->CallStaticObjectMethod( ComponentEvent, getComponentEvent, index, COMPONENT_RESIZED, data.width(), data.height(), size.width(), size.height()); } } return NULL;}jobject Java_java_awt_Toolkit_evtGetNextEvent(JNIEnv* env, jclass clazz){ jobject jEvt = NULL; EventPacket *packet; QEvent *event; int index; DBG(AWT_EVT, qqDebug("getNextEvent..\n")); pollJavaClipboard(env); if (g_event_queue.count()) { packet = g_event_queue.dequeue(); event = packet->getEvent(); index = packet->getIndex(); if (event) { jEvt = processEvent(env, X, event, index); delete event; } delete packet; } qapp->processEvents(10); return jEvt;}jobjectJava_java_awt_Toolkit_evtPeekEvent ( JNIEnv* env, jclass clazz ){ jobject jEvt = NULL; DBG(AWT_EVT, qqDebug("peekEvent..\n"));#if 0 if ( nextEvent( env, clazz, X, False) && ((getSourceIdx( X, (void*)X->event.xany.window) >= 0)) ) { if ( (jEvt = (processEvent[X->event.xany.type])( env, X)) ) X->preFetched = 1; } DBG( AWT_EVT, qFatal("..peekEvent: %s %p, %lx\n", eventStr(X->evtId), jEvt, X->event.xany.window));#endif return jEvt;}/* * We can't do a XPeekIfEvent here because it would block until such an event * comes in */jobjectJava_java_awt_Toolkit_evtPeekEventId ( JNIEnv* env, jclass clazz, jint id ){ jobject jEvt; if ( (jEvt = Java_java_awt_Toolkit_evtPeekEvent( env, clazz)) && (X->evtId == id) ){ return jEvt; } return NULL;}/* * This is just used to wakeup the getNextEvent call if we are multithreaded, * and we post an event from outside the dispatcher thread (which might be blocked * in a native getNextEvent). This is a tribute to the fact that we actually have * two different queues - the native one, and the queue for self-posted events. * We could also do a round trip here, but this would wake up the event dispatcher * immediately (i.e. before this func returns), which is probably a crude side effect * of postEvent(). * Using a ClientMessage might be a bit dangerous if Xlib tries to be too smart by * just dispatching this to the local queue (without passing to the server) */void Java_java_awt_Toolkit_evtWakeup(JNIEnv* env, jclass clazz){ DBG(AWT_EVT, qqDebug("evtWakeup\n"));}/* * This is a helper for (IS_DISPATCH_EXCLUSIVE | NATIVE_DISPATCHER_LOOP) windowing * systems, where we need to execute certain requests (e.g. window creation) to * the native event thread. Not required here */voidJava_java_awt_Toolkit_evtSendWMEvent ( JNIEnv* env, jclass clazz, jobject wmEvt ){}jint Java_java_awt_Toolkit_evtRegisterSource(JNIEnv* env, jclass clazz, void* wnd){ /* * We have done that already during the various wndCreateXX() */ int i = getSourceIdx( X, wnd); DBG(AWT_EVT, qqDebug("registerSource( %p) -> %d\n", wnd, i)); return i;}jint Java_java_awt_Toolkit_evtUnregisterSource(JNIEnv* env, jclass clazz, void* wnd){ int i = getSourceIdx( X, wnd); if ( i >= 0 ){ X->windows[i].w = (void*)0xffffffff; X->windows[i].flags = 0; X->windows[i].owner = 0; } if ( X->lastWindow == wnd ) X->lastWindow = 0; DBG(AWT_EVT, qqDebug("unregisterSource( %p) -> %d\n", wnd, i)); return i;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -