Publishing my attempt to create a GTK4 app for android.

This commit is contained in:
sergiotarxz 2022-05-13 17:11:38 +02:00
parent ab34e5462c
commit 037c01264b
36 changed files with 536 additions and 185 deletions

127
BUILD.PL Normal file
View File

@ -0,0 +1,127 @@
use v5.30.0;
use strict;
use warnings;
use Data::Dumper;
use Const::Fast;
use Path::Tiny;
use File::pushd qw/pushd/;
use JSON qw/encode_json/;
sub build;
sub build_packages;
sub generate_jni_libs;
sub generate_deb_iteration_jni;
const my $TERMUX_PACKAGES_URL =>
'https://gitea.sergiotarxz.freemyip.com/sergiotarxz/termux-packages';
build;
sub build {
#### For the release.
## my $tmpdir = Path::Tiny->tempdir;
my $tmpdir = path('tmpdir');
build_packages $tmpdir;
generate_jni_libs $tmpdir;
}
sub generate_deb_iteration_jni {
my $source_file = path(__FILE__)->absolute;
my $current_file = 0;
my %mappings;
return (
sub {
my $deb = shift->absolute;
my $tmpdir_extract_deb = Path::Tiny->tempdir;
my $tmpdir_extract_data = Path::Tiny->tempdir;
my $out_of_scope_deb = pushd $tmpdir_extract_deb;
system qw/ar x/, $deb;
undef $out_of_scope_deb;
system qw/tar -xf/, $tmpdir_extract_deb->child('data.tar.xz'),
'-C', $tmpdir_extract_data;
$tmpdir_extract_data->visit(
sub {
my ( $path, $state ) = @_;
return if $path->is_dir;
my $stripped_path = $path =~ s{/.*?/.*?(?=/)}{}r;
if ($path->basename eq 'libwayland-server.so') {
system qw/cp -v/, $path, path(__FILE__)->parent->child('./app/src/main/jni/prebuilt/x86_64/libwayland-server.so');
}
if ( -l $path || lstat $path && !stat $path ) {
$mappings{$stripped_path} = readlink($path);
return;
}
my $result_file = $source_file->parent->child(
"./app/src/main/jni/prebuilt/x86_64/lib$current_file.so"
);
system 'cp', $path, $result_file
and die "$path not copied.";
$mappings{$stripped_path} =
'@' . $result_file->basename . '';
$current_file++;
},
{
recurse => 1
}
);
},
sub { return \%mappings }
);
}
sub generate_jni_libs {
my $tmpdir = shift;
my %mappings;
my $current_file = 0;
my @debs = $tmpdir->child('output')->children;
@debs = grep { /(?:x86_64|all)\.deb$/ } @debs;
my ( $iterator, $result_func ) = generate_deb_iteration_jni();
for my $deb (@debs) {
$iterator->($deb);
}
my $mapping_so_content = encode_json $result_func->();
my $mapping_so = path('app/src/main/jni/prebuilt/x86_64/libmappings.so');
$mapping_so->spew($mapping_so_content);
}
sub build_packages {
my $tmpdir = shift;
## my $fake_home = Path::Tiny->tempdir;
#### To avoid conflicting with real termux packages.
my $fake_home = path('fake_home')->absolute;
local $ENV{HOME} = $fake_home;
local $ENV{TERMUX_ARCH} = 'x86_64';
#### TODO: Avoid this to be needed to avoid conflicting with real termux packages.
# path('/data/data/.built-packages/')->remove_tree;
say "CLONING $TERMUX_PACKAGES_URL.";
say "-----------------------------";
say '';
say '';
system qw/git clone/, $TERMUX_PACKAGES_URL, $tmpdir;
my $out_of_scope_remove_tempdir = pushd $tmpdir;
say "PULLING $TERMUX_PACKAGES_URL.";
say "-----------------------------";
say '';
say '';
system qw/git pull/;
say "Building i3.";
say "-----------------------------";
say '';
say '';
system qw{./build-package.sh i3};
say "Building xwayland.";
say "-----------------------------";
say '';
say '';
system qw{./build-package.sh xwayland};
say "Building openmg.";
say "-----------------------------";
say '';
say '';
system qw{./build-package.sh openmg};
}

View File

@ -56,9 +56,9 @@ You should start Termux:X11's activity with providing some additional data.
``` ```
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.RemoteException; import android.os.RemoteException;
import com.termux.x11.common.ITermuxX11Internal; import me.sergiotarxz.openmg.x11.common.ITermuxX11Internal;
... ...
private final String TermuxX11ComponentName = "com.termux.x11/.TermuxX11StarterReceiver"; private final String TermuxX11ComponentName = "me.sergiotarxz.openmg.x11/.TermuxX11StarterReceiver";
private void startTermuxX11() { private void startTermuxX11() {
Service svc = new Service(); Service svc = new Service();
@ -66,7 +66,7 @@ private void startTermuxX11() {
bundle.putBinder("", svc); bundle.putBinder("", svc);
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra("com.termux.x11.starter", bundle); intent.putExtra("me.sergiotarxz.openmg.x11.starter", bundle);
ComponentName cn = ComponentName.unflattenFromString(TermuxX11ComponentName); ComponentName cn = ComponentName.unflattenFromString(TermuxX11ComponentName);
if (cn == null) if (cn == null)
throw new IllegalArgumentException("Bad component name: " + TermuxX11ComponentName); throw new IllegalArgumentException("Bad component name: " + TermuxX11ComponentName);

View File

@ -3,7 +3,7 @@ apply plugin: 'com.android.application'
android { android {
compileSdkVersion 28 compileSdkVersion 28
defaultConfig { defaultConfig {
applicationId "com.termux.x11" applicationId "me.sergiotarxz.openmg.x11"
minSdkVersion 24 minSdkVersion 24
//noinspection OldTargetApi //noinspection OldTargetApi
targetSdkVersion 28 targetSdkVersion 28

View File

@ -1,17 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="com.termux.x11" package="me.sergiotarxz.openmg.x11"
android:installLocation="internalOnly" android:installLocation="internalOnly"
> >
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<application <application
android:extractNativeLibs="true"
android:allowBackup="false" android:allowBackup="false"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
@ -52,7 +47,4 @@
<meta-data android:name="com.samsung.android.multidisplay.keep_process_alive" android:value="true"/> <meta-data android:name="com.samsung.android.multidisplay.keep_process_alive" android:value="true"/>
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" /> <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
</application> </application>
<queries>
<package android:name="com.termux" />
</queries>
</manifest> </manifest>

View File

@ -1,4 +1,4 @@
package com.termux.x11; package me.sergiotarxz.openmg.x11;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;

View File

@ -1,4 +1,4 @@
package com.termux.x11; package me.sergiotarxz.openmg.x11;
import android.app.Activity; import android.app.Activity;
import android.graphics.Rect; import android.graphics.Rect;

View File

@ -1,4 +1,4 @@
package com.termux.x11; package me.sergiotarxz.openmg.x11;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.inputmethodservice.Keyboard; import android.inputmethodservice.Keyboard;
@ -105,7 +105,7 @@ public class LoriePreferences extends AppCompatActivity implements SharedPrefere
.setTitle("Permission denied") .setTitle("Permission denied")
.setMessage("Android requires WRITE_SECURE_SETTINGS permission to change this setting.\n" + .setMessage("Android requires WRITE_SECURE_SETTINGS permission to change this setting.\n" +
"Please, launch this command using ADB:\n" + "Please, launch this command using ADB:\n" +
"adb shell pm grant com.termux.x11 android.permission.WRITE_SECURE_SETTINGS") "adb shell pm grant me.sergiotarxz.openmg.x11 android.permission.WRITE_SECURE_SETTINGS")
.setNegativeButton("OK", null) .setNegativeButton("OK", null)
.create() .create()
.show(); .show();

View File

@ -1,4 +1,4 @@
package com.termux.x11; package me.sergiotarxz.openmg.x11;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.ActivityManager; import android.app.ActivityManager;
@ -43,20 +43,27 @@ import android.widget.Toast;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import java.util.Iterator;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.json.JSONObject;
@SuppressWarnings({"ConstantConditions", "SameParameterValue", "SdCardPath"}) @SuppressWarnings({"ConstantConditions", "SameParameterValue", "SdCardPath"})
@SuppressLint({"ClickableViewAccessibility", "StaticFieldLeak"}) @SuppressLint({"ClickableViewAccessibility", "StaticFieldLeak"})
public class LorieService extends Service { public class LorieService extends Service {
static final String LAUNCHED_BY_COMPATION = "com.termux.x11.launched_by_companion"; static final String LAUNCHED_BY_COMPATION = "me.sergiotarxz.openmg.x11.launched_by_companion";
static final String ACTION_STOP_SERVICE = "com.termux.x11.service_stop"; static final String ACTION_STOP_SERVICE = "me.sergiotarxz.openmg.x11.service_stop";
static final String ACTION_START_FROM_ACTIVITY = "com.termux.x11.start_from_activity"; static final String ACTION_START_FROM_ACTIVITY = "me.sergiotarxz.openmg.x11.start_from_activity";
static final String ACTION_START_PREFERENCES_ACTIVITY = "com.termux.x11.start_preferences_activity"; static final String ACTION_START_PREFERENCES_ACTIVITY = "me.sergiotarxz.openmg.x11.start_preferences_activity";
static final String ACTION_PREFERENCES_CHAGED = "com.termux.x11.preferences_changed"; static final String ACTION_PREFERENCES_CHAGED = "me.sergiotarxz.openmg.x11.preferences_changed";
private static LorieService instance = null; private static LorieService instance = null;
//private //private
@ -79,11 +86,11 @@ public class LorieService extends Service {
Intent intent = new Intent(act, LorieService.class); Intent intent = new Intent(act, LorieService.class);
intent.setAction(action); intent.setAction(action);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
act.startForegroundService(intent); // act.startForegroundService(intent);
} else { // } else {
act.startService(intent); act.startService(intent);
} // }
} }
@SuppressLint({"BatteryLife", "ObsoleteSdkInt"}) @SuppressLint({"BatteryLife", "ObsoleteSdkInt"})
@ -93,6 +100,40 @@ public class LorieService extends Service {
if (isServiceRunningInForeground(this, LorieService.class)) return; if (isServiceRunningInForeground(this, LorieService.class)) return;
String datadir = getApplicationInfo().dataDir; String datadir = getApplicationInfo().dataDir;
String nativeLibDir = getApplicationInfo().nativeLibraryDir;
String mappingsFile = nativeLibDir + "/libmappings.so";
String usr = "datadir"+"/files/usr";
try {
if (new File(usr).exists()) {
Files.walk(Paths.get(usr))
.map(Path::toFile)
.sorted((o1, o2) -> -o1.compareTo(o2))
.forEach(File::delete);
}
InputStream is = new FileInputStream(mappingsFile);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
String json = new String(buffer, "UTF-8");
JSONObject mappingsObject = new JSONObject(json);
Iterator keys = mappingsObject.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
String value = mappingsObject.getString(key);
Path target;
if (value.charAt(0) == '@') {
// It is a lib\d+.so
value = nativeLibDir+"/"+value.substring(1);
}
target = Paths.get(value);
new File(key).getParentFile().mkdirs();
Files.createSymbolicLink(Paths.get(key), target);
}
} catch (Exception ex) {
ex.printStackTrace();
}
String[] dirs = { String[] dirs = {
datadir + "/files/locale", datadir + "/files/locale",
datadir + "/files/xkb", datadir + "/files/xkb",
@ -155,19 +196,6 @@ public class LorieService extends Service {
.addAction(0, "Preferences", pendingPreferencesIntent) .addAction(0, "Preferences", pendingPreferencesIntent)
.addAction(0, "Exit", pendingExitIntent) .addAction(0, "Exit", pendingExitIntent)
.build(); .build();
startForeground(1, notification);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
Intent whitelist = new Intent();
whitelist.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
whitelist.setData(Uri.parse("package:" + packageName));
whitelist.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(whitelist);
}
}
} }
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
@ -225,46 +253,27 @@ public class LorieService extends Service {
} }
private static void sendRunCommandInternal(Context ctx) { private static void sendRunCommandInternal(Context ctx) {
Intent intent = new Intent(); // Process process = Runtime.getRuntime().exec(
intent.setClassName("com.termux", "com.termux.app.RunCommandService"); // "/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/bash " +
intent.setAction("com.termux.RUN_COMMAND"); // "/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/startopenmg"
intent.putExtra("com.termux.RUN_COMMAND_PATH", // );
"/data/data/com.termux/files/usr/libexec/termux-x11/termux-startx11");
intent.putExtra("com.termux.RUN_COMMAND_BACKGROUND", true); // Intent intent = new Intent();
Log.d("LorieService", "sendRunCommand: " + intent); // intent.setClassName("com.termux", "com.termux.app.RunCommandService");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // intent.setAction("com.termux.RUN_COMMAND");
ctx.startForegroundService(intent); // intent.putExtra("com.termux.RUN_COMMAND_PATH",
} else { // "/data/data/com.termux/files/usr/libexec/termux-x11/termux-startx11");
ctx.startService(intent); // intent.putExtra("com.termux.RUN_COMMAND_BACKGROUND", true);
} // Log.d("LorieService", "sendRunCommand: " + intent);
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// ctx.startForegroundService(intent);
// } else {
// ctx.startService(intent);
// }
} }
public static void sendRunCommand(AppCompatActivity act) { public static void sendRunCommand(AppCompatActivity act) {
final String ERROR_MESSAGE = LorieService.sendRunCommandInternal(act);
"It is impossible to start without " +
"com.termux.permission.RUN_COMMAND permission. " +
"Sorry.";
if (act.checkSelfPermission("com.termux.permission.RUN_COMMAND") == PackageManager.PERMISSION_GRANTED) {
LorieService.sendRunCommandInternal(act);
} else {
Log.d("MainActivity", "We have no permission to sendRunCommand(). Requesting it.");
ActivityResultLauncher<String> requestPermissionLauncher =
act.registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
if (isGranted) {
sendRunCommandInternal(act);
} else {
new AlertDialog.Builder(act)
.setTitle("Insufficient permission")
.setMessage(ERROR_MESSAGE)
.setPositiveButton(android.R.string.yes,
(dialog, which) -> act.finish())
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
});
requestPermissionLauncher.launch("com.termux.permission.RUN_COMMAND");
}
} }

View File

@ -1,4 +1,4 @@
package com.termux.x11; package me.sergiotarxz.openmg.x11;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;

View File

@ -1,4 +1,4 @@
package com.termux.x11; package me.sergiotarxz.openmg.x11;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -9,7 +9,7 @@ import android.os.RemoteException;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import com.termux.x11.common.ITermuxX11Internal; import me.sergiotarxz.openmg.x11.common.ITermuxX11Internal;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@ -35,7 +35,7 @@ public class TermuxX11StarterReceiver extends Activity {
} }
private void handleIntent(Intent intent) { private void handleIntent(Intent intent) {
final String extraName = "com.termux.x11.starter"; final String extraName = "me.sergiotarxz.openmg.x11.starter";
Bundle bundle; Bundle bundle;
IBinder token; IBinder token;
ITermuxX11Internal svc; ITermuxX11Internal svc;

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.termux.x11; package me.sergiotarxz.openmg.x11;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;

View File

@ -37,11 +37,11 @@ LOCAL_SRC_FILES := \
LOCAL_CFLAGS := \ LOCAL_CFLAGS := \
-std=c99 -Wall -Werror -Wno-unused-parameter -Wno-missing-field-initializers -Wimplicit-function-declaration \ -std=c99 -Wall -Werror -Wno-unused-parameter -Wno-missing-field-initializers -Wimplicit-function-declaration \
-D_GNU_SOURCE \ -D_GNU_SOURCE \
-DXLOCALEDIR=\"/data/data/com.termux.x11/files/locale\" \ -DXLOCALEDIR=\"/data/data/me.sergiotarxz.openmg.x11/files/locale\" \
-DDEFAULT_XKB_LAYOUT=\"us\" \ -DDEFAULT_XKB_LAYOUT=\"us\" \
-DDEFAULT_XKB_MODEL=\"pc105\" \ -DDEFAULT_XKB_MODEL=\"pc105\" \
-DDEFAULT_XKB_RULES=\"evdev\" \ -DDEFAULT_XKB_RULES=\"evdev\" \
-DDFLT_XKB_CONFIG_ROOT=\"/data/data/com.termux.x11/files/xkb\" -DDFLT_XKB_CONFIG_ROOT=\"/data/data/me.sergiotarxz.openmg.x11/files/xkb\"
LOCAL_C_INCLUDES := $(LOCAL_PATH)/xkbcommon $(LOCAL_PATH)/xkbcommon/src $(LOCAL_PATH)/xkbcommon/include LOCAL_C_INCLUDES := $(LOCAL_PATH)/xkbcommon $(LOCAL_PATH)/xkbcommon/src $(LOCAL_PATH)/xkbcommon/include
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/xkbcommon/ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/xkbcommon/
include $(BUILD_SHARED_LIBRARY) include $(BUILD_SHARED_LIBRARY)

View File

@ -1,6 +1,6 @@
#define _GNU_SOURCE_ 1 #define _GNU_SOURCE_ 1
#define DFLT_XKB_CONFIG_EXTRA_PATH "/data/data/com.termux/files/home/.termux.wayland/xkb/config" #define DFLT_XKB_CONFIG_EXTRA_PATH "/data/data/me.sergiotarxz.openmg.x11/files/home/.termux.wayland/xkb/config"
#define DEFAULT_XKB_VARIANT "NULL" #define DEFAULT_XKB_VARIANT "NULL"

View File

@ -1,6 +1,6 @@
#define _GNU_SOURCE_ 1 #define _GNU_SOURCE_ 1
#define DFLT_XKB_CONFIG_EXTRA_PATH "/data/data/com.termux/files/home/.termux.wayland/xkb/config" #define DFLT_XKB_CONFIG_EXTRA_PATH "/data/data/me.sergiotarxz.openmg.x11/files/home/.termux.wayland/xkb/config"
#define DEFAULT_XKB_VARIANT "NULL" #define DEFAULT_XKB_VARIANT "NULL"

View File

@ -1,6 +1,6 @@
#define _GNU_SOURCE_ 1 #define _GNU_SOURCE_ 1
#define DFLT_XKB_CONFIG_EXTRA_PATH "/data/data/com.termux/files/home/.termux.wayland/xkb/config" #define DFLT_XKB_CONFIG_EXTRA_PATH "/data/data/me.sergiotarxz.openmg.x11/files/home/.termux.wayland/xkb/config"
#define DEFAULT_XKB_VARIANT "NULL" #define DEFAULT_XKB_VARIANT "NULL"

View File

@ -607,17 +607,17 @@ registry_global(void *data, struct wl_registry *registry, uint32_t name,
else if (strcmp(interface, "xdg_wm_base") == 0) { else if (strcmp(interface, "xdg_wm_base") == 0) {
inter->shell = wl_registry_bind(registry, name, inter->shell = wl_registry_bind(registry, name,
&xdg_wm_base_interface, &xdg_wm_base_interface,
MAX(version, 2)); MAX(version, 4));
xdg_wm_base_add_listener(inter->shell, &shell_listener, inter); xdg_wm_base_add_listener(inter->shell, &shell_listener, inter);
} }
else if (strcmp(interface, "wl_compositor") == 0) { else if (strcmp(interface, "wl_compositor") == 0) {
inter->compositor = wl_registry_bind(registry, name, inter->compositor = wl_registry_bind(registry, name,
&wl_compositor_interface, &wl_compositor_interface,
MAX(version, 1)); MAX(version, 4));
} }
else if (strcmp(interface, "wl_shm") == 0) { else if (strcmp(interface, "wl_shm") == 0) {
inter->shm = wl_registry_bind(registry, name, &wl_shm_interface, inter->shm = wl_registry_bind(registry, name, &wl_shm_interface,
MAX(version, 1)); MAX(version, 4));
} }
} }

View File

@ -179,7 +179,7 @@ void LorieBackendAndroid::passfd(int fd) {
#define JNI_DECLARE_INNER(package, classname, methodname ) \ #define JNI_DECLARE_INNER(package, classname, methodname ) \
Java_ ## package ## _ ## classname ## _ ## methodname Java_ ## package ## _ ## classname ## _ ## methodname
#define JNI_DECLARE(classname, methodname) \ #define JNI_DECLARE(classname, methodname) \
JNI_DECLARE_INNER(com_termux_x11, classname, methodname) JNI_DECLARE_INNER(me_sergiotarxz_openmg_x11, classname, methodname)
#define WL_POINTER_MOTION 2 #define WL_POINTER_MOTION 2
@ -427,7 +427,7 @@ void fork(std::function<void()> f) {
} }
extern "C" JNIEXPORT void JNICALL extern "C" JNIEXPORT void JNICALL
Java_com_termux_x11_LorieService_startLogcatForFd(unused JNIEnv *env, unused jclass clazz, jint fd) { Java_me_sergiotarxz_openmg_x11_LorieService_startLogcatForFd(unused JNIEnv *env, unused jclass clazz, jint fd) {
killAllLogcats(); killAllLogcats();
LOGI("Starting logcat with output to given fd"); LOGI("Starting logcat with output to given fd");

View File

@ -39,6 +39,9 @@ void LorieCompositor::start() {
wl_resource_t::global_create<LorieOutput>(display, this); wl_resource_t::global_create<LorieOutput>(display, this);
wl_resource_t::global_create<LorieShell>(display, this); wl_resource_t::global_create<LorieShell>(display, this);
wl_registry *registry = wl_display_get_registry(this->display);
wl_registry_bind(registry, id, &xdg_wm_base_interface, 1);
backend_init(); backend_init();
wl_display_run(display); wl_display_run(display);

View File

@ -91,7 +91,7 @@
<entry name="invalid_object" value="0" <entry name="invalid_object" value="0"
summary="server couldn't find object"/> summary="server couldn't find object"/>
<entry name="invalid_method" value="1" <entry name="invalid_method" value="1"
summary="method doesn't exist on the specified interface"/> summary="method doesn't exist on the specified interface or malformed request"/>
<entry name="no_memory" value="2" <entry name="no_memory" value="2"
summary="server is out of memory"/> summary="server is out of memory"/>
<entry name="implementation" value="3" <entry name="implementation" value="3"
@ -101,10 +101,10 @@
<event name="delete_id"> <event name="delete_id">
<description summary="acknowledge object ID deletion"> <description summary="acknowledge object ID deletion">
This event is used internally by the object ID management This event is used internally by the object ID management
logic. When a client deletes an object, the server will send logic. When a client deletes an object that it had created,
this event to acknowledge that it has seen the delete request. the server will send this event to acknowledge that it has
When the client receives this event, it will know that it can seen the delete request. When the client receives this event,
safely reuse the object ID. it will know that it can safely reuse the object ID.
</description> </description>
<arg name="id" type="uint" summary="deleted object ID"/> <arg name="id" type="uint" summary="deleted object ID"/>
</event> </event>
@ -179,7 +179,7 @@
the related request is done. the related request is done.
</description> </description>
<event name="done"> <event name="done" type="destructor">
<description summary="done event"> <description summary="done event">
Notify the client when the related request is done. Notify the client when the related request is done.
</description> </description>
@ -187,7 +187,7 @@
</event> </event>
</interface> </interface>
<interface name="wl_compositor" version="4"> <interface name="wl_compositor" version="5">
<description summary="the compositor singleton"> <description summary="the compositor singleton">
A compositor. This object is a singleton global. The A compositor. This object is a singleton global. The
compositor is in charge of combining the contents of multiple compositor is in charge of combining the contents of multiple
@ -293,10 +293,15 @@
formats are optional and may not be supported by the particular formats are optional and may not be supported by the particular
renderer in use. renderer in use.
The drm format codes match the macros defined in drm_fourcc.h. The drm format codes match the macros defined in drm_fourcc.h, except
The formats actually supported by the compositor will be argb8888 and xrgb8888. The formats actually supported by the compositor
reported by the format event. will be reported by the format event.
For all wl_shm formats and unless specified in another protocol
extension, pre-multiplied alpha is used for pixel values.
</description> </description>
<!-- Note to protocol writers: don't update this list manually, instead
run the automated script that keeps it in sync with drm_fourcc.h. -->
<entry name="argb8888" value="0" summary="32-bit ARGB format, [31:0] A:R:G:B 8:8:8:8 little endian"/> <entry name="argb8888" value="0" summary="32-bit ARGB format, [31:0] A:R:G:B 8:8:8:8 little endian"/>
<entry name="xrgb8888" value="1" summary="32-bit RGB format, [31:0] x:R:G:B 8:8:8:8 little endian"/> <entry name="xrgb8888" value="1" summary="32-bit RGB format, [31:0] x:R:G:B 8:8:8:8 little endian"/>
<entry name="c8" value="0x20203843" summary="8-bit color index format, [7:0] C"/> <entry name="c8" value="0x20203843" summary="8-bit color index format, [7:0] C"/>
@ -355,6 +360,56 @@
<entry name="yvu422" value="0x36315659" summary="3 plane YCbCr format, 2x1 subsampled Cr (1) and Cb (2) planes"/> <entry name="yvu422" value="0x36315659" summary="3 plane YCbCr format, 2x1 subsampled Cr (1) and Cb (2) planes"/>
<entry name="yuv444" value="0x34325559" summary="3 plane YCbCr format, non-subsampled Cb (1) and Cr (2) planes"/> <entry name="yuv444" value="0x34325559" summary="3 plane YCbCr format, non-subsampled Cb (1) and Cr (2) planes"/>
<entry name="yvu444" value="0x34325659" summary="3 plane YCbCr format, non-subsampled Cr (1) and Cb (2) planes"/> <entry name="yvu444" value="0x34325659" summary="3 plane YCbCr format, non-subsampled Cr (1) and Cb (2) planes"/>
<entry name="r8" value="0x20203852" summary="[7:0] R"/>
<entry name="r16" value="0x20363152" summary="[15:0] R little endian"/>
<entry name="rg88" value="0x38384752" summary="[15:0] R:G 8:8 little endian"/>
<entry name="gr88" value="0x38385247" summary="[15:0] G:R 8:8 little endian"/>
<entry name="rg1616" value="0x32334752" summary="[31:0] R:G 16:16 little endian"/>
<entry name="gr1616" value="0x32335247" summary="[31:0] G:R 16:16 little endian"/>
<entry name="xrgb16161616f" value="0x48345258" summary="[63:0] x:R:G:B 16:16:16:16 little endian"/>
<entry name="xbgr16161616f" value="0x48344258" summary="[63:0] x:B:G:R 16:16:16:16 little endian"/>
<entry name="argb16161616f" value="0x48345241" summary="[63:0] A:R:G:B 16:16:16:16 little endian"/>
<entry name="abgr16161616f" value="0x48344241" summary="[63:0] A:B:G:R 16:16:16:16 little endian"/>
<entry name="xyuv8888" value="0x56555958" summary="[31:0] X:Y:Cb:Cr 8:8:8:8 little endian"/>
<entry name="vuy888" value="0x34325556" summary="[23:0] Cr:Cb:Y 8:8:8 little endian"/>
<entry name="vuy101010" value="0x30335556" summary="Y followed by U then V, 10:10:10. Non-linear modifier only"/>
<entry name="y210" value="0x30313259" summary="[63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 10:6:10:6:10:6:10:6 little endian per 2 Y pixels"/>
<entry name="y212" value="0x32313259" summary="[63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 12:4:12:4:12:4:12:4 little endian per 2 Y pixels"/>
<entry name="y216" value="0x36313259" summary="[63:0] Cr0:Y1:Cb0:Y0 16:16:16:16 little endian per 2 Y pixels"/>
<entry name="y410" value="0x30313459" summary="[31:0] A:Cr:Y:Cb 2:10:10:10 little endian"/>
<entry name="y412" value="0x32313459" summary="[63:0] A:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian"/>
<entry name="y416" value="0x36313459" summary="[63:0] A:Cr:Y:Cb 16:16:16:16 little endian"/>
<entry name="xvyu2101010" value="0x30335658" summary="[31:0] X:Cr:Y:Cb 2:10:10:10 little endian"/>
<entry name="xvyu12_16161616" value="0x36335658" summary="[63:0] X:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian"/>
<entry name="xvyu16161616" value="0x38345658" summary="[63:0] X:Cr:Y:Cb 16:16:16:16 little endian"/>
<entry name="y0l0" value="0x304c3059" summary="[63:0] A3:A2:Y3:0:Cr0:0:Y2:0:A1:A0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian"/>
<entry name="x0l0" value="0x304c3058" summary="[63:0] X3:X2:Y3:0:Cr0:0:Y2:0:X1:X0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian"/>
<entry name="y0l2" value="0x324c3059" summary="[63:0] A3:A2:Y3:Cr0:Y2:A1:A0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian"/>
<entry name="x0l2" value="0x324c3058" summary="[63:0] X3:X2:Y3:Cr0:Y2:X1:X0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian"/>
<entry name="yuv420_8bit" value="0x38305559"/>
<entry name="yuv420_10bit" value="0x30315559"/>
<entry name="xrgb8888_a8" value="0x38415258"/>
<entry name="xbgr8888_a8" value="0x38414258"/>
<entry name="rgbx8888_a8" value="0x38415852"/>
<entry name="bgrx8888_a8" value="0x38415842"/>
<entry name="rgb888_a8" value="0x38413852"/>
<entry name="bgr888_a8" value="0x38413842"/>
<entry name="rgb565_a8" value="0x38413552"/>
<entry name="bgr565_a8" value="0x38413542"/>
<entry name="nv24" value="0x3432564e" summary="non-subsampled Cr:Cb plane"/>
<entry name="nv42" value="0x3234564e" summary="non-subsampled Cb:Cr plane"/>
<entry name="p210" value="0x30313250" summary="2x1 subsampled Cr:Cb plane, 10 bit per channel"/>
<entry name="p010" value="0x30313050" summary="2x2 subsampled Cr:Cb plane 10 bits per channel"/>
<entry name="p012" value="0x32313050" summary="2x2 subsampled Cr:Cb plane 12 bits per channel"/>
<entry name="p016" value="0x36313050" summary="2x2 subsampled Cr:Cb plane 16 bits per channel"/>
<entry name="axbxgxrx106106106106" value="0x30314241" summary="[63:0] A:x:B:x:G:x:R:x 10:6:10:6:10:6:10:6 little endian"/>
<entry name="nv15" value="0x3531564e" summary="2x2 subsampled Cr:Cb plane"/>
<entry name="q410" value="0x30313451"/>
<entry name="q401" value="0x31303451"/>
<entry name="xrgb16161616" value="0x38345258" summary="[63:0] x:R:G:B 16:16:16:16 little endian"/>
<entry name="xbgr16161616" value="0x38344258" summary="[63:0] x:B:G:R 16:16:16:16 little endian"/>
<entry name="argb16161616" value="0x38345241" summary="[63:0] A:R:G:B 16:16:16:16 little endian"/>
<entry name="abgr16161616" value="0x38344241" summary="[63:0] A:B:G:R 16:16:16:16 little endian"/>
</enum> </enum>
<request name="create_pool"> <request name="create_pool">
@ -383,10 +438,15 @@
<interface name="wl_buffer" version="1"> <interface name="wl_buffer" version="1">
<description summary="content for a wl_surface"> <description summary="content for a wl_surface">
A buffer provides the content for a wl_surface. Buffers are A buffer provides the content for a wl_surface. Buffers are
created through factory interfaces such as wl_drm, wl_shm or created through factory interfaces such as wl_shm, wp_linux_buffer_params
similar. It has a width and a height and can be attached to a (from the linux-dmabuf protocol extension) or similar. It has a width and
wl_surface, but the mechanism by which a client provides and a height and can be attached to a wl_surface, but the mechanism by which a
updates the contents is defined by the buffer factory interface. client provides and updates the contents is defined by the buffer factory
interface.
If the buffer uses a format that has an alpha channel, the alpha channel
is assumed to be premultiplied in the color channels unless otherwise
specified.
</description> </description>
<request name="destroy" type="destructor"> <request name="destroy" type="destructor">
@ -509,6 +569,9 @@
this request after a NULL mime type has been set in this request after a NULL mime type has been set in
wl_data_offer.accept or no action was received through wl_data_offer.accept or no action was received through
wl_data_offer.action. wl_data_offer.action.
If wl_data_offer.finish request is received for a non drag and drop
operation, the invalid_finish protocol error is raised.
</description> </description>
</request> </request>
@ -525,7 +588,7 @@
This request determines the final result of the drag-and-drop This request determines the final result of the drag-and-drop
operation. If the end result is that no action is accepted, operation. If the end result is that no action is accepted,
the drag source will receive wl_drag_source.cancelled. the drag source will receive wl_data_source.cancelled.
The dnd_actions argument must contain only values expressed in the The dnd_actions argument must contain only values expressed in the
wl_data_device_manager.dnd_actions enum, and the preferred_action wl_data_device_manager.dnd_actions enum, and the preferred_action
@ -546,8 +609,10 @@
This request can only be made on drag-and-drop offers, a protocol error This request can only be made on drag-and-drop offers, a protocol error
will be raised otherwise. will be raised otherwise.
</description> </description>
<arg name="dnd_actions" type="uint" summary="actions supported by the destination client"/> <arg name="dnd_actions" type="uint" summary="actions supported by the destination client"
<arg name="preferred_action" type="uint" summary="action preferred by the destination client"/> enum="wl_data_device_manager.dnd_action"/>
<arg name="preferred_action" type="uint" summary="action preferred by the destination client"
enum="wl_data_device_manager.dnd_action"/>
</request> </request>
<event name="source_actions" since="3"> <event name="source_actions" since="3">
@ -556,7 +621,8 @@
will be sent right after wl_data_device.enter, or anytime the source will be sent right after wl_data_device.enter, or anytime the source
side changes its offered actions through wl_data_source.set_actions. side changes its offered actions through wl_data_source.set_actions.
</description> </description>
<arg name="source_actions" type="uint" summary="actions offered by the data source"/> <arg name="source_actions" type="uint" summary="actions offered by the data source"
enum="wl_data_device_manager.dnd_action"/>
</event> </event>
<event name="action" since="3"> <event name="action" since="3">
@ -597,7 +663,8 @@
final wl_data_offer.set_actions and wl_data_offer.accept requests final wl_data_offer.set_actions and wl_data_offer.accept requests
must happen before the call to wl_data_offer.finish. must happen before the call to wl_data_offer.finish.
</description> </description>
<arg name="dnd_action" type="uint" summary="action selected by the compositor"/> <arg name="dnd_action" type="uint" summary="action selected by the compositor"
enum="wl_data_device_manager.dnd_action"/>
</event> </event>
</interface> </interface>
@ -694,7 +761,8 @@
wl_data_device.start_drag. Attempting to use the source other than wl_data_device.start_drag. Attempting to use the source other than
for drag-and-drop will raise a protocol error. for drag-and-drop will raise a protocol error.
</description> </description>
<arg name="dnd_actions" type="uint" summary="actions supported by the data source"/> <arg name="dnd_actions" type="uint" summary="actions supported by the data source"
enum="wl_data_device_manager.dnd_action"/>
</request> </request>
<event name="dnd_drop_performed" since="3"> <event name="dnd_drop_performed" since="3">
@ -750,7 +818,8 @@
Clients can trigger cursor surface changes from this point, so Clients can trigger cursor surface changes from this point, so
they reflect the current action. they reflect the current action.
</description> </description>
<arg name="dnd_action" type="uint" summary="action selected by the compositor"/> <arg name="dnd_action" type="uint" summary="action selected by the compositor"
enum="wl_data_device_manager.dnd_action"/>
</event> </event>
</interface> </interface>
@ -776,7 +845,8 @@
for the eventual data transfer. If source is NULL, enter, leave for the eventual data transfer. If source is NULL, enter, leave
and motion events are sent only to the client that initiated the and motion events are sent only to the client that initiated the
drag and the client is expected to handle the data passing drag and the client is expected to handle the data passing
internally. internally. If source is destroyed, the drag-and-drop session will be
cancelled.
The origin surface is the surface where the drag originates and The origin surface is the surface where the drag originates and
the client must have an active implicit grab that matches the the client must have an active implicit grab that matches the
@ -890,9 +960,10 @@
immediately before receiving keyboard focus and when a new immediately before receiving keyboard focus and when a new
selection is set while the client has keyboard focus. The selection is set while the client has keyboard focus. The
data_offer is valid until a new data_offer or NULL is received data_offer is valid until a new data_offer or NULL is received
or until the client loses keyboard focus. The client must or until the client loses keyboard focus. Switching surface with
destroy the previous selection data_offer, if any, upon receiving keyboard focus within the same client doesn't mean a new selection
this event. will be sent. The client must destroy the previous selection
data_offer, if any, upon receiving this event.
</description> </description>
<arg name="id" type="object" interface="wl_data_offer" allow-null="true" <arg name="id" type="object" interface="wl_data_offer" allow-null="true"
summary="selection data_offer object"/> summary="selection data_offer object"/>
@ -1274,10 +1345,12 @@
</event> </event>
</interface> </interface>
<interface name="wl_surface" version="4"> <interface name="wl_surface" version="5">
<description summary="an onscreen surface"> <description summary="an onscreen surface">
A surface is a rectangular area that is displayed on the screen. A surface is a rectangular area that may be displayed on zero
It has a location, size and pixel contents. or more outputs, and shown any number of times at the compositor's
discretion. They can present wl_buffers, receive user input, and
define a local coordinate system.
The size of a surface (and relative positions on it) is described The size of a surface (and relative positions on it) is described
in surface-local coordinates, which may differ from the buffer in surface-local coordinates, which may differ from the buffer
@ -1323,6 +1396,8 @@
</description> </description>
<entry name="invalid_scale" value="0" summary="buffer scale value is invalid"/> <entry name="invalid_scale" value="0" summary="buffer scale value is invalid"/>
<entry name="invalid_transform" value="1" summary="buffer transform value is invalid"/> <entry name="invalid_transform" value="1" summary="buffer transform value is invalid"/>
<entry name="invalid_size" value="2" summary="buffer size is invalid"/>
<entry name="invalid_offset" value="3" summary="buffer offset is invalid"/>
</enum> </enum>
<request name="destroy" type="destructor"> <request name="destroy" type="destructor">
@ -1337,14 +1412,22 @@
The new size of the surface is calculated based on the buffer The new size of the surface is calculated based on the buffer
size transformed by the inverse buffer_transform and the size transformed by the inverse buffer_transform and the
inverse buffer_scale. This means that the supplied buffer inverse buffer_scale. This means that at commit time the supplied
must be an integer multiple of the buffer_scale. buffer size must be an integer multiple of the buffer_scale. If
that's not the case, an invalid_size error is sent.
The x and y arguments specify the location of the new pending The x and y arguments specify the location of the new pending
buffer's upper left corner, relative to the current buffer's upper buffer's upper left corner, relative to the current buffer's upper
left corner, in surface-local coordinates. In other words, the left corner, in surface-local coordinates. In other words, the
x and y, combined with the new surface size define in which x and y, combined with the new surface size define in which
directions the surface's size changes. directions the surface's size changes. Setting anything other than 0
as x and y arguments is discouraged, and should instead be replaced
with using the separate wl_surface.offset request.
When the bound wl_surface version is 5 or higher, passing any
non-zero x or y is a protocol violation, and will result in an
'invalid_offset' error being raised. To achieve equivalent semantics,
use wl_surface.offset.
Surface contents are double-buffered state, see wl_surface.commit. Surface contents are double-buffered state, see wl_surface.commit.
@ -1365,10 +1448,19 @@
will not receive a release event, and is not used by the will not receive a release event, and is not used by the
compositor. compositor.
If a pending wl_buffer has been committed to more than one wl_surface,
the delivery of wl_buffer.release events becomes undefined. A well
behaved client should not rely on wl_buffer.release events in this
case. Alternatively, a client could create multiple wl_buffer objects
from the same backing storage or use wp_linux_buffer_release.
Destroying the wl_buffer after wl_buffer.release does not change Destroying the wl_buffer after wl_buffer.release does not change
the surface contents. However, if the client destroys the the surface contents. Destroying the wl_buffer before wl_buffer.release
wl_buffer before receiving the wl_buffer.release event, the surface is allowed as long as the underlying buffer storage isn't re-used (this
contents become undefined immediately. can happen e.g. on client process termination). However, if the client
destroys the wl_buffer before receiving the wl_buffer.release event and
mutates the underlying buffer storage, the surface contents become
undefined immediately.
If wl_surface.attach is sent with a NULL wl_buffer, the If wl_surface.attach is sent with a NULL wl_buffer, the
following wl_surface.commit will remove the surface content. following wl_surface.commit will remove the surface content.
@ -1545,6 +1637,12 @@
This is emitted whenever a surface's creation, movement, or resizing This is emitted whenever a surface's creation, movement, or resizing
results in it no longer having any part of it within the scanout region results in it no longer having any part of it within the scanout region
of an output. of an output.
Clients should not use the number of outputs the surface is on for frame
throttling purposes. The surface might be hidden even if no leave event
has been sent, and the compositor might expect new surface content
updates even if no enter event has been sent. The frame event should be
used instead.
</description> </description>
<arg name="output" type="object" interface="wl_output" summary="output left by the surface"/> <arg name="output" type="object" interface="wl_output" summary="output left by the surface"/>
</event> </event>
@ -1660,9 +1758,30 @@
<arg name="width" type="int" summary="width of damage rectangle"/> <arg name="width" type="int" summary="width of damage rectangle"/>
<arg name="height" type="int" summary="height of damage rectangle"/> <arg name="height" type="int" summary="height of damage rectangle"/>
</request> </request>
<!-- Version 5 additions -->
<request name="offset" since="5">
<description summary="set the surface contents offset">
The x and y arguments specify the location of the new pending
buffer's upper left corner, relative to the current buffer's upper
left corner, in surface-local coordinates. In other words, the
x and y, combined with the new surface size define in which
directions the surface's size changes.
Surface location offset is double-buffered state, see
wl_surface.commit.
This request is semantically equivalent to and the replaces the x and y
arguments in the wl_surface.attach request in wl_surface versions prior
to 5. See wl_surface.attach for details.
</description>
<arg name="x" type="int" summary="surface-local x coordinate"/>
<arg name="y" type="int" summary="surface-local y coordinate"/>
</request>
</interface> </interface>
<interface name="wl_seat" version="4"> <interface name="wl_seat" version="7">
<description summary="group of input devices"> <description summary="group of input devices">
A seat is a group of keyboards, pointer and touch devices. This A seat is a group of keyboards, pointer and touch devices. This
object is published as a global during start up, or when such a object is published as a global during start up, or when such a
@ -1680,6 +1799,14 @@
<entry name="touch" value="4" summary="the seat has touch devices"/> <entry name="touch" value="4" summary="the seat has touch devices"/>
</enum> </enum>
<enum name="error">
<description summary="wl_seat error values">
These errors can be emitted in response to wl_seat requests.
</description>
<entry name="missing_capability" value="0"
summary="get_pointer, get_keyboard or get_touch called on seat without the matching capability"/>
</enum>
<event name="capabilities"> <event name="capabilities">
<description summary="seat capabilities changed"> <description summary="seat capabilities changed">
This is emitted whenever a seat gains or loses the pointer, This is emitted whenever a seat gains or loses the pointer,
@ -1718,7 +1845,8 @@
This request only takes effect if the seat has the pointer This request only takes effect if the seat has the pointer
capability, or has had the pointer capability in the past. capability, or has had the pointer capability in the past.
It is a protocol violation to issue this request on a seat that has It is a protocol violation to issue this request on a seat that has
never had the pointer capability. never had the pointer capability. The missing_capability error will
be sent in this case.
</description> </description>
<arg name="id" type="new_id" interface="wl_pointer" summary="seat pointer"/> <arg name="id" type="new_id" interface="wl_pointer" summary="seat pointer"/>
</request> </request>
@ -1731,7 +1859,8 @@
This request only takes effect if the seat has the keyboard This request only takes effect if the seat has the keyboard
capability, or has had the keyboard capability in the past. capability, or has had the keyboard capability in the past.
It is a protocol violation to issue this request on a seat that has It is a protocol violation to issue this request on a seat that has
never had the keyboard capability. never had the keyboard capability. The missing_capability error will
be sent in this case.
</description> </description>
<arg name="id" type="new_id" interface="wl_keyboard" summary="seat keyboard"/> <arg name="id" type="new_id" interface="wl_keyboard" summary="seat keyboard"/>
</request> </request>
@ -1744,7 +1873,8 @@
This request only takes effect if the seat has the touch This request only takes effect if the seat has the touch
capability, or has had the touch capability in the past. capability, or has had the touch capability in the past.
It is a protocol violation to issue this request on a seat that has It is a protocol violation to issue this request on a seat that has
never had the touch capability. never had the touch capability. The missing_capability error will
be sent in this case.
</description> </description>
<arg name="id" type="new_id" interface="wl_touch" summary="seat touch interface"/> <arg name="id" type="new_id" interface="wl_touch" summary="seat touch interface"/>
</request> </request>
@ -1753,16 +1883,29 @@
<event name="name" since="2"> <event name="name" since="2">
<description summary="unique identifier for this seat"> <description summary="unique identifier for this seat">
In a multiseat configuration this can be used by the client to help In a multi-seat configuration the seat name can be used by clients to
identify which physical devices the seat represents. Based on help identify which physical devices the seat represents.
the seat configuration used by the compositor.
The seat name is a UTF-8 string with no convention defined for its
contents. Each name is unique among all wl_seat globals. The name is
only guaranteed to be unique for the current compositor instance.
The same seat names are used for all clients. Thus, the name can be
shared across processes to refer to a specific wl_seat global.
The name event is sent after binding to the seat global. This event is
only sent once per seat object, and the name does not change over the
lifetime of the wl_seat global.
Compositors may re-use the same seat name if the wl_seat global is
destroyed and re-created later.
</description> </description>
<arg name="name" type="string" summary="seat identifier"/> <arg name="name" type="string" summary="seat identifier"/>
</event> </event>
<!-- Version 5 additions --> <!-- Version 5 additions -->
<request name="release" type="destructor" since="4"> <request name="release" type="destructor" since="5">
<description summary="release the seat object"> <description summary="release the seat object">
Using this request a client can tell the server that it is not going to Using this request a client can tell the server that it is not going to
use the seat object anymore. use the seat object anymore.
@ -1820,6 +1963,10 @@
wl_surface is no longer used as the cursor. When the use as a wl_surface is no longer used as the cursor. When the use as a
cursor ends, the current and pending input regions become cursor ends, the current and pending input regions become
undefined, and the wl_surface is unmapped. undefined, and the wl_surface is unmapped.
The serial parameter must match the latest wl_pointer.enter
serial number sent to the client. Otherwise the request will be
ignored.
</description> </description>
<arg name="serial" type="uint" summary="serial number of the enter event"/> <arg name="serial" type="uint" summary="serial number of the enter event"/>
<arg name="surface" type="object" interface="wl_surface" allow-null="true" <arg name="surface" type="object" interface="wl_surface" allow-null="true"
@ -2114,7 +2261,8 @@
<event name="keymap"> <event name="keymap">
<description summary="keyboard mapping"> <description summary="keyboard mapping">
This event provides a file descriptor to the client which can be This event provides a file descriptor to the client which can be
memory-mapped to provide a keyboard mapping description. memory-mapped in read-only mode to provide a keyboard mapping
description.
From version 7 onwards, the fd must be mapped with MAP_PRIVATE by From version 7 onwards, the fd must be mapped with MAP_PRIVATE by
the recipient, as MAP_SHARED may fail. the recipient, as MAP_SHARED may fail.
@ -2128,6 +2276,9 @@
<description summary="enter event"> <description summary="enter event">
Notification that this seat's keyboard focus is on a certain Notification that this seat's keyboard focus is on a certain
surface. surface.
The compositor must send the wl_keyboard.modifiers event after this
event.
</description> </description>
<arg name="serial" type="uint" summary="serial number of the enter event"/> <arg name="serial" type="uint" summary="serial number of the enter event"/>
<arg name="surface" type="object" interface="wl_surface" summary="surface gaining keyboard focus"/> <arg name="surface" type="object" interface="wl_surface" summary="surface gaining keyboard focus"/>
@ -2141,6 +2292,9 @@
The leave notification is sent before the enter notification The leave notification is sent before the enter notification
for the new focus. for the new focus.
After this event client must assume that all keys, including modifiers,
are lifted and also it must stop key repeating if there's some going on.
</description> </description>
<arg name="serial" type="uint" summary="serial number of the leave event"/> <arg name="serial" type="uint" summary="serial number of the leave event"/>
<arg name="surface" type="object" interface="wl_surface" summary="surface that lost keyboard focus"/> <arg name="surface" type="object" interface="wl_surface" summary="surface that lost keyboard focus"/>
@ -2159,6 +2313,12 @@
A key was pressed or released. A key was pressed or released.
The time argument is a timestamp with millisecond The time argument is a timestamp with millisecond
granularity, with an undefined base. granularity, with an undefined base.
The key is a platform-specific key code that can be interpreted
by feeding it to the keyboard mapping (see the keymap event).
If this event produces a change in modifiers, then the resulting
wl_keyboard.modifiers event must be sent after this event.
</description> </description>
<arg name="serial" type="uint" summary="serial number of the key event"/> <arg name="serial" type="uint" summary="serial number of the key event"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/> <arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
@ -2352,7 +2512,7 @@
</event> </event>
</interface> </interface>
<interface name="wl_output" version="3"> <interface name="wl_output" version="4">
<description summary="compositor output region"> <description summary="compositor output region">
An output describes part of the compositor geometry. The An output describes part of the compositor geometry. The
compositor works in the 'compositor coordinate system' and an compositor works in the 'compositor coordinate system' and an
@ -2408,12 +2568,15 @@
The physical size can be set to zero if it doesn't make sense for this The physical size can be set to zero if it doesn't make sense for this
output (e.g. for projectors or virtual outputs). output (e.g. for projectors or virtual outputs).
The geometry event will be followed by a done event (starting from
version 2).
Note: wl_output only advertises partial information about the output Note: wl_output only advertises partial information about the output
position and identification. Some compositors, for instance those not position and identification. Some compositors, for instance those not
implementing a desktop-style output layout or those exposing virtual implementing a desktop-style output layout or those exposing virtual
outputs, might fake this information. Instead of using x and y, clients outputs, might fake this information. Instead of using x and y, clients
should use xdg_output.logical_position. Instead of using make and model, should use xdg_output.logical_position. Instead of using make and model,
clients should use xdg_output.name and xdg_output.description. clients should use name and description.
</description> </description>
<arg name="x" type="int" <arg name="x" type="int"
summary="x position within the global compositor space"/> summary="x position within the global compositor space"/>
@ -2454,6 +2617,10 @@
current. In other words, the current mode is always the last current. In other words, the current mode is always the last
mode that was received with the current flag set. mode that was received with the current flag set.
Non-current modes are deprecated. A compositor can decide to only
advertise the current mode and never send other modes. Clients
should not rely on non-current modes.
The size of a mode is given in physical hardware units of The size of a mode is given in physical hardware units of
the output device. This is not necessarily the same as the output device. This is not necessarily the same as
the output size in the global compositor space. For instance, the output size in the global compositor space. For instance,
@ -2462,6 +2629,12 @@
willing to retrieve the output size in the global compositor willing to retrieve the output size in the global compositor
space should use xdg_output.logical_size instead. space should use xdg_output.logical_size instead.
The vertical refresh rate can be set to zero if it doesn't make
sense for this output (e.g. for virtual outputs).
The mode event will be followed by a done event (starting from
version 2).
Clients should not use the refresh rate to schedule frames. Instead, Clients should not use the refresh rate to schedule frames. Instead,
they should use the wl_surface.frame event or the presentation-time they should use the wl_surface.frame event or the presentation-time
protocol. protocol.
@ -2508,6 +2681,8 @@
the scale of the output. That way the compositor can the scale of the output. That way the compositor can
avoid scaling the surface, and the client can supply avoid scaling the surface, and the client can supply
a higher detail image. a higher detail image.
The scale event will be followed by a done event.
</description> </description>
<arg name="factor" type="int" summary="scaling factor of output"/> <arg name="factor" type="int" summary="scaling factor of output"/>
</event> </event>
@ -2520,6 +2695,62 @@
use the output object anymore. use the output object anymore.
</description> </description>
</request> </request>
<!-- Version 4 additions -->
<event name="name" since="4">
<description summary="name of this output">
Many compositors will assign user-friendly names to their outputs, show
them to the user, allow the user to refer to an output, etc. The client
may wish to know this name as well to offer the user similar behaviors.
The name is a UTF-8 string with no convention defined for its contents.
Each name is unique among all wl_output globals. The name is only
guaranteed to be unique for the compositor instance.
The same output name is used for all clients for a given wl_output
global. Thus, the name can be shared across processes to refer to a
specific wl_output global.
The name is not guaranteed to be persistent across sessions, thus cannot
be used to reliably identify an output in e.g. configuration files.
Examples of names include 'HDMI-A-1', 'WL-1', 'X11-1', etc. However, do
not assume that the name is a reflection of an underlying DRM connector,
X11 connection, etc.
The name event is sent after binding the output object. This event is
only sent once per output object, and the name does not change over the
lifetime of the wl_output global.
Compositors may re-use the same output name if the wl_output global is
destroyed and re-created later. Compositors should avoid re-using the
same name if possible.
The name event will be followed by a done event.
</description>
<arg name="name" type="string" summary="output name"/>
</event>
<event name="description" since="4">
<description summary="human-readable description of this output">
Many compositors can produce human-readable descriptions of their
outputs. The client may wish to know this description as well, e.g. for
output selection purposes.
The description is a UTF-8 string with no convention defined for its
contents. The description is not guaranteed to be unique among all
wl_output globals. Examples might include 'Foocorp 11" Display' or
'Virtual X11 output via :1'.
The description event is sent after binding the output object and
whenever the description changes. The description is optional, and may
not be sent at all.
The description event will be followed by a done event.
</description>
<arg name="description" type="string" summary="output description"/>
</event>
</interface> </interface>
<interface name="wl_region" version="1"> <interface name="wl_region" version="1">
@ -2643,7 +2874,7 @@
wl_surface state directly. A sub-surface is initially in the wl_surface state directly. A sub-surface is initially in the
synchronized mode. synchronized mode.
Sub-surfaces have also other kind of state, which is managed by Sub-surfaces also have another kind of state, which is managed by
wl_subsurface requests, as opposed to wl_surface requests. This wl_subsurface requests, as opposed to wl_surface requests. This
state includes the sub-surface position relative to the parent state includes the sub-surface position relative to the parent
surface (wl_subsurface.set_position), and the stacking order of surface (wl_subsurface.set_position), and the stacking order of

View File

@ -15,7 +15,7 @@
</FrameLayout> </FrameLayout>
<com.termux.x11.AdditionalKeyboardView <me.sergiotarxz.openmg.x11.AdditionalKeyboardView
android:id="@+id/additionalKbd" android:id="@+id/additionalKbd"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -34,7 +34,7 @@
<EditTextPreference <EditTextPreference
android:title="Custom XDG_RUNTIME_DIR" android:title="Custom XDG_RUNTIME_DIR"
android:defaultValue="/data/data/com.termux/files/usr/tmp" android:defaultValue="/data/data/me.sergiotarxz.openmg.x11/files/usr/tmp"
android:key="CustXDG" android:key="CustXDG"
android:summary="Set the XDG runtime directory for wayland sockets" android:summary="Set the XDG runtime directory for wayland sockets"
android:dialogMessage="Changes to this preference will apply on app restart" /> android:dialogMessage="Changes to this preference will apply on app restart" />

View File

@ -9,7 +9,7 @@ NDKBUILD_DIR=starter/build/intermediates/ndkBuild/debug/obj/local
DATA_DIR=$INTERMEDIATES/data DATA_DIR=$INTERMEDIATES/data
CONTROL_DIR=$INTERMEDIATES/control CONTROL_DIR=$INTERMEDIATES/control
PACKAGE_DIR=$INTERMEDIATES/package PACKAGE_DIR=$INTERMEDIATES/package
PREFIX=$DATA_DIR/data/data/com.termux/files/usr PREFIX=$DATA_DIR/data/data/me.sergiotarxz.openmg.x11/files/usr
rm -rf $PACKAGE_PATH $DATA_DIR $CONTROL_DIR $PACKAGE_DIR rm -rf $PACKAGE_PATH $DATA_DIR $CONTROL_DIR $PACKAGE_DIR

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.termux.x11.common"> package="me.sergiotarxz.openmg.x11.common">
</manifest> </manifest>

View File

@ -1,4 +1,4 @@
package com.termux.x11.common; package me.sergiotarxz.openmg.x11.common;
// This interface is used by utility on termux side. // This interface is used by utility on termux side.
interface ITermuxX11Internal { interface ITermuxX11Internal {

View File

@ -3,7 +3,7 @@ apply plugin: 'com.android.application'
android { android {
compileSdkVersion 28 compileSdkVersion 28
defaultConfig { defaultConfig {
applicationId "com.termux.termuxam" applicationId "me.sergiotarxz.openmg.termuxam"
minSdkVersion 21 minSdkVersion 21
// Note: targetSdkVersion affects only tests, // Note: targetSdkVersion affects only tests,
// normally, even though this is packaged as apk, // normally, even though this is packaged as apk,

View File

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.termux.x11.starter"> package="me.sergiotarxz.openmg.x11.starter">
<application <application
android:label="TermuxX11Starter" android:label="TermuxX11Starter"

View File

@ -1,4 +1,4 @@
package com.termux.x11.starter; package me.sergiotarxz.openmg.x11.starter;
/** /**
* \@hide-hidden constants * \@hide-hidden constants

View File

@ -1,4 +1,4 @@
package com.termux.x11.starter; package me.sergiotarxz.openmg.x11.starter;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;

View File

@ -1,4 +1,4 @@
package com.termux.x11.starter; package me.sergiotarxz.openmg.x11.starter;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;

View File

@ -1,4 +1,4 @@
package com.termux.x11.starter; package me.sergiotarxz.openmg.x11.starter;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.PendingIntent; import android.app.PendingIntent;
@ -29,7 +29,7 @@ class IActivityManager {
private CrossVersionReflectedMethod mIntentSenderSendMethod; private CrossVersionReflectedMethod mIntentSenderSendMethod;
IActivityManager() throws Exception { IActivityManager() throws Exception {
this("com.termux"); this("me.sergiotarxz.openmg.x11");
} }
IActivityManager(String callingAppName) throws Exception { IActivityManager(String callingAppName) throws Exception {

View File

@ -16,7 +16,7 @@
*/ */
package com.termux.x11.starter; package me.sergiotarxz.openmg.x11.starter;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.PendingIntent; import android.app.PendingIntent;
@ -37,14 +37,14 @@ import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.Objects; import java.util.Objects;
import com.termux.x11.common.ITermuxX11Internal; import me.sergiotarxz.openmg.x11.common.ITermuxX11Internal;
@SuppressLint("UnsafeDynamicallyLoadedCode") @SuppressLint("UnsafeDynamicallyLoadedCode")
@SuppressWarnings({"unused", "RedundantThrows", "SameParameterValue", "FieldCanBeLocal"}) @SuppressWarnings({"unused", "RedundantThrows", "SameParameterValue", "FieldCanBeLocal"})
public class Starter { public class Starter {
@SuppressLint("SdCardPath") @SuppressLint("SdCardPath")
private final String XwaylandPath = "/data/data/com.termux/files/usr/bin/Xwayland"; private final String XwaylandPath = "/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/Xwayland";
private final String TermuxX11ComponentName = "com.termux.x11/.TermuxX11StarterReceiver"; private final String TermuxX11ComponentName = "me.sergiotarxz.openmg.x11/.TermuxX11StarterReceiver";
private String[] args; private String[] args;
private Service svc; private Service svc;
private ParcelFileDescriptor logFD; private ParcelFileDescriptor logFD;
@ -121,18 +121,7 @@ public class Starter {
private void startXwayland() { private void startXwayland() {
try { try {
boolean started = false; startXwayland(args);
for (int i = 0; i < 200; i++) {
if (checkWaylandSocket()) {
started = true;
Thread.sleep(200);
startXwayland(args);
break;
}
Thread.sleep(100);
}
if (!started)
System.err.println("Failed to connect to Termux:X11. Something went wrong.");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -149,7 +138,7 @@ public class Starter {
bundle.putBinder("", token); bundle.putBinder("", token);
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra("com.termux.x11.starter", bundle); intent.putExtra("me.sergiotarxz.openmg.x11.starter", bundle);
ComponentName cn = ComponentName.unflattenFromString(TermuxX11ComponentName); ComponentName cn = ComponentName.unflattenFromString(TermuxX11ComponentName);
if (cn == null) if (cn == null)
throw new IllegalArgumentException("Bad component name: " + TermuxX11ComponentName); throw new IllegalArgumentException("Bad component name: " + TermuxX11ComponentName);
@ -298,7 +287,7 @@ public class Starter {
boolean loaded = false; boolean loaded = false;
@SuppressLint("SdCardPath") @SuppressLint("SdCardPath")
final String DistDir = "/data/data/com.termux/files/usr/libexec/termux-x11"; final String DistDir = "/data/data/me.sergiotarxz.openmg.x11/files/usr/libexec/termux-x11";
for (int i = 0; i < Build.SUPPORTED_ABIS.length; i++) { for (int i = 0; i < Build.SUPPORTED_ABIS.length; i++) {
@SuppressLint("SdCardPath") @SuppressLint("SdCardPath")
final String libPath = DistDir + "/" + Build.SUPPORTED_ABIS[i] + "/libstarter.so"; final String libPath = DistDir + "/" + Build.SUPPORTED_ABIS[i] + "/libstarter.so";

View File

@ -36,7 +36,7 @@ static nativePipe* fromLong(jlong v) {
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_com_termux_x11_starter_ExecHelper_createPipe(unused JNIEnv *env, unused jclass clazz, Java_me_sergiotarxz_openmg_x11_starter_ExecHelper_createPipe(unused JNIEnv *env, unused jclass clazz,
jint capacity) { jint capacity) {
size_t size = sizeof(nativePipe) + sizeof(uint8_t) * capacity + 1; size_t size = sizeof(nativePipe) + sizeof(uint8_t) * capacity + 1;
nativePipe* p = malloc(size); nativePipe* p = malloc(size);
@ -50,7 +50,7 @@ Java_com_termux_x11_starter_ExecHelper_createPipe(unused JNIEnv *env, unused jcl
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_termux_x11_starter_ExecHelper_pipeWriteFd(unused JNIEnv *env, unused jclass clazz, Java_me_sergiotarxz_openmg_x11_starter_ExecHelper_pipeWriteFd(unused JNIEnv *env, unused jclass clazz,
jlong jp) { jlong jp) {
nativePipe* p = fromLong(jp); nativePipe* p = fromLong(jp);
if (!p) if (!p)
@ -59,7 +59,7 @@ Java_com_termux_x11_starter_ExecHelper_pipeWriteFd(unused JNIEnv *env, unused jc
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_termux_x11_starter_ExecHelper_flushPipe(unused JNIEnv *env, unused jclass clazz, jlong jp) { Java_me_sergiotarxz_openmg_x11_starter_ExecHelper_flushPipe(unused JNIEnv *env, unused jclass clazz, jlong jp) {
nativePipe* p = fromLong(jp); nativePipe* p = fromLong(jp);
if (!p) if (!p)
return; return;
@ -69,7 +69,7 @@ Java_com_termux_x11_starter_ExecHelper_flushPipe(unused JNIEnv *env, unused jcla
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_termux_x11_starter_ExecHelper_performExec(unused JNIEnv *env, unused jclass clazz, jlong jp) { Java_me_sergiotarxz_openmg_x11_starter_ExecHelper_performExec(unused JNIEnv *env, unused jclass clazz, jlong jp) {
nativePipe* p = fromLong(jp); nativePipe* p = fromLong(jp);
if (!p) if (!p)
return; return;

View File

@ -16,7 +16,7 @@
#define unused __attribute__((__unused__)) #define unused __attribute__((__unused__))
#define DEFAULT_PREFIX "/data/data/com.termux/files/usr" #define DEFAULT_PREFIX "/data/data/me.sergiotarxz.openmg.x11/files/usr"
#define DEFAULT_XDG_RUNTIME_DIR DEFAULT_PREFIX "/tmp" #define DEFAULT_XDG_RUNTIME_DIR DEFAULT_PREFIX "/tmp"
#define DEFAULT_SOCKET_NAME "wayland-0" #define DEFAULT_SOCKET_NAME "wayland-0"
@ -43,7 +43,7 @@ static int socket_action(int* fd, char* path,
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_termux_x11_starter_Starter_checkXdgRuntimeDir(unused JNIEnv *env, unused jobject thiz) { Java_me_sergiotarxz_openmg_x11_starter_Starter_checkXdgRuntimeDir(unused JNIEnv *env, unused jobject thiz) {
char* XDG_RUNTIME_DIR = getenv("XDG_RUNTIME_DIR"); char* XDG_RUNTIME_DIR = getenv("XDG_RUNTIME_DIR");
if (!XDG_RUNTIME_DIR || strlen(XDG_RUNTIME_DIR) == 0) { if (!XDG_RUNTIME_DIR || strlen(XDG_RUNTIME_DIR) == 0) {
printf("$XDG_RUNTIME_DIR is unset.\n"); printf("$XDG_RUNTIME_DIR is unset.\n");
@ -71,7 +71,7 @@ static const char *getWaylandSocketPath() {
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
Java_com_termux_x11_starter_Starter_checkWaylandSocket(unused JNIEnv *env, unused jobject thiz) { Java_me_sergiotarxz_openmg_x11_starter_Starter_checkWaylandSocket(unused JNIEnv *env, unused jobject thiz) {
int fd; int fd;
errno = 0; errno = 0;
@ -84,7 +84,7 @@ Java_com_termux_x11_starter_Starter_checkWaylandSocket(unused JNIEnv *env, unuse
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_termux_x11_starter_Starter_createWaylandSocket(unused JNIEnv *env, unused jobject thiz) { Java_me_sergiotarxz_openmg_x11_starter_Starter_createWaylandSocket(unused JNIEnv *env, unused jobject thiz) {
int fd; int fd;
errno = 0; errno = 0;
@ -100,7 +100,7 @@ Java_com_termux_x11_starter_Starter_createWaylandSocket(unused JNIEnv *env, unus
#pragma clang diagnostic push #pragma clang diagnostic push
#pragma ide diagnostic ignored "hicpp-signed-bitwise" #pragma ide diagnostic ignored "hicpp-signed-bitwise"
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_termux_x11_starter_Starter_openLogFD(unused JNIEnv *env, unused jobject thiz) { Java_me_sergiotarxz_openmg_x11_starter_Starter_openLogFD(unused JNIEnv *env, unused jobject thiz) {
const char* TERMUX_X11_LOG_FILE = getenv("TERMUX_X11_LOG_FILE"); const char* TERMUX_X11_LOG_FILE = getenv("TERMUX_X11_LOG_FILE");
int sv[2]; /* the pair of socket descriptors */ int sv[2]; /* the pair of socket descriptors */
if (TERMUX_X11_LOG_FILE == NULL || strlen(TERMUX_X11_LOG_FILE) == 0) if (TERMUX_X11_LOG_FILE == NULL || strlen(TERMUX_X11_LOG_FILE) == 0)
@ -143,7 +143,7 @@ Java_com_termux_x11_starter_Starter_openLogFD(unused JNIEnv *env, unused jobject
poll(&pfd, 1, 10000); poll(&pfd, 1, 10000);
execl("/data/data/com.termux/files/usr/bin/cat", "cat", NULL); execl("/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/cat", "cat", NULL);
dprintf(new_stderr, "execl cat: %s\n", strerror(errno)); dprintf(new_stderr, "execl cat: %s\n", strerror(errno));
return -1; return -1;
} }

View File

@ -1,4 +1,4 @@
#!/data/data/com.termux/files/usr/bin/bash #!/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/bash
DISPLAYNO=0 DISPLAYNO=0
socket_is_open() { socket_is_open() {
@ -8,7 +8,7 @@ socket_is_open() {
return $? return $?
} }
/data/data/com.termux/files/usr/bin/termux-x11 :$DISPLAYNO & /data/data/me.sergiotarxz.openmg.x11/files/usr/bin/termux-x11 :$DISPLAYNO &
{ {
#kill this script if termux-x11 is not up after 10 seconds #kill this script if termux-x11 is not up after 10 seconds

View File

@ -1,4 +1,4 @@
#!/data/data/com.termux/files/usr/bin/sh #!/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/sh
export CLASSPATH=/data/data/com.termux/files/usr/libexec/termux-x11/starter.apk export CLASSPATH=/data/data/me.sergiotarxz.openmg.x11/files/usr/libexec/termux-x11/starter.apk
unset LD_LIBRARY_PATH LD_PRELOAD unset LD_LIBRARY_PATH LD_PRELOAD
exec /system/bin/app_process / com.termux.x11.starter.Starter "$@" exec /system/bin/app_process / me.sergiotarxz.openmg.x11.starter.Starter "$@"