230 lines · 5.0 KB · C
RawDownload
#include <jni.h>#include <android/native_window.h>#include <android/log.h> #include "u.h"#include "lib.h"#include "dat.h"#include "fns.h" #include <draw.h>#include <memdraw.h>#include <keyboard.h>#include <cursor.h>#include "screen.h" Memimage *gscreen = nil;extern int screenWidth;extern int screenHeight;extern ANativeWindow *window;extern jobject mainActivityObj;extern JavaVM *jvm; char*clipread(void){	char *ret;	const char *s;	JNIEnv *env;	jint rs = (*jvm)->AttachCurrentThread(jvm, &env, NULL);	if (rs != JNI_OK) {		__android_log_print(ANDROID_LOG_WARN, "drawterm", "AttachCurrentThread returned error: %d", rs);		return strdup("");	}	jclass clazz = (*env)->GetObjectClass(env, mainActivityObj);	jmethodID methodID = (*env)->GetMethodID(env, clazz, "getClipBoard", "()Ljava/lang/String;");        jstring str = (jstring)(*env)->CallObjectMethod(env, mainActivityObj, methodID);	s = (*env)->GetStringUTFChars(env, str, NULL);	ret = strdup(s);	(*env)->ReleaseStringUTFChars(env, str, s);	(*jvm)->DetachCurrentThread(jvm);	return ret;} intclipwrite(char *buf){	JNIEnv *env;	jint rs = (*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6);	if(rs != JNI_OK) {		__android_log_print(ANDROID_LOG_WARN, "drawterm", "GetEnv returned error: %d", rs);		return 0;	}	jclass clazz = (*env)->GetObjectClass(env, mainActivityObj);	jmethodID methodID = (*env)->GetMethodID(env, clazz, "setClipBoard", "(Ljava/lang/String;)V");        jstring str = (*env)->NewStringUTF(env, buf);	(*env)->CallVoidMethod(env, mainActivityObj, methodID, str);	return 0;} voidshow_notification(char *buf){	JNIEnv *env;	jint rs = (*jvm)->AttachCurrentThread(jvm, &env, NULL);	if(rs != JNI_OK) {		__android_log_print(ANDROID_LOG_WARN, "drawterm", "AttachCurrentThread returned error: %d", rs);		return;	}	jclass clazz = (*env)->GetObjectClass(env, mainActivityObj);	jmethodID methodID = (*env)->GetMethodID(env, clazz, "showNotification", "(Ljava/lang/String;)V");        jstring str = (*env)->NewStringUTF(env, buf);	(*env)->CallVoidMethod(env, mainActivityObj, methodID, str);	(*jvm)->DetachCurrentThread(jvm);	return;} intnum_cameras(){	JNIEnv *env;	int n;	jint rs = (*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6);	if(rs != JNI_OK) {		__android_log_print(ANDROID_LOG_WARN, "drawterm", "GetEnv returned error: %d", rs);		return 0;	}	jclass clazz = (*env)->GetObjectClass(env, mainActivityObj);	jmethodID methodID = (*env)->GetMethodID(env, clazz, "numCameras", "()I");	n = (*env)->CallIntMethod(env, mainActivityObj, methodID);	return n;} voidtake_picture(int id){	JNIEnv *env;	jint rs = (*jvm)->AttachCurrentThread(jvm, &env, NULL);	if(rs != JNI_OK) {		__android_log_print(ANDROID_LOG_WARN, "drawterm", "AttachCurrentThread returned error: %d", rs);		return;	}	jclass clazz = (*env)->GetObjectClass(env, mainActivityObj);	jmethodID methodID = (*env)->GetMethodID(env, clazz, "takePicture", "(I)V");	(*env)->CallVoidMethod(env, mainActivityObj, methodID, id);	(*jvm)->DetachCurrentThread(jvm);	return;} voidsetcolor(ulong i, ulong r, ulong g, ulong b){	return;} voidgetcolor(ulong v, ulong *r, ulong *g, ulong *b){	*r = (v>>16)&0xFF;	*g = (v>>8)&0xFF;	*b = v&0xFF;} voidflushmemscreen(Rectangle r){	ANativeWindow_Buffer buffer;	uint8_t *pixels;	int x, y, o, b;	ARect bounds; 	if (window == NULL)		return; 	memset(&buffer, 0, sizeof(buffer)); 	bounds.left = r.min.x;	bounds.top = r.min.y;	bounds.right = r.max.x;	bounds.bottom = r.max.y; 	if (ANativeWindow_lock(window, &buffer, &bounds) != 0) {		__android_log_print(ANDROID_LOG_WARN, "drawterm", "Unable to lock window buffer");		return;	} 	r.min.x = bounds.left;	r.min.y = bounds.top;	r.max.x = bounds.right;	r.max.y = bounds.bottom; 	pixels = (uint8_t*)buffer.bits;	for (y = r.min.y; y < r.max.y; y++)		for (x = r.min.x; x < r.max.x; x++) {			o = (y * screenWidth + x) * 4;			b = (y * buffer.stride + x) * 4;			pixels[b+3] = 0xFF;			pixels[b+2] = gscreen->data->bdata[o+0];			pixels[b+1] = gscreen->data->bdata[o+1];			pixels[b+0] = gscreen->data->bdata[o+2];		} 	if (ANativeWindow_unlockAndPost(window) != 0) {		__android_log_print(ANDROID_LOG_WARN, "drawterm", "Unable to unlock and post window buffer");	}	return;} voidscreeninit(void){	Rectangle r = Rect(0,0,screenWidth,screenHeight);	memimageinit();	screensize(r, XRGB32);	if (gscreen == nil)		panic("screensize failed");	gscreen->clipr = r;	qlock(&drawlock);	terminit();	flushmemscreen(r);	qunlock(&drawlock);	return;} voidscreensize(Rectangle r, ulong chan){	Memimage *mi; 	mi = allocmemimage(r, chan);	if (mi == nil)		return; 	if (gscreen != nil)		freememimage(gscreen); 	gscreen = mi;	gscreen->clipr = ZR;} Memdata*attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen){	*r = gscreen->clipr;	*depth = gscreen->depth;	*chan = gscreen->chan;	*width = gscreen->width;	*softscreen = 1; 	gscreen->data->ref++;	return gscreen->data;} voidsetcursor(void){	return;} voidmouseset(Point xy){	return;} voidguimain(void){	cpubody();} 

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t