From 037c01264bdd771ae3c5037c61c82b776ffa450d Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Fri, 13 May 2022 17:11:38 +0200 Subject: [PATCH] Publishing my attempt to create a GTK4 app for android. --- BUILD.PL | 127 +++++++ README.md | 6 +- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 12 +- .../openmg}/x11/AdditionalKeyboardView.java | 2 +- .../openmg}/x11/KeyboardUtils.java | 2 +- .../openmg}/x11/LoriePreferences.java | 4 +- .../sergiotarxz/openmg}/x11/LorieService.java | 129 +++---- .../sergiotarxz/openmg}/x11/MainActivity.java | 2 +- .../openmg}/x11/TermuxX11StarterReceiver.java | 6 +- .../sergiotarxz/openmg}/x11/TouchParser.java | 2 +- app/src/main/jni/libxkbcommon/Android.mk | 4 +- .../xkbcommon/src/compose/config.h | 2 +- .../jni/libxkbcommon/xkbcommon/src/config.h | 2 +- .../xkbcommon/src/xkbcomp/config.h | 2 +- .../xkbcommon/tools/interactive-wayland.c | 6 +- .../jni/lorie/backend/android/android-app.cpp | 4 +- app/src/main/jni/lorie/compositor.cpp | 3 + .../jni/lorie/scanner/protocol/wayland.xml | 323 +++++++++++++++--- .../jni/prebuilt/x86_64/libwayland-server.so | Bin 76656 -> 74768 bytes app/src/main/res/layout/main_activity.xml | 2 +- app/src/main/res/xml/preferences.xml | 2 +- build_termux_package | 2 +- common/src/main/AndroidManifest.xml | 2 +- .../x11/common/ITermuxX11Internal.aidl | 2 +- starter/build.gradle | 2 +- starter/src/main/AndroidManifest.xml | 2 +- .../openmg}/x11/starter/ActivityManager.java | 2 +- .../starter/CrossVersionReflectedMethod.java | 2 +- .../openmg}/x11/starter/ExecHelper.java | 2 +- .../openmg}/x11/starter/IActivityManager.java | 4 +- .../openmg}/x11/starter/Starter.java | 25 +- starter/src/main/jni/exechelper.c | 8 +- starter/src/main/jni/starter.c | 14 +- termux-startx11 | 4 +- termux-x11 | 6 +- 36 files changed, 536 insertions(+), 185 deletions(-) create mode 100644 BUILD.PL rename app/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/AdditionalKeyboardView.java (99%) rename app/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/KeyboardUtils.java (99%) rename app/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/LoriePreferences.java (97%) rename app/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/LorieService.java (84%) rename app/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/MainActivity.java (99%) rename app/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/TermuxX11StarterReceiver.java (94%) rename app/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/TouchParser.java (99%) rename common/src/main/aidl/{com/termux => me/sergiotarxz/openmg}/x11/common/ITermuxX11Internal.aidl (81%) rename starter/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/starter/ActivityManager.java (99%) rename starter/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/starter/CrossVersionReflectedMethod.java (99%) rename starter/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/starter/ExecHelper.java (97%) rename starter/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/starter/IActivityManager.java (99%) rename starter/src/main/java/{com/termux => me/sergiotarxz/openmg}/x11/starter/Starter.java (92%) diff --git a/BUILD.PL b/BUILD.PL new file mode 100644 index 0000000..dea4057 --- /dev/null +++ b/BUILD.PL @@ -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}; +} diff --git a/README.md b/README.md index cd9135e..b8c9505 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,9 @@ You should start Termux:X11's activity with providing some additional data. ``` import android.os.ParcelFileDescriptor; 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() { Service svc = new Service(); @@ -66,7 +66,7 @@ private void startTermuxX11() { bundle.putBinder("", svc); Intent intent = new Intent(); - intent.putExtra("com.termux.x11.starter", bundle); + intent.putExtra("me.sergiotarxz.openmg.x11.starter", bundle); ComponentName cn = ComponentName.unflattenFromString(TermuxX11ComponentName); if (cn == null) throw new IllegalArgumentException("Bad component name: " + TermuxX11ComponentName); diff --git a/app/build.gradle b/app/build.gradle index 99419c8..15400ed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { - applicationId "com.termux.x11" + applicationId "me.sergiotarxz.openmg.x11" minSdkVersion 24 //noinspection OldTargetApi targetSdkVersion 28 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7974c17..dfb8fc3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,17 +1,12 @@ - - - - - - - - diff --git a/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java b/app/src/main/java/me/sergiotarxz/openmg/x11/AdditionalKeyboardView.java similarity index 99% rename from app/src/main/java/com/termux/x11/AdditionalKeyboardView.java rename to app/src/main/java/me/sergiotarxz/openmg/x11/AdditionalKeyboardView.java index 5436afa..53ea8af 100644 --- a/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java +++ b/app/src/main/java/me/sergiotarxz/openmg/x11/AdditionalKeyboardView.java @@ -1,4 +1,4 @@ -package com.termux.x11; +package me.sergiotarxz.openmg.x11; import android.annotation.SuppressLint; import android.content.Context; diff --git a/app/src/main/java/com/termux/x11/KeyboardUtils.java b/app/src/main/java/me/sergiotarxz/openmg/x11/KeyboardUtils.java similarity index 99% rename from app/src/main/java/com/termux/x11/KeyboardUtils.java rename to app/src/main/java/me/sergiotarxz/openmg/x11/KeyboardUtils.java index 6eb9d6f..3b52600 100644 --- a/app/src/main/java/com/termux/x11/KeyboardUtils.java +++ b/app/src/main/java/me/sergiotarxz/openmg/x11/KeyboardUtils.java @@ -1,4 +1,4 @@ -package com.termux.x11; +package me.sergiotarxz.openmg.x11; import android.app.Activity; import android.graphics.Rect; diff --git a/app/src/main/java/com/termux/x11/LoriePreferences.java b/app/src/main/java/me/sergiotarxz/openmg/x11/LoriePreferences.java similarity index 97% rename from app/src/main/java/com/termux/x11/LoriePreferences.java rename to app/src/main/java/me/sergiotarxz/openmg/x11/LoriePreferences.java index fe58d6d..01aef80 100644 --- a/app/src/main/java/com/termux/x11/LoriePreferences.java +++ b/app/src/main/java/me/sergiotarxz/openmg/x11/LoriePreferences.java @@ -1,4 +1,4 @@ -package com.termux.x11; +package me.sergiotarxz.openmg.x11; import android.content.SharedPreferences; import android.inputmethodservice.Keyboard; @@ -105,7 +105,7 @@ public class LoriePreferences extends AppCompatActivity implements SharedPrefere .setTitle("Permission denied") .setMessage("Android requires WRITE_SECURE_SETTINGS permission to change this setting.\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) .create() .show(); diff --git a/app/src/main/java/com/termux/x11/LorieService.java b/app/src/main/java/me/sergiotarxz/openmg/x11/LorieService.java similarity index 84% rename from app/src/main/java/com/termux/x11/LorieService.java rename to app/src/main/java/me/sergiotarxz/openmg/x11/LorieService.java index ff0a9b2..c1faabe 100644 --- a/app/src/main/java/com/termux/x11/LorieService.java +++ b/app/src/main/java/me/sergiotarxz/openmg/x11/LorieService.java @@ -1,4 +1,4 @@ -package com.termux.x11; +package me.sergiotarxz.openmg.x11; import android.annotation.SuppressLint; import android.app.ActivityManager; @@ -43,20 +43,27 @@ import android.widget.Toast; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; 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"}) @SuppressLint({"ClickableViewAccessibility", "StaticFieldLeak"}) public class LorieService extends Service { - static final String LAUNCHED_BY_COMPATION = "com.termux.x11.launched_by_companion"; - static final String ACTION_STOP_SERVICE = "com.termux.x11.service_stop"; - static final String ACTION_START_FROM_ACTIVITY = "com.termux.x11.start_from_activity"; - static final String ACTION_START_PREFERENCES_ACTIVITY = "com.termux.x11.start_preferences_activity"; - static final String ACTION_PREFERENCES_CHAGED = "com.termux.x11.preferences_changed"; + static final String LAUNCHED_BY_COMPATION = "me.sergiotarxz.openmg.x11.launched_by_companion"; + static final String ACTION_STOP_SERVICE = "me.sergiotarxz.openmg.x11.service_stop"; + static final String ACTION_START_FROM_ACTIVITY = "me.sergiotarxz.openmg.x11.start_from_activity"; + static final String ACTION_START_PREFERENCES_ACTIVITY = "me.sergiotarxz.openmg.x11.start_preferences_activity"; + static final String ACTION_PREFERENCES_CHAGED = "me.sergiotarxz.openmg.x11.preferences_changed"; private static LorieService instance = null; //private @@ -79,11 +86,11 @@ public class LorieService extends Service { Intent intent = new Intent(act, LorieService.class); intent.setAction(action); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - act.startForegroundService(intent); - } else { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// act.startForegroundService(intent); +// } else { act.startService(intent); - } +// } } @SuppressLint({"BatteryLife", "ObsoleteSdkInt"}) @@ -93,6 +100,40 @@ public class LorieService extends Service { if (isServiceRunningInForeground(this, LorieService.class)) return; 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 = { datadir + "/files/locale", datadir + "/files/xkb", @@ -155,19 +196,6 @@ public class LorieService extends Service { .addAction(0, "Preferences", pendingPreferencesIntent) .addAction(0, "Exit", pendingExitIntent) .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) @@ -225,46 +253,27 @@ public class LorieService extends Service { } private static void sendRunCommandInternal(Context ctx) { - Intent intent = new Intent(); - intent.setClassName("com.termux", "com.termux.app.RunCommandService"); - intent.setAction("com.termux.RUN_COMMAND"); - 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); - Log.d("LorieService", "sendRunCommand: " + intent); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - ctx.startForegroundService(intent); - } else { - ctx.startService(intent); - } + // Process process = Runtime.getRuntime().exec( + // "/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/bash " + + // "/data/data/me.sergiotarxz.openmg.x11/files/usr/bin/startopenmg" + // ); + + // Intent intent = new Intent(); + // intent.setClassName("com.termux", "com.termux.app.RunCommandService"); + // intent.setAction("com.termux.RUN_COMMAND"); + // 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); + // 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) { - final String ERROR_MESSAGE = - "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 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"); - } + LorieService.sendRunCommandInternal(act); } diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/me/sergiotarxz/openmg/x11/MainActivity.java similarity index 99% rename from app/src/main/java/com/termux/x11/MainActivity.java rename to app/src/main/java/me/sergiotarxz/openmg/x11/MainActivity.java index 46ed1b6..9a17146 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/me/sergiotarxz/openmg/x11/MainActivity.java @@ -1,4 +1,4 @@ -package com.termux.x11; +package me.sergiotarxz.openmg.x11; import android.app.Activity; import android.content.Intent; diff --git a/app/src/main/java/com/termux/x11/TermuxX11StarterReceiver.java b/app/src/main/java/me/sergiotarxz/openmg/x11/TermuxX11StarterReceiver.java similarity index 94% rename from app/src/main/java/com/termux/x11/TermuxX11StarterReceiver.java rename to app/src/main/java/me/sergiotarxz/openmg/x11/TermuxX11StarterReceiver.java index 0c08a5c..27ce085 100644 --- a/app/src/main/java/com/termux/x11/TermuxX11StarterReceiver.java +++ b/app/src/main/java/me/sergiotarxz/openmg/x11/TermuxX11StarterReceiver.java @@ -1,4 +1,4 @@ -package com.termux.x11; +package me.sergiotarxz.openmg.x11; import android.app.Activity; import android.content.Intent; @@ -9,7 +9,7 @@ import android.os.RemoteException; import android.util.Log; import android.widget.Toast; -import com.termux.x11.common.ITermuxX11Internal; +import me.sergiotarxz.openmg.x11.common.ITermuxX11Internal; import java.io.FileOutputStream; import java.io.IOException; @@ -35,7 +35,7 @@ public class TermuxX11StarterReceiver extends Activity { } private void handleIntent(Intent intent) { - final String extraName = "com.termux.x11.starter"; + final String extraName = "me.sergiotarxz.openmg.x11.starter"; Bundle bundle; IBinder token; ITermuxX11Internal svc; diff --git a/app/src/main/java/com/termux/x11/TouchParser.java b/app/src/main/java/me/sergiotarxz/openmg/x11/TouchParser.java similarity index 99% rename from app/src/main/java/com/termux/x11/TouchParser.java rename to app/src/main/java/me/sergiotarxz/openmg/x11/TouchParser.java index 00fdaf4..48e187c 100644 --- a/app/src/main/java/com/termux/x11/TouchParser.java +++ b/app/src/main/java/me/sergiotarxz/openmg/x11/TouchParser.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.termux.x11; +package me.sergiotarxz.openmg.x11; import android.annotation.SuppressLint; import android.content.Context; diff --git a/app/src/main/jni/libxkbcommon/Android.mk b/app/src/main/jni/libxkbcommon/Android.mk index 8638a1d..845d719 100644 --- a/app/src/main/jni/libxkbcommon/Android.mk +++ b/app/src/main/jni/libxkbcommon/Android.mk @@ -37,11 +37,11 @@ LOCAL_SRC_FILES := \ LOCAL_CFLAGS := \ -std=c99 -Wall -Werror -Wno-unused-parameter -Wno-missing-field-initializers -Wimplicit-function-declaration \ -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_MODEL=\"pc105\" \ -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_EXPORT_C_INCLUDES := $(LOCAL_PATH)/xkbcommon/ include $(BUILD_SHARED_LIBRARY) diff --git a/app/src/main/jni/libxkbcommon/xkbcommon/src/compose/config.h b/app/src/main/jni/libxkbcommon/xkbcommon/src/compose/config.h index a0f0833..788a512 100644 --- a/app/src/main/jni/libxkbcommon/xkbcommon/src/compose/config.h +++ b/app/src/main/jni/libxkbcommon/xkbcommon/src/compose/config.h @@ -1,6 +1,6 @@ #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" diff --git a/app/src/main/jni/libxkbcommon/xkbcommon/src/config.h b/app/src/main/jni/libxkbcommon/xkbcommon/src/config.h index a0f0833..788a512 100644 --- a/app/src/main/jni/libxkbcommon/xkbcommon/src/config.h +++ b/app/src/main/jni/libxkbcommon/xkbcommon/src/config.h @@ -1,6 +1,6 @@ #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" diff --git a/app/src/main/jni/libxkbcommon/xkbcommon/src/xkbcomp/config.h b/app/src/main/jni/libxkbcommon/xkbcommon/src/xkbcomp/config.h index a0f0833..788a512 100644 --- a/app/src/main/jni/libxkbcommon/xkbcommon/src/xkbcomp/config.h +++ b/app/src/main/jni/libxkbcommon/xkbcommon/src/xkbcomp/config.h @@ -1,6 +1,6 @@ #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" diff --git a/app/src/main/jni/libxkbcommon/xkbcommon/tools/interactive-wayland.c b/app/src/main/jni/libxkbcommon/xkbcommon/tools/interactive-wayland.c index d23432d..1aedbda 100644 --- a/app/src/main/jni/libxkbcommon/xkbcommon/tools/interactive-wayland.c +++ b/app/src/main/jni/libxkbcommon/xkbcommon/tools/interactive-wayland.c @@ -607,17 +607,17 @@ registry_global(void *data, struct wl_registry *registry, uint32_t name, else if (strcmp(interface, "xdg_wm_base") == 0) { inter->shell = wl_registry_bind(registry, name, &xdg_wm_base_interface, - MAX(version, 2)); + MAX(version, 4)); xdg_wm_base_add_listener(inter->shell, &shell_listener, inter); } else if (strcmp(interface, "wl_compositor") == 0) { inter->compositor = wl_registry_bind(registry, name, &wl_compositor_interface, - MAX(version, 1)); + MAX(version, 4)); } else if (strcmp(interface, "wl_shm") == 0) { inter->shm = wl_registry_bind(registry, name, &wl_shm_interface, - MAX(version, 1)); + MAX(version, 4)); } } diff --git a/app/src/main/jni/lorie/backend/android/android-app.cpp b/app/src/main/jni/lorie/backend/android/android-app.cpp index 537af65..49f3f8b 100644 --- a/app/src/main/jni/lorie/backend/android/android-app.cpp +++ b/app/src/main/jni/lorie/backend/android/android-app.cpp @@ -179,7 +179,7 @@ void LorieBackendAndroid::passfd(int fd) { #define JNI_DECLARE_INNER(package, classname, methodname ) \ Java_ ## package ## _ ## 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 @@ -427,7 +427,7 @@ void fork(std::function f) { } 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(); LOGI("Starting logcat with output to given fd"); diff --git a/app/src/main/jni/lorie/compositor.cpp b/app/src/main/jni/lorie/compositor.cpp index 6758c52..49869d9 100644 --- a/app/src/main/jni/lorie/compositor.cpp +++ b/app/src/main/jni/lorie/compositor.cpp @@ -39,6 +39,9 @@ void LorieCompositor::start() { wl_resource_t::global_create(display, this); wl_resource_t::global_create(display, this); + wl_registry *registry = wl_display_get_registry(this->display); + wl_registry_bind(registry, id, &xdg_wm_base_interface, 1); + backend_init(); wl_display_run(display); diff --git a/app/src/main/jni/lorie/scanner/protocol/wayland.xml b/app/src/main/jni/lorie/scanner/protocol/wayland.xml index 3f02347..784d971 100644 --- a/app/src/main/jni/lorie/scanner/protocol/wayland.xml +++ b/app/src/main/jni/lorie/scanner/protocol/wayland.xml @@ -91,7 +91,7 @@ + summary="method doesn't exist on the specified interface or malformed request"/> This event is used internally by the object ID management - logic. When a client deletes an object, the server will send - this event to acknowledge that it has seen the delete request. - When the client receives this event, it will know that it can - safely reuse the object ID. + logic. When a client deletes an object that it had created, + the server will send this event to acknowledge that it has + seen the delete request. When the client receives this event, + it will know that it can safely reuse the object ID. @@ -179,7 +179,7 @@ the related request is done. - + Notify the client when the related request is done. @@ -187,7 +187,7 @@ - + A compositor. This object is a singleton global. The 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 renderer in use. - The drm format codes match the macros defined in drm_fourcc.h. - The formats actually supported by the compositor will be - reported by the format event. + The drm format codes match the macros defined in drm_fourcc.h, except + argb8888 and xrgb8888. The formats actually supported by the compositor + 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. + @@ -355,6 +360,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -383,10 +438,15 @@ A buffer provides the content for a wl_surface. Buffers are - created through factory interfaces such as wl_drm, wl_shm or - similar. It has a width and a height and can be attached to a - wl_surface, but the mechanism by which a client provides and - updates the contents is defined by the buffer factory interface. + created through factory interfaces such as wl_shm, wp_linux_buffer_params + (from the linux-dmabuf protocol extension) or similar. It has a width and + a height and can be attached to a wl_surface, but the mechanism by which a + 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. @@ -509,6 +569,9 @@ this request after a NULL mime type has been set in wl_data_offer.accept or no action was received through 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. @@ -525,7 +588,7 @@ This request determines the final result of the drag-and-drop 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 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 will be raised otherwise. - - + + @@ -556,7 +621,8 @@ will be sent right after wl_data_device.enter, or anytime the source side changes its offered actions through wl_data_source.set_actions. - + @@ -597,7 +663,8 @@ final wl_data_offer.set_actions and wl_data_offer.accept requests must happen before the call to wl_data_offer.finish. - + @@ -694,7 +761,8 @@ wl_data_device.start_drag. Attempting to use the source other than for drag-and-drop will raise a protocol error. - + @@ -750,7 +818,8 @@ Clients can trigger cursor surface changes from this point, so they reflect the current action. - + @@ -776,7 +845,8 @@ for the eventual data transfer. If source is NULL, enter, leave and motion events are sent only to the client that initiated the 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 client must have an active implicit grab that matches the @@ -890,9 +960,10 @@ immediately before receiving keyboard focus and when a new selection is set while the client has keyboard focus. The data_offer is valid until a new data_offer or NULL is received - or until the client loses keyboard focus. The client must - destroy the previous selection data_offer, if any, upon receiving - this event. + or until the client loses keyboard focus. Switching surface with + keyboard focus within the same client doesn't mean a new selection + will be sent. The client must destroy the previous selection + data_offer, if any, upon receiving this event. @@ -1274,10 +1345,12 @@ - + - A surface is a rectangular area that is displayed on the screen. - It has a location, size and pixel contents. + A surface is a rectangular area that may be displayed on zero + 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 in surface-local coordinates, which may differ from the buffer @@ -1323,6 +1396,8 @@ + + @@ -1337,14 +1412,22 @@ The new size of the surface is calculated based on the buffer size transformed by the inverse buffer_transform and the - inverse buffer_scale. This means that the supplied buffer - must be an integer multiple of the buffer_scale. + inverse buffer_scale. This means that at commit time the supplied + 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 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. + 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. @@ -1365,10 +1448,19 @@ will not receive a release event, and is not used by the 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 - the surface contents. However, if the client destroys the - wl_buffer before receiving the wl_buffer.release event, the surface - contents become undefined immediately. + the surface contents. Destroying the wl_buffer before wl_buffer.release + is allowed as long as the underlying buffer storage isn't re-used (this + 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 following wl_surface.commit will remove the surface content. @@ -1545,6 +1637,12 @@ 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 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. @@ -1660,9 +1758,30 @@ + + + + + + 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. + + + + - + 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 @@ -1680,6 +1799,14 @@ + + + These errors can be emitted in response to wl_seat requests. + + + + 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 capability, or has had the pointer capability in the past. 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. @@ -1731,7 +1859,8 @@ This request only takes effect if the seat has the keyboard capability, or has had the keyboard capability in the past. 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. @@ -1744,7 +1873,8 @@ This request only takes effect if the seat has the touch capability, or has had the touch capability in the past. 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. @@ -1753,16 +1883,29 @@ - In a multiseat configuration this can be used by the client to help - identify which physical devices the seat represents. Based on - the seat configuration used by the compositor. + In a multi-seat configuration the seat name can be used by clients to + help identify which physical devices the seat represents. + + 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. - + Using this request a client can tell the server that it is not going to use the seat object anymore. @@ -1820,6 +1963,10 @@ wl_surface is no longer used as the cursor. When the use as a cursor ends, the current and pending input regions become 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. 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 the recipient, as MAP_SHARED may fail. @@ -2128,6 +2276,9 @@ Notification that this seat's keyboard focus is on a certain surface. + + The compositor must send the wl_keyboard.modifiers event after this + event. @@ -2141,6 +2292,9 @@ The leave notification is sent before the enter notification 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. @@ -2159,6 +2313,12 @@ A key was pressed or released. The time argument is a timestamp with millisecond 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. @@ -2352,7 +2512,7 @@ - + An output describes part of the compositor geometry. The 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 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 position and identification. Some compositors, for instance those not implementing a desktop-style output layout or those exposing virtual outputs, might fake this information. Instead of using x and y, clients 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. @@ -2454,6 +2617,10 @@ current. In other words, the current mode is always the last 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 output device. This is not necessarily the same as the output size in the global compositor space. For instance, @@ -2462,6 +2629,12 @@ willing to retrieve the output size in the global compositor 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, they should use the wl_surface.frame event or the presentation-time protocol. @@ -2508,6 +2681,8 @@ the scale of the output. That way the compositor can avoid scaling the surface, and the client can supply a higher detail image. + + The scale event will be followed by a done event. @@ -2520,6 +2695,62 @@ use the output object anymore. + + + + + + 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. + + + + + + + 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. + + + @@ -2643,7 +2874,7 @@ wl_surface state directly. A sub-surface is initially in the 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 state includes the sub-surface position relative to the parent surface (wl_subsurface.set_position), and the stacking order of diff --git a/app/src/main/jni/prebuilt/x86_64/libwayland-server.so b/app/src/main/jni/prebuilt/x86_64/libwayland-server.so index bc54780ba8c46ce09ad02072742a65bf5dd4927d..038bc0e510028541a1cdae386c459e31ac4278e2 100755 GIT binary patch literal 74768 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

?ga3o&B925Cr0K)n8!$Dc}Cbu2;5Sl5ZdKhL^Z= z`))$}L+I8yZ~ky#0AU_;(6=r?IB_4!inQ(@4W@0Rv?io2u@6G@YEO|v-)SSmsmA)= zveU!!lOtAwy*SxxFHBov*SWoR-RLEDMfwtZyXif!FoyL zJ+LSzL3ln|>rVzqDgPO_L(S(rBCj**X@EPc`X_ld+p)K4x zIGhGg^9HvOevYhz3rcADr#8|CS%A$>?1YE~CAgo3MJgkV*TtL*H{JX;aYW4)p4j z0_cB{);?8q_nZj3*3$e(`oMy5uwiV_+kYd;#v*rq^8qZZC~9+R@JLI8Bv4AGX9RoL zszO+eA>QkZ0@D93^d4LY)=MIFqhNO{??Jp+g9Q&(PJdZq_b#! $i7 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 literal 76656 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 diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index 0299941..a66c828 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -15,7 +15,7 @@ - diff --git a/build_termux_package b/build_termux_package index dbdd8f2..9f79a2a 100755 --- a/build_termux_package +++ b/build_termux_package @@ -9,7 +9,7 @@ NDKBUILD_DIR=starter/build/intermediates/ndkBuild/debug/obj/local DATA_DIR=$INTERMEDIATES/data CONTROL_DIR=$INTERMEDIATES/control 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 diff --git a/common/src/main/AndroidManifest.xml b/common/src/main/AndroidManifest.xml index c2d27df..da0d91b 100644 --- a/common/src/main/AndroidManifest.xml +++ b/common/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="me.sergiotarxz.openmg.x11.common"> \ No newline at end of file diff --git a/common/src/main/aidl/com/termux/x11/common/ITermuxX11Internal.aidl b/common/src/main/aidl/me/sergiotarxz/openmg/x11/common/ITermuxX11Internal.aidl similarity index 81% rename from common/src/main/aidl/com/termux/x11/common/ITermuxX11Internal.aidl rename to common/src/main/aidl/me/sergiotarxz/openmg/x11/common/ITermuxX11Internal.aidl index 5883945..3688a0f 100644 --- a/common/src/main/aidl/com/termux/x11/common/ITermuxX11Internal.aidl +++ b/common/src/main/aidl/me/sergiotarxz/openmg/x11/common/ITermuxX11Internal.aidl @@ -1,4 +1,4 @@ -package com.termux.x11.common; +package me.sergiotarxz.openmg.x11.common; // This interface is used by utility on termux side. interface ITermuxX11Internal { diff --git a/starter/build.gradle b/starter/build.gradle index a49a9ea..51cff62 100644 --- a/starter/build.gradle +++ b/starter/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { - applicationId "com.termux.termuxam" + applicationId "me.sergiotarxz.openmg.termuxam" minSdkVersion 21 // Note: targetSdkVersion affects only tests, // normally, even though this is packaged as apk, diff --git a/starter/src/main/AndroidManifest.xml b/starter/src/main/AndroidManifest.xml index 5cae546..9f68f1d 100644 --- a/starter/src/main/AndroidManifest.xml +++ b/starter/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="me.sergiotarxz.openmg.x11.starter">