Compare commits

..

1 Commits

Author SHA1 Message Date
Filippo Scognamiglio
3d99b1d29c Move constants to a separate qml file. 2021-07-19 08:40:30 +02:00
27 changed files with 532 additions and 482 deletions

4
.github/FUNDING.yml vendored
View File

@ -1,4 +0,0 @@
# These are supported funding model platforms
patreon: swordfish90
custom: ['https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail.com&item_name=Support+CRT&currency_code=EUR&source=url']

View File

@ -1,98 +0,0 @@
name: "ci"
on:
push:
tags: "**"
workflow_dispatch:
defaults:
run:
shell: bash
jobs:
appimage:
runs-on: ubuntu-18.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
submodules: true
- name: Install dependencies
run: |
sudo add-apt-repository -y ppa:beineri/opt-qt-5.15.2-bionic
sudo apt-get update -qq
sudo apt-get install -y \
build-essential make wget libgl1-mesa-dev \
qt515declarative qt515graphicaleffects \
qt515quickcontrols qt515quickcontrols2
- name: Download QT appimage builder
run: |
wget -c -O linuxdeployqt.AppImage \
https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
chmod a+x linuxdeployqt.AppImage
- name: Build project
run: |
source /opt/qt*/bin/qt*-env.sh && \
qmake -v && \
qmake CONFIG+=release PREFIX=/usr && \
make -j$(nproc)
- name: Install to appdir
run: |
source /opt/qt*/bin/qt*-env.sh && \
make INSTALL_ROOT=appdir -j$(nproc) install
- name: Extract version number
run: |
# Extract version for linuxdeployqt to name the file. Use the tag as
# release name but remove prefix.
echo "VERSION=$(echo '${{ github.ref }}' | sed 's;.*/;;')" >> $GITHUB_ENV
- name: Build appimage directory
run: |
mkdir -p \
appdir/usr/bin \
appdir/usr/lib \
appdir/usr/share/applications \
appdir/usr/share/metainfo \
appdir/usr/share/icons/hicolor/128x128/apps
cp cool-retro-term appdir/usr/bin/
cp cool-retro-term.desktop appdir/usr/share/applications/
cp packaging/appdata/cool-retro-term.appdata.xml appdir/usr/share/metainfo/
cp app/icons/128x128/cool-retro-term.png appdir/usr/share/icons/hicolor/128x128/apps/
cp -r ./app/qml appdir/usr/
# Workaround for https://github.com/probonopd/linuxdeployqt/issues/78
cp -r ./qmltermwidget/QMLTermWidget appdir/usr/qml/
find appdir | sort
- name: Build appimage
run: |
source /opt/qt*/bin/qt*-env.sh && \
./linuxdeployqt.AppImage appdir/usr/share/applications/cool-retro-term.desktop \
-verbose=1 -appimage \
-qmldir=./app/qml/ \
-qmldir=./qmltermwidget/
env:
# Unset environment variables
QTDIR:
QT_PLUGIN_PATH:
LD_LIBRARY_PATH:
- name: Upload release
uses: softprops/action-gh-release@v1
with:
body: appimage release
files: ./**/Cool_Retro_Term-*-x86_64.AppImage
- name: Clean up
if: always()
run: |
find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
make clean
rm -rf appdir

3
.gitignore vendored
View File

@ -48,6 +48,3 @@ cool-retro-term
.DS_Store .DS_Store
*.app *.app
# IntelliJ
.idea

193
README.md
View File

@ -8,9 +8,9 @@
cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. 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. It has been designed to be eye-candy, customizable, and reasonably lightweight.
It uses the QML port of qtermwidget (Konsole): https://github.com/Swordfish90/qmltermwidget. It uses the QML port of qtermwidget (Konsole) developed by me: https://github.com/Swordfish90/qmltermwidget .
This terminal emulator works under Linux and macOS and requires Qt5. It's suggested that you stick to the latest LTS version. 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. Settings such as colors, fonts, and effects can be accessed via context menu.
@ -20,11 +20,192 @@ Settings such as colors, fonts, and effects can be accessed via context menu.
![Image](<https://i.imgur.com/GYRDPzJ.jpg>) ![Image](<https://i.imgur.com/GYRDPzJ.jpg>)
## Install ## Install
Walk the easy way and install cool-retro-term using one of these convenient packages:
If you want to get a hold of the latest version, just go to the Releases page and grab the latest AppImage (Linux) or dmg (macOS). Just grab the latest AppImage from the release page and make it executable and run it:
Alternatively, most distributions such as Ubuntu, Fedora or Arch already package cool-retro-term in their official repositories. 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
## Building **Fedora** has the `cool-retro-term` in the official repositories. All you have to do is `sudo dnf install cool-retro-term`.
Check out the wiki and follow the instructions on how to build it on [Linux](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(Linux)) and [macOS](https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(macOS)). 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:
pacman -S cool-retro-term
to install precompiled from community repository.
Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb).
**Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term)
**Solus** users can install using `eopg`:
```
eopkg it cool-retro-term
```
**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
```
**FreeBSD** users can install cool-retro-term with `pkg`:
pkg install cool-retro-term
## Build instructions (FreeBSD)
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 cool-retro-term yourself, you know, the retro way.
## Dependencies
Make sure to install these first.
---
**Ubuntu 14.04**
sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qtdeclarative5-controls-plugin qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qtdeclarative5-dialogs-plugin qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin
---
**Ubuntu 16.10**
sudo apt-get install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qtdeclarative5-qtquick2-plugin libqt5qml-graphicaleffects qml-module-qtquick-dialogs qtdeclarative5-localstorage-plugin qtdeclarative5-window-plugin
---
**Ubuntu 17.04**
sudo apt install build-essential libqt5qml-graphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin
---
**Ubuntu 17.10**
sudo apt-get install build-essential qml-module-qtgraphicaleffects qml-module-qt-labs-folderlistmodel qml-module-qt-labs-settings qml-module-qtquick-controls qml-module-qtquick-dialogs qmlscene qt5-default qt5-qmake qtdeclarative5-dev qtdeclarative5-localstorage-plugin qtdeclarative5-qtquick2-plugin qtdeclarative5-window-plugin
---
**snapcraft (most of distros)**
sudo snap install cool-retro-term --classic
---
**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
---
**Fedora**
This command should install the known fedora dependencies:
sudo yum -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config
or:
sudo dnf -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols redhat-rpm-config
---
**Arch Linux**
sudo pacman -S qt5-base qt5-declarative qt5-quickcontrols qt5-graphicaleffects
---
**openSUSE**
Add repository with latest Qt 5 (this is only needed on openSUSE 13.1, Factory already has it):
sudo zypper ar http://download.opensuse.org/repositories/KDE:/Qt5/openSUSE_13.1/ KDE:Qt5
Install dependencies:
sudo zypper install libqt5-qtbase-devel libqt5-qtdeclarative-devel libqt5-qtquickcontrols libqt5-qtgraphicaleffects
---
**Anyone else**
Install Qt directly from here http://qt-project.org/downloads . Once done export them in you path (replace "_/opt/Qt5.3.1/5.3/gcc_64/bin_" with your correct folder):
export PATH=/opt/Qt5.3.1/5.3/gcc_64/bin/:$PATH
---
### Compile
Once you installed all dependencies (Qt is installed and in your path) you need to compile and run the application:
```bash
# Get it from GitHub
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
# Build it
cd cool-retro-term
# Compile (Fedora and OpenSUSE user should use qmake-qt5 instead of qmake)
qmake && make
# Have fun!
./cool-retro-term
```
## Build instructions (macOS)
1. Install [Xcode](https://developer.apple.com/xcode/) and agree to the licence agreement
2. Enter the following commands into the terminal:
**Brew**
```sh
brew install qt5
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
export CPPFLAGS="-I/usr/local/opt/qt5/include"
export LDFLAGS="-L/usr/local/opt/qt5/lib"
export PATH=/usr/local/opt/qt5/bin:$PATH
cd cool-retro-term
qmake && make
mkdir cool-retro-term.app/Contents/PlugIns
cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
open cool-retro-term.app
```
**MacPorts**
```sh
sudo port install qt5
git clone --recursive https://github.com/Swordfish90/cool-retro-term.git
cd cool-retro-term
/opt/local/libexec/qt5/bin/qmake && make
mkdir cool-retro-term.app/Contents/PlugIns
cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns
open cool-retro-term.app
```
**Homebrew**
```sh
brew cask install cool-retro-term
```
## 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&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted).
You can also add "bounties" on your favourite issues. More information on the [Bountysource](https://www.bountysource.com/teams/crt/issues) page.

View File

@ -1,4 +1,4 @@
QT += qml quick widgets sql quickcontrols2 QT += qml quick widgets sql
TARGET = cool-retro-term TARGET = cool-retro-term
DESTDIR = $$OUT_PWD/../ DESTDIR = $$OUT_PWD/../
@ -16,7 +16,7 @@ macx:ICON = icons/crt.icns
RESOURCES += qml/resources.qrc RESOURCES += qml/resources.qrc
######################################### #########################################
## INSTALLS ## INTALLS
######################################### #########################################
target.path += /usr/bin/ target.path += /usr/bin/

View File

@ -6,13 +6,11 @@
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include <QIcon> #include <QIcon>
#include <QQuickStyle>
#include <QDebug> #include <QDebug>
#include <stdlib.h> #include <stdlib.h>
#include <QFontDatabase> #include <QFontDatabase>
#include <QLoggingCategory>
#include <fileio.h> #include <fileio.h>
#include <monospacefontmanager.h> #include <monospacefontmanager.h>
@ -35,9 +33,6 @@ 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);
// Disable Connections slot warnings
QLoggingCategory::setFilterRules("qt.qml.connections.warning=false");
#if defined (Q_OS_LINUX) #if defined (Q_OS_LINUX)
setenv("QSG_RENDER_LOOP", "threaded", 0); setenv("QSG_RENDER_LOOP", "threaded", 0);
#endif #endif
@ -49,29 +44,30 @@ int main(int argc, char *argv[])
if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) { if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) {
QTextStream cout(stdout, QIODevice::WriteOnly); QTextStream cout(stdout, QIODevice::WriteOnly);
cout << "Usage: " << argv[0] << " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]" << '\n'; 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" << '\n'; cout << " --default-settings Run cool-retro-term with the default settings" << endl;
cout << " --workdir <dir> Change working directory to 'dir'" << '\n'; 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." << '\n'; 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'." << '\n'; cout << " -T <title> Set window title to 'title'." << endl;
cout << " --fullscreen Run cool-retro-term in fullscreen." << '\n'; cout << " --fullscreen Run cool-retro-term in fullscreen." << endl;
cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << '\n'; cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << endl;
cout << " -h|--help Print this help." << '\n'; cout << " -h|--help Print this help." << endl;
cout << " --verbose Print additional information such as profiles and settings." << '\n'; cout << " --verbose Print additional information such as profiles and settings." << endl;
cout << " -v|--version Print the program name and version." << '\n';
return 0; return 0;
} }
QString appVersion("1.2.0"); QString appVersion("1.1.1");
if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) { if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) {
QTextStream cout(stdout, QIODevice::WriteOnly); QTextStream cout(stdout, QIODevice::WriteOnly);
cout << "cool-retro-term " << appVersion << '\n'; cout << "cool-retro-term " << appVersion << endl;
return 0; return 0;
} }
QApplication app(argc, argv); QApplication app(argc, argv);
app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true); // set application attributes
// Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293
// app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
FileIO fileIO; FileIO fileIO;

View File

@ -0,0 +1,39 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "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
QtObject {
readonly property string version: appVersion
readonly property int profileVersion: 2
readonly property real screenCurvatureSize: 0.4
readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50
readonly property real minBurnInFadeTime: 160
readonly property real maxBurnInFadeTime: 1600
readonly property int no_rasterization: 0
readonly property int scanline_rasterization: 1
readonly property int pixel_rasterization: 2
readonly property int subpixel_rasterization: 3
readonly property real baseFontScaling: 0.75
}

View File

@ -23,27 +23,15 @@ import QtQuick.Controls 2.0
import "utils.js" as Utils import "utils.js" as Utils
QtObject { QtObject {
readonly property string version: appVersion
readonly property int profileVersion: 2
// STATIC CONSTANTS //////////////////////////////////////////////////////// // APPLICATION SETTINGS ///////////////////////////////////////////////////////
readonly property real screenCurvatureSize: 0.4
readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50
readonly property real minBurnInFadeTime: 160
readonly property real maxBurnInFadeTime: 1600
property bool isMacOS: Qt.platform.os === "osx"
// GENERAL SETTINGS ///////////////////////////////////////////////////////
property int x: 100 property int x: 100
property int y: 100 property int y: 100
property int width: 1024 property int width: 1024
property int height: 768 property int height: 768
property bool fullscreen: false property bool fullscreen: false
property bool showMenubar: false property bool showMenubar: Qt.platform.os === "osx" ? true : false
property string wintitle: "cool-retro-term" property string wintitle: "cool-retro-term"
@ -54,9 +42,9 @@ QtObject {
property bool verbose: false property bool verbose: false
property real bloomQuality: 0.5 property real bloomQuality: 0.5
property real burnInQuality: 0.5
property bool blinkingCursor: false property real burnInQuality: 0.5
property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true
onWindowScalingChanged: handleFontChanged() onWindowScalingChanged: handleFontChanged()
@ -71,7 +59,6 @@ QtObject {
property string _backgroundColor: "#000000" property string _backgroundColor: "#000000"
property string _fontColor: "#ff8100" property string _fontColor: "#ff8100"
property string _frameColor: "#ffffff"
property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"),
Utils.strToColor(_fontColor), Utils.strToColor(_fontColor),
saturationColor * 0.5) saturationColor * 0.5)
@ -82,7 +69,6 @@ QtObject {
_backgroundColor), _backgroundColor),
Utils.strToColor(saturatedColor), Utils.strToColor(saturatedColor),
0.7 + (contrast * 0.3)) 0.7 + (contrast * 0.3))
property color frameColor: Utils.strToColor(_frameColor)
property real staticNoise: 0.12 property real staticNoise: 0.12
property real screenCurvature: 0.3 property real screenCurvature: 0.3
@ -92,7 +78,6 @@ QtObject {
property real chromaColor: 0.25 property real chromaColor: 0.25
property real saturationColor: 0.25 property real saturationColor: 0.25
property real frameGloss: 0
property real jitter: 0.2 property real jitter: 0.2
@ -109,17 +94,13 @@ QtObject {
property real totalMargin: frameMargin + margin property real totalMargin: frameMargin + margin
readonly property int no_rasterization: 0
readonly property int scanline_rasterization: 1
readonly property int pixel_rasterization: 2
readonly property int subpixel_rasterization: 3
property int rasterization: no_rasterization property int rasterization: no_rasterization
property bool blinkingCursor: false
// FONTS ////////////////////////////////////////////////////////////////// // FONTS //////////////////////////////////////////////////////////////////
readonly property real baseFontScaling: 0.75
property real fontScaling: 1.0 property real fontScaling: 1.0
property real totalFontScaling: baseFontScaling * fontScaling property real totalFontScaling: appConstants.baseFontScaling * fontScaling
property real fontWidth: 1.0 property real fontWidth: 1.0
@ -135,28 +116,28 @@ QtObject {
property Loader fontManager: Loader { property Loader fontManager: Loader {
states: [ states: [
State { State {
when: rasterization == no_rasterization when: rasterization == appConstants.no_rasterization
PropertyChanges { PropertyChanges {
target: fontManager target: fontManager
source: "Fonts.qml" source: "Fonts.qml"
} }
}, },
State { State {
when: rasterization == scanline_rasterization when: rasterization == appConstants.scanline_rasterization
PropertyChanges { PropertyChanges {
target: fontManager target: fontManager
source: "FontScanlines.qml" source: "FontScanlines.qml"
} }
}, },
State { State {
when: rasterization == pixel_rasterization when: rasterization == appConstants.pixel_rasterization
PropertyChanges { PropertyChanges {
target: fontManager target: fontManager
source: "FontPixels.qml" source: "FontPixels.qml"
} }
}, },
State { State {
when: rasterization == subpixel_rasterization when: rasterization == appConstants.subpixel_rasterization
PropertyChanges { PropertyChanges {
target: fontManager target: fontManager
source: "FontPixels.qml" source: "FontPixels.qml"
@ -182,12 +163,12 @@ QtObject {
} }
function incrementScaling() { function incrementScaling() {
fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling) fontScaling = Math.min(fontScaling + 0.05, appConstants.maximumFontScaling)
handleFontChanged() handleFontChanged()
} }
function decrementScaling() { function decrementScaling() {
fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling) fontScaling = Math.max(fontScaling - 0.05, appConstants.minimumFontScaling)
handleFontChanged() handleFontChanged()
} }
@ -245,7 +226,8 @@ QtObject {
"bloomQuality": bloomQuality, "bloomQuality": bloomQuality,
"burnInQuality": burnInQuality, "burnInQuality": burnInQuality,
"useCustomCommand": useCustomCommand, "useCustomCommand": useCustomCommand,
"customCommand": customCommand "customCommand": customCommand,
"useFastBurnIn": useFastBurnIn
} }
return stringify(settings) return stringify(settings)
} }
@ -254,13 +236,11 @@ QtObject {
var settings = { var settings = {
"backgroundColor": _backgroundColor, "backgroundColor": _backgroundColor,
"fontColor": _fontColor, "fontColor": _fontColor,
"frameColor": _frameColor,
"flickering": flickering, "flickering": flickering,
"horizontalSync": horizontalSync, "horizontalSync": horizontalSync,
"staticNoise": staticNoise, "staticNoise": staticNoise,
"chromaColor": chromaColor, "chromaColor": chromaColor,
"saturationColor": saturationColor, "saturationColor": saturationColor,
"frameGloss": frameGloss,
"screenCurvature": screenCurvature, "screenCurvature": screenCurvature,
"glowingLine": glowingLine, "glowingLine": glowingLine,
"burnIn": burnIn, "burnIn": burnIn,
@ -342,6 +322,9 @@ QtObject {
!== undefined ? settings.useCustomCommand : useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
customCommand = settings.customCommand customCommand = settings.customCommand
!== undefined ? settings.customCommand : customCommand !== undefined ? settings.customCommand : customCommand
useFastBurnIn = settings.useFastBurnIn
!== undefined ? settings.useFastBurnIn : useFastBurnIn
} }
function loadProfileString(profileString) { function loadProfileString(profileString) {
@ -350,7 +333,6 @@ QtObject {
_backgroundColor = settings.backgroundColor _backgroundColor = settings.backgroundColor
!== undefined ? settings.backgroundColor : _backgroundColor !== undefined ? settings.backgroundColor : _backgroundColor
_fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor _fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor
_frameColor = settings.frameColor !== undefined ? settings.frameColor : _frameColor
horizontalSync = settings.horizontalSync horizontalSync = settings.horizontalSync
!== undefined ? settings.horizontalSync : horizontalSync !== undefined ? settings.horizontalSync : horizontalSync
@ -359,7 +341,6 @@ QtObject {
chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor
saturationColor = settings.saturationColor saturationColor = settings.saturationColor
!== undefined ? settings.saturationColor : saturationColor !== undefined ? settings.saturationColor : saturationColor
frameGloss = settings.frameGloss !== undefined ? settings.frameGloss : frameGloss
screenCurvature = settings.screenCurvature screenCurvature = settings.screenCurvature
!== undefined ? settings.screenCurvature : screenCurvature !== undefined ? settings.screenCurvature : screenCurvature
glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine
@ -466,8 +447,6 @@ QtObject {
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.2483, "saturationColor": 0.2483,
"screenCurvature": 0.3, "screenCurvature": 0.3,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.1198, "staticNoise": 0.1198,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -497,8 +476,6 @@ QtObject {
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.0, "saturationColor": 0.0,
"screenCurvature": 0.3, "screenCurvature": 0.3,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.1198, "staticNoise": 0.1198,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -528,8 +505,6 @@ QtObject {
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.5, "saturationColor": 0.5,
"screenCurvature": 0.3, "screenCurvature": 0.3,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.15, "staticNoise": 0.15,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -559,8 +534,6 @@ QtObject {
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0, "screenCurvature": 0,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.15, "staticNoise": 0.15,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -590,8 +563,6 @@ QtObject {
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.5, "screenCurvature": 0.5,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.099, "staticNoise": 0.099,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -621,8 +592,6 @@ QtObject {
"rbgShift": 0.2969, "rbgShift": 0.2969,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.5, "screenCurvature": 0.5,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.2969, "staticNoise": 0.2969,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -632,7 +601,7 @@ QtObject {
builtin: true builtin: true
} }
ListElement { ListElement {
text: "IBM DOS" text: "IBM Dos"
obj_string: '{ obj_string: '{
"ambientLight": 0.151, "ambientLight": 0.151,
"backgroundColor": "#000000", "backgroundColor": "#000000",
@ -652,8 +621,6 @@ QtObject {
"rbgShift": 0.3524, "rbgShift": 0.3524,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.4, "screenCurvature": 0.4,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.0503, "staticNoise": 0.0503,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -683,8 +650,6 @@ QtObject {
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.2, "screenCurvature": 0.2,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0, "staticNoise": 0,
"windowOpacity": 1, "windowOpacity": 1,
"margin": 0.5, "margin": 0.5,
@ -714,8 +679,6 @@ QtObject {
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.4983, "saturationColor": 0.4983,
"screenCurvature": 0, "screenCurvature": 0,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.0955, "staticNoise": 0.0955,
"windowOpacity": 0.7, "windowOpacity": 0.7,
"margin": 0.1, "margin": 0.1,

View File

@ -29,29 +29,26 @@ Loader {
property real lastUpdate: 0 property real lastUpdate: 0
property real prevLastUpdate: 0 property real prevLastUpdate: 0
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: appSettings.minBurnInFadeTime property real _minBurnInFadeTime: appConstants.minBurnInFadeTime
property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime property real _maxBurnInFadeTime: appConstants.maxBurnInFadeTime
active: appSettings.burnIn !== 0 active: appSettings.useFastBurnIn && appSettings.burnIn !== 0
anchors.fill: parent anchors.fill: parent
function completelyUpdate() { function completelyUpdate() {
let newTime = timeManager.time prevLastUpdate = lastUpdate;
if (newTime > lastUpdate) { lastUpdate = timeManager.time;
prevLastUpdate = lastUpdate item.source.scheduleUpdate();
lastUpdate = newTime
}
item.source.scheduleUpdate()
} }
function restartBlurSource(){ function restartBlurSource(){
prevLastUpdate = timeManager.time prevLastUpdate = timeManager.time;
lastUpdate = prevLastUpdate lastUpdate = prevLastUpdate;
completelyUpdate() completelyUpdate();
} }
sourceComponent: Item { sourceComponent: Item {
@ -75,30 +72,20 @@ Loader {
Connections { Connections {
target: kterminal target: kterminal
onImagePainted: completelyUpdate()
onImagePainted: {
completelyUpdate()
}
} }
// Restart blurred source settings change. // Restart blurred source settings change.
Connections{ Connections{
target: appSettings target: appSettings
onBurnInChanged: burnInEffect.restartBlurSource();
onBurnInChanged: { onTerminalFontChanged: burnInEffect.restartBlurSource();
burnInEffect.restartBlurSource() onRasterizationChanged: burnInEffect.restartBlurSource();
onBurnInQualityChanged: burnInEffect.restartBlurSource();
} }
onTerminalFontChanged: { Connections {
burnInEffect.restartBlurSource() target: kterminalScrollbar
} onOpacityChanged: completelyUpdate()
onRasterizationChanged: {
burnInEffect.restartBlurSource()
}
onBurnInQualityChanged: {
burnInEffect.restartBlurSource()
}
} }
} }

View File

@ -34,8 +34,10 @@ Item {
visible: false visible: false
//This is a workaround to a Qt 5.2 bug. //This is a workaround to a Qt 5.2 bug.
onColorChanged: if (!appSettings.isMacOS) colorSelected(color) onColorChanged: if (Qt.platform.os !== "osx")
onAccepted: if (appSettings.isMacOS) colorSelected(color) colorSelected(color)
onAccepted: if (Qt.platform.os === "osx")
colorSelected(color)
} }
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent

View File

@ -213,7 +213,7 @@ QtObject {
ListElement { ListElement {
name: "IBM_3278" name: "IBM_3278"
text: "HD: IBM 3278 (1971)" text: "HD: IBM 3278 (1971)"
source: "fonts/1971-ibm-3278/3270-Regular.ttf" source: "fonts/1971-ibm-3278/3270Medium.ttf"
lineSpacing: 0.2 lineSpacing: 0.2
pixelSize: 32 pixelSize: 32
fontWidth: 1.0 fontWidth: 1.0

View File

@ -34,6 +34,7 @@ Item{
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
@ -46,59 +47,26 @@ Item{
// Manage copy and paste // Manage copy and paste
Connections{ Connections{
target: copyAction target: copyAction
onTriggered: kterminal.copyClipboard();
onTriggered: {
kterminal.copyClipboard()
}
} }
Connections{ Connections{
target: pasteAction target: pasteAction
onTriggered: kterminal.pasteClipboard()
onTriggered: {
kterminal.pasteClipboard()
}
}
Connections {
target: pasteActionAlt
onTriggered: {
kterminal.pasteSelection()
}
} }
//When settings are updated sources need to be redrawn. //When settings are updated sources need to be redrawn.
Connections{ Connections{
target: appSettings target: appSettings
onFontScalingChanged: terminalContainer.updateSources();
onFontScalingChanged: { onFontWidthChanged: terminalContainer.updateSources();
terminalContainer.updateSources()
}
onFontWidthChanged: {
terminalContainer.updateSources()
}
} }
Connections{ Connections{
target: terminalContainer target: terminalContainer
onWidthChanged: terminalContainer.updateSources();
onWidthChanged: { onHeightChanged: terminalContainer.updateSources();
terminalContainer.updateSources()
} }
onHeightChanged: {
terminalContainer.updateSources()
}
}
Connections {
target: terminalWindow
onActiveChanged: {
kterminal.forceActiveFocus()
}
}
function updateSources() { function updateSources() {
kterminal.update() kterminal.update();
} }
QMLTermWidget { QMLTermWidget {
@ -175,7 +143,7 @@ Item{
var args = Utils.tokenizeCommandLine(appSettings.customCommand); var args = Utils.tokenizeCommandLine(appSettings.customCommand);
ksession.setShellProgram(args[0]); ksession.setShellProgram(args[0]);
ksession.setArgs(args.slice(1)); ksession.setArgs(args.slice(1));
} else if (!defaultCmd && appSettings.isMacOS) { } else if (!defaultCmd && Qt.platform.os === "osx") {
// OSX Requires the following default parameters for auto login. // OSX Requires the following default parameters for auto login.
ksession.setArgs(["-i", "-l"]); ksession.setArgs(["-i", "-l"]);
} }
@ -205,7 +173,7 @@ Item{
Loader { Loader {
id: menuLoader id: menuLoader
sourceComponent: (appSettings.isMacOS || appSettings.showMenubar ? shortContextMenu : fullContextMenu) sourceComponent: (Qt.platform.os === "osx" || appSettings.showMenubar ? shortContextMenu : fullContextMenu)
} }
property alias contextmenu: menuLoader.item property alias contextmenu: menuLoader.item
@ -249,7 +217,7 @@ Item{
y = (y - margin) / 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 * appConstants.screenCurvatureSize;
return Qt.point((x - cc.width * (1+distortion) * distortion) * (kterminal.totalWidth), return Qt.point((x - cc.width * (1+distortion) * distortion) * (kterminal.totalWidth),
(y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight)) (y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight))
@ -282,5 +250,9 @@ Item{
BurnInEffect { BurnInEffect {
id: burnInEffect id: burnInEffect
} }
SlowBurnIn {
id: slowBurnInEffect
}
} }
} }

View File

@ -89,7 +89,7 @@ ColumnLayout {
} }
} }
SizedLabel { Label {
text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max") text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")
} }
Label { Label {
@ -109,7 +109,7 @@ ColumnLayout {
enabled = true enabled = true
} }
} }
SizedLabel { Label {
text: Math.round(txtslider.value * 100) + "%" text: Math.round(txtslider.value * 100) + "%"
} }
@ -130,7 +130,7 @@ ColumnLayout {
enabled = true enabled = true
} }
} }
SizedLabel { Label {
text: Math.round(bloomSlider.value * 100) + "%" text: Math.round(bloomSlider.value * 100) + "%"
} }
@ -151,9 +151,15 @@ ColumnLayout {
enabled = true enabled = true
} }
} }
SizedLabel { Label {
text: Math.round(burnInSlider.value * 100) + "%" 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
}
} }
} }
} }

View File

@ -33,7 +33,6 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
model: appSettings.profilesList model: appSettings.profilesList
clip: true
delegate: Rectangle { delegate: Rectangle {
width: label.width width: label.width
height: label.height height: label.height
@ -114,7 +113,7 @@ ColumnLayout {
var version = profileObject.version var version = profileObject.version
!== undefined ? profileObject.version : 1 !== undefined ? profileObject.version : 1
if (version !== appSettings.profileVersion) if (version !== appConstants.profileVersion)
throw "This profile is not supported on this version of CRT." throw "This profile is not supported on this version of CRT."
delete profileObject.name delete profileObject.name
@ -161,7 +160,7 @@ ColumnLayout {
var profileSettings = JSON.parse( var profileSettings = JSON.parse(
profileObject.obj_string) profileObject.obj_string)
profileSettings["name"] = profileObject.text profileSettings["name"] = profileObject.text
profileSettings["version"] = appSettings.profileVersion profileSettings["version"] = appConstants.profileVersion
var result = fileIO.write(url, JSON.stringify( var result = fileIO.write(url, JSON.stringify(
profileSettings, profileSettings,
@ -216,12 +215,10 @@ ColumnLayout {
} }
Label { Label {
text: qsTr("Opacity") text: qsTr("Opacity")
visible: !appSettings.isMacOS
} }
SimpleSlider { SimpleSlider {
onValueChanged: appSettings.windowOpacity = value onValueChanged: appSettings.windowOpacity = value
value: appSettings.windowOpacity value: appSettings.windowOpacity
visible: !appSettings.isMacOS
} }
} }
} }

View File

@ -68,10 +68,7 @@ ColumnLayout {
} }
Connections { Connections {
target: appSettings target: appSettings
onTerminalFontChanged: fontChanger.updateIndex()
onTerminalFontChanged: {
fontChanger.updateIndex()
}
} }
Component.onCompleted: updateIndex() Component.onCompleted: updateIndex()
} }
@ -86,8 +83,8 @@ ColumnLayout {
onValueChanged: appSettings.fontScaling = value onValueChanged: appSettings.fontScaling = value
value: appSettings.fontScaling value: appSettings.fontScaling
stepSize: 0.05 stepSize: 0.05
from: appSettings.minimumFontScaling from: appConstants.minimumFontScaling
to: appSettings.maximumFontScaling to: appConstants.maximumFontScaling
} }
SizedLabel { SizedLabel {
text: Math.round(fontScalingChanger.value * 100) + "%" text: Math.round(fontScalingChanger.value * 100) + "%"
@ -149,11 +146,6 @@ ColumnLayout {
value: appSettings.saturationColor value: appSettings.saturationColor
enabled: appSettings.chromaColor !== 0 enabled: appSettings.chromaColor !== 0
} }
CheckableSlider {
name: qsTr("Frame Gloss")
onNewValue: appSettings.frameGloss = newValue
value: appSettings.frameGloss
}
} }
RowLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
@ -171,13 +163,6 @@ ColumnLayout {
onColorSelected: appSettings._backgroundColor = color onColorSelected: appSettings._backgroundColor = color
color: appSettings._backgroundColor color: appSettings._backgroundColor
} }
ColorButton {
name: qsTr("Frame")
height: 50
Layout.fillWidth: true
onColorSelected: appSettings._frameColor = color
color: appSettings._frameColor
}
} }
} }
} }

View File

@ -27,17 +27,14 @@ import QtQuick.Dialogs 1.1
Window { Window {
id: settings_window id: settings_window
title: qsTr("Settings") title: qsTr("Settings")
width: 640 width: 800
height: 640 height: 600
property int tabmargins: 15 property int tabmargins: 15
Item {
anchors { fill: parent; margins: tabmargins }
TabBar { TabBar {
id: bar id: bar
anchors { left: parent.left; right: parent.right; top: parent.top; } width: parent.width
TabButton { TabButton {
text: qsTr("General") text: qsTr("General")
} }
@ -52,17 +49,15 @@ Window {
} }
} }
Frame { StackLayout {
anchors { anchors {
top: bar.bottom top: bar.bottom
left: parent.left left: parent.left
right: parent.right right: parent.right
bottom: parent.bottom bottom: parent.bottom
margins: tabmargins
} }
StackLayout {
anchors.fill: parent
currentIndex: bar.currentIndex currentIndex: bar.currentIndex
SettingsGeneralTab { } SettingsGeneralTab { }
@ -71,5 +66,3 @@ Window {
SettingsAdvancedTab { } SettingsAdvancedTab { }
} }
} }
}
}

View File

@ -2,12 +2,12 @@ import QtQuick 2.0
QtObject { QtObject {
property string rasterizationShader: property string rasterizationShader:
(appSettings.rasterization === appSettings.no_rasterization ? " (appSettings.rasterization === appConstants.no_rasterization ? "
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) { lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
return texel; return texel;
}" : "") + }" : "") +
(appSettings.rasterization === appSettings.scanline_rasterization ? " (appSettings.rasterization === appConstants.scanline_rasterization ? "
#define INTENSITY 0.30 #define INTENSITY 0.30
#define BRIGHTBOOST 0.30 #define BRIGHTBOOST 0.30
@ -22,7 +22,7 @@ QtObject {
return mix(texel, rasterizationColor, intensity); return mix(texel, rasterizationColor, intensity);
}" : "") + }" : "") +
(appSettings.rasterization === appSettings.pixel_rasterization ? " (appSettings.rasterization === appConstants.pixel_rasterization ? "
#define INTENSITY 0.30 #define INTENSITY 0.30
#define BRIGHTBOOST 0.30 #define BRIGHTBOOST 0.30
@ -40,7 +40,7 @@ QtObject {
return mix(texel, rasterizationColor, intensity); return mix(texel, rasterizationColor, intensity);
}" : "") + }" : "") +
(appSettings.rasterization === appSettings.subpixel_rasterization ? " (appSettings.rasterization === appConstants.subpixel_rasterization ? "
#define INTENSITY 0.30 #define INTENSITY 0.30
#define BRIGHTBOOST 0.30 #define BRIGHTBOOST 0.30
#define SUBPIXELS 3.0 #define SUBPIXELS 3.0

View File

@ -24,6 +24,7 @@ import QtGraphicalEffects 1.0
import "utils.js" as Utils import "utils.js" as Utils
Item { Item {
property SlowBurnIn slowBurnInEffect
property ShaderEffectSource source property ShaderEffectSource source
property BurnInEffect burnInEffect property BurnInEffect burnInEffect
property ShaderEffectSource bloomSource property ShaderEffectSource bloomSource
@ -31,14 +32,12 @@ Item {
property color fontColor: appSettings.fontColor property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor property color backgroundColor: appSettings.backgroundColor
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real screenCurvature: appSettings.screenCurvature * appConstants.screenCurvatureSize
property real chromaColor: appSettings.chromaColor property real chromaColor: appSettings.chromaColor
property real ambientLight: appSettings.ambientLight * 0.2 property real ambientLight: appSettings.ambientLight * 0.2
property real frameGloss: appSettings.frameGloss
property size virtualResolution property size virtualResolution
property size screenResolution property size screenResolution
@ -61,7 +60,6 @@ Item {
property real screenCurvature: parent.screenCurvature property real screenCurvature: parent.screenCurvature
property real chromaColor: parent.chromaColor property real chromaColor: parent.chromaColor
property real ambientLight: parent.ambientLight property real ambientLight: parent.ambientLight
property real frameGloss: parent.frameGloss
property real flickering: appSettings.flickering property real flickering: appSettings.flickering
property real horizontalSync: appSettings.horizontalSync property real horizontalSync: appSettings.horizontalSync
@ -69,10 +67,14 @@ Item {
property real glowingLine: appSettings.glowingLine * 0.2 property real glowingLine: appSettings.glowingLine * 0.2
// Fast burnin properties // Fast burnin properties
property real burnIn: appSettings.burnIn property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0
property real burnInLastUpdate: burnInEffect.lastUpdate property real burnInLastUpdate: burnInEffect.lastUpdate
property real burnInTime: burnInEffect.burnInFadeTime property real burnInTime: burnInEffect.burnInFadeTime
// Slow burnin properties
property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn
property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source
property real jitter: appSettings.jitter property real jitter: appSettings.jitter
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) 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 shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
@ -175,7 +177,6 @@ Item {
uniform highp vec4 fontColor; uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor; uniform highp vec4 backgroundColor;
uniform lowp float shadowLength; uniform lowp float shadowLength;
uniform lowp float frameGloss;
uniform highp vec2 virtualResolution; uniform highp vec2 virtualResolution;
uniform lowp float rasterizationIntensity;\n" + uniform lowp float rasterizationIntensity;\n" +
@ -184,6 +185,8 @@ Item {
uniform sampler2D burnInSource; uniform sampler2D burnInSource;
uniform highp float burnInLastUpdate; uniform highp float burnInLastUpdate;
uniform highp float burnInTime;" : "") + uniform highp float burnInTime;" : "") +
(slowBurnIn !== 0 ? "
uniform sampler2D slowBurnInSource;" : "") +
(staticNoise !== 0 ? " (staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") + uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? " (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
@ -247,17 +250,6 @@ Item {
" return outColor; " return outColor;
}" + }" +
//pseudo-random vector
//https://stackoverflow.com/a/10625698
"float random( vec2 p )
{
vec2 K1 = vec2(
23.14069263277926, // e^pi (Gelfond's constant)
2.665144142690225 // 2^sqrt(2) (Gelfond-Schneider constant)
);
return fract( cos( dot(p,K1) ) * 12345.6789 );
}" +
"void main() {" + "void main() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" + "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
"float distance = length(cc);" + "float distance = length(cc);" +
@ -296,11 +288,7 @@ Item {
: "") + : "") +
(jitter !== 0 || staticNoise !== 0 ? (jitter !== 0 || staticNoise !== 0 ?
"vec4 noiseTexel = texture2D( "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
noiseSource, scaleNoiseSize * coords
+ vec2(0.0, random(vec2(fract(time / 237.0), 822.9582)))
+ vec2(fract(time / 31.0), fract(time / 177.0))
);"
: "") + : "") +
(jitter !== 0 ? " (jitter !== 0 ? "
@ -326,6 +314,11 @@ Item {
txt_color = max(txt_color, convertWithChroma(burnInColor));" txt_color = max(txt_color, convertWithChroma(burnInColor));"
: "") + : "") +
(slowBurnIn !== 0 ? "
vec4 txt_blur = texture2D(slowBurnInSource, staticCoords);
txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a));
" : "") +
"txt_color += fontColor.rgb * vec3(color);" + "txt_color += fontColor.rgb * vec3(color);" +
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" + "txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
@ -340,7 +333,7 @@ Item {
(displayTerminalFrame ? (displayTerminalFrame ?
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0); "vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
finalColor = mix(finalColor, frameColor.rgb + (finalColor*frameGloss), frameColor.a);" finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
: "") + : "") +
"gl_FragColor = vec4(finalColor, qt_Opacity);" + "gl_FragColor = vec4(finalColor, qt_Opacity);" +

140
app/qml/SlowBurnIn.qml Normal file
View File

@ -0,0 +1,140 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "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.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: appConstants.minBurnInFadeTime
property real maxBurnInFadeTime: appConstants.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
}
}
}
}

View File

@ -33,6 +33,7 @@ ShaderTerminal {
source: terminal.mainSource source: terminal.mainSource
burnInEffect: terminal.burnInEffect burnInEffect: terminal.burnInEffect
slowBurnInEffect: terminal.slowBurnInEffect
virtualResolution: terminal.virtualResolution virtualResolution: terminal.virtualResolution
screenResolution: Qt.size( screenResolution: Qt.size(
terminalWindow.width * devicePixelRatio * appSettings.windowScaling, terminalWindow.width * devicePixelRatio * appSettings.windowScaling,

View File

@ -22,14 +22,14 @@ import QtQuick 2.0
import "utils.js" as Utils import "utils.js" as Utils
ShaderEffect { ShaderEffect {
property color _frameColor: appSettings.frameColor property color _staticFrameColor: "#fff"
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)
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight) property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
property color frameColor: Utils.mix(_frameColor, _lightColor, _ambientLight) property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real screenCurvature: appSettings.screenCurvature * appConstants.screenCurvatureSize
// Coefficient of the log curve used to approximate shadowing // Coefficient of the log curve used to approximate shadowing
property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight) property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
@ -87,7 +87,7 @@ ShaderEffect {
float alpha = 0.0; float alpha = 0.0;
float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0)))); float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0))));
frameShadow = clamp(sqrt(frameShadow), 0.0, 1.0); frameShadow = max(sqrt(frameShadow), 0.0);
color *= frameShadow; color *= frameShadow;
alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords)); alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords));
alpha = clamp(alpha, 0.0, 1.0); alpha = clamp(alpha, 0.0, 1.0);

Binary file not shown.

View File

@ -53,30 +53,20 @@ ApplicationWindow {
property bool fullscreen: appSettings.fullscreen property bool fullscreen: appSettings.fullscreen
onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed) onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
menuBar: qtquickMenuLoader.item menuBar: WindowMenu {
id: mainMenu
Loader { visible: (Qt.platform.os === "osx" || appSettings.showMenubar)
id: qtquickMenuLoader
active: !appSettings.isMacOS && appSettings.showMenubar
sourceComponent: WindowMenu { }
}
Loader {
id: globalMenuLoader
active: appSettings.isMacOS
sourceComponent: OSXMenu { }
} }
property string wintitle: appSettings.wintitle property string wintitle: appSettings.wintitle
color: "#00000000" color: "#00000000"
title: terminalContainer.title || qsTr(appSettings.wintitle) title: terminalContainer.title || qsTr(appSettings.wintitle)
Action { Action {
id: showMenubarAction id: showMenubarAction
text: qsTr("Show Menubar") text: qsTr("Show Menubar")
enabled: !appSettings.isMacOS enabled: Qt.platform.os !== "osx"
shortcut: "Ctrl+Shift+M" shortcut: "Ctrl+Shift+M"
checkable: true checkable: true
checked: appSettings.showMenubar checked: appSettings.showMenubar
@ -85,7 +75,7 @@ ApplicationWindow {
Action { Action {
id: fullscreenAction id: fullscreenAction
text: qsTr("Fullscreen") text: qsTr("Fullscreen")
enabled: !appSettings.isMacOS enabled: Qt.platform.os !== "osx"
shortcut: "Alt+F11" shortcut: "Alt+F11"
onTriggered: appSettings.fullscreen = !appSettings.fullscreen onTriggered: appSettings.fullscreen = !appSettings.fullscreen
checkable: true checkable: true
@ -116,11 +106,6 @@ ApplicationWindow {
text: qsTr("Paste") text: qsTr("Paste")
shortcut: "Ctrl+Shift+V" shortcut: "Ctrl+Shift+V"
} }
Action {
id: pasteActionAlt
text: qsTr("Paste selection")
shortcut: "Shift+Insert"
}
Action { Action {
id: zoomIn id: zoomIn
text: qsTr("Zoom In") text: qsTr("Zoom In")
@ -142,6 +127,9 @@ ApplicationWindow {
aboutDialog.raise() aboutDialog.raise()
} }
} }
ApplicationConstants {
id: appConstants
}
ApplicationSettings { ApplicationSettings {
id: appSettings id: appSettings
} }
@ -169,7 +157,7 @@ ApplicationWindow {
onClosing: { onClosing: {
// OSX Since we are currently supporting only one window // OSX Since we are currently supporting only one window
// quit the application when it is closed. // quit the application when it is closed.
if (appSettings.isMacOS) if (Qt.platform.os === "osx")
Qt.quit() Qt.quit()
} }
} }

View File

@ -1,89 +0,0 @@
/*******************************************************************************
* Copyright (c) 2013-2021 "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.3
import Qt.labs.platform 1.1
MenuBar {
id: defaultMenuBar
Menu {
title: qsTr("File")
MenuItem {
text: quitAction.text
onTriggered: quitAction.trigger()
}
}
Menu {
title: qsTr("Edit")
MenuItem {
text: copyAction.text
shortcut: "Meta+C"
onTriggered: copyAction.trigger()
}
MenuItem {
text: pasteAction.text
shortcut: "Meta+V"
onTriggered: pasteAction.trigger()
}
MenuSeparator {}
MenuItem {
text: showsettingsAction.text
shortcut: showsettingsAction.shortcut
onTriggered: showsettingsAction.trigger()
}
}
Menu {
title: qsTr("View")
MenuItem {
text: zoomIn.text
shortcut: "Meta++"
onTriggered: zoomIn.trigger()
}
MenuItem {
text: zoomOut.text
shortcut: "Meta+-"
onTriggered: zoomOut.trigger()
}
}
Menu {
id: profilesMenu
title: qsTr("Profiles")
Instantiator {
model: appSettings.profilesList
delegate: MenuItem {
text: model.text
onTriggered: {
appSettings.loadProfileString(obj_string)
appSettings.handleFontChanged()
}
}
onObjectAdded: profilesMenu.insertItem(index, object)
onObjectRemoved: profilesMenu.removeItem(object)
}
}
Menu {
title: qsTr("Help")
MenuItem {
text: showAboutAction.text
onTriggered: showAboutAction.trigger()
}
}
}

View File

@ -19,7 +19,7 @@
<file>SettingsTerminalTab.qml</file> <file>SettingsTerminalTab.qml</file>
<file>FontScanlines.qml</file> <file>FontScanlines.qml</file>
<file>fonts/1977-apple2/PrintChar21.ttf</file> <file>fonts/1977-apple2/PrintChar21.ttf</file>
<file>fonts/1971-ibm-3278/3270-Regular.ttf</file> <file>fonts/1971-ibm-3278/3270Medium.ttf</file>
<file>Storage.qml</file> <file>Storage.qml</file>
<file>SettingsAdvancedTab.qml</file> <file>SettingsAdvancedTab.qml</file>
<file>TerminalContainer.qml</file> <file>TerminalContainer.qml</file>
@ -41,10 +41,11 @@
<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>TerminalFrame.qml</file> <file>TerminalFrame.qml</file>
<file>SlowBurnIn.qml</file>
<file>menus/WindowMenu.qml</file> <file>menus/WindowMenu.qml</file>
<file>menus/FullContextMenu.qml</file> <file>menus/FullContextMenu.qml</file>
<file>menus/ShortContextMenu.qml</file> <file>menus/ShortContextMenu.qml</file>
<file>ShaderLibrary.qml</file> <file>ShaderLibrary.qml</file>
<file>menus/OSXMenu.qml</file> <file>ApplicationConstants.qml</file>
</qresource> </qresource>
</RCC> </RCC>

@ -1 +1 @@
Subproject commit 63228027e1f97c24abb907550b22ee91836929c5 Subproject commit 65e75bc6ea589b51c80e5ff3f4008de5644d7cc5