mirror of
https://github.com/lihop/godot-xterm.git
synced 2024-11-22 09:40:25 +01:00
Add HTML5 support
This commit is contained in:
parent
fbb23661d3
commit
bb8d40df58
18 changed files with 284 additions and 31 deletions
23
.github/workflows/main.yml
vendored
23
.github/workflows/main.yml
vendored
|
@ -11,17 +11,21 @@ jobs:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
platform: [ linux, osx, windows ]
|
platform: [ linux, javascript, osx, windows ]
|
||||||
target: [ release, debug ]
|
target: [ release, debug ]
|
||||||
bits: [ 64, 32 ]
|
bits: [ 64, 32 ]
|
||||||
include:
|
include:
|
||||||
- platform: linux
|
- platform: linux
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
|
- platform: javascript
|
||||||
|
os: ubuntu-latest
|
||||||
- platform: osx
|
- platform: osx
|
||||||
os: macos-latest
|
os: macos-latest
|
||||||
- platform: windows
|
- platform: windows
|
||||||
os: windows-latest
|
os: windows-latest
|
||||||
exclude:
|
exclude:
|
||||||
|
- platform: javascript
|
||||||
|
bits: 64 # Currently only wasm32 is supported.
|
||||||
- platform: osx
|
- platform: osx
|
||||||
bits: 32 # Only 64-bit supported on macOS.
|
bits: 32 # Only 64-bit supported on macOS.
|
||||||
- platform: windows
|
- platform: windows
|
||||||
|
@ -45,12 +49,28 @@ jobs:
|
||||||
with:
|
with:
|
||||||
path: addons/godot_xterm/native/external/godot-cpp
|
path: addons/godot_xterm/native/external/godot-cpp
|
||||||
key: godot-cpp-${{ matrix.platform }}-${{ matrix.target }}-${{ matrix.bits }}-${{ env.GODOT_CPP_COMMIT_HASH }}
|
key: godot-cpp-${{ matrix.platform }}-${{ matrix.target }}-${{ matrix.bits }}-${{ env.GODOT_CPP_COMMIT_HASH }}
|
||||||
|
- name: Cache emscripten
|
||||||
|
if: ${{ matrix.platform == 'javascript' }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
env:
|
||||||
|
cache-name: cache-emscripten
|
||||||
|
with:
|
||||||
|
path: addons/godot_xterm/native/.emcache
|
||||||
|
key: emsdk-cache-${{ matrix.target }}
|
||||||
|
|
||||||
# Ubuntu-specific steps.
|
# Ubuntu-specific steps.
|
||||||
- name: Install ubuntu build dependencies
|
- name: Install ubuntu build dependencies
|
||||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||||
run: sudo apt-get install -y scons gcc-multilib g++-multilib
|
run: sudo apt-get install -y scons gcc-multilib g++-multilib
|
||||||
|
|
||||||
|
# JavaScript-specific steps.
|
||||||
|
- name: Install javascript build dependencies
|
||||||
|
if: ${{ matrix.platform == 'javascript' }}
|
||||||
|
uses: mymindstorm/setup-emsdk@v9
|
||||||
|
with:
|
||||||
|
version: 2.0.10
|
||||||
|
actions-cache-folder: emsdk-cache-${{ matrix.target }}
|
||||||
|
|
||||||
# MacOS-specific steps.
|
# MacOS-specific steps.
|
||||||
- name: Install additional macos build dependencies
|
- name: Install additional macos build dependencies
|
||||||
if: ${{ matrix.os == 'macos-latest' }}
|
if: ${{ matrix.os == 'macos-latest' }}
|
||||||
|
@ -80,6 +100,7 @@ jobs:
|
||||||
name: libgodot-xterm-${{ matrix.target }}
|
name: libgodot-xterm-${{ matrix.target }}
|
||||||
path: |
|
path: |
|
||||||
addons/godot_xterm/native/bin/*.so
|
addons/godot_xterm/native/bin/*.so
|
||||||
|
addons/godot_xterm/native/bin/*.wasm
|
||||||
addons/godot_xterm/native/bin/*.dylib
|
addons/godot_xterm/native/bin/*.dylib
|
||||||
addons/godot_xterm/native/bin/*.dll
|
addons/godot_xterm/native/bin/*.dll
|
||||||
|
|
||||||
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -2,6 +2,7 @@
|
||||||
.import/
|
.import/
|
||||||
export.cfg
|
export.cfg
|
||||||
export_presets.cfg
|
export_presets.cfg
|
||||||
|
export/
|
||||||
|
|
||||||
# Mono-specific ignores
|
# Mono-specific ignores
|
||||||
.mono/
|
.mono/
|
||||||
|
@ -9,3 +10,6 @@ data_*/
|
||||||
|
|
||||||
# Python-specific ignores
|
# Python-specific ignores
|
||||||
.venv
|
.venv
|
||||||
|
|
||||||
|
# Emscripten-specific ignores
|
||||||
|
.emcache/
|
||||||
|
|
|
@ -7,10 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Added
|
### Added
|
||||||
|
- HTML5 Support.
|
||||||
- Theme colors now support transparency.
|
- Theme colors now support transparency.
|
||||||
- More themes: base16_dark, base16_light, default_dark, default_light, soft_black, solarized, solarized_black, solarized_white.
|
- More themes: base16_dark, base16_light, default_dark, default_light, soft_black, solarized, solarized_black, solarized_white.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- Supported Godot version -> 3.3.2.
|
||||||
- Set a default theme if no theme property has been set.
|
- Set a default theme if no theme property has been set.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
24
README.md
24
README.md
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# GodotXterm
|
# GodotXterm
|
||||||
|
|
||||||
![Godot Version](https://img.shields.io/badge/godot-3.2+-blue.svg)
|
![Godot Version](https://img.shields.io/badge/godot-3.3+-blue.svg)
|
||||||
![License](https://img.shields.io/badge/license-MIT-green.svg)
|
![License](https://img.shields.io/badge/license-MIT-green.svg)
|
||||||
[![Build Status](https://github.com/lihop/godot-xterm/workflows/build/badge.svg?branch=master)](https://github.com/lihop/godot-xterm/actions?query=branch%3Amaster)
|
[![Build Status](https://github.com/lihop/godot-xterm/workflows/build/badge.svg?branch=master)](https://github.com/lihop/godot-xterm/actions?query=branch%3Amaster)
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ Terminal emulator for Godot using GDNative and [libtsm](https://github.com/Aetf/
|
||||||
|
|
||||||
### Confirmed:
|
### Confirmed:
|
||||||
- Linux 64-bit (primarily developed/tested on this platform)
|
- Linux 64-bit (primarily developed/tested on this platform)
|
||||||
|
- HTML5 (also tested on this platform)
|
||||||
- Linux 32-bit
|
- Linux 32-bit
|
||||||
- MacOS 64-bit
|
- MacOS 64-bit
|
||||||
- Windows 64-bit
|
- Windows 64-bit
|
||||||
|
@ -23,6 +24,14 @@ Terminal emulator for Godot using GDNative and [libtsm](https://github.com/Aetf/
|
||||||
### Planned/untested:
|
### Planned/untested:
|
||||||
- Windows 32-bit
|
- Windows 32-bit
|
||||||
|
|
||||||
|
|
||||||
|
## Demo
|
||||||
|
|
||||||
|
- An online demo of an HTML5 export of this repo (using the GDNative export type, available since Godot 3.3) can be found [here](https://demo.godot-xterm.nix.nz).
|
||||||
|
Make sure you click the screen at least once after loading.
|
||||||
|
|
||||||
|
- A Linux, MacOS, and Windows demo, which uses GodotXterm in conjunction with [Godot Python](https://github.com/touilleMan/godot-python) can be downloaded [here](https://lihop.itch.io/xterminate).
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,6 +45,7 @@ Precompiled binaries can be downloaded from the GitHub releases page. Download t
|
||||||
After extracting the zip file, the directory should contain the following:
|
After extracting the zip file, the directory should contain the following:
|
||||||
- `libgodot-xterm.linux.64.so`
|
- `libgodot-xterm.linux.64.so`
|
||||||
- `libgodot-xterm.linux.32.so`
|
- `libgodot-xterm.linux.32.so`
|
||||||
|
- `libgodot-xterm.javascript.32.wasm`
|
||||||
- `libgodot-xterm.osx.64.dylib`
|
- `libgodot-xterm.osx.64.dylib`
|
||||||
- `libgodot-xterm.windows.64.dll`
|
- `libgodot-xterm.windows.64.dll`
|
||||||
|
|
||||||
|
@ -44,6 +54,7 @@ This plugin follows the standard format of a GDNative plugin as shown in [GDNati
|
||||||
Therefore, referring to the following documentation on compiling a GDNative plugin and compiling the Godot engine itself may be useful:
|
Therefore, referring to the following documentation on compiling a GDNative plugin and compiling the Godot engine itself may be useful:
|
||||||
- [GDNative C++ Example: Compiling the plugin](https://docs.godotengine.org/en/stable/tutorials/plugins/gdnative/gdnative-cpp-example.html#compiling-the-plugin).
|
- [GDNative C++ Example: Compiling the plugin](https://docs.godotengine.org/en/stable/tutorials/plugins/gdnative/gdnative-cpp-example.html#compiling-the-plugin).
|
||||||
- [Compiling for X11 (Linux, \*BSD)](https://docs.godotengine.org/en/stable/development/compiling/compiling_for_x11.html)
|
- [Compiling for X11 (Linux, \*BSD)](https://docs.godotengine.org/en/stable/development/compiling/compiling_for_x11.html)
|
||||||
|
- [Compiling for the Web](https://docs.godotengine.org/en/3.3/development/compiling/compiling_for_web.html)
|
||||||
- [Compiling for macOS](https://docs.godotengine.org/en/stable/development/compiling/compiling_for_osx.html)
|
- [Compiling for macOS](https://docs.godotengine.org/en/stable/development/compiling/compiling_for_osx.html)
|
||||||
- [Compiling for Windows](https://docs.godotengine.org/en/stable/development/compiling/compiling_for_windows.html)
|
- [Compiling for Windows](https://docs.godotengine.org/en/stable/development/compiling/compiling_for_windows.html)
|
||||||
|
|
||||||
|
@ -53,6 +64,7 @@ The main dependencies are:
|
||||||
- [Git](https://git-scm.com/) (to clone git submodules)
|
- [Git](https://git-scm.com/) (to clone git submodules)
|
||||||
- [SCons](https://scons.org/) (a software construction tool)
|
- [SCons](https://scons.org/) (a software construction tool)
|
||||||
- A C/C++ compiler (i.e. [gcc](https://gcc.gnu.org/), [llvm](https://llvm.org/), [MSVC](https://visualstudio.microsoft.com/vs/features/cplusplus/))
|
- A C/C++ compiler (i.e. [gcc](https://gcc.gnu.org/), [llvm](https://llvm.org/), [MSVC](https://visualstudio.microsoft.com/vs/features/cplusplus/))
|
||||||
|
- [Emscripten](https://emscripten.org/) version 2.0.10 (for HTML5 build)
|
||||||
|
|
||||||
**Note**: If you are cross-compiling, then you will likely need other dependencies than those listed below.
|
**Note**: If you are cross-compiling, then you will likely need other dependencies than those listed below.
|
||||||
|
|
||||||
|
@ -80,6 +92,12 @@ choco install python3 && python -m pip install scons
|
||||||
#### Steps
|
#### Steps
|
||||||
|
|
||||||
The [build.sh] script in `addons/godot_xterm/native` is provided for convenience and can be used on Linux to perform the steps below using the default scons options. On NixOS it will use the `shell.nix` file in the same directory to bring in all dependencies to the build environment.
|
The [build.sh] script in `addons/godot_xterm/native` is provided for convenience and can be used on Linux to perform the steps below using the default scons options. On NixOS it will use the `shell.nix` file in the same directory to bring in all dependencies to the build environment.
|
||||||
|
A Dockerfile is also provided to build for the javascript platform.
|
||||||
|
It can be run (after cloning Git submodules) with:
|
||||||
|
```
|
||||||
|
UID_GID="$(id -u):$(id -g)" docker-compose run javascript-build
|
||||||
|
```
|
||||||
|
The 'wasm' binary will be placed in the `bin` directory alongside others.
|
||||||
|
|
||||||
##### 1. Clone Git Submodules
|
##### 1. Clone Git Submodules
|
||||||
This step only needs to be performed once and will clone the git repos this plugin depends on to `addons/godot_xterm/native/external`.
|
This step only needs to be performed once and will clone the git repos this plugin depends on to `addons/godot_xterm/native/external`.
|
||||||
|
@ -95,7 +113,7 @@ This step only needs to be performed once per platform/target/bits combination y
|
||||||
cd addons/godot_xterm/native/external/godot-cpp
|
cd addons/godot_xterm/native/external/godot-cpp
|
||||||
scons platform=<platform> target=<target> bits=<bits> generate_bindings=yes
|
scons platform=<platform> target=<target> bits=<bits> generate_bindings=yes
|
||||||
```
|
```
|
||||||
Where `<platform>` is one of `linux`, `osx` or `windows`, `<target>` is one of `release` or `debug` and `<bits>` is one of `32` or `64`.
|
Where `<platform>` is one of `linux`, `javascript`, `osx` or `windows`, `<target>` is one of `release` or `debug` and `<bits>` is one of `32` or `64`.
|
||||||
The `generate_bindings=yes` option is essential.
|
The `generate_bindings=yes` option is essential.
|
||||||
|
|
||||||
##### 3. Build GodotXterm
|
##### 3. Build GodotXterm
|
||||||
|
@ -147,7 +165,7 @@ There are three example scenes included in this project which you can study to l
|
||||||
If you contribute code to this project, you are implicitly allowing your code to be distributed under the MIT license.
|
If you contribute code to this project, you are implicitly allowing your code to be distributed under the MIT license.
|
||||||
You are also implicitly verifying that all code is your original work, or unoriginal work which is published under a compatible license or waiver.
|
You are also implicitly verifying that all code is your original work, or unoriginal work which is published under a compatible license or waiver.
|
||||||
|
|
||||||
Copyright (c) 2020 [The GodotXterm authors](https://github.com/lihop/godot-xterm/graphs/contributors) (MIT License)<br>
|
Copyright (c) 2020-2021 Leroy Hopson and [Contributors](https://github.com/lihop/godot-xterm/graphs/contributors) (MIT License)<br>
|
||||||
|
|
||||||
The fonts used in this project are published under a seperate license.
|
The fonts used in this project are published under a seperate license.
|
||||||
See the various license files in the [subdirectories](addons/godot_xterm/themes/fonts/) for each font.
|
See the various license files in the [subdirectories](addons/godot_xterm/themes/fonts/) for each font.
|
||||||
|
|
|
@ -46,7 +46,7 @@ opts.Add(EnumVariable(
|
||||||
'platform',
|
'platform',
|
||||||
'Target platform',
|
'Target platform',
|
||||||
host_platform,
|
host_platform,
|
||||||
allowed_values=('linux', 'osx', 'windows'),
|
allowed_values=('linux', 'javascript', 'osx', 'windows'),
|
||||||
ignorecase=2
|
ignorecase=2
|
||||||
))
|
))
|
||||||
opts.Add(EnumVariable(
|
opts.Add(EnumVariable(
|
||||||
|
@ -76,6 +76,7 @@ if env['platform'] == 'linux':
|
||||||
|
|
||||||
env['CC'] = 'gcc'
|
env['CC'] = 'gcc'
|
||||||
env['CXX'] = 'g++'
|
env['CXX'] = 'g++'
|
||||||
|
env['LIBSUFFIX'] = '.a'
|
||||||
|
|
||||||
env.Append(CCFLAGS=['-fPIC', '-Wwrite-strings'])
|
env.Append(CCFLAGS=['-fPIC', '-Wwrite-strings'])
|
||||||
env.Append(LINKFLAGS=["-Wl,-R'$$ORIGIN'"])
|
env.Append(LINKFLAGS=["-Wl,-R'$$ORIGIN'"])
|
||||||
|
@ -92,6 +93,28 @@ if env['platform'] == 'linux':
|
||||||
env.Append(CCFLAGS=['-m32'])
|
env.Append(CCFLAGS=['-m32'])
|
||||||
env.Append(LINKFLAGS=['-m32'])
|
env.Append(LINKFLAGS=['-m32'])
|
||||||
|
|
||||||
|
# Compile for HTML5.
|
||||||
|
elif env['platform'] == 'javascript':
|
||||||
|
env.Append(CPPDEFINES=['PLATFORM_JS'])
|
||||||
|
|
||||||
|
env['bits'] = '32'
|
||||||
|
env['CC'] = 'emcc'
|
||||||
|
env['CXX'] = 'em++'
|
||||||
|
env['AR'] = 'emar'
|
||||||
|
env['RANLIB'] = 'emranlib'
|
||||||
|
env.Append(CPPFLAGS=['-s', 'SIDE_MODULE=1'])
|
||||||
|
env.Append(LINKFLAGS=['-s', 'SIDE_MODULE=1'])
|
||||||
|
env['SHOBJSUFFIX'] = '.bc'
|
||||||
|
env['SHLIBSUFFIX'] = '.wasm'
|
||||||
|
env['OBJPREFIX'] = ''
|
||||||
|
env['OBJSUFFIX'] = '.bc'
|
||||||
|
env['PROGPREFIX'] = ''
|
||||||
|
env['PROGSUFFIX'] = ''
|
||||||
|
env['LIBSUFFIX'] = '.bc'
|
||||||
|
env['LIBPREFIXES'] = ['$LIBPREFIX']
|
||||||
|
env['LIBSUFFIXES'] = ['$LIBSUFFIX']
|
||||||
|
env.Replace(SHLINKFLAGS='$LINKFLAGS')
|
||||||
|
env.Replace(SHLINKFLAGS='$LINKFLAGS')
|
||||||
|
|
||||||
# Compile for OSX.
|
# Compile for OSX.
|
||||||
elif env['platform'] == 'osx':
|
elif env['platform'] == 'osx':
|
||||||
|
@ -99,6 +122,7 @@ elif env['platform'] == 'osx':
|
||||||
|
|
||||||
env['CC'] = 'clang'
|
env['CC'] = 'clang'
|
||||||
env['CXX'] = 'clang++'
|
env['CXX'] = 'clang++'
|
||||||
|
env['LIBSUFFIX'] = '.a'
|
||||||
|
|
||||||
if env['bits'] == '32':
|
if env['bits'] == '32':
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
|
@ -121,6 +145,7 @@ elif env['platform'] == 'osx':
|
||||||
# Compile for Windows.
|
# Compile for Windows.
|
||||||
elif env['platform'] == 'windows':
|
elif env['platform'] == 'windows':
|
||||||
env.Append(CPPDEFINES=['PLATFORM_WINDOWS'])
|
env.Append(CPPDEFINES=['PLATFORM_WINDOWS'])
|
||||||
|
env['LIBSUFFIX'] = '.lib'
|
||||||
|
|
||||||
# On Windows using MSVC.
|
# On Windows using MSVC.
|
||||||
if host_platform == 'windows':
|
if host_platform == 'windows':
|
||||||
|
@ -202,33 +227,42 @@ env.Append(LIBPATH=[
|
||||||
'external/godot-cpp/bin/',
|
'external/godot-cpp/bin/',
|
||||||
'external/libtsm/build/bin/',
|
'external/libtsm/build/bin/',
|
||||||
])
|
])
|
||||||
|
|
||||||
env.Append(LIBS=[
|
env.Append(LIBS=[
|
||||||
'libgodot-cpp.{}.{}.{}'.format(
|
env.File('external/godot-cpp/bin/libgodot-cpp.{}.{}.{}{}'.format(
|
||||||
env['platform'],
|
env['platform'],
|
||||||
env['target'],
|
env['target'],
|
||||||
env['bits']
|
'wasm' if env['platform'] == 'javascript' else env['bits'],
|
||||||
),
|
env['LIBSUFFIX'],
|
||||||
'libtsm.{}.{}.{}'.format(
|
)),
|
||||||
|
env.File('external/libtsm/build/bin/libtsm.{}.{}.{}{}'.format(
|
||||||
env['platform'],
|
env['platform'],
|
||||||
env['target'],
|
env['target'],
|
||||||
env['bits']
|
env['bits'],
|
||||||
),
|
env['LIBSUFFIX'],
|
||||||
|
)),
|
||||||
])
|
])
|
||||||
|
|
||||||
sources = []
|
sources = []
|
||||||
sources.append('src/libgodotxtermnative.cpp')
|
sources.append('src/libgodotxtermnative.cpp')
|
||||||
sources.append('src/terminal.cpp')
|
sources.append('src/terminal.cpp')
|
||||||
|
|
||||||
# Psuedoterminal not supported on windows yet.
|
# Psuedoterminal not supported on windows (yet) or HTML5.
|
||||||
if env['platform'] != 'windows':
|
if env['platform'] != 'windows' and env['platform'] != 'javascript':
|
||||||
sources.append('src/pseudoterminal.cpp')
|
sources.append('src/pseudoterminal.cpp')
|
||||||
env.Append(LIBS=['util'])
|
env.Append(LIBS=['util'])
|
||||||
|
|
||||||
if env['platform'] == 'linux':
|
if env['platform'] == 'linux':
|
||||||
|
libsuffix = "a"
|
||||||
suffix = "so"
|
suffix = "so"
|
||||||
|
elif env['platform'] == 'javascript':
|
||||||
|
libsuffix = "bc"
|
||||||
|
suffix = "wasm"
|
||||||
elif env['platform'] == 'windows':
|
elif env['platform'] == 'windows':
|
||||||
|
libsuffix = "lib"
|
||||||
suffix = "dll"
|
suffix = "dll"
|
||||||
elif env['platform'] == 'osx':
|
elif env['platform'] == 'osx':
|
||||||
|
libsuffix = "a"
|
||||||
suffix = "dylib"
|
suffix = "dylib"
|
||||||
|
|
||||||
library = env.SharedLibrary(
|
library = env.SharedLibrary(
|
||||||
|
|
|
@ -33,3 +33,7 @@ scons generate_bindings=yes -j$(nproc)
|
||||||
# Build libgodot-xterm.
|
# Build libgodot-xterm.
|
||||||
cd ${NATIVE_DIR}
|
cd ${NATIVE_DIR}
|
||||||
scons -j$(nproc)
|
scons -j$(nproc)
|
||||||
|
|
||||||
|
echo "To Build libgodot-xterm for javascript platform inside a docker container, run:"
|
||||||
|
echo 'UID_GID="$(id -u):$(id -g)" docker-compose run javascript-build'
|
||||||
|
|
||||||
|
|
6
addons/godot_xterm/native/docker-compose.yaml
Normal file
6
addons/godot_xterm/native/docker-compose.yaml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
services:
|
||||||
|
javascript-build:
|
||||||
|
build: misc/docker
|
||||||
|
user: ${UID_GID}
|
||||||
|
volumes:
|
||||||
|
- .:/godot
|
2
addons/godot_xterm/native/external/godot-cpp
vendored
2
addons/godot_xterm/native/external/godot-cpp
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit b79a3b98b28e18bf981e2e2bd0b60faa23ef85f2
|
Subproject commit b8eebe5eb61f1b22d2d829cccef264138b106cdb
|
|
@ -7,18 +7,18 @@ reloadable=true
|
||||||
|
|
||||||
[entry]
|
[entry]
|
||||||
|
|
||||||
Server.64="res://addons/godot_xterm/native/bin/libgodot-xterm.linux.64.so"
|
HTML5.wasm32="res://addons/godot_xterm/native/bin/libgodot-xterm.javascript.32.wasm"
|
||||||
X11.64="res://addons/godot_xterm/native/bin/libgodot-xterm.linux.64.so"
|
OSX.64="res://addons/godot_xterm/native/bin/libgodot-xterm.osx.64.dylib"
|
||||||
X11.32="res://addons/godot_xterm/native/bin/libgodot-xterm.linux.32.so"
|
|
||||||
Windows.64="res://addons/godot_xterm/native/bin/libgodot-xterm.windows.64.dll"
|
Windows.64="res://addons/godot_xterm/native/bin/libgodot-xterm.windows.64.dll"
|
||||||
Windows.32="res://addons/godot_xterm/native/bin/libgodot-xterm.windows.32.dll"
|
Windows.32="res://addons/godot_xterm/native/bin/libgodot-xterm.windows.32.dll"
|
||||||
OSX.64="res://addons/godot_xterm/native/bin/libgodot-xterm.osx.64.dylib"
|
X11.64="res://addons/godot_xterm/native/bin/libgodot-xterm.linux.64.so"
|
||||||
|
X11.32="res://addons/godot_xterm/native/bin/libgodot-xterm.linux.32.so"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
||||||
Server.64=[ ]
|
HTML5.wasm32=[ ]
|
||||||
X11.64=[ ]
|
OSX.64=[ ]
|
||||||
X11.32=[ ]
|
|
||||||
Windows.64=[ ]
|
Windows.64=[ ]
|
||||||
Windows.32=[ ]
|
Windows.32=[ ]
|
||||||
OSX.64=[ ]
|
X11.64=[ ]
|
||||||
|
X11.32=[ ]
|
||||||
|
|
0
addons/godot_xterm/native/misc/.gdignore
Normal file
0
addons/godot_xterm/native/misc/.gdignore
Normal file
12
addons/godot_xterm/native/misc/docker/Dockerfile
Normal file
12
addons/godot_xterm/native/misc/docker/Dockerfile
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
FROM ponders/godot-cpp-ci
|
||||||
|
|
||||||
|
RUN git clone https://github.com/emscripten-core/emsdk.git
|
||||||
|
WORKDIR emsdk
|
||||||
|
RUN ./emsdk install 2.0.10
|
||||||
|
RUN ./emsdk activate 2.0.10
|
||||||
|
RUN chmod -R 777 /emsdk
|
||||||
|
WORKDIR /godot
|
||||||
|
RUN apt-get update && apt-get install -y vim
|
||||||
|
COPY ./build.sh /build.sh
|
||||||
|
RUN chmod +x /build.sh
|
||||||
|
CMD /build.sh
|
7
addons/godot_xterm/native/misc/docker/build.sh
Normal file
7
addons/godot_xterm/native/misc/docker/build.sh
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
source /emsdk/emsdk_env.sh
|
||||||
|
export EM_CACHE=/godot/.emcache
|
||||||
|
cd /godot/external/godot-cpp
|
||||||
|
scons platform=javascript -j$(nproc)
|
||||||
|
cd /godot
|
||||||
|
scons platform=javascript -j$(nproc)
|
|
@ -11,6 +11,35 @@ const CURSOR_LEFT = "\u001b[D"
|
||||||
|
|
||||||
const DEFAULT_FOREGROUND_COLOR = "\u001b[0m"
|
const DEFAULT_FOREGROUND_COLOR = "\u001b[0m"
|
||||||
|
|
||||||
|
class ANSIColor:
|
||||||
|
extends Object
|
||||||
|
# Using ANSIColor constants, rather than Color will respect the
|
||||||
|
# colors of the selected terminal theme. Whereas Color will set
|
||||||
|
# the exact color specified regardless of theme.
|
||||||
|
|
||||||
|
const black = { fg = 30, bg = 40 }
|
||||||
|
const red = {fg = 31, bg = 41 }
|
||||||
|
const green = {fg = 32, bg = 42}
|
||||||
|
const yellow = {fg = 33, bg = 43}
|
||||||
|
const blue = {fg = 34, bg = 44}
|
||||||
|
const magenta = {fg = 35, bg = 45}
|
||||||
|
const cyan = {fg = 36, bg = 46}
|
||||||
|
const white = {fg = 37, bg = 47}
|
||||||
|
const bright_black = {fg = 90, bg = 100}
|
||||||
|
const gray = bright_black
|
||||||
|
const grey = bright_black
|
||||||
|
const bright_red = {fg = 91, bg = 101}
|
||||||
|
const bright_green = {fg = 92, bg = 102}
|
||||||
|
const bright_yellow = {fg = 93, bg = 103}
|
||||||
|
const bright_blue = {fg = 94, bg = 104}
|
||||||
|
const bright_magenta = {fg = 95, bg = 105}
|
||||||
|
const bright_cyan = {fg = 96, bg = 106}
|
||||||
|
const bright_white = {fg = 97, bg = 107}
|
||||||
|
|
||||||
|
func _init():
|
||||||
|
assert(false, "ANSIColor is an abstract class. You should only use the color constants (e.g. ANSIColor.black).")
|
||||||
|
|
||||||
|
|
||||||
var terminal
|
var terminal
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,14 +73,22 @@ func cup(row: int = 0, col: int = 0) -> void:
|
||||||
terminal.write("\u001b[%d;%dH" % [row, col])
|
terminal.write("\u001b[%d;%dH" % [row, col])
|
||||||
|
|
||||||
|
|
||||||
func setaf(color: Color) -> void:
|
func setaf(color) -> void:
|
||||||
var fg = "\u001b[38;2;%d;%d;%dm" % [color.r8, color.g8, color.b8]
|
if color is Color:
|
||||||
terminal.write(fg)
|
terminal.write("\u001b[38;2;%d;%d;%dm" % [color.r8, color.g8, color.b8])
|
||||||
|
elif "fg" in color and color.fg is int:
|
||||||
|
terminal.write("\u001b[%dm" % color.fg)
|
||||||
|
else:
|
||||||
|
push_error("Invalid color: %s" % color)
|
||||||
|
|
||||||
|
|
||||||
func setab(color: Color) -> void:
|
func setab(color) -> void:
|
||||||
var bg = "\u001b[48;2;%d;%d;%dm" % [color.r8, color.g8, color.b8]
|
if color is Color:
|
||||||
terminal.write(bg)
|
terminal.write("\u001b[48;2;%d;%d;%dm" % [color.r8, color.g8, color.b8])
|
||||||
|
elif "bg" in color and color.bg is int:
|
||||||
|
terminal.write("\u001b[%dm" % color.bg)
|
||||||
|
else:
|
||||||
|
push_error("Invalid color: %s" % color)
|
||||||
|
|
||||||
|
|
||||||
func rev() -> void:
|
func rev() -> void:
|
||||||
|
|
|
@ -18,7 +18,7 @@ const TITLE_WIDTH = 42
|
||||||
|
|
||||||
var menu_items := [
|
var menu_items := [
|
||||||
{"name": "Asciicast", "scene": preload("../asciicast/asciicast.tscn")},
|
{"name": "Asciicast", "scene": preload("../asciicast/asciicast.tscn")},
|
||||||
{"name": "Terminal", "scene": preload("../terminal/terminal.tscn")},
|
{"name": "Terminal", "scene": preload("../web_console/web_console.tscn") if OS.has_feature("JavaScript") else preload("../terminal/terminal.tscn")},
|
||||||
{"name": "Exit"}
|
{"name": "Exit"}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -140,15 +140,19 @@ func _on_Terminal_key_pressed(data: String, event: InputEventKey) -> void:
|
||||||
"Terminal not Supported on Windows"
|
"Terminal not Supported on Windows"
|
||||||
)
|
)
|
||||||
var scene = item.scene.instance()
|
var scene = item.scene.instance()
|
||||||
var pty = scene.get_node("Pseudoterminal")
|
var pty = scene if OS.has_feature("JavaScript") else scene.get_node("Pseudoterminal")
|
||||||
get_tree().get_root().add_child(scene)
|
get_tree().get_root().add_child(scene)
|
||||||
visible = false
|
visible = false
|
||||||
scene.grab_focus()
|
scene.grab_focus()
|
||||||
|
print("await the exit!")
|
||||||
yield(pty, "exited")
|
yield(pty, "exited")
|
||||||
|
print("a got here")
|
||||||
visible = true
|
visible = true
|
||||||
$Terminal.grab_focus()
|
$Terminal.grab_focus()
|
||||||
scene.queue_free()
|
scene.queue_free()
|
||||||
"Exit":
|
"Exit":
|
||||||
|
if OS.has_feature("JavaScript"):
|
||||||
|
JavaScript.eval("window.location.reload()")
|
||||||
get_tree().quit()
|
get_tree().quit()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ cols = 102
|
||||||
|
|
||||||
[node name="Pseudoterminal" type="Node" parent="."]
|
[node name="Pseudoterminal" type="Node" parent="."]
|
||||||
script = ExtResource( 2 )
|
script = ExtResource( 2 )
|
||||||
|
|
||||||
[connection signal="data_sent" from="." to="Pseudoterminal" method="write"]
|
[connection signal="data_sent" from="." to="Pseudoterminal" method="write"]
|
||||||
[connection signal="size_changed" from="." to="Pseudoterminal" method="resize"]
|
[connection signal="size_changed" from="." to="Pseudoterminal" method="resize"]
|
||||||
[connection signal="data_sent" from="Pseudoterminal" to="." method="write"]
|
[connection signal="data_sent" from="Pseudoterminal" to="." method="write"]
|
||||||
|
|
76
examples/web_console/web_console.gd
Normal file
76
examples/web_console/web_console.gd
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
extends Node
|
||||||
|
|
||||||
|
signal exited(status)
|
||||||
|
|
||||||
|
var line := ""
|
||||||
|
var _tput: TPut
|
||||||
|
|
||||||
|
onready var terminal = $Terminal
|
||||||
|
onready var _has_js: bool = OS.has_feature("JavaScript")
|
||||||
|
|
||||||
|
|
||||||
|
func prompt(prompt: String):
|
||||||
|
_tput.setaf(TPut.ANSIColor.bright_green)
|
||||||
|
terminal.write(prompt)
|
||||||
|
_tput.sgr0()
|
||||||
|
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
_tput = TPut.new(terminal)
|
||||||
|
_tput.setaf(TPut.ANSIColor.bright_cyan)
|
||||||
|
terminal.write("*** Web Console ***\r\n\r\n")
|
||||||
|
_tput.setaf(TPut.ANSIColor.yellow)
|
||||||
|
terminal.write("Input will be passed to Godot's JavaScript.eval() function.\r\n")
|
||||||
|
terminal.write("Some things you could try:\r\n\r\n")
|
||||||
|
terminal.write(">> 1 + 1\r\n")
|
||||||
|
terminal.write(">> window.location\r\n")
|
||||||
|
terminal.write(">> alert('Hello')\r\n\r\n")
|
||||||
|
_tput.setaf(TPut.ANSIColor.bright_cyan)
|
||||||
|
terminal.write("Enter 'q', 'quit', or 'exit' to return to the previous menu.\r\n\r\n")
|
||||||
|
_tput.sgr0()
|
||||||
|
prompt(">> ")
|
||||||
|
terminal.grab_focus()
|
||||||
|
|
||||||
|
|
||||||
|
func grab_focus():
|
||||||
|
terminal.grab_focus()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_Terminal_key_pressed(_data, event: InputEventKey):
|
||||||
|
if not event:
|
||||||
|
return
|
||||||
|
|
||||||
|
# For some reason, data String is malformed on HTML5, so only use event.unicode.
|
||||||
|
var data = char(event.unicode)
|
||||||
|
|
||||||
|
match event.scancode:
|
||||||
|
KEY_ENTER:
|
||||||
|
terminal.write("\r\n")
|
||||||
|
|
||||||
|
if line == "q" or line == "quit" or line == "exit":
|
||||||
|
return emit_signal("exited", 0)
|
||||||
|
|
||||||
|
if not _has_js:
|
||||||
|
var msg := "WebConsole only available in HTML5 build."
|
||||||
|
push_error(msg)
|
||||||
|
_tput.setaf(TPut.ANSIColor.red)
|
||||||
|
terminal.write(msg)
|
||||||
|
_tput.sgr0()
|
||||||
|
prompt("\r\n>> ")
|
||||||
|
else:
|
||||||
|
var json = JavaScript.eval("JSON.stringify(%s)" % line, true)
|
||||||
|
_tput.setaf(TPut.ANSIColor.magenta)
|
||||||
|
terminal.write(str(json))
|
||||||
|
_tput.sgr0()
|
||||||
|
|
||||||
|
line = ""
|
||||||
|
#_tput.srg0()
|
||||||
|
prompt("\r\n>> ")
|
||||||
|
|
||||||
|
KEY_BACKSPACE:
|
||||||
|
if line.length() > 0:
|
||||||
|
terminal.write("\b \b")
|
||||||
|
line = line.substr(0, line.length() - 1)
|
||||||
|
_:
|
||||||
|
line += data
|
||||||
|
terminal.write(data)
|
27
examples/web_console/web_console.tscn
Normal file
27
examples/web_console/web_console.tscn
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/godot_xterm/themes/default_dark.theme" type="Theme" id=1]
|
||||||
|
[ext_resource path="res://addons/godot_xterm/nodes/terminal/terminal.gdns" type="Script" id=2]
|
||||||
|
[ext_resource path="res://examples/web_console/web_console.gd" type="Script" id=3]
|
||||||
|
|
||||||
|
[node name="WebConsole" type="Control"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Terminal" type="Control" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
focus_mode = 2
|
||||||
|
theme = ExtResource( 1 )
|
||||||
|
script = ExtResource( 2 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
rows = 31
|
||||||
|
cols = 102
|
||||||
|
|
||||||
|
[connection signal="key_pressed" from="Terminal" to="." method="_on_Terminal_key_pressed"]
|
|
@ -30,7 +30,7 @@ window/vsync/use_vsync=false
|
||||||
|
|
||||||
[editor_plugins]
|
[editor_plugins]
|
||||||
|
|
||||||
enabled=PoolStringArray( "godot_xterm" )
|
enabled=PoolStringArray( "res://addons/godot_xterm/plugin.cfg" )
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue