Publishing my attempt to create a GTK4 app for android.
This commit is contained in:
parent
ab34e5462c
commit
037c01264b
127
BUILD.PL
Normal file
127
BUILD.PL
Normal 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};
|
||||||
|
}
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
@ -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;
|
@ -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();
|
@ -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 =
|
|
||||||
"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);
|
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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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)
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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");
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Binary file not shown.
@ -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"
|
||||||
|
@ -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" />
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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>
|
@ -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 {
|
@ -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,
|
||||||
|
@ -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"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.termux.x11.starter;
|
package me.sergiotarxz.openmg.x11.starter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \@hide-hidden constants
|
* \@hide-hidden constants
|
@ -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;
|
@ -1,4 +1,4 @@
|
|||||||
package com.termux.x11.starter;
|
package me.sergiotarxz.openmg.x11.starter;
|
||||||
|
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
|
|
@ -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 {
|
@ -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;
|
|
||||||
for (int i = 0; i < 200; i++) {
|
|
||||||
if (checkWaylandSocket()) {
|
|
||||||
started = true;
|
|
||||||
Thread.sleep(200);
|
|
||||||
startXwayland(args);
|
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";
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 "$@"
|
||||||
|
Loading…
Reference in New Issue
Block a user