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

📄 event.c

📁 超强的嵌入式GUI系统
💻 C
字号:
/* * Copyright (c) 2006 - 2007 *	Alper Akcan <alper@kaffe.org>, All rights reserved. * * See the file "license.terms" for information on usage and redistribution  * of this file.  */#include "toolkit.h"jclass     ComponentEvent;jclass     MouseEvent;jclass     FocusEvent;jclass     WindowEvent;jclass     KeyEvent;jclass     PaintEvent;jclass     WMEvent;jmethodID  getComponentEvent;jmethodID  getMouseEvent;jmethodID  getFocusEvent;jmethodID  getWindowEvent;jmethodID  getKeyEvent;jmethodID  getPaintEvent;jmethodID  getWMEvent;typedef jobject (*event_handler) (JNIEnv *, xynth_event_t *);typedef enum {	JNONE_EVENT   = 0x0,	JQUIT_EVENT   = 0x1,	JKEYBD_EVENT  = 0x2,	JMOUSE_EVENT  = 0x3,	JEXPOSE_EVENT = 0x4,	JCONFIG_EVENT = 0x5,	JFOCUS_EVENT  = 0x6} S_JEVENT;S_JEVENT event_handler_number (s_event_t *event){	S_EVENT event_type;	event_type = event->type & (QUIT_EVENT | KEYBD_EVENT | MOUSE_EVENT | EXPOSE_EVENT | CONFIG_EVENT | FOCUS_EVENT);	switch (event_type) {		case QUIT_EVENT:  return JQUIT_EVENT;		case KEYBD_EVENT: return JKEYBD_EVENT;		case MOUSE_EVENT: return JMOUSE_EVENT;		case EXPOSE_EVENT:return JEXPOSE_EVENT;		case CONFIG_EVENT:return JCONFIG_EVENT;		case FOCUS_EVENT: return JFOCUS_EVENT;		default:          break;	}	DEBUGF("unknown event: 0x%08x", event->type); 	return JNONE_EVENT;}jobject event_handler_none (JNIEnv *env, xynth_event_t *xevent){	DEBUGF("Enter");	DEBUGF("Leave");	return NULL;}jobject event_handler_quit (JNIEnv *env, xynth_event_t *xevent){	int idx;	jobject jevent;	s_event_t *event;	DEBUGF("Enter");	idx = source_idx_get(xynth, xevent->window);	if (idx < 0) {		return NULL;	}	jevent = (*env)->CallStaticObjectMethod(env, WMEvent, getWMEvent, idx, JQUIT);	DEBUGF("Leave");	return jevent;}static inline int key_mod (int keyState){	int mod = 0;	if (keyState & KEYCODE_SHIFTF)   mod |= 1;	if (keyState & KEYCODE_CTRLF)    mod |= 2;	if (keyState & KEYCODE_ALTGRF)   mod |= 4;	if (keyState & KEYCODE_ALTF)     mod |= 8;	return mod;}jobject event_handler_keybd (JNIEnv *env, xynth_event_t *xevent){	int idx;	jobject jevent;	s_event_t *event;	DEBUGF("Enter");	idx = source_idx_get(xynth, xevent->window);	if (idx < 0) {		return NULL;	}	jevent = NULL;	event = xevent->event;	jevent = (*env)->CallStaticObjectMethod(env, KeyEvent, getKeyEvent, idx,	                                        (event->type & KEYBD_PRESSED) ? JKEY_PRESSED : JKEY_RELEASED,						xynth->keymap[event->keybd->keycode],						event->keybd->ascii,						key_mod(event->keybd->flag));	DEBUGF("Leave");	return jevent;}jobject event_handler_mouse (JNIEnv *env, xynth_event_t *xevent){	int idx;	jobject jevent;	s_event_t *event;	DEBUGF("Enter");	idx = source_idx_get(xynth, xevent->window);	if (idx < 0) {		return NULL;	}	jevent = NULL;	event = xevent->event;	if ((event->mouse->x >= xevent->window->surface->buf->x) &&	    (event->mouse->y >= xevent->window->surface->buf->y) &&	    (event->mouse->x <= (xevent->window->surface->buf->x + xevent->window->surface->buf->w - 1)) &&	    (event->mouse->y <= (xevent->window->surface->buf->y + xevent->window->surface->buf->h - 1))) {		event->mouse->x -= xevent->window->surface->buf->x;		event->mouse->y -= xevent->window->surface->buf->y;		if (event->type & MOUSE_RELEASED) {			jevent = (*env)->CallStaticObjectMethod(env, MouseEvent, getMouseEvent, idx, JMOUSE_RELEASED, event->mouse->b, event->mouse->x, event->mouse->y);		} else if (event->type & MOUSE_PRESSED) {			jevent = (*env)->CallStaticObjectMethod(env, MouseEvent, getMouseEvent, idx, JMOUSE_PRESSED, event->mouse->b, event->mouse->x, event->mouse->y);		} else if (event->type & MOUSE_ENTERED) {			jevent = (*env)->CallStaticObjectMethod(env, MouseEvent, getMouseEvent, idx, JMOUSE_ENTERED, 0, event->mouse->x, event->mouse->y);		} else if (event->type & MOUSE_EXITED) {			jevent = (*env)->CallStaticObjectMethod(env, MouseEvent, getMouseEvent, idx, JMOUSE_EXITED, 0, event->mouse->x, event->mouse->y);		} else {			jevent = (*env)->CallStaticObjectMethod(env, MouseEvent, getMouseEvent, idx, JMOUSE_MOVED, 0, event->mouse->x, event->mouse->y);		}	}	DEBUGF("Leave %d", xevent->window->id);	return jevent;}jobject event_handler_expose (JNIEnv *env, xynth_event_t *xevent){	int idx;	jobject jevent;	s_event_t *event;	DEBUGF("Enter");	idx = source_idx_get(xynth, xevent->window);	if (idx < 0) {		return NULL;	}	event = xevent->event;	event->expose->rect->x = event->expose->rect->x - xevent->window->surface->buf->x;	event->expose->rect->y = event->expose->rect->y - xevent->window->surface->buf->y;	jevent = (*env)->CallStaticObjectMethod( env, PaintEvent, getPaintEvent, idx, JUPDATE, event->expose->rect->x, event->expose->rect->y, event->expose->rect->w, event->expose->rect->h);	DEBUGF("Leave");	return jevent;}jobject event_handler_config (JNIEnv *env, xynth_event_t *xevent){	int idx;	jobject jevent;	s_event_t *event;	DEBUGF("Enter");	idx = source_idx_get(xynth, xevent->window);	if (idx < 0) {		return NULL;	}	if (xevent->event->type & (CONFIG_CHNGW | CONFIG_CHNGH)) {		free(xevent->window->surface->vbuf);		xevent->window->surface->width = xevent->event->expose->rect->w;		xevent->window->surface->height = xevent->event->expose->rect->h;		xevent->window->surface->vbuf = (char *) malloc(xevent->window->surface->width * xevent->window->surface->height * xevent->window->surface->bytesperpixel);	}	event = xevent->event;	jevent = (*env)->CallStaticObjectMethod(env, ComponentEvent, getComponentEvent, idx, JCOMPONENT_RESIZED, event->expose->rect->x, event->expose->rect->y, event->expose->rect->w, event->expose->rect->h);	DEBUGF("Leave");	return jevent;}jobject event_handler_focus (JNIEnv *env, xynth_event_t *xevent){	int idx;	jobject jevent;	s_event_t *event;	DEBUGF("Enter");	idx = source_idx_get(xynth, xevent->window);	if (idx < 0) {		return NULL;	}	event = xevent->event;	if (xevent->window->pri == 0) {		jevent = (*env)->CallStaticObjectMethod(env, FocusEvent, getFocusEvent, idx, JFOCUS_GAINED, JNI_FALSE);	} else {		jevent = (*env)->CallStaticObjectMethod(env, FocusEvent, getFocusEvent, idx, JFOCUS_LOST, JNI_FALSE);	}	DEBUGF("Leave");	return jevent;}event_handler process_event[] = {	event_handler_none,	event_handler_quit,	event_handler_keybd,	event_handler_mouse,	event_handler_expose,	event_handler_config,	event_handler_focus};jobject Java_java_awt_Toolkit_evtInit (JNIEnv* env, jclass clazz UNUSED){	jclass Component;		DEBUGF("Enter");		if (ComponentEvent != NULL) {		DEBUGF("evtInit called twice");		return NULL;	}		ComponentEvent = (*env)->FindClass( env, "java/awt/ComponentEvt");	assert(ComponentEvent != NULL);	MouseEvent     = (*env)->FindClass( env, "java/awt/MouseEvt");	assert(MouseEvent != NULL);	FocusEvent     = (*env)->FindClass( env, "java/awt/FocusEvt");	assert(FocusEvent != NULL);	WindowEvent    = (*env)->FindClass( env, "java/awt/WindowEvt");	assert(WindowEvent != NULL);  	KeyEvent       = (*env)->FindClass( env, "java/awt/KeyEvt");	assert(KeyEvent != NULL);	PaintEvent     = (*env)->FindClass( env, "java/awt/PaintEvt");	assert(PaintEvent != NULL);	WMEvent        = (*env)->FindClass( env, "java/awt/WMEvent");	assert(WMEvent != NULL);		getComponentEvent = (*env)->GetStaticMethodID( env, ComponentEvent, "getEvent", "(IIIIII)Ljava/awt/ComponentEvt;");	getMouseEvent     = (*env)->GetStaticMethodID( env, MouseEvent, "getEvent", "(IIIII)Ljava/awt/MouseEvt;");	getFocusEvent     = (*env)->GetStaticMethodID( env, FocusEvent, "getEvent", "(IIZ)Ljava/awt/FocusEvt;");	getWindowEvent    = (*env)->GetStaticMethodID( env, WindowEvent, "getEvent", "(II)Ljava/awt/WindowEvt;");	getKeyEvent       = (*env)->GetStaticMethodID( env, KeyEvent, "getEvent", "(IIIII)Ljava/awt/KeyEvt;");	getPaintEvent     = (*env)->GetStaticMethodID( env, PaintEvent, "getEvent", "(IIIIII)Ljava/awt/PaintEvt;");	getWMEvent        = (*env)->GetStaticMethodID( env, WMEvent, "getEvent", "(II)Ljava/awt/WMEvent;");		Component = (*env)->FindClass( env, "java/awt/Component");	DEBUGF("Leave");	return (*env)->NewObjectArray( env, xynth->nwindows, Component, NULL);}jint Java_java_awt_Toolkit_evtRegisterSource (JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nativeWnd){	int id;	DEBUGF("Enter");	s_window_t *window;	window = UNVEIL_WINDOW(nativeWnd);	id = source_idx_get(xynth, window);	DEBUGF("Leave");	return id;}void xynth_kaffe_atevent (s_window_t *window, s_event_t *event){	xynth_event_t *xevent;	DEBUGF("Enter id: %d", window->id);	switch (event->type & EVENT_MASK) {		case QUIT_EVENT:		case MOUSE_EVENT:		case KEYBD_EVENT:		case CONFIG_EVENT:		case FOCUS_EVENT:			xevent = (xynth_event_t *) AWT_MALLOC(sizeof(xynth_event_t));			if (xevent != NULL) {				if (!s_event_init(&(xevent->event))) {					xevent->window = window;					xevent->event->type = event->type;					memcpy(xevent->event->mouse, event->mouse, sizeof(s_mouse_t));					memcpy(xevent->event->keybd, event->keybd, sizeof(s_keybd_t));					memcpy(xevent->event->expose->rect, event->expose->rect, sizeof(s_rect_t));					s_thread_mutex_lock(xynth->eventq->mut);					s_list_add(xynth->eventq->list, xevent, -1);					s_thread_mutex_unlock(xynth->eventq->mut);				} else {					AWT_FREE(xevent);				}			}			break;		case EXPOSE_EVENT: /* nothing */		default:			break;	}	if (event->type & (CONFIG_CHNGW | CONFIG_CHNGH)) {		xevent = (xynth_event_t *) AWT_MALLOC(sizeof(xynth_event_t));		if (xevent != NULL) {			if (!s_event_init(&(xevent->event))) {				xevent->window = window;				xevent->event->type = EXPOSE_EVENT;				memcpy(xevent->event->mouse, event->mouse, sizeof(s_mouse_t));				memcpy(xevent->event->keybd, event->keybd, sizeof(s_keybd_t));				memcpy(xevent->event->expose->rect, event->expose->rect, sizeof(s_rect_t));				s_thread_mutex_lock(xynth->eventq->mut);				s_list_add(xynth->eventq->list, xevent, -1);				s_thread_mutex_unlock(xynth->eventq->mut);			} else {				AWT_FREE(xevent);			}		}	}	DEBUGF("Leave");}jobject Java_java_awt_Toolkit_evtGetNextEvent (JNIEnv *env, jclass clazz){	jobject jevent;	xynth_event_t *xevent;	S_JEVENT jevent_type;	jevent = NULL;	s_thread_mutex_lock(xynth->eventq->mut);        while (!s_list_eol(xynth->eventq->list, 0)) {		xevent = (xynth_event_t *) s_list_get(xynth->eventq->list, 0);		jevent_type = event_handler_number(xevent->event);		jevent = process_event[jevent_type](env, xevent);		s_list_remove(xynth->eventq->list, 0);		s_event_uninit(xevent->event);		AWT_FREE(xevent);		if (jevent != NULL) {			break;		} else {			DEBUGF("ERROR");		}	}	s_thread_mutex_unlock(xynth->eventq->mut);	return jevent;}jint Java_java_awt_Toolkit_evtUnregisterSource (JNIEnv *env UNUSED, jclass clazz UNUSED, jobject nwnd){	int i;	s_window_t *window;	DEBUGF("Enter");	window = UNVEIL_WINDOW(nwnd);	i = source_idx_get(xynth, window);	if (i >= 0) {		xynth->windows[i].window = 0;		xynth->windows[i].owner = 0;	}	if (xynth->last_window == window) {		xynth->last_window = 0;	}	DEBUGF("Leave");	return i;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -