[-- Attachment #1: Type: text/plain, Size: 613 bytes --] Dear 9front, I found a couple of forks (thank you echoline) of drawterm that include additions that for sure will profit the community. I've carefully merged them into our front branch and it would seem nothing was broken. I am aware of another fork by sirjofri that introduces improvements to the android implementation, but I haven't had a chance yet to make the merge. It would be great if we could make this part of our front branch (left to the community to decide) The original forks are https://github.com/echoline/drawterm-android https://github.com/echoline/drawterm-fbdev Best, Izaki [-- Attachment #2: 0001-Merging-echoline-s-android-and-fbdev-forks.patch --] [-- Type: application/octet-stream, Size: 231890 bytes --] From 67aff281ed261cf2f7ca4acdc269e6368e2a459e Mon Sep 17 00:00:00 2001 From: Lorenzo Bivens <git@lorenzobivens.info> Date: Fri, 13 Aug 2021 20:39:50 -0700 Subject: [PATCH] Merging echoline's android and fbdev forks --- Make.android | 38 + Make.android-386 | 26 + Make.android-amd64 | 26 + Make.android-arm | 26 + Make.android-arm64 | 26 + Make.fbdev | 22 + README | 11 + README.bak | 34 + gui-android/AndroidManifest.xml | 30 + gui-android/Makefile | 23 + gui-android/bin/.keep | 0 gui-android/cpp/android.c | 230 ++++++ gui-android/cpp/devandroid.c | 248 +++++++ gui-android/cpp/native-lib.c | 173 +++++ gui-android/gen/.keep | 0 .../org/echoline/drawterm/DrawTermThread.java | 32 + .../org/echoline/drawterm/MainActivity.java | 437 ++++++++++++ .../org/echoline/drawterm/MySurfaceView.java | 91 +++ gui-android/obj/.keep | 0 gui-android/res/drawable-hdpi/ic_small.png | Bin 0 -> 5361 bytes gui-android/res/drawable-mdpi/ic_small.png | Bin 0 -> 3173 bytes gui-android/res/drawable-xhdpi/ic_small.png | Bin 0 -> 5181 bytes gui-android/res/drawable-xxhdpi/ic_small.png | Bin 0 -> 8529 bytes gui-android/res/drawable-xxxhdpi/ic_small.png | Bin 0 -> 10972 bytes gui-android/res/layout/activity_main.xml | 24 + gui-android/res/layout/content_main.xml | 16 + gui-android/res/layout/drawterm_main.xml | 44 ++ gui-android/res/layout/item_main.xml | 8 + gui-android/res/layout/server_main.xml | 56 ++ gui-android/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 14867 bytes gui-android/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 11578 bytes gui-android/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 15155 bytes gui-android/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 20643 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 25294 bytes gui-android/res/values/colors.xml | 6 + gui-android/res/values/strings.xml | 3 + gui-android/res/values/styles.xml | 8 + gui-fbdev/Makefile | 12 + gui-fbdev/fbdev.c | 673 ++++++++++++++++++ kern/devaudio-alsa.c | 108 +++ lib/arm64-v8a/.keep | 0 lib/armeabi-v7a/.keep | 0 lib/x86/.keep | 0 lib/x86_64/.keep | 0 libc/getpid.c | 17 + main.c | 1 + 46 files changed, 2449 insertions(+) create mode 100644 Make.android create mode 100644 Make.android-386 create mode 100644 Make.android-amd64 create mode 100644 Make.android-arm create mode 100644 Make.android-arm64 create mode 100644 Make.fbdev create mode 100644 README.bak create mode 100644 gui-android/AndroidManifest.xml create mode 100644 gui-android/Makefile create mode 100644 gui-android/bin/.keep create mode 100644 gui-android/cpp/android.c create mode 100644 gui-android/cpp/devandroid.c create mode 100644 gui-android/cpp/native-lib.c create mode 100644 gui-android/gen/.keep create mode 100644 gui-android/java/org/echoline/drawterm/DrawTermThread.java create mode 100644 gui-android/java/org/echoline/drawterm/MainActivity.java create mode 100644 gui-android/java/org/echoline/drawterm/MySurfaceView.java create mode 100644 gui-android/obj/.keep create mode 100644 gui-android/res/drawable-hdpi/ic_small.png create mode 100644 gui-android/res/drawable-mdpi/ic_small.png create mode 100644 gui-android/res/drawable-xhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxxhdpi/ic_small.png create mode 100644 gui-android/res/layout/activity_main.xml create mode 100644 gui-android/res/layout/content_main.xml create mode 100644 gui-android/res/layout/drawterm_main.xml create mode 100644 gui-android/res/layout/item_main.xml create mode 100644 gui-android/res/layout/server_main.xml create mode 100644 gui-android/res/mipmap-hdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-mdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 gui-android/res/values/colors.xml create mode 100644 gui-android/res/values/strings.xml create mode 100644 gui-android/res/values/styles.xml create mode 100644 gui-fbdev/Makefile create mode 100644 gui-fbdev/fbdev.c create mode 100644 kern/devaudio-alsa.c create mode 100644 lib/arm64-v8a/.keep create mode 100644 lib/armeabi-v7a/.keep create mode 100644 lib/x86/.keep create mode 100644 lib/x86_64/.keep create mode 100644 libc/getpid.c diff --git a/Make.android b/Make.android new file mode 100644 index 0000000..00eaf68 --- /dev/null +++ b/Make.android @@ -0,0 +1,38 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +JAVA_HOME=/usr +OBJS=lib/arm64-v8a/libdrawterm.so lib/armeabi-v7a/libdrawterm.so lib/x86/libdrawterm.so lib/x86_64/libdrawterm.so + +all: drawterm.apk + +clean: + rm -f *.apk lib/*/*.so + +lib/arm64-v8a/libdrawterm.so: + CONF=android-arm64 make -j5; + CONF=android-arm64 make clean; + +lib/armeabi-v7a/libdrawterm.so: + CONF=android-arm make -j5; + CONF=android-arm make clean; + +lib/x86/libdrawterm.so: + CONF=android-386 make -j5; + CONF=android-386 make clean; + +lib/x86_64/libdrawterm.so: + CONF=android-amd64 make -j5; + CONF=android-amd64 make clean; + +drawterm.apk: drawterm-signed.apk + $(SDKPREFIX)/build-tools/30.0.3/zipalign -v -f 4 $< $@ + +drawterm-signed.apk: drawterm-unsigned.apk drawterm.keystore + $(JAVA_HOME)/bin/jarsigner -verbose -keystore ./drawterm.keystore -storepass glendarocks -keypass glendarocks -signedjar $@ $< drawtermKey + +drawterm-unsigned.apk: $(OBJS) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -v -f -M gui-android/AndroidManifest.xml -S gui-android/res -I $(SDKPREFIX)/platforms/android-21/android.jar -F $@ gui-android/bin + $(SDKPREFIX)/build-tools/30.0.3/aapt add $@ $(OBJS) + +drawterm.keystore: + $(JAVA_HOME)/bin/keytool -genkeypair -validity 1000 -dname "CN=9front,O=Android,C=US" -keystore $@ -storepass glendarocks -keypass glendarocks -alias drawtermKey -keyalg RSA -v diff --git a/Make.android-386 b/Make.android-386 new file mode 100644 index 0000000..ff43cf6 --- /dev/null +++ b/Make.android-386 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/i686-linux-android-ar +AS=$(NDKPREFIX)/i686-linux-android-as +RANLIB=$(NDKPREFIX)/i686-linux-android-ranlib +STRIP=$(NDKPREFIX)/i686-linux-android-strip +CC=$(NDKPREFIX)/i686-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=386; \ + (cd posix-$$arch && make) + diff --git a/Make.android-amd64 b/Make.android-amd64 new file mode 100644 index 0000000..3f5cf46 --- /dev/null +++ b/Make.android-amd64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/x86_64-linux-android-ar +AS=$(NDKPREFIX)/x86_64-linux-android-as +RANLIB=$(NDKPREFIX)/x86_64-linux-android-ranlib +STRIP=$(NDKPREFIX)/x86_64-linux-android-strip +CC=$(NDKPREFIX)/x86_64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86_64/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=amd64; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm b/Make.android-arm new file mode 100644 index 0000000..862d81d --- /dev/null +++ b/Make.android-arm @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/arm-linux-androideabi-ar +AS=$(NDKPREFIX)/arm-linux-androideabi-as +RANLIB=$(NDKPREFIX)/arm-linux-androideabi-ranlib +STRIP=$(NDKPREFIX)/arm-linux-androideabi-strip +CC=$(NDKPREFIX)/armv7a-linux-androideabi21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/armeabi-v7a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm64 b/Make.android-arm64 new file mode 100644 index 0000000..5ceab39 --- /dev/null +++ b/Make.android-arm64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/aarch64-linux-android-ar +AS=$(NDKPREFIX)/aarch64-linux-android-as +RANLIB=$(NDKPREFIX)/aarch64-linux-android-ranlib +STRIP=$(NDKPREFIX)/aarch64-linux-android-strip +CC=$(NDKPREFIX)/aarch64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/arm64-v8a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm64; \ + (cd posix-$$arch && make) + diff --git a/Make.fbdev b/Make.fbdev new file mode 100644 index 0000000..ed8e1b0 --- /dev/null +++ b/Make.fbdev @@ -0,0 +1,22 @@ +# Unix +#PTHREAD= # for Mac +PTHREAD=-pthread +AR=ar +AS=as +RANLIB=ranlib +CC=gcc +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -D_THREAD_SAFE $(PTHREAD) -O2 +O=o +OS=posix +GUI=fbdev +LDADD=-ggdb -lm -lasound +LDFLAGS=$(PTHREAD) +TARG=drawterm +# AUDIO=none +AUDIO=alsa + +all: default + +libmachdep.a: + arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/; s/x86_64/amd64/; s/armv[567].*/arm/; s/aarch64/arm64/'`; \ + (cd posix-$$arch && make) diff --git a/README b/README index 2599800..749273f 100644 --- a/README +++ b/README @@ -18,6 +18,17 @@ To build on Mac OS X with X11 (xquartz), run CONF=osx-x11 make. To build on Mac OS X with Cocoa, run CONF=osx-cocoa make and "cp drawterm gui-cocoa/drawterm.app/". +To build for Android, make sure Make.android* and gui-android/Makefile are correct for your build and target systems, then run make -f Make.android + +USAGE +------- +On Android the five checkboxes at the top represent the three mouse buttons and mousewheel, determining which "buttons" are clicked. The "kb" button toggles the soft keyboard. + + +CAVEATS +-------- +Be aware that right now on Android the login details are saved as a plaintext string if saved, and there is no secstore support. + BINARIES --------- diff --git a/README.bak b/README.bak new file mode 100644 index 0000000..2599800 --- /dev/null +++ b/README.bak @@ -0,0 +1,34 @@ +DESCRIPTION +----------- +This is a fork of Russ Cox's drawterm to incorporate features +from Plan9front (http://9front.org), most importantly DP9IK +authentication support (see authsrv(6)) and the TLS based rcpu(1) +protocol. + + +INSTALLATION +-------------- +To build on Unix, run CONF=unix make. + +To build on Solaris using Sun cc, run CONF=sun make. + +To build on Windows, you can't use Visual C. Use Mingw on cygwin. + +To build on Mac OS X with X11 (xquartz), run CONF=osx-x11 make. + +To build on Mac OS X with Cocoa, run CONF=osx-cocoa make and "cp drawterm gui-cocoa/drawterm.app/". + + +BINARIES +--------- +http://drawterm.9front.org/ + + +SOURCE +------ +http://git.9front.org/plan9front/drawterm/HEAD/info.html + + +HELP +---- +No. diff --git a/gui-android/AndroidManifest.xml b/gui-android/AndroidManifest.xml new file mode 100644 index 0000000..97be515 --- /dev/null +++ b/gui-android/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.echoline.drawterm"> + + <supports-screens android:largeScreens="true" + android:normalScreens="true" android:smallScreens="true" + android:anyDensity="true" /> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + <activity + android:name=".MainActivity" + android:label="@string/app_name" + android:windowSoftInputMode="stateUnchanged|adjustNothing"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + <uses-permission android:name="android.permission.INTERNET"/> + <!--<uses-permission android:name="android.permission.SET_DEBUG_APP"/>--> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.CAMERA"/> +</manifest> diff --git a/gui-android/Makefile b/gui-android/Makefile new file mode 100644 index 0000000..04df778 --- /dev/null +++ b/gui-android/Makefile @@ -0,0 +1,23 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + cpp/android.$O\ + cpp/native-lib.$O\ + cpp/devandroid.$O\ + +default: $(LIB) gen/org/echoline/drawterm/R.java bin/classes.dex +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + +gen/org/echoline/drawterm/R.java: $(shell find res/ -type f) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -f -m -M AndroidManifest.xml -I $(SDKPREFIX)/platforms/android-21/android.jar -S res/ -J gen + +bin/classes.dex: obj/org/echoline/drawterm/MainActivity.class obj/org/echoline/drawterm/DrawTermThread.class obj/org/echoline/drawterm/MySurfaceView.class + $(SDKPREFIX)/build-tools/30.0.3/dx --dex --verbose --output=$@ obj/ + +obj/org/echoline/drawterm/%.class: java/org/echoline/drawterm/%.java + $(JAVA_HOME)/bin/javac -d obj/ -classpath $(SDKPREFIX)/platforms/android-21/android.jar -sourcepath java java/org/echoline/drawterm/$*.java gen/org/echoline/drawterm/R.java + diff --git a/gui-android/bin/.keep b/gui-android/bin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/gui-android/cpp/android.c b/gui-android/cpp/android.c new file mode 100644 index 0000000..e6a2e0f --- /dev/null +++ b/gui-android/cpp/android.c @@ -0,0 +1,230 @@ +#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; +} + +int +clipwrite(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; +} + +void +show_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; +} + +int +num_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; +} + +void +take_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; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + return; +} + +void +getcolor(ulong v, ulong *r, ulong *g, ulong *b) +{ + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +flushmemscreen(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; +} + +void +screeninit(void) +{ + Rectangle r = Rect(0,0,screenWidth,screenHeight); + memimageinit(); + screensize(r, XRGB32); + if (gscreen == nil) + panic("screensize failed"); + gscreen->clipr = r; + terminit(); + qlock(&drawlock); + flushmemscreen(r); + qunlock(&drawlock); + return; +} + +void +screensize(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; +} + +void +setcursor(void) +{ + return; +} + +void +mouseset(Point xy) +{ + return; +} + +void +guimain(void) +{ + cpubody(); +} + diff --git a/gui-android/cpp/devandroid.c b/gui-android/cpp/devandroid.c new file mode 100644 index 0000000..daf2f57 --- /dev/null +++ b/gui-android/cpp/devandroid.c @@ -0,0 +1,248 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <android/log.h> +#include <android/sensor.h> + +void show_notification(char *buf); +void take_picture(int id); +int num_cameras(); + +int Ncameras = 0; + +uchar *cambuf = nil; +int camlen; + +ASensorManager *sensorManager = NULL; + +enum +{ + Qdir = 0, + Qcam = 1, + Qaccel = 2, + Qcompass = 4, + Qnotification = 6, +}; +#define QID(p, c, y) (((p)<<16) | ((c)<<4) | (y)) + +static void androidinit(void); + +static void +androidinit(void) +{ + sensorManager = ASensorManager_getInstance(); + + Ncameras = num_cameras(); +} + +static Chan* +androidattach(char *param) +{ + Chan *c; + + c = devattach('N', param); + c->qid.path = QID(0, 0, Qdir); + c->qid.type = QTDIR; + c->qid.vers = 0; + + return c; +} + +static int +androidgen(Chan *c, char *n, Dirtab *d, int nd, int s, Dir *dp) +{ + Qid q; + + if (s == DEVDOTDOT) { + mkqid(&q, Qdir, 0, QTDIR); + devdir(c, q, "#N", 0, eve, 0555, dp); + return 1; + } + if (s < Ncameras) { + sprintf(up->genbuf, "cam%d.jpg", s); + mkqid(&q, (s << 16) | Qcam, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == Ncameras) { + sprintf(up->genbuf, "accel"); + mkqid(&q, Qaccel, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+1)) { + sprintf(up->genbuf, "compass"); + mkqid(&q, Qcompass, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+2)) { + sprintf(up->genbuf, "notification"); + mkqid(&q, Qnotification, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0222, dp); + return 1; + } + return -1; +} + +static Walkqid* +androidwalk(Chan *c, Chan *nc, char **name, int nname) +{ + return devwalk(c, nc, name, nname, 0, 0, androidgen); +} + +static int +androidstat(Chan *c, uchar *db, int n) +{ + return devstat(c, db, n, 0, 0, androidgen); +} + +static Chan* +androidopen(Chan *c, int omode) +{ + p9_uvlong s; + + c = devopen(c, omode, 0, 0, androidgen); + + if (c->qid.path & Qcam) { + s = c->qid.path >> 16; + take_picture(s); + } + c->mode = openmode(omode); + c->flag |= COPEN; + c->offset = 0; + c->iounit = 8192; + + return c; +} + +static void +androidclose(Chan *c) +{ + if (c->qid.path & Qcam && cambuf != nil) { + free(cambuf); + cambuf = nil; + } +} + +static long +androidread(Chan *c, void *v, long n, vlong off) +{ + char *a = v; + long l; + const ASensor *sensor; + ASensorEventQueue *queue = NULL; + ASensorEvent data; + + switch((ulong)c->qid.path & 0xF) { + default: + error(Eperm); + return -1; + + case Qcam: + while(cambuf == nil) + usleep(10 * 1000); + + l = camlen - off; + if (l > n) + l = n; + + if (l > 0) + memcpy(a, cambuf + off, l); + + return l; + case Qaccel: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qcompass: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_MAGNETIC_FIELD); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qdir: + return devdirread(c, a, n, 0, 0, androidgen); + } +} + +static long +androidwrite(Chan *c, void *vp, long n, vlong off) +{ + char *a = vp; + char *str; + + switch((ulong)c->qid.path) { + case Qnotification: + str = malloc(n+1); + memcpy(str, a, n); + str[n] = '\0'; + show_notification(str); + free(str); + return n; + default: + error(Eperm); + break; + } + return -1; +} + +Dev androiddevtab = { + 'N', + "android", + + devreset, + androidinit, + devshutdown, + androidattach, + androidwalk, + androidstat, + androidopen, + devcreate, + androidclose, + androidread, + devbread, + androidwrite, + devbwrite, + devremove, + devwstat, +}; diff --git a/gui-android/cpp/native-lib.c b/gui-android/cpp/native-lib.c new file mode 100644 index 0000000..1e768b3 --- /dev/null +++ b/gui-android/cpp/native-lib.c @@ -0,0 +1,173 @@ +#include <jni.h> +#include <android/native_window.h> +#include <android/native_window_jni.h> +#include <android/log.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include <draw.h> +#include <string.h> +#include <keyboard.h> + +void absmousetrack(int, int, int, ulong); +ulong ticks(void); +int dt_main(int, char**); +int screenWidth; +int screenHeight; +Point mousept = {0, 0}; +int buttons = 0; +float ws = 1; +float hs = 1; +extern char *snarfbuf; +int mPaused = 0; +ANativeWindow *window = NULL; +jobject mainActivityObj; +JavaVM *jvm; +void flushmemscreen(Rectangle r); +extern uchar *cambuf; +extern int camlen; + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setObject( + JNIEnv *env, + jobject obj) { + mainActivityObj = (*env)->NewGlobalRef(env, obj); + jint rs = (*env)->GetJavaVM(env, &jvm); + assert(rs == JNI_OK); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyDown( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyUp( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setPass( + JNIEnv *env, + jobject obj, + jstring str) { + setenv("PASS", (char*)(*env)->GetStringUTFChars(env, str, 0), 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidth( + JNIEnv *env, + jobject obj, + jint width) { + screenWidth = width; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeight( + JNIEnv *env, + jobject obj, + jint height) { + screenHeight = height; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidthScale( + JNIEnv *env, + jobject obj, + jfloat s) { + ws = s; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeightScale( + JNIEnv *env, + jobject obj, + jfloat s) { + hs = s; +} + +JNIEXPORT jint JNICALL +Java_org_echoline_drawterm_MainActivity_dtmain( + JNIEnv *env, + jobject obj, + jobjectArray argv) { + int i, ret; + char **args = (char **) malloc(((*env)->GetArrayLength(env, argv)+1) * sizeof(char *)); + + for (i = 0; i < (*env)->GetArrayLength(env, argv); i++) { + jobject str = (jobject) (*env)->GetObjectArrayElement(env, argv, i); + args[i] = strdup((char*)(*env)->GetStringUTFChars(env, (jstring)str, 0)); + } + args[(*env)->GetArrayLength(env, argv)] = NULL; + + ret = dt_main(i, args); + + for (i = 0; args[i] != NULL; i++) { + free(args[i]); + } + free(args); + + return ret; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setMouse( + JNIEnv *env, + jobject obj, + jintArray args) { + jboolean isCopy; + jint *data; + if ((*env)->GetArrayLength(env, args) < 3) + return; + data = (*env)->GetIntArrayElements(env, args, &isCopy); + mousept.x = (int)(data[0] / ws); + mousept.y = (int)(data[1] / hs); + buttons = data[2]; + (*env)->ReleaseIntArrayElements(env, args, data, 0); + absmousetrack(mousept.x, mousept.y, buttons, ticks()); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setDTSurface( + JNIEnv* jenv, + jobject obj, + jobject surface) { + if (surface != NULL) { + window = ANativeWindow_fromSurface(jenv, surface); + ANativeWindow_setBuffersGeometry(window, screenWidth, screenHeight, + AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM); + flushmemscreen(Rect(0, 0, screenWidth, screenHeight)); + } else if (window != NULL) { + ANativeWindow_release(window); + window = NULL; + } +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_exitDT( + JNIEnv* jenv, + jobject obj) { + exit(0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_sendPicture( + JNIEnv* env, + jobject obj, + jbyteArray array) { + jint len = (*env)->GetArrayLength(env, array); + jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL); + camlen = len; + cambuf = malloc(camlen); + memcpy(cambuf, bytes, camlen); + (*env)->ReleaseByteArrayElements(env, array, bytes, 0); +} + diff --git a/gui-android/gen/.keep b/gui-android/gen/.keep new file mode 100644 index 0000000..e69de29 diff --git a/gui-android/java/org/echoline/drawterm/DrawTermThread.java b/gui-android/java/org/echoline/drawterm/DrawTermThread.java new file mode 100644 index 0000000..52baae8 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/DrawTermThread.java @@ -0,0 +1,32 @@ +package org.echoline.drawterm; + +/** + * Created by eli on 12/4/17. + */ + +public class DrawTermThread extends Thread { + private MainActivity m; + private String p; + private String []args; + + public DrawTermThread(String []args, String p, MainActivity m) { + this.m = m; + this.p = p; + this.args = args; + } + + @Override + public void run() { + if (p != null && !p.equals("")) + m.setPass(p); + m.dtmain(args); + m.runOnUiThread(new Runnable() { + @Override + public void run() { + m.exitDT(); + m.setContentView(R.layout.server_main); + m.populateServers(m); + } + }); + } +} diff --git a/gui-android/java/org/echoline/drawterm/MainActivity.java b/gui-android/java/org/echoline/drawterm/MainActivity.java new file mode 100644 index 0000000..2e9b852 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MainActivity.java @@ -0,0 +1,437 @@ +package org.echoline.drawterm; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.Point; +import android.os.Bundle; +import android.os.Environment; + +import android.app.Activity; + +import android.app.Notification; +import android.app.NotificationManager; + +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.MotionEvent; +import android.view.View; +import android.view.Menu; +import android.view.MenuItem; +import android.view.WindowManager; +import android.view.Surface; +import android.view.inputmethod.InputMethodManager; +import android.view.KeyEvent; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.TotalCaptureResult; +import android.media.Image; +import android.media.ImageReader; +import android.graphics.ImageFormat; +import android.os.Handler; +import android.os.HandlerThread; + +import java.io.File; +import java.util.Map; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.ArrayList; + +public class MainActivity extends Activity { + private Map<String, ?> map; + private MainActivity mainActivity; + private boolean dtrunning = false; + private DrawTermThread dthread; + private int notificationId; + private CameraDevice cameraDevice = null; + private byte []jpegBytes; + + static { + System.loadLibrary("drawterm"); + } + + public void showNotification(String text) { + Notification.Builder builder = new Notification.Builder(this) + .setDefaults(Notification.DEFAULT_SOUND) + .setSmallIcon(R.drawable.ic_small) + .setContentText(text) + .setStyle(new Notification.BigTextStyle().bigText(text)) + .setPriority(Notification.PRIORITY_DEFAULT); + + ((NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE)).notify(notificationId, builder.build()); + notificationId++; + } + + public int numCameras() { + try { + return ((CameraManager)getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length; + } catch (CameraAccessException e) { + Log.w("drawterm", e.toString()); + return 0; + } + } + + public void takePicture(int id) { + try { + HandlerThread mBackgroundThread = new HandlerThread("Camera Background"); + mBackgroundThread.start(); + Handler mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); + CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); + String []cameraIdList = manager.getCameraIdList(); + manager.openCamera(cameraIdList[id], new CameraDevice.StateCallback() { + public void onOpened(CameraDevice device) { + cameraDevice = device; + } + public void onDisconnected(CameraDevice device) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + public void onError(CameraDevice device, int error) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + }, mBackgroundHandler); + ImageReader reader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1); + CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG); + captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); + captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getWindowManager().getDefaultDisplay().getRotation()); + captureBuilder.addTarget(reader.getSurface()); + reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { + public void onImageAvailable(ImageReader reader) { + Image image = null; + try { + image = reader.acquireLatestImage(); + ByteBuffer buffer = image.getPlanes()[0].getBuffer(); + jpegBytes = new byte[buffer.capacity()]; + buffer.get(jpegBytes); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } finally { + if (image != null) { + image.close(); + } + } + } + }, mBackgroundHandler); + List<Surface> outputSurfaces = new ArrayList<Surface>(1); + outputSurfaces.add(reader.getSurface()); + cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { + public void onConfigured(CameraCaptureSession session) { + try { + List<CaptureRequest> captureRequests = new ArrayList<CaptureRequest>(10); + for (int i = 0; i < 10; i++) + captureRequests.add(captureBuilder.build()); + session.captureBurst(captureRequests, new CameraCaptureSession.CaptureCallback() { + public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) { + try { + sendPicture(jpegBytes); + mBackgroundThread.quitSafely(); + mBackgroundThread.join(); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } + } + }, mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + public void onConfigureFailed(CameraCaptureSession session) { + } + }, mBackgroundHandler); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void serverView(View v) { + setContentView(R.layout.server_main); + serverButtons(); + + String s = (String)map.get(((TextView)v).getText().toString()); + String []a = s.split("\007"); + + ((EditText)findViewById(R.id.cpuServer)).setText((String)a[0]); + ((EditText)findViewById(R.id.authServer)).setText((String)a[1]); + ((EditText)findViewById(R.id.userName)).setText((String)a[2]); + if (a.length > 3) + ((EditText)findViewById(R.id.passWord)).setText((String)a[3]); + } + + public void populateServers(Context context) { + ListView ll = (ListView)findViewById(R.id.servers); + ArrayAdapter<String> la = new ArrayAdapter<String>(this, R.layout.item_main); + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + map = (Map<String, ?>)settings.getAll(); + String key; + Object []keys = map.keySet().toArray(); + for (int i = 0; i < keys.length; i++) { + key = (String)keys[i]; + la.add(key); + } + ll.setAdapter(la); + + setDTSurface(null); + dtrunning = false; + } + + public void runDrawterm(String []args, String pass) { + Resources res = getResources(); + DisplayMetrics dm = res.getDisplayMetrics(); + + int wp = dm.widthPixels; + int hp = dm.heightPixels; + + setContentView(R.layout.drawterm_main); + + Button kbutton = (Button)findViewById(R.id.keyboardToggle); + kbutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); + } + }); + + int rid = res.getIdentifier("navigation_bar_height", "dimen", "android"); + if (rid > 0) { + hp -= res.getDimensionPixelSize(rid); + } + LinearLayout ll = (LinearLayout)findViewById(R.id.dtButtons); + hp -= ll.getHeight(); + + int w = (int)(wp * (160.0/dm.xdpi)); + int h = (int)(hp * (160.0/dm.ydpi)); + float ws = (float)wp/w; + float hs = (float)hp/h; + // only scale up + if (ws < 1) { + ws = 1; + w = wp; + } + if (hs < 1) { + hs = 1; + h = hp; + } + + MySurfaceView mView = new MySurfaceView(mainActivity, w, h, ws, hs); + mView.getHolder().setFixedSize(w, h); + + LinearLayout l = (LinearLayout)findViewById(R.id.dlayout); + l.addView(mView, 1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); + + dthread = new DrawTermThread(args, pass, mainActivity); + dthread.start(); + + dtrunning = true; + } + + public void serverButtons() { + Button button = (Button)findViewById(R.id.save); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(user + "@" + cpu + " (auth=" + auth + ")", cpu + "\007" + auth + "\007" + user + "\007" + pass); + editor.commit(); + } + }); + + button = (Button) findViewById(R.id.connect); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + String args[] = {"drawterm", "-p", "-h", cpu, "-a", auth, "-u", user}; + runDrawterm(args, pass); + } + }); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + + mainActivity = this; + setObject(); + setContentView(R.layout.activity_main); + populateServers(this); + + View fab = findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setContentView(R.layout.server_main); + serverButtons(); + } + }); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + if (!dtrunning) { + return super.dispatchKeyEvent(event); + } + + int k = event.getUnicodeChar(); + if (k == 0) { + k = event.getDisplayLabel(); + if (k >= 'A' && k <= 'Z') + k |= 0x20; + } + String chars = event.getCharacters(); + if (k == 0 && chars != null) { + for (int i = 0; i < chars.length(); i++) { + k = chars.codePointAt(i); + keyDown(k); + keyUp(k); + } + return true; + } + + if (k == 0) switch (event.getKeyCode()) { + case KeyEvent.KEYCODE_DEL: + k = 0x0008; + break; + case KeyEvent.KEYCODE_FORWARD_DEL: + k = 0x007F; + break; + case KeyEvent.KEYCODE_ESCAPE: + k = 0x001B; + break; + case KeyEvent.KEYCODE_MOVE_HOME: + k = 0xF00D; + break; + case KeyEvent.KEYCODE_MOVE_END: + k = 0xF018; + break; + case KeyEvent.KEYCODE_PAGE_UP: + k = 0xF00F; + break; + case KeyEvent.KEYCODE_PAGE_DOWN: + k = 0xF013; + break; + case KeyEvent.KEYCODE_INSERT: + k = 0xF014; + break; + case KeyEvent.KEYCODE_SYSRQ: + k = 0xF010; + break; + case KeyEvent.KEYCODE_DPAD_UP: + k = 0xF00E; + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + k = 0xF011; + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + k = 0xF012; + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + k = 0xF800; + break; + } + + if (k == 0) + return true; + + if (event.isCtrlPressed()) { + keyDown(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyDown(0xF015); + } + + if (event.getAction() == KeyEvent.ACTION_DOWN) { + keyDown(k); + } + else if (event.getAction() == KeyEvent.ACTION_UP) { + keyUp(k); + } + + if (event.isCtrlPressed()) { + keyUp(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyUp(0xF015); + } + + return true; + } + + @Override + public void onBackPressed() + { + } + + @Override + public void onDestroy() + { + setDTSurface(null); + dtrunning = false; + exitDT(); + super.onDestroy(); + } + + public void setClipBoard(String str) { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = ClipData.newPlainText(null, str); + cm.setPrimaryClip(cd); + } + } + + public String getClipBoard() { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = cm.getPrimaryClip(); + if (cd != null) + return (String)(cd.getItemAt(0).coerceToText(mainActivity.getApplicationContext()).toString()); + } + return ""; + } + + public native void dtmain(Object[] args); + public native void setPass(String arg); + public native void setWidth(int arg); + public native void setHeight(int arg); + public native void setWidthScale(float arg); + public native void setHeightScale(float arg); + public native void setDTSurface(Surface surface); + public native void setMouse(int[] args); + public native void setObject(); + public native void keyDown(int c); + public native void keyUp(int c); + public native void exitDT(); + public native void sendPicture(byte[] array); +} diff --git a/gui-android/java/org/echoline/drawterm/MySurfaceView.java b/gui-android/java/org/echoline/drawterm/MySurfaceView.java new file mode 100644 index 0000000..fe71676 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MySurfaceView.java @@ -0,0 +1,91 @@ +package org.echoline.drawterm; + +import android.util.Log; + +import android.content.Context; +import android.graphics.Bitmap; +import android.os.SystemClock; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.SurfaceHolder; +import android.view.View; +import android.widget.CheckBox; +import android.widget.EditText; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.security.spec.ECField; + +/** + * Created by eli on 12/3/17. + */ +public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { + private int screenWidth, screenHeight; + private MainActivity mainActivity; + private float ws, hs; + + public MySurfaceView(Context context, int w, int h, float ws, float hs) { + super(context); + screenHeight = h; + screenWidth = w; + this.ws = ws; + this.hs = hs; + mainActivity = (MainActivity)context; + mainActivity.setWidth(screenWidth); + mainActivity.setHeight(screenHeight); + mainActivity.setWidthScale(ws); + mainActivity.setHeightScale(hs); + setWillNotDraw(true); + + getHolder().addCallback(this); + + setOnTouchListener(new View.OnTouchListener() { + private int[] mouse = new int[3]; + + @Override + public boolean onTouch(View v, MotionEvent event) { + CheckBox left = (CheckBox)mainActivity.findViewById(R.id.mouseLeft); + CheckBox middle = (CheckBox)mainActivity.findViewById(R.id.mouseMiddle); + CheckBox right = (CheckBox)mainActivity.findViewById(R.id.mouseRight); + CheckBox up = (CheckBox)mainActivity.findViewById(R.id.mouseUp); + CheckBox down = (CheckBox)mainActivity.findViewById(R.id.mouseDown); + int buttons = (left.isChecked()? 1: 0) | + (middle.isChecked()? 2: 0) | + (right.isChecked()? 4: 0) | + (up.isChecked()? 8: 0) | + (down.isChecked()? 16: 0); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = 0; + mainActivity.setMouse(mouse); + } + return true; + } + }); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + mainActivity.setDTSurface(holder.getSurface()); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int w, int h, int format) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + mainActivity.setDTSurface(null); + } +} diff --git a/gui-android/obj/.keep b/gui-android/obj/.keep new file mode 100644 index 0000000..e69de29 diff --git a/gui-android/res/drawable-hdpi/ic_small.png b/gui-android/res/drawable-hdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..67c067bf719be65701ad8a91af18060a7bb4358e GIT binary patch literal 5361 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 P00000NkvXXu0mjf7mR>_ literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-mdpi/ic_small.png b/gui-android/res/drawable-mdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7c24e6ac8bc34d41eee51805cc6f224c963072c2 GIT binary patch literal 3173 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 LNkvXXu0mjf)t&&% literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xhdpi/ic_small.png b/gui-android/res/drawable-xhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b85001eb8f634484150e4f6b12e3e972190aa9 GIT binary patch literal 5181 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�DLt() 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxhdpi/ic_small.png b/gui-android/res/drawable-xxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7dc776c15ddacd33574b519fa0e6335f1be1ea GIT binary patch literal 8529 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 LNkvXXu0mjf)9P)C literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxxhdpi/ic_small.png b/gui-android/res/drawable-xxxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9205252fd9bbdabb58cb12d303ca65c9d2170d GIT binary patch literal 10972 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 KMNUMnLSTY*4_h4o literal 0 HcmV?d00001 diff --git a/gui-android/res/layout/activity_main.xml b/gui-android/res/layout/activity_main.xml new file mode 100644 index 0000000..14c98eb --- /dev/null +++ b/gui-android/res/layout/activity_main.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <include layout="@layout/content_main" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end"> + + <Button + android:id="@+id/fab" + android:text="add server" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/content_main.xml b/gui-android/res/layout/content_main.xml new file mode 100644 index 0000000..8a7f802 --- /dev/null +++ b/gui-android/res/layout/content_main.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity" + tools:showIn="@layout/activity_main"> + <ListView + android:id="@+id/servers" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + </ListView> +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/drawterm_main.xml b/gui-android/res/layout/drawterm_main.xml new file mode 100644 index 0000000..cb5c9f3 --- /dev/null +++ b/gui-android/res/layout/drawterm_main.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/dlayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:gravity="center_horizontal" + android:orientation="horizontal" + android:id="@+id/dtButtons"> + + <CheckBox + android:id="@+id/mouseLeft" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseMiddle" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseRight" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseUp" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseDown" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <Button + android:id="@+id/keyboardToggle" + android:text="kb" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + </LinearLayout> +</LinearLayout> diff --git a/gui-android/res/layout/item_main.xml b/gui-android/res/layout/item_main.xml new file mode 100644 index 0000000..9049612 --- /dev/null +++ b/gui-android/res/layout/item_main.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" android:layout_height="match_parent" + android:padding="10dp" + android:textSize="16sp" + android:onClick="serverView"> +</TextView> + diff --git a/gui-android/res/layout/server_main.xml b/gui-android/res/layout/server_main.xml new file mode 100644 index 0000000..3d592c2 --- /dev/null +++ b/gui-android/res/layout/server_main.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_height="match_parent" + android:layout_width="match_parent" + android:orientation="vertical"> + + <EditText + android:id="@+id/cpuServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="CPU" /> + <EditText + android:id="@+id/authServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Auth" /> + <EditText + android:id="@+id/userName" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Username" /> + + <EditText + android:id="@+id/passWord" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:password="true" + android:hint="Password"/> + + <Button + android:id="@+id/save" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Save" /> + + <Button + android:id="@+id/connect" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Connect" /> + + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/mipmap-hdpi/ic_launcher.png b/gui-android/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5099b530fa24f18ecb088d985011b9256cec23c3 GIT binary patch literal 14867 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%0A-!|tp?(%~dGeU(OzG<!BcfhS4 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 FV1lP!Um5@a literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-mdpi/ic_launcher.png b/gui-android/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8a70757f25145079718cbe7e8b53dda8994a752d GIT binary patch literal 11578 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xhdpi/ic_launcher.png b/gui-android/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..66e95343855f47c004d3504193f99a450d3b5ad6 GIT binary patch literal 15155 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..52aaeb67a697a95bd6f7f3d268705a3ff50fe2e9 GIT binary patch literal 20643 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 O0000<MNUMnLSTZOT>QcS literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3c0243beb4ceab4fd710fbf8179d5f92588877 GIT binary patch literal 25294 zcmV)KK)Sz)P)<h;3K|Lk000e1NJLTq006)M006)U1ONa4_|>G0001DBdQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;uavV95h5zFea|FP#9|x;h-(ZeE-$SO<s-?Tt zW>YMQVlo*K@Z~KI(4GJN$94b1f3<pZDc4qdDW3mQPu&LpX#VqGe}4y`-rw)P_5BuK z|KWA_^BcxXk<an-WgXx54_?pz{DB|$2=kAxyY~H#weN+#-}rICs5=|~*uOp`uiNMK zkiHk{=kt%!TmAJ>r+t_5edBwS@1I!TrGH*TU%OvlNR=q<%)6r5i6Q#;cl$g+{QMbu zoxgqTyf4J^UNOg~9Dgi{fc#;3KR$c^Yk>X`<RAZXe~$jofBh-=HomXNKgF_qW5hrH z_8TGpeehq1f4On|`9$`|ZyX=iUzYRzbMJ2Vp3mw=Dnzt=E6Tec(b3QF#!1NI`?11D z<xl3{^?h_cnje0VoK0m;K33?#i2ijUg&jt?;k?f)EFLl0vC3z&W%0e%Vzq87Do;rt z;aZJ7?%2rXvg2apW&8Oo;oY~t`>oKp^A5b#0v996|N6uIyKnwCAMReoHU!^(#){`M zRW6UA%;|65MMA>;<}JSf|M>W(-~UoSlqwm_FU*Yv4nIGam^u8jw&Kfk<b9dXpRNe5 z?(YQ%5%<nKOo(K_mk@I(!B?{y0"Xz=6~lT9)Za<<JwT8goltJX~S=4Wbn@3m~j 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%0A3FH@QV2 z1*M%)Sr@|2@$F9GQeLMl#tMkRvxLYp!o{*))DwV3FQl@$jDaW=%fzBv_vZwnC+zSq zZ5pa;57s=!Nx1cC?wHb8=qr^_rT8=cj1&CbPvwZ*{6`%yy?Zbe88gPR*D`kSedV~R z0{BCgA66o0#!7nUWQ4M}uXJ2x))m{6u4<p%*v;S`4VDT1ymdgvm~B4do&{<B12~U4 z04S>ix1p|NTYYbvfPGTnAwT9Uutw)&-|E40Uzyso2F{r>W{2zCm9dLV=4Yy7;bv`~ z#c-9=Oi~Vi8gW2nOo(WUDBwUcBx6BBcZEeJpx|dRK;;0&e8?rP*zKsg7G_H?pF3Of z)PeHNEYu3_R$oI#AdcZ3;5J|3&5vnxs6(;S>iue)I1jkYMXp#~BO^IKHCVe^9<Aje zE-q8|Y}H(z{&MkKgkpkX!pypyd;yj*7?IliOa`bv;x?D~$9#)I;<3EkESP`;?x2p4 z)-z>eCGE?tl1(xU@A59o{5_6;Y^P~)tkpQCuFmO{P2S`0u?-^IRE-bn8jP)kPMm}7 zYU^5dRc&GQ>^AOVu)JV~C}NqtJUESCgyZbblLe&=+2$&j_?BGZHmTDB)V0{pLiWE{ zF}iQ5o<bT7A)WxdyIkRAjO{eFXb>LKdtHPDX6!Q(q(`HKJhLtDye|;ClHm(a#AP!w zJh}t~<f8MK*K(tSQ_M;nSti_%j2Sb6LlR^IwIsy<Y|dxI2fXLB;4^6fR>-5SwE~qB z4-QU()y<{tO63xbsn(xdq04nNa{^9smUWf{xBR%*l$%^--`>PI5BShJ!kPGfE%FAM zlnHa&$O(xg-OQcasTS5hyCSs3_A#FsGj@T5&;e+St^ajRKL0be;NRo#vJJEZuyPyV ziwWl8CQvq*J#K-Zu__QnW8C9A{E>il4gMB?L4dZ-LbJaD4+;(TJ+AT3`4<f6vn#(N zpeg2^iQB2V#fpGH_z;08TvY2;@)`-n*zvzI!AvlCmg=>b3g93D+5u(!PoMb=+2S%6 z<qA*4`6$PkRH~mGKtm3T0@P$<aP<7Ex80!0*cs)R@g6I{h!s2G?naT)03j*2xyH8{ zQ0hDv5;{$K#G+qOJ`N*XpEhktMLm#7$y8{&85vr_vymf^+vZH}Ff<_I3}a#OEw)va zLnr%015}P<$R*z6qBJ3qi^)Q0NhmczE9~<iVCLq<)x~sutG1CK0jD@Cpt_6futb+e zjdf}q1V11kV}nbF$dhSuJQ~)`6(B)|PlKii+$a*p44E;vS$#$#tJmv4tMUWNX8COt zEhdZ|WnJZL5UlQ%|5=>Rf6E?N`4~5UpjL91(6sqP;-33GY5~U3GFcXbv<izFb(7zd zE1%U&>sH&P09s1J!UCS9Nh+cGrWQWSggsZRkq9LB88DRM%7B$iuD5)YQ)8EX2u	 z+w{QQS2c%eK8*`1$cLA?$euW(>I!S8O04!osu}{X9PoJ&tge$xSismz)TsO_kAOtp z#mB!ArybG}U+X(Q-xKp>mM4)5OCl5A>YPLhC0`V_s2Q<PLGr~}xf;Hi{T+oiu$EY& zoJy#Yd;Js!7;%aB_%YwJ(O_!5zp@Bp^&#s(u3H#sCny^Se_V_XZvQ|#B&<XPia*P% zBSglcbn@)PjdtXjs$-Ecu~Id2LIM<ugc*s@jmuB%%VKn|mUQGocPu|;LLy5*%>p~B zJd&Tn09(Ar-(diBWQ<|#Fn_cYhP4zgrj~f&;GV8DYrT1XFfc3JLA|PYY1tB}G;#%@ zm5#~?n?YHr9MA5F^z1=VPHL&d-OZUZ6Jh*@ocLIRw04^M?(cGMdbysith4KN@M4nw z*h)AT!HPNiT(O}nr^8epzgh^JY5_$tHbN*T(3%=iQPl`r`2jH7lgE_HL(Cm_W@<OA zWNCQL0F-iCr^==V<s(uK3ahM!btbMTz!On~5XFp~5h<y&v?{lNGz*$@i(NQXOOz{4 zQjwrM)&O(HY;v0$T(#uGjJZImE*w=oXym`Tv$e_=GB{n}#g387@Tu~rs?VHTI%Dw& z%ch6R7Iin^xqO8RU{;n|t7^m*<s3WD@<$8(xh9%GX8z}5;*#{3IpN)NNC#EEQ<8y| zolmYxvErTkj|*aBw)lwe@DJIg+$CX{E>wioW7f7D*J54I0m9tnYGwg;U}1hzQP+{K z0~VF6BnM8qvY>HZt2-;QRe8#DYrIA7cIn*<2Ut|dIT3-4Kw9ELX75*E`JcuCEsDDo zIWEXpt_Ds%_80?f@)4K#o-JXD%ttw0P7ZM2D)&&YB<e_!K2QVe8is0|#Sg|oNnPqy z9SFdp^rn`7RUIyET}9EqEpDk_OHHZy@-oXQ4RL}Iv9RY5o}IFlKqh}LJw@?;G?A2Z z`9epqy7&I!y{0+0`3~RX_Z^dD&Z*36D+9}4SNC*ztpSg75^+MYyCy+PZeGrTrOsQ{ z_WN_GNxfPogOi!z)W#KYy=qnF;vPzug}pneL_Z_bHJ*Hm21`T?*q4P3+TNh5L8EOl zkc&*4CX(Q8Y#vy_lewFQF2Y*-+z{tedi0rd$?M%-wZKg<7DHdedbHzjRc)o9C#NlU z+**m$SFyk~V7ZmG0-JLZnFG)cM7H=&T#{|2Bcx<EQ(4#M1lA~->;Z(im_HR23uO&Z zB12w{G>N>+x@)SV0KR+bcNwAxi1~;c*7<ZuNo#1iOEYmDNfpZSLkNS5bGG$udd4Za zsxWVAlqzMNp4&k5Z4R&Oo`8zkqaDVbo2_Z;D<cXbZX!Aoo+xx_hs#<Jc{AscV}Dj1 z-%(Zquox-N4)motEDarVg&#AaiQ=KN3nP{X>K&kEdlnILbE3*E=tHcoYCSULG){7x z-B$zM%E_d2aVd3zyKjS=SKGIm*)6McjPQPPC+HS~slKgPQxUQ$wzGP6vaF0A83s*c z>yOMH9nT?sA>9OQ?|Cl$lB)Wl=1Uv{Z1ZFOHdBzut*x>+HiI`-g-spOdZ{v%(qN0- zU~@?4_8`wv)yQ0KSE*zwYip)*;?Z4as~kEQa;{yXd2x7hIrqL$rsg74R$`PHu_&l0 z=MI#>M81IeQrm}98Z9BVZT*U|>Xxbgb;$>2T<2<Se-<nY$5$P~cu=)CkUM9dTAiRA zq@>DsOwFNH1SZeU)#UcHd$mlbsyaMD=~XSbmP|WyAPKF=>lHLtYEKt6aB5T7(j6&_ zA$bBlCpD0zQc@}3clEeaV#c-~SLI_19kJh+j}vpBD+@k)COfX{C6}Alxo0z#Tt?Y4 zM%7}1uI*8E&#Q8BkwAb1ESpl*Cd2YtHJ#aVN84kd9a3%?;7eX-CfQtt;AS$lpNL+2 znbRap$plC8WhzDyGqIy3%I@&1j)glmSoF2$j#z&E@ylKN-!UZ2m@#KAOKr-_KXW=b zZqA}>1T43R(oWx0JJ5rv;XnsT>-B*OQ|m@(CugXNEO*(Dy9}tj4ch*_G=VP_Kx&&X z)zar`eynt8i6p^ghK4LU%q8f$v|=Me-PQbaMnIPn_{`Ym7P+J`x^`;}2LA`OQ}5Gf zZo5U)+R#eggsII2Ec$X~Zvd9mS_LapgQlx8Xi>|*oMum*S|YEdlhw?Z?_~7K{?vSd zVyG7KvMNt1wy{>n%9HzK2x(jK*WBJLUxYGME&29D03pLLWXKuLa*hr|KH?D*2OGjk zH4Z=#8FR@e@`VX?Hxgt{Kr=P+M=s41?X($<J=LmqewC$m7$?)oB?r+Up|j31!Xb7P zE5}0%G%E`(P^+Jf1>y1<@839a!)5stDioSPgq}QmAAQm4%AKHJDPt7Xamo-#IKgWy zvr9~qi6!;wg;8?<1@VA$DVe7N)h@P=RqcQ02OLR#pjt1ma_T+XYIH(7ezP2uE6=QP zMoJgqhic5Osz)o=r)xpq9W}~p*^9AfURx1+MJS@*S~M3u=KusWEU1j_3|BQt^?4JT z^jIRN?O>>GnqGXpA4|HFIt`QR<mwv0pzN>noKU)$?dyfcVwL|^k5ezqIaaYEb>d6_ zq_XqWI2_HY(@?I2HclYNn%1+}Wp1N~ayD~UJ%w^IxNP0{4my=eGbp7{|IO?fb`y$H zNGG#Z&6qu4kC9c5U+iIM6n-KGD4d7uB<ew<6iM=&$=j+X(1(`UWiC`<@VXX8GkNow z#R$tbVG#vFd{VmtSJ}d=LRO3JoNpKBmO<BdI$y@(OJ#}}(2~vExdRz^_Lyj=aT3dC zPf5t}37N^?jnv`VX%>|wVTR&1nhqoG*wO7&ibEXzUO%>;v4XmCyKuHn{LAgAX9=8D z%Mt1%rQA7<^$`tsTs3o2w+gSvzRfaq^sW57+deFy<&4-eHOo_9wmYgJiVDUkNGpYc zL+&Jyp2Kj}wK?JHPstd~Ebdy7GE*nIEdiP<+>ilrpLN?o$So{cJYhd|PAbkkw{i&C z+PW6yIFPc(q-%pgI0>qf4{j`RqYg^tPBf|N0Cy!%HA<}nVayiBPRpO_$*C$+SI@zO zs{4!#q!tFqYKu5?I3TBh4bjRvyc`_qsXF&x+m@$cPx^?b=#n!Qx|ZkMF);YK!{o`F z2(4^oSJthbEwHNwj9%a}cuvldiwCc7XemFAwwa8Ju@+alN-K+d5IR#^nK+oL-v!tX zaJ~={U8w<W|Nml70FIhPCV>%)an+}Si)RoMGZ(DqupYLOhhM~y6+-4L(<daBr9-}x zqD#)0*M>*)1&pQ6+R?Buh0cO@N%?Qu$$C^R3vw%qT)eVpzoIIe+(fpbk!My5*VK3h z#%X^Zex}`Y+N*haq<BheWn8_Dq@*{UkjgtWwN6*v0G=G921sikA|Vs#1;(_WiQm_U zkf^J%YnR67W=eHBiDwZ(U(Qs0+P10&>Jm(z(@NBW4QZ&YIrIoD){-5d|GKGe5imXb z{?r1HuACV!cVaEGWn_KctQ@I`$<V@-$Yd6*YEZdtBlmce`F|5dLM%KxXCyGMP5$Z{ z&WV%H8=FCR5^`MsUqWeRqqzcvE9RuCb&rhwu%2XJC2SiCv&`)kC=1EOcE(CMhe62! zD1;`B&=Wl;L2yrdYR4l=_#vwajQF+Wx*(fRNyu%<mpXGbu47fT*1WcA*&a=r#Eh*w zE)S9KIYf!T(u~{|o=c-b3hug%D}2(kE+`iSF|(#ncA(j<1hDx}nGEMN7An;W!StnR zS><V}misGmnYqshgkGX+uzATh&8@4`wyl!dJL@{)f{HdElbYMNcLu9dR3G2KzCTZ# zYCwo05JF|<xFNr1X?7ess9%9cna%tweACowW>-l~iKonLe(b`qb>ey^KOcK53U8m1 zEKER_bwKu59lBiZXC@__XE_?4O)JV`u)tn@Ve#jr5@riw<bpaIST|{;Of*8~&23_S zP_;!1kR8}fuv$!9ly$M~WcwYI2tDTVmaEQ?aY}pTlp{uxF(a3$AVs<KycCa6RC-cD zb(E8^x*dhAR-P0>8X2WFRek(hOM67wQmo$dEu%#7USoU0eOk1vYs_sXUp$@`4FVaY zo-k%W%#0ZskpKw+Eo+<#)~=dV^-0Yt8I5SuA(Zbxo@?wVW%vP_kVrOAXy+jrhgV$s z*|b*6=F$o`;v3yrk*YNFZ2N9eOcIByqbz9b3B#d~B*vC3$^opY4S$;&?Yk`a6X#~M zMTlNGq{YnM2T#U8QZc*de8SXHtTGHU5(iS(hs-M1A@G0}T^hDA>e&?A8PG67qo}$` z<$25x;cccCx~(`mF7XJNA6NF0DF^%XBv94~+u8!U%KBhsd$=Xn(=71vU0>}xU|7}a z!Rc!kw=%bPSXpBFOg4uVe=nBlLYrlL>6B%%11Awgs7y>E8u%i$li41G8*wxZdLrmK zwVmh8Rv;9Wa3*py+Np}QoRHkXA}bntUD&Ad?y0z=(xZCTWt2HGvPV0$It<!sb(Yi; zmquF_|A~w`Xd7*ED=lB}I9*nPv8TJt?=nGkV(AbUw8M~;0aH1ZnebufK#x8lGqxEp zvU_Fng~97$j;utRlwhUG&dMkv+O(N7C1=izv8-bB#qs*ZlG#E-FmzgZ6)7Z>Q|(Ju zQ&k8!<ctcWR+6YC#DdFEgBQ$#w3wSt=1xRVHcK(qr67S(*VHIV{IVhgl--R~IR2iv z%G{pgVxUx$2-!ZbY3??OXc3|Cn6W7)beW_%*hPuTsp55waI7pQn-fcfnaHGrj3^y8 zF6u2nYpFd;nOwsB5VBDPPvw@aj3Z5{98!61Q#c%9du98^{sEy24#;j)<8^h`y^-6d z(zgM(0004|Nkl<Z<;ojpB&hoRMM6<5IV`dsBa<_}y}?S>!ey2$@5vE}EL$R#C(@A7 z*~*<38PuF12~!5Lgm)%@MEQPvZ8K<XB_MGEUXd}ENoR&9{<O;ARc+t^@ux)^mP;Ap zTdGnj_>kv-d&c1mgbPE{#`3B?XO~4;xfGl4a$;gDM^M~?$R@$%@i7bIPq7qN#RCj$ z-D8+D#AC`>6oCS#Asf=8LqNiau>j%?Iz*0ujZeV;-`BY&Aqc}jcvA*+y#E!wfM|Uc z>W`!$Nx>5^9j19SyI&>%H@uK!+Y_&%CMj47H?8CvsHn;rr0HlGz*g8zk59o`)b`&o zhlDqFB`pCzc%op`Wu7hF`nkd;h9c8v!v#F<%Xwz-mE18%>TdaF(ZyA@Gmf$Xw92Gw zl3TYqBv(Lw0O>tTGPFG5f)Q_IWMm18{K8uF2J+Bn#vL=V*!@-{oQ=+vYzV>*<Aeeo zmYnOP{$cl2=M{@cf*Pdd@r$0Vbxg~$`J?U<B<R4Q2}NkE`bvdP%fA?qnguXy?x3Y( l6#18~f(Nb!&Oe5e{{S+ipSM6D5xM{X002ovPDHLkV1hseSMC4+ literal 0 HcmV?d00001 diff --git a/gui-android/res/values/colors.xml b/gui-android/res/values/colors.xml new file mode 100644 index 0000000..b8fda67 --- /dev/null +++ b/gui-android/res/values/colors.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#3F51B5</color> + <color name="colorPrimaryDark">#303F9F</color> + <color name="colorAccent">#3FB551</color> +</resources> diff --git a/gui-android/res/values/strings.xml b/gui-android/res/values/strings.xml new file mode 100644 index 0000000..d975d5f --- /dev/null +++ b/gui-android/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Drawterm</string> +</resources> diff --git a/gui-android/res/values/styles.xml b/gui-android/res/values/styles.xml new file mode 100644 index 0000000..ccb41fa --- /dev/null +++ b/gui-android/res/values/styles.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="android:Theme.NoTitleBar"> + <!-- Customize your theme here. --> + </style> + +</resources> diff --git a/gui-fbdev/Makefile b/gui-fbdev/Makefile new file mode 100644 index 0000000..cce6ef0 --- /dev/null +++ b/gui-fbdev/Makefile @@ -0,0 +1,12 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + fbdev.$O\ + +default: $(LIB) +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + diff --git a/gui-fbdev/fbdev.c b/gui-fbdev/fbdev.c new file mode 100644 index 0000000..fa1ca2a --- /dev/null +++ b/gui-fbdev/fbdev.c @@ -0,0 +1,673 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <draw.h> +#include <memdraw.h> +#include <keyboard.h> +#include <cursor.h> +#include "screen.h" + +#undef long +#undef ulong + +#include <linux/fb.h> +#include <linux/input.h> + +uchar* fbp; +Memimage* screenimage; +Memimage* backbuf; +Rectangle screenr; +char* snarfbuf; +struct fb_fix_screeninfo finfo; +struct fb_var_screeninfo vinfo; +int *eventfds = NULL; +int neventfds; +Point mousexy; +char shift_state; +int ttyfd; +char* tty; +char hidden; +int devicesfd; +ulong chan; +int depth; + +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <limits.h> + +#include <fcntl.h> +#include <termios.h> +#include <poll.h> +#include <sys/ioctl.h> +#include <linux/keyboard.h> +#include <signal.h> + +#include <termios.h> + +#define ulong p9_ulong + +int code2key[] = { + Kesc, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\x08', + '\x09', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', + Kctl, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', Kshift, + '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +int code2key_shift[] = { + Kesc, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\x08', + '\x09', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', + Kctl, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '\"', '~', Kshift, + '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +Memimage *gscreen; +char *snarfbuf = nil; + +int onevent(struct input_event*); +void termctl(uint32_t o, int or); +void ctrlc(int sig); + +void +_fbput(Memimage *m, Rectangle r) { + int y; + + for (y = r.min.y; y < r.max.y; y++){ + long loc = y * finfo.line_length + r.min.x * depth; + void *ptr = m->data->bdata + y * m->width * 4 + r.min.x * depth; + + memcpy(fbp + loc, ptr, Dx(r) * depth); + } +} + +Memimage* +fbattach(int fbdevidx) +{ + Rectangle r; + char devname[64]; + size_t size; + int fd; + + /* + * Connect to /dev/fb0 + */ + snprintf(devname, sizeof(devname) - 1, "/dev/fb%d", fbdevidx); + if ((fd = open(devname, O_RDWR)) < 0) + goto err; + + if (ioctl(fd, FBIOGET_VSCREENINFO, &(vinfo)) < 0) + goto err; + + switch (vinfo.bits_per_pixel) { + case 32: + chan = XRGB32; + depth = 4; + break; + case 16: + chan = RGB16; + depth = 2; + break; + default: + goto err; + } + + if (ioctl(fd, FBIOGET_FSCREENINFO, &(finfo)) < 0) + goto err; + + size = vinfo.yres_virtual * finfo.line_length; + if ((fbp = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)0)) < 0) + goto err; + /* + * Figure out underlying screen format. + */ + r = Rect(0, 0, vinfo.xres_virtual, vinfo.yres_virtual); + + screenr = r; + + screenimage = allocmemimage(r, chan); + backbuf = allocmemimage(r, chan); + return backbuf; + +err: + return nil; +} + +int +eventattach() +{ + char eventfile[PATH_MAX] = ""; + char line[PATH_MAX]; + FILE *devices; + char *ptr; + + neventfds = 0; + devices = fopen("/proc/bus/input/devices", "r"); + if (devices == NULL) + return -1; + while (fgets(line, sizeof(line)-1, devices) != NULL) + if (line[0] == 'H') { + ptr = strstr(line, "event"); + if (ptr == NULL) + continue; + ptr[strcspn(ptr, " \r\n")] = '\0'; + snprintf(eventfile, sizeof(eventfile)-1, "/dev/input/%s", ptr); + neventfds++; + eventfds = realloc(eventfds, neventfds * sizeof(int)); + eventfds[neventfds-1] = open(eventfile, O_RDONLY); + if (eventfds[neventfds-1] < 0) + neventfds--; + } + fclose(devices); + + if (neventfds == 0) + return -1; + return 1; +} + +void +flushmemscreen(Rectangle r) +{ + int x, y, i; + Point p; + long fbloc; + int x2, y2; + + if (rectclip(&r, screenimage->r) == 0) + return; + if (Dx(r) == 0 || Dy(r) == 0) + return; + + assert(!canqlock(&drawlock)); + + memimagedraw(screenimage, r, backbuf, r.min, nil, r.min, S); + + if (hidden != 0) + return; + + p = mousexy; + + // draw cursor + for (x = 0; x < 16; x++) { + x2 = x + cursor.offset.x; + + if ((p.x + x2) < 0) + continue; + + if ((p.x + x2) >= screenimage->r.max.x) + break; + + for (y = 0; y < 16; y++) { + y2 = y + cursor.offset.y; + + if ((p.y + y2) < 0) + continue; + + if ((p.y + y2) >= screenimage->r.max.y) + break; + + i = y * 2 + x / 8; + fbloc = ((p.y+y2) * screenimage->r.max.x + (p.x+x2)) * depth; + + if (cursor.clr[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0xFFFF; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFFFFFFFF; + break; + } + } + + if (cursor.set[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0x0000; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFF000000; + break; + } + } + } + } + + _fbput(screenimage, r); +} + +static void +fbproc(void *v) +{ + struct input_event data; + char buf[32]; + struct pollfd *pfd; + int r; + int ioctlarg; + + pfd = calloc(3, sizeof(struct pollfd)); + pfd[0].fd = ttyfd; // for virtual console switches + pfd[0].events = POLLPRI; + pfd[1].fd = 0; // stdin goes to nowhere + pfd[1].events = POLLIN; + pfd[2].fd = open("/proc/bus/input/devices", O_RDONLY); // input hotplug + if (pfd[2].fd < 0) + panic("cannot open /proc/bus/input/devices: %r"); + pfd[2].events = POLLIN; + +TOP: + while(read(pfd[2].fd, buf, 31) > 0); + + pfd = realloc(pfd, sizeof(struct pollfd) * (neventfds + 3)); + for (r = 0; r < neventfds; r++) { + pfd[r+3].fd = eventfds[r]; + pfd[r+3].events = POLLIN; + } + + for(;;) { + shift_state = 6; + if (ioctl(0, TIOCLINUX, &shift_state) < 0) + panic("ioctl TIOCLINUX 6: %r"); + + r = poll(pfd, 3+neventfds, -1); + if (r < 0) + oserror(); + if (pfd[0].revents & POLLPRI) { + if ((r = read(ttyfd, buf, 31)) <= 0) + panic("ttyfd read: %r"); + buf[r] = '\0'; + if (strcmp(buf, tty) == 0) { + hidden = 0; + printf("\e[?25l"); + fflush(stdout); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } + else + hidden = 1; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + pfd[0].fd = ttyfd; + read(ttyfd, buf, 0); + } + if (pfd[1].revents & POLLIN) + read(pfd[1].fd, buf, 31); + if (pfd[2].revents & POLLIN) { + for (r = 0; r < neventfds; r++) + close(eventfds[r]); + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + goto TOP; + } + for (r = 0; r < neventfds; r++) + if (pfd[r+3].revents & POLLIN) { + if (read(pfd[r+3].fd, &data, sizeof(data)) != sizeof(data)) + panic("eventfd read: %r"); + if (onevent(&data) == 0) { + ioctlarg = 15; + if (ioctl(0, TIOCLINUX, &ioctlarg) != 0) { + ioctlarg = 4; + ioctl(0, TIOCLINUX, &ioctlarg); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } else { + write(1, "\033[9;30]", 7); + } + } + } + } + + printf("\e[?25h"); + fflush(stdout); + termctl(ECHO, 1); + free(pfd); +} + +void +screensize(Rectangle r, ulong chan) +{ + gscreen = backbuf; + gscreen->clipr = ZR; +} + +void +screeninit(void) +{ + int r; + char buf[1]; + + // set up terminal + printf("\e[?25l"); + fflush(stdout); + termctl(~(ICANON|ECHO), 0); + signal(SIGINT, ctrlc); + + memimageinit(); + + // tty switching + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd >= 0) { + tty = malloc(32); + r = read(ttyfd, tty, 31); + if (r >= 0) + tty[r] = '\0'; + else + tty[0] = '\0'; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + } + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + read(ttyfd, buf, 0); + hidden = 0; + + if(fbattach(0) == nil) { + panic("cannot open framebuffer: %r"); + } + + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + + screensize(screenr, chan); + if (gscreen == nil) + panic("screensize failed"); + + gscreen->clipr = screenr; + kproc("fbdev", fbproc, nil); + + terminit(); + + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); +} + +Memdata* +attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen) +{ + *r = gscreen->clipr; + *chan = gscreen->chan; + *depth = gscreen->depth; + *width = gscreen->width; + *softscreen = 1; + + gscreen->data->ref++; + return gscreen->data; +} + +void +getcolor(ulong i, ulong *r, ulong *g, ulong *b) +{ + ulong v; + + v = cmap2rgb(i); + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + /* no-op */ + return; +} + +char* +clipread(void) +{ + if(snarfbuf) + return strdup(snarfbuf); + return nil; +} + +int +clipwrite(char *buf) +{ + if(snarfbuf) + free(snarfbuf); + snarfbuf = strdup(buf); + return 0; +} + +void +guimain(void) +{ + cpubody(); +} + +void +termctl(uint32_t o, int or) +{ + struct termios t; + + tcgetattr(0, &t); + if (or) + t.c_lflag |= o; + else + t.c_lflag &= o; + tcsetattr(0, TCSANOW, &t); +} + +void +ctrlc(int sig) { +} + +int +onevent(struct input_event *data) +{ + Rectangle old, new; + ulong msec; + static int buttons; + static Point coord; + static char touched; + static Point startmousept; + static Point startpt; + int key; + static ulong lastmsec = 0; + + if (hidden != 0) + return -1; + + msec = ticks(); + + old.min = mousexy; + old.max = addpt(old.min, Pt(16, 16)); + + buttons &= ~0x18; + + switch(data->type) { + case 3: + switch(data->code) { + case 0: + coord.x = data->value; + break; + case 1: + coord.y = data->value; + break; + case 0x18: + case 0x1c: + if (data->value == 0) + touched = 0; + else if (data->value > 24) { + touched = 1; + startmousept = coord; + startpt = mousexy; + } + break; + default: + return -1; + } + if (touched) + mousexy = addpt(startpt, divpt(subpt(coord, startmousept), 4)); + break; + case 2: + switch(data->code) { + case 0: + mousexy.x += data->value; + break; + case 1: + mousexy.y += data->value; + break; + case 8: + buttons |= data->value == 1? 8: 16; + break; + default: + return -1; + } + break; + case 1: + switch(data->code) { + case 0x110: + if (data->value == 1) + buttons |= 1; + else + buttons &= ~1; + break; + case 0x111: + if (data->value == 1) + buttons |= shift_state & (1 << KG_SHIFT)? 2: 4; + else + buttons &= ~(shift_state & (1 << KG_SHIFT)? 2: 4); + break; + case 0x112: + if (data->value == 1) + buttons |= 2; + else + buttons &= ~2; + break; + default: + if (hidden) + return 0; + if (data->code > 0 && data->code <= nelem(code2key)) { + if (shift_state & (1 << KG_SHIFT)) + key = code2key_shift[data->code-1]; + else + key = code2key[data->code-1]; + if (key == Kshift) + return -1; + kbdkey(key, data->value); + return 0; + } + switch(data->code) { + case 87: + kbdkey(KF|11, data->value); + break; + case 88: + kbdkey(KF|12, data->value); + break; + case 96: + kbdkey('\n', data->value); + break; + case 97: + kbdkey(Kctl, data->value); + break; + case 98: + kbdkey('/', data->value); + break; + case 100: + kbdkey(Kalt, data->value); + break; + case 102: + kbdkey(Khome, data->value); + break; + case 103: + kbdkey(Kup, data->value); + break; + case 104: + kbdkey(Kpgup, data->value); + break; + case 105: + kbdkey(Kleft, data->value); + break; + case 106: + kbdkey(Kright, data->value); + break; + case 107: + kbdkey(Kend, data->value); + break; + case 108: + kbdkey(Kdown, data->value); + break; + case 109: + kbdkey(Kpgdown, data->value); + break; + case 110: + kbdkey(Kins, data->value); + break; + case 111: + kbdkey(Kdel, data->value); + break; + } + return 0; + } + break; + default: + return -1; + } + + if (mousexy.x < screenimage->r.min.x) + mousexy.x = screenimage->r.min.x; + if (mousexy.y < screenimage->r.min.y) + mousexy.y = screenimage->r.min.y; + if (mousexy.x > screenimage->r.max.x) + mousexy.x = screenimage->r.max.x; + if (mousexy.y > screenimage->r.max.y) + mousexy.y = screenimage->r.max.y; + + new.min = mousexy; + new.max = addpt(new.min, Pt(16, 16)); // size of cursor bitmap + + combinerect(&new, old); + new.min = subpt(new.min, Pt(16, 16)); // to encompass any cursor->offset + + qlock(&drawlock); + flushmemscreen(new); + qunlock(&drawlock); + + if ((msec - lastmsec) < 10) + if (data->type != 1) + return 0; + + lastmsec = msec; + + absmousetrack(mousexy.x, mousexy.y, buttons, msec); + + return 0; +} + +void +mouseset(Point p) +{ + qlock(&drawlock); + mousexy = p; + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +setcursor(void) +{ + qlock(&drawlock); + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +titlewrite(char* buf) +{ +} + diff --git a/kern/devaudio-alsa.c b/kern/devaudio-alsa.c new file mode 100644 index 0000000..30dfd60 --- /dev/null +++ b/kern/devaudio-alsa.c @@ -0,0 +1,108 @@ +/* + * ALSA + */ +#include <alsa/asoundlib.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include "devaudio.h" + +enum +{ + Channels = 2, + Rate = 44100, + Bits = 16, +}; + +static snd_pcm_t *playback; +static snd_pcm_t *capture; +static int speed = Rate; + +/* maybe this should return -1 instead of sysfatal */ +void +audiodevopen(void) +{ + if(snd_pcm_open(&playback, "default", SND_PCM_STREAM_PLAYBACK, 0) < 0) + error("snd_pcm_open playback"); + + if(snd_pcm_set_params(playback, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params playback"); + + if(snd_pcm_prepare(playback) < 0) + error("snd_pcm_prepare playback"); + + if(snd_pcm_open(&capture, "default", SND_PCM_STREAM_CAPTURE, 0) < 0) + error("snd_pcm_open capture"); + + if(snd_pcm_set_params(capture, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params capture"); + + if(snd_pcm_prepare(capture) < 0) + error("snd_pcm_prepare capture"); +} + +void +audiodevclose(void) +{ + snd_pcm_drain(playback); + snd_pcm_close(playback); + + snd_pcm_close(capture); +} + +void +audiodevsetvol(int what, int left, int right) +{ + if(what == Vspeed){ + speed = left; + return; + } +} + +void +audiodevgetvol(int what, int *left, int *right) +{ + if(what == Vspeed){ + *left = *right = speed; + return; + } + + *left = *right = 100; +} + +int +audiodevwrite(void *v, int n) +{ + snd_pcm_sframes_t frames; + int tot, m; + + for(tot = 0; tot < n; tot += m){ + do { + frames = snd_pcm_writei(playback, v+tot, (n-tot)/4); + } while(frames == -EAGAIN); + if (frames < 0) + frames = snd_pcm_recover(playback, frames, 0); + if (frames < 0) + error((char*)snd_strerror(frames)); + m = frames*4; + } + + return tot; +} + +int +audiodevread(void *v, int n) +{ + snd_pcm_sframes_t frames; + + do { + frames = snd_pcm_readi(capture, v, n/4); + } while(frames == -EAGAIN); + + if (frames < 0) + error((char*)snd_strerror(frames)); + + return frames*4; +} diff --git a/lib/arm64-v8a/.keep b/lib/arm64-v8a/.keep new file mode 100644 index 0000000..e69de29 diff --git a/lib/armeabi-v7a/.keep b/lib/armeabi-v7a/.keep new file mode 100644 index 0000000..e69de29 diff --git a/lib/x86/.keep b/lib/x86/.keep new file mode 100644 index 0000000..e69de29 diff --git a/lib/x86_64/.keep b/lib/x86_64/.keep new file mode 100644 index 0000000..e69de29 diff --git a/libc/getpid.c b/libc/getpid.c new file mode 100644 index 0000000..9a9c86c --- /dev/null +++ b/libc/getpid.c @@ -0,0 +1,17 @@ +#include <u.h> +#include <libc.h> + +int +getpid(void) +{ + char b[20]; + int f; + + memset(b, 0, sizeof(b)); + f = open("#c/pid", 0); + if(f >= 0) { + read(f, b, sizeof(b)); + close(f); + } + return atol(b); +} diff --git a/main.c b/main.c index 0d74b2e..e66c81a 100644 --- a/main.c +++ b/main.c @@ -54,6 +54,7 @@ main(int argc, char **argv) if(bind("#U", "/root", MREPL) < 0) panic("bind #U: %r"); bind("#A", "/dev", MAFTER); + bind("#N", "/dev", MAFTER); bind("#C", "/", MAFTER); if(open("/dev/cons", OREAD) != 0) -- 2.31.1.windows.1
14.08.2021 05:59:35 Lorenzo Bivens <izaki@belaska.us>:
> I am aware of another fork by sirjofri that introduces improvements to
> the android implementation, but I haven't had a chance yet to make the
> merge.
My changes are mostly cosmetic and only relevant for the android
implementation. It basically only adds true mouse support (for USB mice)
and tried to adjust the mouse offset (which still isn't perfect, but at
least the offset is the same across the whole screen now). I made no
changes to the underlying drawterm stuff.
That said, I have not added support for mouse chording, although this
might be very trivial to do.
sirjofri
sounds good, but the patch is full of errors... like adding README.bak files... randomly changing permissions on libc files... adding .keep files??? just clean it up, make sure it applies cleanly and i can apply it to the repo. -- cinap
On Sat, 14 Aug 2021 03:59:35 +0000
Lorenzo Bivens <izaki@belaska.us> wrote:
> Dear 9front,
>
> I found a couple of forks (thank you echoline) of drawterm that
> include additions that for sure will profit the community. I've
> carefully merged them into our front branch and it would seem nothing
> was broken.
>
> I am aware of another fork by sirjofri that introduces improvements
> to the android implementation, but I haven't had a chance yet to make
> the merge.
>
> It would be great if we could make this part of our front branch
> (left to the community to decide) The original forks are
> https://github.com/echoline/drawterm-android
> https://github.com/echoline/drawterm-fbdev
>
> Best,
> Izaki
I don't know much about building for Android, but it sounds cool.
It would be awesome if it could be put on F-Droid.
Thanks,
Amavect
@cinap, I've cleaned up my act... errr... my patch. git/import works with it. Garbage was definitely my fault, but I specially blame Windows for not ending lines like everyone else. Please let me know if you find any additional defect @Amavect, drawterm on f-droid would be awesome. I'll look into it after I merge in Sirjofri's changes Cheerios, izaki
i don't think you left a patch or link in your last message
On 8/16/21, Lorenzo Bivens <izaki@belaska.us> wrote:
> @cinap, I've cleaned up my act... errr... my patch. git/import works with
> it.
> Garbage was definitely my fault, but I specially blame Windows for not
> ending lines like everyone else.
> Please let me know if you find any additional defect
>
> @Amavect, drawterm on f-droid would be awesome. I'll look into it after I
> merge in Sirjofri's changes
>
> Cheerios,
> izaki
[-- Attachment #1: Type: text/plain, Size: 114 bytes --] > i don't think you left a patch or link in your last message *Picard face covering maneuver* How about now? [-- Attachment #2: 0001-Merging-echoline-s-android-and-fbdev-forks.patch --] [-- Type: application/octet-stream, Size: 229575 bytes --] From 85e175d922e10d7421e174edefd691119b83030a Mon Sep 17 00:00:00 2001 From: Lorenzo Bivens <git@lorenzobivens.info> Date: Fri, 13 Aug 2021 20:39:50 -0700 Subject: [PATCH] Merging echoline's android and fbdev forks --- Make.android | 38 + Make.android-386 | 26 + Make.android-amd64 | 26 + Make.android-arm | 26 + Make.android-arm64 | 26 + Make.fbdev | 22 + README | 11 + gui-android/AndroidManifest.xml | 30 + gui-android/Makefile | 23 + gui-android/cpp/android.c | 230 ++++++ gui-android/cpp/devandroid.c | 248 +++++++ gui-android/cpp/native-lib.c | 173 +++++ .../org/echoline/drawterm/DrawTermThread.java | 32 + .../org/echoline/drawterm/MainActivity.java | 437 ++++++++++++ .../org/echoline/drawterm/MySurfaceView.java | 91 +++ gui-android/res/drawable-hdpi/ic_small.png | Bin 0 -> 5361 bytes gui-android/res/drawable-mdpi/ic_small.png | Bin 0 -> 3173 bytes gui-android/res/drawable-xhdpi/ic_small.png | Bin 0 -> 5181 bytes gui-android/res/drawable-xxhdpi/ic_small.png | Bin 0 -> 8529 bytes gui-android/res/drawable-xxxhdpi/ic_small.png | Bin 0 -> 10972 bytes gui-android/res/layout/activity_main.xml | 24 + gui-android/res/layout/content_main.xml | 16 + gui-android/res/layout/drawterm_main.xml | 44 ++ gui-android/res/layout/item_main.xml | 8 + gui-android/res/layout/server_main.xml | 56 ++ gui-android/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 14867 bytes gui-android/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 11578 bytes gui-android/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 15155 bytes gui-android/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 20643 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 25294 bytes gui-android/res/values/colors.xml | 6 + gui-android/res/values/strings.xml | 3 + gui-android/res/values/styles.xml | 8 + gui-fbdev/Makefile | 12 + gui-fbdev/fbdev.c | 673 ++++++++++++++++++ kern/devaudio-alsa.c | 108 +++ libc/getpid.c | 17 + main.c | 1 + 38 files changed, 2415 insertions(+) create mode 100644 Make.android create mode 100644 Make.android-386 create mode 100644 Make.android-amd64 create mode 100644 Make.android-arm create mode 100644 Make.android-arm64 create mode 100644 Make.fbdev create mode 100644 gui-android/AndroidManifest.xml create mode 100644 gui-android/Makefile create mode 100644 gui-android/cpp/android.c create mode 100644 gui-android/cpp/devandroid.c create mode 100644 gui-android/cpp/native-lib.c create mode 100644 gui-android/java/org/echoline/drawterm/DrawTermThread.java create mode 100644 gui-android/java/org/echoline/drawterm/MainActivity.java create mode 100644 gui-android/java/org/echoline/drawterm/MySurfaceView.java create mode 100644 gui-android/res/drawable-hdpi/ic_small.png create mode 100644 gui-android/res/drawable-mdpi/ic_small.png create mode 100644 gui-android/res/drawable-xhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxxhdpi/ic_small.png create mode 100644 gui-android/res/layout/activity_main.xml create mode 100644 gui-android/res/layout/content_main.xml create mode 100644 gui-android/res/layout/drawterm_main.xml create mode 100644 gui-android/res/layout/item_main.xml create mode 100644 gui-android/res/layout/server_main.xml create mode 100644 gui-android/res/mipmap-hdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-mdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 gui-android/res/values/colors.xml create mode 100644 gui-android/res/values/strings.xml create mode 100644 gui-android/res/values/styles.xml create mode 100644 gui-fbdev/Makefile create mode 100644 gui-fbdev/fbdev.c create mode 100644 kern/devaudio-alsa.c create mode 100644 libc/getpid.c diff --git a/Make.android b/Make.android new file mode 100644 index 0000000..00eaf68 --- /dev/null +++ b/Make.android @@ -0,0 +1,38 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +JAVA_HOME=/usr +OBJS=lib/arm64-v8a/libdrawterm.so lib/armeabi-v7a/libdrawterm.so lib/x86/libdrawterm.so lib/x86_64/libdrawterm.so + +all: drawterm.apk + +clean: + rm -f *.apk lib/*/*.so + +lib/arm64-v8a/libdrawterm.so: + CONF=android-arm64 make -j5; + CONF=android-arm64 make clean; + +lib/armeabi-v7a/libdrawterm.so: + CONF=android-arm make -j5; + CONF=android-arm make clean; + +lib/x86/libdrawterm.so: + CONF=android-386 make -j5; + CONF=android-386 make clean; + +lib/x86_64/libdrawterm.so: + CONF=android-amd64 make -j5; + CONF=android-amd64 make clean; + +drawterm.apk: drawterm-signed.apk + $(SDKPREFIX)/build-tools/30.0.3/zipalign -v -f 4 $< $@ + +drawterm-signed.apk: drawterm-unsigned.apk drawterm.keystore + $(JAVA_HOME)/bin/jarsigner -verbose -keystore ./drawterm.keystore -storepass glendarocks -keypass glendarocks -signedjar $@ $< drawtermKey + +drawterm-unsigned.apk: $(OBJS) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -v -f -M gui-android/AndroidManifest.xml -S gui-android/res -I $(SDKPREFIX)/platforms/android-21/android.jar -F $@ gui-android/bin + $(SDKPREFIX)/build-tools/30.0.3/aapt add $@ $(OBJS) + +drawterm.keystore: + $(JAVA_HOME)/bin/keytool -genkeypair -validity 1000 -dname "CN=9front,O=Android,C=US" -keystore $@ -storepass glendarocks -keypass glendarocks -alias drawtermKey -keyalg RSA -v diff --git a/Make.android-386 b/Make.android-386 new file mode 100644 index 0000000..ff43cf6 --- /dev/null +++ b/Make.android-386 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/i686-linux-android-ar +AS=$(NDKPREFIX)/i686-linux-android-as +RANLIB=$(NDKPREFIX)/i686-linux-android-ranlib +STRIP=$(NDKPREFIX)/i686-linux-android-strip +CC=$(NDKPREFIX)/i686-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=386; \ + (cd posix-$$arch && make) + diff --git a/Make.android-amd64 b/Make.android-amd64 new file mode 100644 index 0000000..3f5cf46 --- /dev/null +++ b/Make.android-amd64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/x86_64-linux-android-ar +AS=$(NDKPREFIX)/x86_64-linux-android-as +RANLIB=$(NDKPREFIX)/x86_64-linux-android-ranlib +STRIP=$(NDKPREFIX)/x86_64-linux-android-strip +CC=$(NDKPREFIX)/x86_64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86_64/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=amd64; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm b/Make.android-arm new file mode 100644 index 0000000..862d81d --- /dev/null +++ b/Make.android-arm @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/arm-linux-androideabi-ar +AS=$(NDKPREFIX)/arm-linux-androideabi-as +RANLIB=$(NDKPREFIX)/arm-linux-androideabi-ranlib +STRIP=$(NDKPREFIX)/arm-linux-androideabi-strip +CC=$(NDKPREFIX)/armv7a-linux-androideabi21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/armeabi-v7a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm64 b/Make.android-arm64 new file mode 100644 index 0000000..5ceab39 --- /dev/null +++ b/Make.android-arm64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/aarch64-linux-android-ar +AS=$(NDKPREFIX)/aarch64-linux-android-as +RANLIB=$(NDKPREFIX)/aarch64-linux-android-ranlib +STRIP=$(NDKPREFIX)/aarch64-linux-android-strip +CC=$(NDKPREFIX)/aarch64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/arm64-v8a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm64; \ + (cd posix-$$arch && make) + diff --git a/Make.fbdev b/Make.fbdev new file mode 100644 index 0000000..ed8e1b0 --- /dev/null +++ b/Make.fbdev @@ -0,0 +1,22 @@ +# Unix +#PTHREAD= # for Mac +PTHREAD=-pthread +AR=ar +AS=as +RANLIB=ranlib +CC=gcc +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -D_THREAD_SAFE $(PTHREAD) -O2 +O=o +OS=posix +GUI=fbdev +LDADD=-ggdb -lm -lasound +LDFLAGS=$(PTHREAD) +TARG=drawterm +# AUDIO=none +AUDIO=alsa + +all: default + +libmachdep.a: + arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/; s/x86_64/amd64/; s/armv[567].*/arm/; s/aarch64/arm64/'`; \ + (cd posix-$$arch && make) diff --git a/README b/README index 2599800..749273f 100644 --- a/README +++ b/README @@ -18,6 +18,17 @@ To build on Mac OS X with X11 (xquartz), run CONF=osx-x11 make. To build on Mac OS X with Cocoa, run CONF=osx-cocoa make and "cp drawterm gui-cocoa/drawterm.app/". +To build for Android, make sure Make.android* and gui-android/Makefile are correct for your build and target systems, then run make -f Make.android + +USAGE +------- +On Android the five checkboxes at the top represent the three mouse buttons and mousewheel, determining which "buttons" are clicked. The "kb" button toggles the soft keyboard. + + +CAVEATS +-------- +Be aware that right now on Android the login details are saved as a plaintext string if saved, and there is no secstore support. + BINARIES --------- diff --git a/gui-android/AndroidManifest.xml b/gui-android/AndroidManifest.xml new file mode 100644 index 0000000..97be515 --- /dev/null +++ b/gui-android/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.echoline.drawterm"> + + <supports-screens android:largeScreens="true" + android:normalScreens="true" android:smallScreens="true" + android:anyDensity="true" /> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + <activity + android:name=".MainActivity" + android:label="@string/app_name" + android:windowSoftInputMode="stateUnchanged|adjustNothing"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + <uses-permission android:name="android.permission.INTERNET"/> + <!--<uses-permission android:name="android.permission.SET_DEBUG_APP"/>--> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.CAMERA"/> +</manifest> diff --git a/gui-android/Makefile b/gui-android/Makefile new file mode 100644 index 0000000..04df778 --- /dev/null +++ b/gui-android/Makefile @@ -0,0 +1,23 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + cpp/android.$O\ + cpp/native-lib.$O\ + cpp/devandroid.$O\ + +default: $(LIB) gen/org/echoline/drawterm/R.java bin/classes.dex +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + +gen/org/echoline/drawterm/R.java: $(shell find res/ -type f) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -f -m -M AndroidManifest.xml -I $(SDKPREFIX)/platforms/android-21/android.jar -S res/ -J gen + +bin/classes.dex: obj/org/echoline/drawterm/MainActivity.class obj/org/echoline/drawterm/DrawTermThread.class obj/org/echoline/drawterm/MySurfaceView.class + $(SDKPREFIX)/build-tools/30.0.3/dx --dex --verbose --output=$@ obj/ + +obj/org/echoline/drawterm/%.class: java/org/echoline/drawterm/%.java + $(JAVA_HOME)/bin/javac -d obj/ -classpath $(SDKPREFIX)/platforms/android-21/android.jar -sourcepath java java/org/echoline/drawterm/$*.java gen/org/echoline/drawterm/R.java + diff --git a/gui-android/cpp/android.c b/gui-android/cpp/android.c new file mode 100644 index 0000000..e6a2e0f --- /dev/null +++ b/gui-android/cpp/android.c @@ -0,0 +1,230 @@ +#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; +} + +int +clipwrite(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; +} + +void +show_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; +} + +int +num_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; +} + +void +take_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; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + return; +} + +void +getcolor(ulong v, ulong *r, ulong *g, ulong *b) +{ + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +flushmemscreen(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; +} + +void +screeninit(void) +{ + Rectangle r = Rect(0,0,screenWidth,screenHeight); + memimageinit(); + screensize(r, XRGB32); + if (gscreen == nil) + panic("screensize failed"); + gscreen->clipr = r; + terminit(); + qlock(&drawlock); + flushmemscreen(r); + qunlock(&drawlock); + return; +} + +void +screensize(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; +} + +void +setcursor(void) +{ + return; +} + +void +mouseset(Point xy) +{ + return; +} + +void +guimain(void) +{ + cpubody(); +} + diff --git a/gui-android/cpp/devandroid.c b/gui-android/cpp/devandroid.c new file mode 100644 index 0000000..daf2f57 --- /dev/null +++ b/gui-android/cpp/devandroid.c @@ -0,0 +1,248 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <android/log.h> +#include <android/sensor.h> + +void show_notification(char *buf); +void take_picture(int id); +int num_cameras(); + +int Ncameras = 0; + +uchar *cambuf = nil; +int camlen; + +ASensorManager *sensorManager = NULL; + +enum +{ + Qdir = 0, + Qcam = 1, + Qaccel = 2, + Qcompass = 4, + Qnotification = 6, +}; +#define QID(p, c, y) (((p)<<16) | ((c)<<4) | (y)) + +static void androidinit(void); + +static void +androidinit(void) +{ + sensorManager = ASensorManager_getInstance(); + + Ncameras = num_cameras(); +} + +static Chan* +androidattach(char *param) +{ + Chan *c; + + c = devattach('N', param); + c->qid.path = QID(0, 0, Qdir); + c->qid.type = QTDIR; + c->qid.vers = 0; + + return c; +} + +static int +androidgen(Chan *c, char *n, Dirtab *d, int nd, int s, Dir *dp) +{ + Qid q; + + if (s == DEVDOTDOT) { + mkqid(&q, Qdir, 0, QTDIR); + devdir(c, q, "#N", 0, eve, 0555, dp); + return 1; + } + if (s < Ncameras) { + sprintf(up->genbuf, "cam%d.jpg", s); + mkqid(&q, (s << 16) | Qcam, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == Ncameras) { + sprintf(up->genbuf, "accel"); + mkqid(&q, Qaccel, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+1)) { + sprintf(up->genbuf, "compass"); + mkqid(&q, Qcompass, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+2)) { + sprintf(up->genbuf, "notification"); + mkqid(&q, Qnotification, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0222, dp); + return 1; + } + return -1; +} + +static Walkqid* +androidwalk(Chan *c, Chan *nc, char **name, int nname) +{ + return devwalk(c, nc, name, nname, 0, 0, androidgen); +} + +static int +androidstat(Chan *c, uchar *db, int n) +{ + return devstat(c, db, n, 0, 0, androidgen); +} + +static Chan* +androidopen(Chan *c, int omode) +{ + p9_uvlong s; + + c = devopen(c, omode, 0, 0, androidgen); + + if (c->qid.path & Qcam) { + s = c->qid.path >> 16; + take_picture(s); + } + c->mode = openmode(omode); + c->flag |= COPEN; + c->offset = 0; + c->iounit = 8192; + + return c; +} + +static void +androidclose(Chan *c) +{ + if (c->qid.path & Qcam && cambuf != nil) { + free(cambuf); + cambuf = nil; + } +} + +static long +androidread(Chan *c, void *v, long n, vlong off) +{ + char *a = v; + long l; + const ASensor *sensor; + ASensorEventQueue *queue = NULL; + ASensorEvent data; + + switch((ulong)c->qid.path & 0xF) { + default: + error(Eperm); + return -1; + + case Qcam: + while(cambuf == nil) + usleep(10 * 1000); + + l = camlen - off; + if (l > n) + l = n; + + if (l > 0) + memcpy(a, cambuf + off, l); + + return l; + case Qaccel: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qcompass: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_MAGNETIC_FIELD); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qdir: + return devdirread(c, a, n, 0, 0, androidgen); + } +} + +static long +androidwrite(Chan *c, void *vp, long n, vlong off) +{ + char *a = vp; + char *str; + + switch((ulong)c->qid.path) { + case Qnotification: + str = malloc(n+1); + memcpy(str, a, n); + str[n] = '\0'; + show_notification(str); + free(str); + return n; + default: + error(Eperm); + break; + } + return -1; +} + +Dev androiddevtab = { + 'N', + "android", + + devreset, + androidinit, + devshutdown, + androidattach, + androidwalk, + androidstat, + androidopen, + devcreate, + androidclose, + androidread, + devbread, + androidwrite, + devbwrite, + devremove, + devwstat, +}; diff --git a/gui-android/cpp/native-lib.c b/gui-android/cpp/native-lib.c new file mode 100644 index 0000000..1e768b3 --- /dev/null +++ b/gui-android/cpp/native-lib.c @@ -0,0 +1,173 @@ +#include <jni.h> +#include <android/native_window.h> +#include <android/native_window_jni.h> +#include <android/log.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include <draw.h> +#include <string.h> +#include <keyboard.h> + +void absmousetrack(int, int, int, ulong); +ulong ticks(void); +int dt_main(int, char**); +int screenWidth; +int screenHeight; +Point mousept = {0, 0}; +int buttons = 0; +float ws = 1; +float hs = 1; +extern char *snarfbuf; +int mPaused = 0; +ANativeWindow *window = NULL; +jobject mainActivityObj; +JavaVM *jvm; +void flushmemscreen(Rectangle r); +extern uchar *cambuf; +extern int camlen; + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setObject( + JNIEnv *env, + jobject obj) { + mainActivityObj = (*env)->NewGlobalRef(env, obj); + jint rs = (*env)->GetJavaVM(env, &jvm); + assert(rs == JNI_OK); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyDown( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyUp( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setPass( + JNIEnv *env, + jobject obj, + jstring str) { + setenv("PASS", (char*)(*env)->GetStringUTFChars(env, str, 0), 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidth( + JNIEnv *env, + jobject obj, + jint width) { + screenWidth = width; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeight( + JNIEnv *env, + jobject obj, + jint height) { + screenHeight = height; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidthScale( + JNIEnv *env, + jobject obj, + jfloat s) { + ws = s; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeightScale( + JNIEnv *env, + jobject obj, + jfloat s) { + hs = s; +} + +JNIEXPORT jint JNICALL +Java_org_echoline_drawterm_MainActivity_dtmain( + JNIEnv *env, + jobject obj, + jobjectArray argv) { + int i, ret; + char **args = (char **) malloc(((*env)->GetArrayLength(env, argv)+1) * sizeof(char *)); + + for (i = 0; i < (*env)->GetArrayLength(env, argv); i++) { + jobject str = (jobject) (*env)->GetObjectArrayElement(env, argv, i); + args[i] = strdup((char*)(*env)->GetStringUTFChars(env, (jstring)str, 0)); + } + args[(*env)->GetArrayLength(env, argv)] = NULL; + + ret = dt_main(i, args); + + for (i = 0; args[i] != NULL; i++) { + free(args[i]); + } + free(args); + + return ret; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setMouse( + JNIEnv *env, + jobject obj, + jintArray args) { + jboolean isCopy; + jint *data; + if ((*env)->GetArrayLength(env, args) < 3) + return; + data = (*env)->GetIntArrayElements(env, args, &isCopy); + mousept.x = (int)(data[0] / ws); + mousept.y = (int)(data[1] / hs); + buttons = data[2]; + (*env)->ReleaseIntArrayElements(env, args, data, 0); + absmousetrack(mousept.x, mousept.y, buttons, ticks()); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setDTSurface( + JNIEnv* jenv, + jobject obj, + jobject surface) { + if (surface != NULL) { + window = ANativeWindow_fromSurface(jenv, surface); + ANativeWindow_setBuffersGeometry(window, screenWidth, screenHeight, + AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM); + flushmemscreen(Rect(0, 0, screenWidth, screenHeight)); + } else if (window != NULL) { + ANativeWindow_release(window); + window = NULL; + } +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_exitDT( + JNIEnv* jenv, + jobject obj) { + exit(0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_sendPicture( + JNIEnv* env, + jobject obj, + jbyteArray array) { + jint len = (*env)->GetArrayLength(env, array); + jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL); + camlen = len; + cambuf = malloc(camlen); + memcpy(cambuf, bytes, camlen); + (*env)->ReleaseByteArrayElements(env, array, bytes, 0); +} + diff --git a/gui-android/java/org/echoline/drawterm/DrawTermThread.java b/gui-android/java/org/echoline/drawterm/DrawTermThread.java new file mode 100644 index 0000000..52baae8 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/DrawTermThread.java @@ -0,0 +1,32 @@ +package org.echoline.drawterm; + +/** + * Created by eli on 12/4/17. + */ + +public class DrawTermThread extends Thread { + private MainActivity m; + private String p; + private String []args; + + public DrawTermThread(String []args, String p, MainActivity m) { + this.m = m; + this.p = p; + this.args = args; + } + + @Override + public void run() { + if (p != null && !p.equals("")) + m.setPass(p); + m.dtmain(args); + m.runOnUiThread(new Runnable() { + @Override + public void run() { + m.exitDT(); + m.setContentView(R.layout.server_main); + m.populateServers(m); + } + }); + } +} diff --git a/gui-android/java/org/echoline/drawterm/MainActivity.java b/gui-android/java/org/echoline/drawterm/MainActivity.java new file mode 100644 index 0000000..2e9b852 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MainActivity.java @@ -0,0 +1,437 @@ +package org.echoline.drawterm; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.Point; +import android.os.Bundle; +import android.os.Environment; + +import android.app.Activity; + +import android.app.Notification; +import android.app.NotificationManager; + +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.MotionEvent; +import android.view.View; +import android.view.Menu; +import android.view.MenuItem; +import android.view.WindowManager; +import android.view.Surface; +import android.view.inputmethod.InputMethodManager; +import android.view.KeyEvent; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.TotalCaptureResult; +import android.media.Image; +import android.media.ImageReader; +import android.graphics.ImageFormat; +import android.os.Handler; +import android.os.HandlerThread; + +import java.io.File; +import java.util.Map; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.ArrayList; + +public class MainActivity extends Activity { + private Map<String, ?> map; + private MainActivity mainActivity; + private boolean dtrunning = false; + private DrawTermThread dthread; + private int notificationId; + private CameraDevice cameraDevice = null; + private byte []jpegBytes; + + static { + System.loadLibrary("drawterm"); + } + + public void showNotification(String text) { + Notification.Builder builder = new Notification.Builder(this) + .setDefaults(Notification.DEFAULT_SOUND) + .setSmallIcon(R.drawable.ic_small) + .setContentText(text) + .setStyle(new Notification.BigTextStyle().bigText(text)) + .setPriority(Notification.PRIORITY_DEFAULT); + + ((NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE)).notify(notificationId, builder.build()); + notificationId++; + } + + public int numCameras() { + try { + return ((CameraManager)getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length; + } catch (CameraAccessException e) { + Log.w("drawterm", e.toString()); + return 0; + } + } + + public void takePicture(int id) { + try { + HandlerThread mBackgroundThread = new HandlerThread("Camera Background"); + mBackgroundThread.start(); + Handler mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); + CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); + String []cameraIdList = manager.getCameraIdList(); + manager.openCamera(cameraIdList[id], new CameraDevice.StateCallback() { + public void onOpened(CameraDevice device) { + cameraDevice = device; + } + public void onDisconnected(CameraDevice device) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + public void onError(CameraDevice device, int error) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + }, mBackgroundHandler); + ImageReader reader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1); + CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG); + captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); + captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getWindowManager().getDefaultDisplay().getRotation()); + captureBuilder.addTarget(reader.getSurface()); + reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { + public void onImageAvailable(ImageReader reader) { + Image image = null; + try { + image = reader.acquireLatestImage(); + ByteBuffer buffer = image.getPlanes()[0].getBuffer(); + jpegBytes = new byte[buffer.capacity()]; + buffer.get(jpegBytes); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } finally { + if (image != null) { + image.close(); + } + } + } + }, mBackgroundHandler); + List<Surface> outputSurfaces = new ArrayList<Surface>(1); + outputSurfaces.add(reader.getSurface()); + cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { + public void onConfigured(CameraCaptureSession session) { + try { + List<CaptureRequest> captureRequests = new ArrayList<CaptureRequest>(10); + for (int i = 0; i < 10; i++) + captureRequests.add(captureBuilder.build()); + session.captureBurst(captureRequests, new CameraCaptureSession.CaptureCallback() { + public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) { + try { + sendPicture(jpegBytes); + mBackgroundThread.quitSafely(); + mBackgroundThread.join(); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } + } + }, mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + public void onConfigureFailed(CameraCaptureSession session) { + } + }, mBackgroundHandler); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void serverView(View v) { + setContentView(R.layout.server_main); + serverButtons(); + + String s = (String)map.get(((TextView)v).getText().toString()); + String []a = s.split("\007"); + + ((EditText)findViewById(R.id.cpuServer)).setText((String)a[0]); + ((EditText)findViewById(R.id.authServer)).setText((String)a[1]); + ((EditText)findViewById(R.id.userName)).setText((String)a[2]); + if (a.length > 3) + ((EditText)findViewById(R.id.passWord)).setText((String)a[3]); + } + + public void populateServers(Context context) { + ListView ll = (ListView)findViewById(R.id.servers); + ArrayAdapter<String> la = new ArrayAdapter<String>(this, R.layout.item_main); + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + map = (Map<String, ?>)settings.getAll(); + String key; + Object []keys = map.keySet().toArray(); + for (int i = 0; i < keys.length; i++) { + key = (String)keys[i]; + la.add(key); + } + ll.setAdapter(la); + + setDTSurface(null); + dtrunning = false; + } + + public void runDrawterm(String []args, String pass) { + Resources res = getResources(); + DisplayMetrics dm = res.getDisplayMetrics(); + + int wp = dm.widthPixels; + int hp = dm.heightPixels; + + setContentView(R.layout.drawterm_main); + + Button kbutton = (Button)findViewById(R.id.keyboardToggle); + kbutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); + } + }); + + int rid = res.getIdentifier("navigation_bar_height", "dimen", "android"); + if (rid > 0) { + hp -= res.getDimensionPixelSize(rid); + } + LinearLayout ll = (LinearLayout)findViewById(R.id.dtButtons); + hp -= ll.getHeight(); + + int w = (int)(wp * (160.0/dm.xdpi)); + int h = (int)(hp * (160.0/dm.ydpi)); + float ws = (float)wp/w; + float hs = (float)hp/h; + // only scale up + if (ws < 1) { + ws = 1; + w = wp; + } + if (hs < 1) { + hs = 1; + h = hp; + } + + MySurfaceView mView = new MySurfaceView(mainActivity, w, h, ws, hs); + mView.getHolder().setFixedSize(w, h); + + LinearLayout l = (LinearLayout)findViewById(R.id.dlayout); + l.addView(mView, 1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); + + dthread = new DrawTermThread(args, pass, mainActivity); + dthread.start(); + + dtrunning = true; + } + + public void serverButtons() { + Button button = (Button)findViewById(R.id.save); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(user + "@" + cpu + " (auth=" + auth + ")", cpu + "\007" + auth + "\007" + user + "\007" + pass); + editor.commit(); + } + }); + + button = (Button) findViewById(R.id.connect); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + String args[] = {"drawterm", "-p", "-h", cpu, "-a", auth, "-u", user}; + runDrawterm(args, pass); + } + }); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + + mainActivity = this; + setObject(); + setContentView(R.layout.activity_main); + populateServers(this); + + View fab = findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setContentView(R.layout.server_main); + serverButtons(); + } + }); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + if (!dtrunning) { + return super.dispatchKeyEvent(event); + } + + int k = event.getUnicodeChar(); + if (k == 0) { + k = event.getDisplayLabel(); + if (k >= 'A' && k <= 'Z') + k |= 0x20; + } + String chars = event.getCharacters(); + if (k == 0 && chars != null) { + for (int i = 0; i < chars.length(); i++) { + k = chars.codePointAt(i); + keyDown(k); + keyUp(k); + } + return true; + } + + if (k == 0) switch (event.getKeyCode()) { + case KeyEvent.KEYCODE_DEL: + k = 0x0008; + break; + case KeyEvent.KEYCODE_FORWARD_DEL: + k = 0x007F; + break; + case KeyEvent.KEYCODE_ESCAPE: + k = 0x001B; + break; + case KeyEvent.KEYCODE_MOVE_HOME: + k = 0xF00D; + break; + case KeyEvent.KEYCODE_MOVE_END: + k = 0xF018; + break; + case KeyEvent.KEYCODE_PAGE_UP: + k = 0xF00F; + break; + case KeyEvent.KEYCODE_PAGE_DOWN: + k = 0xF013; + break; + case KeyEvent.KEYCODE_INSERT: + k = 0xF014; + break; + case KeyEvent.KEYCODE_SYSRQ: + k = 0xF010; + break; + case KeyEvent.KEYCODE_DPAD_UP: + k = 0xF00E; + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + k = 0xF011; + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + k = 0xF012; + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + k = 0xF800; + break; + } + + if (k == 0) + return true; + + if (event.isCtrlPressed()) { + keyDown(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyDown(0xF015); + } + + if (event.getAction() == KeyEvent.ACTION_DOWN) { + keyDown(k); + } + else if (event.getAction() == KeyEvent.ACTION_UP) { + keyUp(k); + } + + if (event.isCtrlPressed()) { + keyUp(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyUp(0xF015); + } + + return true; + } + + @Override + public void onBackPressed() + { + } + + @Override + public void onDestroy() + { + setDTSurface(null); + dtrunning = false; + exitDT(); + super.onDestroy(); + } + + public void setClipBoard(String str) { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = ClipData.newPlainText(null, str); + cm.setPrimaryClip(cd); + } + } + + public String getClipBoard() { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = cm.getPrimaryClip(); + if (cd != null) + return (String)(cd.getItemAt(0).coerceToText(mainActivity.getApplicationContext()).toString()); + } + return ""; + } + + public native void dtmain(Object[] args); + public native void setPass(String arg); + public native void setWidth(int arg); + public native void setHeight(int arg); + public native void setWidthScale(float arg); + public native void setHeightScale(float arg); + public native void setDTSurface(Surface surface); + public native void setMouse(int[] args); + public native void setObject(); + public native void keyDown(int c); + public native void keyUp(int c); + public native void exitDT(); + public native void sendPicture(byte[] array); +} diff --git a/gui-android/java/org/echoline/drawterm/MySurfaceView.java b/gui-android/java/org/echoline/drawterm/MySurfaceView.java new file mode 100644 index 0000000..fe71676 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MySurfaceView.java @@ -0,0 +1,91 @@ +package org.echoline.drawterm; + +import android.util.Log; + +import android.content.Context; +import android.graphics.Bitmap; +import android.os.SystemClock; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.SurfaceHolder; +import android.view.View; +import android.widget.CheckBox; +import android.widget.EditText; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.security.spec.ECField; + +/** + * Created by eli on 12/3/17. + */ +public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { + private int screenWidth, screenHeight; + private MainActivity mainActivity; + private float ws, hs; + + public MySurfaceView(Context context, int w, int h, float ws, float hs) { + super(context); + screenHeight = h; + screenWidth = w; + this.ws = ws; + this.hs = hs; + mainActivity = (MainActivity)context; + mainActivity.setWidth(screenWidth); + mainActivity.setHeight(screenHeight); + mainActivity.setWidthScale(ws); + mainActivity.setHeightScale(hs); + setWillNotDraw(true); + + getHolder().addCallback(this); + + setOnTouchListener(new View.OnTouchListener() { + private int[] mouse = new int[3]; + + @Override + public boolean onTouch(View v, MotionEvent event) { + CheckBox left = (CheckBox)mainActivity.findViewById(R.id.mouseLeft); + CheckBox middle = (CheckBox)mainActivity.findViewById(R.id.mouseMiddle); + CheckBox right = (CheckBox)mainActivity.findViewById(R.id.mouseRight); + CheckBox up = (CheckBox)mainActivity.findViewById(R.id.mouseUp); + CheckBox down = (CheckBox)mainActivity.findViewById(R.id.mouseDown); + int buttons = (left.isChecked()? 1: 0) | + (middle.isChecked()? 2: 0) | + (right.isChecked()? 4: 0) | + (up.isChecked()? 8: 0) | + (down.isChecked()? 16: 0); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = 0; + mainActivity.setMouse(mouse); + } + return true; + } + }); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + mainActivity.setDTSurface(holder.getSurface()); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int w, int h, int format) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + mainActivity.setDTSurface(null); + } +} diff --git a/gui-android/res/drawable-hdpi/ic_small.png b/gui-android/res/drawable-hdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..67c067bf719be65701ad8a91af18060a7bb4358e GIT binary patch literal 5361 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 P00000NkvXXu0mjf7mR>_ literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-mdpi/ic_small.png b/gui-android/res/drawable-mdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7c24e6ac8bc34d41eee51805cc6f224c963072c2 GIT binary patch literal 3173 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 LNkvXXu0mjf)t&&% literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xhdpi/ic_small.png b/gui-android/res/drawable-xhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b85001eb8f634484150e4f6b12e3e972190aa9 GIT binary patch literal 5181 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�DLt() zC(1#V5mTh`A@C$bFUXf-*aNs#b57HfrVoj{XD7y-r*HW_ePc05zZJZv_3lL(r)PEi zeHs5LFFtN+K=q=&Q88p5aMD^_4l~_{TTr{`Nm=K2(S!9my2<%vJm|Bz=liiIeKz-e zKlY^0=AQ4zo@Cq7wf5K%I7SK@x7kQ18>Cw@yU)(Li)LMVKFLy|=Sd3M1JCRL9Rt27 z0ov`+)+>n5ZjY8;>9ht*Rs_rHH-cLw{kzE${XSayVu17S4q4VbZsq>&H25~RPJ{al zbQ#36Xr}K&*tmKKo4JKe5nQJ?%aOf}wm)6&IbHqlrhd0ui19lVd4wGb?RO}E);&#I zLvwmHHUDO4POqlsue&%1zOpdHI+VulH*GwAI?(dd!Ciy~eTYzeg}J_O5xNxZ&MZ=2 z3B2D^k>2Fu@2U7O#itiz{I90?^kR(v)fAupiILAs4JnHK?Jq|6DFeOu#b_nw+g@e; zU_v|)weehgl<$|)<5D>}I@}%Y7Y9Jhqub)_A8<?=uurOq+&gs-jrG|tBFmNZp)cRQ z(`md`m(;qB&n4q!qU9Y6-?fpS`=GzJk)QjZzqXN|@AP*U_`h9f@^2_e#6JPB8Umtm zy=5f;00ARuLqkwWLqi~Na&Km7Y-Iodc$}S(Jxat-6otQx|ASVFf?A}o9k6jKn^7SM z3Nemgw8|tI986+JG7Rp(o#<kw5Cm7?3KXn8FIrfb#s`=4ak=-L_a3zDBuvZMT}ZR4 zaJ-&>>0j9kZ?surgE_W>u*`d|dqU&+e8n>Q(lK7mbAO)sC@w?kRF#E!QGvBD?oO)Q zu!^<YzIP~o5Zh6jMdBy%PLxK5&90Xw<M7AR+-5n>F3wF~wT;6ur?}V*7&9WFq9e`J zIiky+)S)2Yo{~_S5UV%QOvR0;l#|1Os4voO8uB*lJXa|Ld5q*`67ERlY4R}t`@QyY zR&QGC(>y4Gx;3L}4Ttdl2rE9UK12JuA#3sX+ZtxN^~^ut_yxMtP)^D8SO)+A00Lr5 zM??VshmXv^00009a7bBm000XU000XU0RWnu7ytkO2XskIMF->x2^R?qDZq0p000Lt zNkl<ZSi`l~TZ~<Ib;t3~fA4+HoS8G8i?1`XlR)akKoTp+K&%kdP@|ei<SJ6GqO<}j zsEDFg@X|`5N~_XHts02(L`5rAsA@w6LI@rx4|Spx5mOUHn>dg-V+Y$a_SiGyIdjh0 zm(>RkD1aejqwa^Tt-qGmS4(TH-|xTqe}2+N10!>{1syM?=Pw6PY%u+1?=t6@!c8%e z4sRTgZ7}Xl`i@wz;0gO;$8QXXE%A}K?iB~;9JOkXdu{byw?y$90pbR4Gw{y1CEDvp zn{AWqbeFd}VUH^ZL>7B(@(o||4>o%!Hi0p_v0%ZSZt?|hzw!#&KI(_qZ`QXx<t^X| z=M~OjyF0YBH`<3^1~d-Kz1C-a+%Dg8b?gdh!L?czJZI4^d%fVMD+LUF)wngs-R8r# zIpi({{?}H0KQiex-e$#Ij9w8SQEQp^J$(ng--7SE1z)pM>68Uq?6cj?c3kNcExRCj z+#xOZdb6j^#5Hoan=+zjXsex`aPvlnwYZde#5Lxf@NaH(or8X)ajOOIc8?L2mPz+0 z9Pk|{uSkpH8oT|c+#h<6+!60JE;p~1s}Neo^&RoBr&8|<#4cuR@vOJ_nBO&J36(}$ zrj*H4N&{muhkV)NskvOSJL?0wb~#|gs*a&TA*tm`xp6(2Lg{w5nT~(9nl4YSqvIZb zYuZ3)sWozqjzXcas4s*y)FyqwL#e(zxt{WI6KXBBOvkfIwJ&<ovTYtVZbGIKIO%@# z9=i-c<PNx1Pm;;J><NG7ENXR%IOd?n18%q9S+&d=H^i27cEc(jBk}!Mj+N-eYRtuf zUlBDPpN^;FnK%-M;#k~yd4^NzXbI>2Uiyz;F@hI-&ewDlhE9pg>A|$N&=~Qc7h{J^ zhD^vMiS>8*l7q;N+8fU~pB6T<Xjgg6t>!HlSTWFd+;uv_gquw`ZJTp`EHi7~SNy(d zT~E8#oDZgBuTnuw`lNSQ)-od#T1K6)MQ&hPSM9J{Fs5?C852&MkxW~(-y8jUKqPy7 z#2Uto$+d*cltusUqYgQ4pV#Y|@vM1UU1Ps-9joR&>BOt|pyfWF@sht1mb~s2k*7TF zPtvK_?MC<cwiTarl?l&z)B`4b#}D+Ke>FhqQ8&8Hw9Wp<^=ix*b;7`TYccAy#+>IR zKM-<jeqz5jc&`bc_wuU%QpC$ndY`RwU-Uw%iDT%x+I@D}?wg+Sg045Z$=4k>G@@<N zc8{bVZ^REm9Y5WLiytAm!KWPdJ>w3#(VW_L`~9)M@n4Rbw$Fo?a))2%Nj-lj^Ld2A zoQHkLh_ep6)`ui7IqSRrK;yU;et0QoxFjH2>*vYu#6PB$Bq}Rv|AL2n-CtY6pUSQI zOLN}s?RxSJZE_@c*zHY9ZH+rT7JrnMg`Stp+Tjs}*I07a^Nv`vX0rp5WO)OA5XmR} zg>j*hNs_{zbTr7cbY*f=MpcHAd5rmccUiUMsFM;-`HV`HE~QOzcPvL0O$=iY{TReB z25~g5x(JUv+A$iP=*CoRkFC*-(Rd_=u@FCr)3Fq5F^pkch-c!_ctczp6Tb|2PgF68 zD#{o{Kk67nFZ%IM>wpv~^2nnd<1rp%(T=_GOf1InScs)qh*Pl?E3p#GQAR|>=i;@$ z*n<;JnpMhWXx9Dgt?`cZt&1f`BdL{O(x1D|KvzpgrEkfI5rtAxyWb7jFHFx~JJsvm z$uw%Y#!mklxBcAxwNz=m-u-eNVW=-@%PpI8My-<TxIX*2zp#&aOd}INOCBn@FzWI6 zV7xhs6sf_ud%e$>4K!AbTUN=`LaFqk2^}qk$@Gf!pYZVd-i9P(>z2|8Il{}HQb}?h zcN^*>^qjWM43_jPE1h?>8I4AkE@ssAfX~X*N{vbv$xtEJphk{dW2ll@HPBZ{l5wFn zYuTcKTF;d0Rj4mEIrpGX>B%L9QlXT|g)lJGl41C>3w|wA8S1DF(6gvCZVWxE>q0Y% zs)&}~_F;Fb6*85i)|RVPLak8?Z5@@No>HNuBhwLj8k>ycoU^XBNuyF|8I@$(g(uCJ zm8&(9BsZq7R3OxnmKBYp(3QKOue7E#Fe>a&s7*SluP{_->v#sclv;(~(iMg(xt_L0 zr4a_&M)eI9M)b6e7--8RLl;y=4Xx@Kt_w$QRY#I^ESj=YOO;|xqob$Ls8o^=MukGA zM&FvAjxES#!YQXTXq?m1RSPYXW{oISmKDyM)sYHArBYJK*NZHbdOA8r)aVL*xeF#y z%Wamd7zmpz=$qEnm~`H>Orx}7(HXC^Epx_cXY}<kCh4vZWM64TEmImXZA4dz%$mZi zJvz47p<_*B$%L+}j3~8L*8I0+rIg}DLzO}%Gp(($s!{4FO&Mqlp%x}JDoZA?WXuJl rh8m>{=Iv8hbJA|d^_>&;7}5DZSG!6<h%slq00000NkvXXu0mjf+qC2a literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxhdpi/ic_small.png b/gui-android/res/drawable-xxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7dc776c15ddacd33574b519fa0e6335f1be1ea GIT binary patch literal 8529 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 LNkvXXu0mjf)9P)C literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxxhdpi/ic_small.png b/gui-android/res/drawable-xxxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9205252fd9bbdabb58cb12d303ca65c9d2170d GIT binary patch literal 10972 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 KMNUMnLSTY*4_h4o literal 0 HcmV?d00001 diff --git a/gui-android/res/layout/activity_main.xml b/gui-android/res/layout/activity_main.xml new file mode 100644 index 0000000..14c98eb --- /dev/null +++ b/gui-android/res/layout/activity_main.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <include layout="@layout/content_main" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end"> + + <Button + android:id="@+id/fab" + android:text="add server" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/content_main.xml b/gui-android/res/layout/content_main.xml new file mode 100644 index 0000000..8a7f802 --- /dev/null +++ b/gui-android/res/layout/content_main.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity" + tools:showIn="@layout/activity_main"> + <ListView + android:id="@+id/servers" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + </ListView> +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/drawterm_main.xml b/gui-android/res/layout/drawterm_main.xml new file mode 100644 index 0000000..cb5c9f3 --- /dev/null +++ b/gui-android/res/layout/drawterm_main.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/dlayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:gravity="center_horizontal" + android:orientation="horizontal" + android:id="@+id/dtButtons"> + + <CheckBox + android:id="@+id/mouseLeft" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseMiddle" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseRight" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseUp" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseDown" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <Button + android:id="@+id/keyboardToggle" + android:text="kb" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + </LinearLayout> +</LinearLayout> diff --git a/gui-android/res/layout/item_main.xml b/gui-android/res/layout/item_main.xml new file mode 100644 index 0000000..9049612 --- /dev/null +++ b/gui-android/res/layout/item_main.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" android:layout_height="match_parent" + android:padding="10dp" + android:textSize="16sp" + android:onClick="serverView"> +</TextView> + diff --git a/gui-android/res/layout/server_main.xml b/gui-android/res/layout/server_main.xml new file mode 100644 index 0000000..3d592c2 --- /dev/null +++ b/gui-android/res/layout/server_main.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_height="match_parent" + android:layout_width="match_parent" + android:orientation="vertical"> + + <EditText + android:id="@+id/cpuServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="CPU" /> + <EditText + android:id="@+id/authServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Auth" /> + <EditText + android:id="@+id/userName" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Username" /> + + <EditText + android:id="@+id/passWord" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:password="true" + android:hint="Password"/> + + <Button + android:id="@+id/save" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Save" /> + + <Button + android:id="@+id/connect" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Connect" /> + + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/mipmap-hdpi/ic_launcher.png b/gui-android/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5099b530fa24f18ecb088d985011b9256cec23c3 GIT binary patch literal 14867 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%0A-!|tp?(%~dGeU(OzG<!BcfhS4 zbBR;bmQuFYob%P?cAIy=HXEF)DHpvsfO1<s>{pG76)tq2YrMf#OOKnkQ^zuG=a_eg z*l8}e*#kDbI4Qfww_IRaLntxn=UwGHZdFzsI@59kk(RC*&$!P$asxYFEDr5=$hg3) zTYTFlfy-QF{}QQRYn43;ZR?F2@{sN3tr56S`C<SXwOl5(-IsmNckR-!!LWaqgJFI9 zP_xpMQ7yY{kr+NHK*!+FdTj%Rd4Y$NmaCbz))$>>y%+;sT{R<4vDui%+-s#3qLb)r z(FZ?xv_oy7XRR=>&3?PgO02L_><$|wh=fLr$j!J@ZkL8NR;t-!;(2QBF|W!Dl%}mU zscy5IZB)3}l&54k&szHh8YY}(Mrymq4fNe0dohG@(wXM8yv*4q<Q{XI2Ml|?&)ccM zUXLmy>Q<}k*<*)}DX;no8GS(jB@+9EE_9`r8?xW`ZPGE}P4096vmW%cS^GRIGNg3K zUZFL<r1xU<vaZLi5<B0V-JaI-u>ZEfr2p^=1CRQWEn@o|FfW&T(3Dc{L4B<k9#GFi zUS`UumwUoS3mz~n^)0vCiOuGGM=3O1snZVMaKFIAuJaDVKXttwXF%(F!eg$`((`>^ z^@y&PX?K_rE9Axna)e?zVgo&ih9Pga-fK+0kP)goLu#ir>Q3<zyY2Fju5m*`p;DmG zQ$s3O$RtJt8al4A-VSFt&$<_GKufH3tGlEc2A;AD!!nsnfkLiO$YmmtzK*_3Phpwu z-s`t~!R8loKufH0mt}U^XrnP9Qjt(0lM6%wp+JbhKq%5TP%~sq;lpOU+o}^H`3VjA zg$La0o4#rUiBc*;q>u~ch?H`r+=y5plxqq_2+Vk;_qp^0-v5M#{J=W5_?jWbQe1N6 zN`cUni%c34>D%mX6h;LSkxU@5(k7p=*2?2@<b)#BbB*iFDv>KR6}n1Snv@Hz@p|hl z6IyVaf0gLF&w`dvh*C|>f{R^a;^ZTg+wL)Y)GHE)`VyC#@BwEj1Ohd&0EstxozRS{ z?Xy!T6e#6rn=@nVI0NnpM5yB<Zm>@%mnqe8iBFj{v@~J=B<l_sxYmt^)s#X*Y7*yq zuTxHTFDpE0H%g&MqVGz7=S<6v3Wv~y72e}RR-2a_n73fBI}A>KQ4B<KeFM3g1y}j7 zvrb^M2uypkUomgq08Ps@kNd#*L;!^Xu|#0rJG|SuC)}aNy+!EbMh$5QbsaicK)J`v zC}ou@pQ>e>uu`2;Q5iD1Qh{>Gq*=6S>LLdW>FOvPa=U}tPCaUeI}WK+kNB|L6sEL= z+D5gE8Il{f*G{qAg1`>5<}K)g6_yD-gqq(p<lFYkWdfIa+*Y6VR?C0-2<0C0Zg*=K zbDA-++`z2u3bD6&#zyCAEA6nyf?*fR-0O4~n-n-x-;_5?JStK;AaJ?0wtBzJJD-zJ z#{{&~jdp2?^=+vVM9o01biH{8-L0-LCl;I0kST06qb(F!rssMiYM#+mYWT9q8MYm@ zDB@$4`;6-aTIh%jq{zh81oW_hUr_fAqb}4I*ldef!@RneiiDmp>sfO`vjQzO<Id67 zKI#&13_x3aUf+me`@}A?-#r>41ED}6#BUgJvn##VYN1cM-=v)wDCAn&QawH6R++O( z=vsSae(9)AQhcm=y6JCSV!=m!#gm#w%vRi59NxG~<PW^hv_$Eh4*H%u{F-yk_-i*- zclvX0v)i8tq`vMY4%+0kN0E+WRN0*Eo)Me%556l?_<OIEqp;Vk$O<D$6HcpOX7<}I zbCyXRPv|P;a;I8rw?DMsz&5Y;RxdSe>Zgs+h_j8@;uG!?39WO13zqtS55pooJKUqM zYt(Xe>opa2dsg3hT1ur{U#f<_1+R0(QNSFx%IZ!xW?Cedx%x*Y<Aw(2?6uvUcIen) zoy(nTN}zDiX1Do86V{omWOBibIpZ!n2AmU8>V-;;r?ihSJ=yIhKX8Gw49RSClQW%T zrMA?(!k?P=5f>TJmOEsVaUVL)M05hZtP~0*-s*b4thpo#g{E_KG_5csP`BG2x7qDk zkukAVX8omAe%EC>Qn@j2G=1{Tm0UyOYLT}rjS0E7*I45^Tb-g|Ov8ji;&icCW?s{@ z)kc*TWReqT%JK2z)1cbBwpv)SGy{pIJ?6d1n7&Wj?p@w!N{nZH)R19kc!jgHZE>y5 z8kJx?Pe7$o*S&TsWpbgK>omNj>Oq0J5i1Sscffh3t+TpXby90wf(fT->Fc{ks5rR@ zJ?dLJ?zc^%sJhtg2)wzvEYwsuD7W0@y0+P4Lc_SkYU{;@WEO07gN{Vz>|;!s#{u++ z&-#QwAQCHu=&Jiq8(g&%!&)T*F}lX}L}D2>7!{#zlP~y!VUY<3ea)mypj2Asb&?YS zRNCw_uC0KSvWhpMfzspd^eT~3AW|0_QOLARC=@cO!l=4JXsfULtRaa==s|b<$a5}} zX<BXVkHC7))=~JlKi1M$2t`VfLLpR2^t{r?TvSD;th9LXXo0?ghD=M(up9i2F^QT& zicqF67YcRdxY`>mlbNvg=tF)aP*iSeQH`X9T%<JQhpskv#1fE*g_3HCu4!lp#h$hc zHBF^dPpOb-NQ6oaZ7qN03NQC_K5d82(Kyr;Nkvs+f@%dSWFo1)(v0zHZ$AvGtd_<| ztWXN{{iDCJTqKoBl?LiU^@?X{wLBCu%iZV+zx~`13Y_NEmHiYe6*3u0nL;e|L+`TX z2wQUzN+eWMQ)<ZF;@@-(%;_lf_4Gv;GGWZPA$7!R8U_mY`p9zwN^N($sA5G>4X>eC zgj7xHd;Z9SM?hMXhDd}^DfN(zB7LPutgfyulj+DbwX85Clt@HU9dn*~E<mY&@y`OG zOew4!ps*rtq?8IZ-0IKVx3u!8jD^E0-tkGd2<1|xLawQfQXm$Hw2gb2DP2810|TAs z;?TeiKIJ}<yy{4YKY*7@Ov(jPv71de-?YoET<Up|r+rOo-u1RgFe0$muqiXT5>aL3 z(ACn_(G)6`V)>5)>iLR~*&<Xf#Ud2Rk0|h{s=6WnB(%Yk)>P@u)NJ<wp-|n3fk<J< z`64ss4MdeAl1Y`imgzYps0t%JQinRe>HVG-$*Yo&rBacivQ-L&K%%VdP8#|@VIT~P zHPtj^OY)i9CDYN+(AHKLhztom?deJ`7I&JZ?;11y%iGnJ25KT@RbyF2*;<vf!@ty# z>IyYwLW#DdN@!dub6iQ`43=wqQokZVE)eReSFgEv@7n(Y+T(gxYgHP$*e(hKkwjpy zq&IOD@KR7!&*HgZwc+P-i8}f^>SBRXTT@HRf?fIosYF|-P>KxcR-GVN1T-ggr>n)X ziZMl{EM@iR#gbpVsHvu}uV1Nds8EwBbp!%MmCQt<B}S$rFrsf<*E0%Dk*-W#E|8e7 zEYyK`Ug>jgHY2J`%$`V61wPZ4RK;FadOVO-$><p<#1f%)wes|(74;WM+LD^nQ&Sid zO4RkMmke~(&6*Jiq(Y_mJ#zQhBwq?xAXF%%RRkirRK2n<4@W82)2JW}sJ?cDni>*y zv93^QPFE?`H)}%M0Si^4d&uQpVwp$O#7YD4O?r9~fwB^;ntlbVL{m}SAQh^KqzZ+G zOs|SWscX5KWXV7;DxZj4A`%<cGJ;UM(*8u<ywtDTW|Kl-aCjc7R~o$N(Kj`!wilv6 zT`D(_iK_n<>WH)j4hYp12Il1=iKbz(o`J-;P*ydZSfOK})G%8u2^}f!wpUA`FH#pY z%2=T<mdGkWtW`ZM6zIz(a#{7uVl#}jL<Z&^5{vbeNQ|2>RQYL{DXOm`i={G9I$*C} z<y@DVnr1Cic<QiqIFJdd35Y_hp{QKvNG#EpRpZy;((hAElMShEr75XYUr$)YHmU?5 zw;)mzigXMNYnm6z)zrl%HH1#L&w^CETvMr66>%vS$tot)MQBJJ5-gpu_-Qz+#J^s} zH$Z4!YFI-}L+*f@6_y*=Z=Y1tyuMn+uUuUy(6CHPN9K@BJglu$)6o}HY>4D~)v%CD zs<(@z0;yC@R9U@?b7ifXlM<PZd8J9G>N=!hxu&KCfwl#KzP+ex>Q=04SSPYwZLwMP z^)<!X>N0)9`r@i*r6P3;6>9>afmou{Rj5n!91^Rerh%~XIC66q3=Dh97P;88Q{3kX zfml;ZpkFnL#l-KkSHnOYs|l9o;fBDhS#dQGqzWx_+EV*P8d90qaHURVbzalBSp%gJ zbzQkasjyF}rYX_0!+|Q=tA!pkZc?GC;U3R;R-|RY{{Xs(yv#O^d*%QD002ovPDHLk FV1lP!Um5@a literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-mdpi/ic_launcher.png b/gui-android/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8a70757f25145079718cbe7e8b53dda8994a752d GIT binary patch literal 11578 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xhdpi/ic_launcher.png b/gui-android/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..66e95343855f47c004d3504193f99a450d3b5ad6 GIT binary patch literal 15155 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..52aaeb67a697a95bd6f7f3d268705a3ff50fe2e9 GIT binary patch literal 20643 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 O0000<MNUMnLSTZOT>QcS literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3c0243beb4ceab4fd710fbf8179d5f92588877 GIT binary patch literal 25294 zcmV)KK)Sz)P)<h;3K|Lk000e1NJLTq006)M006)U1ONa4_|>G0001DBdQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;uavV95h5zFea|FP#9|x;h-(ZeE-$SO<s-?Tt zW>YMQVlo*K@Z~KI(4GJN$94b1f3<pZDc4qdDW3mQPu&LpX#VqGe}4y`-rw)P_5BuK z|KWA_^BcxXk<an-WgXx54_?pz{DB|$2=kAxyY~H#weN+#-}rICs5=|~*uOp`uiNMK zkiHk{=kt%!TmAJ>r+t_5edBwS@1I!TrGH*TU%OvlNR=q<%)6r5i6Q#;cl$g+{QMbu zoxgqTyf4J^UNOg~9Dgi{fc#;3KR$c^Yk>X`<RAZXe~$jofBh-=HomXNKgF_qW5hrH z_8TGpeehq1f4On|`9$`|ZyX=iUzYRzbMJ2Vp3mw=Dnzt=E6Tec(b3QF#!1NI`?11D z<xl3{^?h_cnje0VoK0m;K33?#i2ijUg&jt?;k?f)EFLl0vC3z&W%0e%Vzq87Do;rt z;aZJ7?%2rXvg2apW&8Oo;oY~t`>oKp^A5b#0v996|N6uIyKnwCAMReoHU!^(#){`M zRW6UA%;|65MMA>;<}JSf|M>W(-~UoSlqwm_FU*Yv4nIGam^u8jw&Kfk<b9dXpRNe5 z?(YQ%5%<nKOo(K_mk@I(!B?{y0"Xz=6~lT9)Za<<JwT8goltJX~S=4Wbn@3m~j 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%0A3FH@QV2 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/values/colors.xml b/gui-android/res/values/colors.xml new file mode 100644 index 0000000..b8fda67 --- /dev/null +++ b/gui-android/res/values/colors.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#3F51B5</color> + <color name="colorPrimaryDark">#303F9F</color> + <color name="colorAccent">#3FB551</color> +</resources> diff --git a/gui-android/res/values/strings.xml b/gui-android/res/values/strings.xml new file mode 100644 index 0000000..d975d5f --- /dev/null +++ b/gui-android/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Drawterm</string> +</resources> diff --git a/gui-android/res/values/styles.xml b/gui-android/res/values/styles.xml new file mode 100644 index 0000000..ccb41fa --- /dev/null +++ b/gui-android/res/values/styles.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="android:Theme.NoTitleBar"> + <!-- Customize your theme here. --> + </style> + +</resources> diff --git a/gui-fbdev/Makefile b/gui-fbdev/Makefile new file mode 100644 index 0000000..cce6ef0 --- /dev/null +++ b/gui-fbdev/Makefile @@ -0,0 +1,12 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + fbdev.$O\ + +default: $(LIB) +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + diff --git a/gui-fbdev/fbdev.c b/gui-fbdev/fbdev.c new file mode 100644 index 0000000..fa1ca2a --- /dev/null +++ b/gui-fbdev/fbdev.c @@ -0,0 +1,673 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <draw.h> +#include <memdraw.h> +#include <keyboard.h> +#include <cursor.h> +#include "screen.h" + +#undef long +#undef ulong + +#include <linux/fb.h> +#include <linux/input.h> + +uchar* fbp; +Memimage* screenimage; +Memimage* backbuf; +Rectangle screenr; +char* snarfbuf; +struct fb_fix_screeninfo finfo; +struct fb_var_screeninfo vinfo; +int *eventfds = NULL; +int neventfds; +Point mousexy; +char shift_state; +int ttyfd; +char* tty; +char hidden; +int devicesfd; +ulong chan; +int depth; + +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <limits.h> + +#include <fcntl.h> +#include <termios.h> +#include <poll.h> +#include <sys/ioctl.h> +#include <linux/keyboard.h> +#include <signal.h> + +#include <termios.h> + +#define ulong p9_ulong + +int code2key[] = { + Kesc, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\x08', + '\x09', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', + Kctl, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', Kshift, + '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +int code2key_shift[] = { + Kesc, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\x08', + '\x09', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', + Kctl, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '\"', '~', Kshift, + '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +Memimage *gscreen; +char *snarfbuf = nil; + +int onevent(struct input_event*); +void termctl(uint32_t o, int or); +void ctrlc(int sig); + +void +_fbput(Memimage *m, Rectangle r) { + int y; + + for (y = r.min.y; y < r.max.y; y++){ + long loc = y * finfo.line_length + r.min.x * depth; + void *ptr = m->data->bdata + y * m->width * 4 + r.min.x * depth; + + memcpy(fbp + loc, ptr, Dx(r) * depth); + } +} + +Memimage* +fbattach(int fbdevidx) +{ + Rectangle r; + char devname[64]; + size_t size; + int fd; + + /* + * Connect to /dev/fb0 + */ + snprintf(devname, sizeof(devname) - 1, "/dev/fb%d", fbdevidx); + if ((fd = open(devname, O_RDWR)) < 0) + goto err; + + if (ioctl(fd, FBIOGET_VSCREENINFO, &(vinfo)) < 0) + goto err; + + switch (vinfo.bits_per_pixel) { + case 32: + chan = XRGB32; + depth = 4; + break; + case 16: + chan = RGB16; + depth = 2; + break; + default: + goto err; + } + + if (ioctl(fd, FBIOGET_FSCREENINFO, &(finfo)) < 0) + goto err; + + size = vinfo.yres_virtual * finfo.line_length; + if ((fbp = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)0)) < 0) + goto err; + /* + * Figure out underlying screen format. + */ + r = Rect(0, 0, vinfo.xres_virtual, vinfo.yres_virtual); + + screenr = r; + + screenimage = allocmemimage(r, chan); + backbuf = allocmemimage(r, chan); + return backbuf; + +err: + return nil; +} + +int +eventattach() +{ + char eventfile[PATH_MAX] = ""; + char line[PATH_MAX]; + FILE *devices; + char *ptr; + + neventfds = 0; + devices = fopen("/proc/bus/input/devices", "r"); + if (devices == NULL) + return -1; + while (fgets(line, sizeof(line)-1, devices) != NULL) + if (line[0] == 'H') { + ptr = strstr(line, "event"); + if (ptr == NULL) + continue; + ptr[strcspn(ptr, " \r\n")] = '\0'; + snprintf(eventfile, sizeof(eventfile)-1, "/dev/input/%s", ptr); + neventfds++; + eventfds = realloc(eventfds, neventfds * sizeof(int)); + eventfds[neventfds-1] = open(eventfile, O_RDONLY); + if (eventfds[neventfds-1] < 0) + neventfds--; + } + fclose(devices); + + if (neventfds == 0) + return -1; + return 1; +} + +void +flushmemscreen(Rectangle r) +{ + int x, y, i; + Point p; + long fbloc; + int x2, y2; + + if (rectclip(&r, screenimage->r) == 0) + return; + if (Dx(r) == 0 || Dy(r) == 0) + return; + + assert(!canqlock(&drawlock)); + + memimagedraw(screenimage, r, backbuf, r.min, nil, r.min, S); + + if (hidden != 0) + return; + + p = mousexy; + + // draw cursor + for (x = 0; x < 16; x++) { + x2 = x + cursor.offset.x; + + if ((p.x + x2) < 0) + continue; + + if ((p.x + x2) >= screenimage->r.max.x) + break; + + for (y = 0; y < 16; y++) { + y2 = y + cursor.offset.y; + + if ((p.y + y2) < 0) + continue; + + if ((p.y + y2) >= screenimage->r.max.y) + break; + + i = y * 2 + x / 8; + fbloc = ((p.y+y2) * screenimage->r.max.x + (p.x+x2)) * depth; + + if (cursor.clr[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0xFFFF; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFFFFFFFF; + break; + } + } + + if (cursor.set[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0x0000; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFF000000; + break; + } + } + } + } + + _fbput(screenimage, r); +} + +static void +fbproc(void *v) +{ + struct input_event data; + char buf[32]; + struct pollfd *pfd; + int r; + int ioctlarg; + + pfd = calloc(3, sizeof(struct pollfd)); + pfd[0].fd = ttyfd; // for virtual console switches + pfd[0].events = POLLPRI; + pfd[1].fd = 0; // stdin goes to nowhere + pfd[1].events = POLLIN; + pfd[2].fd = open("/proc/bus/input/devices", O_RDONLY); // input hotplug + if (pfd[2].fd < 0) + panic("cannot open /proc/bus/input/devices: %r"); + pfd[2].events = POLLIN; + +TOP: + while(read(pfd[2].fd, buf, 31) > 0); + + pfd = realloc(pfd, sizeof(struct pollfd) * (neventfds + 3)); + for (r = 0; r < neventfds; r++) { + pfd[r+3].fd = eventfds[r]; + pfd[r+3].events = POLLIN; + } + + for(;;) { + shift_state = 6; + if (ioctl(0, TIOCLINUX, &shift_state) < 0) + panic("ioctl TIOCLINUX 6: %r"); + + r = poll(pfd, 3+neventfds, -1); + if (r < 0) + oserror(); + if (pfd[0].revents & POLLPRI) { + if ((r = read(ttyfd, buf, 31)) <= 0) + panic("ttyfd read: %r"); + buf[r] = '\0'; + if (strcmp(buf, tty) == 0) { + hidden = 0; + printf("\e[?25l"); + fflush(stdout); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } + else + hidden = 1; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + pfd[0].fd = ttyfd; + read(ttyfd, buf, 0); + } + if (pfd[1].revents & POLLIN) + read(pfd[1].fd, buf, 31); + if (pfd[2].revents & POLLIN) { + for (r = 0; r < neventfds; r++) + close(eventfds[r]); + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + goto TOP; + } + for (r = 0; r < neventfds; r++) + if (pfd[r+3].revents & POLLIN) { + if (read(pfd[r+3].fd, &data, sizeof(data)) != sizeof(data)) + panic("eventfd read: %r"); + if (onevent(&data) == 0) { + ioctlarg = 15; + if (ioctl(0, TIOCLINUX, &ioctlarg) != 0) { + ioctlarg = 4; + ioctl(0, TIOCLINUX, &ioctlarg); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } else { + write(1, "\033[9;30]", 7); + } + } + } + } + + printf("\e[?25h"); + fflush(stdout); + termctl(ECHO, 1); + free(pfd); +} + +void +screensize(Rectangle r, ulong chan) +{ + gscreen = backbuf; + gscreen->clipr = ZR; +} + +void +screeninit(void) +{ + int r; + char buf[1]; + + // set up terminal + printf("\e[?25l"); + fflush(stdout); + termctl(~(ICANON|ECHO), 0); + signal(SIGINT, ctrlc); + + memimageinit(); + + // tty switching + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd >= 0) { + tty = malloc(32); + r = read(ttyfd, tty, 31); + if (r >= 0) + tty[r] = '\0'; + else + tty[0] = '\0'; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + } + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + read(ttyfd, buf, 0); + hidden = 0; + + if(fbattach(0) == nil) { + panic("cannot open framebuffer: %r"); + } + + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + + screensize(screenr, chan); + if (gscreen == nil) + panic("screensize failed"); + + gscreen->clipr = screenr; + kproc("fbdev", fbproc, nil); + + terminit(); + + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); +} + +Memdata* +attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen) +{ + *r = gscreen->clipr; + *chan = gscreen->chan; + *depth = gscreen->depth; + *width = gscreen->width; + *softscreen = 1; + + gscreen->data->ref++; + return gscreen->data; +} + +void +getcolor(ulong i, ulong *r, ulong *g, ulong *b) +{ + ulong v; + + v = cmap2rgb(i); + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + /* no-op */ + return; +} + +char* +clipread(void) +{ + if(snarfbuf) + return strdup(snarfbuf); + return nil; +} + +int +clipwrite(char *buf) +{ + if(snarfbuf) + free(snarfbuf); + snarfbuf = strdup(buf); + return 0; +} + +void +guimain(void) +{ + cpubody(); +} + +void +termctl(uint32_t o, int or) +{ + struct termios t; + + tcgetattr(0, &t); + if (or) + t.c_lflag |= o; + else + t.c_lflag &= o; + tcsetattr(0, TCSANOW, &t); +} + +void +ctrlc(int sig) { +} + +int +onevent(struct input_event *data) +{ + Rectangle old, new; + ulong msec; + static int buttons; + static Point coord; + static char touched; + static Point startmousept; + static Point startpt; + int key; + static ulong lastmsec = 0; + + if (hidden != 0) + return -1; + + msec = ticks(); + + old.min = mousexy; + old.max = addpt(old.min, Pt(16, 16)); + + buttons &= ~0x18; + + switch(data->type) { + case 3: + switch(data->code) { + case 0: + coord.x = data->value; + break; + case 1: + coord.y = data->value; + break; + case 0x18: + case 0x1c: + if (data->value == 0) + touched = 0; + else if (data->value > 24) { + touched = 1; + startmousept = coord; + startpt = mousexy; + } + break; + default: + return -1; + } + if (touched) + mousexy = addpt(startpt, divpt(subpt(coord, startmousept), 4)); + break; + case 2: + switch(data->code) { + case 0: + mousexy.x += data->value; + break; + case 1: + mousexy.y += data->value; + break; + case 8: + buttons |= data->value == 1? 8: 16; + break; + default: + return -1; + } + break; + case 1: + switch(data->code) { + case 0x110: + if (data->value == 1) + buttons |= 1; + else + buttons &= ~1; + break; + case 0x111: + if (data->value == 1) + buttons |= shift_state & (1 << KG_SHIFT)? 2: 4; + else + buttons &= ~(shift_state & (1 << KG_SHIFT)? 2: 4); + break; + case 0x112: + if (data->value == 1) + buttons |= 2; + else + buttons &= ~2; + break; + default: + if (hidden) + return 0; + if (data->code > 0 && data->code <= nelem(code2key)) { + if (shift_state & (1 << KG_SHIFT)) + key = code2key_shift[data->code-1]; + else + key = code2key[data->code-1]; + if (key == Kshift) + return -1; + kbdkey(key, data->value); + return 0; + } + switch(data->code) { + case 87: + kbdkey(KF|11, data->value); + break; + case 88: + kbdkey(KF|12, data->value); + break; + case 96: + kbdkey('\n', data->value); + break; + case 97: + kbdkey(Kctl, data->value); + break; + case 98: + kbdkey('/', data->value); + break; + case 100: + kbdkey(Kalt, data->value); + break; + case 102: + kbdkey(Khome, data->value); + break; + case 103: + kbdkey(Kup, data->value); + break; + case 104: + kbdkey(Kpgup, data->value); + break; + case 105: + kbdkey(Kleft, data->value); + break; + case 106: + kbdkey(Kright, data->value); + break; + case 107: + kbdkey(Kend, data->value); + break; + case 108: + kbdkey(Kdown, data->value); + break; + case 109: + kbdkey(Kpgdown, data->value); + break; + case 110: + kbdkey(Kins, data->value); + break; + case 111: + kbdkey(Kdel, data->value); + break; + } + return 0; + } + break; + default: + return -1; + } + + if (mousexy.x < screenimage->r.min.x) + mousexy.x = screenimage->r.min.x; + if (mousexy.y < screenimage->r.min.y) + mousexy.y = screenimage->r.min.y; + if (mousexy.x > screenimage->r.max.x) + mousexy.x = screenimage->r.max.x; + if (mousexy.y > screenimage->r.max.y) + mousexy.y = screenimage->r.max.y; + + new.min = mousexy; + new.max = addpt(new.min, Pt(16, 16)); // size of cursor bitmap + + combinerect(&new, old); + new.min = subpt(new.min, Pt(16, 16)); // to encompass any cursor->offset + + qlock(&drawlock); + flushmemscreen(new); + qunlock(&drawlock); + + if ((msec - lastmsec) < 10) + if (data->type != 1) + return 0; + + lastmsec = msec; + + absmousetrack(mousexy.x, mousexy.y, buttons, msec); + + return 0; +} + +void +mouseset(Point p) +{ + qlock(&drawlock); + mousexy = p; + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +setcursor(void) +{ + qlock(&drawlock); + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +titlewrite(char* buf) +{ +} + diff --git a/kern/devaudio-alsa.c b/kern/devaudio-alsa.c new file mode 100644 index 0000000..30dfd60 --- /dev/null +++ b/kern/devaudio-alsa.c @@ -0,0 +1,108 @@ +/* + * ALSA + */ +#include <alsa/asoundlib.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include "devaudio.h" + +enum +{ + Channels = 2, + Rate = 44100, + Bits = 16, +}; + +static snd_pcm_t *playback; +static snd_pcm_t *capture; +static int speed = Rate; + +/* maybe this should return -1 instead of sysfatal */ +void +audiodevopen(void) +{ + if(snd_pcm_open(&playback, "default", SND_PCM_STREAM_PLAYBACK, 0) < 0) + error("snd_pcm_open playback"); + + if(snd_pcm_set_params(playback, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params playback"); + + if(snd_pcm_prepare(playback) < 0) + error("snd_pcm_prepare playback"); + + if(snd_pcm_open(&capture, "default", SND_PCM_STREAM_CAPTURE, 0) < 0) + error("snd_pcm_open capture"); + + if(snd_pcm_set_params(capture, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params capture"); + + if(snd_pcm_prepare(capture) < 0) + error("snd_pcm_prepare capture"); +} + +void +audiodevclose(void) +{ + snd_pcm_drain(playback); + snd_pcm_close(playback); + + snd_pcm_close(capture); +} + +void +audiodevsetvol(int what, int left, int right) +{ + if(what == Vspeed){ + speed = left; + return; + } +} + +void +audiodevgetvol(int what, int *left, int *right) +{ + if(what == Vspeed){ + *left = *right = speed; + return; + } + + *left = *right = 100; +} + +int +audiodevwrite(void *v, int n) +{ + snd_pcm_sframes_t frames; + int tot, m; + + for(tot = 0; tot < n; tot += m){ + do { + frames = snd_pcm_writei(playback, v+tot, (n-tot)/4); + } while(frames == -EAGAIN); + if (frames < 0) + frames = snd_pcm_recover(playback, frames, 0); + if (frames < 0) + error((char*)snd_strerror(frames)); + m = frames*4; + } + + return tot; +} + +int +audiodevread(void *v, int n) +{ + snd_pcm_sframes_t frames; + + do { + frames = snd_pcm_readi(capture, v, n/4); + } while(frames == -EAGAIN); + + if (frames < 0) + error((char*)snd_strerror(frames)); + + return frames*4; +} diff --git a/libc/getpid.c b/libc/getpid.c new file mode 100644 index 0000000..9a9c86c --- /dev/null +++ b/libc/getpid.c @@ -0,0 +1,17 @@ +#include <u.h> +#include <libc.h> + +int +getpid(void) +{ + char b[20]; + int f; + + memset(b, 0, sizeof(b)); + f = open("#c/pid", 0); + if(f >= 0) { + read(f, b, sizeof(b)); + close(f); + } + return atol(b); +} diff --git a/main.c b/main.c index 0d74b2e..e66c81a 100644 --- a/main.c +++ b/main.c @@ -54,6 +54,7 @@ main(int argc, char **argv) if(bind("#U", "/root", MREPL) < 0) panic("bind #U: %r"); bind("#A", "/dev", MAFTER); + bind("#N", "/dev", MAFTER); bind("#C", "/", MAFTER); if(open("/dev/cons", OREAD) != 0) -- 2.20.1
[-- Attachment #1: Type: text/plain, Size: 42 bytes --] Bump. Is this patch ok? Thanks, izaki [-- Attachment #2: 0001-Merging-echoline-s-android-and-fbdev-forks.patch --] [-- Type: application/octet-stream, Size: 229575 bytes --] From 85e175d922e10d7421e174edefd691119b83030a Mon Sep 17 00:00:00 2001 From: Lorenzo Bivens <git@lorenzobivens.info> Date: Fri, 13 Aug 2021 20:39:50 -0700 Subject: [PATCH] Merging echoline's android and fbdev forks --- Make.android | 38 + Make.android-386 | 26 + Make.android-amd64 | 26 + Make.android-arm | 26 + Make.android-arm64 | 26 + Make.fbdev | 22 + README | 11 + gui-android/AndroidManifest.xml | 30 + gui-android/Makefile | 23 + gui-android/cpp/android.c | 230 ++++++ gui-android/cpp/devandroid.c | 248 +++++++ gui-android/cpp/native-lib.c | 173 +++++ .../org/echoline/drawterm/DrawTermThread.java | 32 + .../org/echoline/drawterm/MainActivity.java | 437 ++++++++++++ .../org/echoline/drawterm/MySurfaceView.java | 91 +++ gui-android/res/drawable-hdpi/ic_small.png | Bin 0 -> 5361 bytes gui-android/res/drawable-mdpi/ic_small.png | Bin 0 -> 3173 bytes gui-android/res/drawable-xhdpi/ic_small.png | Bin 0 -> 5181 bytes gui-android/res/drawable-xxhdpi/ic_small.png | Bin 0 -> 8529 bytes gui-android/res/drawable-xxxhdpi/ic_small.png | Bin 0 -> 10972 bytes gui-android/res/layout/activity_main.xml | 24 + gui-android/res/layout/content_main.xml | 16 + gui-android/res/layout/drawterm_main.xml | 44 ++ gui-android/res/layout/item_main.xml | 8 + gui-android/res/layout/server_main.xml | 56 ++ gui-android/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 14867 bytes gui-android/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 11578 bytes gui-android/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 15155 bytes gui-android/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 20643 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 25294 bytes gui-android/res/values/colors.xml | 6 + gui-android/res/values/strings.xml | 3 + gui-android/res/values/styles.xml | 8 + gui-fbdev/Makefile | 12 + gui-fbdev/fbdev.c | 673 ++++++++++++++++++ kern/devaudio-alsa.c | 108 +++ libc/getpid.c | 17 + main.c | 1 + 38 files changed, 2415 insertions(+) create mode 100644 Make.android create mode 100644 Make.android-386 create mode 100644 Make.android-amd64 create mode 100644 Make.android-arm create mode 100644 Make.android-arm64 create mode 100644 Make.fbdev create mode 100644 gui-android/AndroidManifest.xml create mode 100644 gui-android/Makefile create mode 100644 gui-android/cpp/android.c create mode 100644 gui-android/cpp/devandroid.c create mode 100644 gui-android/cpp/native-lib.c create mode 100644 gui-android/java/org/echoline/drawterm/DrawTermThread.java create mode 100644 gui-android/java/org/echoline/drawterm/MainActivity.java create mode 100644 gui-android/java/org/echoline/drawterm/MySurfaceView.java create mode 100644 gui-android/res/drawable-hdpi/ic_small.png create mode 100644 gui-android/res/drawable-mdpi/ic_small.png create mode 100644 gui-android/res/drawable-xhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxxhdpi/ic_small.png create mode 100644 gui-android/res/layout/activity_main.xml create mode 100644 gui-android/res/layout/content_main.xml create mode 100644 gui-android/res/layout/drawterm_main.xml create mode 100644 gui-android/res/layout/item_main.xml create mode 100644 gui-android/res/layout/server_main.xml create mode 100644 gui-android/res/mipmap-hdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-mdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 gui-android/res/values/colors.xml create mode 100644 gui-android/res/values/strings.xml create mode 100644 gui-android/res/values/styles.xml create mode 100644 gui-fbdev/Makefile create mode 100644 gui-fbdev/fbdev.c create mode 100644 kern/devaudio-alsa.c create mode 100644 libc/getpid.c diff --git a/Make.android b/Make.android new file mode 100644 index 0000000..00eaf68 --- /dev/null +++ b/Make.android @@ -0,0 +1,38 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +JAVA_HOME=/usr +OBJS=lib/arm64-v8a/libdrawterm.so lib/armeabi-v7a/libdrawterm.so lib/x86/libdrawterm.so lib/x86_64/libdrawterm.so + +all: drawterm.apk + +clean: + rm -f *.apk lib/*/*.so + +lib/arm64-v8a/libdrawterm.so: + CONF=android-arm64 make -j5; + CONF=android-arm64 make clean; + +lib/armeabi-v7a/libdrawterm.so: + CONF=android-arm make -j5; + CONF=android-arm make clean; + +lib/x86/libdrawterm.so: + CONF=android-386 make -j5; + CONF=android-386 make clean; + +lib/x86_64/libdrawterm.so: + CONF=android-amd64 make -j5; + CONF=android-amd64 make clean; + +drawterm.apk: drawterm-signed.apk + $(SDKPREFIX)/build-tools/30.0.3/zipalign -v -f 4 $< $@ + +drawterm-signed.apk: drawterm-unsigned.apk drawterm.keystore + $(JAVA_HOME)/bin/jarsigner -verbose -keystore ./drawterm.keystore -storepass glendarocks -keypass glendarocks -signedjar $@ $< drawtermKey + +drawterm-unsigned.apk: $(OBJS) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -v -f -M gui-android/AndroidManifest.xml -S gui-android/res -I $(SDKPREFIX)/platforms/android-21/android.jar -F $@ gui-android/bin + $(SDKPREFIX)/build-tools/30.0.3/aapt add $@ $(OBJS) + +drawterm.keystore: + $(JAVA_HOME)/bin/keytool -genkeypair -validity 1000 -dname "CN=9front,O=Android,C=US" -keystore $@ -storepass glendarocks -keypass glendarocks -alias drawtermKey -keyalg RSA -v diff --git a/Make.android-386 b/Make.android-386 new file mode 100644 index 0000000..ff43cf6 --- /dev/null +++ b/Make.android-386 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/i686-linux-android-ar +AS=$(NDKPREFIX)/i686-linux-android-as +RANLIB=$(NDKPREFIX)/i686-linux-android-ranlib +STRIP=$(NDKPREFIX)/i686-linux-android-strip +CC=$(NDKPREFIX)/i686-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=386; \ + (cd posix-$$arch && make) + diff --git a/Make.android-amd64 b/Make.android-amd64 new file mode 100644 index 0000000..3f5cf46 --- /dev/null +++ b/Make.android-amd64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/x86_64-linux-android-ar +AS=$(NDKPREFIX)/x86_64-linux-android-as +RANLIB=$(NDKPREFIX)/x86_64-linux-android-ranlib +STRIP=$(NDKPREFIX)/x86_64-linux-android-strip +CC=$(NDKPREFIX)/x86_64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86_64/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=amd64; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm b/Make.android-arm new file mode 100644 index 0000000..862d81d --- /dev/null +++ b/Make.android-arm @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/arm-linux-androideabi-ar +AS=$(NDKPREFIX)/arm-linux-androideabi-as +RANLIB=$(NDKPREFIX)/arm-linux-androideabi-ranlib +STRIP=$(NDKPREFIX)/arm-linux-androideabi-strip +CC=$(NDKPREFIX)/armv7a-linux-androideabi21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/armeabi-v7a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm64 b/Make.android-arm64 new file mode 100644 index 0000000..5ceab39 --- /dev/null +++ b/Make.android-arm64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/aarch64-linux-android-ar +AS=$(NDKPREFIX)/aarch64-linux-android-as +RANLIB=$(NDKPREFIX)/aarch64-linux-android-ranlib +STRIP=$(NDKPREFIX)/aarch64-linux-android-strip +CC=$(NDKPREFIX)/aarch64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/arm64-v8a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm64; \ + (cd posix-$$arch && make) + diff --git a/Make.fbdev b/Make.fbdev new file mode 100644 index 0000000..ed8e1b0 --- /dev/null +++ b/Make.fbdev @@ -0,0 +1,22 @@ +# Unix +#PTHREAD= # for Mac +PTHREAD=-pthread +AR=ar +AS=as +RANLIB=ranlib +CC=gcc +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -D_THREAD_SAFE $(PTHREAD) -O2 +O=o +OS=posix +GUI=fbdev +LDADD=-ggdb -lm -lasound +LDFLAGS=$(PTHREAD) +TARG=drawterm +# AUDIO=none +AUDIO=alsa + +all: default + +libmachdep.a: + arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/; s/x86_64/amd64/; s/armv[567].*/arm/; s/aarch64/arm64/'`; \ + (cd posix-$$arch && make) diff --git a/README b/README index 2599800..749273f 100644 --- a/README +++ b/README @@ -18,6 +18,17 @@ To build on Mac OS X with X11 (xquartz), run CONF=osx-x11 make. To build on Mac OS X with Cocoa, run CONF=osx-cocoa make and "cp drawterm gui-cocoa/drawterm.app/". +To build for Android, make sure Make.android* and gui-android/Makefile are correct for your build and target systems, then run make -f Make.android + +USAGE +------- +On Android the five checkboxes at the top represent the three mouse buttons and mousewheel, determining which "buttons" are clicked. The "kb" button toggles the soft keyboard. + + +CAVEATS +-------- +Be aware that right now on Android the login details are saved as a plaintext string if saved, and there is no secstore support. + BINARIES --------- diff --git a/gui-android/AndroidManifest.xml b/gui-android/AndroidManifest.xml new file mode 100644 index 0000000..97be515 --- /dev/null +++ b/gui-android/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.echoline.drawterm"> + + <supports-screens android:largeScreens="true" + android:normalScreens="true" android:smallScreens="true" + android:anyDensity="true" /> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + <activity + android:name=".MainActivity" + android:label="@string/app_name" + android:windowSoftInputMode="stateUnchanged|adjustNothing"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + <uses-permission android:name="android.permission.INTERNET"/> + <!--<uses-permission android:name="android.permission.SET_DEBUG_APP"/>--> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.CAMERA"/> +</manifest> diff --git a/gui-android/Makefile b/gui-android/Makefile new file mode 100644 index 0000000..04df778 --- /dev/null +++ b/gui-android/Makefile @@ -0,0 +1,23 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + cpp/android.$O\ + cpp/native-lib.$O\ + cpp/devandroid.$O\ + +default: $(LIB) gen/org/echoline/drawterm/R.java bin/classes.dex +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + +gen/org/echoline/drawterm/R.java: $(shell find res/ -type f) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -f -m -M AndroidManifest.xml -I $(SDKPREFIX)/platforms/android-21/android.jar -S res/ -J gen + +bin/classes.dex: obj/org/echoline/drawterm/MainActivity.class obj/org/echoline/drawterm/DrawTermThread.class obj/org/echoline/drawterm/MySurfaceView.class + $(SDKPREFIX)/build-tools/30.0.3/dx --dex --verbose --output=$@ obj/ + +obj/org/echoline/drawterm/%.class: java/org/echoline/drawterm/%.java + $(JAVA_HOME)/bin/javac -d obj/ -classpath $(SDKPREFIX)/platforms/android-21/android.jar -sourcepath java java/org/echoline/drawterm/$*.java gen/org/echoline/drawterm/R.java + diff --git a/gui-android/cpp/android.c b/gui-android/cpp/android.c new file mode 100644 index 0000000..e6a2e0f --- /dev/null +++ b/gui-android/cpp/android.c @@ -0,0 +1,230 @@ +#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; +} + +int +clipwrite(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; +} + +void +show_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; +} + +int +num_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; +} + +void +take_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; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + return; +} + +void +getcolor(ulong v, ulong *r, ulong *g, ulong *b) +{ + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +flushmemscreen(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; +} + +void +screeninit(void) +{ + Rectangle r = Rect(0,0,screenWidth,screenHeight); + memimageinit(); + screensize(r, XRGB32); + if (gscreen == nil) + panic("screensize failed"); + gscreen->clipr = r; + terminit(); + qlock(&drawlock); + flushmemscreen(r); + qunlock(&drawlock); + return; +} + +void +screensize(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; +} + +void +setcursor(void) +{ + return; +} + +void +mouseset(Point xy) +{ + return; +} + +void +guimain(void) +{ + cpubody(); +} + diff --git a/gui-android/cpp/devandroid.c b/gui-android/cpp/devandroid.c new file mode 100644 index 0000000..daf2f57 --- /dev/null +++ b/gui-android/cpp/devandroid.c @@ -0,0 +1,248 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <android/log.h> +#include <android/sensor.h> + +void show_notification(char *buf); +void take_picture(int id); +int num_cameras(); + +int Ncameras = 0; + +uchar *cambuf = nil; +int camlen; + +ASensorManager *sensorManager = NULL; + +enum +{ + Qdir = 0, + Qcam = 1, + Qaccel = 2, + Qcompass = 4, + Qnotification = 6, +}; +#define QID(p, c, y) (((p)<<16) | ((c)<<4) | (y)) + +static void androidinit(void); + +static void +androidinit(void) +{ + sensorManager = ASensorManager_getInstance(); + + Ncameras = num_cameras(); +} + +static Chan* +androidattach(char *param) +{ + Chan *c; + + c = devattach('N', param); + c->qid.path = QID(0, 0, Qdir); + c->qid.type = QTDIR; + c->qid.vers = 0; + + return c; +} + +static int +androidgen(Chan *c, char *n, Dirtab *d, int nd, int s, Dir *dp) +{ + Qid q; + + if (s == DEVDOTDOT) { + mkqid(&q, Qdir, 0, QTDIR); + devdir(c, q, "#N", 0, eve, 0555, dp); + return 1; + } + if (s < Ncameras) { + sprintf(up->genbuf, "cam%d.jpg", s); + mkqid(&q, (s << 16) | Qcam, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == Ncameras) { + sprintf(up->genbuf, "accel"); + mkqid(&q, Qaccel, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+1)) { + sprintf(up->genbuf, "compass"); + mkqid(&q, Qcompass, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+2)) { + sprintf(up->genbuf, "notification"); + mkqid(&q, Qnotification, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0222, dp); + return 1; + } + return -1; +} + +static Walkqid* +androidwalk(Chan *c, Chan *nc, char **name, int nname) +{ + return devwalk(c, nc, name, nname, 0, 0, androidgen); +} + +static int +androidstat(Chan *c, uchar *db, int n) +{ + return devstat(c, db, n, 0, 0, androidgen); +} + +static Chan* +androidopen(Chan *c, int omode) +{ + p9_uvlong s; + + c = devopen(c, omode, 0, 0, androidgen); + + if (c->qid.path & Qcam) { + s = c->qid.path >> 16; + take_picture(s); + } + c->mode = openmode(omode); + c->flag |= COPEN; + c->offset = 0; + c->iounit = 8192; + + return c; +} + +static void +androidclose(Chan *c) +{ + if (c->qid.path & Qcam && cambuf != nil) { + free(cambuf); + cambuf = nil; + } +} + +static long +androidread(Chan *c, void *v, long n, vlong off) +{ + char *a = v; + long l; + const ASensor *sensor; + ASensorEventQueue *queue = NULL; + ASensorEvent data; + + switch((ulong)c->qid.path & 0xF) { + default: + error(Eperm); + return -1; + + case Qcam: + while(cambuf == nil) + usleep(10 * 1000); + + l = camlen - off; + if (l > n) + l = n; + + if (l > 0) + memcpy(a, cambuf + off, l); + + return l; + case Qaccel: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qcompass: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_MAGNETIC_FIELD); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qdir: + return devdirread(c, a, n, 0, 0, androidgen); + } +} + +static long +androidwrite(Chan *c, void *vp, long n, vlong off) +{ + char *a = vp; + char *str; + + switch((ulong)c->qid.path) { + case Qnotification: + str = malloc(n+1); + memcpy(str, a, n); + str[n] = '\0'; + show_notification(str); + free(str); + return n; + default: + error(Eperm); + break; + } + return -1; +} + +Dev androiddevtab = { + 'N', + "android", + + devreset, + androidinit, + devshutdown, + androidattach, + androidwalk, + androidstat, + androidopen, + devcreate, + androidclose, + androidread, + devbread, + androidwrite, + devbwrite, + devremove, + devwstat, +}; diff --git a/gui-android/cpp/native-lib.c b/gui-android/cpp/native-lib.c new file mode 100644 index 0000000..1e768b3 --- /dev/null +++ b/gui-android/cpp/native-lib.c @@ -0,0 +1,173 @@ +#include <jni.h> +#include <android/native_window.h> +#include <android/native_window_jni.h> +#include <android/log.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include <draw.h> +#include <string.h> +#include <keyboard.h> + +void absmousetrack(int, int, int, ulong); +ulong ticks(void); +int dt_main(int, char**); +int screenWidth; +int screenHeight; +Point mousept = {0, 0}; +int buttons = 0; +float ws = 1; +float hs = 1; +extern char *snarfbuf; +int mPaused = 0; +ANativeWindow *window = NULL; +jobject mainActivityObj; +JavaVM *jvm; +void flushmemscreen(Rectangle r); +extern uchar *cambuf; +extern int camlen; + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setObject( + JNIEnv *env, + jobject obj) { + mainActivityObj = (*env)->NewGlobalRef(env, obj); + jint rs = (*env)->GetJavaVM(env, &jvm); + assert(rs == JNI_OK); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyDown( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyUp( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setPass( + JNIEnv *env, + jobject obj, + jstring str) { + setenv("PASS", (char*)(*env)->GetStringUTFChars(env, str, 0), 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidth( + JNIEnv *env, + jobject obj, + jint width) { + screenWidth = width; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeight( + JNIEnv *env, + jobject obj, + jint height) { + screenHeight = height; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidthScale( + JNIEnv *env, + jobject obj, + jfloat s) { + ws = s; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeightScale( + JNIEnv *env, + jobject obj, + jfloat s) { + hs = s; +} + +JNIEXPORT jint JNICALL +Java_org_echoline_drawterm_MainActivity_dtmain( + JNIEnv *env, + jobject obj, + jobjectArray argv) { + int i, ret; + char **args = (char **) malloc(((*env)->GetArrayLength(env, argv)+1) * sizeof(char *)); + + for (i = 0; i < (*env)->GetArrayLength(env, argv); i++) { + jobject str = (jobject) (*env)->GetObjectArrayElement(env, argv, i); + args[i] = strdup((char*)(*env)->GetStringUTFChars(env, (jstring)str, 0)); + } + args[(*env)->GetArrayLength(env, argv)] = NULL; + + ret = dt_main(i, args); + + for (i = 0; args[i] != NULL; i++) { + free(args[i]); + } + free(args); + + return ret; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setMouse( + JNIEnv *env, + jobject obj, + jintArray args) { + jboolean isCopy; + jint *data; + if ((*env)->GetArrayLength(env, args) < 3) + return; + data = (*env)->GetIntArrayElements(env, args, &isCopy); + mousept.x = (int)(data[0] / ws); + mousept.y = (int)(data[1] / hs); + buttons = data[2]; + (*env)->ReleaseIntArrayElements(env, args, data, 0); + absmousetrack(mousept.x, mousept.y, buttons, ticks()); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setDTSurface( + JNIEnv* jenv, + jobject obj, + jobject surface) { + if (surface != NULL) { + window = ANativeWindow_fromSurface(jenv, surface); + ANativeWindow_setBuffersGeometry(window, screenWidth, screenHeight, + AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM); + flushmemscreen(Rect(0, 0, screenWidth, screenHeight)); + } else if (window != NULL) { + ANativeWindow_release(window); + window = NULL; + } +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_exitDT( + JNIEnv* jenv, + jobject obj) { + exit(0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_sendPicture( + JNIEnv* env, + jobject obj, + jbyteArray array) { + jint len = (*env)->GetArrayLength(env, array); + jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL); + camlen = len; + cambuf = malloc(camlen); + memcpy(cambuf, bytes, camlen); + (*env)->ReleaseByteArrayElements(env, array, bytes, 0); +} + diff --git a/gui-android/java/org/echoline/drawterm/DrawTermThread.java b/gui-android/java/org/echoline/drawterm/DrawTermThread.java new file mode 100644 index 0000000..52baae8 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/DrawTermThread.java @@ -0,0 +1,32 @@ +package org.echoline.drawterm; + +/** + * Created by eli on 12/4/17. + */ + +public class DrawTermThread extends Thread { + private MainActivity m; + private String p; + private String []args; + + public DrawTermThread(String []args, String p, MainActivity m) { + this.m = m; + this.p = p; + this.args = args; + } + + @Override + public void run() { + if (p != null && !p.equals("")) + m.setPass(p); + m.dtmain(args); + m.runOnUiThread(new Runnable() { + @Override + public void run() { + m.exitDT(); + m.setContentView(R.layout.server_main); + m.populateServers(m); + } + }); + } +} diff --git a/gui-android/java/org/echoline/drawterm/MainActivity.java b/gui-android/java/org/echoline/drawterm/MainActivity.java new file mode 100644 index 0000000..2e9b852 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MainActivity.java @@ -0,0 +1,437 @@ +package org.echoline.drawterm; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.Point; +import android.os.Bundle; +import android.os.Environment; + +import android.app.Activity; + +import android.app.Notification; +import android.app.NotificationManager; + +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.MotionEvent; +import android.view.View; +import android.view.Menu; +import android.view.MenuItem; +import android.view.WindowManager; +import android.view.Surface; +import android.view.inputmethod.InputMethodManager; +import android.view.KeyEvent; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.TotalCaptureResult; +import android.media.Image; +import android.media.ImageReader; +import android.graphics.ImageFormat; +import android.os.Handler; +import android.os.HandlerThread; + +import java.io.File; +import java.util.Map; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.ArrayList; + +public class MainActivity extends Activity { + private Map<String, ?> map; + private MainActivity mainActivity; + private boolean dtrunning = false; + private DrawTermThread dthread; + private int notificationId; + private CameraDevice cameraDevice = null; + private byte []jpegBytes; + + static { + System.loadLibrary("drawterm"); + } + + public void showNotification(String text) { + Notification.Builder builder = new Notification.Builder(this) + .setDefaults(Notification.DEFAULT_SOUND) + .setSmallIcon(R.drawable.ic_small) + .setContentText(text) + .setStyle(new Notification.BigTextStyle().bigText(text)) + .setPriority(Notification.PRIORITY_DEFAULT); + + ((NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE)).notify(notificationId, builder.build()); + notificationId++; + } + + public int numCameras() { + try { + return ((CameraManager)getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length; + } catch (CameraAccessException e) { + Log.w("drawterm", e.toString()); + return 0; + } + } + + public void takePicture(int id) { + try { + HandlerThread mBackgroundThread = new HandlerThread("Camera Background"); + mBackgroundThread.start(); + Handler mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); + CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); + String []cameraIdList = manager.getCameraIdList(); + manager.openCamera(cameraIdList[id], new CameraDevice.StateCallback() { + public void onOpened(CameraDevice device) { + cameraDevice = device; + } + public void onDisconnected(CameraDevice device) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + public void onError(CameraDevice device, int error) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + }, mBackgroundHandler); + ImageReader reader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1); + CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG); + captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); + captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getWindowManager().getDefaultDisplay().getRotation()); + captureBuilder.addTarget(reader.getSurface()); + reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { + public void onImageAvailable(ImageReader reader) { + Image image = null; + try { + image = reader.acquireLatestImage(); + ByteBuffer buffer = image.getPlanes()[0].getBuffer(); + jpegBytes = new byte[buffer.capacity()]; + buffer.get(jpegBytes); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } finally { + if (image != null) { + image.close(); + } + } + } + }, mBackgroundHandler); + List<Surface> outputSurfaces = new ArrayList<Surface>(1); + outputSurfaces.add(reader.getSurface()); + cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { + public void onConfigured(CameraCaptureSession session) { + try { + List<CaptureRequest> captureRequests = new ArrayList<CaptureRequest>(10); + for (int i = 0; i < 10; i++) + captureRequests.add(captureBuilder.build()); + session.captureBurst(captureRequests, new CameraCaptureSession.CaptureCallback() { + public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) { + try { + sendPicture(jpegBytes); + mBackgroundThread.quitSafely(); + mBackgroundThread.join(); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } + } + }, mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + public void onConfigureFailed(CameraCaptureSession session) { + } + }, mBackgroundHandler); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void serverView(View v) { + setContentView(R.layout.server_main); + serverButtons(); + + String s = (String)map.get(((TextView)v).getText().toString()); + String []a = s.split("\007"); + + ((EditText)findViewById(R.id.cpuServer)).setText((String)a[0]); + ((EditText)findViewById(R.id.authServer)).setText((String)a[1]); + ((EditText)findViewById(R.id.userName)).setText((String)a[2]); + if (a.length > 3) + ((EditText)findViewById(R.id.passWord)).setText((String)a[3]); + } + + public void populateServers(Context context) { + ListView ll = (ListView)findViewById(R.id.servers); + ArrayAdapter<String> la = new ArrayAdapter<String>(this, R.layout.item_main); + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + map = (Map<String, ?>)settings.getAll(); + String key; + Object []keys = map.keySet().toArray(); + for (int i = 0; i < keys.length; i++) { + key = (String)keys[i]; + la.add(key); + } + ll.setAdapter(la); + + setDTSurface(null); + dtrunning = false; + } + + public void runDrawterm(String []args, String pass) { + Resources res = getResources(); + DisplayMetrics dm = res.getDisplayMetrics(); + + int wp = dm.widthPixels; + int hp = dm.heightPixels; + + setContentView(R.layout.drawterm_main); + + Button kbutton = (Button)findViewById(R.id.keyboardToggle); + kbutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); + } + }); + + int rid = res.getIdentifier("navigation_bar_height", "dimen", "android"); + if (rid > 0) { + hp -= res.getDimensionPixelSize(rid); + } + LinearLayout ll = (LinearLayout)findViewById(R.id.dtButtons); + hp -= ll.getHeight(); + + int w = (int)(wp * (160.0/dm.xdpi)); + int h = (int)(hp * (160.0/dm.ydpi)); + float ws = (float)wp/w; + float hs = (float)hp/h; + // only scale up + if (ws < 1) { + ws = 1; + w = wp; + } + if (hs < 1) { + hs = 1; + h = hp; + } + + MySurfaceView mView = new MySurfaceView(mainActivity, w, h, ws, hs); + mView.getHolder().setFixedSize(w, h); + + LinearLayout l = (LinearLayout)findViewById(R.id.dlayout); + l.addView(mView, 1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); + + dthread = new DrawTermThread(args, pass, mainActivity); + dthread.start(); + + dtrunning = true; + } + + public void serverButtons() { + Button button = (Button)findViewById(R.id.save); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(user + "@" + cpu + " (auth=" + auth + ")", cpu + "\007" + auth + "\007" + user + "\007" + pass); + editor.commit(); + } + }); + + button = (Button) findViewById(R.id.connect); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + String args[] = {"drawterm", "-p", "-h", cpu, "-a", auth, "-u", user}; + runDrawterm(args, pass); + } + }); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + + mainActivity = this; + setObject(); + setContentView(R.layout.activity_main); + populateServers(this); + + View fab = findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setContentView(R.layout.server_main); + serverButtons(); + } + }); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + if (!dtrunning) { + return super.dispatchKeyEvent(event); + } + + int k = event.getUnicodeChar(); + if (k == 0) { + k = event.getDisplayLabel(); + if (k >= 'A' && k <= 'Z') + k |= 0x20; + } + String chars = event.getCharacters(); + if (k == 0 && chars != null) { + for (int i = 0; i < chars.length(); i++) { + k = chars.codePointAt(i); + keyDown(k); + keyUp(k); + } + return true; + } + + if (k == 0) switch (event.getKeyCode()) { + case KeyEvent.KEYCODE_DEL: + k = 0x0008; + break; + case KeyEvent.KEYCODE_FORWARD_DEL: + k = 0x007F; + break; + case KeyEvent.KEYCODE_ESCAPE: + k = 0x001B; + break; + case KeyEvent.KEYCODE_MOVE_HOME: + k = 0xF00D; + break; + case KeyEvent.KEYCODE_MOVE_END: + k = 0xF018; + break; + case KeyEvent.KEYCODE_PAGE_UP: + k = 0xF00F; + break; + case KeyEvent.KEYCODE_PAGE_DOWN: + k = 0xF013; + break; + case KeyEvent.KEYCODE_INSERT: + k = 0xF014; + break; + case KeyEvent.KEYCODE_SYSRQ: + k = 0xF010; + break; + case KeyEvent.KEYCODE_DPAD_UP: + k = 0xF00E; + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + k = 0xF011; + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + k = 0xF012; + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + k = 0xF800; + break; + } + + if (k == 0) + return true; + + if (event.isCtrlPressed()) { + keyDown(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyDown(0xF015); + } + + if (event.getAction() == KeyEvent.ACTION_DOWN) { + keyDown(k); + } + else if (event.getAction() == KeyEvent.ACTION_UP) { + keyUp(k); + } + + if (event.isCtrlPressed()) { + keyUp(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyUp(0xF015); + } + + return true; + } + + @Override + public void onBackPressed() + { + } + + @Override + public void onDestroy() + { + setDTSurface(null); + dtrunning = false; + exitDT(); + super.onDestroy(); + } + + public void setClipBoard(String str) { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = ClipData.newPlainText(null, str); + cm.setPrimaryClip(cd); + } + } + + public String getClipBoard() { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = cm.getPrimaryClip(); + if (cd != null) + return (String)(cd.getItemAt(0).coerceToText(mainActivity.getApplicationContext()).toString()); + } + return ""; + } + + public native void dtmain(Object[] args); + public native void setPass(String arg); + public native void setWidth(int arg); + public native void setHeight(int arg); + public native void setWidthScale(float arg); + public native void setHeightScale(float arg); + public native void setDTSurface(Surface surface); + public native void setMouse(int[] args); + public native void setObject(); + public native void keyDown(int c); + public native void keyUp(int c); + public native void exitDT(); + public native void sendPicture(byte[] array); +} diff --git a/gui-android/java/org/echoline/drawterm/MySurfaceView.java b/gui-android/java/org/echoline/drawterm/MySurfaceView.java new file mode 100644 index 0000000..fe71676 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MySurfaceView.java @@ -0,0 +1,91 @@ +package org.echoline.drawterm; + +import android.util.Log; + +import android.content.Context; +import android.graphics.Bitmap; +import android.os.SystemClock; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.SurfaceHolder; +import android.view.View; +import android.widget.CheckBox; +import android.widget.EditText; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.security.spec.ECField; + +/** + * Created by eli on 12/3/17. + */ +public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { + private int screenWidth, screenHeight; + private MainActivity mainActivity; + private float ws, hs; + + public MySurfaceView(Context context, int w, int h, float ws, float hs) { + super(context); + screenHeight = h; + screenWidth = w; + this.ws = ws; + this.hs = hs; + mainActivity = (MainActivity)context; + mainActivity.setWidth(screenWidth); + mainActivity.setHeight(screenHeight); + mainActivity.setWidthScale(ws); + mainActivity.setHeightScale(hs); + setWillNotDraw(true); + + getHolder().addCallback(this); + + setOnTouchListener(new View.OnTouchListener() { + private int[] mouse = new int[3]; + + @Override + public boolean onTouch(View v, MotionEvent event) { + CheckBox left = (CheckBox)mainActivity.findViewById(R.id.mouseLeft); + CheckBox middle = (CheckBox)mainActivity.findViewById(R.id.mouseMiddle); + CheckBox right = (CheckBox)mainActivity.findViewById(R.id.mouseRight); + CheckBox up = (CheckBox)mainActivity.findViewById(R.id.mouseUp); + CheckBox down = (CheckBox)mainActivity.findViewById(R.id.mouseDown); + int buttons = (left.isChecked()? 1: 0) | + (middle.isChecked()? 2: 0) | + (right.isChecked()? 4: 0) | + (up.isChecked()? 8: 0) | + (down.isChecked()? 16: 0); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = 0; + mainActivity.setMouse(mouse); + } + return true; + } + }); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + mainActivity.setDTSurface(holder.getSurface()); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int w, int h, int format) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + mainActivity.setDTSurface(null); + } +} diff --git a/gui-android/res/drawable-hdpi/ic_small.png b/gui-android/res/drawable-hdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..67c067bf719be65701ad8a91af18060a7bb4358e GIT binary patch literal 5361 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 P00000NkvXXu0mjf7mR>_ literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-mdpi/ic_small.png b/gui-android/res/drawable-mdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7c24e6ac8bc34d41eee51805cc6f224c963072c2 GIT binary patch literal 3173 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 LNkvXXu0mjf)t&&% literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xhdpi/ic_small.png b/gui-android/res/drawable-xhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b85001eb8f634484150e4f6b12e3e972190aa9 GIT binary patch literal 5181 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�DLt() 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxhdpi/ic_small.png b/gui-android/res/drawable-xxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7dc776c15ddacd33574b519fa0e6335f1be1ea GIT binary patch literal 8529 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 LNkvXXu0mjf)9P)C literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxxhdpi/ic_small.png b/gui-android/res/drawable-xxxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9205252fd9bbdabb58cb12d303ca65c9d2170d GIT binary patch literal 10972 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 KMNUMnLSTY*4_h4o literal 0 HcmV?d00001 diff --git a/gui-android/res/layout/activity_main.xml b/gui-android/res/layout/activity_main.xml new file mode 100644 index 0000000..14c98eb --- /dev/null +++ b/gui-android/res/layout/activity_main.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <include layout="@layout/content_main" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end"> + + <Button + android:id="@+id/fab" + android:text="add server" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/content_main.xml b/gui-android/res/layout/content_main.xml new file mode 100644 index 0000000..8a7f802 --- /dev/null +++ b/gui-android/res/layout/content_main.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity" + tools:showIn="@layout/activity_main"> + <ListView + android:id="@+id/servers" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + </ListView> +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/drawterm_main.xml b/gui-android/res/layout/drawterm_main.xml new file mode 100644 index 0000000..cb5c9f3 --- /dev/null +++ b/gui-android/res/layout/drawterm_main.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/dlayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:gravity="center_horizontal" + android:orientation="horizontal" + android:id="@+id/dtButtons"> + + <CheckBox + android:id="@+id/mouseLeft" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseMiddle" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseRight" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseUp" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseDown" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <Button + android:id="@+id/keyboardToggle" + android:text="kb" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + </LinearLayout> +</LinearLayout> diff --git a/gui-android/res/layout/item_main.xml b/gui-android/res/layout/item_main.xml new file mode 100644 index 0000000..9049612 --- /dev/null +++ b/gui-android/res/layout/item_main.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" android:layout_height="match_parent" + android:padding="10dp" + android:textSize="16sp" + android:onClick="serverView"> +</TextView> + diff --git a/gui-android/res/layout/server_main.xml b/gui-android/res/layout/server_main.xml new file mode 100644 index 0000000..3d592c2 --- /dev/null +++ b/gui-android/res/layout/server_main.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_height="match_parent" + android:layout_width="match_parent" + android:orientation="vertical"> + + <EditText + android:id="@+id/cpuServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="CPU" /> + <EditText + android:id="@+id/authServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Auth" /> + <EditText + android:id="@+id/userName" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Username" /> + + <EditText + android:id="@+id/passWord" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:password="true" + android:hint="Password"/> + + <Button + android:id="@+id/save" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Save" /> + + <Button + android:id="@+id/connect" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Connect" /> + + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/mipmap-hdpi/ic_launcher.png b/gui-android/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5099b530fa24f18ecb088d985011b9256cec23c3 GIT binary patch literal 14867 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%0A-!|tp?(%~dGeU(OzG<!BcfhS4 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 FV1lP!Um5@a literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-mdpi/ic_launcher.png b/gui-android/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8a70757f25145079718cbe7e8b53dda8994a752d GIT binary patch literal 11578 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xhdpi/ic_launcher.png b/gui-android/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..66e95343855f47c004d3504193f99a450d3b5ad6 GIT binary patch literal 15155 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..52aaeb67a697a95bd6f7f3d268705a3ff50fe2e9 GIT binary patch literal 20643 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 O0000<MNUMnLSTZOT>QcS literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3c0243beb4ceab4fd710fbf8179d5f92588877 GIT binary patch literal 25294 zcmV)KK)Sz)P)<h;3K|Lk000e1NJLTq006)M006)U1ONa4_|>G0001DBdQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;uavV95h5zFea|FP#9|x;h-(ZeE-$SO<s-?Tt zW>YMQVlo*K@Z~KI(4GJN$94b1f3<pZDc4qdDW3mQPu&LpX#VqGe}4y`-rw)P_5BuK z|KWA_^BcxXk<an-WgXx54_?pz{DB|$2=kAxyY~H#weN+#-}rICs5=|~*uOp`uiNMK zkiHk{=kt%!TmAJ>r+t_5edBwS@1I!TrGH*TU%OvlNR=q<%)6r5i6Q#;cl$g+{QMbu zoxgqTyf4J^UNOg~9Dgi{fc#;3KR$c^Yk>X`<RAZXe~$jofBh-=HomXNKgF_qW5hrH z_8TGpeehq1f4On|`9$`|ZyX=iUzYRzbMJ2Vp3mw=Dnzt=E6Tec(b3QF#!1NI`?11D z<xl3{^?h_cnje0VoK0m;K33?#i2ijUg&jt?;k?f)EFLl0vC3z&W%0e%Vzq87Do;rt z;aZJ7?%2rXvg2apW&8Oo;oY~t`>oKp^A5b#0v996|N6uIyKnwCAMReoHU!^(#){`M zRW6UA%;|65MMA>;<}JSf|M>W(-~UoSlqwm_FU*Yv4nIGam^u8jw&Kfk<b9dXpRNe5 z?(YQ%5%<nKOo(K_mk@I(!B?{y0"Xz=6~lT9)Za<<JwT8goltJX~S=4Wbn@3m~j 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%0A3FH@QV2 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/values/colors.xml b/gui-android/res/values/colors.xml new file mode 100644 index 0000000..b8fda67 --- /dev/null +++ b/gui-android/res/values/colors.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#3F51B5</color> + <color name="colorPrimaryDark">#303F9F</color> + <color name="colorAccent">#3FB551</color> +</resources> diff --git a/gui-android/res/values/strings.xml b/gui-android/res/values/strings.xml new file mode 100644 index 0000000..d975d5f --- /dev/null +++ b/gui-android/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Drawterm</string> +</resources> diff --git a/gui-android/res/values/styles.xml b/gui-android/res/values/styles.xml new file mode 100644 index 0000000..ccb41fa --- /dev/null +++ b/gui-android/res/values/styles.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="android:Theme.NoTitleBar"> + <!-- Customize your theme here. --> + </style> + +</resources> diff --git a/gui-fbdev/Makefile b/gui-fbdev/Makefile new file mode 100644 index 0000000..cce6ef0 --- /dev/null +++ b/gui-fbdev/Makefile @@ -0,0 +1,12 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + fbdev.$O\ + +default: $(LIB) +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + diff --git a/gui-fbdev/fbdev.c b/gui-fbdev/fbdev.c new file mode 100644 index 0000000..fa1ca2a --- /dev/null +++ b/gui-fbdev/fbdev.c @@ -0,0 +1,673 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <draw.h> +#include <memdraw.h> +#include <keyboard.h> +#include <cursor.h> +#include "screen.h" + +#undef long +#undef ulong + +#include <linux/fb.h> +#include <linux/input.h> + +uchar* fbp; +Memimage* screenimage; +Memimage* backbuf; +Rectangle screenr; +char* snarfbuf; +struct fb_fix_screeninfo finfo; +struct fb_var_screeninfo vinfo; +int *eventfds = NULL; +int neventfds; +Point mousexy; +char shift_state; +int ttyfd; +char* tty; +char hidden; +int devicesfd; +ulong chan; +int depth; + +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <limits.h> + +#include <fcntl.h> +#include <termios.h> +#include <poll.h> +#include <sys/ioctl.h> +#include <linux/keyboard.h> +#include <signal.h> + +#include <termios.h> + +#define ulong p9_ulong + +int code2key[] = { + Kesc, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\x08', + '\x09', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', + Kctl, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', Kshift, + '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +int code2key_shift[] = { + Kesc, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\x08', + '\x09', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', + Kctl, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '\"', '~', Kshift, + '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +Memimage *gscreen; +char *snarfbuf = nil; + +int onevent(struct input_event*); +void termctl(uint32_t o, int or); +void ctrlc(int sig); + +void +_fbput(Memimage *m, Rectangle r) { + int y; + + for (y = r.min.y; y < r.max.y; y++){ + long loc = y * finfo.line_length + r.min.x * depth; + void *ptr = m->data->bdata + y * m->width * 4 + r.min.x * depth; + + memcpy(fbp + loc, ptr, Dx(r) * depth); + } +} + +Memimage* +fbattach(int fbdevidx) +{ + Rectangle r; + char devname[64]; + size_t size; + int fd; + + /* + * Connect to /dev/fb0 + */ + snprintf(devname, sizeof(devname) - 1, "/dev/fb%d", fbdevidx); + if ((fd = open(devname, O_RDWR)) < 0) + goto err; + + if (ioctl(fd, FBIOGET_VSCREENINFO, &(vinfo)) < 0) + goto err; + + switch (vinfo.bits_per_pixel) { + case 32: + chan = XRGB32; + depth = 4; + break; + case 16: + chan = RGB16; + depth = 2; + break; + default: + goto err; + } + + if (ioctl(fd, FBIOGET_FSCREENINFO, &(finfo)) < 0) + goto err; + + size = vinfo.yres_virtual * finfo.line_length; + if ((fbp = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)0)) < 0) + goto err; + /* + * Figure out underlying screen format. + */ + r = Rect(0, 0, vinfo.xres_virtual, vinfo.yres_virtual); + + screenr = r; + + screenimage = allocmemimage(r, chan); + backbuf = allocmemimage(r, chan); + return backbuf; + +err: + return nil; +} + +int +eventattach() +{ + char eventfile[PATH_MAX] = ""; + char line[PATH_MAX]; + FILE *devices; + char *ptr; + + neventfds = 0; + devices = fopen("/proc/bus/input/devices", "r"); + if (devices == NULL) + return -1; + while (fgets(line, sizeof(line)-1, devices) != NULL) + if (line[0] == 'H') { + ptr = strstr(line, "event"); + if (ptr == NULL) + continue; + ptr[strcspn(ptr, " \r\n")] = '\0'; + snprintf(eventfile, sizeof(eventfile)-1, "/dev/input/%s", ptr); + neventfds++; + eventfds = realloc(eventfds, neventfds * sizeof(int)); + eventfds[neventfds-1] = open(eventfile, O_RDONLY); + if (eventfds[neventfds-1] < 0) + neventfds--; + } + fclose(devices); + + if (neventfds == 0) + return -1; + return 1; +} + +void +flushmemscreen(Rectangle r) +{ + int x, y, i; + Point p; + long fbloc; + int x2, y2; + + if (rectclip(&r, screenimage->r) == 0) + return; + if (Dx(r) == 0 || Dy(r) == 0) + return; + + assert(!canqlock(&drawlock)); + + memimagedraw(screenimage, r, backbuf, r.min, nil, r.min, S); + + if (hidden != 0) + return; + + p = mousexy; + + // draw cursor + for (x = 0; x < 16; x++) { + x2 = x + cursor.offset.x; + + if ((p.x + x2) < 0) + continue; + + if ((p.x + x2) >= screenimage->r.max.x) + break; + + for (y = 0; y < 16; y++) { + y2 = y + cursor.offset.y; + + if ((p.y + y2) < 0) + continue; + + if ((p.y + y2) >= screenimage->r.max.y) + break; + + i = y * 2 + x / 8; + fbloc = ((p.y+y2) * screenimage->r.max.x + (p.x+x2)) * depth; + + if (cursor.clr[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0xFFFF; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFFFFFFFF; + break; + } + } + + if (cursor.set[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0x0000; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFF000000; + break; + } + } + } + } + + _fbput(screenimage, r); +} + +static void +fbproc(void *v) +{ + struct input_event data; + char buf[32]; + struct pollfd *pfd; + int r; + int ioctlarg; + + pfd = calloc(3, sizeof(struct pollfd)); + pfd[0].fd = ttyfd; // for virtual console switches + pfd[0].events = POLLPRI; + pfd[1].fd = 0; // stdin goes to nowhere + pfd[1].events = POLLIN; + pfd[2].fd = open("/proc/bus/input/devices", O_RDONLY); // input hotplug + if (pfd[2].fd < 0) + panic("cannot open /proc/bus/input/devices: %r"); + pfd[2].events = POLLIN; + +TOP: + while(read(pfd[2].fd, buf, 31) > 0); + + pfd = realloc(pfd, sizeof(struct pollfd) * (neventfds + 3)); + for (r = 0; r < neventfds; r++) { + pfd[r+3].fd = eventfds[r]; + pfd[r+3].events = POLLIN; + } + + for(;;) { + shift_state = 6; + if (ioctl(0, TIOCLINUX, &shift_state) < 0) + panic("ioctl TIOCLINUX 6: %r"); + + r = poll(pfd, 3+neventfds, -1); + if (r < 0) + oserror(); + if (pfd[0].revents & POLLPRI) { + if ((r = read(ttyfd, buf, 31)) <= 0) + panic("ttyfd read: %r"); + buf[r] = '\0'; + if (strcmp(buf, tty) == 0) { + hidden = 0; + printf("\e[?25l"); + fflush(stdout); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } + else + hidden = 1; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + pfd[0].fd = ttyfd; + read(ttyfd, buf, 0); + } + if (pfd[1].revents & POLLIN) + read(pfd[1].fd, buf, 31); + if (pfd[2].revents & POLLIN) { + for (r = 0; r < neventfds; r++) + close(eventfds[r]); + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + goto TOP; + } + for (r = 0; r < neventfds; r++) + if (pfd[r+3].revents & POLLIN) { + if (read(pfd[r+3].fd, &data, sizeof(data)) != sizeof(data)) + panic("eventfd read: %r"); + if (onevent(&data) == 0) { + ioctlarg = 15; + if (ioctl(0, TIOCLINUX, &ioctlarg) != 0) { + ioctlarg = 4; + ioctl(0, TIOCLINUX, &ioctlarg); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } else { + write(1, "\033[9;30]", 7); + } + } + } + } + + printf("\e[?25h"); + fflush(stdout); + termctl(ECHO, 1); + free(pfd); +} + +void +screensize(Rectangle r, ulong chan) +{ + gscreen = backbuf; + gscreen->clipr = ZR; +} + +void +screeninit(void) +{ + int r; + char buf[1]; + + // set up terminal + printf("\e[?25l"); + fflush(stdout); + termctl(~(ICANON|ECHO), 0); + signal(SIGINT, ctrlc); + + memimageinit(); + + // tty switching + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd >= 0) { + tty = malloc(32); + r = read(ttyfd, tty, 31); + if (r >= 0) + tty[r] = '\0'; + else + tty[0] = '\0'; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + } + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + read(ttyfd, buf, 0); + hidden = 0; + + if(fbattach(0) == nil) { + panic("cannot open framebuffer: %r"); + } + + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + + screensize(screenr, chan); + if (gscreen == nil) + panic("screensize failed"); + + gscreen->clipr = screenr; + kproc("fbdev", fbproc, nil); + + terminit(); + + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); +} + +Memdata* +attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen) +{ + *r = gscreen->clipr; + *chan = gscreen->chan; + *depth = gscreen->depth; + *width = gscreen->width; + *softscreen = 1; + + gscreen->data->ref++; + return gscreen->data; +} + +void +getcolor(ulong i, ulong *r, ulong *g, ulong *b) +{ + ulong v; + + v = cmap2rgb(i); + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + /* no-op */ + return; +} + +char* +clipread(void) +{ + if(snarfbuf) + return strdup(snarfbuf); + return nil; +} + +int +clipwrite(char *buf) +{ + if(snarfbuf) + free(snarfbuf); + snarfbuf = strdup(buf); + return 0; +} + +void +guimain(void) +{ + cpubody(); +} + +void +termctl(uint32_t o, int or) +{ + struct termios t; + + tcgetattr(0, &t); + if (or) + t.c_lflag |= o; + else + t.c_lflag &= o; + tcsetattr(0, TCSANOW, &t); +} + +void +ctrlc(int sig) { +} + +int +onevent(struct input_event *data) +{ + Rectangle old, new; + ulong msec; + static int buttons; + static Point coord; + static char touched; + static Point startmousept; + static Point startpt; + int key; + static ulong lastmsec = 0; + + if (hidden != 0) + return -1; + + msec = ticks(); + + old.min = mousexy; + old.max = addpt(old.min, Pt(16, 16)); + + buttons &= ~0x18; + + switch(data->type) { + case 3: + switch(data->code) { + case 0: + coord.x = data->value; + break; + case 1: + coord.y = data->value; + break; + case 0x18: + case 0x1c: + if (data->value == 0) + touched = 0; + else if (data->value > 24) { + touched = 1; + startmousept = coord; + startpt = mousexy; + } + break; + default: + return -1; + } + if (touched) + mousexy = addpt(startpt, divpt(subpt(coord, startmousept), 4)); + break; + case 2: + switch(data->code) { + case 0: + mousexy.x += data->value; + break; + case 1: + mousexy.y += data->value; + break; + case 8: + buttons |= data->value == 1? 8: 16; + break; + default: + return -1; + } + break; + case 1: + switch(data->code) { + case 0x110: + if (data->value == 1) + buttons |= 1; + else + buttons &= ~1; + break; + case 0x111: + if (data->value == 1) + buttons |= shift_state & (1 << KG_SHIFT)? 2: 4; + else + buttons &= ~(shift_state & (1 << KG_SHIFT)? 2: 4); + break; + case 0x112: + if (data->value == 1) + buttons |= 2; + else + buttons &= ~2; + break; + default: + if (hidden) + return 0; + if (data->code > 0 && data->code <= nelem(code2key)) { + if (shift_state & (1 << KG_SHIFT)) + key = code2key_shift[data->code-1]; + else + key = code2key[data->code-1]; + if (key == Kshift) + return -1; + kbdkey(key, data->value); + return 0; + } + switch(data->code) { + case 87: + kbdkey(KF|11, data->value); + break; + case 88: + kbdkey(KF|12, data->value); + break; + case 96: + kbdkey('\n', data->value); + break; + case 97: + kbdkey(Kctl, data->value); + break; + case 98: + kbdkey('/', data->value); + break; + case 100: + kbdkey(Kalt, data->value); + break; + case 102: + kbdkey(Khome, data->value); + break; + case 103: + kbdkey(Kup, data->value); + break; + case 104: + kbdkey(Kpgup, data->value); + break; + case 105: + kbdkey(Kleft, data->value); + break; + case 106: + kbdkey(Kright, data->value); + break; + case 107: + kbdkey(Kend, data->value); + break; + case 108: + kbdkey(Kdown, data->value); + break; + case 109: + kbdkey(Kpgdown, data->value); + break; + case 110: + kbdkey(Kins, data->value); + break; + case 111: + kbdkey(Kdel, data->value); + break; + } + return 0; + } + break; + default: + return -1; + } + + if (mousexy.x < screenimage->r.min.x) + mousexy.x = screenimage->r.min.x; + if (mousexy.y < screenimage->r.min.y) + mousexy.y = screenimage->r.min.y; + if (mousexy.x > screenimage->r.max.x) + mousexy.x = screenimage->r.max.x; + if (mousexy.y > screenimage->r.max.y) + mousexy.y = screenimage->r.max.y; + + new.min = mousexy; + new.max = addpt(new.min, Pt(16, 16)); // size of cursor bitmap + + combinerect(&new, old); + new.min = subpt(new.min, Pt(16, 16)); // to encompass any cursor->offset + + qlock(&drawlock); + flushmemscreen(new); + qunlock(&drawlock); + + if ((msec - lastmsec) < 10) + if (data->type != 1) + return 0; + + lastmsec = msec; + + absmousetrack(mousexy.x, mousexy.y, buttons, msec); + + return 0; +} + +void +mouseset(Point p) +{ + qlock(&drawlock); + mousexy = p; + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +setcursor(void) +{ + qlock(&drawlock); + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +titlewrite(char* buf) +{ +} + diff --git a/kern/devaudio-alsa.c b/kern/devaudio-alsa.c new file mode 100644 index 0000000..30dfd60 --- /dev/null +++ b/kern/devaudio-alsa.c @@ -0,0 +1,108 @@ +/* + * ALSA + */ +#include <alsa/asoundlib.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include "devaudio.h" + +enum +{ + Channels = 2, + Rate = 44100, + Bits = 16, +}; + +static snd_pcm_t *playback; +static snd_pcm_t *capture; +static int speed = Rate; + +/* maybe this should return -1 instead of sysfatal */ +void +audiodevopen(void) +{ + if(snd_pcm_open(&playback, "default", SND_PCM_STREAM_PLAYBACK, 0) < 0) + error("snd_pcm_open playback"); + + if(snd_pcm_set_params(playback, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params playback"); + + if(snd_pcm_prepare(playback) < 0) + error("snd_pcm_prepare playback"); + + if(snd_pcm_open(&capture, "default", SND_PCM_STREAM_CAPTURE, 0) < 0) + error("snd_pcm_open capture"); + + if(snd_pcm_set_params(capture, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params capture"); + + if(snd_pcm_prepare(capture) < 0) + error("snd_pcm_prepare capture"); +} + +void +audiodevclose(void) +{ + snd_pcm_drain(playback); + snd_pcm_close(playback); + + snd_pcm_close(capture); +} + +void +audiodevsetvol(int what, int left, int right) +{ + if(what == Vspeed){ + speed = left; + return; + } +} + +void +audiodevgetvol(int what, int *left, int *right) +{ + if(what == Vspeed){ + *left = *right = speed; + return; + } + + *left = *right = 100; +} + +int +audiodevwrite(void *v, int n) +{ + snd_pcm_sframes_t frames; + int tot, m; + + for(tot = 0; tot < n; tot += m){ + do { + frames = snd_pcm_writei(playback, v+tot, (n-tot)/4); + } while(frames == -EAGAIN); + if (frames < 0) + frames = snd_pcm_recover(playback, frames, 0); + if (frames < 0) + error((char*)snd_strerror(frames)); + m = frames*4; + } + + return tot; +} + +int +audiodevread(void *v, int n) +{ + snd_pcm_sframes_t frames; + + do { + frames = snd_pcm_readi(capture, v, n/4); + } while(frames == -EAGAIN); + + if (frames < 0) + error((char*)snd_strerror(frames)); + + return frames*4; +} diff --git a/libc/getpid.c b/libc/getpid.c new file mode 100644 index 0000000..9a9c86c --- /dev/null +++ b/libc/getpid.c @@ -0,0 +1,17 @@ +#include <u.h> +#include <libc.h> + +int +getpid(void) +{ + char b[20]; + int f; + + memset(b, 0, sizeof(b)); + f = open("#c/pid", 0); + if(f >= 0) { + read(f, b, sizeof(b)); + close(f); + } + return atol(b); +} diff --git a/main.c b/main.c index 0d74b2e..e66c81a 100644 --- a/main.c +++ b/main.c @@ -54,6 +54,7 @@ main(int argc, char **argv) if(bind("#U", "/root", MREPL) < 0) panic("bind #U: %r"); bind("#A", "/dev", MAFTER); + bind("#N", "/dev", MAFTER); bind("#C", "/", MAFTER); if(open("/dev/cons", OREAD) != 0) -- 2.20.1
no, it still contains pointless addition of libc/getpid.c. -- cinap
[-- Attachment #1: Type: text/plain, Size: 427 bytes --] @cinap, indeed, getpid does nothing I've removed it from the patch thanks, izaki ________________________________________ From: cinap_lenrek@felloff.net <cinap_lenrek@felloff.net> Sent: Wednesday, August 18, 2021 6:16 AM To: 9front@9front.org Subject: Re: [9front] [patch] Merging echoline's drawterm forks (fbdev and android) into drawterm no, it still contains pointless addition of libc/getpid.c. -- cinap [-- Attachment #2: 0001-Merging-echoline-s-android-and-fbdev-forks.patch --] [-- Type: application/octet-stream, Size: 229143 bytes --] From 680af8207235dbeda95df00887fc64eae97a980c Mon Sep 17 00:00:00 2001 From: Lorenzo Bivens <git@lorenzobivens.info> Date: Fri, 13 Aug 2021 20:39:50 -0700 Subject: [PATCH] Merging echoline's android and fbdev forks --- Make.android | 38 + Make.android-386 | 26 + Make.android-amd64 | 26 + Make.android-arm | 26 + Make.android-arm64 | 26 + Make.fbdev | 22 + README | 11 + gui-android/AndroidManifest.xml | 30 + gui-android/Makefile | 23 + gui-android/cpp/android.c | 230 ++++++ gui-android/cpp/devandroid.c | 248 +++++++ gui-android/cpp/native-lib.c | 173 +++++ .../org/echoline/drawterm/DrawTermThread.java | 32 + .../org/echoline/drawterm/MainActivity.java | 437 ++++++++++++ .../org/echoline/drawterm/MySurfaceView.java | 91 +++ gui-android/res/drawable-hdpi/ic_small.png | Bin 0 -> 5361 bytes gui-android/res/drawable-mdpi/ic_small.png | Bin 0 -> 3173 bytes gui-android/res/drawable-xhdpi/ic_small.png | Bin 0 -> 5181 bytes gui-android/res/drawable-xxhdpi/ic_small.png | Bin 0 -> 8529 bytes gui-android/res/drawable-xxxhdpi/ic_small.png | Bin 0 -> 10972 bytes gui-android/res/layout/activity_main.xml | 24 + gui-android/res/layout/content_main.xml | 16 + gui-android/res/layout/drawterm_main.xml | 44 ++ gui-android/res/layout/item_main.xml | 8 + gui-android/res/layout/server_main.xml | 56 ++ gui-android/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 14867 bytes gui-android/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 11578 bytes gui-android/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 15155 bytes gui-android/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 20643 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 25294 bytes gui-android/res/values/colors.xml | 6 + gui-android/res/values/strings.xml | 3 + gui-android/res/values/styles.xml | 8 + gui-fbdev/Makefile | 12 + gui-fbdev/fbdev.c | 673 ++++++++++++++++++ kern/devaudio-alsa.c | 108 +++ main.c | 1 + 37 files changed, 2398 insertions(+) create mode 100644 Make.android create mode 100644 Make.android-386 create mode 100644 Make.android-amd64 create mode 100644 Make.android-arm create mode 100644 Make.android-arm64 create mode 100644 Make.fbdev create mode 100644 gui-android/AndroidManifest.xml create mode 100644 gui-android/Makefile create mode 100644 gui-android/cpp/android.c create mode 100644 gui-android/cpp/devandroid.c create mode 100644 gui-android/cpp/native-lib.c create mode 100644 gui-android/java/org/echoline/drawterm/DrawTermThread.java create mode 100644 gui-android/java/org/echoline/drawterm/MainActivity.java create mode 100644 gui-android/java/org/echoline/drawterm/MySurfaceView.java create mode 100644 gui-android/res/drawable-hdpi/ic_small.png create mode 100644 gui-android/res/drawable-mdpi/ic_small.png create mode 100644 gui-android/res/drawable-xhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxhdpi/ic_small.png create mode 100644 gui-android/res/drawable-xxxhdpi/ic_small.png create mode 100644 gui-android/res/layout/activity_main.xml create mode 100644 gui-android/res/layout/content_main.xml create mode 100644 gui-android/res/layout/drawterm_main.xml create mode 100644 gui-android/res/layout/item_main.xml create mode 100644 gui-android/res/layout/server_main.xml create mode 100644 gui-android/res/mipmap-hdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-mdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 gui-android/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 gui-android/res/values/colors.xml create mode 100644 gui-android/res/values/strings.xml create mode 100644 gui-android/res/values/styles.xml create mode 100644 gui-fbdev/Makefile create mode 100644 gui-fbdev/fbdev.c create mode 100644 kern/devaudio-alsa.c diff --git a/Make.android b/Make.android new file mode 100644 index 0000000..00eaf68 --- /dev/null +++ b/Make.android @@ -0,0 +1,38 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +JAVA_HOME=/usr +OBJS=lib/arm64-v8a/libdrawterm.so lib/armeabi-v7a/libdrawterm.so lib/x86/libdrawterm.so lib/x86_64/libdrawterm.so + +all: drawterm.apk + +clean: + rm -f *.apk lib/*/*.so + +lib/arm64-v8a/libdrawterm.so: + CONF=android-arm64 make -j5; + CONF=android-arm64 make clean; + +lib/armeabi-v7a/libdrawterm.so: + CONF=android-arm make -j5; + CONF=android-arm make clean; + +lib/x86/libdrawterm.so: + CONF=android-386 make -j5; + CONF=android-386 make clean; + +lib/x86_64/libdrawterm.so: + CONF=android-amd64 make -j5; + CONF=android-amd64 make clean; + +drawterm.apk: drawterm-signed.apk + $(SDKPREFIX)/build-tools/30.0.3/zipalign -v -f 4 $< $@ + +drawterm-signed.apk: drawterm-unsigned.apk drawterm.keystore + $(JAVA_HOME)/bin/jarsigner -verbose -keystore ./drawterm.keystore -storepass glendarocks -keypass glendarocks -signedjar $@ $< drawtermKey + +drawterm-unsigned.apk: $(OBJS) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -v -f -M gui-android/AndroidManifest.xml -S gui-android/res -I $(SDKPREFIX)/platforms/android-21/android.jar -F $@ gui-android/bin + $(SDKPREFIX)/build-tools/30.0.3/aapt add $@ $(OBJS) + +drawterm.keystore: + $(JAVA_HOME)/bin/keytool -genkeypair -validity 1000 -dname "CN=9front,O=Android,C=US" -keystore $@ -storepass glendarocks -keypass glendarocks -alias drawtermKey -keyalg RSA -v diff --git a/Make.android-386 b/Make.android-386 new file mode 100644 index 0000000..ff43cf6 --- /dev/null +++ b/Make.android-386 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/i686-linux-android-ar +AS=$(NDKPREFIX)/i686-linux-android-as +RANLIB=$(NDKPREFIX)/i686-linux-android-ranlib +STRIP=$(NDKPREFIX)/i686-linux-android-strip +CC=$(NDKPREFIX)/i686-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=386; \ + (cd posix-$$arch && make) + diff --git a/Make.android-amd64 b/Make.android-amd64 new file mode 100644 index 0000000..3f5cf46 --- /dev/null +++ b/Make.android-amd64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/x86_64-linux-android-ar +AS=$(NDKPREFIX)/x86_64-linux-android-as +RANLIB=$(NDKPREFIX)/x86_64-linux-android-ranlib +STRIP=$(NDKPREFIX)/x86_64-linux-android-strip +CC=$(NDKPREFIX)/x86_64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/x86_64/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=amd64; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm b/Make.android-arm new file mode 100644 index 0000000..862d81d --- /dev/null +++ b/Make.android-arm @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/arm-linux-androideabi-ar +AS=$(NDKPREFIX)/arm-linux-androideabi-as +RANLIB=$(NDKPREFIX)/arm-linux-androideabi-ranlib +STRIP=$(NDKPREFIX)/arm-linux-androideabi-strip +CC=$(NDKPREFIX)/armv7a-linux-androideabi21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/armeabi-v7a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm; \ + (cd posix-$$arch && make) + diff --git a/Make.android-arm64 b/Make.android-arm64 new file mode 100644 index 0000000..5ceab39 --- /dev/null +++ b/Make.android-arm64 @@ -0,0 +1,26 @@ +# Android +SDKPREFIX=$(HOME)/Android/Sdk +NDKPREFIX=$(SDKPREFIX)/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin +JAVA_HOME=/usr + +PTHREAD=-pthread +AR=$(NDKPREFIX)/aarch64-linux-android-ar +AS=$(NDKPREFIX)/aarch64-linux-android-as +RANLIB=$(NDKPREFIX)/aarch64-linux-android-ranlib +STRIP=$(NDKPREFIX)/aarch64-linux-android-strip +CC=$(NDKPREFIX)/aarch64-linux-android21-clang +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -Dmain=dt_main -fPIC +O=o +OS=posix +GUI=android +LDADD=-ggdb -lm -shared -llog -landroid +LDFLAGS=$(PTHREAD) +TARG=lib/arm64-v8a/libdrawterm.so +AUDIO=none + +all: default + +libmachdep.a: + arch=arm64; \ + (cd posix-$$arch && make) + diff --git a/Make.fbdev b/Make.fbdev new file mode 100644 index 0000000..ed8e1b0 --- /dev/null +++ b/Make.fbdev @@ -0,0 +1,22 @@ +# Unix +#PTHREAD= # for Mac +PTHREAD=-pthread +AR=ar +AS=as +RANLIB=ranlib +CC=gcc +CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -D_THREAD_SAFE $(PTHREAD) -O2 +O=o +OS=posix +GUI=fbdev +LDADD=-ggdb -lm -lasound +LDFLAGS=$(PTHREAD) +TARG=drawterm +# AUDIO=none +AUDIO=alsa + +all: default + +libmachdep.a: + arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/; s/x86_64/amd64/; s/armv[567].*/arm/; s/aarch64/arm64/'`; \ + (cd posix-$$arch && make) diff --git a/README b/README index 2599800..749273f 100644 --- a/README +++ b/README @@ -18,6 +18,17 @@ To build on Mac OS X with X11 (xquartz), run CONF=osx-x11 make. To build on Mac OS X with Cocoa, run CONF=osx-cocoa make and "cp drawterm gui-cocoa/drawterm.app/". +To build for Android, make sure Make.android* and gui-android/Makefile are correct for your build and target systems, then run make -f Make.android + +USAGE +------- +On Android the five checkboxes at the top represent the three mouse buttons and mousewheel, determining which "buttons" are clicked. The "kb" button toggles the soft keyboard. + + +CAVEATS +-------- +Be aware that right now on Android the login details are saved as a plaintext string if saved, and there is no secstore support. + BINARIES --------- diff --git a/gui-android/AndroidManifest.xml b/gui-android/AndroidManifest.xml new file mode 100644 index 0000000..97be515 --- /dev/null +++ b/gui-android/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.echoline.drawterm"> + + <supports-screens android:largeScreens="true" + android:normalScreens="true" android:smallScreens="true" + android:anyDensity="true" /> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + <activity + android:name=".MainActivity" + android:label="@string/app_name" + android:windowSoftInputMode="stateUnchanged|adjustNothing"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + <uses-permission android:name="android.permission.INTERNET"/> + <!--<uses-permission android:name="android.permission.SET_DEBUG_APP"/>--> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.CAMERA"/> +</manifest> diff --git a/gui-android/Makefile b/gui-android/Makefile new file mode 100644 index 0000000..04df778 --- /dev/null +++ b/gui-android/Makefile @@ -0,0 +1,23 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + cpp/android.$O\ + cpp/native-lib.$O\ + cpp/devandroid.$O\ + +default: $(LIB) gen/org/echoline/drawterm/R.java bin/classes.dex +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + +gen/org/echoline/drawterm/R.java: $(shell find res/ -type f) + $(SDKPREFIX)/build-tools/30.0.3/aapt package -f -m -M AndroidManifest.xml -I $(SDKPREFIX)/platforms/android-21/android.jar -S res/ -J gen + +bin/classes.dex: obj/org/echoline/drawterm/MainActivity.class obj/org/echoline/drawterm/DrawTermThread.class obj/org/echoline/drawterm/MySurfaceView.class + $(SDKPREFIX)/build-tools/30.0.3/dx --dex --verbose --output=$@ obj/ + +obj/org/echoline/drawterm/%.class: java/org/echoline/drawterm/%.java + $(JAVA_HOME)/bin/javac -d obj/ -classpath $(SDKPREFIX)/platforms/android-21/android.jar -sourcepath java java/org/echoline/drawterm/$*.java gen/org/echoline/drawterm/R.java + diff --git a/gui-android/cpp/android.c b/gui-android/cpp/android.c new file mode 100644 index 0000000..e6a2e0f --- /dev/null +++ b/gui-android/cpp/android.c @@ -0,0 +1,230 @@ +#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; +} + +int +clipwrite(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; +} + +void +show_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; +} + +int +num_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; +} + +void +take_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; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + return; +} + +void +getcolor(ulong v, ulong *r, ulong *g, ulong *b) +{ + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +flushmemscreen(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; +} + +void +screeninit(void) +{ + Rectangle r = Rect(0,0,screenWidth,screenHeight); + memimageinit(); + screensize(r, XRGB32); + if (gscreen == nil) + panic("screensize failed"); + gscreen->clipr = r; + terminit(); + qlock(&drawlock); + flushmemscreen(r); + qunlock(&drawlock); + return; +} + +void +screensize(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; +} + +void +setcursor(void) +{ + return; +} + +void +mouseset(Point xy) +{ + return; +} + +void +guimain(void) +{ + cpubody(); +} + diff --git a/gui-android/cpp/devandroid.c b/gui-android/cpp/devandroid.c new file mode 100644 index 0000000..daf2f57 --- /dev/null +++ b/gui-android/cpp/devandroid.c @@ -0,0 +1,248 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <android/log.h> +#include <android/sensor.h> + +void show_notification(char *buf); +void take_picture(int id); +int num_cameras(); + +int Ncameras = 0; + +uchar *cambuf = nil; +int camlen; + +ASensorManager *sensorManager = NULL; + +enum +{ + Qdir = 0, + Qcam = 1, + Qaccel = 2, + Qcompass = 4, + Qnotification = 6, +}; +#define QID(p, c, y) (((p)<<16) | ((c)<<4) | (y)) + +static void androidinit(void); + +static void +androidinit(void) +{ + sensorManager = ASensorManager_getInstance(); + + Ncameras = num_cameras(); +} + +static Chan* +androidattach(char *param) +{ + Chan *c; + + c = devattach('N', param); + c->qid.path = QID(0, 0, Qdir); + c->qid.type = QTDIR; + c->qid.vers = 0; + + return c; +} + +static int +androidgen(Chan *c, char *n, Dirtab *d, int nd, int s, Dir *dp) +{ + Qid q; + + if (s == DEVDOTDOT) { + mkqid(&q, Qdir, 0, QTDIR); + devdir(c, q, "#N", 0, eve, 0555, dp); + return 1; + } + if (s < Ncameras) { + sprintf(up->genbuf, "cam%d.jpg", s); + mkqid(&q, (s << 16) | Qcam, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == Ncameras) { + sprintf(up->genbuf, "accel"); + mkqid(&q, Qaccel, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+1)) { + sprintf(up->genbuf, "compass"); + mkqid(&q, Qcompass, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); + return 1; + } + if (s == (Ncameras+2)) { + sprintf(up->genbuf, "notification"); + mkqid(&q, Qnotification, 0, QTFILE); + devdir(c, q, up->genbuf, 0, eve, 0222, dp); + return 1; + } + return -1; +} + +static Walkqid* +androidwalk(Chan *c, Chan *nc, char **name, int nname) +{ + return devwalk(c, nc, name, nname, 0, 0, androidgen); +} + +static int +androidstat(Chan *c, uchar *db, int n) +{ + return devstat(c, db, n, 0, 0, androidgen); +} + +static Chan* +androidopen(Chan *c, int omode) +{ + p9_uvlong s; + + c = devopen(c, omode, 0, 0, androidgen); + + if (c->qid.path & Qcam) { + s = c->qid.path >> 16; + take_picture(s); + } + c->mode = openmode(omode); + c->flag |= COPEN; + c->offset = 0; + c->iounit = 8192; + + return c; +} + +static void +androidclose(Chan *c) +{ + if (c->qid.path & Qcam && cambuf != nil) { + free(cambuf); + cambuf = nil; + } +} + +static long +androidread(Chan *c, void *v, long n, vlong off) +{ + char *a = v; + long l; + const ASensor *sensor; + ASensorEventQueue *queue = NULL; + ASensorEvent data; + + switch((ulong)c->qid.path & 0xF) { + default: + error(Eperm); + return -1; + + case Qcam: + while(cambuf == nil) + usleep(10 * 1000); + + l = camlen - off; + if (l > n) + l = n; + + if (l > 0) + memcpy(a, cambuf + off, l); + + return l; + case Qaccel: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qcompass: + queue = ASensorManager_createEventQueue(sensorManager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), 1, NULL, NULL); + if (queue == NULL) + return 0; + sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_MAGNETIC_FIELD); + if (sensor == NULL) { + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + if (ASensorEventQueue_enableSensor(queue, sensor)) { + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return 0; + } + l = 0; + if (ALooper_pollAll(1000, NULL, NULL, NULL) == 1) { + if (ASensorEventQueue_getEvents(queue, &data, 1)) { + l = snprint(a, n, "%11f %11f %11f\n", data.vector.x, data.vector.y, data.vector.z); + } + } + ASensorEventQueue_disableSensor(queue, sensor); + ASensorManager_destroyEventQueue(sensorManager, queue); + return l; + case Qdir: + return devdirread(c, a, n, 0, 0, androidgen); + } +} + +static long +androidwrite(Chan *c, void *vp, long n, vlong off) +{ + char *a = vp; + char *str; + + switch((ulong)c->qid.path) { + case Qnotification: + str = malloc(n+1); + memcpy(str, a, n); + str[n] = '\0'; + show_notification(str); + free(str); + return n; + default: + error(Eperm); + break; + } + return -1; +} + +Dev androiddevtab = { + 'N', + "android", + + devreset, + androidinit, + devshutdown, + androidattach, + androidwalk, + androidstat, + androidopen, + devcreate, + androidclose, + androidread, + devbread, + androidwrite, + devbwrite, + devremove, + devwstat, +}; diff --git a/gui-android/cpp/native-lib.c b/gui-android/cpp/native-lib.c new file mode 100644 index 0000000..1e768b3 --- /dev/null +++ b/gui-android/cpp/native-lib.c @@ -0,0 +1,173 @@ +#include <jni.h> +#include <android/native_window.h> +#include <android/native_window_jni.h> +#include <android/log.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include <draw.h> +#include <string.h> +#include <keyboard.h> + +void absmousetrack(int, int, int, ulong); +ulong ticks(void); +int dt_main(int, char**); +int screenWidth; +int screenHeight; +Point mousept = {0, 0}; +int buttons = 0; +float ws = 1; +float hs = 1; +extern char *snarfbuf; +int mPaused = 0; +ANativeWindow *window = NULL; +jobject mainActivityObj; +JavaVM *jvm; +void flushmemscreen(Rectangle r); +extern uchar *cambuf; +extern int camlen; + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setObject( + JNIEnv *env, + jobject obj) { + mainActivityObj = (*env)->NewGlobalRef(env, obj); + jint rs = (*env)->GetJavaVM(env, &jvm); + assert(rs == JNI_OK); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyDown( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_keyUp( + JNIEnv *env, + jobject obj, + jint c) { + kbdkey(c, 0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setPass( + JNIEnv *env, + jobject obj, + jstring str) { + setenv("PASS", (char*)(*env)->GetStringUTFChars(env, str, 0), 1); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidth( + JNIEnv *env, + jobject obj, + jint width) { + screenWidth = width; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeight( + JNIEnv *env, + jobject obj, + jint height) { + screenHeight = height; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setWidthScale( + JNIEnv *env, + jobject obj, + jfloat s) { + ws = s; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setHeightScale( + JNIEnv *env, + jobject obj, + jfloat s) { + hs = s; +} + +JNIEXPORT jint JNICALL +Java_org_echoline_drawterm_MainActivity_dtmain( + JNIEnv *env, + jobject obj, + jobjectArray argv) { + int i, ret; + char **args = (char **) malloc(((*env)->GetArrayLength(env, argv)+1) * sizeof(char *)); + + for (i = 0; i < (*env)->GetArrayLength(env, argv); i++) { + jobject str = (jobject) (*env)->GetObjectArrayElement(env, argv, i); + args[i] = strdup((char*)(*env)->GetStringUTFChars(env, (jstring)str, 0)); + } + args[(*env)->GetArrayLength(env, argv)] = NULL; + + ret = dt_main(i, args); + + for (i = 0; args[i] != NULL; i++) { + free(args[i]); + } + free(args); + + return ret; +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setMouse( + JNIEnv *env, + jobject obj, + jintArray args) { + jboolean isCopy; + jint *data; + if ((*env)->GetArrayLength(env, args) < 3) + return; + data = (*env)->GetIntArrayElements(env, args, &isCopy); + mousept.x = (int)(data[0] / ws); + mousept.y = (int)(data[1] / hs); + buttons = data[2]; + (*env)->ReleaseIntArrayElements(env, args, data, 0); + absmousetrack(mousept.x, mousept.y, buttons, ticks()); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_setDTSurface( + JNIEnv* jenv, + jobject obj, + jobject surface) { + if (surface != NULL) { + window = ANativeWindow_fromSurface(jenv, surface); + ANativeWindow_setBuffersGeometry(window, screenWidth, screenHeight, + AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM); + flushmemscreen(Rect(0, 0, screenWidth, screenHeight)); + } else if (window != NULL) { + ANativeWindow_release(window); + window = NULL; + } +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_exitDT( + JNIEnv* jenv, + jobject obj) { + exit(0); +} + +JNIEXPORT void JNICALL +Java_org_echoline_drawterm_MainActivity_sendPicture( + JNIEnv* env, + jobject obj, + jbyteArray array) { + jint len = (*env)->GetArrayLength(env, array); + jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL); + camlen = len; + cambuf = malloc(camlen); + memcpy(cambuf, bytes, camlen); + (*env)->ReleaseByteArrayElements(env, array, bytes, 0); +} + diff --git a/gui-android/java/org/echoline/drawterm/DrawTermThread.java b/gui-android/java/org/echoline/drawterm/DrawTermThread.java new file mode 100644 index 0000000..52baae8 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/DrawTermThread.java @@ -0,0 +1,32 @@ +package org.echoline.drawterm; + +/** + * Created by eli on 12/4/17. + */ + +public class DrawTermThread extends Thread { + private MainActivity m; + private String p; + private String []args; + + public DrawTermThread(String []args, String p, MainActivity m) { + this.m = m; + this.p = p; + this.args = args; + } + + @Override + public void run() { + if (p != null && !p.equals("")) + m.setPass(p); + m.dtmain(args); + m.runOnUiThread(new Runnable() { + @Override + public void run() { + m.exitDT(); + m.setContentView(R.layout.server_main); + m.populateServers(m); + } + }); + } +} diff --git a/gui-android/java/org/echoline/drawterm/MainActivity.java b/gui-android/java/org/echoline/drawterm/MainActivity.java new file mode 100644 index 0000000..2e9b852 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MainActivity.java @@ -0,0 +1,437 @@ +package org.echoline.drawterm; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.Point; +import android.os.Bundle; +import android.os.Environment; + +import android.app.Activity; + +import android.app.Notification; +import android.app.NotificationManager; + +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.MotionEvent; +import android.view.View; +import android.view.Menu; +import android.view.MenuItem; +import android.view.WindowManager; +import android.view.Surface; +import android.view.inputmethod.InputMethodManager; +import android.view.KeyEvent; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.TotalCaptureResult; +import android.media.Image; +import android.media.ImageReader; +import android.graphics.ImageFormat; +import android.os.Handler; +import android.os.HandlerThread; + +import java.io.File; +import java.util.Map; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.ArrayList; + +public class MainActivity extends Activity { + private Map<String, ?> map; + private MainActivity mainActivity; + private boolean dtrunning = false; + private DrawTermThread dthread; + private int notificationId; + private CameraDevice cameraDevice = null; + private byte []jpegBytes; + + static { + System.loadLibrary("drawterm"); + } + + public void showNotification(String text) { + Notification.Builder builder = new Notification.Builder(this) + .setDefaults(Notification.DEFAULT_SOUND) + .setSmallIcon(R.drawable.ic_small) + .setContentText(text) + .setStyle(new Notification.BigTextStyle().bigText(text)) + .setPriority(Notification.PRIORITY_DEFAULT); + + ((NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE)).notify(notificationId, builder.build()); + notificationId++; + } + + public int numCameras() { + try { + return ((CameraManager)getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length; + } catch (CameraAccessException e) { + Log.w("drawterm", e.toString()); + return 0; + } + } + + public void takePicture(int id) { + try { + HandlerThread mBackgroundThread = new HandlerThread("Camera Background"); + mBackgroundThread.start(); + Handler mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); + CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); + String []cameraIdList = manager.getCameraIdList(); + manager.openCamera(cameraIdList[id], new CameraDevice.StateCallback() { + public void onOpened(CameraDevice device) { + cameraDevice = device; + } + public void onDisconnected(CameraDevice device) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + public void onError(CameraDevice device, int error) { + if (cameraDevice != null) + cameraDevice.close(); + cameraDevice = null; + } + }, mBackgroundHandler); + ImageReader reader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1); + CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG); + captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO); + captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); + captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getWindowManager().getDefaultDisplay().getRotation()); + captureBuilder.addTarget(reader.getSurface()); + reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { + public void onImageAvailable(ImageReader reader) { + Image image = null; + try { + image = reader.acquireLatestImage(); + ByteBuffer buffer = image.getPlanes()[0].getBuffer(); + jpegBytes = new byte[buffer.capacity()]; + buffer.get(jpegBytes); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } finally { + if (image != null) { + image.close(); + } + } + } + }, mBackgroundHandler); + List<Surface> outputSurfaces = new ArrayList<Surface>(1); + outputSurfaces.add(reader.getSurface()); + cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { + public void onConfigured(CameraCaptureSession session) { + try { + List<CaptureRequest> captureRequests = new ArrayList<CaptureRequest>(10); + for (int i = 0; i < 10; i++) + captureRequests.add(captureBuilder.build()); + session.captureBurst(captureRequests, new CameraCaptureSession.CaptureCallback() { + public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) { + try { + sendPicture(jpegBytes); + mBackgroundThread.quitSafely(); + mBackgroundThread.join(); + } catch (Exception e) { + Log.w("drawterm", e.toString()); + } + } + }, mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + public void onConfigureFailed(CameraCaptureSession session) { + } + }, mBackgroundHandler); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void serverView(View v) { + setContentView(R.layout.server_main); + serverButtons(); + + String s = (String)map.get(((TextView)v).getText().toString()); + String []a = s.split("\007"); + + ((EditText)findViewById(R.id.cpuServer)).setText((String)a[0]); + ((EditText)findViewById(R.id.authServer)).setText((String)a[1]); + ((EditText)findViewById(R.id.userName)).setText((String)a[2]); + if (a.length > 3) + ((EditText)findViewById(R.id.passWord)).setText((String)a[3]); + } + + public void populateServers(Context context) { + ListView ll = (ListView)findViewById(R.id.servers); + ArrayAdapter<String> la = new ArrayAdapter<String>(this, R.layout.item_main); + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + map = (Map<String, ?>)settings.getAll(); + String key; + Object []keys = map.keySet().toArray(); + for (int i = 0; i < keys.length; i++) { + key = (String)keys[i]; + la.add(key); + } + ll.setAdapter(la); + + setDTSurface(null); + dtrunning = false; + } + + public void runDrawterm(String []args, String pass) { + Resources res = getResources(); + DisplayMetrics dm = res.getDisplayMetrics(); + + int wp = dm.widthPixels; + int hp = dm.heightPixels; + + setContentView(R.layout.drawterm_main); + + Button kbutton = (Button)findViewById(R.id.keyboardToggle); + kbutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); + } + }); + + int rid = res.getIdentifier("navigation_bar_height", "dimen", "android"); + if (rid > 0) { + hp -= res.getDimensionPixelSize(rid); + } + LinearLayout ll = (LinearLayout)findViewById(R.id.dtButtons); + hp -= ll.getHeight(); + + int w = (int)(wp * (160.0/dm.xdpi)); + int h = (int)(hp * (160.0/dm.ydpi)); + float ws = (float)wp/w; + float hs = (float)hp/h; + // only scale up + if (ws < 1) { + ws = 1; + w = wp; + } + if (hs < 1) { + hs = 1; + h = hp; + } + + MySurfaceView mView = new MySurfaceView(mainActivity, w, h, ws, hs); + mView.getHolder().setFixedSize(w, h); + + LinearLayout l = (LinearLayout)findViewById(R.id.dlayout); + l.addView(mView, 1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); + + dthread = new DrawTermThread(args, pass, mainActivity); + dthread.start(); + + dtrunning = true; + } + + public void serverButtons() { + Button button = (Button)findViewById(R.id.save); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + SharedPreferences settings = getSharedPreferences("DrawtermPrefs", 0); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(user + "@" + cpu + " (auth=" + auth + ")", cpu + "\007" + auth + "\007" + user + "\007" + pass); + editor.commit(); + } + }); + + button = (Button) findViewById(R.id.connect); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + String cpu = ((EditText)findViewById(R.id.cpuServer)).getText().toString(); + String auth = ((EditText)findViewById(R.id.authServer)).getText().toString(); + String user = ((EditText)findViewById(R.id.userName)).getText().toString(); + String pass = ((EditText)findViewById(R.id.passWord)).getText().toString(); + + String args[] = {"drawterm", "-p", "-h", cpu, "-a", auth, "-u", user}; + runDrawterm(args, pass); + } + }); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + + mainActivity = this; + setObject(); + setContentView(R.layout.activity_main); + populateServers(this); + + View fab = findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setContentView(R.layout.server_main); + serverButtons(); + } + }); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + if (!dtrunning) { + return super.dispatchKeyEvent(event); + } + + int k = event.getUnicodeChar(); + if (k == 0) { + k = event.getDisplayLabel(); + if (k >= 'A' && k <= 'Z') + k |= 0x20; + } + String chars = event.getCharacters(); + if (k == 0 && chars != null) { + for (int i = 0; i < chars.length(); i++) { + k = chars.codePointAt(i); + keyDown(k); + keyUp(k); + } + return true; + } + + if (k == 0) switch (event.getKeyCode()) { + case KeyEvent.KEYCODE_DEL: + k = 0x0008; + break; + case KeyEvent.KEYCODE_FORWARD_DEL: + k = 0x007F; + break; + case KeyEvent.KEYCODE_ESCAPE: + k = 0x001B; + break; + case KeyEvent.KEYCODE_MOVE_HOME: + k = 0xF00D; + break; + case KeyEvent.KEYCODE_MOVE_END: + k = 0xF018; + break; + case KeyEvent.KEYCODE_PAGE_UP: + k = 0xF00F; + break; + case KeyEvent.KEYCODE_PAGE_DOWN: + k = 0xF013; + break; + case KeyEvent.KEYCODE_INSERT: + k = 0xF014; + break; + case KeyEvent.KEYCODE_SYSRQ: + k = 0xF010; + break; + case KeyEvent.KEYCODE_DPAD_UP: + k = 0xF00E; + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + k = 0xF011; + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + k = 0xF012; + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + k = 0xF800; + break; + } + + if (k == 0) + return true; + + if (event.isCtrlPressed()) { + keyDown(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyDown(0xF015); + } + + if (event.getAction() == KeyEvent.ACTION_DOWN) { + keyDown(k); + } + else if (event.getAction() == KeyEvent.ACTION_UP) { + keyUp(k); + } + + if (event.isCtrlPressed()) { + keyUp(0xF017); + } + if (event.isAltPressed() && k < 128) { + keyUp(0xF015); + } + + return true; + } + + @Override + public void onBackPressed() + { + } + + @Override + public void onDestroy() + { + setDTSurface(null); + dtrunning = false; + exitDT(); + super.onDestroy(); + } + + public void setClipBoard(String str) { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = ClipData.newPlainText(null, str); + cm.setPrimaryClip(cd); + } + } + + public String getClipBoard() { + ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData cd = cm.getPrimaryClip(); + if (cd != null) + return (String)(cd.getItemAt(0).coerceToText(mainActivity.getApplicationContext()).toString()); + } + return ""; + } + + public native void dtmain(Object[] args); + public native void setPass(String arg); + public native void setWidth(int arg); + public native void setHeight(int arg); + public native void setWidthScale(float arg); + public native void setHeightScale(float arg); + public native void setDTSurface(Surface surface); + public native void setMouse(int[] args); + public native void setObject(); + public native void keyDown(int c); + public native void keyUp(int c); + public native void exitDT(); + public native void sendPicture(byte[] array); +} diff --git a/gui-android/java/org/echoline/drawterm/MySurfaceView.java b/gui-android/java/org/echoline/drawterm/MySurfaceView.java new file mode 100644 index 0000000..fe71676 --- /dev/null +++ b/gui-android/java/org/echoline/drawterm/MySurfaceView.java @@ -0,0 +1,91 @@ +package org.echoline.drawterm; + +import android.util.Log; + +import android.content.Context; +import android.graphics.Bitmap; +import android.os.SystemClock; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.SurfaceHolder; +import android.view.View; +import android.widget.CheckBox; +import android.widget.EditText; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.security.spec.ECField; + +/** + * Created by eli on 12/3/17. + */ +public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { + private int screenWidth, screenHeight; + private MainActivity mainActivity; + private float ws, hs; + + public MySurfaceView(Context context, int w, int h, float ws, float hs) { + super(context); + screenHeight = h; + screenWidth = w; + this.ws = ws; + this.hs = hs; + mainActivity = (MainActivity)context; + mainActivity.setWidth(screenWidth); + mainActivity.setHeight(screenHeight); + mainActivity.setWidthScale(ws); + mainActivity.setHeightScale(hs); + setWillNotDraw(true); + + getHolder().addCallback(this); + + setOnTouchListener(new View.OnTouchListener() { + private int[] mouse = new int[3]; + + @Override + public boolean onTouch(View v, MotionEvent event) { + CheckBox left = (CheckBox)mainActivity.findViewById(R.id.mouseLeft); + CheckBox middle = (CheckBox)mainActivity.findViewById(R.id.mouseMiddle); + CheckBox right = (CheckBox)mainActivity.findViewById(R.id.mouseRight); + CheckBox up = (CheckBox)mainActivity.findViewById(R.id.mouseUp); + CheckBox down = (CheckBox)mainActivity.findViewById(R.id.mouseDown); + int buttons = (left.isChecked()? 1: 0) | + (middle.isChecked()? 2: 0) | + (right.isChecked()? 4: 0) | + (up.isChecked()? 8: 0) | + (down.isChecked()? 16: 0); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = buttons; + mainActivity.setMouse(mouse); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + mouse[0] = Math.round(event.getX()); + mouse[1] = Math.round(event.getY()); + mouse[2] = 0; + mainActivity.setMouse(mouse); + } + return true; + } + }); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + mainActivity.setDTSurface(holder.getSurface()); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int w, int h, int format) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + mainActivity.setDTSurface(null); + } +} diff --git a/gui-android/res/drawable-hdpi/ic_small.png b/gui-android/res/drawable-hdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..67c067bf719be65701ad8a91af18060a7bb4358e GIT binary patch literal 5361 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 P00000NkvXXu0mjf7mR>_ literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-mdpi/ic_small.png b/gui-android/res/drawable-mdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7c24e6ac8bc34d41eee51805cc6f224c963072c2 GIT binary patch literal 3173 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 LNkvXXu0mjf)t&&% literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xhdpi/ic_small.png b/gui-android/res/drawable-xhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b85001eb8f634484150e4f6b12e3e972190aa9 GIT binary patch literal 5181 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�DLt() zC(1#V5mTh`A@C$bFUXf-*aNs#b57HfrVoj{XD7y-r*HW_ePc05zZJZv_3lL(r)PEi zeHs5LFFtN+K=q=&Q88p5aMD^_4l~_{TTr{`Nm=K2(S!9my2<%vJm|Bz=liiIeKz-e zKlY^0=AQ4zo@Cq7wf5K%I7SK@x7kQ18>Cw@yU)(Li)LMVKFLy|=Sd3M1JCRL9Rt27 z0ov`+)+>n5ZjY8;>9ht*Rs_rHH-cLw{kzE${XSayVu17S4q4VbZsq>&H25~RPJ{al zbQ#36Xr}K&*tmKKo4JKe5nQJ?%aOf}wm)6&IbHqlrhd0ui19lVd4wGb?RO}E);&#I zLvwmHHUDO4POqlsue&%1zOpdHI+VulH*GwAI?(dd!Ciy~eTYzeg}J_O5xNxZ&MZ=2 z3B2D^k>2Fu@2U7O#itiz{I90?^kR(v)fAupiILAs4JnHK?Jq|6DFeOu#b_nw+g@e; zU_v|)weehgl<$|)<5D>}I@}%Y7Y9Jhqub)_A8<?=uurOq+&gs-jrG|tBFmNZp)cRQ z(`md`m(;qB&n4q!qU9Y6-?fpS`=GzJk)QjZzqXN|@AP*U_`h9f@^2_e#6JPB8Umtm zy=5f;00ARuLqkwWLqi~Na&Km7Y-Iodc$}S(Jxat-6otQx|ASVFf?A}o9k6jKn^7SM z3Nemgw8|tI986+JG7Rp(o#<kw5Cm7?3KXn8FIrfb#s`=4ak=-L_a3zDBuvZMT}ZR4 zaJ-&>>0j9kZ?surgE_W>u*`d|dqU&+e8n>Q(lK7mbAO)sC@w?kRF#E!QGvBD?oO)Q zu!^<YzIP~o5Zh6jMdBy%PLxK5&90Xw<M7AR+-5n>F3wF~wT;6ur?}V*7&9WFq9e`J zIiky+)S)2Yo{~_S5UV%QOvR0;l#|1Os4voO8uB*lJXa|Ld5q*`67ERlY4R}t`@QyY zR&QGC(>y4Gx;3L}4Ttdl2rE9UK12JuA#3sX+ZtxN^~^ut_yxMtP)^D8SO)+A00Lr5 zM??VshmXv^00009a7bBm000XU000XU0RWnu7ytkO2XskIMF->x2^R?qDZq0p000Lt zNkl<ZSi`l~TZ~<Ib;t3~fA4+HoS8G8i?1`XlR)akKoTp+K&%kdP@|ei<SJ6GqO<}j zsEDFg@X|`5N~_XHts02(L`5rAsA@w6LI@rx4|Spx5mOUHn>dg-V+Y$a_SiGyIdjh0 zm(>RkD1aejqwa^Tt-qGmS4(TH-|xTqe}2+N10!>{1syM?=Pw6PY%u+1?=t6@!c8%e z4sRTgZ7}Xl`i@wz;0gO;$8QXXE%A}K?iB~;9JOkXdu{byw?y$90pbR4Gw{y1CEDvp zn{AWqbeFd}VUH^ZL>7B(@(o||4>o%!Hi0p_v0%ZSZt?|hzw!#&KI(_qZ`QXx<t^X| z=M~OjyF0YBH`<3^1~d-Kz1C-a+%Dg8b?gdh!L?czJZI4^d%fVMD+LUF)wngs-R8r# zIpi({{?}H0KQiex-e$#Ij9w8SQEQp^J$(ng--7SE1z)pM>68Uq?6cj?c3kNcExRCj z+#xOZdb6j^#5Hoan=+zjXsex`aPvlnwYZde#5Lxf@NaH(or8X)ajOOIc8?L2mPz+0 z9Pk|{uSkpH8oT|c+#h<6+!60JE;p~1s}Neo^&RoBr&8|<#4cuR@vOJ_nBO&J36(}$ zrj*H4N&{muhkV)NskvOSJL?0wb~#|gs*a&TA*tm`xp6(2Lg{w5nT~(9nl4YSqvIZb zYuZ3)sWozqjzXcas4s*y)FyqwL#e(zxt{WI6KXBBOvkfIwJ&<ovTYtVZbGIKIO%@# z9=i-c<PNx1Pm;;J><NG7ENXR%IOd?n18%q9S+&d=H^i27cEc(jBk}!Mj+N-eYRtuf zUlBDPpN^;FnK%-M;#k~yd4^NzXbI>2Uiyz;F@hI-&ewDlhE9pg>A|$N&=~Qc7h{J^ zhD^vMiS>8*l7q;N+8fU~pB6T<Xjgg6t>!HlSTWFd+;uv_gquw`ZJTp`EHi7~SNy(d zT~E8#oDZgBuTnuw`lNSQ)-od#T1K6)MQ&hPSM9J{Fs5?C852&MkxW~(-y8jUKqPy7 z#2Uto$+d*cltusUqYgQ4pV#Y|@vM1UU1Ps-9joR&>BOt|pyfWF@sht1mb~s2k*7TF zPtvK_?MC<cwiTarl?l&z)B`4b#}D+Ke>FhqQ8&8Hw9Wp<^=ix*b;7`TYccAy#+>IR zKM-<jeqz5jc&`bc_wuU%QpC$ndY`RwU-Uw%iDT%x+I@D}?wg+Sg045Z$=4k>G@@<N zc8{bVZ^REm9Y5WLiytAm!KWPdJ>w3#(VW_L`~9)M@n4Rbw$Fo?a))2%Nj-lj^Ld2A zoQHkLh_ep6)`ui7IqSRrK;yU;et0QoxFjH2>*vYu#6PB$Bq}Rv|AL2n-CtY6pUSQI zOLN}s?RxSJZE_@c*zHY9ZH+rT7JrnMg`Stp+Tjs}*I07a^Nv`vX0rp5WO)OA5XmR} zg>j*hNs_{zbTr7cbY*f=MpcHAd5rmccUiUMsFM;-`HV`HE~QOzcPvL0O$=iY{TReB z25~g5x(JUv+A$iP=*CoRkFC*-(Rd_=u@FCr)3Fq5F^pkch-c!_ctczp6Tb|2PgF68 zD#{o{Kk67nFZ%IM>wpv~^2nnd<1rp%(T=_GOf1InScs)qh*Pl?E3p#GQAR|>=i;@$ z*n<;JnpMhWXx9Dgt?`cZt&1f`BdL{O(x1D|KvzpgrEkfI5rtAxyWb7jFHFx~JJsvm z$uw%Y#!mklxBcAxwNz=m-u-eNVW=-@%PpI8My-<TxIX*2zp#&aOd}INOCBn@FzWI6 zV7xhs6sf_ud%e$>4K!AbTUN=`LaFqk2^}qk$@Gf!pYZVd-i9P(>z2|8Il{}HQb}?h zcN^*>^qjWM43_jPE1h?>8I4AkE@ssAfX~X*N{vbv$xtEJphk{dW2ll@HPBZ{l5wFn zYuTcKTF;d0Rj4mEIrpGX>B%L9QlXT|g)lJGl41C>3w|wA8S1DF(6gvCZVWxE>q0Y% zs)&}~_F;Fb6*85i)|RVPLak8?Z5@@No>HNuBhwLj8k>ycoU^XBNuyF|8I@$(g(uCJ zm8&(9BsZq7R3OxnmKBYp(3QKOue7E#Fe>a&s7*SluP{_->v#sclv;(~(iMg(xt_L0 zr4a_&M)eI9M)b6e7--8RLl;y=4Xx@Kt_w$QRY#I^ESj=YOO;|xqob$Ls8o^=MukGA zM&FvAjxES#!YQXTXq?m1RSPYXW{oISmKDyM)sYHArBYJK*NZHbdOA8r)aVL*xeF#y z%Wamd7zmpz=$qEnm~`H>Orx}7(HXC^Epx_cXY}<kCh4vZWM64TEmImXZA4dz%$mZi zJvz47p<_*B$%L+}j3~8L*8I0+rIg}DLzO}%Gp(($s!{4FO&Mqlp%x}JDoZA?WXuJl rh8m>{=Iv8hbJA|d^_>&;7}5DZSG!6<h%slq00000NkvXXu0mjf+qC2a literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxhdpi/ic_small.png b/gui-android/res/drawable-xxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7dc776c15ddacd33574b519fa0e6335f1be1ea GIT binary patch literal 8529 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 LNkvXXu0mjf)9P)C literal 0 HcmV?d00001 diff --git a/gui-android/res/drawable-xxxhdpi/ic_small.png b/gui-android/res/drawable-xxxhdpi/ic_small.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9205252fd9bbdabb58cb12d303ca65c9d2170d GIT binary patch literal 10972 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 KMNUMnLSTY*4_h4o literal 0 HcmV?d00001 diff --git a/gui-android/res/layout/activity_main.xml b/gui-android/res/layout/activity_main.xml new file mode 100644 index 0000000..14c98eb --- /dev/null +++ b/gui-android/res/layout/activity_main.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <include layout="@layout/content_main" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end"> + + <Button + android:id="@+id/fab" + android:text="add server" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/content_main.xml b/gui-android/res/layout/content_main.xml new file mode 100644 index 0000000..8a7f802 --- /dev/null +++ b/gui-android/res/layout/content_main.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity" + tools:showIn="@layout/activity_main"> + <ListView + android:id="@+id/servers" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + </ListView> +</android.widget.FrameLayout> diff --git a/gui-android/res/layout/drawterm_main.xml b/gui-android/res/layout/drawterm_main.xml new file mode 100644 index 0000000..cb5c9f3 --- /dev/null +++ b/gui-android/res/layout/drawterm_main.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/dlayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:gravity="center_horizontal" + android:orientation="horizontal" + android:id="@+id/dtButtons"> + + <CheckBox + android:id="@+id/mouseLeft" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseMiddle" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseRight" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseUp" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <CheckBox + android:id="@+id/mouseDown" + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + <Button + android:id="@+id/keyboardToggle" + android:text="kb" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + </LinearLayout> +</LinearLayout> diff --git a/gui-android/res/layout/item_main.xml b/gui-android/res/layout/item_main.xml new file mode 100644 index 0000000..9049612 --- /dev/null +++ b/gui-android/res/layout/item_main.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" android:layout_height="match_parent" + android:padding="10dp" + android:textSize="16sp" + android:onClick="serverView"> +</TextView> + diff --git a/gui-android/res/layout/server_main.xml b/gui-android/res/layout/server_main.xml new file mode 100644 index 0000000..3d592c2 --- /dev/null +++ b/gui-android/res/layout/server_main.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.widget.FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="org.echoline.drawterm.MainActivity"> + + <LinearLayout + android:layout_height="match_parent" + android:layout_width="match_parent" + android:orientation="vertical"> + + <EditText + android:id="@+id/cpuServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="CPU" /> + <EditText + android:id="@+id/authServer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Auth" /> + <EditText + android:id="@+id/userName" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Username" /> + + <EditText + android:id="@+id/passWord" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:password="true" + android:hint="Password"/> + + <Button + android:id="@+id/save" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Save" /> + + <Button + android:id="@+id/connect" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Connect" /> + + </LinearLayout> + +</android.widget.FrameLayout> diff --git a/gui-android/res/mipmap-hdpi/ic_launcher.png b/gui-android/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5099b530fa24f18ecb088d985011b9256cec23c3 GIT binary patch literal 14867 zcmV+uI_$-XP)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj001hRdQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3>vk{mg5h5zFeIs!JwavZE?x`B?b?;(?H_A;98 zF*S#*nykzS1mOM_hojv2pZ~t@zxc1WQe3v$N-xFpU+%fb!8gr+{_F4G;Pd<U{g;3I zEd2g;_wxslml9vo=l|C6egEKf`|SfiuQPxDx@+H`#P+?=_Xj^Nm~`jJH~ZH?@_PKd z9`g4>{d~SDz13fbI^*Z-`o8fE<@-0)cj=!O(f@b9zK|=kw2gPA7*7hxzkl0j1nKj4 z=ym?}sq?;&%6la{zNGZyS(%XEJ>HM6-v2s5znkPA-?=}|{?G6JF!^zOUr&FS%krHg zzWK`^1pDjBe^dO+jnmH&#ozzHQnWuk&iC)VyWM*}Pd9R5M$0#%y!$ab`V4QJOnG`A zEBvYaHNLO!Pv=kb!!H(R`{gHpR_Gxz``3jWb{OG?^S-XI7-EhmR=&o#VtTK&RAY}T zX`QnEgd1z>X{W|ou6P`4mQ(yWmhkS|-~Co-+<6Dy8Uq&#eB@vLasSs3|H&VB@6r?n z-+s;&<BE!0hM|?yzr2eD3HQ5h_9pnppYQVfU*d;QWd-d`bK?PrpPx%i3%|uydh48c zpYipR6~Wd0y#Q0hy^X<y#0vNll7$j{jj@KnJT?|+F!GpkoUA}Fi<?2loKlId#ujyN zK2yVcZ?ssVUIv?32qT*+Ytz$Uv2r%zr{+cs4NI2ItXQ??tlKE5<YJ|iS_E>VrkbnO zQfqCs*U?hT&01--wbt9{u_rLldg-;d-uoEQ4Q@2J*5LhvS7w}P=4rFcI@|1XEW&5y zWvi^Z+UjfUxYGtEcG-2e-S;@b9gyPWW2c;Y+UaLpV(q4zuibL%ZMWa?bJf19`lmnt zVAaBR)#6(zy|4aUHC}bK{<uUCoS4>(6^l8r;#Dg^Ku4{aZz1QXmD8H}9tC8PL7LXa z?VuH73G)fjZuq%&zpdQgS~q9yZ>?MWcPr<#bpIbK=UBQwuiIa&+7{2Pw_=|x)SUW6 z_VJz(o8zzd{PXv|=31GQxXud3v&VdZ)MDLdXMQr)>Uk(@+}moLW8T(}Pznf-lX==F zcjc?aw%1K(?leK<n&TdWhv?Duw#OYi=a$AG+R5CDCTL|_<>?ec*G5}6ueIhq$(HR= z8ml|{-pTIj(06ii=)N#s3yV0+Y27lo;cX1OhazyY+jG5jm&W^c8>jfruq^MedOLFx zF>V>lv$BnS_hNA?Kw>NA(q@fkq_{7P>~Cr-yhj~#92S-9UE*|y*~%i&T!W}@Vo7Go z7P5)J|C6uouYRy=_pzkZPu+3E+526sao@d&lSIHwJ<zVF%sE#dB$SKfkME%agqE&S zfe0#$@XWwt68GCc#AEG{rRlE1EG3>t3hk~vQkl$Tb=-z5Sb1{uXmj2^wm%1<k_nrz zM<q-z0g}@$OwaapiH$em&K(a^nELI_t=)<G*>Bb;)@cNk?~`xdqm;T2*+VS$(a*VO z4W4OKPh_Rz?>t1n3PrhA0zb0jdpXShjI9_`(N6Mp6MD8!8Dp~+ZSHb&11at$m4L;& z(q@3ygxP)&>dfMKi<?n+wafy28=)E_u^8JTJ!;ykpG$_!MbyT%iIJQqK|l;w$Kto0 z?*JsSHL`o;Mg*5cJl{}mVAfM5GRKDf10i>{0!QS}dkZVagI{xfS3ttgJ)x&%;p|>m zidr-1l+X`_kJQtds&-pG%rBxLv!b!wQhH$N2I9{#{-mrkk|Ws|1W}3$1#uWU3Ax&A z9eDz=r|xS@R;u-Bdi+}UJ|v!~*8za-#4vM6%r>FHOffR%q{gwrMxh*m<^-V(z}&GQ zQCVKr9sFp(0*k+kYyWXl{PNZ8xI0cJdiw%`4M|jCh}6y?9OnbC)@+=VCy8L8$2}{U za%TqU0Bw-?hCwPg;)yA!hfxAbbGB6OQXrtzfDUq95RRPK1)iJ0*4^OK$>?j(AZ{kw zN|`RgKzr?#xwF|ICx}d6d2oeew;hP=y1@8g^XM*19Ffk>J`|vHcP?I<W8Eu(mRb*4 z6U}qfNf-?O0(6$X6-JdjJ==s-bzbRysH4JcwViVYlYQfEc|m0Zpn~0baormFX=It8 z8991lW7(}`9<7Iy*C1q}U)GcR$ww_N<o71BPXM<^o?L-MD;d^+<QFTu5=1PP=5Z#M z28W}9hxxX#5>VVON#bDXzF-V^e67N$3yDWo6QIB;lOHr0tWdasT)8}PYmxh<KGug@ zSf||N*WgJQsc8k$tyMfz$cTxez9ZXNSqo5gNmP738A!P)Gk46%d@~!OvoV(f*c*A8 zMzAv&Ffa-^q0eJ{kz%07p2QRm;DVL}|BC`x#qW74c!V>s2XQyET-++u%Z&6AFm5gR zdHf<!{PD!$T5;|USaxrsoB}L@;^*}1jslbG2mW6v8QKj!6O0SFaVNlKVzY)=>xVTf z%4?t_7Z74?p>^&Pq<7_x%7c*0s1ZMj*#>KIJLFZ~bDB-mjqV9p-ULzu_WRf*2$*UX zGc+EhIEHUf%OS$hXE<C~f$%xCW2yXL=o0>?vvkl81WJgUQ6mgcBJ&o)fe6BOs{(zf zHAVnfN9l3?0a8~Yb7O7N2q*6D)44J5RB4fiw^cHy1SDA^`WX?yAUu}-^NFzY{~_tR zKfKTuc}psI0y$5;R)A~7=^j8Mn7+}QK2}y&^6!*QpdlQFL&M6Tbp<KW1ifudc}yf~ zTy0byjHqY>-<I1}&Y~ir71-hF7(suZ$*sIczPlUCW<-t_f1>SBTDintSF9(F+2P>> zzSUkJaDu7nvIr<!wMw43(V-)~9rguiCaM*1K;HEO7@U^CfF*94mImqQSB>N}uJ)qd z=H@|I(3>3({v?@LZ<Iyw7!-4MskiSOFT-LD#sc5Vf{PjNs$H}Y1F21l!mP`>gSkLx zkFX`UyPb+qJxQX%!rHe~6knFQ=nwXQUvP3(Bp`D~o-Gt(>9^q5Kxhb-U`2MWGk}-q z3(>{Lz#L+Gw#_#QOK=cN@s0hX<e1(u0<ag*kfb!=0pgMZ=*L!(ET`St2r6FZ&K{+O zheUKoU>>Z3aMr0T@L}BC2R;C^Ylw289_j%i_R!psNhnZEsZCHG`I^v2<QJbP6UHW{ ziCXxW&w|L69B@pS;cMZqo&ekkfe`}Mi3g9O#?PXY-<(to7rE|<72H5ceUo0mCLwij zM`)gol25ErL#z0+SyQM{c^q~@o8XRG2%V?F6eUE?JqQ1TruPDQWKK!wBQpFlpv^2I zo0x?K4ZvUlZAYH7f@lzlrX3Luk?=#BAzTtajc6Q0oCYGq*(cDi7z|N`9V#RUQl`XW z+`LFnNF^n~$bo#&+d^&>2c#;8I46{=<*(AJJOpCJHw~-u1ZXPm-^w|PB4`p~3Sbug z?@kd5EEe*Duz@UM-lg+T+|gfu1;~#pz*WY<=;<p)cCFI|UmHWSW%U+<$fHjqYLtY8 zLngAE?7Hhr{2vB`X<d%how=fB<bVqo?U-3yi}XDUE3HQe3L>yQuuCq0-?|2G!44rw z*z#o4si=zV0p~F#%QyHJ^1yhJB&7=i<Y2J6BrU@xC7KVRRk8q(TJ16tlzMW=%%uPD zmnny@13E9r0+I&nOS(;b4_fD?Espx2eJ}Vf9O6d}5+iAml8A3$lQ`t*&<q|`x{yFP zSd<JT53(V3&niri;X4sf3uS|X;K2~?$kK(*uK2$Md#J7h)2#`nbr?-iIKT>`C^7`w znEgTK01`2RofSSpZrzHBKFNWvMDoQsS;Kqxlw?=1At*Kk3`!qt<BBX}8P_+tC{_yn zok+8bu4KMa_N-cbv5oS>KM=c&AK*go$DxUx0BeO_m|b)V5Ud<qnzii_2}p`Qm^^c& z48YO0kH9ldirmK=XhPoN=Se1k$vih0MGBV+O*7ZcvlyUN#(pVm9PFF@6X>V{-Uf4d z9xy~w#$z=QArraI(6+#-8{|tKL8-_HJj9iJ13O$oBH+td^4V_DJZQ=ClpHi39+u$d z5Vg3%;FtpVLlb499uYl)+la+-ABBKe06d>3*|0wMGvb%^g?zk}Ax8Ad!dJ!u4`NSl z<t9sJ$Vh|fSZpS*jeI=IzM<I7oDbte%z9)=+d`b9`YLLj)N62?pD1IdT0qC^?XB8H z^^vOxW^@L(1Nyi<DHj0Uy(Ci+;z9l~%yNOIaR{e|=qqSFLkoEp#-ZK?2HHLNhhK3< z9eJskRJBI3QlxHkZ$C;yU_?fP55;mW{6C0pyh_l39ryxXCU}@H>8hbxOg!K(#!uOi zGCv(8G^B#1W&Ak!I7ciEF%3F)BnA_6fl5FHokPBG@xe;LTlhTJ(PsKPZ)W~r!kp3k zt%StDtdPSbEkc4!C-pPgWVJ(H%svPg3EWVnW1OK5`5;R;p|@?X%y0Z~17KhmzQZp3 zl)Z<9$aOT}4a<;S(NMqr6dnTQFZYB3MwM?!B$1R*eV=oPf$~QJs3MLV#Gw0%EJMuU zzR)13sExMhzM-@4B+y7&q!!u|Z-dOlrB{MW1v%6flQqKS`QTY_@v1gOm>=F<2-HeO zkq!>iAbVZ8MR^QYE&&P0U>%^?Rc)e5fEk?Rf&9VAd?pEkbj!Lr>Y4a$P7I7>0t$H+ z3_vIV2@rr~z=QG*%)`c@tM111<6Kdd($Cpv1UAX6f@~z$7{E5UL979~Dj4Dj=~K}y zEd_>j;-@HvDKqq*CyU7-roX^otP5(9(0_PT5UY0$t?m?AGtq=Aq=TC<o@Q>8-o#W* zl&JPMs{Y3}J~JNFRjbp5bBU58*HSBw2{Gb^kj8uv(OE(x4l7|>z$Xw_o)9;q>JY=5 zz@a#f>>sAmRfiP7F?cdH>lH7JUQ-D2M2*|OXG7lN5mejbmSi%>aAK@e^$oZmxgBNl z*Cr6aVn{`zPEh+#G{CpSiVuY}8nOc6Y=SaXuO2EUDK(Z;BOv}T#F(NTyub)z$SYtJ zEI3JGA`VwmCRh{@M?)E=n8LQ+Ta@uz=4$DlC<FYnU}7IZISU3V_JkS%wHJ^MM&Q99 zd}KL7Nj{xmsJ*8MO%@ZbGuy}v6{`jAtQC3>*}*M}BeOEfZM2NB%#j5o4X|7XKbr7< zs@;L!R}ur7g5Ok(Qvf5QO{x?eo~O9onSYch=+9~&1S<*{f>8m&6XbrYP6u<Tn$U?_ z9tGmT|DXl4WJJDruL{#L@ZAhg0ggj7LX5ytBG)%D29Qi5_LcI6fmvT$CqVcZx(uZg z*(&!TX@OCEdW$OQ!EXaqx(L3Qmx}y}gn|8@<oS5enqO}6jCct|Lv<5N#e|XiX)lb5 zd=p?+i<WK*^pJM)z38YtjRytQwvD`zwWvDPUnSgKjPu}yG!c_r>Vzt?U0ZKtAJA6x zzInJ+gNG1{p#MPZMdY@&A6YA32|edEhiF2^p!hqGYrs_xm8OO&G-w5HrZq-R5*lDo z#6uw^pdu9hImn3~Tvt7(ot80`vyfK<hn9rbSJwrCQ8<f)g~ZTxv#_>%?X7@7n=e)6 zUfD<9GO3nEpz^<)WW{jPUUln2RCTVTtxbq*@}T({KwzSwigL0+q$MWIc|v&^LWpbJ zrD7uV{m=AzfDg<u1qTxu1}TNJU?y|xRm;w_v4{Z+E<e>ZY9<}2+%KLzi-R<~60$rx z#*c4QWQF?T#c`_;JG6a7uA*x;zH5w#3|WTWJxodl*V~inDmRz;+?*rxOo$I;B8?#z zFSR&S?C+!}xr+b7168Ocb0b4CuLf$9fUuO8Hb?s4*VJ4=IHVGgmg&`ut^fm#N>22y zJsBfUi&nn}P?CXYABtd)mnel~W<Q7sC<qNPBV&DP8%b<KbxEv;_ERhAxr$0?F$>+n zyp8X;`(c)Lc}RQ%*ruOYPcRGwc!L*NhsnE;##`MK(Qu(xHOl_BA=2!KKO|}ys7+9x zuyac|AM2}YfJ3mDsjP)3LfR+QBhl7I;8khdVX8=zsa-oF)@4FXyF$YauR8cn7?nF- z=|!dMK>ic>C?B-Jxm-q%fd<L?hGklO7{9JvDI^j!>b`HN%@f0TR8?&)oLJN(fGkFH z4{h5CUXz_Fvo(<?73}^*`F=%zS92!}$Ye!Hm#<*We48&3UJbe)vKGjM++a^A57-Zq z70i6SRg8^6P$5dC)C$`nTS+&-FtR>)L8Nkt5xlvozdaHG#Z_h)XvODXh<5^6-yzt~ zTSjgGbTB*n=GiwfveH16@O+)1_>5rr0op@pAX`C5B!q+-FG4L&TPKPJ#*9lFo6NUz z#(?=}B~lR`nNez2p^CQwMjnZ^L1Fiq5b#y?VIHl?&7yQJ0EIu)=Aa7a+T6nM*gWu| zA-gO^7z#hYoPx4m8jkofCI#x)NI!0UcMrsWi?TyXSE5t9S{ng6J+W%YE?j|`Y($=w zpoigbfU2=XCM3C~qR`aVBvJ=$gk>h#iO|p@#B}6-z4nX%GE8qr0}KoXQHHBARZ7lL zm^u}<Diqs?cDGK>q%=Ux6<9RA`7sCrVJo;1r>JtsNV%wb0+^-h>kRIh82AHzMXxXX zF>V)^$m22vI3WOasG28nV*Mbwz~WaSzU$HEMv#KpG8rtDSg&Q)p=x_zV2&fCHnigo zP~%$LL_uIa4zeE~Fw4dkL<ky$12-$ap9BNvr7=m=S4xsP>niSC5xI(kC^3`Esq!(% z$l25d5c}=+R5h~3@Opg%cCBXZAYj1nO8&`?X}B9mI0S9tV&V~t{N)MpOL*NuFxRBL z04N*xF;t*BFn$J-!9=7X*0J@~BQbag!+7k~g=HuH#aAa^km@G7REbPj8{kmX!gP{g zgYYNBK+$zr8*NH<CA&vDpng<yAhc@UZYJ#^sVsx@<WeOl>I1|GRYR|6NJx+ey0Bs+ zWV4cK<(-#Tcg`hfGbrF#TMWONBqlQlbKtgMJnb^B*gb*;_3u9gXOu4!j>8fJ@?EN` z-i4A?7+)%{c9{y5;`T@OpzBn5l2ilN5^$*YBzbY9*deJ#AP-e%#7*`JsBfT_?3zRt zqq$hTf{u}wBlihR)PV|IN~%}&Bjpi=vmh7R^PR*S#IS6l*x=KdF`#58lQ(5zac*1N zFdcZ4eo=gF_3|JsnrdqYSH!glz)bRph#e9c^dV4E2h>$>WI{=k1W^O@4P7a2I-erz zRq?ETsynYnk3#Y!<Mnuv0WqOj296P36TGVIDmbJF90UnuWg8|Qnd=GP0Q$!=U@qPG zkz{}%N7CMnUsFZ7BSV)lz~p-XQ+*&TV(QG%MT$J>h3_N&y>?P^fOXd3NjDl2@Dm}S zx3K470*NRJ6+6jpA;MA!O}vz9l{OHi+A8$gI!OZwf+IqYco!>zfQWqs!`EoRs`Lry zpTebYFuVtks;-O6Oq$m2CPEna?>UvhRftp`?Ni!)9+D+~)Q@+)6>P%Bkra5Eq)p>O z{<VfW$|~@B_<(_m+5n2{pl;PW<9yAd2_LZ<A=(s!L=J0>kVKf_4sh1$9AZ3OHVoej zS<X}+lDp?mPE@BAWAy1sTo(V;G}W*GEFsg;@+jMt)&FC{6PxHmXitSU5Pi5iv@?<* z9N#uCBh+D2i79R02nbZinwpqHk{r#sAtaNU{Ivgb?ogQ!4XM(GHkm|?0qUA6UBsaZ zVO(!(ljK9=)TCy>Io3_NdJs3lD9n}WXJxr9l^v=*FrR`&zzDf3-Kq)4bpp~bBUm{4 z>p6sF3?Z|j5TYMpn29o%*6C68x1r)Bp6OLe)<XfpVo27YaVNJIuEAml**ZJemZOHQ zR>|%YBf@gviKfc8eK!;YS}bUr9fW~EqBbD`VXlE#7R#x!h{NztQK4dp$jYkaIZ?u4 zss~n$FSXabrIBE_i*!pFqmmh#Hl`BubNBa=7&A~oGDgDPjipl56}Tb+t8^@BmWWGh zs-!D8rlJqS#LZFY?SeIgb=2mNlyxB0s#AGIjVr>*auAjTRZ?LHb&tn=+)h$s6pjiH zIKddo^vDw8CYM55XbUtuZLZJ9-`dw&3H>OUl<(^miM^^Nv`#XR{D^}fRj-Zq4l;3g zP;W`K`RvpxT2PDS^=DiF(a4dm78!trpy~~ouGupJIg;z+Q`6O+>re+J#EBDdM{<z6 zkP1ouI_`f*g`ck=aF^BdC`3G3b!rAuF`vodk#YbailITZS$p4R`JF)zv4hJ0H+&_r z#DTVj2|jrb@9<mrHZLQ_1bAl8NX(^{mk#biYe5bP9oC@)R)`f?Z)=KWYEt#8B$O$A z<h2uuZdFUnlt(Q}8dbd+a)FvyJY*%$0@@H63QS_KyzS6Zc#b^1vl+GJj)hZW$yEE^ zk{(&=767sH#*P6YL{LLlCd_n~jM9%_z!t@keA<OZ+L*mP!Kn?2lJrsZDq39{9a)bs zSCf}i9YSo#1H|>|;2KD5b%8e*I@d($ENz2yHN&Z5t=$;_CePF(>xy(@AWXog44B^T zs7?EHuOMaHbO_(3)<#ccnLPOM>I_mTNh=$(NI?_SiW+ThX}q6H*?QGt#&-nC!x2o_ z)P+pc5Yv2>Wz}n9nIg4K3^p?RsLa%5d}S<An_B9*?Wtav#(|`myg8!O30aa=xDjzx z!WV{_s=Z9rFuL|2Tf<alFqhPVsMXjoXTg;?P>Yqk0J&EmkM_Cm6A<v%)`n^UIWn3b z2`1(v_pc!6%mf-YwV;Ni$(Hj}_NcRl*TLLU5he#DhYmp9Xc&S8=#AD<OmG6OhJ{ek zj_}sb>_t#Jl*&LOVrA6{lGT0%X7GPQEHYIj6HGGkC+gla!W>VKk=9-<P5n7pZNhOO z1RoEj3MS4kqYCQV;s=HVhS~$|(1><yb+y2Q;Zyl6fLXy7j6Af38X1WDrZ!b35U*mY zG1u`tdxmt-;x$TzE4gu45e2W7%3)W{5cN}3kK`J35aF%1Nzo4Sqm&WCs<A=D<VMn_ zWKYU-=oYDt8!w1CAPs~&FIMmojs$J$DcV`}%MioR7i^HkQ6WPs@bO$L=(n(6s!f)+ zLy+TzFtypr<lsf3&T^<`pbfOER@tD+--)Un;y{c<#;PIJ(1AP_(in)U8Ash%=~C2B z9x#50i*&UE`6P{639*Z$eo^7^?{5DDho=kVres4B*uX|jL{Y>@$OIwVLq^q85oj2{ zg~)5_Mb@6;QGds{5aiq7HYgkJ20<5+YpSzK9Ro7uKBGE6+r&jxJK14eMa2ps*;j|c z7EFOW)^<ANqO$9!5Z4H|e$;_D)ZjKtN6Z3ehY&1DRcHUU2#9ASIzmi6Feo-{ZCiQm zw2XD&KYBy_5l(8b>Z(q5ZVCM7w$yTh2nbkUm=-52qLboqb*kE-oziDmc@!j7^;7$2 zU@R^n_ZrE|-nIQ6)7xtBs&fSlgzzXbWziK39?B7JLSp)YO<|E$nrXm#ykI2;bCkBw zHE2L)#%uous6jU4uhwfbf8|49bAXp1QdT2_PinuyYEL!5y|^8kc9@k##HB&ks>A@J z2q9#^USd|KT?_60BIpv>qc;OsEE{A*@acdDDo&L?DMqVmXGiBEAi!Fof!e8&97HxC z1q4aaJ&i3>c3A0Qud$lU&T9yF@O`Vi14oZ1L6ZS&b5lGeyq06eT4bhMYJo{6z$;kX zX4AeMHW@ef+Vz9(1TECzGZq4$-PFT^5A<68f&0J%8IuhB02eCTbtW;R_ZPX$tnoOJ zxdBA@9H6w-0ERdK0l)?XifU{;C1&k(wbghnZjkr`&Imj0O559f#7}86tS_Dt<3K8v zSH6nCpS;i5jzL0S>Ly-OP16wJN)qCueLB;SPAf1Y9XB!X@WPKEL$i94A}1tRSbV?8 z9L23Z<)l3sXd90`1l&a(CQTM%MVy~H@Ya&(o|k;QLM_y5#HO5s8sXtlz&c^{*>+`g z3(JTPLW#gups@Dc#tjGx1ojRxEEl-Kok+yL{xg@zfWSWqGd_Yk#gIR0bW|yWyj@<R z`{GP9>qH13dLTSC2^>X?_8t)O&6S84m7`O6y^2A!u`u99ydcJYs}B9yJ&0W(qEk!= zoV3-^I1sXl1OnJ}*g{AOoWHG8X83(Ql2I_m>oAuwyPapkZ8IKGhw8gfHo!uzjhP)} zMslpl&B@Y^lt-+JozX7o!`-Hq6)+#$hG{{ep++J&rhTEwEe3Z}u`WeyN+I=<_Mlk3 z{;!~UNE)`QzTCQBh4A#3p2!;))s4R-ue7-+)T(a;>igUX>S#}>>^8U&l!KB&LS~o* zE3FQZ%fMlMU}Q=ozBpB5I$5f{21prg1YfD$1LmGNBLE6I^rEKUlYgoJ>Y>p-f@2Pd zol5W_{#g8`W|OLxN~upmZL5RyCOw+@p$#suKb@dvQ-tC{U=4JyBS^G~v&p$k<l$@m zlmw7SUtk^@gaAdK#T(xqE1DMvCWc4%CT*(Zczku8+?Hv@M_ko|1^`>{oVL3XLc5Gp zB_^cd(1f)aKIcf5`Uzkpm0y5;r{)l3nzr|tzg(7z!;CM~E&r}<q$(m|l0p2e&cps$ zLfG4bzdAnzfVinvN1tWbYkMG-i>V7x-J>?ufvG}LfFv=bIw+#P*x2&cv4o&Yis*vV z&Z~BrSuY|>(4lSCh9yy7(K~^JZI{dG+-+Urkc+AWy@xi4Of|Wi3*4{m0{-KP@s+(u zL*-`b%@&0ja3QaPa(x{Y<hMdBsk{NV$j<i7$eE+6_I-7eDIf50l94*cf!G=qu)e}` zn4j#?(6#Z#^Q$G{)r&I7;d6kp4PStQFR!P{s}EUSRcUwVBT3d_*$WPHwKY^S*GW61 zMu^(D0*<swD?8L)gHX5Zk%}?uH@*CPNGy~6mDR(dAXCaYUTRp%nV(1roX^ICqQ|MB zM|*OF!PPP0)1Fu^w@qRMQ_xElIU!7AL{$!*+)xP$5cF!j2bQ3=?sQ}d@7a+XQ-#xq zk#MYbQI7ho&h|Q{k<@;!@`YN`!pu5W(?0i>Kww0-p-)vLsO#c0v>P&T)iCx|G6yxV z!%RyqZK?$gtR|Q7M7SgtZs{bORXlBb<rLzmsjt>Liu+uyTL`p>T~^)Vq0cBHb0l&& zLHkS>X6PM)@(UO_hi4^Mt*W}?RkY3Z+o~5owf5h3NmKM{T5H;fELlziV<)G`qn+zd z-i1ZoYe_a?&{We|Z7&uZyQN?t3X_hmXxBHZr+h%nQQe;^qoaSTQ_D|Qp;5*`Sb1fl zNgJ>W$%0}{(8JqQ;faWQqEfvARX9V|V+oT4ma7ssm{w8-ggryf0jR03!5m8fVZNHW znfBvecOGl1HPLA{+>e46rG*zEK%;hEGDN<G^Z@}X`HYD}`ao@Ji@IWk5=daV<vz6? zxOGV50D8o!Qw0LNOwhFItJay!D|H!KRy`>K&Nyv#X(4qJ66hXzAPhI$+_m4%9H-%6 zlc~?KjtFlSFOb7(hu>ERpooJZjkh5!?W!7!M3k$0I5ur@$@P#lYCV75FC(bPU`n8d z<Br-bh+dTxh5#6-j$<t%+aq)1p{f1$e93KfKOdbs<f(vE(3fFygTq+2N$L$?^uCik znA`OZZ(T%s0+PtE^)?afI_>!dr(PAb4(>6%o$C62T6DmpUagz<Pv`zHy^cJM+2qiH zAN+;R;&}m8a^S2gzyUFKhc*O*J{fgP6QO%wh@ID@t$KKq%){qJRHVOZ4?$e0u?$b^ zMUVDsP%3O+9lwI~nxPFg<kHU4;kaDBTb^W%^b&j?@UYkVP6ZNnL?e$?niM$F8jvbS zBG9V?SInyOaN0)fI61Ygn|O&&i+Nb_+<C?j!K2qa(_+FmE$wKeeP5dwiGZ6>xo7)Q zu;J(kw50l+YD6)0Ku%S*0D1Wk9An&D{m*Y(EonCp5_;!Jv58Qe#G0yZ(6&xNLJeF< zhw>B>L%Kqr+xY&gj?rS6daub)9jEHzVe_-GFw<(T(&7&$8dQlJf1=}3vNH>11=uZD z2*;%zVI3*fny526$&0Glh)6}IvCI|B$Qix4BG5@JDOr8d0Y$a5!)vNytBXLb4TRzQ z^$h7r7MvPvOloLT59tGFz>;T8z#^!&d(IV8X?fIp%mX5n(X91N@)iPX&lOV8M(kD* z114Yi3=mkeupkU<uLOD1rj+_anp5*fNjgFLRFYS#v8Eu2rzc`)yxN+XfR#VoQrblp zSGoY4A;i!y&Yz8t(*ZixZKV5Pz1$?u_v(!Wrck;dLgS&%O`)R5h(*;^+pAL}5l|!f zd1QRw2a<7O;Q!5Fp$<Zdf%BL%BjIoZAt{-$bvywKCt0VnvNEjB>l7C%&~PNAnjE=y z_}X)`DkWpgLzrIuK#W(LFQ7ls%Mb;q#xNKhvSw+g$5N786UB-2I+2a%6INFe2_b@d zR&|p&gjMo8I|e~=DZ=)3^5bdS6EyI8eMf!N>nM4qg+^|4F)Mhd{$w2xPoN1_B=lVO zlc#~t5dKd3S3Qpq<~zb{+Hb%vjG<r7Am`cN(O2!P5aKh<Pai2V%0$9yb0^EYBbHt> zkADBg#f<ADv#H^aXG%InOG<f|P%t+!YUp(64WC2&#b8C}KS*5gNCAgxf~a-IN_}j_ zH0r4no~lbVJvcskX0;z+^j~c$$gHVP?KUP$(r>GC#H%DdQBty3#7051qqQ#qD0Qy# zq5m8pVD5E15s3riKyW&EaCOXs3`(dpbW<0rq}Q=?AW?u&G7iSx_z^gYA?P6KtfFJ+ zn#94q;%BBRNKWUm(2YX%)nFE#1fMET5a#_OCr#1|rQ69H9eQ1A{htswBYIxmb~T4* zzUob2s<qlx)k*abzWr`E#MGs(UWgVm9HtS&p-U!U1QHRGn6!WDxMCuA-X0ddzWaFP z-%U$x7<~NeekFEf<FllFpwU!8($TK0ZZ>34CXNy+Ps@TDhcFNcqvNqO3-6c#3T8l& z(kbUWc<)2*PusQpM7@LzI1xuVW{eMODDqd1Dtx7UKckXCG4Z*Drjur1J(xC|-YSa- zj;x@LDCjvKH8kq0cF==h74u~}rAhQu+__3(p!I!Sv9S@S*T=4&_N6U!8x^MQO((UG z)U0jP861%VUU8f-6|+$_N5tB)qSMl8r~z<sNlhBI+G8`BRj1ZAg)Zy}3h0>VbN>X8 zX*Zx@L=JF`8Uu-%I9*SNmwoNXLLU;xV&y^#7!mhuA?Q~h94xXH8jHH-;n}nUc?)R6 z6!5NhTon(@D}}`dKV_}oZ>~rvhOpzlYVU_0k#a$Y5s+2J{DQ&#c5NBx7v!j5ig~M~ zng{8hj3(T0M>=+4uRlSMJ9N$yLsE;ji4)LLCai}w!}E^!OL>S_^~E=`Q>V5uT%^4t zyR<Q+-Xi~gCB>6{Osvk~mv<IWXJdzY_g}y8I)P8<_r2725+<SyU~#wLnXppfj&DnN zv`k{+>Piq?kWtFRq>Y)WBOq&W5mmnkA6caDM&-u$4_QSJeXFp8Bv7qgEyX(0-z8bS zTFYDYZ&Q6@6P8YYRk2HjAPMM*8X=3-0HH=jp6*SPe}`8}L_sB}k5?};8#vJ!!6GgN zy{k-=iB;r548d-aJ342pj|bIs@H9NsNlT5e+#e^c6KLz<ei&=N2A&_@QS%O@Ip}2R z@C-4n-vk0f;Fg)_+mZdL_xC%IWPmIRBs-VqQ63T{@f~t9`=l*sI2-k<ARAEQ+n#3) zK{STiv^Rsa7&=b4`ql3k(B^H?ah{p9t08O>O*#l#3=6yH_^e6`eKnm2(rI1n1e6cm zs8?CVB<)sDwg2@jTo>)5C*D~IOj%Xtbf#v4Q>y#mJ$472NhNF>22Itt-twqjnogu1 z@p(Y8ZlGT}5R)Uld1lD#rT*kfW4*&r>MTe&Y*<gfh6@?*{e!@@5bcF)gf_bluMj(v z6d5{VuZ`5<(`tdi3Wu~u$pq|I0V?YF#I1H|aW!D*L_ty43n98~_H>$4jv;~OJGklz zWEGd2qI26jVz_41PG;2REN=Sfz>iu@Ozm%C((&CqV5+L@H4bCxA-am1NqbG|`9@zb z1|A<EAV=mzJiw`1dNP|w!EbJ?eRg0DzEqqI!fNNDGo$)lIt?TUAYo3hlA5&_uzrg+ z23QC#sVPIl9<0?agGbYbMjBOzTT~cg6z^CCHaG&`OS@GtO3gam>(!K@&9e%m^G{s_ z_k>8glY#*n_QHVfcL3I_z3bUW71%@qNA*PQJ;cj01dMIhY5eya84&nO2E<KyNuj?g z_C>wcYpR&V&tP1g5*KsL_Jks18>@6EH0hKWia=zbGi1xvO@0^s29>Q}MWe0Lqq5za zn_)s+36HJ0@b9pllzUTWq52)5-x(jwfZ0%(cmE60Vb7XMpsl(900ARuLqkwWLqi~N za&Km7Y-Iodc$}S(Jxat-6otQx|ASVFf?A}o9k6jKn^7SM3Nemgw8|tI986+JG7Rp( zo#<kw5Cm7?3KXn8FIrfb#s`=4ak=-L_a3zDBuvZMT}ZR4aJ-&>>0j9kZ?surgE_W> zu*`d|dqU&+e8n>Q(lK7mbAO)sC@w?kRF#E!QGvBD?oO)Qu!^<YzIP~o5Zh6jMdBy% zPLxK5&90Xw<M7AR+-5n>F3wF~wT;6ur?}V*7&9WFq9e`JIiky+)S)2Yo{~_S5UV%Q zOvR0;l#|1Os4voO8uB*lJXa|Ld5q*`67ERlY4R}t`@QyYR&QGC(>y4Gx;3L}4Ttdl z2rE9UK12JuA#3sX+ZtxN^~^ut_yxMtP)^D8SO)+A00Lr5M??VshmXv^00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF->x2^S6{Q#4H$000fnNkl<ZXx`1*d9a=Zbq4U? zyM60jb93(vge(vYi+~aeigrLz>DX3mwNC3ymudg7qccuhbviP(9ks2Mjykkc9c!gl z5zAQW!r;=uTCiwYf<S?g07+P~5R#kZ-rVng%e(cD`{vdtStQVU|NP$VdCz&ybIy6* z8<eG=slWK-E-#e`lmfxe0-%R|!)l{;TkSIS7XVQ3{8Kh-lkG;W)^yM=fy<2k|3#>@ z(H$;zsbQ2>y2+4>4V@&Q@c9FJ$~tFD4D55r3Rk$(uK$Y&9kNeu)sHbGutM9I#9sGn zT5pxJ>@t0lX**7Ya(mqCFZ`ZIbQDJ%>&b+2Gw%0A-!|tp?(%~dGeU(OzG<!BcfhS4 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 FV1lP!Um5@a literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-mdpi/ic_launcher.png b/gui-android/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8a70757f25145079718cbe7e8b53dda8994a752d GIT binary patch literal 11578 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xhdpi/ic_launcher.png b/gui-android/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..66e95343855f47c004d3504193f99a450d3b5ad6 GIT binary patch literal 15155 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 literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..52aaeb67a697a95bd6f7f3d268705a3ff50fe2e9 GIT binary patch literal 20643 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 O0000<MNUMnLSTZOT>QcS literal 0 HcmV?d00001 diff --git a/gui-android/res/mipmap-xxxhdpi/ic_launcher.png b/gui-android/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3c0243beb4ceab4fd710fbf8179d5f92588877 GIT binary patch literal 25294 zcmV)KK)Sz)P)<h;3K|Lk000e1NJLTq006)M006)U1ONa4_|>G0001DBdQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;uavV95h5zFea|FP#9|x;h-(ZeE-$SO<s-?Tt zW>YMQVlo*K@Z~KI(4GJN$94b1f3<pZDc4qdDW3mQPu&LpX#VqGe}4y`-rw)P_5BuK z|KWA_^BcxXk<an-WgXx54_?pz{DB|$2=kAxyY~H#weN+#-}rICs5=|~*uOp`uiNMK zkiHk{=kt%!TmAJ>r+t_5edBwS@1I!TrGH*TU%OvlNR=q<%)6r5i6Q#;cl$g+{QMbu zoxgqTyf4J^UNOg~9Dgi{fc#;3KR$c^Yk>X`<RAZXe~$jofBh-=HomXNKgF_qW5hrH z_8TGpeehq1f4On|`9$`|ZyX=iUzYRzbMJ2Vp3mw=Dnzt=E6Tec(b3QF#!1NI`?11D z<xl3{^?h_cnje0VoK0m;K33?#i2ijUg&jt?;k?f)EFLl0vC3z&W%0e%Vzq87Do;rt z;aZJ7?%2rXvg2apW&8Oo;oY~t`>oKp^A5b#0v996|N6uIyKnwCAMReoHU!^(#){`M zRW6UA%;|65MMA>;<}JSf|M>W(-~UoSlqwm_FU*Yv4nIGam^u8jw&Kfk<b9dXpRNe5 z?(YQ%5%<nKOo(K_mk@I(!B?{y0"Xz=6~lT9)Za<<JwT8goltJX~S=4Wbn@3m~j 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%0A3FH@QV2 z1*M%)Sr@|2@$F9GQeLMl#tMkRvxLYp!o{*))DwV3FQl@$jDaW=%fzBv_vZwnC+zSq zZ5pa;57s=!Nx1cC?wHb8=qr^_rT8=cj1&CbPvwZ*{6`%yy?Zbe88gPR*D`kSedV~R z0{BCgA66o0#!7nUWQ4M}uXJ2x))m{6u4<p%*v;S`4VDT1ymdgvm~B4do&{<B12~U4 z04S>ix1p|NTYYbvfPGTnAwT9Uutw)&-|E40Uzyso2F{r>W{2zCm9dLV=4Yy7;bv`~ z#c-9=Oi~Vi8gW2nOo(WUDBwUcBx6BBcZEeJpx|dRK;;0&e8?rP*zKsg7G_H?pF3Of z)PeHNEYu3_R$oI#AdcZ3;5J|3&5vnxs6(;S>iue)I1jkYMXp#~BO^IKHCVe^9<Aje zE-q8|Y}H(z{&MkKgkpkX!pypyd;yj*7?IliOa`bv;x?D~$9#)I;<3EkESP`;?x2p4 z)-z>eCGE?tl1(xU@A59o{5_6;Y^P~)tkpQCuFmO{P2S`0u?-^IRE-bn8jP)kPMm}7 zYU^5dRc&GQ>^AOVu)JV~C}NqtJUESCgyZbblLe&=+2$&j_?BGZHmTDB)V0{pLiWE{ zF}iQ5o<bT7A)WxdyIkRAjO{eFXb>LKdtHPDX6!Q(q(`HKJhLtDye|;ClHm(a#AP!w zJh}t~<f8MK*K(tSQ_M;nSti_%j2Sb6LlR^IwIsy<Y|dxI2fXLB;4^6fR>-5SwE~qB z4-QU()y<{tO63xbsn(xdq04nNa{^9smUWf{xBR%*l$%^--`>PI5BShJ!kPGfE%FAM zlnHa&$O(xg-OQcasTS5hyCSs3_A#FsGj@T5&;e+St^ajRKL0be;NRo#vJJEZuyPyV ziwWl8CQvq*J#K-Zu__QnW8C9A{E>il4gMB?L4dZ-LbJaD4+;(TJ+AT3`4<f6vn#(N zpeg2^iQB2V#fpGH_z;08TvY2;@)`-n*zvzI!AvlCmg=>b3g93D+5u(!PoMb=+2S%6 z<qA*4`6$PkRH~mGKtm3T0@P$<aP<7Ex80!0*cs)R@g6I{h!s2G?naT)03j*2xyH8{ zQ0hDv5;{$K#G+qOJ`N*XpEhktMLm#7$y8{&85vr_vymf^+vZH}Ff<_I3}a#OEw)va zLnr%015}P<$R*z6qBJ3qi^)Q0NhmczE9~<iVCLq<)x~sutG1CK0jD@Cpt_6futb+e zjdf}q1V11kV}nbF$dhSuJQ~)`6(B)|PlKii+$a*p44E;vS$#$#tJmv4tMUWNX8COt zEhdZ|WnJZL5UlQ%|5=>Rf6E?N`4~5UpjL91(6sqP;-33GY5~U3GFcXbv<izFb(7zd zE1%U&>sH&P09s1J!UCS9Nh+cGrWQWSggsZRkq9LB88DRM%7B$iuD5)YQ)8EX2u	 z+w{QQS2c%eK8*`1$cLA?$euW(>I!S8O04!osu}{X9PoJ&tge$xSismz)TsO_kAOtp z#mB!ArybG}U+X(Q-xKp>mM4)5OCl5A>YPLhC0`V_s2Q<PLGr~}xf;Hi{T+oiu$EY& zoJy#Yd;Js!7;%aB_%YwJ(O_!5zp@Bp^&#s(u3H#sCny^Se_V_XZvQ|#B&<XPia*P% zBSglcbn@)PjdtXjs$-Ecu~Id2LIM<ugc*s@jmuB%%VKn|mUQGocPu|;LLy5*%>p~B zJd&Tn09(Ar-(diBWQ<|#Fn_cYhP4zgrj~f&;GV8DYrT1XFfc3JLA|PYY1tB}G;#%@ zm5#~?n?YHr9MA5F^z1=VPHL&d-OZUZ6Jh*@ocLIRw04^M?(cGMdbysith4KN@M4nw z*h)AT!HPNiT(O}nr^8epzgh^JY5_$tHbN*T(3%=iQPl`r`2jH7lgE_HL(Cm_W@<OA zWNCQL0F-iCr^==V<s(uK3ahM!btbMTz!On~5XFp~5h<y&v?{lNGz*$@i(NQXOOz{4 zQjwrM)&O(HY;v0$T(#uGjJZImE*w=oXym`Tv$e_=GB{n}#g387@Tu~rs?VHTI%Dw& z%ch6R7Iin^xqO8RU{;n|t7^m*<s3WD@<$8(xh9%GX8z}5;*#{3IpN)NNC#EEQ<8y| zolmYxvErTkj|*aBw)lwe@DJIg+$CX{E>wioW7f7D*J54I0m9tnYGwg;U}1hzQP+{K z0~VF6BnM8qvY>HZt2-;QRe8#DYrIA7cIn*<2Ut|dIT3-4Kw9ELX75*E`JcuCEsDDo zIWEXpt_Ds%_80?f@)4K#o-JXD%ttw0P7ZM2D)&&YB<e_!K2QVe8is0|#Sg|oNnPqy z9SFdp^rn`7RUIyET}9EqEpDk_OHHZy@-oXQ4RL}Iv9RY5o}IFlKqh}LJw@?;G?A2Z z`9epqy7&I!y{0+0`3~RX_Z^dD&Z*36D+9}4SNC*ztpSg75^+MYyCy+PZeGrTrOsQ{ z_WN_GNxfPogOi!z)W#KYy=qnF;vPzug}pneL_Z_bHJ*Hm21`T?*q4P3+TNh5L8EOl zkc&*4CX(Q8Y#vy_lewFQF2Y*-+z{tedi0rd$?M%-wZKg<7DHdedbHzjRc)o9C#NlU z+**m$SFyk~V7ZmG0-JLZnFG)cM7H=&T#{|2Bcx<EQ(4#M1lA~->;Z(im_HR23uO&Z zB12w{G>N>+x@)SV0KR+bcNwAxi1~;c*7<ZuNo#1iOEYmDNfpZSLkNS5bGG$udd4Za zsxWVAlqzMNp4&k5Z4R&Oo`8zkqaDVbo2_Z;D<cXbZX!Aoo+xx_hs#<Jc{AscV}Dj1 z-%(Zquox-N4)motEDarVg&#AaiQ=KN3nP{X>K&kEdlnILbE3*E=tHcoYCSULG){7x z-B$zM%E_d2aVd3zyKjS=SKGIm*)6McjPQPPC+HS~slKgPQxUQ$wzGP6vaF0A83s*c z>yOMH9nT?sA>9OQ?|Cl$lB)Wl=1Uv{Z1ZFOHdBzut*x>+HiI`-g-spOdZ{v%(qN0- zU~@?4_8`wv)yQ0KSE*zwYip)*;?Z4as~kEQa;{yXd2x7hIrqL$rsg74R$`PHu_&l0 z=MI#>M81IeQrm}98Z9BVZT*U|>Xxbgb;$>2T<2<Se-<nY$5$P~cu=)CkUM9dTAiRA zq@>DsOwFNH1SZeU)#UcHd$mlbsyaMD=~XSbmP|WyAPKF=>lHLtYEKt6aB5T7(j6&_ zA$bBlCpD0zQc@}3clEeaV#c-~SLI_19kJh+j}vpBD+@k)COfX{C6}Alxo0z#Tt?Y4 zM%7}1uI*8E&#Q8BkwAb1ESpl*Cd2YtHJ#aVN84kd9a3%?;7eX-CfQtt;AS$lpNL+2 znbRap$plC8WhzDyGqIy3%I@&1j)glmSoF2$j#z&E@ylKN-!UZ2m@#KAOKr-_KXW=b zZqA}>1T43R(oWx0JJ5rv;XnsT>-B*OQ|m@(CugXNEO*(Dy9}tj4ch*_G=VP_Kx&&X z)zar`eynt8i6p^ghK4LU%q8f$v|=Me-PQbaMnIPn_{`Ym7P+J`x^`;}2LA`OQ}5Gf zZo5U)+R#eggsII2Ec$X~Zvd9mS_LapgQlx8Xi>|*oMum*S|YEdlhw?Z?_~7K{?vSd zVyG7KvMNt1wy{>n%9HzK2x(jK*WBJLUxYGME&29D03pLLWXKuLa*hr|KH?D*2OGjk zH4Z=#8FR@e@`VX?Hxgt{Kr=P+M=s41?X($<J=LmqewC$m7$?)oB?r+Up|j31!Xb7P zE5}0%G%E`(P^+Jf1>y1<@839a!)5stDioSPgq}QmAAQm4%AKHJDPt7Xamo-#IKgWy zvr9~qi6!;wg;8?<1@VA$DVe7N)h@P=RqcQ02OLR#pjt1ma_T+XYIH(7ezP2uE6=QP zMoJgqhic5Osz)o=r)xpq9W}~p*^9AfURx1+MJS@*S~M3u=KusWEU1j_3|BQt^?4JT z^jIRN?O>>GnqGXpA4|HFIt`QR<mwv0pzN>noKU)$?dyfcVwL|^k5ezqIaaYEb>d6_ zq_XqWI2_HY(@?I2HclYNn%1+}Wp1N~ayD~UJ%w^IxNP0{4my=eGbp7{|IO?fb`y$H zNGG#Z&6qu4kC9c5U+iIM6n-KGD4d7uB<ew<6iM=&$=j+X(1(`UWiC`<@VXX8GkNow z#R$tbVG#vFd{VmtSJ}d=LRO3JoNpKBmO<BdI$y@(OJ#}}(2~vExdRz^_Lyj=aT3dC zPf5t}37N^?jnv`VX%>|wVTR&1nhqoG*wO7&ibEXzUO%>;v4XmCyKuHn{LAgAX9=8D z%Mt1%rQA7<^$`tsTs3o2w+gSvzRfaq^sW57+deFy<&4-eHOo_9wmYgJiVDUkNGpYc zL+&Jyp2Kj}wK?JHPstd~Ebdy7GE*nIEdiP<+>ilrpLN?o$So{cJYhd|PAbkkw{i&C z+PW6yIFPc(q-%pgI0>qf4{j`RqYg^tPBf|N0Cy!%HA<}nVayiBPRpO_$*C$+SI@zO zs{4!#q!tFqYKu5?I3TBh4bjRvyc`_qsXF&x+m@$cPx^?b=#n!Qx|ZkMF);YK!{o`F z2(4^oSJthbEwHNwj9%a}cuvldiwCc7XemFAwwa8Ju@+alN-K+d5IR#^nK+oL-v!tX zaJ~={U8w<W|Nml70FIhPCV>%)an+}Si)RoMGZ(DqupYLOhhM~y6+-4L(<daBr9-}x zqD#)0*M>*)1&pQ6+R?Buh0cO@N%?Qu$$C^R3vw%qT)eVpzoIIe+(fpbk!My5*VK3h z#%X^Zex}`Y+N*haq<BheWn8_Dq@*{UkjgtWwN6*v0G=G921sikA|Vs#1;(_WiQm_U zkf^J%YnR67W=eHBiDwZ(U(Qs0+P10&>Jm(z(@NBW4QZ&YIrIoD){-5d|GKGe5imXb z{?r1HuACV!cVaEGWn_KctQ@I`$<V@-$Yd6*YEZdtBlmce`F|5dLM%KxXCyGMP5$Z{ z&WV%H8=FCR5^`MsUqWeRqqzcvE9RuCb&rhwu%2XJC2SiCv&`)kC=1EOcE(CMhe62! zD1;`B&=Wl;L2yrdYR4l=_#vwajQF+Wx*(fRNyu%<mpXGbu47fT*1WcA*&a=r#Eh*w zE)S9KIYf!T(u~{|o=c-b3hug%D}2(kE+`iSF|(#ncA(j<1hDx}nGEMN7An;W!StnR zS><V}misGmnYqshgkGX+uzATh&8@4`wyl!dJL@{)f{HdElbYMNcLu9dR3G2KzCTZ# zYCwo05JF|<xFNr1X?7ess9%9cna%tweACowW>-l~iKonLe(b`qb>ey^KOcK53U8m1 zEKER_bwKu59lBiZXC@__XE_?4O)JV`u)tn@Ve#jr5@riw<bpaIST|{;Of*8~&23_S zP_;!1kR8}fuv$!9ly$M~WcwYI2tDTVmaEQ?aY}pTlp{uxF(a3$AVs<KycCa6RC-cD zb(E8^x*dhAR-P0>8X2WFRek(hOM67wQmo$dEu%#7USoU0eOk1vYs_sXUp$@`4FVaY zo-k%W%#0ZskpKw+Eo+<#)~=dV^-0Yt8I5SuA(Zbxo@?wVW%vP_kVrOAXy+jrhgV$s z*|b*6=F$o`;v3yrk*YNFZ2N9eOcIByqbz9b3B#d~B*vC3$^opY4S$;&?Yk`a6X#~M zMTlNGq{YnM2T#U8QZc*de8SXHtTGHU5(iS(hs-M1A@G0}T^hDA>e&?A8PG67qo}$` z<$25x;cccCx~(`mF7XJNA6NF0DF^%XBv94~+u8!U%KBhsd$=Xn(=71vU0>}xU|7}a z!Rc!kw=%bPSXpBFOg4uVe=nBlLYrlL>6B%%11Awgs7y>E8u%i$li41G8*wxZdLrmK zwVmh8Rv;9Wa3*py+Np}QoRHkXA}bntUD&Ad?y0z=(xZCTWt2HGvPV0$It<!sb(Yi; zmquF_|A~w`Xd7*ED=lB}I9*nPv8TJt?=nGkV(AbUw8M~;0aH1ZnebufK#x8lGqxEp zvU_Fng~97$j;utRlwhUG&dMkv+O(N7C1=izv8-bB#qs*ZlG#E-FmzgZ6)7Z>Q|(Ju zQ&k8!<ctcWR+6YC#DdFEgBQ$#w3wSt=1xRVHcK(qr67S(*VHIV{IVhgl--R~IR2iv z%G{pgVxUx$2-!ZbY3??OXc3|Cn6W7)beW_%*hPuTsp55waI7pQn-fcfnaHGrj3^y8 zF6u2nYpFd;nOwsB5VBDPPvw@aj3Z5{98!61Q#c%9du98^{sEy24#;j)<8^h`y^-6d z(zgM(0004|Nkl<Z<;ojpB&hoRMM6<5IV`dsBa<_}y}?S>!ey2$@5vE}EL$R#C(@A7 z*~*<38PuF12~!5Lgm)%@MEQPvZ8K<XB_MGEUXd}ENoR&9{<O;ARc+t^@ux)^mP;Ap zTdGnj_>kv-d&c1mgbPE{#`3B?XO~4;xfGl4a$;gDM^M~?$R@$%@i7bIPq7qN#RCj$ z-D8+D#AC`>6oCS#Asf=8LqNiau>j%?Iz*0ujZeV;-`BY&Aqc}jcvA*+y#E!wfM|Uc z>W`!$Nx>5^9j19SyI&>%H@uK!+Y_&%CMj47H?8CvsHn;rr0HlGz*g8zk59o`)b`&o zhlDqFB`pCzc%op`Wu7hF`nkd;h9c8v!v#F<%Xwz-mE18%>TdaF(ZyA@Gmf$Xw92Gw zl3TYqBv(Lw0O>tTGPFG5f)Q_IWMm18{K8uF2J+Bn#vL=V*!@-{oQ=+vYzV>*<Aeeo zmYnOP{$cl2=M{@cf*Pdd@r$0Vbxg~$`J?U<B<R4Q2}NkE`bvdP%fA?qnguXy?x3Y( l6#18~f(Nb!&Oe5e{{S+ipSM6D5xM{X002ovPDHLkV1hseSMC4+ literal 0 HcmV?d00001 diff --git a/gui-android/res/values/colors.xml b/gui-android/res/values/colors.xml new file mode 100644 index 0000000..b8fda67 --- /dev/null +++ b/gui-android/res/values/colors.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#3F51B5</color> + <color name="colorPrimaryDark">#303F9F</color> + <color name="colorAccent">#3FB551</color> +</resources> diff --git a/gui-android/res/values/strings.xml b/gui-android/res/values/strings.xml new file mode 100644 index 0000000..d975d5f --- /dev/null +++ b/gui-android/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Drawterm</string> +</resources> diff --git a/gui-android/res/values/styles.xml b/gui-android/res/values/styles.xml new file mode 100644 index 0000000..ccb41fa --- /dev/null +++ b/gui-android/res/values/styles.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="android:Theme.NoTitleBar"> + <!-- Customize your theme here. --> + </style> + +</resources> diff --git a/gui-fbdev/Makefile b/gui-fbdev/Makefile new file mode 100644 index 0000000..cce6ef0 --- /dev/null +++ b/gui-fbdev/Makefile @@ -0,0 +1,12 @@ +ROOT=.. +include ../Make.config +LIB=libgui.a + +OFILES=\ + fbdev.$O\ + +default: $(LIB) +$(LIB): $(OFILES) + $(AR) r $(LIB) $(OFILES) + $(RANLIB) $(LIB) + diff --git a/gui-fbdev/fbdev.c b/gui-fbdev/fbdev.c new file mode 100644 index 0000000..fa1ca2a --- /dev/null +++ b/gui-fbdev/fbdev.c @@ -0,0 +1,673 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#include <draw.h> +#include <memdraw.h> +#include <keyboard.h> +#include <cursor.h> +#include "screen.h" + +#undef long +#undef ulong + +#include <linux/fb.h> +#include <linux/input.h> + +uchar* fbp; +Memimage* screenimage; +Memimage* backbuf; +Rectangle screenr; +char* snarfbuf; +struct fb_fix_screeninfo finfo; +struct fb_var_screeninfo vinfo; +int *eventfds = NULL; +int neventfds; +Point mousexy; +char shift_state; +int ttyfd; +char* tty; +char hidden; +int devicesfd; +ulong chan; +int depth; + +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <limits.h> + +#include <fcntl.h> +#include <termios.h> +#include <poll.h> +#include <sys/ioctl.h> +#include <linux/keyboard.h> +#include <signal.h> + +#include <termios.h> + +#define ulong p9_ulong + +int code2key[] = { + Kesc, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\x08', + '\x09', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', + Kctl, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', Kshift, + '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +int code2key_shift[] = { + Kesc, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\x08', + '\x09', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', + Kctl, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '\"', '~', Kshift, + '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', Kshift, '*', Kalt, + ' ', Kcaps, KF|1, KF|2, KF|3, KF|4, KF|5, KF|6, KF|7, KF|8, KF|9, KF|10, + Knum, Kscroll, + '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', +}; + +Memimage *gscreen; +char *snarfbuf = nil; + +int onevent(struct input_event*); +void termctl(uint32_t o, int or); +void ctrlc(int sig); + +void +_fbput(Memimage *m, Rectangle r) { + int y; + + for (y = r.min.y; y < r.max.y; y++){ + long loc = y * finfo.line_length + r.min.x * depth; + void *ptr = m->data->bdata + y * m->width * 4 + r.min.x * depth; + + memcpy(fbp + loc, ptr, Dx(r) * depth); + } +} + +Memimage* +fbattach(int fbdevidx) +{ + Rectangle r; + char devname[64]; + size_t size; + int fd; + + /* + * Connect to /dev/fb0 + */ + snprintf(devname, sizeof(devname) - 1, "/dev/fb%d", fbdevidx); + if ((fd = open(devname, O_RDWR)) < 0) + goto err; + + if (ioctl(fd, FBIOGET_VSCREENINFO, &(vinfo)) < 0) + goto err; + + switch (vinfo.bits_per_pixel) { + case 32: + chan = XRGB32; + depth = 4; + break; + case 16: + chan = RGB16; + depth = 2; + break; + default: + goto err; + } + + if (ioctl(fd, FBIOGET_FSCREENINFO, &(finfo)) < 0) + goto err; + + size = vinfo.yres_virtual * finfo.line_length; + if ((fbp = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)0)) < 0) + goto err; + /* + * Figure out underlying screen format. + */ + r = Rect(0, 0, vinfo.xres_virtual, vinfo.yres_virtual); + + screenr = r; + + screenimage = allocmemimage(r, chan); + backbuf = allocmemimage(r, chan); + return backbuf; + +err: + return nil; +} + +int +eventattach() +{ + char eventfile[PATH_MAX] = ""; + char line[PATH_MAX]; + FILE *devices; + char *ptr; + + neventfds = 0; + devices = fopen("/proc/bus/input/devices", "r"); + if (devices == NULL) + return -1; + while (fgets(line, sizeof(line)-1, devices) != NULL) + if (line[0] == 'H') { + ptr = strstr(line, "event"); + if (ptr == NULL) + continue; + ptr[strcspn(ptr, " \r\n")] = '\0'; + snprintf(eventfile, sizeof(eventfile)-1, "/dev/input/%s", ptr); + neventfds++; + eventfds = realloc(eventfds, neventfds * sizeof(int)); + eventfds[neventfds-1] = open(eventfile, O_RDONLY); + if (eventfds[neventfds-1] < 0) + neventfds--; + } + fclose(devices); + + if (neventfds == 0) + return -1; + return 1; +} + +void +flushmemscreen(Rectangle r) +{ + int x, y, i; + Point p; + long fbloc; + int x2, y2; + + if (rectclip(&r, screenimage->r) == 0) + return; + if (Dx(r) == 0 || Dy(r) == 0) + return; + + assert(!canqlock(&drawlock)); + + memimagedraw(screenimage, r, backbuf, r.min, nil, r.min, S); + + if (hidden != 0) + return; + + p = mousexy; + + // draw cursor + for (x = 0; x < 16; x++) { + x2 = x + cursor.offset.x; + + if ((p.x + x2) < 0) + continue; + + if ((p.x + x2) >= screenimage->r.max.x) + break; + + for (y = 0; y < 16; y++) { + y2 = y + cursor.offset.y; + + if ((p.y + y2) < 0) + continue; + + if ((p.y + y2) >= screenimage->r.max.y) + break; + + i = y * 2 + x / 8; + fbloc = ((p.y+y2) * screenimage->r.max.x + (p.x+x2)) * depth; + + if (cursor.clr[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0xFFFF; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFFFFFFFF; + break; + } + } + + if (cursor.set[i] & (128 >> (x % 8))) { + switch (depth) { + case 2: + *((uint16_t*)(screenimage->data->bdata + fbloc)) = 0x0000; + break; + case 4: + *((uint32_t*)(screenimage->data->bdata + fbloc)) = 0xFF000000; + break; + } + } + } + } + + _fbput(screenimage, r); +} + +static void +fbproc(void *v) +{ + struct input_event data; + char buf[32]; + struct pollfd *pfd; + int r; + int ioctlarg; + + pfd = calloc(3, sizeof(struct pollfd)); + pfd[0].fd = ttyfd; // for virtual console switches + pfd[0].events = POLLPRI; + pfd[1].fd = 0; // stdin goes to nowhere + pfd[1].events = POLLIN; + pfd[2].fd = open("/proc/bus/input/devices", O_RDONLY); // input hotplug + if (pfd[2].fd < 0) + panic("cannot open /proc/bus/input/devices: %r"); + pfd[2].events = POLLIN; + +TOP: + while(read(pfd[2].fd, buf, 31) > 0); + + pfd = realloc(pfd, sizeof(struct pollfd) * (neventfds + 3)); + for (r = 0; r < neventfds; r++) { + pfd[r+3].fd = eventfds[r]; + pfd[r+3].events = POLLIN; + } + + for(;;) { + shift_state = 6; + if (ioctl(0, TIOCLINUX, &shift_state) < 0) + panic("ioctl TIOCLINUX 6: %r"); + + r = poll(pfd, 3+neventfds, -1); + if (r < 0) + oserror(); + if (pfd[0].revents & POLLPRI) { + if ((r = read(ttyfd, buf, 31)) <= 0) + panic("ttyfd read: %r"); + buf[r] = '\0'; + if (strcmp(buf, tty) == 0) { + hidden = 0; + printf("\e[?25l"); + fflush(stdout); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } + else + hidden = 1; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + pfd[0].fd = ttyfd; + read(ttyfd, buf, 0); + } + if (pfd[1].revents & POLLIN) + read(pfd[1].fd, buf, 31); + if (pfd[2].revents & POLLIN) { + for (r = 0; r < neventfds; r++) + close(eventfds[r]); + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + goto TOP; + } + for (r = 0; r < neventfds; r++) + if (pfd[r+3].revents & POLLIN) { + if (read(pfd[r+3].fd, &data, sizeof(data)) != sizeof(data)) + panic("eventfd read: %r"); + if (onevent(&data) == 0) { + ioctlarg = 15; + if (ioctl(0, TIOCLINUX, &ioctlarg) != 0) { + ioctlarg = 4; + ioctl(0, TIOCLINUX, &ioctlarg); + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); + } else { + write(1, "\033[9;30]", 7); + } + } + } + } + + printf("\e[?25h"); + fflush(stdout); + termctl(ECHO, 1); + free(pfd); +} + +void +screensize(Rectangle r, ulong chan) +{ + gscreen = backbuf; + gscreen->clipr = ZR; +} + +void +screeninit(void) +{ + int r; + char buf[1]; + + // set up terminal + printf("\e[?25l"); + fflush(stdout); + termctl(~(ICANON|ECHO), 0); + signal(SIGINT, ctrlc); + + memimageinit(); + + // tty switching + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + if (ttyfd >= 0) { + tty = malloc(32); + r = read(ttyfd, tty, 31); + if (r >= 0) + tty[r] = '\0'; + else + tty[0] = '\0'; + close(ttyfd); + ttyfd = open("/sys/class/tty/tty0/active", O_RDONLY); + } + if (ttyfd < 0) + panic("cannot open tty active fd: %r"); + read(ttyfd, buf, 0); + hidden = 0; + + if(fbattach(0) == nil) { + panic("cannot open framebuffer: %r"); + } + + if(eventattach() < 0) { + panic("cannot open event files: %r"); + } + + screensize(screenr, chan); + if (gscreen == nil) + panic("screensize failed"); + + gscreen->clipr = screenr; + kproc("fbdev", fbproc, nil); + + terminit(); + + qlock(&drawlock); + flushmemscreen(gscreen->clipr); + qunlock(&drawlock); +} + +Memdata* +attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen) +{ + *r = gscreen->clipr; + *chan = gscreen->chan; + *depth = gscreen->depth; + *width = gscreen->width; + *softscreen = 1; + + gscreen->data->ref++; + return gscreen->data; +} + +void +getcolor(ulong i, ulong *r, ulong *g, ulong *b) +{ + ulong v; + + v = cmap2rgb(i); + *r = (v>>16)&0xFF; + *g = (v>>8)&0xFF; + *b = v&0xFF; +} + +void +setcolor(ulong i, ulong r, ulong g, ulong b) +{ + /* no-op */ + return; +} + +char* +clipread(void) +{ + if(snarfbuf) + return strdup(snarfbuf); + return nil; +} + +int +clipwrite(char *buf) +{ + if(snarfbuf) + free(snarfbuf); + snarfbuf = strdup(buf); + return 0; +} + +void +guimain(void) +{ + cpubody(); +} + +void +termctl(uint32_t o, int or) +{ + struct termios t; + + tcgetattr(0, &t); + if (or) + t.c_lflag |= o; + else + t.c_lflag &= o; + tcsetattr(0, TCSANOW, &t); +} + +void +ctrlc(int sig) { +} + +int +onevent(struct input_event *data) +{ + Rectangle old, new; + ulong msec; + static int buttons; + static Point coord; + static char touched; + static Point startmousept; + static Point startpt; + int key; + static ulong lastmsec = 0; + + if (hidden != 0) + return -1; + + msec = ticks(); + + old.min = mousexy; + old.max = addpt(old.min, Pt(16, 16)); + + buttons &= ~0x18; + + switch(data->type) { + case 3: + switch(data->code) { + case 0: + coord.x = data->value; + break; + case 1: + coord.y = data->value; + break; + case 0x18: + case 0x1c: + if (data->value == 0) + touched = 0; + else if (data->value > 24) { + touched = 1; + startmousept = coord; + startpt = mousexy; + } + break; + default: + return -1; + } + if (touched) + mousexy = addpt(startpt, divpt(subpt(coord, startmousept), 4)); + break; + case 2: + switch(data->code) { + case 0: + mousexy.x += data->value; + break; + case 1: + mousexy.y += data->value; + break; + case 8: + buttons |= data->value == 1? 8: 16; + break; + default: + return -1; + } + break; + case 1: + switch(data->code) { + case 0x110: + if (data->value == 1) + buttons |= 1; + else + buttons &= ~1; + break; + case 0x111: + if (data->value == 1) + buttons |= shift_state & (1 << KG_SHIFT)? 2: 4; + else + buttons &= ~(shift_state & (1 << KG_SHIFT)? 2: 4); + break; + case 0x112: + if (data->value == 1) + buttons |= 2; + else + buttons &= ~2; + break; + default: + if (hidden) + return 0; + if (data->code > 0 && data->code <= nelem(code2key)) { + if (shift_state & (1 << KG_SHIFT)) + key = code2key_shift[data->code-1]; + else + key = code2key[data->code-1]; + if (key == Kshift) + return -1; + kbdkey(key, data->value); + return 0; + } + switch(data->code) { + case 87: + kbdkey(KF|11, data->value); + break; + case 88: + kbdkey(KF|12, data->value); + break; + case 96: + kbdkey('\n', data->value); + break; + case 97: + kbdkey(Kctl, data->value); + break; + case 98: + kbdkey('/', data->value); + break; + case 100: + kbdkey(Kalt, data->value); + break; + case 102: + kbdkey(Khome, data->value); + break; + case 103: + kbdkey(Kup, data->value); + break; + case 104: + kbdkey(Kpgup, data->value); + break; + case 105: + kbdkey(Kleft, data->value); + break; + case 106: + kbdkey(Kright, data->value); + break; + case 107: + kbdkey(Kend, data->value); + break; + case 108: + kbdkey(Kdown, data->value); + break; + case 109: + kbdkey(Kpgdown, data->value); + break; + case 110: + kbdkey(Kins, data->value); + break; + case 111: + kbdkey(Kdel, data->value); + break; + } + return 0; + } + break; + default: + return -1; + } + + if (mousexy.x < screenimage->r.min.x) + mousexy.x = screenimage->r.min.x; + if (mousexy.y < screenimage->r.min.y) + mousexy.y = screenimage->r.min.y; + if (mousexy.x > screenimage->r.max.x) + mousexy.x = screenimage->r.max.x; + if (mousexy.y > screenimage->r.max.y) + mousexy.y = screenimage->r.max.y; + + new.min = mousexy; + new.max = addpt(new.min, Pt(16, 16)); // size of cursor bitmap + + combinerect(&new, old); + new.min = subpt(new.min, Pt(16, 16)); // to encompass any cursor->offset + + qlock(&drawlock); + flushmemscreen(new); + qunlock(&drawlock); + + if ((msec - lastmsec) < 10) + if (data->type != 1) + return 0; + + lastmsec = msec; + + absmousetrack(mousexy.x, mousexy.y, buttons, msec); + + return 0; +} + +void +mouseset(Point p) +{ + qlock(&drawlock); + mousexy = p; + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +setcursor(void) +{ + qlock(&drawlock); + flushmemscreen(screenr); + qunlock(&drawlock); +} + +void +titlewrite(char* buf) +{ +} + diff --git a/kern/devaudio-alsa.c b/kern/devaudio-alsa.c new file mode 100644 index 0000000..30dfd60 --- /dev/null +++ b/kern/devaudio-alsa.c @@ -0,0 +1,108 @@ +/* + * ALSA + */ +#include <alsa/asoundlib.h> +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" +#include "devaudio.h" + +enum +{ + Channels = 2, + Rate = 44100, + Bits = 16, +}; + +static snd_pcm_t *playback; +static snd_pcm_t *capture; +static int speed = Rate; + +/* maybe this should return -1 instead of sysfatal */ +void +audiodevopen(void) +{ + if(snd_pcm_open(&playback, "default", SND_PCM_STREAM_PLAYBACK, 0) < 0) + error("snd_pcm_open playback"); + + if(snd_pcm_set_params(playback, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params playback"); + + if(snd_pcm_prepare(playback) < 0) + error("snd_pcm_prepare playback"); + + if(snd_pcm_open(&capture, "default", SND_PCM_STREAM_CAPTURE, 0) < 0) + error("snd_pcm_open capture"); + + if(snd_pcm_set_params(capture, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, speed, 1, 500000) < 0) + error("snd_pcm_set_params capture"); + + if(snd_pcm_prepare(capture) < 0) + error("snd_pcm_prepare capture"); +} + +void +audiodevclose(void) +{ + snd_pcm_drain(playback); + snd_pcm_close(playback); + + snd_pcm_close(capture); +} + +void +audiodevsetvol(int what, int left, int right) +{ + if(what == Vspeed){ + speed = left; + return; + } +} + +void +audiodevgetvol(int what, int *left, int *right) +{ + if(what == Vspeed){ + *left = *right = speed; + return; + } + + *left = *right = 100; +} + +int +audiodevwrite(void *v, int n) +{ + snd_pcm_sframes_t frames; + int tot, m; + + for(tot = 0; tot < n; tot += m){ + do { + frames = snd_pcm_writei(playback, v+tot, (n-tot)/4); + } while(frames == -EAGAIN); + if (frames < 0) + frames = snd_pcm_recover(playback, frames, 0); + if (frames < 0) + error((char*)snd_strerror(frames)); + m = frames*4; + } + + return tot; +} + +int +audiodevread(void *v, int n) +{ + snd_pcm_sframes_t frames; + + do { + frames = snd_pcm_readi(capture, v, n/4); + } while(frames == -EAGAIN); + + if (frames < 0) + error((char*)snd_strerror(frames)); + + return frames*4; +} diff --git a/main.c b/main.c index 0d74b2e..e66c81a 100644 --- a/main.c +++ b/main.c @@ -54,6 +54,7 @@ main(int argc, char **argv) if(bind("#U", "/root", MREPL) < 0) panic("bind #U: %r"); bind("#A", "/dev", MAFTER); + bind("#N", "/dev", MAFTER); bind("#C", "/", MAFTER); if(open("/dev/cons", OREAD) != 0) -- 2.31.1.windows.1
applied! thanks! -- cinap