⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 evt.cc

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 CC
📖 第 1 页 / 共 2 页
字号:
												 "(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 + -