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

📄 clipboard.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
字号:
/** * nano-X AWT backend for Kaffe. * * Copyright (c) 2001 *	Exor International Inc. All rights reserved. * * Copyright (c) 2001 *	Sinby Corporatin, All rights reserved. * * Copyright (c) 2005 *	Kaffe.org contributors, see ChangeLog for details.  All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. */#include "config.h"#include "config-std.h"#include "config-mem.h"#include "config-setjmp.h"#include "toolkit.h"#include "jni.h"#include <jcl.h>#include <ctype.h>static jclass     NativeClipboard;static jmethodID  lostOwnership;static jmethodID  createTransferable;static jmethodID  getNativeData;#define MIME0 "application/x-java-serialized-object"#define MIME1 "text/plain; charset=unicode"jobjectJava_java_awt_Toolkit_cbdInitClipboard(JNIEnv* envP, jclass clazz ){	GR_WINDOW_ID wid;	wid = GrNewWindow(GR_ROOT_WINDOW_ID, 0, 0, 1, 1, 0, 0, 0);	GrSelectEvents(wid, GR_EVENT_TYPE_CLIENT_DATA_REQ);	NativeClipboard = (*envP)->FindClass( envP, "java/awt/NativeClipboard");	getNativeData = (*envP)->GetStaticMethodID( envP, NativeClipboard, "getNativeData", "(Ljava/lang/String;)[B");	lostOwnership   = (*envP)->GetStaticMethodID( envP, NativeClipboard, "lostOwnership", "()V");	createTransferable = (*envP)->GetStaticMethodID( envP, NativeClipboard, "createTransferable", "(Ljava/lang/String;[B)Ljava/awt/datatransfer/Transferable;");	return JCL_NewRawDataObject (envP, wid);}voidJava_java_awt_Toolkit_cbdFreeClipboard( JNIEnv* env, jclass clazz, jobject _jwindow){	GR_WINDOW_ID wid;	if ( _jwindow == NULL ) {		SignalError("java.lang.NullPointerException", "no window object");		return;	}	wid = (GR_WINDOW_ID)JCL_GetRawData (env, _jwindow);	GrDestroyWindow(wid);}jbooleanJava_java_awt_Toolkit_cbdSetOwner( JNIEnv* env, jclass clazz, jobject _jwindow){	GR_WINDOW_ID wid, owid;	GR_CHAR *cp;	if ( _jwindow == NULL ) {		SignalError("java.lang.NullPointerException", "no window object");		return JNI_FALSE;	}	wid = (GR_WINDOW_ID)JCL_GetRawData (env, _jwindow);	GrSetSelectionOwner(wid, MIME0 " " MIME1);		owid = GrGetSelectionOwner(&cp);	free(cp);	if ( owid == wid ) {		return JNI_TRUE;	} else {		return JNI_FALSE;	}}voidsendClipboardData(JNIEnv *envP, GR_EVENT_CLIENT_DATA_REQ *eventP){	jstring jMimeType;	jbyteArray jData;	jbyte *data;	int len;	const char *mime;	jboolean isCopy;	switch ( eventP->mimetype == 0 ) {	case 0:		mime = "application/x-java-serialized-object";		break;	case 1:		mime = "text/plain; charset=unicode";		break;	default:		return;	}	jMimeType = (*envP)->NewStringUTF( envP, mime );	jData = (*envP)->CallStaticObjectMethod( envP, NativeClipboard, getNativeData, jMimeType);	if ( jData ) {		data = (*envP)->GetByteArrayElements( envP, jData, &isCopy);		len = (*envP)->GetArrayLength( envP, jData);		(*envP)->ReleaseByteArrayElements( envP, jData, data, JNI_ABORT);	} else {		data = NULL;		len = 0;	}	GrSendClientData(eventP->wid, eventP->rid, eventP->serial, len, len, data);	return;}static inline char*getMime(char **icp){	char c,*cp,*rv;	cp = *icp;	while(((( c = *cp ) == ' ') || ( c == '\t') || ( c == '\n' )) && (c != NULL)) {		cp++;	}	if ( c == NULL ) {		return NULL;	}	rv = cp;retry:	while((( c = *cp ) != ' ') && ( c != '\t') && ( c != '\n' ) && (c != NULL)&& c != ';') {		cp++;	}	if ( c != ';' ) {		if ( c == NULL ) {			*icp = cp;		} else {			*cp = NULL;			*icp = cp+1;		}		return rv;	}	cp++;	while(((( c = *cp ) == ' ') || ( c == '\t') || ( c == '\n' )) && (c != NULL)) {		cp++;	}	if ( c == NULL ) {		*icp = cp;		return rv;	}goto retry;}static inline intequaleMime(char *mime0, char *mime1) {	char c0,c1;retry:	while(((( c0 = *mime0 ) == ' ') || ( c0 == '\t') || ( c0 == '\n' )) && (c0 != NULL)) {		mime0++;	}	while(((( c1 = *mime1 ) == ' ') || ( c1 == '\t') || ( c1 == '\n' )) && (c1 != NULL)) {		mime1++;	}	if (( c0 == NULL ) && ( c1 == NULL )) {		return 1;	}	if ( tolower(c0) != tolower(c1) ) {		return 0;	}	mime0++;	mime1++;	goto retry;}jobjectJava_java_awt_Toolkit_cbdGetContents(JNIEnv* envP, jclass clazz, jobject _jwindow){	GR_WINDOW_ID wid, owid;	GR_MIMETYPE mimetype;	static GR_SERIALNO serialNo = 0;	char *mime,*icp;	GR_EVENT event;	jstring jMimeType;	jbyteArray jdata;	GR_CHAR *typelist;	if ( _jwindow == NULL ) {		SignalError("java.lang.NullPointerException", "no window object");		return NULL;	}	wid = (GR_WINDOW_ID)JCL_GetRawData (envP, _jwindow);	owid = GrGetSelectionOwner(&typelist);	if (( owid == NULL ) || ( typelist == NULL )) {		return NULL;	}	mimetype = 0;	icp = typelist;	while (( mime = getMime(&icp) ) != NULL) {		if ( equaleMime(mime, MIME0)) {			break;		}		if ( equaleMime(mime, MIME1)) {			break;		}				mimetype++; 	}	jMimeType = (*envP)->NewStringUTF(envP, (const char*)mime);	free(typelist);	if ( mime == NULL ) {		return NULL;	}	GrSelectEvents(wid, GR_EVENT_MASK_CLIENT_DATA);	serialNo++;	GrRequestClientData(wid, owid, serialNo, mimetype);	GrGetNextEventTimeout(&event, 1500);	switch(event.clientdata.type) {		case GR_EVENT_TYPE_CLIENT_DATA:			break;		case GR_EVENT_TYPE_TIMEOUT:			return NULL;		default:			return NULL;	}	if ( event.clientdata.serial != serialNo ) {		return NULL;	}	if ( event.clientdata.len != event.clientdata.datalen ) {		return NULL;	}	if ( event.clientdata.datalen == 0 ) {		return NULL;	}	if ( event.clientdata.data == 0 ) {		SignalError("java.lang.NullInternalError", "illegal data pointer");		return NULL;	}	GrSelectEvents(wid, 0);	jdata = (*envP)->NewByteArray(envP, event.clientdata.datalen);	(*envP)->SetByteArrayRegion( envP, jdata, 0, event.clientdata.datalen, (jbyte*)event.clientdata.data);	return (*envP)->CallStaticObjectMethod( envP, NativeClipboard, createTransferable, jMimeType, jdata);}

⌨️ 快捷键说明

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