Compare commits
109 Commits
new-frame
...
Jebiel/pat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da7da93ceb | ||
|
|
dac2b4ff16 | ||
|
|
2d12b0c747 | ||
|
|
5fe26edaa6 | ||
|
|
a736cfd548 | ||
|
|
5af4214daa | ||
|
|
98ef7b329a | ||
|
|
b0e1962fa7 | ||
|
|
83684e8882 | ||
|
|
1ed7d077a9 | ||
|
|
ba4b36618f | ||
|
|
af647a4bad | ||
|
|
b719530ef0 | ||
|
|
530d61d67e | ||
|
|
3d76bcb48c | ||
|
|
70ce2f1f3c | ||
|
|
21a190a1aa | ||
|
|
a88d222709 | ||
|
|
b2defceae5 | ||
|
|
8d7565ffc4 | ||
|
|
9960b25dff | ||
|
|
411c116deb | ||
|
|
64e007f1fd | ||
|
|
c62fc365db | ||
|
|
e7e630bd5d | ||
|
|
7d77175fbb | ||
|
|
f033553972 | ||
|
|
ae1ed044ba | ||
|
|
35d601c7a7 | ||
|
|
f89aeec374 | ||
|
|
42c3b4b42e | ||
|
|
322fc31396 | ||
|
|
6e4d5cfddd | ||
|
|
d81485a8bf | ||
|
|
a9260d956c | ||
|
|
025bb560bc | ||
|
|
cdd1488e13 | ||
|
|
b8b2644969 | ||
|
|
09b5c0a5d0 | ||
|
|
1ed66f3aa2 | ||
|
|
3b4d5d1c3f | ||
|
|
f98fd5a7ad | ||
|
|
b961109623 | ||
|
|
8f0d1023a4 | ||
|
|
79773ba95c | ||
|
|
ff3f02fb8c | ||
|
|
0af2b20b3a | ||
|
|
b026fe357e | ||
|
|
ade36c013b | ||
|
|
54a6a7f590 | ||
|
|
20728e4a0f | ||
|
|
afa456f6b3 | ||
|
|
3fbfb77430 | ||
|
|
051bcb62c6 | ||
|
|
d2c57eed6d | ||
|
|
f2f38c0e0d | ||
|
|
4046bdbc6a | ||
|
|
c83cc206fd | ||
|
|
41ac14fbd3 | ||
|
|
e4c1cad1a7 | ||
|
|
863c1ac27a | ||
|
|
c85eba617c | ||
|
|
dcb7b7c309 | ||
|
|
3cee186663 | ||
|
|
06afe507f6 | ||
|
|
4268d4d770 | ||
|
|
d61dae5ab4 | ||
|
|
b5f39c1d53 | ||
|
|
767a61b86e | ||
|
|
0d3c0a2233 | ||
|
|
0431103a1d | ||
|
|
633e4e642c | ||
|
|
77dc82a381 | ||
|
|
44a63d4aaa | ||
|
|
5b3297f916 | ||
|
|
41413d4712 | ||
|
|
fd2e5ce71e | ||
|
|
e9ddd7d3b8 | ||
|
|
da6795f002 | ||
|
|
f497bb4b44 | ||
|
|
4aea85649f | ||
|
|
b9ffae25e3 | ||
|
|
db7a7f38f7 | ||
|
|
e2c4392c6d | ||
|
|
7e771b1cfc | ||
|
|
4bff6efe97 | ||
|
|
c514dc7a24 | ||
|
|
24754edb6a | ||
|
|
79fbb76524 | ||
|
|
b85aede966 | ||
|
|
c66ca6e44f | ||
|
|
a192024fef | ||
|
|
918df9098a | ||
|
|
c9271bfa36 | ||
|
|
fa162c818b | ||
|
|
ff976e3ec2 | ||
|
|
17c5651305 | ||
|
|
7c7b049ba1 | ||
|
|
0823fe8b3d | ||
|
|
e787fd0fb5 | ||
|
|
650497bff4 | ||
|
|
2f25bd30b0 | ||
|
|
d58157a450 | ||
|
|
9d049bd041 | ||
|
|
988222b711 | ||
|
|
f42bd3036f | ||
|
|
297239fb5c | ||
|
|
dbd46d44aa | ||
|
|
254f4d6e92 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -18,6 +18,7 @@
|
|||||||
*.pro.user.*
|
*.pro.user.*
|
||||||
*.moc
|
*.moc
|
||||||
moc_*.cpp
|
moc_*.cpp
|
||||||
|
moc_*.h
|
||||||
qrc_*.cpp
|
qrc_*.cpp
|
||||||
ui_*.h
|
ui_*.h
|
||||||
Makefile*
|
Makefile*
|
||||||
|
|||||||
37
.travis.yml
Normal file
37
.travis.yml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
sudo: required
|
||||||
|
dist: trusty
|
||||||
|
language: c++
|
||||||
|
|
||||||
|
install:
|
||||||
|
- sudo add-apt-repository -y ppa:beineri/opt-qt58-trusty
|
||||||
|
- sudo apt-get update -qq
|
||||||
|
- sudo apt-get -y install build-essential qt58declarative qt58graphicaleffects qt58quickcontrols libgl1-mesa-dev
|
||||||
|
- source /opt/qt*/bin/qt*-env.sh
|
||||||
|
|
||||||
|
script:
|
||||||
|
- qmake CONFIG+=release PREFIX=/usr
|
||||||
|
- make -j$(nproc)
|
||||||
|
- mkdir -p appdir/usr/share/metainfo appdir/usr/bin
|
||||||
|
- cp packaging/appdata/cool-retro-term.appdata.xml appdir/usr/share/metainfo/
|
||||||
|
- cp cool-retro-term appdir/usr/bin/
|
||||||
|
- cp ./cool-retro-term.desktop appdir/
|
||||||
|
- cp ./app/icons/128x128/cool-retro-term.png appdir/
|
||||||
|
- cp -r ./app/qml appdir/usr/
|
||||||
|
- cp -r ./qmltermwidget/QMLTermWidget appdir/usr/qml/ # Workaround for https://github.com/probonopd/linuxdeployqt/issues/78
|
||||||
|
- wget -c https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
|
||||||
|
- chmod a+x linuxdeployqt-*.AppImage
|
||||||
|
- unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
|
||||||
|
- export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file
|
||||||
|
- ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ # -verbose=3 2>&1 | grep "path:" -C 3
|
||||||
|
- ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ -verbose=2 -appimage
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
|
||||||
|
- # curl --upload-file Cool*.AppImage https://transfer.sh/Cool_Retro_Term-git.$(git rev-parse --short HEAD)-x86_64.AppImage
|
||||||
|
- wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh
|
||||||
|
- bash upload.sh Cool*.AppImage*
|
||||||
|
|
||||||
|
branches:
|
||||||
|
except:
|
||||||
|
- # Do not build tags that we create when we upload to GitHub Releases
|
||||||
|
- /^(?i:continuous)/
|
||||||
70
README.md
70
README.md
@@ -12,21 +12,29 @@ It uses the QML port of qtermwidget (Konsole) developed by me: https://github.co
|
|||||||
|
|
||||||
This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher.
|
This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher.
|
||||||
|
|
||||||
|
Settings such as colors, fonts, and effects can be accessed via context menu.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
## Get cool-retro-term
|
## Install
|
||||||
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages:
|
Walk the easy way and install cool-retro-term using one of these convenient packages:
|
||||||
|
|
||||||
Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`.
|
Just grab the latest AppImage from the release page and make it executable and run it:
|
||||||
|
|
||||||
Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
|
wget https://github.com/Swordfish90/cool-retro-term/releases/download/1.1.1/Cool-Retro-Term-1.1.1-x86_64.AppImage
|
||||||
|
chmod a+x Cool-Retro-Term-1.1.1-x86_64.AppImage
|
||||||
|
./Cool-Retro-Term-1.1.1-x86_64.AppImage
|
||||||
|
|
||||||
Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
|
**Fedora** has the `cool-retro-term` in the official repositories. All you have to do is `sudo dnf install cool-retro-term`.
|
||||||
|
|
||||||
yaourt -S aur/cool-retro-term-git
|
Users of **openSUSE** can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
|
||||||
|
|
||||||
|
**Arch** users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
|
||||||
|
|
||||||
|
trizen -S aur/cool-retro-term-git
|
||||||
|
|
||||||
or use:
|
or use:
|
||||||
|
|
||||||
@@ -34,25 +42,37 @@ or use:
|
|||||||
|
|
||||||
to install precompiled from community repository.
|
to install precompiled from community repository.
|
||||||
|
|
||||||
Gentoo users can now install the second release "1.0.1" from a 3rd-party repository preferably via layman:
|
Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb).
|
||||||
|
|
||||||
USE="git" emerge app-portage/layman
|
**Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term)
|
||||||
wget https://www.gerczei.eu/files/gerczei.xml -O /etc/layman/overlays/gerczei.xml
|
|
||||||
layman -f -a qt -a gerczei # those who've added the repo before 27/08/17 should remove, update and add it again as its source has changed
|
|
||||||
ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.0.1::gerczei
|
|
||||||
|
|
||||||
The live ebuild (version 9999-r1) tracking the bleeding-edge WIP codebase also remains available.
|
**Solus** users can install using `eopg`:
|
||||||
|
```
|
||||||
|
eopkg it cool-retro-term
|
||||||
|
```
|
||||||
|
|
||||||
A word of warning: USE flags and keywords are to be added to portage's configuration files and every emerge operation should be executed with '-p' (short option for --pretend) appended to the command line first as per best practice!
|
**macOS** users can grab the latest dmg from the [release page](https://github.com/Swordfish90/cool-retro-term/releases) or install via Homebrew:
|
||||||
|
```
|
||||||
|
brew cask install cool-retro-term
|
||||||
|
```
|
||||||
|
|
||||||
Ubuntu users of 14.04 LTS (Trusty) up to 15.10 (Wily) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb).
|
**FreeBSD** users can install cool-retro-term with `pkg`:
|
||||||
|
|
||||||
Ubuntu 17.10 can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term)
|
pkg install cool-retro-term
|
||||||
|
|
||||||
|
## Build instructions (FreeBSD)
|
||||||
|
|
||||||
macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases
|
Grab a copy of [the FreeBSD Ports Collection](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html), modify [`/usr/ports/x11/cool-retro-term/Makefile`](https://svnweb.freebsd.org/ports/head/x11/cool-retro-term/Makefile?view=markup) as you like, and then run `make install` to build and install the emulator:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd /usr/ports/x11/cool-retro-term
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
## Build instructions (Linux)
|
## Build instructions (Linux)
|
||||||
|
|
||||||
|
Build cool-retro-term yourself, you know, the retro way.
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
Make sure to install these first.
|
Make sure to install these first.
|
||||||
|
|
||||||
@@ -82,6 +102,12 @@ Make sure to install these first.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
**snapcraft (most of distros)**
|
||||||
|
|
||||||
|
sudo snap install cool-retro-term --classic
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
**Debian Jessie and above**
|
**Debian Jessie and above**
|
||||||
|
|
||||||
sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel
|
sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel
|
||||||
@@ -173,6 +199,12 @@ cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
|
|||||||
open cool-retro-term.app
|
open cool-retro-term.app
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Homebrew**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install --cask cool-retro-term
|
||||||
|
```
|
||||||
|
|
||||||
## Donations
|
## Donations
|
||||||
I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).
|
I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).
|
||||||
|
|
||||||
|
|||||||
46
app/main.cpp
46
app/main.cpp
@@ -33,11 +33,37 @@ int main(int argc, char *argv[])
|
|||||||
// This disables QT appmenu under Ubuntu, which is not working with QML apps.
|
// This disables QT appmenu under Ubuntu, which is not working with QML apps.
|
||||||
setenv("QT_QPA_PLATFORMTHEME", "", 1);
|
setenv("QT_QPA_PLATFORMTHEME", "", 1);
|
||||||
|
|
||||||
|
#if defined (Q_OS_LINUX)
|
||||||
|
setenv("QSG_RENDER_LOOP", "threaded", 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_MAC)
|
#if defined(Q_OS_MAC)
|
||||||
// This allows UTF-8 characters usage in OSX.
|
// This allows UTF-8 characters usage in OSX.
|
||||||
setenv("LC_CTYPE", "UTF-8", 1);
|
setenv("LC_CTYPE", "UTF-8", 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) {
|
||||||
|
QTextStream cout(stdout, QIODevice::WriteOnly);
|
||||||
|
cout << "Usage: " << argv[0] << " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]" << endl;
|
||||||
|
cout << " --default-settings Run cool-retro-term with the default settings" << endl;
|
||||||
|
cout << " --workdir <dir> Change working directory to 'dir'" << endl;
|
||||||
|
cout << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option." << endl;
|
||||||
|
cout << " -T <title> Set window title to 'title'." << endl;
|
||||||
|
cout << " --fullscreen Run cool-retro-term in fullscreen." << endl;
|
||||||
|
cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << endl;
|
||||||
|
cout << " -h|--help Print this help." << endl;
|
||||||
|
cout << " --verbose Print additional information such as profiles and settings." << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString appVersion("1.1.1");
|
||||||
|
|
||||||
|
if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) {
|
||||||
|
QTextStream cout(stdout, QIODevice::WriteOnly);
|
||||||
|
cout << "cool-retro-term " << appVersion << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
// set application attributes
|
// set application attributes
|
||||||
// Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293
|
// Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293
|
||||||
@@ -55,25 +81,6 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// Manage command line arguments from the cpp side
|
// Manage command line arguments from the cpp side
|
||||||
QStringList args = app.arguments();
|
QStringList args = app.arguments();
|
||||||
if (args.contains("-h") || args.contains("--help")) {
|
|
||||||
// BUG: This usage help text goes to stderr, should go to stdout.
|
|
||||||
// BUG: First line of output is surrounded by double quotes.
|
|
||||||
qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]";
|
|
||||||
qDebug() << " --default-settings Run cool-retro-term with the default settings";
|
|
||||||
qDebug() << " --workdir <dir> Change working directory to 'dir'";
|
|
||||||
qDebug() << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option.";
|
|
||||||
qDebug() << " -T <title> Set window title to 'title'.";
|
|
||||||
qDebug() << " --fullscreen Run cool-retro-term in fullscreen.";
|
|
||||||
qDebug() << " -p|--profile <prof> Run cool-retro-term with the given profile.";
|
|
||||||
qDebug() << " -h|--help Print this help.";
|
|
||||||
qDebug() << " --verbose Print additional information such as profiles and settings.";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.contains("-v") || args.contains("--version")) {
|
|
||||||
qDebug() << "cool-retro-term 1.0.1";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Manage default command
|
// Manage default command
|
||||||
QStringList cmdList;
|
QStringList cmdList;
|
||||||
@@ -82,6 +89,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
QVariant command(cmdList.empty() ? QVariant() : cmdList[0]);
|
QVariant command(cmdList.empty() ? QVariant() : cmdList[0]);
|
||||||
QVariant commandArgs(cmdList.size() <= 1 ? QVariant() : QVariant(cmdList.mid(1)));
|
QVariant commandArgs(cmdList.size() <= 1 ? QVariant() : QVariant(cmdList.mid(1)));
|
||||||
|
engine.rootContext()->setContextProperty("appVersion", appVersion);
|
||||||
engine.rootContext()->setContextProperty("defaultCmd", command);
|
engine.rootContext()->setContextProperty("defaultCmd", command);
|
||||||
engine.rootContext()->setContextProperty("defaultCmdArgs", commandArgs);
|
engine.rootContext()->setContextProperty("defaultCmdArgs", commandArgs);
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import QtQuick.Controls 1.0
|
|||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
QtObject{
|
QtObject{
|
||||||
readonly property string version: "1.1.0"
|
readonly property string version: appVersion
|
||||||
readonly property int profileVersion: 2
|
readonly property int profileVersion: 2
|
||||||
|
|
||||||
// STATIC CONSTANTS ////////////////////////////////////////////////////////
|
// STATIC CONSTANTS ////////////////////////////////////////////////////////
|
||||||
@@ -33,6 +33,9 @@ QtObject{
|
|||||||
readonly property real minimumFontScaling: 0.25
|
readonly property real minimumFontScaling: 0.25
|
||||||
readonly property real maximumFontScaling: 2.50
|
readonly property real maximumFontScaling: 2.50
|
||||||
|
|
||||||
|
readonly property real minBurnInFadeTime: 160
|
||||||
|
readonly property real maxBurnInFadeTime: 1600
|
||||||
|
|
||||||
// GENERAL SETTINGS ///////////////////////////////////////////////////////
|
// GENERAL SETTINGS ///////////////////////////////////////////////////////
|
||||||
|
|
||||||
property int x: 100
|
property int x: 100
|
||||||
@@ -48,11 +51,15 @@ QtObject{
|
|||||||
property bool showTerminalSize: true
|
property bool showTerminalSize: true
|
||||||
property real windowScaling: 1.0
|
property real windowScaling: 1.0
|
||||||
|
|
||||||
property real fps: 24
|
property real fps: 20
|
||||||
property bool verbose: false
|
property bool verbose: false
|
||||||
|
|
||||||
property real bloomQuality: 0.5
|
property real bloomQuality: 0.5
|
||||||
|
|
||||||
property real burnInQuality: 0.5
|
property real burnInQuality: 0.5
|
||||||
|
property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true
|
||||||
|
|
||||||
|
property bool blinkingCursor: false
|
||||||
|
|
||||||
onWindowScalingChanged: handleFontChanged();
|
onWindowScalingChanged: handleFontChanged();
|
||||||
|
|
||||||
@@ -73,7 +80,7 @@ QtObject{
|
|||||||
property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3))
|
property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3))
|
||||||
|
|
||||||
property real staticNoise: 0.12
|
property real staticNoise: 0.12
|
||||||
property real screenCurvature: 0.2
|
property real screenCurvature: 0.3
|
||||||
property real glowingLine: 0.2
|
property real glowingLine: 0.2
|
||||||
property real burnIn: 0.25
|
property real burnIn: 0.25
|
||||||
property real bloom: 0.55
|
property real bloom: 0.55
|
||||||
@@ -88,6 +95,9 @@ QtObject{
|
|||||||
|
|
||||||
property real rbgShift: 0.0
|
property real rbgShift: 0.0
|
||||||
|
|
||||||
|
property real _margin: 0.5
|
||||||
|
property real margin: Utils.lint(1.0, 20.0, _margin)
|
||||||
|
|
||||||
readonly property int no_rasterization: 0
|
readonly property int no_rasterization: 0
|
||||||
readonly property int scanline_rasterization: 1
|
readonly property int scanline_rasterization: 1
|
||||||
readonly property int pixel_rasterization: 2
|
readonly property int pixel_rasterization: 2
|
||||||
@@ -126,7 +136,7 @@ QtObject{
|
|||||||
|
|
||||||
property FontLoader fontLoader: FontLoader { }
|
property FontLoader fontLoader: FontLoader { }
|
||||||
|
|
||||||
onFontScalingChanged: handleFontChanged();
|
onTotalFontScalingChanged: handleFontChanged();
|
||||||
onFontWidthChanged: handleFontChanged();
|
onFontWidthChanged: handleFontChanged();
|
||||||
|
|
||||||
function getIndexByName(name) {
|
function getIndexByName(name) {
|
||||||
@@ -155,7 +165,7 @@ QtObject{
|
|||||||
if (index === undefined) return;
|
if (index === undefined) return;
|
||||||
|
|
||||||
fontManager.item.selectedFontIndex = index;
|
fontManager.item.selectedFontIndex = index;
|
||||||
fontManager.item.scaling = totalFontScaling * windowScaling;
|
fontManager.item.scaling = totalFontScaling;
|
||||||
|
|
||||||
var fontSource = fontManager.item.source;
|
var fontSource = fontManager.item.source;
|
||||||
var pixelSize = fontManager.item.pixelSize;
|
var pixelSize = fontManager.item.pixelSize;
|
||||||
@@ -199,7 +209,9 @@ QtObject{
|
|||||||
bloomQuality: bloomQuality,
|
bloomQuality: bloomQuality,
|
||||||
burnInQuality: burnInQuality,
|
burnInQuality: burnInQuality,
|
||||||
useCustomCommand: useCustomCommand,
|
useCustomCommand: useCustomCommand,
|
||||||
customCommand: customCommand
|
customCommand: customCommand,
|
||||||
|
useFastBurnIn: useFastBurnIn,
|
||||||
|
blinkingCursor: blinkingCursor
|
||||||
}
|
}
|
||||||
return stringify(settings);
|
return stringify(settings);
|
||||||
}
|
}
|
||||||
@@ -225,7 +237,8 @@ QtObject{
|
|||||||
ambientLight: ambientLight,
|
ambientLight: ambientLight,
|
||||||
windowOpacity: windowOpacity,
|
windowOpacity: windowOpacity,
|
||||||
fontName: fontNames[rasterization],
|
fontName: fontNames[rasterization],
|
||||||
fontWidth: fontWidth
|
fontWidth: fontWidth,
|
||||||
|
margin: _margin
|
||||||
}
|
}
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
@@ -284,6 +297,10 @@ QtObject{
|
|||||||
|
|
||||||
useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
|
useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
|
||||||
customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand
|
customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand
|
||||||
|
|
||||||
|
useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn;
|
||||||
|
|
||||||
|
blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadProfileString(profileString){
|
function loadProfileString(profileString){
|
||||||
@@ -317,6 +334,8 @@ QtObject{
|
|||||||
fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization];
|
fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization];
|
||||||
fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth;
|
fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth;
|
||||||
|
|
||||||
|
_margin = settings.margin !== undefined ? settings.margin : _margin;
|
||||||
|
|
||||||
handleFontChanged();
|
handleFontChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,9 +403,10 @@ QtObject{
|
|||||||
"rasterization": 0,
|
"rasterization": 0,
|
||||||
"rbgShift": 0,
|
"rbgShift": 0,
|
||||||
"saturationColor": 0.2483,
|
"saturationColor": 0.2483,
|
||||||
"screenCurvature": 0.1997,
|
"screenCurvature": 0.3,
|
||||||
"staticNoise": 0.1198,
|
"staticNoise": 0.1198,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -411,9 +431,10 @@ QtObject{
|
|||||||
"rasterization": 0,
|
"rasterization": 0,
|
||||||
"rbgShift": 0,
|
"rbgShift": 0,
|
||||||
"saturationColor": 0.0,
|
"saturationColor": 0.0,
|
||||||
"screenCurvature": 0.1997,
|
"screenCurvature": 0.3,
|
||||||
"staticNoise": 0.1198,
|
"staticNoise": 0.1198,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -438,9 +459,10 @@ QtObject{
|
|||||||
"rasterization": 1,
|
"rasterization": 1,
|
||||||
"rbgShift": 0,
|
"rbgShift": 0,
|
||||||
"saturationColor": 0.5,
|
"saturationColor": 0.5,
|
||||||
"screenCurvature": 0.2,
|
"screenCurvature": 0.3,
|
||||||
"staticNoise": 0.15,
|
"staticNoise": 0.15,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -466,8 +488,9 @@ QtObject{
|
|||||||
"rbgShift": 0,
|
"rbgShift": 0,
|
||||||
"saturationColor": 0,
|
"saturationColor": 0,
|
||||||
"screenCurvature": 0,
|
"screenCurvature": 0,
|
||||||
"staticNoise": 0.1545,
|
"staticNoise": 0.15,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -492,9 +515,10 @@ QtObject{
|
|||||||
"rasterization": 1,
|
"rasterization": 1,
|
||||||
"rbgShift": 0,
|
"rbgShift": 0,
|
||||||
"saturationColor": 0,
|
"saturationColor": 0,
|
||||||
"screenCurvature": 0.8976,
|
"screenCurvature": 0.5,
|
||||||
"staticNoise": 0.099,
|
"staticNoise": 0.099,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -519,9 +543,10 @@ QtObject{
|
|||||||
"rasterization": 1,
|
"rasterization": 1,
|
||||||
"rbgShift": 0.2969,
|
"rbgShift": 0.2969,
|
||||||
"saturationColor": 0,
|
"saturationColor": 0,
|
||||||
"screenCurvature": 0.3003,
|
"screenCurvature": 0.5,
|
||||||
"staticNoise": 0.2969,
|
"staticNoise": 0.2969,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -546,9 +571,10 @@ QtObject{
|
|||||||
"rasterization": 0,
|
"rasterization": 0,
|
||||||
"rbgShift": 0.3524,
|
"rbgShift": 0.3524,
|
||||||
"saturationColor": 0,
|
"saturationColor": 0,
|
||||||
"screenCurvature": 0.401,
|
"screenCurvature": 0.4,
|
||||||
"staticNoise": 0.0503,
|
"staticNoise": 0.0503,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -573,9 +599,10 @@ QtObject{
|
|||||||
"rasterization": 0,
|
"rasterization": 0,
|
||||||
"rbgShift": 0,
|
"rbgShift": 0,
|
||||||
"saturationColor": 0,
|
"saturationColor": 0,
|
||||||
"screenCurvature": 0.1997,
|
"screenCurvature": 0.2,
|
||||||
"staticNoise": 0,
|
"staticNoise": 0,
|
||||||
"windowOpacity": 1
|
"windowOpacity": 1,
|
||||||
|
"margin": 0.5
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
@@ -600,9 +627,10 @@ QtObject{
|
|||||||
"rasterization": 0,
|
"rasterization": 0,
|
||||||
"rbgShift": 0,
|
"rbgShift": 0,
|
||||||
"saturationColor": 0.4983,
|
"saturationColor": 0.4983,
|
||||||
"screenCurvature": 0.05,
|
"screenCurvature": 0,
|
||||||
"staticNoise": 0.0955,
|
"staticNoise": 0.0955,
|
||||||
"windowOpacity": 0.7
|
"windowOpacity": 0.7,
|
||||||
|
"margin": 0.1
|
||||||
}'
|
}'
|
||||||
builtin: true
|
builtin: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,12 @@ Loader {
|
|||||||
property real delay: (1.0 / appSettings.fps) * 1000
|
property real delay: (1.0 / appSettings.fps) * 1000
|
||||||
property real burnIn: appSettings.burnIn
|
property real burnIn: appSettings.burnIn
|
||||||
property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
|
property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
|
||||||
property real _minBurnInFadeTime: 160
|
property real _minBurnInFadeTime: appSettings.minBurnInFadeTime
|
||||||
property real _maxBurnInFadeTime: 1600
|
property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime
|
||||||
|
|
||||||
active: appSettings.burnIn !== 0
|
active: appSettings.useFastBurnIn && appSettings.burnIn !== 0
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
function completelyUpdate() {
|
function completelyUpdate() {
|
||||||
prevLastUpdate = lastUpdate;
|
prevLastUpdate = lastUpdate;
|
||||||
@@ -33,16 +35,6 @@ Loader {
|
|||||||
sourceComponent: Item {
|
sourceComponent: Item {
|
||||||
property alias source: burnInEffectSource
|
property alias source: burnInEffectSource
|
||||||
|
|
||||||
property int burnInScaling: scaleTexture * appSettings.burnInQuality
|
|
||||||
|
|
||||||
width: appSettings.lowResolutionFont
|
|
||||||
? kterminal.width * Math.max(1, burnInScaling)
|
|
||||||
: kterminal.width * scaleTexture * appSettings.burnInQuality
|
|
||||||
|
|
||||||
height: appSettings.lowResolutionFont
|
|
||||||
? kterminal.height * Math.max(1, burnInScaling)
|
|
||||||
: kterminal.height * scaleTexture * appSettings.burnInQuality
|
|
||||||
|
|
||||||
ShaderEffectSource {
|
ShaderEffectSource {
|
||||||
id: burnInEffectSource
|
id: burnInEffectSource
|
||||||
|
|
||||||
@@ -52,13 +44,10 @@ Loader {
|
|||||||
live: false
|
live: false
|
||||||
recursive: true
|
recursive: true
|
||||||
hideSource: true
|
hideSource: true
|
||||||
wrapMode: kterminalSource.wrapMode
|
wrapMode: ShaderEffectSource.ClampToEdge
|
||||||
|
|
||||||
format: ShaderEffectSource.RGBA
|
format: ShaderEffectSource.RGBA
|
||||||
|
smooth: true
|
||||||
// Enabling smooth with a low burnInQuality causes bad artifacts because the FBO
|
|
||||||
// has different values when it's read back. This lowers the quality, but makes it more consistent.
|
|
||||||
smooth: appSettings.burnInQuality === 1.0
|
|
||||||
|
|
||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
@@ -91,7 +80,6 @@ Loader {
|
|||||||
property real prevLastUpdate: burnInEffect.prevLastUpdate
|
property real prevLastUpdate: burnInEffect.prevLastUpdate
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
blending: false
|
blending: false
|
||||||
|
|
||||||
fragmentShader:
|
fragmentShader:
|
||||||
|
|||||||
@@ -236,7 +236,9 @@ QtObject{
|
|||||||
function addSystemFonts() {
|
function addSystemFonts() {
|
||||||
var families = monospaceSystemFonts;
|
var families = monospaceSystemFonts;
|
||||||
for (var i = 0; i < families.length; i++) {
|
for (var i = 0; i < families.length; i++) {
|
||||||
console.log("Adding system font: ", families[i])
|
if (verbose) {
|
||||||
|
console.log("Adding system font: ", families[i])
|
||||||
|
}
|
||||||
fontlist.append(convertToListElement(families[i]))
|
fontlist.append(convertToListElement(families[i]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import QtQuick 2.0
|
|||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
ShaderEffect {
|
ShaderEffect {
|
||||||
property color _staticFrameColor: "#dedede"
|
property color _staticFrameColor: "#ffffff"
|
||||||
property color _backgroundColor: appSettings.backgroundColor
|
property color _backgroundColor: appSettings.backgroundColor
|
||||||
property color _fontColor: appSettings.fontColor
|
property color _fontColor: appSettings.fontColor
|
||||||
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
|
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
|
||||||
@@ -13,7 +13,7 @@ ShaderEffect {
|
|||||||
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
||||||
property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
|
property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
|
||||||
|
|
||||||
visible: screenCurvature != 0
|
property size aadelta: Qt.size(1.0 / width, 1.0 / height)
|
||||||
|
|
||||||
fragmentShader: "
|
fragmentShader: "
|
||||||
#ifdef GL_ES
|
#ifdef GL_ES
|
||||||
@@ -24,6 +24,7 @@ ShaderEffect {
|
|||||||
uniform lowp float shadowLength;
|
uniform lowp float shadowLength;
|
||||||
uniform highp float qt_Opacity;
|
uniform highp float qt_Opacity;
|
||||||
uniform lowp vec4 frameColor;
|
uniform lowp vec4 frameColor;
|
||||||
|
uniform mediump vec2 aadelta;
|
||||||
|
|
||||||
varying highp vec2 qt_TexCoord0;
|
varying highp vec2 qt_TexCoord0;
|
||||||
|
|
||||||
@@ -41,6 +42,10 @@ ShaderEffect {
|
|||||||
return min(v.x, v.y);
|
return min(v.x, v.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float prod2(vec2 v) {
|
||||||
|
return v.x * v.y;
|
||||||
|
}
|
||||||
|
|
||||||
float sum2(vec2 v) {
|
float sum2(vec2 v) {
|
||||||
return v.x + v.y;
|
return v.x + v.y;
|
||||||
}
|
}
|
||||||
@@ -53,17 +58,17 @@ ShaderEffect {
|
|||||||
float alpha = 0.0;
|
float alpha = 0.0;
|
||||||
|
|
||||||
float outShadowLength = shadowLength;
|
float outShadowLength = shadowLength;
|
||||||
float inShadowLength = 0.5 * shadowLength;
|
float inShadowLength = shadowLength * 0.5;
|
||||||
|
|
||||||
float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
|
float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
|
||||||
outShadow = clamp(0.0, 1.0, outShadow);
|
outShadow = clamp(sqrt(outShadow), 0.0, 1.0);
|
||||||
color += frameColor.rgb * sqrt(outShadow);
|
color += frameColor.rgb * outShadow;
|
||||||
alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords));
|
alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords));
|
||||||
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow));
|
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow);
|
||||||
|
|
||||||
float inShadow = min2(step(vec2(0.0), coords) - step(vec2(1.0), coords));
|
float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
|
||||||
inShadow -= min2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
|
inShadow = 0.5 * inShadow * inShadow;
|
||||||
alpha += 0.35 * inShadow;
|
alpha = max(alpha, inShadow);
|
||||||
|
|
||||||
gl_FragColor = vec4(color * alpha, alpha);
|
gl_FragColor = vec4(color * alpha, alpha);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,11 +28,12 @@ import "utils.js" as Utils
|
|||||||
Item{
|
Item{
|
||||||
id: terminalContainer
|
id: terminalContainer
|
||||||
|
|
||||||
property size virtualResolution: Qt.size(kterminal.width, kterminal.height)
|
property size virtualResolution: Qt.size(kterminal.totalWidth, kterminal.totalHeight)
|
||||||
property alias mainTerminal: kterminal
|
property alias mainTerminal: kterminal
|
||||||
|
|
||||||
property ShaderEffectSource mainSource: kterminalSource
|
property ShaderEffectSource mainSource: kterminalSource
|
||||||
property BurnInEffect burnInEffect: burnInEffect
|
property BurnInEffect burnInEffect: burnInEffect
|
||||||
|
property SlowBurnIn slowBurnInEffect: slowBurnInEffect
|
||||||
property real fontWidth: 1.0
|
property real fontWidth: 1.0
|
||||||
property real screenScaling: 1.0
|
property real screenScaling: 1.0
|
||||||
property real scaleTexture: 1.0
|
property real scaleTexture: 1.0
|
||||||
@@ -69,14 +70,31 @@ Item{
|
|||||||
|
|
||||||
QMLTermWidget {
|
QMLTermWidget {
|
||||||
id: kterminal
|
id: kterminal
|
||||||
width: Math.floor(parent.width / (screenScaling * fontWidth))
|
|
||||||
height: Math.floor(parent.height / screenScaling)
|
property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1
|
||||||
|
property int margin: appSettings.margin / screenScaling
|
||||||
|
property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
|
||||||
|
property int totalHeight: Math.floor(parent.height / screenScaling)
|
||||||
|
|
||||||
|
property int rawWidth: totalWidth - 2 * margin
|
||||||
|
property int rawHeight: totalHeight - 2 * margin
|
||||||
|
|
||||||
|
textureSize: Qt.size(width / textureResolutionScale, height / textureResolutionScale)
|
||||||
|
|
||||||
|
width: ensureMultiple(rawWidth, devicePixelRatio)
|
||||||
|
height: ensureMultiple(rawHeight, devicePixelRatio)
|
||||||
|
|
||||||
|
/** Ensure size is a multiple of factor. This is needed for pixel perfect scaling on highdpi screens. */
|
||||||
|
function ensureMultiple(size, factor) {
|
||||||
|
return Math.round(size / factor) * factor;
|
||||||
|
}
|
||||||
|
|
||||||
colorScheme: "cool-retro-term"
|
colorScheme: "cool-retro-term"
|
||||||
|
|
||||||
smooth: !appSettings.lowResolutionFont
|
smooth: !appSettings.lowResolutionFont
|
||||||
enableBold: false
|
enableBold: false
|
||||||
fullCursorHeight: true
|
fullCursorHeight: true
|
||||||
|
blinkingCursor: appSettings.blinkingCursor
|
||||||
|
|
||||||
session: QMLTermSession {
|
session: QMLTermSession {
|
||||||
id: ksession
|
id: ksession
|
||||||
@@ -167,6 +185,8 @@ Item{
|
|||||||
property alias contextmenu: menuLoader.item
|
property alias contextmenu: menuLoader.item
|
||||||
|
|
||||||
MouseArea{
|
MouseArea{
|
||||||
|
property real margin: appSettings.margin
|
||||||
|
|
||||||
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor
|
cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor
|
||||||
@@ -200,14 +220,14 @@ Item{
|
|||||||
}
|
}
|
||||||
|
|
||||||
function correctDistortion(x, y){
|
function correctDistortion(x, y){
|
||||||
x = x / width;
|
x = (x - margin) / width;
|
||||||
y = y / height;
|
y = (y - margin) / height;
|
||||||
|
|
||||||
var cc = Qt.size(0.5 - x, 0.5 - y);
|
var cc = Qt.size(0.5 - x, 0.5 - y);
|
||||||
var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
|
var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
|
||||||
|
|
||||||
return Qt.point((x - cc.width * (1+distortion) * distortion) * kterminal.width,
|
return Qt.point((x - cc.width * (1+distortion) * distortion) * kterminal.totalWidth,
|
||||||
(y - cc.height * (1+distortion) * distortion) * kterminal.height)
|
(y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ShaderEffectSource{
|
ShaderEffectSource{
|
||||||
@@ -216,10 +236,30 @@ Item{
|
|||||||
hideSource: true
|
hideSource: true
|
||||||
wrapMode: ShaderEffectSource.Repeat
|
wrapMode: ShaderEffectSource.Repeat
|
||||||
visible: false
|
visible: false
|
||||||
textureSize: Qt.size(kterminal.width * scaleTexture, kterminal.height * scaleTexture);
|
textureSize: Qt.size(kterminal.totalWidth * scaleTexture, kterminal.totalHeight * scaleTexture)
|
||||||
|
sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight)
|
||||||
}
|
}
|
||||||
|
|
||||||
BurnInEffect {
|
Item {
|
||||||
id: burnInEffect
|
id: burnInContainer
|
||||||
|
|
||||||
|
property int burnInScaling: scaleTexture * appSettings.burnInQuality
|
||||||
|
|
||||||
|
width: Math.round(appSettings.lowResolutionFont
|
||||||
|
? kterminal.totalWidth * Math.max(1, burnInScaling)
|
||||||
|
: kterminal.totalWidth * scaleTexture * appSettings.burnInQuality)
|
||||||
|
|
||||||
|
height: Math.round(appSettings.lowResolutionFont
|
||||||
|
? kterminal.totalHeight * Math.max(1, burnInScaling)
|
||||||
|
: kterminal.totalHeight * scaleTexture * appSettings.burnInQuality)
|
||||||
|
|
||||||
|
|
||||||
|
BurnInEffect {
|
||||||
|
id: burnInEffect
|
||||||
|
}
|
||||||
|
|
||||||
|
SlowBurnIn {
|
||||||
|
id: slowBurnInEffect
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,13 +27,48 @@ import "Components"
|
|||||||
Tab{
|
Tab{
|
||||||
ColumnLayout{
|
ColumnLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
GroupBox{
|
GroupBox{
|
||||||
title: qsTr("General")
|
Layout.fillWidth: true
|
||||||
|
title: qsTr("Command")
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
CheckBox{
|
||||||
|
id: useCustomCommand
|
||||||
|
text: qsTr("Use custom command instead of shell at startup")
|
||||||
|
checked: appSettings.useCustomCommand
|
||||||
|
onCheckedChanged: appSettings.useCustomCommand = checked
|
||||||
|
}
|
||||||
|
// Workaround for QTBUG-31627 for pre 5.3.0
|
||||||
|
Binding{
|
||||||
|
target: useCustomCommand
|
||||||
|
property: "checked"
|
||||||
|
value: appSettings.useCustomCommand
|
||||||
|
}
|
||||||
|
TextField{
|
||||||
|
id: customCommand
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: appSettings.customCommand
|
||||||
|
enabled: useCustomCommand.checked
|
||||||
|
onEditingFinished: appSettings.customCommand = text
|
||||||
|
|
||||||
|
// Save text even if user forgets to press enter or unfocus
|
||||||
|
function saveSetting() {
|
||||||
|
appSettings.customCommand = text;
|
||||||
|
}
|
||||||
|
Component.onCompleted: settings_window.closing.connect(saveSetting)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupBox{
|
||||||
|
title: qsTr("Performance")
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
GridLayout{
|
GridLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
rows: 2
|
rows: 2
|
||||||
columns: 3
|
columns: 3
|
||||||
|
|
||||||
Label{text: qsTr("Effects FPS")}
|
Label{text: qsTr("Effects FPS")}
|
||||||
Slider{
|
Slider{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
@@ -52,6 +87,7 @@ Tab{
|
|||||||
enabled = true;
|
enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
|
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
|
||||||
Label{text: qsTr("Texture Quality")}
|
Label{text: qsTr("Texture Quality")}
|
||||||
Slider{
|
Slider{
|
||||||
@@ -67,14 +103,7 @@ Tab{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
|
SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
|
||||||
}
|
|
||||||
}
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("Bloom")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
id: bloomQualityContainer
|
|
||||||
anchors.fill: parent
|
|
||||||
Label{text: qsTr("Bloom Quality")}
|
Label{text: qsTr("Bloom Quality")}
|
||||||
Slider{
|
Slider{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
@@ -89,14 +118,6 @@ Tab{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
|
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
|
||||||
}
|
|
||||||
}
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("BurnIn")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
id: blurQualityContainer
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
Label{text: qsTr("BurnIn Quality")}
|
Label{text: qsTr("BurnIn Quality")}
|
||||||
Slider{
|
Slider{
|
||||||
@@ -112,6 +133,12 @@ Tab{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
|
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
|
||||||
|
CheckBox{
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
text: qsTr("Burnin optimization (Might display timing artifacts)")
|
||||||
|
checked: appSettings.useFastBurnIn
|
||||||
|
onCheckedChanged: appSettings.useFastBurnIn = checked
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -23,62 +23,68 @@ import QtQuick.Controls 1.1
|
|||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
Tab{
|
Tab{
|
||||||
GroupBox{
|
ColumnLayout{
|
||||||
title: qsTr("Effects")
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
ColumnLayout{
|
spacing: 2
|
||||||
anchors.fill: parent
|
|
||||||
spacing: 2
|
GroupBox{
|
||||||
CheckableSlider{
|
title: qsTr("Effects")
|
||||||
name: qsTr("Bloom")
|
Layout.fillWidth: true
|
||||||
onNewValue: appSettings.bloom = newValue
|
|
||||||
value: appSettings.bloom
|
ColumnLayout {
|
||||||
}
|
anchors.fill: parent
|
||||||
CheckableSlider{
|
|
||||||
name: qsTr("BurnIn")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.burnIn = newValue
|
name: qsTr("Bloom")
|
||||||
value: appSettings.burnIn
|
onNewValue: appSettings.bloom = newValue
|
||||||
}
|
value: appSettings.bloom
|
||||||
CheckableSlider{
|
}
|
||||||
name: qsTr("Static Noise")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.staticNoise = newValue
|
name: qsTr("BurnIn")
|
||||||
value: appSettings.staticNoise
|
onNewValue: appSettings.burnIn = newValue
|
||||||
}
|
value: appSettings.burnIn
|
||||||
CheckableSlider{
|
}
|
||||||
name: qsTr("Jitter")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.jitter = newValue
|
name: qsTr("Static Noise")
|
||||||
value: appSettings.jitter
|
onNewValue: appSettings.staticNoise = newValue
|
||||||
}
|
value: appSettings.staticNoise
|
||||||
CheckableSlider{
|
}
|
||||||
name: qsTr("Glow Line")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.glowingLine = newValue;
|
name: qsTr("Jitter")
|
||||||
value: appSettings.glowingLine
|
onNewValue: appSettings.jitter = newValue
|
||||||
}
|
value: appSettings.jitter
|
||||||
CheckableSlider{
|
}
|
||||||
name: qsTr("Screen Curvature")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.screenCurvature = newValue;
|
name: qsTr("Glow Line")
|
||||||
value: appSettings.screenCurvature;
|
onNewValue: appSettings.glowingLine = newValue;
|
||||||
}
|
value: appSettings.glowingLine
|
||||||
CheckableSlider{
|
}
|
||||||
name: qsTr("Ambient Light")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.ambientLight = newValue;
|
name: qsTr("Screen Curvature")
|
||||||
value: appSettings.ambientLight
|
onNewValue: appSettings.screenCurvature = newValue;
|
||||||
enabled: appSettings.framesIndex !== 0
|
value: appSettings.screenCurvature;
|
||||||
}
|
}
|
||||||
CheckableSlider{
|
CheckableSlider{
|
||||||
name: qsTr("Flickering")
|
name: qsTr("Ambient Light")
|
||||||
onNewValue: appSettings.flickering = newValue;
|
onNewValue: appSettings.ambientLight = newValue;
|
||||||
value: appSettings.flickering;
|
value: appSettings.ambientLight
|
||||||
}
|
enabled: appSettings.framesIndex !== 0
|
||||||
CheckableSlider{
|
}
|
||||||
name: qsTr("Horizontal Sync")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.horizontalSync = newValue;
|
name: qsTr("Flickering")
|
||||||
value: appSettings.horizontalSync;
|
onNewValue: appSettings.flickering = newValue;
|
||||||
}
|
value: appSettings.flickering;
|
||||||
CheckableSlider{
|
}
|
||||||
name: qsTr("RGB Shift")
|
CheckableSlider{
|
||||||
onNewValue: appSettings.rbgShift = newValue;
|
name: qsTr("Horizontal Sync")
|
||||||
value: appSettings.rbgShift;
|
onNewValue: appSettings.horizontalSync = newValue;
|
||||||
|
value: appSettings.horizontalSync;
|
||||||
|
}
|
||||||
|
CheckableSlider{
|
||||||
|
name: qsTr("RGB Shift")
|
||||||
|
onNewValue: appSettings.rbgShift = newValue;
|
||||||
|
value: appSettings.rbgShift;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ Tab{
|
|||||||
Layout.fillWidth: false
|
Layout.fillWidth: false
|
||||||
Button{
|
Button{
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
text: qsTr("New")
|
text: qsTr("Save")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
insertname.profileName = "";
|
insertname.profileName = "";
|
||||||
insertname.show()
|
insertname.show()
|
||||||
@@ -164,34 +164,30 @@ Tab{
|
|||||||
}
|
}
|
||||||
|
|
||||||
GroupBox{
|
GroupBox{
|
||||||
|
title: qsTr("Screen")
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
title: qsTr("Command")
|
GridLayout{
|
||||||
ColumnLayout {
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
CheckBox{
|
columns: 2
|
||||||
id: useCustomCommand
|
Label{ text: qsTr("Brightness") }
|
||||||
text: qsTr("Use custom command instead of shell at startup")
|
SimpleSlider{
|
||||||
checked: appSettings.useCustomCommand
|
onValueChanged: appSettings.brightness = value
|
||||||
onCheckedChanged: appSettings.useCustomCommand = checked
|
value: appSettings.brightness
|
||||||
}
|
}
|
||||||
// Workaround for QTBUG-31627 for pre 5.3.0
|
Label{ text: qsTr("Contrast") }
|
||||||
Binding{
|
SimpleSlider{
|
||||||
target: useCustomCommand
|
onValueChanged: appSettings.contrast = value
|
||||||
property: "checked"
|
value: appSettings.contrast
|
||||||
value: appSettings.useCustomCommand
|
|
||||||
}
|
}
|
||||||
TextField{
|
Label{ text: qsTr("Margin") }
|
||||||
id: customCommand
|
SimpleSlider{
|
||||||
Layout.fillWidth: true
|
onValueChanged: appSettings._margin = value
|
||||||
text: appSettings.customCommand
|
value: appSettings._margin
|
||||||
enabled: useCustomCommand.checked
|
}
|
||||||
onEditingFinished: appSettings.customCommand = text
|
Label{ text: qsTr("Opacity") }
|
||||||
|
SimpleSlider{
|
||||||
// Save text even if user forgets to press enter or unfocus
|
onValueChanged: appSettings.windowOpacity = value
|
||||||
function saveSetting() {
|
value: appSettings.windowOpacity
|
||||||
appSettings.customCommand = text;
|
|
||||||
}
|
|
||||||
Component.onCompleted: settings_window.closing.connect(saveSetting)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2013 "Filippo Scognamiglio"
|
|
||||||
* https://github.com/Swordfish90/cool-retro-term
|
|
||||||
*
|
|
||||||
* This file is part of cool-retro-term.
|
|
||||||
*
|
|
||||||
* cool-retro-term is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Controls 1.1
|
|
||||||
import QtQuick.Layouts 1.1
|
|
||||||
import QtQuick.Dialogs 1.1
|
|
||||||
|
|
||||||
Tab{
|
|
||||||
ColumnLayout{
|
|
||||||
anchors.fill: parent
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("Rasterization Mode")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
ComboBox {
|
|
||||||
id: rasterizationBox
|
|
||||||
property string selectedElement: model[currentIndex]
|
|
||||||
anchors.fill: parent
|
|
||||||
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
|
|
||||||
currentIndex: appSettings.rasterization
|
|
||||||
onCurrentIndexChanged: {
|
|
||||||
appSettings.rasterization = currentIndex
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GroupBox{
|
|
||||||
title: qsTr("Lights")
|
|
||||||
Layout.fillWidth: true
|
|
||||||
GridLayout{
|
|
||||||
anchors.fill: parent
|
|
||||||
columns: 2
|
|
||||||
Label{ text: qsTr("Brightness") }
|
|
||||||
SimpleSlider{
|
|
||||||
onValueChanged: appSettings.brightness = value
|
|
||||||
value: appSettings.brightness
|
|
||||||
}
|
|
||||||
Label{ text: qsTr("Contrast") }
|
|
||||||
SimpleSlider{
|
|
||||||
onValueChanged: appSettings.contrast = value
|
|
||||||
value: appSettings.contrast
|
|
||||||
}
|
|
||||||
Label{ text: qsTr("Opacity") }
|
|
||||||
SimpleSlider{
|
|
||||||
onValueChanged: appSettings.windowOpacity = value
|
|
||||||
value: appSettings.windowOpacity
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -27,13 +27,26 @@ import "Components"
|
|||||||
Tab{
|
Tab{
|
||||||
ColumnLayout{
|
ColumnLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
GroupBox{
|
GroupBox{
|
||||||
property var rasterization: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")][appSettings.rasterization]
|
title: qsTr("Font")
|
||||||
title: qsTr("Font " + "(" + rasterization + ")")
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
GridLayout{
|
GridLayout{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
columns: 2
|
columns: 2
|
||||||
|
Label { text: qsTr("Rasterization") }
|
||||||
|
ComboBox {
|
||||||
|
id: rasterizationBox
|
||||||
|
|
||||||
|
property string selectedElement: model[currentIndex]
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
|
||||||
|
currentIndex: appSettings.rasterization
|
||||||
|
onCurrentIndexChanged: {
|
||||||
|
appSettings.rasterization = currentIndex
|
||||||
|
}
|
||||||
|
}
|
||||||
Label{ text: qsTr("Name") }
|
Label{ text: qsTr("Name") }
|
||||||
ComboBox{
|
ComboBox{
|
||||||
id: fontChanger
|
id: fontChanger
|
||||||
@@ -101,6 +114,24 @@ Tab{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GroupBox{
|
||||||
|
title: qsTr("Cursor")
|
||||||
|
Layout.fillWidth: true
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
CheckBox{
|
||||||
|
id: blinkingCursor
|
||||||
|
text: qsTr("Blinking Cursor")
|
||||||
|
checked: appSettings.blinkingCursor
|
||||||
|
onCheckedChanged: appSettings.blinkingCursor = checked
|
||||||
|
}
|
||||||
|
Binding{
|
||||||
|
target: blinkingCursor
|
||||||
|
property: "checked"
|
||||||
|
value: appSettings.blinkingCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
GroupBox{
|
GroupBox{
|
||||||
title: qsTr("Colors")
|
title: qsTr("Colors")
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
|||||||
@@ -36,33 +36,27 @@ Window {
|
|||||||
id: tabView
|
id: tabView
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: 10
|
anchors.margins: 10
|
||||||
SettingsGeneralTab{
|
SettingsGeneralTab {
|
||||||
id: generalTab
|
id: generalTab
|
||||||
title: qsTr("General")
|
title: qsTr("General")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: tabmargins
|
anchors.margins: tabmargins
|
||||||
}
|
}
|
||||||
SettingsScreenTab{
|
SettingsTerminalTab {
|
||||||
id: screenTab
|
|
||||||
title: qsTr("Screen")
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: tabmargins
|
|
||||||
}
|
|
||||||
SettingsTerminalTab{
|
|
||||||
id: terminalTab
|
id: terminalTab
|
||||||
title: qsTr("Terminal")
|
title: qsTr("Terminal")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: tabmargins
|
anchors.margins: tabmargins
|
||||||
}
|
}
|
||||||
SettingsEffectsTab{
|
SettingsEffectsTab {
|
||||||
id: effectsTab
|
id: effectsTab
|
||||||
title: qsTr("Effects")
|
title: qsTr("Effects")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: tabmargins
|
anchors.margins: tabmargins
|
||||||
}
|
}
|
||||||
SettingsPerformanceTab{
|
SettingsAdvancedTab {
|
||||||
id: performanceTab
|
id: performanceTab
|
||||||
title: qsTr("Performance")
|
title: qsTr("Advanced")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: tabmargins
|
anchors.margins: tabmargins
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,330 +23,513 @@ import QtGraphicalEffects 1.0
|
|||||||
|
|
||||||
import "utils.js" as Utils
|
import "utils.js" as Utils
|
||||||
|
|
||||||
ShaderEffect {
|
Item {
|
||||||
|
property SlowBurnIn slowBurnInEffect
|
||||||
property ShaderEffectSource source
|
property ShaderEffectSource source
|
||||||
property BurnInEffect burnInEffect
|
property BurnInEffect burnInEffect
|
||||||
property ShaderEffectSource bloomSource
|
property ShaderEffectSource bloomSource
|
||||||
|
|
||||||
property color fontColor: appSettings.fontColor
|
property color fontColor: appSettings.fontColor
|
||||||
property color backgroundColor: appSettings.backgroundColor
|
property color backgroundColor: appSettings.backgroundColor
|
||||||
property real bloom: appSettings.bloom * 2.5
|
|
||||||
|
|
||||||
property ShaderEffectSource burnInSource: burnInEffect.source
|
|
||||||
property real burnIn: appSettings.burnIn
|
|
||||||
property real burnInLastUpdate: burnInEffect.lastUpdate
|
|
||||||
property real burnInTime: burnInEffect.burnInFadeTime
|
|
||||||
|
|
||||||
property real jitter: appSettings.jitter
|
|
||||||
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
|
|
||||||
|
|
||||||
property real staticNoise: appSettings.staticNoise
|
|
||||||
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
|
|
||||||
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
|
|
||||||
|
|
||||||
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
|
||||||
property real glowingLine: appSettings.glowingLine * 0.2
|
|
||||||
|
|
||||||
property real chromaColor: appSettings.chromaColor;
|
property real chromaColor: appSettings.chromaColor
|
||||||
|
|
||||||
property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling
|
|
||||||
|
|
||||||
property real flickering: appSettings.flickering
|
|
||||||
property real horizontalSync: appSettings.horizontalSync * 0.5
|
|
||||||
|
|
||||||
property int rasterization: appSettings.rasterization
|
|
||||||
|
|
||||||
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
|
|
||||||
|
|
||||||
property real ambientLight: appSettings.ambientLight * 0.2
|
property real ambientLight: appSettings.ambientLight * 0.2
|
||||||
|
|
||||||
property size virtual_resolution
|
property size virtual_resolution
|
||||||
|
|
||||||
property real time: timeManager.time
|
ShaderEffect {
|
||||||
property ShaderEffectSource noiseSource: noiseShaderSource
|
id: dynamicShader
|
||||||
|
|
||||||
// If something goes wrong activate the fallback version of the shader.
|
property ShaderEffectSource screenBuffer: frameBuffer
|
||||||
property bool fallBack: false
|
property ShaderEffectSource burnInSource: burnInEffect.source
|
||||||
|
property ShaderEffectSource frameSource: terminalFrameLoader.item
|
||||||
|
|
||||||
blending: false
|
property color fontColor: parent.fontColor
|
||||||
|
property color backgroundColor: parent.backgroundColor
|
||||||
|
property real screenCurvature: parent.screenCurvature
|
||||||
|
property real chromaColor: parent.chromaColor
|
||||||
|
property real ambientLight: parent.ambientLight
|
||||||
|
|
||||||
//Smooth random texture used for flickering effect.
|
property real flickering: appSettings.flickering
|
||||||
Image{
|
property real horizontalSync: appSettings.horizontalSync
|
||||||
id: noiseTexture
|
property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
|
||||||
source: "images/allNoise512.png"
|
property real glowingLine: appSettings.glowingLine * 0.2
|
||||||
width: 512
|
|
||||||
height: 512
|
|
||||||
fillMode: Image.Tile
|
|
||||||
visible: false
|
|
||||||
}
|
|
||||||
ShaderEffectSource{
|
|
||||||
id: noiseShaderSource
|
|
||||||
sourceItem: noiseTexture
|
|
||||||
wrapMode: ShaderEffectSource.Repeat
|
|
||||||
visible: false
|
|
||||||
smooth: true
|
|
||||||
}
|
|
||||||
|
|
||||||
//Print the number with a reasonable precision for the shader.
|
// Fast burnin properties
|
||||||
function str(num){
|
property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0
|
||||||
return num.toFixed(8);
|
property real burnInLastUpdate: burnInEffect.lastUpdate
|
||||||
}
|
property real burnInTime: burnInEffect.burnInFadeTime
|
||||||
|
|
||||||
vertexShader: "
|
// Slow burnin properties
|
||||||
uniform highp mat4 qt_Matrix;
|
property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn
|
||||||
uniform highp float time;
|
property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source
|
||||||
|
|
||||||
attribute highp vec4 qt_Vertex;
|
property real jitter: appSettings.jitter
|
||||||
attribute highp vec2 qt_MultiTexCoord0;
|
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
|
||||||
|
property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
|
||||||
|
property real staticNoise: appSettings.staticNoise
|
||||||
|
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
|
||||||
|
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
|
||||||
|
|
||||||
varying highp vec2 qt_TexCoord0;" +
|
property size virtual_resolution: parent.virtual_resolution
|
||||||
|
|
||||||
(!fallBack ? "
|
property real time: timeManager.time
|
||||||
uniform sampler2D noiseSource;" : "") +
|
property ShaderEffectSource noiseSource: noiseShaderSource
|
||||||
|
|
||||||
(!fallBack && rbgShift !== 0.0 ?"
|
// If something goes wrong activate the fallback version of the shader.
|
||||||
varying lowp vec4 constantNoise;" : "") +
|
property bool fallBack: false
|
||||||
|
|
||||||
(!fallBack && flickering !== 0.0 ?"
|
anchors.fill: parent
|
||||||
varying lowp float brightness;
|
blending: false
|
||||||
uniform lowp float flickering;" : "") +
|
|
||||||
|
|
||||||
(!fallBack && horizontalSync !== 0.0 ?"
|
//Smooth random texture used for flickering effect.
|
||||||
uniform lowp float horizontalSync;
|
Image{
|
||||||
varying lowp float distortionScale;
|
id: noiseTexture
|
||||||
varying lowp float distortionFreq;" : "") +
|
source: "images/allNoise512.png"
|
||||||
|
width: 512
|
||||||
|
height: 512
|
||||||
|
fillMode: Image.Tile
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
ShaderEffectSource{
|
||||||
|
id: noiseShaderSource
|
||||||
|
sourceItem: noiseTexture
|
||||||
|
wrapMode: ShaderEffectSource.Repeat
|
||||||
|
visible: false
|
||||||
|
smooth: true
|
||||||
|
}
|
||||||
|
|
||||||
"
|
//Print the number with a reasonable precision for the shader.
|
||||||
void main() {
|
function str(num){
|
||||||
qt_TexCoord0 = qt_MultiTexCoord0;
|
return num.toFixed(8);
|
||||||
vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
|
}
|
||||||
|
|
||||||
(!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ?
|
vertexShader: "
|
||||||
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
|
uniform highp mat4 qt_Matrix;
|
||||||
: "") +
|
uniform highp float time;
|
||||||
|
|
||||||
(!fallBack && rbgShift !== 0.0 ?"
|
attribute highp vec4 qt_Vertex;
|
||||||
constantNoise = initialNoiseTexel;" : "") +
|
attribute highp vec2 qt_MultiTexCoord0;
|
||||||
|
|
||||||
(!fallBack && flickering !== 0.0 ? "
|
varying highp vec2 qt_TexCoord0;" +
|
||||||
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(!fallBack && horizontalSync !== 0.0 ? "
|
(!fallBack ? "
|
||||||
float randval = horizontalSync - initialNoiseTexel.r;
|
uniform sampler2D noiseSource;" : "") +
|
||||||
distortionScale = step(0.0, randval) * randval * horizontalSync;
|
|
||||||
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
"gl_Position = qt_Matrix * qt_Vertex;
|
(!fallBack && flickering !== 0.0 ?"
|
||||||
}"
|
varying lowp float brightness;
|
||||||
|
uniform lowp float flickering;" : "") +
|
||||||
|
|
||||||
fragmentShader: "
|
(!fallBack && horizontalSync !== 0.0 ?"
|
||||||
#ifdef GL_ES
|
uniform lowp float horizontalSyncStrength;
|
||||||
precision mediump float;
|
varying lowp float distortionScale;
|
||||||
#endif
|
varying lowp float distortionFreq;" : "") +
|
||||||
|
|
||||||
uniform sampler2D source;
|
"
|
||||||
uniform highp float qt_Opacity;
|
void main() {
|
||||||
uniform highp float time;
|
qt_TexCoord0 = qt_MultiTexCoord0;
|
||||||
varying highp vec2 qt_TexCoord0;
|
vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
|
||||||
|
|
||||||
uniform highp vec4 fontColor;
|
(!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
|
||||||
uniform highp vec4 backgroundColor;
|
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
|
||||||
uniform lowp float screen_brightness;
|
: "") +
|
||||||
|
|
||||||
uniform highp vec2 virtual_resolution;" +
|
(!fallBack && flickering !== 0.0 ? "
|
||||||
|
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
|
||||||
|
: "") +
|
||||||
|
|
||||||
(bloom !== 0 ? "
|
(!fallBack && horizontalSync !== 0.0 ? "
|
||||||
uniform highp sampler2D bloomSource;
|
float randval = horizontalSyncStrength - initialNoiseTexel.r;
|
||||||
uniform lowp float bloom;" : "") +
|
distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
|
||||||
(burnIn !== 0 ? "
|
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
||||||
uniform sampler2D burnInSource;
|
: "") +
|
||||||
uniform highp float burnInLastUpdate;
|
|
||||||
uniform highp float burnInTime;" : "") +
|
|
||||||
(staticNoise !== 0 ? "
|
|
||||||
uniform highp float staticNoise;" : "") +
|
|
||||||
(((staticNoise !== 0 || jitter !== 0 || rbgShift)
|
|
||||||
||(fallBack && (flickering || horizontalSync))) ? "
|
|
||||||
uniform lowp sampler2D noiseSource;
|
|
||||||
uniform highp vec2 scaleNoiseSize;" : "") +
|
|
||||||
(screenCurvature !== 0 ? "
|
|
||||||
uniform highp float screenCurvature;" : "") +
|
|
||||||
(glowingLine !== 0 ? "
|
|
||||||
uniform highp float glowingLine;" : "") +
|
|
||||||
(chromaColor !== 0 ? "
|
|
||||||
uniform lowp float chromaColor;" : "") +
|
|
||||||
(jitter !== 0 ? "
|
|
||||||
uniform lowp vec2 jitterDisplacement;" : "") +
|
|
||||||
(rbgShift !== 0 ? "
|
|
||||||
uniform lowp float rbgShift;" : "") +
|
|
||||||
(ambientLight !== 0 ? "
|
|
||||||
uniform lowp float ambientLight;" : "") +
|
|
||||||
|
|
||||||
(fallBack && horizontalSync !== 0 ? "
|
"gl_Position = qt_Matrix * qt_Vertex;
|
||||||
uniform lowp float horizontalSync;" : "") +
|
}"
|
||||||
(fallBack && flickering !== 0.0 ?"
|
|
||||||
uniform lowp float flickering;" : "") +
|
|
||||||
(!fallBack && flickering !== 0 ? "
|
|
||||||
varying lowp float brightness;"
|
|
||||||
: "") +
|
|
||||||
(!fallBack && horizontalSync !== 0 ? "
|
|
||||||
varying lowp float distortionScale;
|
|
||||||
varying lowp float distortionFreq;" : "") +
|
|
||||||
|
|
||||||
(!fallBack && rbgShift !== 0.0 ?"
|
fragmentShader: "
|
||||||
varying lowp vec4 constantNoise;" : "") +
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#endif
|
||||||
|
|
||||||
(glowingLine !== 0 ? "
|
uniform sampler2D screenBuffer;
|
||||||
float randomPass(vec2 coords){
|
uniform highp float qt_Opacity;
|
||||||
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
|
uniform highp float time;
|
||||||
}" : "") +
|
varying highp vec2 qt_TexCoord0;
|
||||||
|
|
||||||
"highp float getScanlineIntensity(vec2 coords) {
|
uniform highp vec4 fontColor;
|
||||||
float result = 1.0;" +
|
uniform highp vec4 backgroundColor;
|
||||||
|
uniform lowp float shadowLength;
|
||||||
|
|
||||||
(appSettings.rasterization != appSettings.no_rasterization ?
|
uniform highp vec2 virtual_resolution;" +
|
||||||
"float val = 0.0;
|
|
||||||
vec2 rasterizationCoords = fract(coords * virtual_resolution);
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") +
|
|
||||||
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
|
||||||
"val = 0.0;
|
|
||||||
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
|
|
||||||
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
|
|
||||||
result *= mix(0.5, 1.0, val);" : "") + "
|
|
||||||
|
|
||||||
return result;
|
(burnIn !== 0 ? "
|
||||||
}
|
uniform sampler2D burnInSource;
|
||||||
|
uniform highp float burnInLastUpdate;
|
||||||
|
uniform highp float burnInTime;" : "") +
|
||||||
|
(slowBurnIn !== 0 ? "
|
||||||
|
uniform sampler2D slowBurnInSource;" : "") +
|
||||||
|
(staticNoise !== 0 ? "
|
||||||
|
uniform highp float staticNoise;" : "") +
|
||||||
|
(((staticNoise !== 0 || jitter !== 0)
|
||||||
|
||(fallBack && (flickering || horizontalSync))) ? "
|
||||||
|
uniform lowp sampler2D noiseSource;
|
||||||
|
uniform highp vec2 scaleNoiseSize;" : "") +
|
||||||
|
(screenCurvature !== 0 ? "
|
||||||
|
uniform highp float screenCurvature;
|
||||||
|
uniform lowp sampler2D frameSource;" : "") +
|
||||||
|
(glowingLine !== 0 ? "
|
||||||
|
uniform highp float glowingLine;" : "") +
|
||||||
|
(chromaColor !== 0 ? "
|
||||||
|
uniform lowp float chromaColor;" : "") +
|
||||||
|
(jitter !== 0 ? "
|
||||||
|
uniform lowp vec2 jitterDisplacement;" : "") +
|
||||||
|
(ambientLight !== 0 ? "
|
||||||
|
uniform lowp float ambientLight;" : "") +
|
||||||
|
|
||||||
float min2(vec2 v) {
|
(fallBack && horizontalSync !== 0 ? "
|
||||||
return min(v.x, v.y);
|
uniform lowp float horizontalSyncStrength;" : "") +
|
||||||
}
|
(fallBack && flickering !== 0.0 ?"
|
||||||
|
uniform lowp float flickering;" : "") +
|
||||||
|
(!fallBack && flickering !== 0 ? "
|
||||||
|
varying lowp float brightness;"
|
||||||
|
: "") +
|
||||||
|
(!fallBack && horizontalSync !== 0 ? "
|
||||||
|
varying lowp float distortionScale;
|
||||||
|
varying lowp float distortionFreq;" : "") +
|
||||||
|
|
||||||
float rgb2grey(vec3 v){
|
(glowingLine !== 0 ? "
|
||||||
return dot(v, vec3(0.21, 0.72, 0.04));
|
float randomPass(vec2 coords){
|
||||||
}" +
|
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
|
||||||
|
}" : "") +
|
||||||
|
|
||||||
"void main() {" +
|
"float min2(vec2 v) {
|
||||||
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
return min(v.x, v.y);
|
||||||
"float distance = length(cc);" +
|
}
|
||||||
|
|
||||||
//FallBack if there are problems
|
float rgb2grey(vec3 v){
|
||||||
(fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ?
|
return dot(v, vec3(0.21, 0.72, 0.04));
|
||||||
"vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));
|
}
|
||||||
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
|
|
||||||
: "") +
|
|
||||||
(fallBack && flickering !== 0.0 ? "
|
|
||||||
float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
|
|
||||||
: "") +
|
|
||||||
(fallBack && horizontalSync !== 0.0 ? "
|
|
||||||
float randval = horizontalSync - initialNoiseTexel.r;
|
|
||||||
float distortionScale = step(0.0, randval) * randval * horizontalSync;
|
|
||||||
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
|
||||||
: "") +
|
|
||||||
(fallBack && rbgShift !== 0.0 ?"
|
|
||||||
lowp vec4 constantNoise = initialNoiseTexel;" : "") +
|
|
||||||
|
|
||||||
(staticNoise ? "
|
float isInScreen(vec2 v) {
|
||||||
float noise = staticNoise;" : "") +
|
return min2(step(0.0, v) - step(1.0, v));
|
||||||
|
}
|
||||||
|
|
||||||
(screenCurvature !== 0 ? "
|
vec2 barrel(vec2 v, vec2 cc) {" +
|
||||||
float distortion = dot(cc, cc) * screenCurvature;
|
|
||||||
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion);
|
|
||||||
vec2 staticCoords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;"
|
|
||||||
:"
|
|
||||||
vec2 staticCoords = qt_TexCoord0;") +
|
|
||||||
|
|
||||||
"vec2 coords = staticCoords;" +
|
(screenCurvature !== 0 ? "
|
||||||
|
float distortion = dot(cc, cc) * screenCurvature;
|
||||||
|
return (v - cc * (1.0 + distortion) * distortion);"
|
||||||
|
:
|
||||||
|
"return v;") +
|
||||||
|
"}" +
|
||||||
|
|
||||||
(horizontalSync !== 0 ? "
|
"vec3 convertWithChroma(vec3 inColor) {
|
||||||
float dst = sin((coords.y + time * 0.001) * distortionFreq);
|
vec3 outColor = inColor;" +
|
||||||
coords.x += dst * distortionScale;" +
|
|
||||||
(staticNoise ? "
|
|
||||||
noise += distortionScale * 7.0;" : "")
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ?
|
(chromaColor !== 0 ?
|
||||||
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
|
"outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
|
||||||
: "") +
|
:
|
||||||
|
"outColor = fontColor.rgb * rgb2grey(inColor);") +
|
||||||
|
|
||||||
(jitter !== 0 ? "
|
" return outColor;
|
||||||
vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
|
}" +
|
||||||
vec2 txt_coords = coords + offset * jitterDisplacement;"
|
|
||||||
: "vec2 txt_coords = coords;") +
|
|
||||||
|
|
||||||
"float color = 0.0001;" +
|
"void main() {" +
|
||||||
|
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
||||||
|
"float distance = length(cc);" +
|
||||||
|
|
||||||
(staticNoise !== 0 ? "
|
//FallBack if there are problems
|
||||||
float noiseVal = noiseTexel.a;
|
(fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
|
||||||
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
"vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));
|
||||||
|
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
|
||||||
|
: "") +
|
||||||
|
(fallBack && flickering !== 0.0 ? "
|
||||||
|
float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
|
||||||
|
: "") +
|
||||||
|
(fallBack && horizontalSync !== 0.0 ? "
|
||||||
|
float randval = horizontalSyncStrength - initialNoiseTexel.r;
|
||||||
|
float distortionScale = step(0.0, randval) * randval * horizontalSyncStrength;
|
||||||
|
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
|
||||||
|
: "") +
|
||||||
|
|
||||||
(glowingLine !== 0 ? "
|
(staticNoise ? "
|
||||||
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
|
float noise = staticNoise;" : "") +
|
||||||
|
|
||||||
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
|
(screenCurvature !== 0 ? "
|
||||||
|
vec2 staticCoords = barrel(qt_TexCoord0, cc);"
|
||||||
|
:"
|
||||||
|
vec2 staticCoords = qt_TexCoord0;") +
|
||||||
|
|
||||||
(rbgShift !== 0 ? "
|
"vec2 coords = qt_TexCoord0;" +
|
||||||
vec2 displacement = vec2(12.0, 0.0) * rbgShift * (0.6 * constantNoise.r + 0.4);
|
|
||||||
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
|
|
||||||
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
|
|
||||||
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
|
|
||||||
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
|
|
||||||
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
|
|
||||||
" : "") +
|
|
||||||
|
|
||||||
(burnIn !== 0 ? "
|
(horizontalSync !== 0 ? "
|
||||||
vec4 txt_blur = texture2D(burnInSource, staticCoords);
|
float dst = sin((coords.y + time * 0.001) * distortionFreq);
|
||||||
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
|
coords.x += dst * distortionScale;" +
|
||||||
txt_color = max(txt_color, 0.5 * (txt_blur.rgb - vec3(blurDecay)));"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
"txt_color *= getScanlineIntensity(coords);" +
|
(staticNoise ? "
|
||||||
|
noise += distortionScale * 7.0;" : "")
|
||||||
|
|
||||||
"txt_color += vec3(color);" +
|
: "") +
|
||||||
"float greyscale_color = rgb2grey(txt_color);" +
|
|
||||||
|
|
||||||
(chromaColor !== 0 ?
|
(jitter !== 0 || staticNoise !== 0 ?
|
||||||
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor);
|
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
|
||||||
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);"
|
: "") +
|
||||||
:
|
|
||||||
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") +
|
|
||||||
|
|
||||||
(bloom !== 0 ?
|
(jitter !== 0 ? "
|
||||||
"vec4 bloomFullColor = texture2D(bloomSource, coords);
|
vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
|
||||||
vec3 bloomColor = bloomFullColor.rgb;
|
vec2 txt_coords = coords + offset * jitterDisplacement;"
|
||||||
float bloomAlpha = bloomFullColor.a;" +
|
: "vec2 txt_coords = coords;") +
|
||||||
(chromaColor !== 0 ?
|
|
||||||
"bloomColor = fontColor.rgb * mix(vec3(rgb2grey(bloomColor)), bloomColor, chromaColor);"
|
|
||||||
:
|
|
||||||
"bloomColor = fontColor.rgb * rgb2grey(bloomColor);") +
|
|
||||||
"finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
|
|
||||||
: "") +
|
|
||||||
|
|
||||||
(screenCurvature !== 0 ? "
|
"float color = 0.0001;" +
|
||||||
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords);
|
|
||||||
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);"
|
|
||||||
:"") +
|
|
||||||
|
|
||||||
(flickering !== 0 ? "
|
(staticNoise !== 0 ? "
|
||||||
finalColor *= brightness;" : "") +
|
float noiseVal = noiseTexel.a;
|
||||||
|
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
|
||||||
|
|
||||||
(ambientLight !== 0 ? "
|
(glowingLine !== 0 ? "
|
||||||
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
|
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
|
||||||
|
|
||||||
|
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
|
||||||
|
|
||||||
"gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" +
|
(burnIn !== 0 ? "
|
||||||
"}"
|
vec4 txt_blur = texture2D(burnInSource, staticCoords);
|
||||||
|
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
|
||||||
|
vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay));
|
||||||
|
txt_color = max(txt_color, convertWithChroma(burnInColor));"
|
||||||
|
: "") +
|
||||||
|
|
||||||
onStatusChanged: {
|
(slowBurnIn !== 0 ? "
|
||||||
// Print warning messages
|
vec4 txt_blur = texture2D(slowBurnInSource, staticCoords);
|
||||||
if (log)
|
txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a));
|
||||||
console.log(log);
|
" : "") +
|
||||||
|
|
||||||
// Activate fallback mode
|
"txt_color += fontColor.rgb * vec3(color);" +
|
||||||
if (status == ShaderEffect.Error) {
|
|
||||||
fallBack = true;
|
"vec3 finalColor = txt_color;" +
|
||||||
|
|
||||||
|
(flickering !== 0 ? "
|
||||||
|
finalColor *= brightness;" : "") +
|
||||||
|
|
||||||
|
(ambientLight !== 0 ? "
|
||||||
|
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
|
||||||
|
|
||||||
|
(screenCurvature !== 0 ?
|
||||||
|
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
|
||||||
|
finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
|
||||||
|
: "") +
|
||||||
|
|
||||||
|
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
||||||
|
"}"
|
||||||
|
|
||||||
|
onStatusChanged: {
|
||||||
|
// Print warning messages
|
||||||
|
if (log)
|
||||||
|
console.log(log);
|
||||||
|
|
||||||
|
// Activate fallback mode
|
||||||
|
if (status == ShaderEffect.Error) {
|
||||||
|
fallBack = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: terminalFrameLoader
|
||||||
|
|
||||||
|
active: screenCurvature !== 0
|
||||||
|
|
||||||
|
width: staticShader.width
|
||||||
|
height: staticShader.height
|
||||||
|
|
||||||
|
sourceComponent: ShaderEffectSource {
|
||||||
|
|
||||||
|
sourceItem: terminalFrame
|
||||||
|
hideSource: true
|
||||||
|
visible: false
|
||||||
|
format: ShaderEffectSource.RGBA
|
||||||
|
|
||||||
|
NewTerminalFrame {
|
||||||
|
id: terminalFrame
|
||||||
|
blending: false
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShaderEffect {
|
||||||
|
id: staticShader
|
||||||
|
|
||||||
|
width: parent.width * appSettings.windowScaling
|
||||||
|
height: parent.height * appSettings.windowScaling
|
||||||
|
|
||||||
|
property ShaderEffectSource source: parent.source
|
||||||
|
property ShaderEffectSource bloomSource: parent.bloomSource
|
||||||
|
|
||||||
|
property color fontColor: parent.fontColor
|
||||||
|
property color backgroundColor: parent.backgroundColor
|
||||||
|
property real bloom: appSettings.bloom * 2.5
|
||||||
|
|
||||||
|
property real screenCurvature: parent.screenCurvature
|
||||||
|
|
||||||
|
property real chromaColor: appSettings.chromaColor;
|
||||||
|
|
||||||
|
property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling // TODO FILIPPO width here is wrong.
|
||||||
|
|
||||||
|
property int rasterization: appSettings.rasterization
|
||||||
|
|
||||||
|
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
|
||||||
|
|
||||||
|
property real ambientLight: parent.ambientLight
|
||||||
|
|
||||||
|
property size virtual_resolution: parent.virtual_resolution
|
||||||
|
|
||||||
|
blending: false
|
||||||
|
visible: false
|
||||||
|
|
||||||
|
//Print the number with a reasonable precision for the shader.
|
||||||
|
function str(num){
|
||||||
|
return num.toFixed(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
fragmentShader: "
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uniform sampler2D source;
|
||||||
|
uniform highp float qt_Opacity;
|
||||||
|
varying highp vec2 qt_TexCoord0;
|
||||||
|
|
||||||
|
uniform highp vec4 fontColor;
|
||||||
|
uniform highp vec4 backgroundColor;
|
||||||
|
uniform lowp float screen_brightness;
|
||||||
|
|
||||||
|
uniform highp vec2 virtual_resolution;" +
|
||||||
|
|
||||||
|
(bloom !== 0 ? "
|
||||||
|
uniform highp sampler2D bloomSource;
|
||||||
|
uniform lowp float bloom;" : "") +
|
||||||
|
|
||||||
|
(screenCurvature !== 0 ? "
|
||||||
|
uniform highp float screenCurvature;" : "") +
|
||||||
|
|
||||||
|
(chromaColor !== 0 ? "
|
||||||
|
uniform lowp float chromaColor;" : "") +
|
||||||
|
|
||||||
|
(rbgShift !== 0 ? "
|
||||||
|
uniform lowp float rbgShift;" : "") +
|
||||||
|
|
||||||
|
(ambientLight !== 0 ? "
|
||||||
|
uniform lowp float ambientLight;" : "") +
|
||||||
|
|
||||||
|
"highp float getScanlineIntensity(vec2 coords) {
|
||||||
|
float result = 1.0;" +
|
||||||
|
|
||||||
|
(appSettings.rasterization != appSettings.no_rasterization ?
|
||||||
|
"float val = 0.0;
|
||||||
|
vec2 rasterizationCoords = fract(coords * virtual_resolution);
|
||||||
|
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
|
||||||
|
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
|
||||||
|
result *= mix(0.5, 1.0, val);" : "") +
|
||||||
|
|
||||||
|
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
||||||
|
"val = 0.0;
|
||||||
|
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
|
||||||
|
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
|
||||||
|
result *= mix(0.5, 1.0, val);" : "") + "
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
float min2(vec2 v) {
|
||||||
|
return min(v.x, v.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sum2(vec2 v) {
|
||||||
|
return v.x + v.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float rgb2grey(vec3 v){
|
||||||
|
return dot(v, vec3(0.21, 0.72, 0.04));
|
||||||
|
}" +
|
||||||
|
|
||||||
|
"vec3 convertWithChroma(vec3 inColor) {
|
||||||
|
vec3 outColor = inColor;" +
|
||||||
|
|
||||||
|
(chromaColor !== 0 ?
|
||||||
|
"outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
|
||||||
|
:
|
||||||
|
"outColor = fontColor.rgb * rgb2grey(inColor);") +
|
||||||
|
|
||||||
|
" return outColor;
|
||||||
|
}" +
|
||||||
|
|
||||||
|
|
||||||
|
"void main() {" +
|
||||||
|
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
|
||||||
|
|
||||||
|
(screenCurvature !== 0 ? "
|
||||||
|
float distortion = dot(cc, cc) * screenCurvature;
|
||||||
|
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion);
|
||||||
|
vec2 txt_coords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;"
|
||||||
|
:"
|
||||||
|
vec2 txt_coords = qt_TexCoord0;") +
|
||||||
|
|
||||||
|
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
|
||||||
|
|
||||||
|
(rbgShift !== 0 ? "
|
||||||
|
vec2 displacement = vec2(12.0, 0.0) * rbgShift;
|
||||||
|
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
|
||||||
|
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
|
||||||
|
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
|
||||||
|
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
|
||||||
|
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
|
||||||
|
" : "") +
|
||||||
|
|
||||||
|
"txt_color *= getScanlineIntensity(txt_coords);" +
|
||||||
|
|
||||||
|
"txt_color += vec3(0.0001);" +
|
||||||
|
"float greyscale_color = rgb2grey(txt_color);" +
|
||||||
|
|
||||||
|
(screenCurvature !== 0 ? "
|
||||||
|
float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords));
|
||||||
|
reflectionMask = clamp(reflectionMask, 0.0, 1.0);"
|
||||||
|
:
|
||||||
|
"float reflectionMask = 1.0;") +
|
||||||
|
|
||||||
|
(chromaColor !== 0 ?
|
||||||
|
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor);
|
||||||
|
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * reflectionMask);"
|
||||||
|
:
|
||||||
|
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") +
|
||||||
|
|
||||||
|
(bloom !== 0 ?
|
||||||
|
"vec4 bloomFullColor = texture2D(bloomSource, txt_coords);
|
||||||
|
vec3 bloomColor = bloomFullColor.rgb;
|
||||||
|
float bloomAlpha = bloomFullColor.a;
|
||||||
|
bloomColor = convertWithChroma(bloomColor);
|
||||||
|
finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
|
||||||
|
: "") +
|
||||||
|
|
||||||
|
"finalColor *= screen_brightness;" +
|
||||||
|
|
||||||
|
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
|
||||||
|
"}"
|
||||||
|
|
||||||
|
onStatusChanged: {
|
||||||
|
// Print warning messages
|
||||||
|
if (log) console.log(log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderEffectSource {
|
||||||
|
id: frameBuffer
|
||||||
|
visible: false
|
||||||
|
sourceItem: staticShader
|
||||||
|
hideSource: true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
122
app/qml/SlowBurnIn.qml
Normal file
122
app/qml/SlowBurnIn.qml
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
import "utils.js" as Utils
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
property ShaderEffectSource source: item ? item.source : null
|
||||||
|
|
||||||
|
active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
sourceComponent: Item {
|
||||||
|
property alias source: burnInSourceEffect
|
||||||
|
|
||||||
|
property int burnInScaling: scaleTexture * appSettings.burnInQuality
|
||||||
|
|
||||||
|
ShaderEffectSource {
|
||||||
|
property bool updateBurnIn: false
|
||||||
|
property real burnIn: appSettings.burnIn
|
||||||
|
property real fps: appSettings.fps !== 0 ? appSettings.fps : 60
|
||||||
|
property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn)
|
||||||
|
property real burnInCoefficient: 1000 / (fps * burnInFadeTime)
|
||||||
|
property real minBurnInFadeTime: appSettings.minBurnInFadeTime
|
||||||
|
property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime
|
||||||
|
|
||||||
|
id: burnInSourceEffect
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
sourceItem: burnInEffect
|
||||||
|
recursive: true
|
||||||
|
live: false
|
||||||
|
hideSource: true
|
||||||
|
wrapMode: kterminalSource.wrapMode
|
||||||
|
|
||||||
|
visible: false
|
||||||
|
|
||||||
|
function restartBlurSource(){
|
||||||
|
livetimer.restart();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This updates the burnin synched with the timer.
|
||||||
|
Connections {
|
||||||
|
target: burnInSourceEffect.updateBurnIn ? timeManager : null
|
||||||
|
ignoreUnknownSignals: false
|
||||||
|
onTimeChanged: {
|
||||||
|
burnInSourceEffect.scheduleUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer{
|
||||||
|
id: livetimer
|
||||||
|
|
||||||
|
// The interval assumes 60 fps. This is the time needed burnout a white pixel.
|
||||||
|
// We multiply 1.1 to have a little bit of margin over the theoretical value.
|
||||||
|
// This solution is not extremely clean, but it's probably the best to avoid measuring fps.
|
||||||
|
|
||||||
|
interval: burnInSourceEffect.burnInFadeTime * 1.1
|
||||||
|
running: true
|
||||||
|
onTriggered: burnInSourceEffect.updateBurnIn = false;
|
||||||
|
}
|
||||||
|
Connections{
|
||||||
|
target: kterminal
|
||||||
|
onImagePainted:{
|
||||||
|
burnInSourceEffect.scheduleUpdate();
|
||||||
|
burnInSourceEffect.updateBurnIn = true;
|
||||||
|
livetimer.restart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Restart blurred source settings change.
|
||||||
|
Connections{
|
||||||
|
target: appSettings
|
||||||
|
onBurnInChanged: burnInSourceEffect.restartBlurSource();
|
||||||
|
onTerminalFontChanged: burnInSourceEffect.restartBlurSource();
|
||||||
|
onRasterizationChanged: burnInSourceEffect.restartBlurSource();
|
||||||
|
onBurnInQualityChanged: burnInSourceEffect.restartBlurSource();
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: kterminalScrollbar
|
||||||
|
onOpacityChanged: burnInSourceEffect.restartBlurSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderEffect {
|
||||||
|
id: burnInEffect
|
||||||
|
|
||||||
|
property variant txt_source: kterminalSource
|
||||||
|
property variant blurredSource: burnInSourceEffect
|
||||||
|
property real burnInCoefficient: burnInSourceEffect.burnInCoefficient
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
blending: false
|
||||||
|
|
||||||
|
fragmentShader:
|
||||||
|
"#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#endif\n" +
|
||||||
|
|
||||||
|
"uniform lowp float qt_Opacity;" +
|
||||||
|
"uniform lowp sampler2D txt_source;" +
|
||||||
|
|
||||||
|
"varying highp vec2 qt_TexCoord0;
|
||||||
|
uniform lowp sampler2D blurredSource;
|
||||||
|
uniform highp float burnInCoefficient;" +
|
||||||
|
|
||||||
|
"float max3(vec3 v) {
|
||||||
|
return max (max (v.x, v.y), v.z);
|
||||||
|
}" +
|
||||||
|
|
||||||
|
"void main() {" +
|
||||||
|
"vec2 coords = qt_TexCoord0;" +
|
||||||
|
"vec3 origColor = texture2D(txt_source, coords).rgb;" +
|
||||||
|
"vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(burnInCoefficient);" +
|
||||||
|
"vec3 color = min(origColor + blur_color, max(origColor, blur_color));" +
|
||||||
|
|
||||||
|
"gl_FragColor = vec4(color, max3(color - origColor));" +
|
||||||
|
"}"
|
||||||
|
|
||||||
|
onStatusChanged: if (log) console.log(log) //Print warning messages
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,10 +10,9 @@ ShaderTerminal {
|
|||||||
id: mainShader
|
id: mainShader
|
||||||
opacity: appSettings.windowOpacity * 0.3 + 0.7
|
opacity: appSettings.windowOpacity * 0.3 + 0.7
|
||||||
|
|
||||||
blending: false
|
|
||||||
|
|
||||||
source: terminal.mainSource
|
source: terminal.mainSource
|
||||||
burnInEffect: terminal.burnInEffect
|
burnInEffect: terminal.burnInEffect
|
||||||
|
slowBurnInEffect: terminal.slowBurnInEffect
|
||||||
virtual_resolution: terminal.virtualResolution
|
virtual_resolution: terminal.virtualResolution
|
||||||
|
|
||||||
TimeManager{
|
TimeManager{
|
||||||
@@ -36,7 +35,7 @@ ShaderTerminal {
|
|||||||
height: parent.height * appSettings.bloomQuality
|
height: parent.height * appSettings.bloomQuality
|
||||||
|
|
||||||
sourceComponent: FastBlur{
|
sourceComponent: FastBlur{
|
||||||
radius: Utils.lint(16, 64, appSettings.bloomQuality * appSettings.windowScaling);
|
radius: Utils.lint(16, 64, appSettings.bloomQuality);
|
||||||
source: terminal.mainSource
|
source: terminal.mainSource
|
||||||
transparentBorder: true
|
transparentBorder: true
|
||||||
}
|
}
|
||||||
@@ -56,11 +55,11 @@ ShaderTerminal {
|
|||||||
|
|
||||||
bloomSource: bloomSourceLoader.item
|
bloomSource: bloomSourceLoader.item
|
||||||
|
|
||||||
NewTerminalFrame {
|
// NewTerminalFrame {
|
||||||
id: terminalFrame
|
// id: terminalFrame
|
||||||
anchors.fill: parent
|
// anchors.fill: parent
|
||||||
blending: true
|
// blending: true
|
||||||
}
|
// }
|
||||||
|
|
||||||
// This shader might be useful in the future. Since we used it only for a couple
|
// This shader might be useful in the future. Since we used it only for a couple
|
||||||
// of calculations is probably best to move those in the main shader. If in the future
|
// of calculations is probably best to move those in the main shader. If in the future
|
||||||
|
|||||||
@@ -137,13 +137,8 @@ ApplicationWindow{
|
|||||||
TerminalContainer{
|
TerminalContainer{
|
||||||
id: terminalContainer
|
id: terminalContainer
|
||||||
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
|
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
|
||||||
width: parent.width * appSettings.windowScaling
|
width: parent.width
|
||||||
height: (parent.height + Math.abs(y)) * appSettings.windowScaling
|
height: (parent.height + Math.abs(y))
|
||||||
|
|
||||||
transform: Scale {
|
|
||||||
xScale: 1 / appSettings.windowScaling
|
|
||||||
yScale: 1 / appSettings.windowScaling
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SettingsWindow{
|
SettingsWindow{
|
||||||
id: settingswindow
|
id: settingswindow
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
<file>fonts/1971-ibm-3278/3270Medium.ttf</file>
|
<file>fonts/1971-ibm-3278/3270Medium.ttf</file>
|
||||||
<file>Storage.qml</file>
|
<file>Storage.qml</file>
|
||||||
<file>CRTMainMenuBar.qml</file>
|
<file>CRTMainMenuBar.qml</file>
|
||||||
<file>SettingsPerformanceTab.qml</file>
|
<file>SettingsAdvancedTab.qml</file>
|
||||||
<file>TerminalContainer.qml</file>
|
<file>TerminalContainer.qml</file>
|
||||||
<file>images/crt256.png</file>
|
<file>images/crt256.png</file>
|
||||||
<file>utils.js</file>
|
<file>utils.js</file>
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
<file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file>
|
<file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file>
|
||||||
<file>fonts/modern-hermit/Hermit-medium.otf</file>
|
<file>fonts/modern-hermit/Hermit-medium.otf</file>
|
||||||
<file>fonts/modern-inconsolata/Inconsolata.otf</file>
|
<file>fonts/modern-inconsolata/Inconsolata.otf</file>
|
||||||
<file>SettingsScreenTab.qml</file>
|
|
||||||
<file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file>
|
<file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file>
|
||||||
<file>../icons/32x32/cool-retro-term.png</file>
|
<file>../icons/32x32/cool-retro-term.png</file>
|
||||||
<file>Components/SizedLabel.qml</file>
|
<file>Components/SizedLabel.qml</file>
|
||||||
@@ -44,5 +43,6 @@
|
|||||||
<file>BurnInEffect.qml</file>
|
<file>BurnInEffect.qml</file>
|
||||||
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
|
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
|
||||||
<file>NewTerminalFrame.qml</file>
|
<file>NewTerminalFrame.qml</file>
|
||||||
|
<file>SlowBurnIn.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -30,14 +30,17 @@ Print a help screen and exit.
|
|||||||
\fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR
|
\fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR
|
||||||
Run with the given profile.
|
Run with the given profile.
|
||||||
.TP
|
.TP
|
||||||
\fB\-\-workdir\fR \fIDIR\fR
|
\fB\-T\fR \fITITLE\fR
|
||||||
Start with \fIDIR\fR as the working directory.
|
Use \fITITLE\fR as the window title.
|
||||||
.TP
|
.TP
|
||||||
\fB\-\-verbose\fR
|
\fB\-\-verbose\fR
|
||||||
Print additional information such as profiles and settings.
|
Print additional information such as profiles and settings.
|
||||||
.TP
|
.TP
|
||||||
\fB\-v\fR, \fB\-\-version\fR
|
\fB\-v\fR, \fB\-\-version\fR
|
||||||
Print the version number and exit.
|
Print the version number and exit.
|
||||||
|
.TP
|
||||||
|
\fB\-\-workdir\fR \fIDIR\fR
|
||||||
|
Start with \fIDIR\fR as the working directory.
|
||||||
.SH LICENCE
|
.SH LICENCE
|
||||||
This program is available under the terms of the GNU General Public License,
|
This program is available under the terms of the GNU General Public License,
|
||||||
version 3 or any later version, as published by the Free Software Foundation.
|
version 3 or any later version, as published by the Free Software Foundation.
|
||||||
|
|||||||
Submodule qmltermwidget updated: 48274c7566...59f967d5e1
@@ -1,39 +1,53 @@
|
|||||||
name: cool-retro-term # check to see if it's available
|
name: cool-retro-term # check to see if it's available
|
||||||
version: '1.1.0' # this is freakin' awesome
|
version: '1.1.1' # this is freakin' awesome
|
||||||
summary: cool-retro-term is a terminal emulator. # 79 char long summary
|
summary: cool-retro-term is a cool and retro terminal emulator. # 79 char long summary
|
||||||
description: |
|
description: |
|
||||||
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. It has been designed to be eye-candy, customizable, and reasonably lightweight.
|
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. It has been designed to be eye-candy, customizable, and reasonably lightweight.
|
||||||
grade: stable # must be 'stable' to release into candidate/stable channels
|
grade: stable # must be 'stable' to release into candidate/stable channels
|
||||||
confinement: strict # use 'strict' once you have the right plugs
|
confinement: classic # use 'strict' once you have the right plugs
|
||||||
|
|
||||||
|
base: core18
|
||||||
|
|
||||||
apps:
|
apps:
|
||||||
cool-retro-term:
|
cool-retro-term:
|
||||||
command: desktop-launch $SNAP/usr/bin/cool-retro-term
|
command: bin/desktop-launch $SNAP/usr/bin/cool-retro-term
|
||||||
desktop: usr/share/applications/cool-retro-term.desktop
|
desktop: usr/share/applications/cool-retro-term.desktop
|
||||||
plugs:
|
environment:
|
||||||
- unity7
|
QML2_IMPORT_PATH: $SNAP/usr/lib/x86_64-linux-gnu/qt5/qml
|
||||||
- x11
|
|
||||||
- desktop
|
|
||||||
- home
|
|
||||||
- network
|
|
||||||
- network-bind
|
|
||||||
- network-manager
|
|
||||||
- password-manager-service
|
|
||||||
- locale-control
|
|
||||||
- gsettings
|
|
||||||
- shutdown
|
|
||||||
- firewall-control
|
|
||||||
- process-control
|
|
||||||
- system-observe
|
|
||||||
|
|
||||||
parts:
|
parts:
|
||||||
|
desktop-qt5:
|
||||||
|
source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
|
||||||
|
source-subdir: qt
|
||||||
|
plugin: make
|
||||||
|
make-parameters: ["FLAVOR=qt5"]
|
||||||
|
build-packages:
|
||||||
|
- build-essential
|
||||||
|
- qtbase5-dev
|
||||||
|
- dpkg-dev
|
||||||
|
stage-packages:
|
||||||
|
- libxkbcommon0
|
||||||
|
- ttf-ubuntu-font-family
|
||||||
|
- dmz-cursor-theme
|
||||||
|
- light-themes
|
||||||
|
- adwaita-icon-theme
|
||||||
|
- gnome-themes-standard
|
||||||
|
- shared-mime-info
|
||||||
|
- libqt5gui5
|
||||||
|
- libgdk-pixbuf2.0-0
|
||||||
|
- libqt5svg5 # for loading icon themes which are svg
|
||||||
|
- try: [appmenu-qt5] # not available on core18
|
||||||
|
- locales-all
|
||||||
|
- xdg-user-dirs
|
||||||
|
- fcitx-frontend-qt5
|
||||||
|
|
||||||
my-part:
|
my-part:
|
||||||
source: https://github.com/Swordfish90/cool-retro-term
|
source: https://github.com/Swordfish90/cool-retro-term
|
||||||
source-type: git
|
source-type: git
|
||||||
plugin: qmake # See 'snapcraft plugins'
|
plugin: qmake # See 'snapcraft plugins'
|
||||||
qt-version: qt5
|
qt-version: qt5
|
||||||
after: [desktop-qt5]
|
after: [desktop-qt5]
|
||||||
|
|
||||||
build-packages:
|
build-packages:
|
||||||
- build-essential
|
- build-essential
|
||||||
- qmlscene
|
- qmlscene
|
||||||
@@ -44,11 +58,14 @@ parts:
|
|||||||
stage-packages:
|
stage-packages:
|
||||||
- qmlscene
|
- qmlscene
|
||||||
- qml-module-qtquick-controls
|
- qml-module-qtquick-controls
|
||||||
- qtdeclarative5-qtquick2-plugin
|
- qml-module-qtquick2
|
||||||
- libqt5qml-graphicaleffects
|
- qml-module-qtgraphicaleffects
|
||||||
- qml-module-qtquick-dialogs
|
- qml-module-qtquick-dialogs
|
||||||
- qtdeclarative5-localstorage-plugin
|
- qml-module-qtquick-localstorage
|
||||||
- qtdeclarative5-window-plugin
|
- qml-module-qtquick-window2
|
||||||
- libgl1-mesa-dev
|
- libgl1-mesa-dev
|
||||||
- qtdeclarative5-dev-tools
|
- qtdeclarative5-dev-tools
|
||||||
- qml-module-qtquick-extras
|
- qml-module-qtquick-extras
|
||||||
|
- qml-module-qt-labs-settings
|
||||||
|
- qml-module-qt-labs-folderlistmodel
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user