Compare commits

...

146 Commits

Author SHA1 Message Date
b98408dd32 Merge pull request 'Revert "Make the burn-in look more like the real thing."' (#862) from revert-burnin into master
Reviewed-on: #862
2024-10-15 08:30:14 +02:00
36054434a5 Revert "Make the burn-in look more like the real thing."
This reverts commit 27ca6b3f73fffce73931b3c6912f6a8aaddb50bc.
2024-10-15 08:29:09 +02:00
d9e41c27ef Merge pull request 'Add intellij to the gitignore' (#861) from update-gitignore into master
Reviewed-on: #861
2024-10-14 18:28:42 +02:00
8e8f8e4706 Add intellij to the gitignore 2024-10-14 18:28:23 +02:00
edb1a6f9e1 Merge pull request 'Shift+Insert -> paste selection' (#702) from agreppin/kb-shift-insert into master
Reviewed-on: #702
2024-10-11 11:08:02 +02:00
Alain Greppin
33723db314 Shift+Insert -> paste selection 2024-10-11 11:06:35 +02:00
4bc440e906 Merge pull request 'Document the --version option' (#706) from njhanley/document-version-option into master
Reviewed-on: #706
2024-10-11 11:03:07 +02:00
Nick Hanley
27b248d851 Document the --version option 2024-10-11 11:02:46 +02:00
e3c2e024bb Merge pull request 'Hide visible scrolling in background staticNoise' (#768) from aaronkollasch/random-static-noise into master
Reviewed-on: #768
2024-10-11 10:57:00 +02:00
Aaron Kollasch
b69610d7f3 Hide visible scrolling in static noise
Randomize vertical position of staticNoise texel and add to
existing scrolling of noise texture (both horizontal and vertical;
faster in vertical direction)
2024-10-11 10:56:16 +02:00
92a768d6f1 Merge pull request 'Terminal frame color customization and optional glossiness' (#760) from forestbeasts/bettergloss into master
Reviewed-on: #760
2024-10-11 10:53:47 +02:00
Frost
5ecd7d754d Add frame color/gloss to the default profiles 2024-10-11 10:52:41 +02:00
Frost
e3161f64f6 Add frame gloss setting
Lets you turn off the bright reflections.
2024-10-11 10:52:41 +02:00
Frost
5b0b091ab6 Add frame color setting
It's saved in the profile, and defaults to white.
2024-10-11 10:52:41 +02:00
Frost
4fdf28fb79 Add reflections to frame for better glossiness
I mean, it's how it works in the real world; it's added to the frame's base color, not occluded by the frame.
2024-10-11 10:52:41 +02:00
49213a1cf0 Merge pull request 'Fix visual bug on nvidia' (#859) from nvidia-patch into master
Reviewed-on: #859
2024-10-11 10:52:27 +02:00
e30db231f6 Fix visual bug on nvidia
https://gitlab.archlinux.org/archlinux/packaging/packages/cool-retro-term/-/blob/main/0001-nvidia-fix.patch?ref_type=heads
2024-10-11 10:52:01 +02:00
6609c4867f Merge pull request 'Use new line char instead of flushing the output' (#792) from mystuffs/master into master
Reviewed-on: #792
2024-10-11 10:49:37 +02:00
rilysh
84c5e8bca6 use newline char instead flushing 2024-10-11 10:49:14 +02:00
1a25749315 Merge pull request 'Fix typo in app.pro' (#801) from eltociear/patch-1 into master
Reviewed-on: #801
2024-10-11 10:48:48 +02:00
Ikko Eltociear Ashimine
3852f5995d Fix typo in app.pro
INTALLS -> INSTALLS
2024-10-11 10:48:22 +02:00
9093b7a16e Merge pull request 'typo: IBM Dos to IBM DOS' (#858) from rename-ibm-dos into master
Reviewed-on: #858
2024-10-11 10:47:57 +02:00
afead1c2c0 typo: IBM Dos to IBM DOS 2024-10-11 10:47:06 +02:00
1b2572f381 Merge pull request 'Make the burn-in look more like a real terminal.' (#845) from j3pic/more-accurate-burn-in into master
Reviewed-on: #845
2024-10-11 10:44:39 +02:00
Jeremy Phelps
27ca6b3f73 Make the burn-in look more like the real thing.
Exponential decay instead of linear.
2024-06-14 04:26:52 -04:00
Filippo Scognamiglio
f157648d1e
Merge pull request #711 from razziel89/feature/appimage-in-github-actions
Feature/appimage in GitHub actions
2022-03-31 07:18:37 +02:00
Torsten Sachse
d4baaeccfc Undo unneeded code changes 2022-03-29 08:22:59 +02:00
Torsten Sachse
d412b66c6e Add github action for building an appimage 2022-03-29 08:16:02 +02:00
Filippo Scognamiglio
74ae511f92 Bump version. Yeeee 2022-01-29 15:15:52 +01:00
Filippo Scognamiglio
a3fbafe4ae
Update README.md 2022-01-29 15:10:08 +01:00
Filippo Scognamiglio
8a45fbe9ed Tweak settings window and label sizes. 2022-01-16 09:40:20 +01:00
Filippo Scognamiglio
01c7929ee3 Increase size of settings window. 2022-01-12 21:11:58 +01:00
Filippo Scognamiglio
2261af17d7 Restore legacy Connection slots. Restore compilation on Qt 5.12. 2022-01-12 21:08:58 +01:00
Filippo Scognamiglio
41f34c3992 Disable Fusion style which has issues with dark themes. 2022-01-12 21:00:11 +01:00
Filippo Scognamiglio
36b1cd2dde Add github funding links. 2022-01-09 15:11:08 +01:00
Filippo Scognamiglio
80374b3ec6
Update README.md 2022-01-09 15:08:15 +01:00
Filippo Scognamiglio
bc00d1e45f Bump version. 2022-01-09 14:08:36 +01:00
Filippo Scognamiglio
6ddb507247
Merge pull request #694 from Swordfish90/osx-fixes
MacOS improvements
2022-01-09 10:56:30 +01:00
Filippo Scognamiglio
b0f3b8f3d0 Update QMLTermWidget submodule. 2022-01-09 10:53:35 +01:00
Filippo Scognamiglio
06e7191056 Disable Qt5 Connections warnings. 2022-01-09 10:47:02 +01:00
Filippo Scognamiglio
997131ba64 Tiny fixes to burn-in. 2022-01-08 23:15:29 +01:00
Filippo Scognamiglio
ef9f412e5f Clip profiles list. 2022-01-08 22:36:02 +01:00
Filippo Scognamiglio
7b69d41c60 Remove slow burn-in effect. 2022-01-08 22:32:42 +01:00
Filippo Scognamiglio
552947f507 Improve burn-in timings. 2022-01-08 22:20:44 +01:00
Filippo Scognamiglio
f69f2df63c More Connections refactorings. 2022-01-03 21:06:33 +01:00
Filippo Scognamiglio
aa270067f6 Improve settings window. 2022-01-03 20:56:49 +01:00
Filippo Scognamiglio
28977313da UI/UX fixes for OSX version. 2022-01-03 18:43:07 +01:00
Filippo Scognamiglio
cfe35d7795
Merge pull request #665 from Swordfish90/unstable
Improve rasterization and terminal frame. Some refactoring.
2021-07-15 23:43:06 +02:00
Filippo Scognamiglio
4abbe332db Improve terminal frame and expose frame size setting. 2021-07-15 23:20:42 +02:00
Filippo Scognamiglio
3104abd4ad Add subpixel rasterization. 2021-07-07 00:09:10 +02:00
Filippo Scognamiglio
7714f7b503 Improve rasterization rendering and add LCD rasterization (with subpixels). 2021-07-03 16:14:02 +02:00
Dmytro Pashchenko
9d06f10a9b
some grammar fixes (#636) 2021-07-01 23:14:53 +02:00
Mizumoto Ryohei
8c27f7683b
update brew command (#664)
* update brew command

* Update README.md
2021-07-01 23:12:26 +02:00
Filippo Scognamiglio
bf1a491789
Merge pull request #638 from amake/patch-1
Mention MacPorts in readme
2021-07-01 23:10:42 +02:00
Filippo Scognamiglio
701cb540e5 Improve QML syntax and update license headers. 2021-06-30 22:49:03 +02:00
Filippo Scognamiglio
0f18a0349a
Merge pull request #589 from rbanffy/master
Update 3270 font to 2.3.1
2021-06-30 08:49:39 +02:00
Filippo Scognamiglio
205a152350
Merge pull request #662 from Swordfish90/unstable
Migrate to QtQuick.Controls 2.x
2021-06-30 08:45:24 +02:00
Filippo Scognamiglio
dae1a56691 Migrate from QtQuick.Controls 1.x to QtQuick.Controls 2.x. Updated QMLTermWidget submodule. 2021-06-30 08:33:31 +02:00
Ricardo Bánffy
39181f42cf Update font version to 2.3.1 2021-03-25 09:52:21 +00:00
Aaron Madlon-Kay
3d706ad1a7
Mention MacPorts in readme 2021-01-27 14:42:57 +09:00
Ricardo Bánffy
a31b77e5bc Update 3270 font with version 2.0.4.
See https://github.com/rbanffy/3270font/tree/v2.0.4 for changes.
2020-05-17 12:29:24 +01:00
Ricardo Bánffy
b417643415 Renamed 3270 font to latest binary version 2020-05-17 12:21:13 +01:00
Filippo Scognamiglio
dac2b4ff16
Merge pull request #560 from ayazhafiz/docs/homebrew
Add installation instructions using Homebrew
2020-05-09 17:00:35 +02:00
Filippo Scognamiglio
2d12b0c747 Bump qmltermwidget submodule. 2020-05-09 16:51:36 +02:00
Filippo Scognamiglio
5fe26edaa6
Merge pull request #540 from kklemon/support-blinking-cursor
Add blinking cursor support
2020-05-09 16:37:49 +02:00
Filippo Scognamiglio
a736cfd548
Merge pull request #569 from barak/master
get --help and --version to write to stdout
2020-05-09 16:36:45 +02:00
Filippo Scognamiglio
5af4214daa
Merge pull request #566 from tgerczei/master
now packaged in the official repository
2020-05-09 16:32:14 +02:00
Barak A. Pearlmutter
98ef7b329a allow --help/-h/--version/-v options without graphics 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
b0e1962fa7 send cool-retro-term --help and --version to stdout 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
83684e8882 squelch ugly quotes on 1st line of cool-retro-term --usage 2020-05-08 16:29:51 +01:00
Barak A. Pearlmutter
1ed7d077a9 git ignore app/moc_predefs.h 2020-05-08 16:29:51 +01:00
Filippo Scognamiglio
ba4b36618f
Merge pull request #546 from jayk/master
Yaourt is deprecated, use trizen instead for arch instructions
2020-05-06 18:44:52 +02:00
Filippo Scognamiglio
af647a4bad
Merge pull request #584 from pwwiur/patch-1
Adding snap install method
2020-05-06 18:34:41 +02:00
Filippo Scognamiglio
b719530ef0
Merge pull request #576 from AutumnalAntlers/ReadMe-Changes
Update Readme.md to include directions to settings
2020-05-06 18:33:33 +02:00
Amir Fo
530d61d67e
Adding snap install method
Adding snap install method which is supported in most of the distros and is easy!
2020-05-04 20:58:13 +04:30
AutumnalAntlers
3d76bcb48c
Update Readme.md to include directions to settings
Several users of OS's without titlebars or window decor have expressed confusion at how one change's their theme (in this case, via the context menu). Mentioning how to access the menu in the Readme will make the settings more accessible and prevent any future confusion. It might be more appropriate to create a "Use" heading exploring features such as Performance settings, but for the sake of brevity, I've just inserted a mention at the end of the description, before more OS-specific install instructions.
2020-03-22 11:40:40 -07:00
Tamás Gérczei
70ce2f1f3c
now packaged in the official repository 2019-12-28 09:35:08 +01:00
ayazhafiz
21a190a1aa
Add installation instructions using Homebrew
I was not aware there was a [Homebrew cask](https://github.com/Homebrew/homebrew-cask/blob/master/Casks/cool-retro-term.rb) for this
project, which simplifies installation on macOS. This commit adds
documentation for installing the app via Homebrew.
2019-11-25 10:20:36 -06:00
Jay Kuri
a88d222709
Merge pull request #1 from jayk/trizen-not-yaourt
Update Readme - Trizen for Arch - Yaourt is deprecated.
2019-08-23 13:47:44 -06:00
Jay Kuri
b2defceae5
Update Readme - Trizen for Arch - Yaourt is deprecated.
yaourt is deprecated.  Use trizen instead.  The command line arguments are identical to yaourt, for easy migration.
2019-08-23 13:47:28 -06:00
Kristian
8d7565ffc4 Disable blinking cursor by default 2019-07-20 16:51:10 +02:00
Kristian
9960b25dff Add support for blinking cursor 2019-07-08 15:21:17 +02:00
Kristian
411c116deb Update qmltermwidget submodule 2019-07-08 15:20:56 +02:00
Filippo Scognamiglio
64e007f1fd Update qmltermwidget submodule with CTRL+SPACE fix. 2019-06-18 22:16:23 +02:00
Filippo Scognamiglio
c62fc365db
Merge pull request #509 from 0mp/patch-2
Add FreeBSD installation instructions
2019-04-20 23:14:23 +02:00
Filippo Scognamiglio
e7e630bd5d
Merge pull request #524 from Haradric/patch-1
Update README.md
2019-04-20 23:13:34 +02:00
Filippo Scognamiglio
7d77175fbb
Merge pull request #521 from tgerczei/master
new ebuild available for 1.1.1
2019-04-20 23:12:46 +02:00
Haradric
f033553972
Update README.md
added installation method via Hombrew
2019-04-16 12:27:22 +03:00
Tamás Gérczei
ae1ed044ba
new ebuild available for 1.1.1 2019-04-01 21:07:15 +02:00
Filippo Scognamiglio
35d601c7a7
Add two missing qt dependencies to snapcraft.yaml 2019-03-27 18:56:44 +01:00
Filippo Scognamiglio
f89aeec374
Merge pull request #512 from timm0e/patch-1
Fix typo in README.md
2019-02-17 17:35:20 +01:00
timm0e
42c3b4b42e
Fix typo in README.md 2019-02-17 15:32:08 +01:00
Mateusz Piotrowski
322fc31396
Add FreeBSD installation instructions 2019-02-12 10:44:58 +01:00
Filippo Scognamiglio
6e4d5cfddd
Merge pull request #503 from mclang/patch-1
Adds installation instruction for Solus
2019-02-02 17:44:58 +01:00
mclang
d81485a8bf
Adds installation instruction for Solus 2019-02-01 15:09:17 +02:00
Filippo Scognamiglio
a9260d956c Remove snapcraft plugs. Not used for classic confinement. 2019-01-30 20:05:53 +01:00
Filippo Scognamiglio
025bb560bc
Update README.md 2019-01-22 21:49:21 +01:00
Filippo Scognamiglio
cdd1488e13 Print system font log only when verbose is enabled. 2019-01-19 21:08:57 +01:00
Filippo Scognamiglio
b8b2644969 Fix snap package launcher and expose in path qml directory. 2019-01-19 15:03:58 +01:00
Filippo Scognamiglio
09b5c0a5d0 Update snap package to use core18. 2019-01-18 00:34:34 +01:00
Filippo Scognamiglio
1ed66f3aa2 Update snapcraft file. 2019-01-17 22:47:38 +01:00
Filippo Scognamiglio
3b4d5d1c3f Bump version number. 2019-01-17 22:24:32 +01:00
Filippo Scognamiglio
f98fd5a7ad Fix font slider misbehaving. 2019-01-17 22:23:54 +01:00
Filippo Scognamiglio
b961109623 Use a single version name. 2019-01-17 22:03:25 +01:00
Filippo Scognamiglio
8f0d1023a4 Use threaded renderer by default in linux. This improves performances. 2019-01-17 21:47:59 +01:00
Filippo Scognamiglio
79773ba95c
Merge pull request #499 from Swordfish90/old-burnin
Reintroduce optional old burnin and improve highdpi support.
2019-01-17 21:35:24 +01:00
Filippo Scognamiglio
ff3f02fb8c Improve highdpi support. 2019-01-09 19:26:02 +01:00
Filippo Scognamiglio
0af2b20b3a Settings optin for old burinin version. It seems to be working better on osx. 2019-01-09 19:01:11 +01:00
Filippo Scognamiglio
b026fe357e
Merge pull request #495 from refacto/master
correct version number output with --version
2019-01-07 21:33:47 +01:00
Sascha Paunovic
ade36c013b correct version number output with --version 2019-01-07 12:24:53 +01:00
Filippo Scognamiglio
54a6a7f590
Merge pull request #494 from probonopd/patch-2
Update usr/share/metainfo
2019-01-04 22:46:58 +01:00
probonopd
20728e4a0f
usr/share/metainfo
As per https://www.freedesktop.org/software/appstream/docs/chap-Quickstart.html#sect-Quickstart-DesktopApps, usr/share/metainfo should be used
2019-01-04 18:53:09 +00:00
Filippo Scognamiglio
afa456f6b3
Merge pull request #493 from probonopd/patch-2
Fix #336 and upload to GitHub Releases
2019-01-04 19:29:25 +01:00
probonopd
3fbfb77430
Upload to GitHub Releases
Need to set a GITHUB_TOKEN environment variable in https://travis-ci.org/Swordfish90/cool-retro-term/settings
2019-01-03 11:04:35 +00:00
probonopd
051bcb62c6
Fix #336 2019-01-03 10:54:43 +00:00
Filippo Scognamiglio
d2c57eed6d
Merge pull request #336 from probonopd/patch-1
Generate AppImage of each build on Travis CI
2019-01-02 23:58:39 +01:00
Filippo Scognamiglio
f2f38c0e0d Fixes issue #491. 2019-01-02 22:01:57 +01:00
Filippo Scognamiglio
4046bdbc6a
Merge pull request #488 from tgerczei/master
new ebuild available for 1.1.0
2018-12-19 21:56:50 +01:00
Tamás Gérczei
c83cc206fd
new ebuild available for 1.1.0 2018-12-19 18:15:10 +01:00
Filippo Scognamiglio
41ac14fbd3
Merge pull request #482 from dagostinelli/patch-1
Update README.md
2018-12-19 09:30:27 +01:00
Filippo Scognamiglio
e4c1cad1a7
Update README.md 2018-12-18 23:40:24 +01:00
Darryl T. Agostinelli
db7a7f38f7
Update README.md
Make it easier for the eye to pick up the instructions for the various Linux distros.  Presently, the eye skips over them and all you see are the Ubuntu things.  Also adjusted the help text a little.
2018-11-23 19:13:39 -06:00
probonopd
4bff6efe97 Update .travis.yml 2017-04-03 23:07:30 +02:00
probonopd
c514dc7a24 See if we still need 2 runs 2017-04-03 22:55:45 +02:00
probonopd
24754edb6a Use linuxdeployqt-continuous-x86_64.AppImage for now 2017-03-17 21:05:44 +01:00
probonopd
79fbb76524 Try to reduce workarounds fpr 2017-03-17 21:02:20 +01:00
probonopd
b85aede966 Update .travis.yml 2017-02-25 01:27:19 +01:00
probonopd
c66ca6e44f Update .travis.yml 2017-02-25 01:20:00 +01:00
probonopd
a192024fef Update .travis.yml 2017-02-25 01:12:13 +01:00
probonopd
918df9098a Update .travis.yml 2017-02-25 01:06:42 +01:00
probonopd
c9271bfa36 Update .travis.yml 2017-02-25 01:01:39 +01:00
probonopd
fa162c818b Update .travis.yml 2017-02-25 00:56:00 +01:00
probonopd
ff976e3ec2 Update .travis.yml 2017-02-25 00:55:46 +01:00
probonopd
17c5651305 Update .travis.yml 2017-02-25 00:50:41 +01:00
probonopd
7c7b049ba1 Update .travis.yml 2017-02-25 00:49:16 +01:00
probonopd
0823fe8b3d find /opt/qt58/ | grep QtGraphicalEffects 2017-02-19 21:43:34 +01:00
probonopd
e787fd0fb5 Update .travis.yml 2017-02-19 20:11:53 +01:00
probonopd
650497bff4 Debug why some qml imports do not get deployed 2017-02-19 18:45:29 +01:00
probonopd
2f25bd30b0 linuxdeployqt-3-x86_64.AppImage 2017-02-19 18:38:16 +01:00
probonopd
d58157a450 -qmldir=./app/qml/ -qmldir=./qmltermwidget/ 2017-02-19 18:32:44 +01:00
probonopd
9d049bd041 Use linuxdeployqt-3-x86_64.AppImage 2017-02-19 18:24:35 +01:00
probonopd
988222b711 Upload to transfer.sh 2017-02-19 18:23:31 +01:00
probonopd
f42bd3036f Install libgl1-mesa-dev 2017-02-19 18:08:53 +01:00
probonopd
297239fb5c Install libgl-dev 2017-02-19 18:05:37 +01:00
probonopd
dbd46d44aa Update .travis.yml 2017-02-19 18:01:29 +01:00
probonopd
254f4d6e92 Create .travis.yml 2017-02-19 17:56:57 +01:00
45 changed files with 2408 additions and 1738 deletions

4
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,4 @@
# 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']

98
.github/workflows/appimage.yml vendored Normal file
View File

@ -0,0 +1,98 @@
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

4
.gitignore vendored
View File

@ -18,6 +18,7 @@
*.pro.user.*
*.moc
moc_*.cpp
moc_*.h
qrc_*.cpp
ui_*.h
Makefile*
@ -47,3 +48,6 @@ cool-retro-term
.DS_Store
*.app
# IntelliJ
.idea

37
.travis.yml Normal file
View 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)/

173
README.md
View File

@ -8,172 +8,23 @@
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 uses the QML port of qtermwidget (Konsole) developed by me: https://github.com/Swordfish90/qmltermwidget .
It uses the QML port of qtermwidget (Konsole): https://github.com/Swordfish90/qmltermwidget.
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 Qt5. It's suggested that you stick to the latest LTS version.
Settings such as colors, fonts, and effects can be accessed via context menu.
## Screenshots
![Image](<http://i.imgur.com/I6wq1cC.png>)
![Image](<http://i.imgur.com/12EqlpL.png>)
![Image](<http://i.imgur.com/Lx0acQz.jpg>)
![Image](<https://i.imgur.com/TNumkDn.png>)
![Image](<https://i.imgur.com/hfjWOM4.png>)
![Image](<https://i.imgur.com/GYRDPzJ.jpg>)
## Get cool-retro-term
You can either build cool-retro-term yourself (see below) or walk the easy way and install one of these packages:
## Install
Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`.
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).
Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term).
Alternatively, most distributions such as Ubuntu, Fedora or Arch already package cool-retro-term in their official repositories.
Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org):
## Building
yaourt -S aur/cool-retro-term-git
or use:
pacman -S cool-retro-term
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:
USE="git" emerge app-portage/layman
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.
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!
Ubuntu users of 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)
macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases
## Build instructions (Linux)
## 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
---
**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
```
## 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.
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)).

View File

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

View File

@ -6,11 +6,13 @@
#include <QtWidgets/QApplication>
#include <QIcon>
#include <QQuickStyle>
#include <QDebug>
#include <stdlib.h>
#include <QFontDatabase>
#include <QLoggingCategory>
#include <fileio.h>
#include <monospacefontmanager.h>
@ -33,15 +35,43 @@ int main(int argc, char *argv[])
// This disables QT appmenu under Ubuntu, which is not working with QML apps.
setenv("QT_QPA_PLATFORMTHEME", "", 1);
// Disable Connections slot warnings
QLoggingCategory::setFilterRules("qt.qml.connections.warning=false");
#if defined (Q_OS_LINUX)
setenv("QSG_RENDER_LOOP", "threaded", 0);
#endif
#if defined(Q_OS_MAC)
// This allows UTF-8 characters usage in OSX.
setenv("LC_CTYPE", "UTF-8", 1);
#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]" << '\n';
cout << " --default-settings Run cool-retro-term with the default settings" << '\n';
cout << " --workdir <dir> Change working directory to 'dir'" << '\n';
cout << " -e <cmd> Command to execute. This option will catch all following arguments, so use it as the last option." << '\n';
cout << " -T <title> Set window title to 'title'." << '\n';
cout << " --fullscreen Run cool-retro-term in fullscreen." << '\n';
cout << " -p|--profile <prof> Run cool-retro-term with the given profile." << '\n';
cout << " -h|--help Print this help." << '\n';
cout << " --verbose Print additional information such as profiles and settings." << '\n';
cout << " -v|--version Print the program name and version." << '\n';
return 0;
}
QString appVersion("1.2.0");
if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) {
QTextStream cout(stdout, QIODevice::WriteOnly);
cout << "cool-retro-term " << appVersion << '\n';
return 0;
}
QApplication app(argc, argv);
// set application attributes
// Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293
// app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
QQmlApplicationEngine engine;
FileIO fileIO;
@ -53,27 +83,11 @@ int main(int argc, char *argv[])
app.setWindowIcon(QIcon(":../icons/32x32/cool-retro-term.png"));
#endif
app.setOrganizationName("cool-retro-term");
app.setOrganizationDomain("cool-retro-term");
// Manage command line arguments from the cpp side
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
QStringList cmdList;
@ -82,6 +96,7 @@ int main(int argc, char *argv[])
}
QVariant command(cmdList.empty() ? QVariant() : cmdList[0]);
QVariant commandArgs(cmdList.size() <= 1 ? QVariant() : QVariant(cmdList.mid(1)));
engine.rootContext()->setContextProperty("appVersion", appVersion);
engine.rootContext()->setContextProperty("defaultCmd", command);
engine.rootContext()->setContextProperty("defaultCmdArgs", commandArgs);

View File

@ -1,5 +1,24 @@
/*******************************************************************************
* 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
import QtQuick.Controls 1.1
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.1
import QtQuick.Window 2.0
@ -18,7 +37,10 @@ Window{
Text {
Layout.alignment: Qt.AlignHCenter
text: "cool-retro-term"
font {bold: true; pointSize: 18}
font {
bold: true
pointSize: 18
}
}
Loader {
id: mainContent
@ -41,7 +63,7 @@ Window{
}
}
]
Component.onCompleted: mainContent.state = "Default";
Component.onCompleted: mainContent.state = "Default"
}
Item {
Layout.fillWidth: true
@ -50,13 +72,14 @@ Window{
anchors.left: parent.left
text: qsTr("License")
onClicked: {
mainContent.state == "Default" ? mainContent.state = "License" : mainContent.state = "Default"
mainContent.state == "Default" ? mainContent.state
= "License" : mainContent.state = "Default"
}
}
Button {
anchors.right: parent.right
text: qsTr("Close")
onClicked: dialogwindow.close();
onClicked: dialogwindow.close()
}
}
}
@ -77,33 +100,34 @@ Window{
Text {
Layout.alignment: Qt.AlignCenter
horizontalAlignment: Text.AlignHCenter
text: appSettings.version + "\n" +
qsTr("Author: ") + "Filippo Scognamiglio\n" +
qsTr("Email: ") + "flscogna@gmail.com\n" +
qsTr("Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
text: appSettings.version + "\n" + qsTr(
"Author: ") + "Filippo Scognamiglio\n" + qsTr(
"Email: ") + "flscogna@gmail.com\n" + qsTr(
"Source: ") + "https://github.com/Swordfish90/cool-retro-term\n"
}
}
}
Component {
id: licenseComponent
TextArea{
ScrollView {
anchors.fill: parent
clip: true
TextArea {
readOnly: true
text: "Copyright (c) 2013 Filippo Scognamiglio <flscogna@gmail.com>\n\n" +
"https://github.com/Swordfish90/cool-retro-term\n\n" +
"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.\n\n" +
"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.\n\n" +
"You should have received a copy of the GNU General Public License " +
"along with this program. If not, see <http://www.gnu.org/licenses/>."
wrapMode: TextEdit.Wrap
text: "Copyright (c) 2013-2021 Filippo Scognamiglio <flscogna@gmail.com>\n\n"
+ "https://github.com/Swordfish90/cool-retro-term\n\n" +
"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.\n\n" +
"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.\n\n" +
"You should have received a copy of the GNU General Public License "
+ "along with this program. If not, see <http://www.gnu.org/licenses/>."
}
}
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,31 +17,33 @@
* 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.0
import QtQuick.Controls 2.0
import "utils.js" as Utils
QtObject {
readonly property string version: "1.1.0"
readonly property string version: appVersion
readonly property int profileVersion: 2
// STATIC CONSTANTS ////////////////////////////////////////////////////////
readonly property real screenCurvatureSize: 0.4
readonly property real minimumFontScaling: 0.25
readonly property real maximumFontScaling: 2.50
// GENERAL SETTINGS ///////////////////////////////////////////////////////
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 y: 100
property int width: 1024
property int height: 768
property bool fullscreen: false
property bool showMenubar: Qt.platform.os === "osx" ? true : false
property bool showMenubar: false
property string wintitle: "cool-retro-term"
@ -54,10 +56,11 @@ QtObject{
property real bloomQuality: 0.5
property real burnInQuality: 0.5
onWindowScalingChanged: handleFontChanged();
property bool blinkingCursor: false
onWindowScalingChanged: handleFontChanged()
// PROFILE SETTINGS ///////////////////////////////////////////////////////
property real windowOpacity: 1.0
property real ambientLight: 0.2
property real contrast: 0.80
@ -68,9 +71,18 @@ QtObject{
property string _backgroundColor: "#000000"
property string _fontColor: "#ff8100"
property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"), Utils.strToColor(_fontColor), saturationColor * 0.5)
property color fontColor: Utils.mix(Utils.strToColor(saturatedColor), Utils.strToColor(_backgroundColor), 0.7 + (contrast * 0.3))
property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3))
property string _frameColor: "#ffffff"
property string saturatedColor: Utils.mix(Utils.strToColor("#FFFFFF"),
Utils.strToColor(_fontColor),
saturationColor * 0.5)
property color fontColor: Utils.mix(Utils.strToColor(saturatedColor),
Utils.strToColor(_backgroundColor),
0.7 + (contrast * 0.3))
property color backgroundColor: Utils.mix(Utils.strToColor(
_backgroundColor),
Utils.strToColor(saturatedColor),
0.7 + (contrast * 0.3))
property color frameColor: Utils.strToColor(_frameColor)
property real staticNoise: 0.12
property real screenCurvature: 0.3
@ -80,6 +92,7 @@ QtObject{
property real chromaColor: 0.25
property real saturationColor: 0.25
property real frameGloss: 0
property real jitter: 0.2
@ -89,16 +102,21 @@ QtObject{
property real rbgShift: 0.0
property real _margin: 0.5
property real _frameMargin: 0.5
property real margin: Utils.lint(1.0, 20.0, _margin)
property real frameMargin: Utils.lint(1.0, 50.0, _frameMargin)
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
// FONTS //////////////////////////////////////////////////////////////////
readonly property real baseFontScaling: 0.75
property real fontScaling: 1.0
property real totalFontScaling: baseFontScaling * fontScaling
@ -112,16 +130,38 @@ QtObject{
signal terminalFontChanged(string fontFamily, int pixelSize, int lineSpacing, real screenScaling, real fontWidth)
signal initializedSettings()
signal initializedSettings
property Loader fontManager: Loader {
states: [
State { when: rasterization == no_rasterization
PropertyChanges {target: fontManager; source: "Fonts.qml" } },
State { when: rasterization == scanline_rasterization
PropertyChanges {target: fontManager; source: "FontScanlines.qml" } },
State { when: rasterization == pixel_rasterization;
PropertyChanges {target: fontManager; source: "FontPixels.qml" } }
State {
when: rasterization == no_rasterization
PropertyChanges {
target: fontManager
source: "Fonts.qml"
}
},
State {
when: rasterization == scanline_rasterization
PropertyChanges {
target: fontManager
source: "FontScanlines.qml"
}
},
State {
when: rasterization == pixel_rasterization
PropertyChanges {
target: fontManager
source: "FontPixels.qml"
}
},
State {
when: rasterization == subpixel_rasterization
PropertyChanges {
target: fontManager
source: "FontPixels.qml"
}
}
]
onLoaded: handleFontChanged()
@ -129,149 +169,160 @@ QtObject{
property FontLoader fontLoader: FontLoader {}
onFontScalingChanged: handleFontChanged();
onFontWidthChanged: handleFontChanged();
onTotalFontScalingChanged: handleFontChanged()
onFontWidthChanged: handleFontChanged()
function getIndexByName(name) {
for (var i = 0; i < fontlist.count; i++) {
var requestedName = fontlist.get(i).name;
var requestedName = fontlist.get(i).name
if (name === requestedName)
return i;
return i
}
return 0; // If the font is not available default to 0.
return 0 // If the font is not available default to 0.
}
function incrementScaling() {
fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling);
handleFontChanged();
fontScaling = Math.min(fontScaling + 0.05, maximumFontScaling)
handleFontChanged()
}
function decrementScaling() {
fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling);
handleFontChanged();
fontScaling = Math.max(fontScaling - 0.05, minimumFontScaling)
handleFontChanged()
}
function handleFontChanged() {
if (!fontManager.item) return;
if (!fontManager.item)
return
var index = getIndexByName(fontNames[rasterization]);
if (index === undefined) return;
var index = getIndexByName(fontNames[rasterization])
if (index === undefined)
return
fontManager.item.selectedFontIndex = index;
fontManager.item.scaling = totalFontScaling;
fontManager.item.selectedFontIndex = index
fontManager.item.scaling = totalFontScaling
var fontSource = fontManager.item.source;
var pixelSize = fontManager.item.pixelSize;
var lineSpacing = fontManager.item.lineSpacing;
var screenScaling = fontManager.item.screenScaling;
var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth;
var fontFamily = fontManager.item.family;
var isSystemFont = fontManager.item.isSystemFont;
var fontSource = fontManager.item.source
var pixelSize = fontManager.item.pixelSize
var lineSpacing = fontManager.item.lineSpacing
var screenScaling = fontManager.item.screenScaling
var fontWidth = fontManager.item.defaultFontWidth * appSettings.fontWidth
var fontFamily = fontManager.item.family
var isSystemFont = fontManager.item.isSystemFont
lowResolutionFont = fontManager.item.lowResolutionFont;
lowResolutionFont = fontManager.item.lowResolutionFont
if (!isSystemFont) {
fontLoader.source = fontSource;
fontFamily = fontLoader.name;
fontLoader.source = fontSource
fontFamily = fontLoader.name
}
terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling, fontWidth);
terminalFontChanged(fontFamily, pixelSize, lineSpacing, screenScaling,
fontWidth)
}
property Storage storage: Storage {}
function stringify(obj) {
var replacer = function (key, val) {
return val.toFixed ? Number(val.toFixed(4)) : val;
return val.toFixed ? Number(val.toFixed(4)) : val
}
return JSON.stringify(obj, replacer, 2);
return JSON.stringify(obj, replacer, 2)
}
function composeSettingsString() {
var settings = {
fps: fps,
x: x,
y: y,
width: width,
height: height,
windowScaling: windowScaling,
showTerminalSize: showTerminalSize,
fontScaling: fontScaling,
fontNames: fontNames,
showMenubar: showMenubar,
bloomQuality: bloomQuality,
burnInQuality: burnInQuality,
useCustomCommand: useCustomCommand,
customCommand: customCommand
"fps": fps,
"x": x,
"y": y,
"width": width,
"height": height,
"windowScaling": windowScaling,
"showTerminalSize": showTerminalSize,
"fontScaling": fontScaling,
"fontNames": fontNames,
"showMenubar": showMenubar,
"bloomQuality": bloomQuality,
"burnInQuality": burnInQuality,
"useCustomCommand": useCustomCommand,
"customCommand": customCommand
}
return stringify(settings);
return stringify(settings)
}
function composeProfileObject() {
var settings = {
backgroundColor: _backgroundColor,
fontColor: _fontColor,
flickering: flickering,
horizontalSync: horizontalSync,
staticNoise: staticNoise,
chromaColor: chromaColor,
saturationColor: saturationColor,
screenCurvature: screenCurvature,
glowingLine: glowingLine,
burnIn: burnIn,
bloom: bloom,
rasterization: rasterization,
jitter: jitter,
rbgShift: rbgShift,
brightness: brightness,
contrast: contrast,
ambientLight: ambientLight,
windowOpacity: windowOpacity,
fontName: fontNames[rasterization],
fontWidth: fontWidth,
margin: _margin
"backgroundColor": _backgroundColor,
"fontColor": _fontColor,
"frameColor": _frameColor,
"flickering": flickering,
"horizontalSync": horizontalSync,
"staticNoise": staticNoise,
"chromaColor": chromaColor,
"saturationColor": saturationColor,
"frameGloss": frameGloss,
"screenCurvature": screenCurvature,
"glowingLine": glowingLine,
"burnIn": burnIn,
"bloom": bloom,
"rasterization": rasterization,
"jitter": jitter,
"rbgShift": rbgShift,
"brightness": brightness,
"contrast": contrast,
"ambientLight": ambientLight,
"windowOpacity": windowOpacity,
"fontName": fontNames[rasterization],
"fontWidth": fontWidth,
"margin": _margin,
"blinkingCursor": blinkingCursor,
"frameMargin": _frameMargin,
}
return settings;
return settings
}
function composeProfileString() {
return stringify(composeProfileObject());
return stringify(composeProfileObject())
}
function loadSettings() {
var settingsString = storage.getSetting("_CURRENT_SETTINGS");
var profileString = storage.getSetting("_CURRENT_PROFILE");
var settingsString = storage.getSetting("_CURRENT_SETTINGS")
var profileString = storage.getSetting("_CURRENT_PROFILE")
if(!settingsString) return;
if(!profileString) return;
if (!settingsString)
return
if (!profileString)
return
loadSettingsString(settingsString);
loadProfileString(profileString);
loadSettingsString(settingsString)
loadProfileString(profileString)
if (verbose)
console.log("Loading settings: " + settingsString + profileString);
console.log("Loading settings: " + settingsString + profileString)
}
function storeSettings() {
var settingsString = composeSettingsString();
var profileString = composeProfileString();
var settingsString = composeSettingsString()
var profileString = composeProfileString()
storage.setSetting("_CURRENT_SETTINGS", settingsString);
storage.setSetting("_CURRENT_PROFILE", profileString);
storage.setSetting("_CURRENT_SETTINGS", settingsString)
storage.setSetting("_CURRENT_PROFILE", profileString)
if (verbose) {
console.log("Storing settings: " + settingsString);
console.log("Storing profile: " + profileString);
console.log("Storing settings: " + settingsString)
console.log("Storing profile: " + profileString)
}
}
function loadSettingsString(settingsString) {
var settings = JSON.parse(settingsString);
var settings = JSON.parse(settingsString)
showTerminalSize = settings.showTerminalSize !== undefined ? settings.showTerminalSize : showTerminalSize
showTerminalSize = settings.showTerminalSize
!== undefined ? settings.showTerminalSize : showTerminalSize
fps = settings.fps !== undefined ? settings.fps : fps
windowScaling = settings.windowScaling !== undefined ? settings.windowScaling : windowScaling
windowScaling = settings.windowScaling
!== undefined ? settings.windowScaling : windowScaling
x = settings.x !== undefined ? settings.x : x
y = settings.y !== undefined ? settings.y : y
@ -281,94 +332,118 @@ QtObject{
fontNames = settings.fontNames !== undefined ? settings.fontNames : fontNames
fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling
showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar;
showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar
bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality;
burnInQuality = settings.burnInQuality !== undefined ? settings.burnInQuality : burnInQuality;
bloomQuality = settings.bloomQuality !== undefined ? settings.bloomQuality : bloomQuality
burnInQuality = settings.burnInQuality
!== undefined ? settings.burnInQuality : burnInQuality
useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand
customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand
useCustomCommand = settings.useCustomCommand
!== undefined ? settings.useCustomCommand : useCustomCommand
customCommand = settings.customCommand
!== undefined ? settings.customCommand : customCommand
}
function loadProfileString(profileString) {
var settings = JSON.parse(profileString);
var settings = JSON.parse(profileString)
_backgroundColor = settings.backgroundColor !== undefined ? settings.backgroundColor : _backgroundColor;
_fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor;
_backgroundColor = settings.backgroundColor
!== undefined ? settings.backgroundColor : _backgroundColor
_fontColor = settings.fontColor !== undefined ? settings.fontColor : _fontColor
_frameColor = settings.frameColor !== undefined ? settings.frameColor : _frameColor
horizontalSync = settings.horizontalSync !== undefined ? settings.horizontalSync : horizontalSync
flickering = settings.flickering !== undefined ? settings.flickering : flickering;
staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise;
chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor;
saturationColor = settings.saturationColor !== undefined ? settings.saturationColor : saturationColor;
screenCurvature = settings.screenCurvature !== undefined ? settings.screenCurvature : screenCurvature;
glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine;
horizontalSync = settings.horizontalSync
!== undefined ? settings.horizontalSync : horizontalSync
flickering = settings.flickering !== undefined ? settings.flickering : flickering
staticNoise = settings.staticNoise !== undefined ? settings.staticNoise : staticNoise
chromaColor = settings.chromaColor !== undefined ? settings.chromaColor : chromaColor
saturationColor = settings.saturationColor
!== undefined ? settings.saturationColor : saturationColor
frameGloss = settings.frameGloss !== undefined ? settings.frameGloss : frameGloss
screenCurvature = settings.screenCurvature
!== undefined ? settings.screenCurvature : screenCurvature
glowingLine = settings.glowingLine !== undefined ? settings.glowingLine : glowingLine
burnIn = settings.burnIn !== undefined ? settings.burnIn : burnIn
bloom = settings.bloom !== undefined ? settings.bloom : bloom
rasterization = settings.rasterization !== undefined ? settings.rasterization : rasterization;
rasterization = settings.rasterization
!== undefined ? settings.rasterization : rasterization
jitter = settings.jitter !== undefined ? settings.jitter : jitter;
jitter = settings.jitter !== undefined ? settings.jitter : jitter
rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift;
rbgShift = settings.rbgShift !== undefined ? settings.rbgShift : rbgShift
ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight;
contrast = settings.contrast !== undefined ? settings.contrast : contrast;
brightness = settings.brightness !== undefined ? settings.brightness : brightness;
windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity;
ambientLight = settings.ambientLight !== undefined ? settings.ambientLight : ambientLight
contrast = settings.contrast !== undefined ? settings.contrast : contrast
brightness = settings.brightness !== undefined ? settings.brightness : brightness
windowOpacity = settings.windowOpacity
!== undefined ? settings.windowOpacity : windowOpacity
fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization];
fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth;
fontNames[rasterization] = settings.fontName
!== undefined ? settings.fontName : fontNames[rasterization]
fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth
_margin = settings.margin !== undefined ? settings.margin : _margin;
_margin = settings.margin !== undefined ? settings.margin : _margin
_frameMargin = settings.frameMargin !== undefined ? settings.frameMargin : _frameMargin
handleFontChanged();
blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
handleFontChanged()
}
function storeCustomProfiles() {
storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString());
storage.setSetting("_CUSTOM_PROFILES", composeCustomProfilesString())
}
function loadCustomProfiles() {
var customProfileString = storage.getSetting("_CUSTOM_PROFILES");
if(customProfileString === undefined) customProfileString = "[]";
loadCustomProfilesString(customProfileString);
var customProfileString = storage.getSetting("_CUSTOM_PROFILES")
if (customProfileString === undefined)
customProfileString = "[]"
loadCustomProfilesString(customProfileString)
}
function loadCustomProfilesString(customProfilesString) {
var customProfiles = JSON.parse(customProfilesString);
var customProfiles = JSON.parse(customProfilesString)
for (var i = 0; i < customProfiles.length; i++) {
var profile = customProfiles[i];
var profile = customProfiles[i]
if (verbose)
console.log("Loading custom profile: " + stringify(profile));
console.log("Loading custom profile: " + stringify(profile))
profilesList.append(profile);
profilesList.append(profile)
}
}
function composeCustomProfilesString() {
var customProfiles = []
for (var i = 0; i < profilesList.count; i++) {
var profile = profilesList.get(i);
if(profile.builtin) continue;
customProfiles.push({text: profile.text, obj_string: profile.obj_string, builtin: false})
var profile = profilesList.get(i)
if (profile.builtin)
continue
customProfiles.push({
"text": profile.text,
"obj_string": profile.obj_string,
"builtin": false
})
}
return stringify(customProfiles);
return stringify(customProfiles)
}
function loadProfile(index) {
var profile = profilesList.get(index);
loadProfileString(profile.obj_string);
var profile = profilesList.get(index)
loadProfileString(profile.obj_string)
}
function appendCustomProfile(name, profileString) {
profilesList.append({text: name, obj_string: profileString, builtin: false});
profilesList.append({
"text": name,
"obj_string": profileString,
"builtin": false
})
}
// PROFILES ///////////////////////////////////////////////////////////////
property ListModel profilesList: ListModel {
ListElement {
text: "Default Amber"
@ -391,16 +466,19 @@ QtObject{
"rbgShift": 0,
"saturationColor": 0.2483,
"screenCurvature": 0.3,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.1198,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement {
text: "Monochrome Green"
obj_string: '
{
obj_string: '{
"ambientLight": 0.2,
"backgroundColor": "#000000",
"bloom": 0.5538,
@ -419,16 +497,19 @@ QtObject{
"rbgShift": 0,
"saturationColor": 0.0,
"screenCurvature": 0.3,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.1198,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement {
text: "Green Scanlines"
obj_string: '
{
obj_string: '{
"ambientLight": 0,
"backgroundColor": "#000000",
"bloom": 0.6,
@ -447,16 +528,19 @@ QtObject{
"rbgShift": 0,
"saturationColor": 0.5,
"screenCurvature": 0.3,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.15,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement {
text: "Default Pixelated"
obj_string: '
{
obj_string: '{
"ambientLight": 0,
"backgroundColor": "#000000",
"bloom": 0.4045,
@ -475,16 +559,19 @@ QtObject{
"rbgShift": 0,
"saturationColor": 0,
"screenCurvature": 0,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.15,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement {
text: "Apple ]["
obj_string:
'{
obj_string: '{
"ambientLight": 0.3038,
"backgroundColor": "#000000",
"bloom": 0.5,
@ -503,16 +590,19 @@ QtObject{
"rbgShift": 0,
"saturationColor": 0,
"screenCurvature": 0.5,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.099,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.2
}'
builtin: true
}
ListElement {
text: "Vintage"
obj_string: '
{
obj_string: '{
"ambientLight": 0.5,
"backgroundColor": "#000000",
"bloom": 0.4983,
@ -531,16 +621,19 @@ QtObject{
"rbgShift": 0.2969,
"saturationColor": 0,
"screenCurvature": 0.5,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.2969,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.5
}'
builtin: true
}
ListElement {
text: "IBM Dos"
obj_string:
'{
text: "IBM DOS"
obj_string: '{
"ambientLight": 0.151,
"backgroundColor": "#000000",
"bloom": 0.2969,
@ -559,16 +652,19 @@ QtObject{
"rbgShift": 0.3524,
"saturationColor": 0,
"screenCurvature": 0.4,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.0503,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.2
}'
builtin: true
}
ListElement {
text: "IBM 3278"
obj_string:
'{
obj_string: '{
"ambientLight": 0.1,
"backgroundColor": "#000000",
"bloom": 0.2969,
@ -587,16 +683,19 @@ QtObject{
"rbgShift": 0,
"saturationColor": 0,
"screenCurvature": 0.2,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0,
"windowOpacity": 1,
"margin": 0.5
"margin": 0.5,
"blinkingCursor": false,
"frameMargin": 0.1
}'
builtin: true
}
ListElement {
text: "Futuristic"
obj_string:
'{
obj_string: '{
"ambientLight": 0,
"backgroundColor": "#000000",
"bloom": 0.5017,
@ -615,9 +714,13 @@ QtObject{
"rbgShift": 0,
"saturationColor": 0.4983,
"screenCurvature": 0,
"frameColor": "#ffffff",
"frameGloss": 0,
"staticNoise": 0.0955,
"windowOpacity": 0.7,
"margin": 0.1
"margin": 0.1,
"blinkingCursor": false,
"frameMargin": 0
}'
builtin: true
}
@ -626,51 +729,51 @@ QtObject{
function getProfileIndexByName(name) {
for (var i = 0; i < profilesList.count; i++) {
if (profilesList.get(i).text === name)
return i;
return i
}
return -1;
return -1
}
Component.onCompleted: {
// Manage the arguments from the QML side.
var args = Qt.application.arguments;
var args = Qt.application.arguments
if (args.indexOf("--verbose") !== -1) {
verbose = true;
verbose = true
}
if (args.indexOf("--default-settings") === -1) {
loadSettings();
loadSettings()
}
loadCustomProfiles();
loadCustomProfiles()
var profileArgPosition = args.indexOf("--profile");
var profileArgPosition = args.indexOf("--profile")
if (profileArgPosition !== -1) {
var profileIndex = getProfileIndexByName(args[profileArgPosition + 1]);
var profileIndex = getProfileIndexByName(
args[profileArgPosition + 1])
if (profileIndex !== -1)
loadProfile(profileIndex);
loadProfile(profileIndex)
else
console.log("Warning: selected profile is not valid; ignoring it");
console.log("Warning: selected profile is not valid; ignoring it")
}
if (args.indexOf("--fullscreen") !== -1) {
fullscreen = true;
showMenubar = false;
fullscreen = true
showMenubar = false
}
if (args.indexOf("-T") !== -1) {
wintitle = args[args.indexOf("-T") + 1]
}
initializedSettings();
initializedSettings()
}
Component.onDestruction: {
storeSettings();
storeCustomProfiles();
storeSettings()
storeCustomProfiles()
// storage.dropSettings(); //DROPS THE SETTINGS!.. REMEMBER TO DISABLE ONCE ENABLED!!
}
// VARS ///////////////////////////////////////////////////////////////////
property Label _sampleLabel: Label {
text: "100%"
}

View File

@ -1,3 +1,22 @@
/*******************************************************************************
* 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
@ -10,39 +29,34 @@ Loader {
property real lastUpdate: 0
property real prevLastUpdate: 0
property real delay: (1.0 / appSettings.fps) * 1000
property real burnIn: appSettings.burnIn
property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
property real _minBurnInFadeTime: 160
property real _maxBurnInFadeTime: 1600
property real _minBurnInFadeTime: appSettings.minBurnInFadeTime
property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime
active: appSettings.burnIn !== 0
anchors.fill: parent
function completelyUpdate() {
prevLastUpdate = lastUpdate;
lastUpdate = timeManager.time;
item.source.scheduleUpdate();
let newTime = timeManager.time
if (newTime > lastUpdate) {
prevLastUpdate = lastUpdate
lastUpdate = newTime
}
item.source.scheduleUpdate()
}
function restartBlurSource() {
prevLastUpdate = timeManager.time;
lastUpdate = prevLastUpdate;
completelyUpdate();
prevLastUpdate = timeManager.time
lastUpdate = prevLastUpdate
completelyUpdate()
}
sourceComponent: Item {
property alias source: burnInEffectSource
property int burnInScaling: scaleTexture * appSettings.burnInQuality
width: appSettings.lowResolutionFont
? kterminal.totalWidth * Math.max(1, burnInScaling)
: kterminal.totalWidth * scaleTexture * appSettings.burnInQuality
height: appSettings.lowResolutionFont
? kterminal.totalHeight * Math.max(1, burnInScaling)
: kterminal.totalHeight * scaleTexture * appSettings.burnInQuality
ShaderEffectSource {
id: burnInEffectSource
@ -61,21 +75,35 @@ Loader {
Connections {
target: kterminal
onImagePainted: completelyUpdate()
onImagePainted: {
completelyUpdate()
}
}
// Restart blurred source settings change.
Connections {
target: appSettings
onBurnInChanged: burnInEffect.restartBlurSource();
onTerminalFontChanged: burnInEffect.restartBlurSource();
onRasterizationChanged: burnInEffect.restartBlurSource();
onBurnInQualityChanged: burnInEffect.restartBlurSource();
onBurnInChanged: {
burnInEffect.restartBlurSource()
}
Connections {
target: kterminalScrollbar
onOpacityChanged: completelyUpdate()
onTerminalFontChanged: {
burnInEffect.restartBlurSource()
}
onRasterizationChanged: {
burnInEffect.restartBlurSource()
}
onBurnInQualityChanged: {
burnInEffect.restartBlurSource()
}
}
}
ShaderLibrary {
id: shaderLibrary
}
ShaderEffect {
@ -88,7 +116,6 @@ Loader {
property real prevLastUpdate: burnInEffect.prevLastUpdate
anchors.fill: parent
blending: false
fragmentShader:
@ -108,9 +135,7 @@ Loader {
uniform highp float prevLastUpdate;" +
"float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}" +
shaderLibrary.rgb2grey +
"void main() {
vec2 coords = qt_TexCoord0;

View File

@ -1,51 +0,0 @@
import QtQuick 2.2
import QtQuick.Controls 1.1
MenuBar {
id: defaultMenuBar
property bool visible: true
Menu {
title: qsTr("File")
visible: defaultMenuBar.visible
MenuItem {action: quitAction}
}
Menu {
title: qsTr("Edit")
visible: defaultMenuBar.visible && appSettings.showMenubar
MenuItem {action: copyAction}
MenuItem {action: pasteAction}
MenuSeparator{visible: Qt.platform.os !== "osx"}
MenuItem {action: showsettingsAction}
}
Menu{
title: qsTr("View")
visible: defaultMenuBar.visible
MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled}
MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled}
MenuSeparator{visible: showMenubarAction.enabled}
MenuItem {action: zoomIn}
MenuItem {action: zoomOut}
}
Menu{
id: profilesMenu
title: qsTr("Profiles")
visible: defaultMenuBar.visible
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")
visible: defaultMenuBar.visible
MenuItem {action: showAboutAction}
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,9 +17,8 @@
* 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.Controls 2.0
import QtQuick.Layouts 1.1
import "Components"
@ -28,19 +27,19 @@ RowLayout {
property alias name: check.text
property double value
property alias min_value: slider.minimumValue
property alias max_value: slider.maximumValue
property alias min_value: slider.from
property alias max_value: slider.to
property alias stepSize: slider.stepSize
signal newValue(real newValue);
signal newValue(real newValue)
id: setting_component
Layout.fillWidth: true
onValueChanged: {
check.checked = !(value == 0);
check.checked = !(value == 0)
if (check.checked)
slider.value = value;
slider.value = value
}
CheckBox {
@ -48,13 +47,13 @@ RowLayout {
implicitWidth: 160
onClicked: {
if (!checked) {
checked = false;
slider.enabled = false;
newValue(0);
checked = false
slider.enabled = false
newValue(0)
} else {
checked = true;
newValue(slider.value);
slider.enabled = true;
checked = true
newValue(slider.value)
slider.enabled = true
}
}
}
@ -63,11 +62,11 @@ RowLayout {
stepSize: parent.stepSize
Layout.fillWidth: true
onValueChanged: {
newValue(value);
newValue(value)
}
}
SizedLabel {
Layout.fillHeight: true
text: Math.round(((value - min_value) / (max_value - min_value)) * 100) + "%"
text: Math.round(
((value - min_value) / (max_value - min_value)) * 100) + "%"
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,7 +17,6 @@
* 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.Dialogs 1.1
@ -35,15 +34,14 @@ Item {
visible: false
//This is a workaround to a Qt 5.2 bug.
onColorChanged: if (Qt.platform.os !== "osx") colorSelected(color)
onAccepted: if (Qt.platform.os === "osx") colorSelected(color)
onColorChanged: if (!appSettings.isMacOS) colorSelected(color)
onAccepted: if (appSettings.isMacOS) colorSelected(color)
}
Rectangle {
anchors.fill: parent
radius: 10
color: rootItem.color
border.color: "black"
Glossy {}
Rectangle {
anchors.fill: parent
anchors.margins: parent.height * 0.25
@ -59,6 +57,6 @@ Item {
}
MouseArea {
anchors.fill: parent
onClicked: colorDialog.visible = true;
onClicked: colorDialog.visible = true
}
}

View File

@ -1,5 +1,7 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,19 +19,14 @@
* 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 QtQuick.Controls 1.0
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
// This component is simply a label with a predefined size.
// Used to improve alignment.
Item {
property alias text: textfield.text
width: appSettings.labelWidth
Label {
id: textfield
anchors { right: parent.right; verticalCenter: parent.verticalCenter }
}
Layout.minimumWidth: appSettings.labelWidth
width: appSettings.labelWidth
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,7 +17,6 @@
* 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 {

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,7 +17,6 @@
* 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 {

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,7 +17,6 @@
* 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 {
@ -27,17 +26,11 @@ QtObject{
property var _font: fontlist.get(selectedFontIndex)
property bool lowResolutionFont: _font.lowResolutionFont
property int pixelSize: lowResolutionFont
? _font.pixelSize
: _font.pixelSize * scaling
property int pixelSize: lowResolutionFont ? _font.pixelSize : _font.pixelSize * scaling
property int lineSpacing: lowResolutionFont
? _font.lineSpacing
: pixelSize * _font.lineSpacing
property int lineSpacing: lowResolutionFont ? _font.lineSpacing : pixelSize * _font.lineSpacing
property real screenScaling: lowResolutionFont
? _font.baseScaling * scaling
: 1.0
property real screenScaling: lowResolutionFont ? _font.baseScaling * scaling : 1.0
property real defaultFontWidth: fontlist.get(selectedFontIndex).fontWidth
@ -52,7 +45,6 @@ QtObject{
// High resolution fonts are instead drawn on a texture which has the
// size of the screen, and the scaling directly controls their pixels size.
// Those are slower to render but are not pixelated.
property ListModel fontlist: ListModel {
ListElement {
name: "TERMINUS_SCALED"
@ -221,7 +213,7 @@ QtObject{
ListElement {
name: "IBM_3278"
text: "HD: IBM 3278 (1971)"
source: "fonts/1971-ibm-3278/3270Medium.ttf"
source: "fonts/1971-ibm-3278/3270-Regular.ttf"
lineSpacing: 0.2
pixelSize: 32
fontWidth: 1.0
@ -234,25 +226,27 @@ QtObject{
Component.onCompleted: addSystemFonts()
function addSystemFonts() {
var families = monospaceSystemFonts;
var families = monospaceSystemFonts
for (var i = 0; i < families.length; i++) {
if (verbose) {
console.log("Adding system font: ", families[i])
}
fontlist.append(convertToListElement(families[i]))
}
}
function convertToListElement(family) {
return {
name: "System: " + family,
text: qsTr("System: ") + family,
source: "",
lineSpacing: 0.1,
pixelSize: 30,
fontWidth: 1.0,
baseScaling: 1.0,
lowResolutionFont: false,
isSystemFont: true,
family: family
"name": "System: " + family,
"text": qsTr("System: ") + family,
"source": "",
"lineSpacing": 0.1,
"pixelSize": 30,
"fontWidth": 1.0,
"baseScaling": 1.0,
"lowResolutionFont": false,
"isSystemFont": true,
"family": family
}
}
}

View File

@ -1,21 +0,0 @@
import QtQuick 2.2
Rectangle {
anchors.centerIn: parent
width: parent.width - parent.border.width
height: parent.height - parent.border.width
radius:parent.radius - parent.border.width/2
smooth: true
border.width: parent.border.width/2
border.color: "#22FFFFFF"
gradient: Gradient {
GradientStop { position: 0; color: "#88FFFFFF" }
GradientStop { position: .1; color: "#55FFFFFF" }
GradientStop { position: .5; color: "#33FFFFFF" }
GradientStop { position: .501; color: "#11000000" }
GradientStop { position: .8; color: "#11FFFFFF" }
GradientStop { position: 1; color: "#55FFFFFF" }
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,10 +17,9 @@
* 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.Window 2.0
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
@ -40,23 +39,25 @@ Window{
visible: false
function showError(message) {
text = message;
open();
text = message
open()
}
}
function validateName(name) {
var profile_list = appSettings.profilesList;
var profile_list = appSettings.profilesList
if (name === "")
return 1;
return 0;
return 1
return 0
}
ColumnLayout {
anchors.margins: 10
anchors.fill: parent
RowLayout {
Label{text: qsTr("Name")}
Label {
text: qsTr("Name")
}
TextField {
id: namefield
Layout.fillWidth: true
@ -71,14 +72,15 @@ Window{
text: qsTr("OK")
onClicked: clickAction()
function clickAction() {
var name = namefield.text;
var name = namefield.text
switch (validateName(name)) {
case 1:
errorDialog.showError(qsTr("The name you inserted is empty. Please choose a different one."));
break;
errorDialog.showError(
qsTr("The name you inserted is empty. Please choose a different one."))
break
default:
nameSelected(name);
close();
nameSelected(name)
close()
}
}
}

View File

@ -1,78 +0,0 @@
import QtQuick 2.0
import "utils.js" as Utils
ShaderEffect {
property color _staticFrameColor: "#ffffff"
property color _backgroundColor: appSettings.backgroundColor
property color _fontColor: appSettings.fontColor
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
property size aadelta: Qt.size(1.0 / width, 1.0 / height)
fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
uniform lowp float screenCurvature;
uniform lowp float shadowLength;
uniform highp float qt_Opacity;
uniform lowp vec4 frameColor;
uniform mediump vec2 aadelta;
varying highp vec2 qt_TexCoord0;
vec2 distortCoordinates(vec2 coords){
vec2 cc = (coords - vec2(0.5));
float dist = dot(cc, cc) * screenCurvature;
return (coords + cc * (1.0 + dist) * dist);
}
float max2(vec2 v) {
return max(v.x, v.y);
}
float min2(vec2 v) {
return min(v.x, v.y);
}
float prod2(vec2 v) {
return v.x * v.y;
}
float sum2(vec2 v) {
return v.x + v.y;
}
void main(){
vec2 staticCoords = qt_TexCoord0;
vec2 coords = distortCoordinates(staticCoords);
vec3 color = vec3(0.0);
float alpha = 0.0;
float outShadowLength = 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));
outShadow = clamp(0.0, 1.0, sqrt(outShadow));
color += frameColor.rgb * outShadow;
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, outShadow);
float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
inShadow = 0.5 * inShadow * inShadow;
alpha = max(alpha, inShadow);
gl_FragColor = vec4(color * alpha, alpha);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -19,10 +19,11 @@
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.0
import QMLTermWidget 1.0
import "menus"
import "utils.js" as Utils
Item{
@ -45,43 +46,88 @@ Item{
// Manage copy and paste
Connections {
target: copyAction
onTriggered: kterminal.copyClipboard();
onTriggered: {
kterminal.copyClipboard()
}
}
Connections {
target: pasteAction
onTriggered: kterminal.pasteClipboard()
onTriggered: {
kterminal.pasteClipboard()
}
}
Connections {
target: pasteActionAlt
onTriggered: {
kterminal.pasteSelection()
}
}
//When settings are updated sources need to be redrawn.
Connections {
target: appSettings
onFontScalingChanged: terminalContainer.updateSources();
onFontWidthChanged: terminalContainer.updateSources();
onFontScalingChanged: {
terminalContainer.updateSources()
}
onFontWidthChanged: {
terminalContainer.updateSources()
}
}
Connections {
target: terminalContainer
onWidthChanged: terminalContainer.updateSources();
onHeightChanged: terminalContainer.updateSources();
onWidthChanged: {
terminalContainer.updateSources()
}
onHeightChanged: {
terminalContainer.updateSources()
}
}
Connections {
target: terminalWindow
onActiveChanged: {
kterminal.forceActiveFocus()
}
}
function updateSources() {
kterminal.update();
kterminal.update()
}
QMLTermWidget {
id: kterminal
property int margin: appSettings.margin / screenScaling
property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1
property int margin: appSettings.totalMargin / screenScaling
property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
property int totalHeight: Math.floor(parent.height / screenScaling)
width: totalWidth - 2 * margin
height: totalHeight - 2 * margin
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"
smooth: !appSettings.lowResolutionFont
enableBold: false
fullCursorHeight: true
blinkingCursor: appSettings.blinkingCursor
session: QMLTermSession {
id: ksession
@ -129,7 +175,7 @@ Item{
var args = Utils.tokenizeCommandLine(appSettings.customCommand);
ksession.setShellProgram(args[0]);
ksession.setArgs(args.slice(1));
} else if (!defaultCmd && Qt.platform.os === "osx") {
} else if (!defaultCmd && appSettings.isMacOS) {
// OSX Requires the following default parameters for auto login.
ksession.setArgs(["-i", "-l"]);
}
@ -143,36 +189,28 @@ Item{
Component.onCompleted: {
appSettings.terminalFontChanged.connect(handleFontChanged);
appSettings.initializedSettings.connect(startSession);
appSettings.handleFontChanged()
}
}
Component {
id: linuxContextMenu
Menu{
id: contextmenu
MenuItem { action: copyAction }
MenuItem { action: pasteAction }
MenuSeparator { visible: !appSettings.showMenubar }
MenuItem { action: showsettingsAction ; visible: !appSettings.showMenubar}
MenuSeparator { visible: !appSettings.showMenubar }
CRTMainMenuBar { visible: !appSettings.showMenubar }
}
id: shortContextMenu
ShortContextMenu { }
}
Component {
id: osxContextMenu
Menu{
id: contextmenu
MenuItem{action: copyAction}
MenuItem{action: pasteAction}
}
id: fullContextMenu
FullContextMenu { }
}
Loader {
id: menuLoader
sourceComponent: (Qt.platform.os === "osx" ? osxContextMenu : linuxContextMenu)
sourceComponent: (appSettings.isMacOS || appSettings.showMenubar ? shortContextMenu : fullContextMenu)
}
property alias contextmenu: menuLoader.item
MouseArea {
property real margin: appSettings.margin
property real margin: appSettings.totalMargin
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
anchors.fill: parent
@ -213,8 +251,8 @@ Item{
var cc = Qt.size(0.5 - x, 0.5 - y);
var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
return Qt.point((x - cc.width * (1+distortion) * distortion) * kterminal.totalWidth,
(y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight)
return Qt.point((x - cc.width * (1+distortion) * distortion) * (kterminal.totalWidth),
(y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight))
}
}
ShaderEffectSource{
@ -227,7 +265,22 @@ Item{
sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight)
}
Item {
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
}
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,20 +17,18 @@
* 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.Controls 2.0
import QtQuick.Layouts 1.1
import QtQml 2.0
import "Components"
Tab{
ColumnLayout {
anchors.fill: parent
GroupBox {
Layout.fillWidth: true
title: qsTr("Command")
ColumnLayout {
anchors.fill: parent
CheckBox {
@ -54,9 +52,10 @@ Tab{
// Save text even if user forgets to press enter or unfocus
function saveSetting() {
appSettings.customCommand = text;
appSettings.customCommand = text
}
Component.onCompleted: settings_window.closing.connect(saveSetting)
Component.onCompleted: settings_window.closing.connect(
saveSetting)
}
}
}
@ -66,73 +65,94 @@ Tab{
Layout.fillWidth: true
GridLayout {
anchors.fill: parent
rows: 2
columns: 3
columns: 4
Label{text: qsTr("Effects FPS")}
Label {
text: qsTr("Effects FPS")
}
Slider {
Layout.fillWidth: true
Layout.columnSpan: 2
id: fpsSlider
onValueChanged: {
if (enabled) {
appSettings.fps = value !== 60 ? value + 1 : 0;
appSettings.fps = value !== 60 ? value + 1 : 0
}
}
stepSize: 1
enabled: false
Component.onCompleted: {
minimumValue = 0;
maximumValue = 60;
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60;
enabled = true;
from = 0
to = 60
value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60
enabled = true
}
}
SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")}
Label{text: qsTr("Texture Quality")}
SizedLabel {
text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")
}
Label {
text: qsTr("Texture Quality")
}
Slider {
Layout.fillWidth: true
id: txtslider
onValueChanged: if (enabled) appSettings.windowScaling = value;
Layout.fillWidth: true
Layout.columnSpan: 2
onValueChanged: if (enabled)
appSettings.windowScaling = value
stepSize: 0.05
enabled: false
Component.onCompleted: {
minimumValue = 0.25 //Without this value gets set to 0.5
value = appSettings.windowScaling;
enabled = true;
from = 0.25 //Without this value gets set to 0.5
value = appSettings.windowScaling
enabled = true
}
}
SizedLabel{text: Math.round(txtslider.value * 100) + "%"}
SizedLabel {
text: Math.round(txtslider.value * 100) + "%"
}
Label{text: qsTr("Bloom Quality")}
Label {
text: qsTr("Bloom Quality")
}
Slider {
Layout.fillWidth: true
Layout.columnSpan: 2
id: bloomSlider
onValueChanged: if (enabled) appSettings.bloomQuality = value;
onValueChanged: if (enabled)
appSettings.bloomQuality = value
stepSize: 0.05
enabled: false
Component.onCompleted: {
minimumValue = 0.25
value = appSettings.bloomQuality;
enabled = true;
from = 0.25
value = appSettings.bloomQuality
enabled = true
}
}
SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"}
SizedLabel {
text: Math.round(bloomSlider.value * 100) + "%"
}
Label{text: qsTr("BurnIn Quality")}
Label {
text: qsTr("BurnIn Quality")
}
Slider {
Layout.fillWidth: true
id: burnInSlider
onValueChanged: if (enabled) appSettings.burnInQuality = value;
Layout.columnSpan: 2
onValueChanged: if (enabled)
appSettings.burnInQuality = value
stepSize: 0.05
enabled: false
Component.onCompleted: {
minimumValue = 0.25
value = appSettings.burnInQuality;
enabled = true;
from = 0.25
value = appSettings.burnInQuality
enabled = true
}
}
SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"}
SizedLabel {
text: Math.round(burnInSlider.value * 100) + "%"
}
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,14 +17,11 @@
* 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.Controls 2.0
import QtQuick.Layouts 1.1
Tab{
ColumnLayout {
anchors.fill: parent
spacing: 2
GroupBox {
@ -56,35 +53,34 @@ Tab{
}
CheckableSlider {
name: qsTr("Glow Line")
onNewValue: appSettings.glowingLine = newValue;
onNewValue: appSettings.glowingLine = newValue
value: appSettings.glowingLine
}
CheckableSlider {
name: qsTr("Screen Curvature")
onNewValue: appSettings.screenCurvature = newValue;
value: appSettings.screenCurvature;
onNewValue: appSettings.screenCurvature = newValue
value: appSettings.screenCurvature
}
CheckableSlider {
name: qsTr("Ambient Light")
onNewValue: appSettings.ambientLight = newValue;
onNewValue: appSettings.ambientLight = newValue
value: appSettings.ambientLight
enabled: appSettings.framesIndex !== 0
}
CheckableSlider {
name: qsTr("Flickering")
onNewValue: appSettings.flickering = newValue;
value: appSettings.flickering;
onNewValue: appSettings.flickering = newValue
value: appSettings.flickering
}
CheckableSlider {
name: qsTr("Horizontal Sync")
onNewValue: appSettings.horizontalSync = newValue;
value: appSettings.horizontalSync;
onNewValue: appSettings.horizontalSync = newValue
value: appSettings.horizontalSync
}
CheckableSlider {
name: qsTr("RGB Shift")
onNewValue: appSettings.rbgShift = newValue;
value: appSettings.rbgShift;
}
onNewValue: appSettings.rbgShift = newValue
value: appSettings.rbgShift
}
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,34 +17,36 @@
* 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.Controls 2.4
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
Tab{
ColumnLayout {
anchors.fill: parent
GroupBox {
Layout.fillWidth: true
Layout.fillHeight: true
title: qsTr("Profile")
RowLayout {
anchors.fill: parent
TableView {
ListView {
id: profilesView
Layout.fillWidth: true
Layout.fillHeight: true
model: appSettings.profilesList
headerVisible: false
TableViewColumn {
title: qsTr("Profile")
role: "text"
width: parent.width * 0.5
clip: true
delegate: Rectangle {
width: label.width
height: label.height
color: (index == profilesView.currentIndex) ? palette.highlight : palette.base
Label {
id: label
text: appSettings.profilesList.get(index).text
MouseArea {
anchors.fill: parent
onClicked: profilesView.currentIndex = index
onDoubleClicked: appSettings.loadProfile(index)
}
}
onActivated: {
appSettings.loadProfile(row);
}
}
ColumnLayout {
@ -54,34 +56,35 @@ Tab{
Layout.fillWidth: true
text: qsTr("Save")
onClicked: {
insertname.profileName = "";
insertname.profileName = ""
insertname.show()
}
}
Button {
Layout.fillWidth: true
property alias currentIndex: profilesView.currentRow
property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0
text: qsTr("Load")
onClicked: {
var index = profilesView.currentRow;
var index = currentIndex
if (index >= 0)
appSettings.loadProfile(index);
appSettings.loadProfile(index)
}
}
Button {
Layout.fillWidth: true
text: qsTr("Remove")
property alias currentIndex: profilesView.currentRow
property alias currentIndex: profilesView.currentIndex
enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
enabled: currentIndex >= 0 && !appSettings.profilesList.get(
currentIndex).builtin
onClicked: {
appSettings.profilesList.remove(currentIndex);
profilesView.selection.clear();
appSettings.profilesList.remove(currentIndex)
profilesView.selection.clear()
// TODO This is a very ugly workaround. The view didn't update on Qt 5.3.2.
profilesView.model = 0;
profilesView.model = appSettings.profilesList;
profilesView.model = 0
profilesView.model = appSettings.profilesList
}
}
Item {
@ -92,70 +95,84 @@ Tab{
Layout.fillWidth: true
text: qsTr("Import")
onClicked: {
fileDialog.selectExisting = true;
fileDialog.callBack = function (url) {loadFile(url);};
fileDialog.open();
fileDialog.selectExisting = true
fileDialog.callBack = function (url) {
loadFile(url)
}
fileDialog.open()
}
function loadFile(url) {
try {
if (appSettings.verbose)
console.log("Loading file: " + url);
console.log("Loading file: " + url)
var profileObject = JSON.parse(fileIO.read(url));
var name = profileObject.name;
var profileObject = JSON.parse(fileIO.read(url))
var name = profileObject.name
if (!name)
throw "Profile doesn't have a name";
throw "Profile doesn't have a name"
var version = profileObject.version !== undefined ? profileObject.version : 1;
var version = profileObject.version
!== undefined ? profileObject.version : 1
if (version !== appSettings.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
appSettings.appendCustomProfile(name, JSON.stringify(profileObject));
appSettings.appendCustomProfile(name,
JSON.stringify(
profileObject))
} catch (err) {
messageDialog.text = qsTr(err)
messageDialog.open();
messageDialog.open()
}
}
}
Button {
property alias currentIndex: profilesView.currentRow
property alias currentIndex: profilesView.currentIndex
Layout.fillWidth: true
text: qsTr("Export")
enabled: currentIndex >= 0 && !appSettings.profilesList.get(currentIndex).builtin
enabled: currentIndex >= 0 && !appSettings.profilesList.get(
currentIndex).builtin
onClicked: {
fileDialog.selectExisting = false;
fileDialog.callBack = function (url) {storeFile(url);};
fileDialog.open();
fileDialog.selectExisting = false
fileDialog.callBack = function (url) {
storeFile(url)
}
fileDialog.open()
}
function storeFile(url) {
try {
var urlString = url.toString();
var urlString = url.toString()
// Fix the extension if it's missing.
var extension = urlString.substring(urlString.length - 5, urlString.length);
var urlTail = (extension === ".json" ? "" : ".json");
url += urlTail;
var extension = urlString.substring(
urlString.length - 5, urlString.length)
var urlTail = (extension === ".json" ? "" : ".json")
url += urlTail
if (true)
console.log("Storing file: " + url);
console.log("Storing file: " + url)
var profileObject = appSettings.profilesList.get(currentIndex);
var profileSettings = JSON.parse(profileObject.obj_string);
profileSettings["name"] = profileObject.text;
profileSettings["version"] = appSettings.profileVersion;
var profileObject = appSettings.profilesList.get(
currentIndex)
var profileSettings = JSON.parse(
profileObject.obj_string)
profileSettings["name"] = profileObject.text
profileSettings["version"] = appSettings.profileVersion
var result = fileIO.write(url, JSON.stringify(profileSettings, undefined, 2));
var result = fileIO.write(url, JSON.stringify(
profileSettings,
undefined, 2))
if (!result)
throw "The file could not be written.";
throw "The file could not be written."
} catch (err) {
console.log(err);
messageDialog.text = qsTr("There has been an error storing the file.")
messageDialog.open();
console.log(err)
messageDialog.text = qsTr(
"There has been an error storing the file.")
messageDialog.open()
}
}
}
@ -169,25 +186,42 @@ Tab{
GridLayout {
anchors.fill: parent
columns: 2
Label{ text: qsTr("Brightness") }
Label {
text: qsTr("Brightness")
}
SimpleSlider {
onValueChanged: appSettings.brightness = value
value: appSettings.brightness
}
Label{ text: qsTr("Contrast") }
Label {
text: qsTr("Contrast")
}
SimpleSlider {
onValueChanged: appSettings.contrast = value
value: appSettings.contrast
}
Label{ text: qsTr("Margin") }
Label {
text: qsTr("Margin")
}
SimpleSlider {
onValueChanged: appSettings._margin = value
value: appSettings._margin
}
Label{ text: qsTr("Opacity") }
Label {
text: qsTr("Frame size")
}
SimpleSlider {
onValueChanged: appSettings._frameMargin = value
value: appSettings._frameMargin
}
Label {
text: qsTr("Opacity")
visible: !appSettings.isMacOS
}
SimpleSlider {
onValueChanged: appSettings.windowOpacity = value
value: appSettings.windowOpacity
visible: !appSettings.isMacOS
}
}
}
@ -196,14 +230,15 @@ Tab{
InsertNameDialog {
id: insertname
onNameSelected: {
appSettings.appendCustomProfile(name, appSettings.composeProfileString());
appSettings.appendCustomProfile(name,
appSettings.composeProfileString())
}
}
MessageDialog {
id: messageDialog
title: qsTr("File Error")
onAccepted: {
messageDialog.close();
messageDialog.close()
}
}
Loader {
@ -216,19 +251,18 @@ Tab{
selectMultiple: false
selectFolder: false
selectExisting: fileDialog.selectExisting
onAccepted: callBack(fileUrl);
onAccepted: callBack(fileUrl)
}
onSelectExistingChanged: reload()
function open() {
item.open();
item.open()
}
function reload() {
active = false;
active = true;
}
active = false
active = true
}
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,16 +17,14 @@
* 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.Controls 2.1
import QtQuick.Layouts 1.1
import QtQml 2.0
import "Components"
Tab{
ColumnLayout {
anchors.fill: parent
GroupBox {
title: qsTr("Font")
@ -34,79 +32,80 @@ Tab{
GridLayout {
anchors.fill: parent
columns: 2
Label { text: qsTr("Rasterization") }
Label {
text: qsTr("Rasterization")
}
ComboBox {
id: rasterizationBox
property string selectedElement: model[currentIndex]
Layout.fillWidth: true
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels"), qsTr("Sub-Pixels")]
currentIndex: appSettings.rasterization
onCurrentIndexChanged: {
appSettings.rasterization = currentIndex
}
}
Label{ text: qsTr("Name") }
Label {
text: qsTr("Name")
}
ComboBox {
id: fontChanger
Layout.fillWidth: true
model: appSettings.fontlist
textRole: "text"
onActivated: {
var name = appSettings.fontlist.get(index).name;
appSettings.fontNames[appSettings.rasterization] = name;
appSettings.handleFontChanged();
var name = appSettings.fontlist.get(index).name
appSettings.fontNames[appSettings.rasterization] = name
appSettings.handleFontChanged()
}
function updateIndex() {
var name = appSettings.fontNames[appSettings.rasterization];
var index = appSettings.getIndexByName(name);
var name = appSettings.fontNames[appSettings.rasterization]
var index = appSettings.getIndexByName(name)
if (index !== undefined)
currentIndex = index;
currentIndex = index
}
Connections {
target: appSettings
onTerminalFontChanged: fontChanger.updateIndex();
onTerminalFontChanged: {
fontChanger.updateIndex()
}
Component.onCompleted: updateIndex();
}
Label{ text: qsTr("Scaling") }
Component.onCompleted: updateIndex()
}
Label {
text: qsTr("Scaling")
}
RowLayout {
Layout.fillWidth: true
Slider {
Layout.fillWidth: true
id: fontScalingChanger
onValueChanged: if(enabled) appSettings.fontScaling = value
onValueChanged: appSettings.fontScaling = value
value: appSettings.fontScaling
stepSize: 0.05
enabled: false // Another trick to fix initial bad behavior.
Component.onCompleted: {
minimumValue = appSettings.minimumFontScaling;
maximumValue = appSettings.maximumFontScaling;
value = appSettings.fontScaling;
enabled = true;
}
Connections{
target: appSettings
onFontScalingChanged: fontScalingChanger.value = appSettings.fontScaling;
}
from: appSettings.minimumFontScaling
to: appSettings.maximumFontScaling
}
SizedLabel {
text: Math.round(fontScalingChanger.value * 100) + "%"
}
}
Label{ text: qsTr("Font Width") }
Label {
text: qsTr("Font Width")
}
RowLayout {
Layout.fillWidth: true
Slider {
Layout.fillWidth: true
id: widthChanger
onValueChanged: appSettings.fontWidth = value;
onValueChanged: appSettings.fontWidth = value
value: appSettings.fontWidth
stepSize: 0.05
Component.onCompleted: {
// This is needed to avoid unnecessary chnaged events.
minimumValue = 0.5;
maximumValue = 1.5;
}
from: 0.5
to: 1.5
}
SizedLabel {
text: Math.round(widthChanger.value * 100) + "%"
@ -114,6 +113,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 {
title: qsTr("Colors")
Layout.fillWidth: true
@ -132,6 +149,11 @@ Tab{
value: appSettings.saturationColor
enabled: appSettings.chromaColor !== 0
}
CheckableSlider {
name: qsTr("Frame Gloss")
onNewValue: appSettings.frameGloss = newValue
value: appSettings.frameGloss
}
}
RowLayout {
Layout.fillWidth: true
@ -139,16 +161,22 @@ Tab{
name: qsTr("Font")
height: 50
Layout.fillWidth: true
onColorSelected: appSettings._fontColor = color;
onColorSelected: appSettings._fontColor = color
color: appSettings._fontColor
}
ColorButton {
name: qsTr("Background")
height: 50
Layout.fillWidth: true
onColorSelected: appSettings._backgroundColor = color;
onColorSelected: appSettings._backgroundColor = color
color: appSettings._backgroundColor
}
ColorButton {
name: qsTr("Frame")
height: 50
Layout.fillWidth: true
onColorSelected: appSettings._frameColor = color
color: appSettings._frameColor
}
}
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -19,46 +19,57 @@
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls 2.1
import QtQuick.Window 2.1
import QtQuick.Layouts 1.1
import QtQuick.Layouts 1.3
import QtQuick.Dialogs 1.1
Window {
id: settings_window
title: qsTr("Settings")
width: 580
height: 400
width: 640
height: 640
property int tabmargins: 15
TabView{
id: tabView
Item {
anchors { fill: parent; margins: tabmargins }
TabBar {
id: bar
anchors { left: parent.left; right: parent.right; top: parent.top; }
TabButton {
text: qsTr("General")
}
TabButton {
text: qsTr("Terminal")
}
TabButton {
text: qsTr("Effects")
}
TabButton {
text: qsTr("Advanced")
}
}
Frame {
anchors {
top: bar.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
StackLayout {
anchors.fill: parent
anchors.margins: 10
SettingsGeneralTab {
id: generalTab
title: qsTr("General")
anchors.fill: parent
anchors.margins: tabmargins
}
SettingsTerminalTab {
id: terminalTab
title: qsTr("Terminal")
anchors.fill: parent
anchors.margins: tabmargins
}
SettingsEffectsTab {
id: effectsTab
title: qsTr("Effects")
anchors.fill: parent
anchors.margins: tabmargins
}
SettingsAdvancedTab {
id: performanceTab
title: qsTr("Advanced")
anchors.fill: parent
anchors.margins: tabmargins
currentIndex: bar.currentIndex
SettingsGeneralTab { }
SettingsTerminalTab { }
SettingsEffectsTab { }
SettingsAdvancedTab { }
}
}
}
}

91
app/qml/ShaderLibrary.qml Normal file
View File

@ -0,0 +1,91 @@
import QtQuick 2.0
QtObject {
property string rasterizationShader:
(appSettings.rasterization === appSettings.no_rasterization ? "
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
return texel;
}" : "") +
(appSettings.rasterization === appSettings.scanline_rasterization ? "
#define INTENSITY 0.30
#define BRIGHTBOOST 0.30
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
lowp float mask = 1.0 - abs(coords.y);
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
return mix(texel, rasterizationColor, intensity);
}" : "") +
(appSettings.rasterization === appSettings.pixel_rasterization ? "
#define INTENSITY 0.30
#define BRIGHTBOOST 0.30
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
lowp vec3 result = texel;
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel;
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel;
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
coords = coords * coords;
lowp float mask = 1.0 - coords.x - coords.y;
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
return mix(texel, rasterizationColor, intensity);
}" : "") +
(appSettings.rasterization === appSettings.subpixel_rasterization ? "
#define INTENSITY 0.30
#define BRIGHTBOOST 0.30
#define SUBPIXELS 3.0
const vec3 offsets = vec3(3.141592654) * vec3(1.0/2.0,1.0/2.0 - 2.0/3.0,1.0/2.0-4.0/3.0);
lowp vec3 applyRasterization(vec2 screenCoords, lowp vec3 texel, vec2 virtualResolution, float intensity) {
vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualResolution;
vec2 angle = screenCoords * omega;
vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0);
lowp vec3 result = texel * xfactors;
lowp vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result;
lowp vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * result)) * result;
vec2 coords = fract(screenCoords * virtualResolution) * 2.0 - vec2(1.0);
lowp float mask = 1.0 - abs(coords.y);
lowp vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask);
return mix(texel, rasterizationColor, intensity);
}" : "") +
"\n\n"
property string min2: "
float min2(vec2 v) {
return min(v.x, v.y);
}\n\n"
property string rgb2grey: "
float rgb2grey(vec3 v) {
return dot(v, vec3(0.21, 0.72, 0.04));
}\n\n"
property string max2: "
float max2(vec2 v) {
return max(v.x, v.y);
}\n\n"
property string prod2: "
float prod2(vec2 v) {
return v.x * v.y;
}\n\n"
property string sum2: "
float sum2(vec2 v) {
return v.x + v.y;
}\n\n"
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -37,11 +37,21 @@ Item {
property real ambientLight: appSettings.ambientLight * 0.2
property size virtual_resolution
property real frameGloss: appSettings.frameGloss
property size virtualResolution
property size screenResolution
property real _screenDensity: Math.min(
screenResolution.width / virtualResolution.width,
screenResolution.height / virtualResolution.height
)
ShaderEffect {
id: dynamicShader
property ShaderLibrary shaderLibrary: ShaderLibrary { }
property ShaderEffectSource screenBuffer: frameBuffer
property ShaderEffectSource burnInSource: burnInEffect.source
property ShaderEffectSource frameSource: terminalFrameLoader.item
@ -51,22 +61,32 @@ Item {
property real screenCurvature: parent.screenCurvature
property real chromaColor: parent.chromaColor
property real ambientLight: parent.ambientLight
property real frameGloss: parent.frameGloss
property real flickering: appSettings.flickering
property real horizontalSync: appSettings.horizontalSync
property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync)
property real glowingLine: appSettings.glowingLine * 0.2
// Fast burnin properties
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 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))
property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
property size virtual_resolution: parent.virtual_resolution
property size virtualResolution: parent.virtualResolution
// Rasterization might display oversamping issues if virtual resolution is close to physical display resolution.
// We progressively disable rasterization from 4x up to 2x resolution.
property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0
property real time: timeManager.time
property ShaderEffectSource noiseSource: noiseShaderSource
@ -155,8 +175,10 @@ Item {
uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor;
uniform lowp float shadowLength;
uniform lowp float frameGloss;
uniform highp vec2 virtual_resolution;" +
uniform highp vec2 virtualResolution;
uniform lowp float rasterizationIntensity;\n" +
(burnIn !== 0 ? "
uniform sampler2D burnInSource;
@ -164,13 +186,13 @@ Item {
uniform highp float burnInTime;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0)
||(fallBack && (flickering || horizontalSync))) ? "
(((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;
(displayTerminalFrame ? "
uniform lowp sampler2D frameSource;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(glowingLine !== 0 ? "
uniform highp float glowingLine;" : "") +
(chromaColor !== 0 ? "
@ -193,17 +215,14 @@ Item {
(glowingLine !== 0 ? "
float randomPass(vec2 coords){
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015)));
}" : "") +
"float min2(vec2 v) {
return min(v.x, v.y);
}
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}
shaderLibrary.min2 +
shaderLibrary.rgb2grey +
shaderLibrary.rasterizationShader +
"
float isInScreen(vec2 v) {
return min2(step(0.0, v) - step(1.0, v));
}
@ -228,6 +247,17 @@ Item {
" 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() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
"float distance = length(cc);" +
@ -266,7 +296,11 @@ Item {
: "") +
(jitter !== 0 || staticNoise !== 0 ?
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
"vec4 noiseTexel = texture2D(
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 ? "
@ -281,7 +315,7 @@ Item {
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
(glowingLine !== 0 ? "
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
color += randomPass(coords * virtualResolution) * glowingLine;" : "") +
"vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" +
@ -294,6 +328,8 @@ Item {
"txt_color += fontColor.rgb * vec3(color);" +
"txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
"vec3 finalColor = txt_color;" +
(flickering !== 0 ? "
@ -302,9 +338,9 @@ Item {
(ambientLight !== 0 ? "
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
(screenCurvature !== 0 ?
(displayTerminalFrame ?
"vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
finalColor = mix(finalColor, frameColor.rgb + (finalColor*frameGloss), frameColor.a);"
: "") +
"gl_FragColor = vec4(finalColor, qt_Opacity);" +
@ -325,7 +361,7 @@ Item {
Loader {
id: terminalFrameLoader
active: screenCurvature !== 0
active: dynamicShader.displayTerminalFrame
width: staticShader.width
height: staticShader.height
@ -337,7 +373,7 @@ Item {
visible: false
format: ShaderEffectSource.RGBA
NewTerminalFrame {
TerminalFrame {
id: terminalFrame
blending: false
anchors.fill: parent
@ -345,6 +381,10 @@ Item {
}
}
ShaderLibrary {
id: shaderLibrary
}
ShaderEffect {
id: staticShader
@ -370,7 +410,7 @@ Item {
property real ambientLight: parent.ambientLight
property size virtual_resolution: parent.virtual_resolution
property size virtualResolution: parent.virtualResolution
blending: false
visible: false
@ -393,7 +433,7 @@ Item {
uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness;
uniform highp vec2 virtual_resolution;" +
uniform highp vec2 virtualResolution;" +
(bloom !== 0 ? "
uniform highp sampler2D bloomSource;
@ -411,36 +451,9 @@ Item {
(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));
}" +
shaderLibrary.min2 +
shaderLibrary.sum2 +
shaderLibrary.rgb2grey +
"vec3 convertWithChroma(vec3 inColor) {
vec3 outColor = inColor;" +
@ -453,6 +466,7 @@ Item {
" return outColor;
}" +
shaderLibrary.rasterizationShader +
"void main() {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
@ -475,14 +489,12 @@ Item {
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(0.0, 1.0, reflectionMask);"
reflectionMask = clamp(reflectionMask, 0.0, 1.0);"
:
"float reflectionMask = 1.0;") +

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,9 +17,8 @@
* 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.Controls 2.0
import QtQuick.Layouts 1.1
import "Components"
@ -27,8 +26,8 @@ import "Components"
RowLayout {
property alias value: slider.value
property alias stepSize: slider.stepSize
property alias minimumValue: slider.minimumValue
property alias maximumValue: slider.maximumValue
property alias minimumValue: slider.from
property alias maximumValue: slider.to
property real maxMultiplier: 100
id: setting_component

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,12 +17,12 @@
* 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
Rectangle {
property size terminalSize
property real topOpacity: 0.6
width: textSize.width * 2
height: textSize.height * 2
radius: 5
@ -31,7 +31,11 @@ Rectangle{
color: "black"
opacity: sizetimer.running ? 0.6 : 0.0
Behavior on opacity{NumberAnimation{duration: 200}}
Behavior on opacity {
NumberAnimation {
duration: 200
}
}
onTerminalSizeChanged: sizetimer.restart()

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -27,7 +27,7 @@ QtObject {
property bool initialized: false
function getDatabase() {
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000);
return LocalStorage.openDatabaseSync("coolretroterm" + dbMajorVersion, dbMinorVersion, "StorageDatabase", 100000)
}
function initialize() {
@ -35,9 +35,10 @@ QtObject {
db.transaction(
function(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
});
}
)
initialized = true;
initialized = true
}
function setSetting(setting, value) {
@ -45,7 +46,8 @@ QtObject {
var db = getDatabase();
var res = "";
db.transaction(function(tx) {
db.transaction(
function(tx) {
var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
//console.log(rs.rowsAffected)
if (rs.rowsAffected > 0) {
@ -54,23 +56,25 @@ QtObject {
res = "Error";
}
}
);
)
// The function returns OK if it was successful, or Error if it wasn't
return res;
return res
}
function getSetting(setting) {
if(!initialized) initialize();
var db = getDatabase();
var res = "";
db.transaction(function(tx) {
db.transaction(
function(tx) {
var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
if (rs.rows.length > 0) {
res = rs.rows.item(0).value;
} else {
res = undefined;
}
})
}
)
return res
}
@ -79,6 +83,7 @@ QtObject {
db.transaction(
function(tx) {
tx.executeSql('DROP TABLE settings');
});
}
)
}
}

View File

@ -1,3 +1,22 @@
/*******************************************************************************
* 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
import QtGraphicalEffects 1.0
@ -7,12 +26,18 @@ ShaderTerminal {
property alias title: terminal.title
property alias terminalSize: terminal.terminalSize
property real devicePixelRatio: terminalWindow.screen.devicePixelRatio
id: mainShader
opacity: appSettings.windowOpacity * 0.3 + 0.7
source: terminal.mainSource
burnInEffect: terminal.burnInEffect
virtual_resolution: terminal.virtualResolution
virtualResolution: terminal.virtualResolution
screenResolution: Qt.size(
terminalWindow.width * devicePixelRatio * appSettings.windowScaling,
terminalWindow.height * devicePixelRatio * appSettings.windowScaling
)
TimeManager {
id: timeManager
@ -25,7 +50,6 @@ ShaderTerminal {
}
// EFFECTS ////////////////////////////////////////////////////////////////
Loader {
id: bloomEffectLoader
active: appSettings.bloom
@ -34,7 +58,7 @@ ShaderTerminal {
height: parent.height * appSettings.bloomQuality
sourceComponent: FastBlur {
radius: Utils.lint(16, 64, appSettings.bloomQuality);
radius: Utils.lint(16, 64, appSettings.bloomQuality)
source: terminal.mainSource
transparentBorder: true
}
@ -53,71 +77,4 @@ ShaderTerminal {
}
bloomSource: bloomSourceLoader.item
// NewTerminalFrame {
// id: terminalFrame
// anchors.fill: parent
// blending: true
// }
// 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
// we need to store another fullScreen channel this might be handy.
// ShaderEffect {
// id: rasterizationEffect
// width: parent.width
// height: parent.height
// property real outColor: 0.0
// property real dispX: (5 / width) * appSettings.windowScaling
// property real dispY: (5 / height) * appSettings.windowScaling
// property size virtual_resolution: terminal.virtualResolution
// blending: false
// fragmentShader:
// "uniform lowp float qt_Opacity;" +
// "varying highp vec2 qt_TexCoord0;
// uniform highp vec2 virtual_resolution;
// uniform highp float dispX;
// uniform highp float dispY;
// uniform mediump float outColor;
// highp float getScanlineIntensity(vec2 coords) {
// highp float result = 1.0;" +
// (appSettings.rasterization != appSettings.no_rasterization ?
// "result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
// (appSettings.rasterization == appSettings.pixel_rasterization ?
// "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
// return result;
// }" +
// "void main() {" +
// "highp float color = getScanlineIntensity(qt_TexCoord0);" +
// "float distance = length(vec2(0.5) - qt_TexCoord0);" +
// "color = mix(color, 0.0, 1.2 * distance * distance);" +
// "color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" +
// "color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" +
// "color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" +
// "color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" +
// "gl_FragColor.a = color;" +
// "}"
// onStatusChanged: if (log) console.log(log) //Print warning messages
// }
// rasterizationSource: ShaderEffectSource{
// id: rasterizationEffectSource
// sourceItem: rasterizationEffect
// hideSource: true
// smooth: true
// wrapMode: ShaderEffectSource.ClampToEdge
// visible: false
// }
}

104
app/qml/TerminalFrame.qml Normal file
View File

@ -0,0 +1,104 @@
/*******************************************************************************
* 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
ShaderEffect {
property color _frameColor: appSettings.frameColor
property color _backgroundColor: appSettings.backgroundColor
property color _fontColor: appSettings.fontColor
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
property real _ambientLight: Utils.lint(0.2, 0.8, appSettings.ambientLight)
property color frameColor: Utils.mix(_frameColor, _lightColor, _ambientLight)
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
// Coefficient of the log curve used to approximate shadowing
property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
property size margin: Qt.size(
appSettings.frameMargin / width * appSettings.windowScaling,
appSettings.frameMargin / height * appSettings.windowScaling
)
ShaderLibrary {
id: shaderLibrary
}
fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
uniform lowp float screenCurvature;
uniform lowp float screenShadowCoeff;
uniform lowp float frameShadowCoeff;
uniform highp float qt_Opacity;
uniform lowp vec4 frameColor;
uniform mediump vec2 margin;
varying highp vec2 qt_TexCoord0;
vec2 distortCoordinates(vec2 coords){
vec2 cc = (coords - vec2(0.5));
float dist = dot(cc, cc) * screenCurvature;
return (coords + cc * (1.0 + dist) * dist);
}
" +
shaderLibrary.max2 +
shaderLibrary.min2 +
shaderLibrary.prod2 +
shaderLibrary.sum2 +
"
vec2 positiveLog(vec2 x) {
return clamp(log(x), vec2(0.0), vec2(100.0));
}
void main() {
vec2 staticCoords = qt_TexCoord0;
vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin;
vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx);
float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25);
vec3 color = frameColor.rgb * vec3(1.0 - vignette);
float alpha = 0.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);
color *= frameShadow;
alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords));
alpha = clamp(alpha, 0.0, 1.0);
alpha *= mix(1.0, 0.9, frameShadow);
float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0)));
alpha = max(0.8 * screenShadow, alpha);
gl_FragColor = vec4(color * alpha, alpha);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,7 +17,6 @@
* 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
Timer {

Binary file not shown.

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* Copyright (c) 2013-2021 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
@ -17,11 +17,11 @@
* 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.Window 2.1
import QtQuick.Controls 1.1
import QtGraphicalEffects 1.0
import QtQuick.Controls 2.3
import "menus"
ApplicationWindow {
id: terminalWindow
@ -37,8 +37,6 @@ ApplicationWindow{
// Load saved window geometry and show the window
Component.onCompleted: {
appSettings.handleFontChanged();
x = appSettings.x
y = appSettings.y
width = appSettings.width
@ -55,22 +53,30 @@ ApplicationWindow{
property bool fullscreen: appSettings.fullscreen
onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
//Workaround: Without __contentItem a ugly thin border is visible.
menuBar: CRTMainMenuBar{
id: mainMenu
visible: (Qt.platform.os === "osx" || appSettings.showMenubar)
__contentItem.visible: mainMenu.visible
menuBar: qtquickMenuLoader.item
Loader {
id: qtquickMenuLoader
active: !appSettings.isMacOS && appSettings.showMenubar
sourceComponent: WindowMenu { }
}
Loader {
id: globalMenuLoader
active: appSettings.isMacOS
sourceComponent: OSXMenu { }
}
property string wintitle: appSettings.wintitle
color: "#00000000"
title: terminalContainer.title || qsTr(appSettings.wintitle)
Action {
id: showMenubarAction
text: qsTr("Show Menubar")
enabled: Qt.platform.os !== "osx"
enabled: !appSettings.isMacOS
shortcut: "Ctrl+Shift+M"
checkable: true
checked: appSettings.showMenubar
@ -79,9 +85,9 @@ ApplicationWindow{
Action {
id: fullscreenAction
text: qsTr("Fullscreen")
enabled: Qt.platform.os !== "osx"
enabled: !appSettings.isMacOS
shortcut: "Alt+F11"
onTriggered: appSettings.fullscreen = !appSettings.fullscreen;
onTriggered: appSettings.fullscreen = !appSettings.fullscreen
checkable: true
checked: appSettings.fullscreen
}
@ -89,15 +95,15 @@ ApplicationWindow{
id: quitAction
text: qsTr("Quit")
shortcut: "Ctrl+Shift+Q"
onTriggered: Qt.quit();
onTriggered: Qt.quit()
}
Action {
id: showsettingsAction
text: qsTr("Settings")
onTriggered: {
settingswindow.show();
settingswindow.requestActivate();
settingswindow.raise();
settingswindow.show()
settingswindow.requestActivate()
settingswindow.raise()
}
}
Action {
@ -110,25 +116,30 @@ ApplicationWindow{
text: qsTr("Paste")
shortcut: "Ctrl+Shift+V"
}
Action {
id: pasteActionAlt
text: qsTr("Paste selection")
shortcut: "Shift+Insert"
}
Action {
id: zoomIn
text: qsTr("Zoom In")
shortcut: "Ctrl++"
onTriggered: appSettings.incrementScaling();
onTriggered: appSettings.incrementScaling()
}
Action {
id: zoomOut
text: qsTr("Zoom Out")
shortcut: "Ctrl+-"
onTriggered: appSettings.decrementScaling();
onTriggered: appSettings.decrementScaling()
}
Action {
id: showAboutAction
text: qsTr("About")
onTriggered: {
aboutDialog.show();
aboutDialog.requestActivate();
aboutDialog.raise();
aboutDialog.show()
aboutDialog.requestActivate()
aboutDialog.raise()
}
}
ApplicationSettings {
@ -136,7 +147,6 @@ ApplicationWindow{
}
TerminalContainer {
id: terminalContainer
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
width: parent.width
height: (parent.height + Math.abs(y))
}
@ -159,7 +169,7 @@ ApplicationWindow{
onClosing: {
// OSX Since we are currently supporting only one window
// quit the application when it is closed.
if (Qt.platform.os === "osx")
if (appSettings.isMacOS)
Qt.quit()
}
}

View File

@ -0,0 +1,95 @@
/*******************************************************************************
* 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
import QtQuick.Controls 2.3
Menu {
id: contextmenu
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
MenuItem {
action: showsettingsAction
}
MenuSeparator {}
Menu {
title: qsTr("File")
MenuItem {
action: quitAction
}
}
Menu {
title: qsTr("Edit")
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
MenuSeparator {}
MenuItem {
action: showsettingsAction
}
}
Menu {
title: qsTr("View")
MenuItem {
action: fullscreenAction
visible: fullscreenAction.enabled
}
MenuItem {
action: showMenubarAction
visible: showMenubarAction.enabled
}
MenuItem {
action: zoomIn
}
MenuItem {
action: zoomOut
}
}
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 {
action: showAboutAction
}
}
}

89
app/qml/menus/OSXMenu.qml Normal file
View File

@ -0,0 +1,89 @@
/*******************************************************************************
* 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

@ -0,0 +1,31 @@
/*******************************************************************************
* 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
import QtQuick.Controls 2.3
Menu {
id: contextmenu
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
}

View File

@ -0,0 +1,85 @@
/*******************************************************************************
* 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
import QtQuick.Controls 2.3
MenuBar {
id: defaultMenuBar
visible: appSettings.showMenubar
Menu {
title: qsTr("File")
MenuItem {
action: quitAction
}
}
Menu {
title: qsTr("Edit")
MenuItem {
action: copyAction
}
MenuItem {
action: pasteAction
}
MenuSeparator {}
MenuItem {
action: showsettingsAction
}
}
Menu {
title: qsTr("View")
MenuItem {
action: fullscreenAction
visible: fullscreenAction.enabled
}
MenuItem {
action: showMenubarAction
visible: showMenubarAction.enabled
}
MenuItem {
action: zoomIn
}
MenuItem {
action: zoomOut
}
}
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 {
action: showAboutAction
}
}
}

View File

@ -12,7 +12,6 @@
<file>TimeManager.qml</file>
<file>SimpleSlider.qml</file>
<file>ColorButton.qml</file>
<file>Glossy.qml</file>
<file>AboutDialog.qml</file>
<file>InsertNameDialog.qml</file>
<file>SettingsEffectsTab.qml</file>
@ -20,9 +19,8 @@
<file>SettingsTerminalTab.qml</file>
<file>FontScanlines.qml</file>
<file>fonts/1977-apple2/PrintChar21.ttf</file>
<file>fonts/1971-ibm-3278/3270Medium.ttf</file>
<file>fonts/1971-ibm-3278/3270-Regular.ttf</file>
<file>Storage.qml</file>
<file>CRTMainMenuBar.qml</file>
<file>SettingsAdvancedTab.qml</file>
<file>TerminalContainer.qml</file>
<file>images/crt256.png</file>
@ -42,6 +40,11 @@
<file>fonts/1977-commodore-pet/PetMe.ttf</file>
<file>BurnInEffect.qml</file>
<file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
<file>NewTerminalFrame.qml</file>
<file>TerminalFrame.qml</file>
<file>menus/WindowMenu.qml</file>
<file>menus/FullContextMenu.qml</file>
<file>menus/ShortContextMenu.qml</file>
<file>ShaderLibrary.qml</file>
<file>menus/OSXMenu.qml</file>
</qresource>
</RCC>

View File

@ -1,3 +1,23 @@
/*******************************************************************************
* 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/>.
*******************************************************************************/
.pragma library
function clamp(x, min, max) {
if (x <= min)
@ -6,15 +26,23 @@ function clamp(x, min, max) {
return max;
return x;
}
function lint(a, b, t) {
return (1 - t) * a + (t) * b;
}
function mix(c1, c2, alpha) {
return Qt.rgba(c1.r * alpha + c2.r * (1-alpha),
c1.g * alpha + c2.g * (1-alpha),
c1.b * alpha + c2.b * (1-alpha),
c1.a * alpha + c2.a * (1-alpha))
}
function smoothstep(min, max, value) {
let x = Math.max(0, Math.min(1, (value - min) / (max - min)));
return x * x * (3 - 2 * x);
}
function strToColor(s){
var r = parseInt(s.substring(1,3), 16) / 256;
var g = parseInt(s.substring(3,5), 16) / 256;

@ -1 +1 @@
Subproject commit 48274c75660e28d44af7c195e79accdf1bd44963
Subproject commit 63228027e1f97c24abb907550b22ee91836929c5

View File

@ -1,32 +1,46 @@
name: cool-retro-term # check to see if it's available
version: '1.1.0' # this is freakin' awesome
summary: cool-retro-term is a terminal emulator. # 79 char long summary
version: '1.1.1' # this is freakin' awesome
summary: cool-retro-term is a cool and retro terminal emulator. # 79 char long summary
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.
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:
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
plugs:
- unity7
- x11
- desktop
- home
- network
- network-bind
- network-manager
- password-manager-service
- locale-control
- gsettings
- shutdown
- firewall-control
- process-control
- system-observe
environment:
QML2_IMPORT_PATH: $SNAP/usr/lib/x86_64-linux-gnu/qt5/qml
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:
source: https://github.com/Swordfish90/cool-retro-term
source-type: git
@ -44,11 +58,14 @@ parts:
stage-packages:
- qmlscene
- qml-module-qtquick-controls
- qtdeclarative5-qtquick2-plugin
- libqt5qml-graphicaleffects
- qml-module-qtquick2
- qml-module-qtgraphicaleffects
- qml-module-qtquick-dialogs
- qtdeclarative5-localstorage-plugin
- qtdeclarative5-window-plugin
- qml-module-qtquick-localstorage
- qml-module-qtquick-window2
- libgl1-mesa-dev
- qtdeclarative5-dev-tools
- qml-module-qtquick-extras
- qml-module-qt-labs-settings
- qml-module-qt-labs-folderlistmodel