Xorg: make gl view client abstract
This commit is contained in:
@ -40,6 +40,7 @@ import android.os.Build;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("JniMissingFunction")
|
||||||
class AccelerometerReader implements SensorEventListener
|
class AccelerometerReader implements SensorEventListener
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -48,7 +49,7 @@ class AccelerometerReader implements SensorEventListener
|
|||||||
public static final GyroscopeListener gyro = new GyroscopeListener();
|
public static final GyroscopeListener gyro = new GyroscopeListener();
|
||||||
public static final OrientationListener orientation = new OrientationListener();
|
public static final OrientationListener orientation = new OrientationListener();
|
||||||
|
|
||||||
public AccelerometerReader(Activity context)
|
public AccelerometerReader(Context context)
|
||||||
{
|
{
|
||||||
_manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
_manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||||
}
|
}
|
||||||
@ -79,11 +80,11 @@ class AccelerometerReader implements SensorEventListener
|
|||||||
_manager.registerListener(gyro, _manager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_GAME);
|
_manager.registerListener(gyro, _manager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_GAME);
|
||||||
}
|
}
|
||||||
if( (Globals.AppUsesOrientationSensor) && _manager != null &&
|
if( (Globals.AppUsesOrientationSensor) && _manager != null &&
|
||||||
_manager.getDefaultSensor(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ? Sensor.TYPE_GAME_ROTATION_VECTOR : Sensor.TYPE_ROTATION_VECTOR) != null )
|
_manager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR) != null )
|
||||||
{
|
{
|
||||||
Log.i("SDL", "libSDL: starting orientation sensor");
|
Log.i("SDL", "libSDL: starting orientation sensor");
|
||||||
_manager.registerListener(orientation, _manager.getDefaultSensor(
|
_manager.registerListener(orientation, _manager.getDefaultSensor(
|
||||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ? Sensor.TYPE_GAME_ROTATION_VECTOR : Sensor.TYPE_ROTATION_VECTOR),
|
Sensor.TYPE_GAME_ROTATION_VECTOR),
|
||||||
SensorManager.SENSOR_DELAY_GAME);
|
SensorManager.SENSOR_DELAY_GAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -304,8 +305,7 @@ class AccelerometerReader implements SensorEventListener
|
|||||||
if ( manager == null && manager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) == null )
|
if ( manager == null && manager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) == null )
|
||||||
return;
|
return;
|
||||||
manager.registerListener(gyro, manager.getDefaultSensor(
|
manager.registerListener(gyro, manager.getDefaultSensor(
|
||||||
Globals.AppUsesOrientationSensor ? Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ?
|
Globals.AppUsesOrientationSensor ? Sensor.TYPE_GAME_ROTATION_VECTOR : Sensor.TYPE_GYROSCOPE),
|
||||||
Sensor.TYPE_GAME_ROTATION_VECTOR : Sensor.TYPE_ROTATION_VECTOR : Sensor.TYPE_GYROSCOPE),
|
|
||||||
SensorManager.SENSOR_DELAY_GAME);
|
SensorManager.SENSOR_DELAY_GAME);
|
||||||
}
|
}
|
||||||
public void unregisterListener(Activity context,SensorEventListener l)
|
public void unregisterListener(Activity context,SensorEventListener l)
|
||||||
|
@ -151,6 +151,7 @@ import android.app.KeyguardManager;
|
|||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("ALL")
|
||||||
public class GLSurfaceView_SDL extends SurfaceView implements SurfaceHolder.Callback {
|
public class GLSurfaceView_SDL extends SurfaceView implements SurfaceHolder.Callback {
|
||||||
/**
|
/**
|
||||||
* The renderer only renders
|
* The renderer only renders
|
||||||
|
@ -69,10 +69,11 @@ import java.util.LinkedList;
|
|||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
|
import io.neoterm.xorg.NeoGLViewClient;
|
||||||
import io.neoterm.xorg.R;
|
import io.neoterm.xorg.R;
|
||||||
|
|
||||||
|
|
||||||
public class MainActivity extends Activity {
|
public class MainActivity extends Activity implements NeoGLViewClient {
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -300,7 +301,7 @@ public class MainActivity extends Activity {
|
|||||||
_videoLayout = new FrameLayout(this);
|
_videoLayout = new FrameLayout(this);
|
||||||
SetLayerType.get().setLayerType(_videoLayout);
|
SetLayerType.get().setLayerType(_videoLayout);
|
||||||
setContentView(_videoLayout);
|
setContentView(_videoLayout);
|
||||||
mGLView = new DemoGLSurfaceView(this);
|
mGLView = new NeoGLView(this);
|
||||||
SetLayerType.get().setLayerType(mGLView);
|
SetLayerType.get().setLayerType(mGLView);
|
||||||
// Add TV screen borders, if needed
|
// Add TV screen borders, if needed
|
||||||
if (isRunningOnOUYA() && Globals.TvBorders) {
|
if (isRunningOnOUYA() && Globals.TvBorders) {
|
||||||
@ -480,8 +481,18 @@ public class MainActivity extends Activity {
|
|||||||
{0, R.xml.qwerty_alt_shift, R.xml.c64, R.xml.amiga_alt_shift, R.xml.atari800}
|
{0, R.xml.qwerty_alt_shift, R.xml.c64, R.xml.amiga_alt_shift, R.xml.atari800}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Context getContext() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isKeyboardWithoutTextInputShown() {
|
||||||
|
return keyboardWithoutTextInputShown;
|
||||||
|
}
|
||||||
|
|
||||||
public void showScreenKeyboardWithoutTextInputField(final int keyboard) {
|
public void showScreenKeyboardWithoutTextInputField(final int keyboard) {
|
||||||
if (!keyboardWithoutTextInputShown) {
|
if (!isKeyboardWithoutTextInputShown()) {
|
||||||
keyboardWithoutTextInputShown = true;
|
keyboardWithoutTextInputShown = true;
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -897,6 +908,11 @@ public class MainActivity extends Activity {
|
|||||||
//Log.d("SDL", "updateScreenOrientation(): screen orientation: " + rotation + " inverted " + AccelerometerReader.gyro.invertedOrientation);
|
//Log.d("SDL", "updateScreenOrientation(): screen orientation: " + rotation + " inverted " + AccelerometerReader.gyro.invertedOrientation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initScreenOrientation() {
|
||||||
|
setScreenOrientation();
|
||||||
|
}
|
||||||
|
|
||||||
public void setText(final String t) {
|
public void setText(final String t) {
|
||||||
class Callback implements Runnable {
|
class Callback implements Runnable {
|
||||||
MainActivity Parent;
|
MainActivity Parent;
|
||||||
@ -991,6 +1007,11 @@ public class MainActivity extends Activity {
|
|||||||
return (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) || Globals.OuyaEmulation;
|
return (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) || Globals.OuyaEmulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NeoGLView getGLView() {
|
||||||
|
return mGLView;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isCurrentOrientationHorizontal() {
|
public boolean isCurrentOrientationHorizontal() {
|
||||||
if (Globals.AutoDetectOrientation) {
|
if (Globals.AutoDetectOrientation) {
|
||||||
// Less reliable way to detect orientation, but works with multiwindow
|
// Less reliable way to detect orientation, but works with multiwindow
|
||||||
@ -1038,7 +1059,7 @@ public class MainActivity extends Activity {
|
|||||||
return _videoLayout;
|
return _videoLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
DemoGLSurfaceView mGLView = null;
|
NeoGLView mGLView = null;
|
||||||
private static AudioThread mAudioThread = null;
|
private static AudioThread mAudioThread = null;
|
||||||
|
|
||||||
private TextView _tv = null;
|
private TextView _tv = null;
|
||||||
|
13
Xorg/src/main/java/io/neoterm/NeoGLView.java
Normal file
13
Xorg/src/main/java/io/neoterm/NeoGLView.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package io.neoterm;
|
||||||
|
|
||||||
|
import io.neoterm.xorg.NeoGLViewClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class NeoGLView extends DemoGLSurfaceView {
|
||||||
|
public NeoGLView(NeoGLViewClient client) {
|
||||||
|
super(client);
|
||||||
|
}
|
||||||
|
}
|
@ -77,6 +77,7 @@ import android.content.pm.PackageManager;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import io.neoterm.xorg.NeoGLViewClient;
|
||||||
import io.neoterm.xorg.R;
|
import io.neoterm.xorg.R;
|
||||||
|
|
||||||
|
|
||||||
@ -537,7 +538,7 @@ public class Settings
|
|||||||
Globals.ScreenFollowsMouse ? 1 : 0 );
|
Globals.ScreenFollowsMouse ? 1 : 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Apply(MainActivity p)
|
static void Apply(NeoGLViewClient p)
|
||||||
{
|
{
|
||||||
setEnvVars(p);
|
setEnvVars(p);
|
||||||
nativeSetVideoDepth(Globals.VideoDepthBpp, Globals.NeedGles2 ? 1 : 0, Globals.NeedGles3 ? 1 : 0);
|
nativeSetVideoDepth(Globals.VideoDepthBpp, Globals.NeedGles2 ? 1 : 0, Globals.NeedGles3 ? 1 : 0);
|
||||||
@ -577,7 +578,7 @@ public class Settings
|
|||||||
Globals.TouchscreenKeyboardTransparency,
|
Globals.TouchscreenKeyboardTransparency,
|
||||||
Globals.FloatingScreenJoystick ? 1 : 0,
|
Globals.FloatingScreenJoystick ? 1 : 0,
|
||||||
Globals.AppTouchscreenKeyboardKeysAmount );
|
Globals.AppTouchscreenKeyboardKeysAmount );
|
||||||
SetupTouchscreenKeyboardGraphics(p);
|
SetupTouchscreenKeyboardGraphics(p.getContext());
|
||||||
for( int i = 0; i < Globals.RemapScreenKbKeycode.length; i++ )
|
for( int i = 0; i < Globals.RemapScreenKbKeycode.length; i++ )
|
||||||
nativeSetKeymapKeyScreenKb(i, SDL_Keys.values[Globals.RemapScreenKbKeycode[i]]);
|
nativeSetKeymapKeyScreenKb(i, SDL_Keys.values[Globals.RemapScreenKbKeycode[i]]);
|
||||||
if( Globals.TouchscreenKeyboardSize == Globals.TOUCHSCREEN_KEYBOARD_CUSTOM )
|
if( Globals.TouchscreenKeyboardSize == Globals.TOUCHSCREEN_KEYBOARD_CUSTOM )
|
||||||
@ -604,7 +605,7 @@ public class Settings
|
|||||||
Globals.TouchscreenCalibration[2], Globals.TouchscreenCalibration[3]);
|
Globals.TouchscreenCalibration[2], Globals.TouchscreenCalibration[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setEnvVars(MainActivity p)
|
static void setEnvVars(NeoGLViewClient p)
|
||||||
{
|
{
|
||||||
String lang = new String(Locale.getDefault().getLanguage());
|
String lang = new String(Locale.getDefault().getLanguage());
|
||||||
if( Locale.getDefault().getCountry().length() > 0 )
|
if( Locale.getDefault().getCountry().length() > 0 )
|
||||||
@ -613,11 +614,11 @@ public class Settings
|
|||||||
nativeSetEnv( "LANG", lang );
|
nativeSetEnv( "LANG", lang );
|
||||||
nativeSetEnv( "LANGUAGE", lang );
|
nativeSetEnv( "LANGUAGE", lang );
|
||||||
// TODO: get current user name and set envvar USER, the API is not availalbe on Android 1.6 so I don't bother with this
|
// TODO: get current user name and set envvar USER, the API is not availalbe on Android 1.6 so I don't bother with this
|
||||||
nativeSetEnv( "APPDIR", p.getFilesDir().getAbsolutePath() );
|
nativeSetEnv( "APPDIR", p.getContext().getFilesDir().getAbsolutePath() );
|
||||||
nativeSetEnv( "SECURE_STORAGE_DIR", p.getFilesDir().getAbsolutePath() );
|
nativeSetEnv( "SECURE_STORAGE_DIR", p.getContext().getFilesDir().getAbsolutePath() );
|
||||||
nativeSetEnv( "DATADIR", Globals.DataDir );
|
nativeSetEnv( "DATADIR", Globals.DataDir );
|
||||||
nativeSetEnv( "UNSECURE_STORAGE_DIR", Globals.DataDir );
|
nativeSetEnv( "UNSECURE_STORAGE_DIR", Globals.DataDir );
|
||||||
SdcardAppPath.get().setEnv(p);
|
SdcardAppPath.get().setEnv(p.getContext());
|
||||||
nativeSetEnv( "HOME", Globals.DataDir );
|
nativeSetEnv( "HOME", Globals.DataDir );
|
||||||
nativeSetEnv( "SDCARD", Environment.getExternalStorageDirectory().getAbsolutePath() );
|
nativeSetEnv( "SDCARD", Environment.getExternalStorageDirectory().getAbsolutePath() );
|
||||||
nativeSetEnv( "SDCARD_DOWNLOADS", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() );
|
nativeSetEnv( "SDCARD_DOWNLOADS", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() );
|
||||||
@ -626,11 +627,11 @@ public class Settings
|
|||||||
nativeSetEnv( "SDCARD_DCIM", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() );
|
nativeSetEnv( "SDCARD_DCIM", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() );
|
||||||
nativeSetEnv( "SDCARD_MUSIC", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath() );
|
nativeSetEnv( "SDCARD_MUSIC", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath() );
|
||||||
nativeSetEnv( "ANDROID_VERSION", String.valueOf(Build.VERSION.SDK_INT) );
|
nativeSetEnv( "ANDROID_VERSION", String.valueOf(Build.VERSION.SDK_INT) );
|
||||||
nativeSetEnv( "ANDROID_PACKAGE_NAME", p.getPackageName() );
|
nativeSetEnv( "ANDROID_PACKAGE_NAME", p.getContext().getPackageName() );
|
||||||
nativeSetEnv( "ANDROID_PACKAGE_PATH", p.getPackageCodePath() );
|
nativeSetEnv( "ANDROID_PACKAGE_PATH", p.getContext().getPackageCodePath() );
|
||||||
nativeSetEnv( "ANDROID_MY_OWN_APP_FILE", p.getPackageResourcePath() ); // This may be different from p.getPackageCodePath() on multi-user systems, but should still be the same .apk file
|
nativeSetEnv( "ANDROID_MY_OWN_APP_FILE", p.getContext().getPackageResourcePath() ); // This may be different from p.getPackageCodePath() on multi-user systems, but should still be the same .apk file
|
||||||
try {
|
try {
|
||||||
nativeSetEnv( "ANDROID_APP_NAME", p.getString(p.getApplicationInfo().labelRes) );
|
nativeSetEnv( "ANDROID_APP_NAME", p.getContext().getString(p.getContext().getApplicationInfo().labelRes) );
|
||||||
} catch (Exception eeeeee) {}
|
} catch (Exception eeeeee) {}
|
||||||
Log.d("SDL", "libSDL: Is running on OUYA: " + p.isRunningOnOUYA());
|
Log.d("SDL", "libSDL: Is running on OUYA: " + p.isRunningOnOUYA());
|
||||||
if( p.isRunningOnOUYA() )
|
if( p.isRunningOnOUYA() )
|
||||||
@ -639,11 +640,12 @@ public class Settings
|
|||||||
nativeSetEnv( "TV", "1" );
|
nativeSetEnv( "TV", "1" );
|
||||||
nativeSetEnv( "ANDROID_TV", "1" );
|
nativeSetEnv( "ANDROID_TV", "1" );
|
||||||
}
|
}
|
||||||
if (p.getIntent().getCategories() != null && p.getIntent().getCategories().contains("com.google.intent.category.CARDBOARD")) {
|
// TODO: Implement this
|
||||||
nativeSetEnv( "CARDBOARD", "1" );
|
// if (p.getIntent().getCategories() != null && p.getIntent().getCategories().contains("com.google.intent.category.CARDBOARD")) {
|
||||||
nativeSetEnv( "VR", "1" );
|
// nativeSetEnv( "CARDBOARD", "1" );
|
||||||
nativeSetEnv( "CARDBOARD_VR", "1" );
|
// nativeSetEnv( "VR", "1" );
|
||||||
}
|
// nativeSetEnv( "CARDBOARD_VR", "1" );
|
||||||
|
// }
|
||||||
// if (p.getIntent().getStringExtra(RestartMainActivity.SDL_RESTART_PARAMS) != null)
|
// if (p.getIntent().getStringExtra(RestartMainActivity.SDL_RESTART_PARAMS) != null)
|
||||||
// nativeSetEnv( RestartMainActivity.SDL_RESTART_PARAMS, p.getIntent().getStringExtra(RestartMainActivity.SDL_RESTART_PARAMS) );
|
// nativeSetEnv( RestartMainActivity.SDL_RESTART_PARAMS, p.getIntent().getStringExtra(RestartMainActivity.SDL_RESTART_PARAMS) );
|
||||||
try {
|
try {
|
||||||
@ -665,7 +667,7 @@ public class Settings
|
|||||||
} catch (Exception eeeee) {}
|
} catch (Exception eeeee) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
static byte [] loadRaw(Activity p, int res)
|
static byte [] loadRaw(Context p, int res)
|
||||||
{
|
{
|
||||||
byte [] buf = new byte[65536 * 2];
|
byte [] buf = new byte[65536 * 2];
|
||||||
byte [] a = new byte[1048576 * 5]; // We need 5Mb buffer for Keen theme, and this Java code is inefficient
|
byte [] a = new byte[1048576 * 5]; // We need 5Mb buffer for Keen theme, and this Java code is inefficient
|
||||||
@ -690,7 +692,7 @@ public class Settings
|
|||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetupTouchscreenKeyboardGraphics(Activity p)
|
static void SetupTouchscreenKeyboardGraphics(Context p)
|
||||||
{
|
{
|
||||||
if( Globals.UseTouchscreenKeyboard )
|
if( Globals.UseTouchscreenKeyboard )
|
||||||
{
|
{
|
||||||
@ -726,10 +728,7 @@ public class Settings
|
|||||||
{
|
{
|
||||||
public static SdcardAppPath get()
|
public static SdcardAppPath get()
|
||||||
{
|
{
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
return Kitkat.Holder.sInstance;
|
||||||
return Kitkat.Holder.sInstance;
|
|
||||||
else
|
|
||||||
return Froyo.Holder.sInstance;
|
|
||||||
}
|
}
|
||||||
public String path(final Context p)
|
public String path(final Context p)
|
||||||
{
|
{
|
||||||
|
@ -23,51 +23,31 @@ freely, subject to the following restrictions:
|
|||||||
package io.neoterm;
|
package io.neoterm;
|
||||||
|
|
||||||
import javax.microedition.khronos.opengles.GL10;
|
import javax.microedition.khronos.opengles.GL10;
|
||||||
import javax.microedition.khronos.opengles.GL11;
|
|
||||||
import javax.microedition.khronos.opengles.GL11Ext;
|
|
||||||
|
|
||||||
import javax.microedition.khronos.egl.EGL10;
|
import javax.microedition.khronos.egl.EGL10;
|
||||||
import javax.microedition.khronos.egl.EGL11;
|
|
||||||
import javax.microedition.khronos.egl.EGLConfig;
|
import javax.microedition.khronos.egl.EGLConfig;
|
||||||
import javax.microedition.khronos.egl.EGLContext;
|
import javax.microedition.khronos.egl.EGLContext;
|
||||||
import javax.microedition.khronos.egl.EGLDisplay;
|
import javax.microedition.khronos.egl.EGLDisplay;
|
||||||
import javax.microedition.khronos.egl.EGLSurface;
|
import javax.microedition.khronos.egl.EGLSurface;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.nio.ByteOrder;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Environment;
|
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.AssetManager;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.InputDevice;
|
import android.view.InputDevice;
|
||||||
import android.view.Window;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.app.AlarmManager;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.Manifest;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.hardware.input.InputManager;
|
import android.hardware.input.InputManager;
|
||||||
|
|
||||||
|
import io.neoterm.xorg.NeoGLViewClient;
|
||||||
|
|
||||||
|
|
||||||
class Mouse
|
class Mouse
|
||||||
{
|
{
|
||||||
@ -630,10 +610,10 @@ abstract class DifferentTouchInput
|
|||||||
@SuppressWarnings("JniMissingFunction")
|
@SuppressWarnings("JniMissingFunction")
|
||||||
class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
||||||
{
|
{
|
||||||
public DemoRenderer(MainActivity _context)
|
public DemoRenderer(NeoGLViewClient client)
|
||||||
{
|
{
|
||||||
context = _context;
|
mClient = client;
|
||||||
Clipboard.get().setListener(context, new Runnable()
|
Clipboard.get().setListener(mClient.getContext(), new Runnable()
|
||||||
{
|
{
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@ -671,12 +651,12 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
int mLastPendingResize = 0;
|
int mLastPendingResize = 0;
|
||||||
public void onWindowResize(final int w, final int h)
|
public void onWindowResize(final int w, final int h)
|
||||||
{
|
{
|
||||||
if (context.isRunningOnOUYA())
|
if (mClient.isRunningOnOUYA())
|
||||||
return; // TV screen is never resized, and this event will mess up TV borders
|
return; // TV screen is never resized, and this event will mess up TV borders
|
||||||
Log.d("SDL", "libSDL: DemoRenderer.onWindowResize(): " + w + "x" + h);
|
Log.d("SDL", "libSDL: DemoRenderer.onWindowResize(): " + w + "x" + h);
|
||||||
mLastPendingResize ++;
|
mLastPendingResize ++;
|
||||||
final int resizeThreadIndex = mLastPendingResize;
|
final int resizeThreadIndex = mLastPendingResize;
|
||||||
context.mGLView.postDelayed(new Runnable()
|
mClient.getGLView().postDelayed(new Runnable()
|
||||||
{
|
{
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@ -685,14 +665,14 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
return; // Avoid running this function multiple times in a row
|
return; // Avoid running this function multiple times in a row
|
||||||
int ww = w - w % 2;
|
int ww = w - w % 2;
|
||||||
int hh = h - h % 2;
|
int hh = h - h % 2;
|
||||||
View topView = context.getWindow().peekDecorView();
|
View topView = mClient.getWindow().peekDecorView();
|
||||||
if (topView != null && Globals.ImmersiveMode)
|
if (topView != null && Globals.ImmersiveMode)
|
||||||
{
|
{
|
||||||
ww = topView.getWidth() - topView.getWidth() % 2;
|
ww = topView.getWidth() - topView.getWidth() % 2;
|
||||||
hh = topView.getHeight() - topView.getHeight() % 2;
|
hh = topView.getHeight() - topView.getHeight() % 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
Display display = context.getWindowManager().getDefaultDisplay();
|
Display display = mClient.getWindowManager().getDefaultDisplay();
|
||||||
|
|
||||||
if (mWidth != 0 && mHeight != 0 && (mWidth != ww || mHeight != hh))
|
if (mWidth != 0 && mHeight != 0 && (mWidth != ww || mHeight != hh))
|
||||||
{
|
{
|
||||||
@ -703,7 +683,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
{
|
{
|
||||||
Log.i("SDL", "Multiwindow detected - enabling screen orientation autodetection");
|
Log.i("SDL", "Multiwindow detected - enabling screen orientation autodetection");
|
||||||
Globals.AutoDetectOrientation = true;
|
Globals.AutoDetectOrientation = true;
|
||||||
context.setScreenOrientation();
|
mClient.initScreenOrientation();
|
||||||
DemoRenderer.super.ResetVideoSurface();
|
DemoRenderer.super.ResetVideoSurface();
|
||||||
DemoRenderer.super.onWindowResize(ww, hh);
|
DemoRenderer.super.onWindowResize(ww, hh);
|
||||||
}
|
}
|
||||||
@ -748,16 +728,11 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
|
|
||||||
mGlContextLost = false;
|
mGlContextLost = false;
|
||||||
|
|
||||||
if( Globals.CompatibilityHacksStaticInit )
|
Settings.Apply(mClient);
|
||||||
MainActivity.LoadApplicationLibrary(context);
|
|
||||||
while( !MainActivity.ApplicationLibraryLoaded )
|
|
||||||
try { Thread.sleep(200); } catch (InterruptedException eeee) {}
|
|
||||||
|
|
||||||
Settings.Apply(context);
|
|
||||||
Settings.nativeSetEnv( "DISPLAY_RESOLUTION_WIDTH", String.valueOf(Math.max(mWidth, mHeight)) );
|
Settings.nativeSetEnv( "DISPLAY_RESOLUTION_WIDTH", String.valueOf(Math.max(mWidth, mHeight)) );
|
||||||
Settings.nativeSetEnv( "DISPLAY_RESOLUTION_HEIGHT", String.valueOf(Math.min(mWidth, mHeight)) ); // In Kitkat with immersive mode, getWindowManager().getDefaultDisplay().getMetrics() return inaccurate height
|
Settings.nativeSetEnv( "DISPLAY_RESOLUTION_HEIGHT", String.valueOf(Math.min(mWidth, mHeight)) ); // In Kitkat with immersive mode, getWindowManager().getDefaultDisplay().getMetrics() return inaccurate height
|
||||||
|
|
||||||
accelerometer = new AccelerometerReader(context);
|
accelerometer = new AccelerometerReader(mClient.getContext());
|
||||||
if( Globals.MoveMouseWithGyroscope )
|
if( Globals.MoveMouseWithGyroscope )
|
||||||
startAccelerometerGyroscope(1);
|
startAccelerometerGyroscope(1);
|
||||||
// Tweak video thread priority, if user selected big audio buffer
|
// Tweak video thread priority, if user selected big audio buffer
|
||||||
@ -765,12 +740,12 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
Thread.currentThread().setPriority( (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2 ); // Lower than normal
|
Thread.currentThread().setPriority( (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2 ); // Lower than normal
|
||||||
// Calls main() and never returns, hehe - we'll call eglSwapBuffers() from native code
|
// Calls main() and never returns, hehe - we'll call eglSwapBuffers() from native code
|
||||||
String commandline = Globals.CommandLine;
|
String commandline = Globals.CommandLine;
|
||||||
if( context.getIntent() != null && context.getIntent().getScheme() != null &&
|
// if( mClient.getIntent() != null && mClient.getIntent().getScheme() != null &&
|
||||||
context.getIntent().getScheme().compareTo(android.content.ContentResolver.SCHEME_FILE) == 0 &&
|
// mClient.getIntent().getScheme().compareTo(android.content.ContentResolver.SCHEME_FILE) == 0 &&
|
||||||
context.getIntent().getData() != null && context.getIntent().getData().getPath() != null )
|
// mClient.getIntent().getData() != null && mClient.getIntent().getData().getPath() != null )
|
||||||
{
|
// {
|
||||||
commandline += " " + context.getIntent().getData().getPath();
|
// commandline += " " + mClient.getIntent().getData().getPath();
|
||||||
}
|
// }
|
||||||
nativeInit( Globals.DataDir,
|
nativeInit( Globals.DataDir,
|
||||||
commandline,
|
commandline,
|
||||||
( (Globals.SwVideoMode && Globals.MultiThreadedVideo) || Globals.CompatibilityHacksVideo ) ? 1 : 0,
|
( (Globals.SwVideoMode && Globals.MultiThreadedVideo) || Globals.CompatibilityHacksVideo ) ? 1 : 0,
|
||||||
@ -794,7 +769,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
|
|
||||||
if(mGlContextLost) {
|
if(mGlContextLost) {
|
||||||
mGlContextLost = false;
|
mGlContextLost = false;
|
||||||
Settings.SetupTouchscreenKeyboardGraphics(context); // Reload on-screen buttons graphics
|
Settings.SetupTouchscreenKeyboardGraphics(mClient.getContext()); // Reload on-screen buttons graphics
|
||||||
super.SwapBuffers();
|
super.SwapBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -806,7 +781,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
this.notify();
|
this.notify();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( context.isScreenKeyboardShown() && !context.keyboardWithoutTextInputShown )
|
if( mClient.isScreenKeyboardShown() && !mClient.isKeyboardWithoutTextInputShown() )
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
Thread.sleep(50); // Give some time to the keyboard input thread
|
Thread.sleep(50); // Give some time to the keyboard input thread
|
||||||
@ -819,7 +794,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
if( mOrientationFrameHackyCounter > 100 )
|
if( mOrientationFrameHackyCounter > 100 )
|
||||||
{
|
{
|
||||||
mOrientationFrameHackyCounter = 0;
|
mOrientationFrameHackyCounter = 0;
|
||||||
context.updateScreenOrientation();
|
mClient.updateScreenOrientation();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -827,54 +802,54 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
|
|
||||||
public void showScreenKeyboardWithoutTextInputField() // Called from native code
|
public void showScreenKeyboardWithoutTextInputField() // Called from native code
|
||||||
{
|
{
|
||||||
context.showScreenKeyboardWithoutTextInputField(Globals.TextInputKeyboard);
|
mClient.showScreenKeyboardWithoutTextInputField(Globals.TextInputKeyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showInternalScreenKeyboard(int keyboard) // Called from native code
|
public void showInternalScreenKeyboard(int keyboard) // Called from native code
|
||||||
{
|
{
|
||||||
context.showScreenKeyboardWithoutTextInputField(keyboard);
|
mClient.showScreenKeyboardWithoutTextInputField(keyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showScreenKeyboard(final String oldText, int unused) // Called from native code
|
public void showScreenKeyboard(final String oldText, int unused) // Called from native code
|
||||||
{
|
{
|
||||||
class Callback implements Runnable
|
class Callback implements Runnable
|
||||||
{
|
{
|
||||||
public MainActivity parent;
|
public NeoGLViewClient client;
|
||||||
public String oldText;
|
public String oldText;
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
parent.showScreenKeyboard(oldText);
|
client.showScreenKeyboard(oldText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Callback cb = new Callback();
|
Callback cb = new Callback();
|
||||||
cb.parent = context;
|
cb.client = mClient;
|
||||||
cb.oldText = oldText;
|
cb.oldText = oldText;
|
||||||
context.runOnUiThread(cb);
|
mClient.runOnUiThread(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void hideScreenKeyboard() // Called from native code
|
public void hideScreenKeyboard() // Called from native code
|
||||||
{
|
{
|
||||||
class Callback implements Runnable
|
class Callback implements Runnable
|
||||||
{
|
{
|
||||||
public MainActivity parent;
|
public NeoGLViewClient client;
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
parent.hideScreenKeyboard();
|
client.hideScreenKeyboard();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Callback cb = new Callback();
|
Callback cb = new Callback();
|
||||||
cb.parent = context;
|
cb.client = mClient;
|
||||||
context.runOnUiThread(cb);
|
mClient.runOnUiThread(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int isScreenKeyboardShown() // Called from native code
|
public int isScreenKeyboardShown() // Called from native code
|
||||||
{
|
{
|
||||||
return context.isScreenKeyboardShown() ? 1 : 0;
|
return mClient.isScreenKeyboardShown() ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setScreenKeyboardHintMessage(String s) // Called from native code
|
public void setScreenKeyboardHintMessage(String s) // Called from native code
|
||||||
{
|
{
|
||||||
context.setScreenKeyboardHintMessage(s);
|
mClient.setScreenKeyboardHintMessage(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startAccelerometerGyroscope(int started) // Called from native code
|
public void startAccelerometerGyroscope(int started) // Called from native code
|
||||||
@ -888,12 +863,12 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
|
|
||||||
public String getClipboardText() // Called from native code
|
public String getClipboardText() // Called from native code
|
||||||
{
|
{
|
||||||
return Clipboard.get().get(context);
|
return Clipboard.get().get(mClient.getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setClipboardText(final String s) // Called from native code
|
public void setClipboardText(final String s) // Called from native code
|
||||||
{
|
{
|
||||||
Clipboard.get().set(context, s);
|
Clipboard.get().set(mClient.getContext(), s);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void exitApp()
|
public void exitApp()
|
||||||
@ -938,7 +913,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
{
|
{
|
||||||
i.setClassName(pkgName, activity);
|
i.setClassName(pkgName, activity);
|
||||||
}
|
}
|
||||||
context.startActivity(i);
|
mClient.getContext().startActivity(i);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.i("SDL", "libSDL: cannot start external app: " + e.toString());
|
Log.i("SDL", "libSDL: cannot start external app: " + e.toString());
|
||||||
}
|
}
|
||||||
@ -946,7 +921,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
|
|
||||||
public void setSystemMousePointerVisible(int visible)
|
public void setSystemMousePointerVisible(int visible)
|
||||||
{
|
{
|
||||||
context.setSystemMousePointerVisible(visible);
|
mClient.setSystemMousePointerVisible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void restartMyself(String restartParams)
|
public void restartMyself(String restartParams)
|
||||||
@ -977,7 +952,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
public static native void nativeTextInputFinished();
|
public static native void nativeTextInputFinished();
|
||||||
public static native void nativeClipboardChanged();
|
public static native void nativeClipboardChanged();
|
||||||
|
|
||||||
private MainActivity context = null;
|
private NeoGLViewClient mClient = null;
|
||||||
public AccelerometerReader accelerometer = null;
|
public AccelerometerReader accelerometer = null;
|
||||||
|
|
||||||
private GL10 mGl = null;
|
private GL10 mGl = null;
|
||||||
@ -999,13 +974,13 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer
|
|||||||
@SuppressWarnings("JniMissingFunction")
|
@SuppressWarnings("JniMissingFunction")
|
||||||
class DemoGLSurfaceView extends GLSurfaceView_SDL {
|
class DemoGLSurfaceView extends GLSurfaceView_SDL {
|
||||||
|
|
||||||
public DemoGLSurfaceView(MainActivity context) {
|
public DemoGLSurfaceView(NeoGLViewClient client) {
|
||||||
super(context);
|
super(client.getContext());
|
||||||
mParent = context;
|
mClient = client;
|
||||||
setEGLConfigChooser(Globals.VideoDepthBpp, Globals.NeedDepthBuffer, Globals.NeedStencilBuffer, Globals.NeedGles2, Globals.NeedGles3);
|
setEGLConfigChooser(Globals.VideoDepthBpp, Globals.NeedDepthBuffer, Globals.NeedStencilBuffer, Globals.NeedGles2, Globals.NeedGles3);
|
||||||
mRenderer = new DemoRenderer(context);
|
mRenderer = new DemoRenderer(client);
|
||||||
setRenderer(mRenderer);
|
setRenderer(mRenderer);
|
||||||
DifferentTouchInput.registerInputManagerCallbacks(context);
|
DifferentTouchInput.registerInputManagerCallbacks(client.getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1019,7 +994,7 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL {
|
|||||||
nativeMouseButtonsPressed(2, 1);
|
nativeMouseButtonsPressed(2, 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if( mParent.keyboardWithoutTextInputShown )
|
else if( mClient.isKeyboardWithoutTextInputShown() )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1042,9 +1017,9 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL {
|
|||||||
nativeMouseButtonsPressed(2, 0);
|
nativeMouseButtonsPressed(2, 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if( mParent.keyboardWithoutTextInputShown )
|
else if( mClient.isKeyboardWithoutTextInputShown() )
|
||||||
{
|
{
|
||||||
mParent.showScreenKeyboardWithoutTextInputField(0); // Hide keyboard
|
mClient.showScreenKeyboardWithoutTextInputField(0); // Hide keyboard
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1053,7 +1028,7 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL {
|
|||||||
return super.onKeyUp(keyCode, event);
|
return super.onKeyUp(keyCode, event);
|
||||||
|
|
||||||
//if( keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU )
|
//if( keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU )
|
||||||
// DimSystemStatusBar.get().dim(mParent._videoLayout);
|
// DimSystemStatusBar.get().dim(mClient._videoLayout);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1076,11 +1051,8 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(final MotionEvent event)
|
public boolean onTouchEvent(final MotionEvent event)
|
||||||
{
|
{
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
|
if (getX() != 0)
|
||||||
{
|
event.offsetLocation(-getX(), -getY());
|
||||||
if (getX() != 0)
|
|
||||||
event.offsetLocation(-getX(), -getY());
|
|
||||||
}
|
|
||||||
DifferentTouchInput.touchInput.process(event);
|
DifferentTouchInput.touchInput.process(event);
|
||||||
if( DemoRenderer.mRatelimitTouchEvents )
|
if( DemoRenderer.mRatelimitTouchEvents )
|
||||||
{
|
{
|
||||||
@ -1156,7 +1128,7 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL {
|
|||||||
};
|
};
|
||||||
|
|
||||||
DemoRenderer mRenderer;
|
DemoRenderer mRenderer;
|
||||||
MainActivity mParent;
|
NeoGLViewClient mClient;
|
||||||
|
|
||||||
public static native void nativeMotionEvent( int x, int y, int action, int pointerId, int pressure, int radius );
|
public static native void nativeMotionEvent( int x, int y, int action, int pointerId, int pressure, int radius );
|
||||||
public static native int nativeKey( int keyCode, int down, int unicode, int gamepadId );
|
public static native int nativeKey( int keyCode, int down, int unicode, int gamepadId );
|
||||||
|
43
Xorg/src/main/java/io/neoterm/xorg/NeoGLViewClient.java
Normal file
43
Xorg/src/main/java/io/neoterm/xorg/NeoGLViewClient.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package io.neoterm.xorg;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.Window;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
|
||||||
|
import io.neoterm.NeoGLView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
|
||||||
|
public interface NeoGLViewClient {
|
||||||
|
Context getContext();
|
||||||
|
|
||||||
|
boolean isKeyboardWithoutTextInputShown();
|
||||||
|
|
||||||
|
void showScreenKeyboardWithoutTextInputField(int flags);
|
||||||
|
|
||||||
|
void setScreenKeyboardHintMessage(String hideMessage);
|
||||||
|
|
||||||
|
boolean isScreenKeyboardShown();
|
||||||
|
|
||||||
|
void showScreenKeyboard(String message);
|
||||||
|
|
||||||
|
void hideScreenKeyboard();
|
||||||
|
|
||||||
|
void runOnUiThread(Runnable runnable);
|
||||||
|
|
||||||
|
void updateScreenOrientation();
|
||||||
|
|
||||||
|
void initScreenOrientation();
|
||||||
|
|
||||||
|
boolean isRunningOnOUYA();
|
||||||
|
|
||||||
|
NeoGLView getGLView();
|
||||||
|
|
||||||
|
Window getWindow();
|
||||||
|
|
||||||
|
WindowManager getWindowManager();
|
||||||
|
|
||||||
|
void setSystemMousePointerVisible(int visible);
|
||||||
|
}
|
12
app/src/main/java/io/neoterm/frontend/xorg/XSessionData.kt
Normal file
12
app/src/main/java/io/neoterm/frontend/xorg/XSessionData.kt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package io.neoterm.frontend.xorg
|
||||||
|
|
||||||
|
import io.neoterm.NeoGLView
|
||||||
|
import io.neoterm.xorg.NeoGLViewClient
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
class XSessionData {
|
||||||
|
var glView: NeoGLView? = null
|
||||||
|
var client: NeoGLViewClient? = null
|
||||||
|
}
|
Reference in New Issue
Block a user