Compare commits
	
		
			109 Commits
		
	
	
		
			new-frame
			...
			Jebiel/pat
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | da7da93ceb | ||
|   | dac2b4ff16 | ||
|   | 2d12b0c747 | ||
|   | 5fe26edaa6 | ||
|   | a736cfd548 | ||
|   | 5af4214daa | ||
|   | 98ef7b329a | ||
|   | b0e1962fa7 | ||
|   | 83684e8882 | ||
|   | 1ed7d077a9 | ||
|   | ba4b36618f | ||
|   | af647a4bad | ||
|   | b719530ef0 | ||
|   | 530d61d67e | ||
|   | 3d76bcb48c | ||
|   | 70ce2f1f3c | ||
|   | 21a190a1aa | ||
|   | a88d222709 | ||
|   | b2defceae5 | ||
|   | 8d7565ffc4 | ||
|   | 9960b25dff | ||
|   | 411c116deb | ||
|   | 64e007f1fd | ||
|   | c62fc365db | ||
|   | e7e630bd5d | ||
|   | 7d77175fbb | ||
|   | f033553972 | ||
|   | ae1ed044ba | ||
|   | 35d601c7a7 | ||
|   | f89aeec374 | ||
|   | 42c3b4b42e | ||
|   | 322fc31396 | ||
|   | 6e4d5cfddd | ||
|   | d81485a8bf | ||
|   | a9260d956c | ||
|   | 025bb560bc | ||
|   | cdd1488e13 | ||
|   | b8b2644969 | ||
|   | 09b5c0a5d0 | ||
|   | 1ed66f3aa2 | ||
|   | 3b4d5d1c3f | ||
|   | f98fd5a7ad | ||
|   | b961109623 | ||
|   | 8f0d1023a4 | ||
|   | 79773ba95c | ||
|   | ff3f02fb8c | ||
|   | 0af2b20b3a | ||
|   | b026fe357e | ||
|   | ade36c013b | ||
|   | 54a6a7f590 | ||
|   | 20728e4a0f | ||
|   | afa456f6b3 | ||
|   | 3fbfb77430 | ||
|   | 051bcb62c6 | ||
|   | d2c57eed6d | ||
|   | f2f38c0e0d | ||
|   | 4046bdbc6a | ||
|   | c83cc206fd | ||
|   | 41ac14fbd3 | ||
|   | e4c1cad1a7 | ||
|   | 863c1ac27a | ||
|   | c85eba617c | ||
|   | dcb7b7c309 | ||
|   | 3cee186663 | ||
|   | 06afe507f6 | ||
|   | 4268d4d770 | ||
|   | d61dae5ab4 | ||
|   | b5f39c1d53 | ||
|   | 767a61b86e | ||
|   | 0d3c0a2233 | ||
|   | 0431103a1d | ||
|   | 633e4e642c | ||
|   | 77dc82a381 | ||
|   | 44a63d4aaa | ||
|   | 5b3297f916 | ||
|   | 41413d4712 | ||
|   | fd2e5ce71e | ||
|   | e9ddd7d3b8 | ||
|   | da6795f002 | ||
|   | f497bb4b44 | ||
|   | 4aea85649f | ||
|   | b9ffae25e3 | ||
|   | db7a7f38f7 | ||
|   | e2c4392c6d | ||
|   | 7e771b1cfc | ||
|   | 4bff6efe97 | ||
|   | c514dc7a24 | ||
|   | 24754edb6a | ||
|   | 79fbb76524 | ||
|   | b85aede966 | ||
|   | c66ca6e44f | ||
|   | a192024fef | ||
|   | 918df9098a | ||
|   | c9271bfa36 | ||
|   | fa162c818b | ||
|   | ff976e3ec2 | ||
|   | 17c5651305 | ||
|   | 7c7b049ba1 | ||
|   | 0823fe8b3d | ||
|   | e787fd0fb5 | ||
|   | 650497bff4 | ||
|   | 2f25bd30b0 | ||
|   | d58157a450 | ||
|   | 9d049bd041 | ||
|   | 988222b711 | ||
|   | f42bd3036f | ||
|   | 297239fb5c | ||
|   | dbd46d44aa | ||
|   | 254f4d6e92 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -18,6 +18,7 @@ | ||||
| *.pro.user.* | ||||
| *.moc | ||||
| moc_*.cpp | ||||
| moc_*.h | ||||
| qrc_*.cpp | ||||
| ui_*.h | ||||
| Makefile* | ||||
|   | ||||
							
								
								
									
										37
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| sudo: required | ||||
| dist: trusty | ||||
| language: c++ | ||||
|  | ||||
| install: | ||||
|   - sudo add-apt-repository -y ppa:beineri/opt-qt58-trusty | ||||
|   - sudo apt-get update -qq | ||||
|   - sudo apt-get -y install build-essential qt58declarative qt58graphicaleffects qt58quickcontrols libgl1-mesa-dev | ||||
|   - source /opt/qt*/bin/qt*-env.sh | ||||
|  | ||||
| script: | ||||
|   - qmake CONFIG+=release PREFIX=/usr | ||||
|   - make -j$(nproc) | ||||
|   - mkdir -p appdir/usr/share/metainfo appdir/usr/bin | ||||
|   - cp packaging/appdata/cool-retro-term.appdata.xml appdir/usr/share/metainfo/ | ||||
|   - cp cool-retro-term appdir/usr/bin/ | ||||
|   - cp ./cool-retro-term.desktop appdir/ | ||||
|   - cp ./app/icons/128x128/cool-retro-term.png appdir/ | ||||
|   - cp -r ./app/qml appdir/usr/ | ||||
|   - cp -r ./qmltermwidget/QMLTermWidget appdir/usr/qml/ # Workaround for https://github.com/probonopd/linuxdeployqt/issues/78 | ||||
|   - wget -c https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage | ||||
|   - chmod a+x linuxdeployqt-*.AppImage  | ||||
|   - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH | ||||
|   - export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file | ||||
|   - ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ # -verbose=3 2>&1 | grep "path:" -C 3 | ||||
|   - ./linuxdeployqt-*.AppImage appdir/usr/bin/cool-retro-term -qmldir=./app/qml/ -qmldir=./qmltermwidget/ -verbose=2 -appimage | ||||
|    | ||||
| after_success: | ||||
|   - find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq | ||||
|   - # curl --upload-file Cool*.AppImage https://transfer.sh/Cool_Retro_Term-git.$(git rev-parse --short HEAD)-x86_64.AppImage | ||||
|   - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh | ||||
|   - bash upload.sh Cool*.AppImage* | ||||
|    | ||||
| branches: | ||||
|   except: | ||||
|     - # Do not build tags that we create when we upload to GitHub Releases | ||||
|     - /^(?i:continuous)/ | ||||
							
								
								
									
										70
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								README.md
									
									
									
									
									
								
							| @@ -12,21 +12,29 @@ It uses the QML port of qtermwidget (Konsole) developed by me: https://github.co | ||||
|  | ||||
| This terminal emulator works under Linux and macOS and requires Qt 5.2 or higher. | ||||
|  | ||||
| Settings such as colors, fonts, and effects can be accessed via context menu. | ||||
|  | ||||
| ## Screenshots | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## 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 | ||||
| Walk the easy way and install cool-retro-term using one of these convenient packages: | ||||
|  | ||||
| Fedora has the `cool-retro-term` in the offcial repositories. All you have to do is `sudo dnf install cool-retro-term`. | ||||
| Just grab the latest AppImage from the release page and make it executable and run it: | ||||
|  | ||||
| Users of openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term). | ||||
|     wget https://github.com/Swordfish90/cool-retro-term/releases/download/1.1.1/Cool-Retro-Term-1.1.1-x86_64.AppImage | ||||
|     chmod a+x Cool-Retro-Term-1.1.1-x86_64.AppImage | ||||
|     ./Cool-Retro-Term-1.1.1-x86_64.AppImage | ||||
|  | ||||
| Arch users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org): | ||||
| **Fedora** has the `cool-retro-term` in the official repositories. All you have to do is `sudo dnf install cool-retro-term`. | ||||
|  | ||||
|     yaourt -S aur/cool-retro-term-git | ||||
| Users of **openSUSE** can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term). | ||||
|  | ||||
| **Arch** users can install this [package](https://aur.archlinux.org/packages/cool-retro-term-git/) directly via the [AUR](https://aur.archlinux.org): | ||||
|  | ||||
|     trizen -S aur/cool-retro-term-git | ||||
|  | ||||
| or use: | ||||
|  | ||||
| @@ -34,25 +42,37 @@ or use: | ||||
|  | ||||
| to install precompiled from community repository. | ||||
|  | ||||
| Gentoo users can now install the second release "1.0.1" from a 3rd-party repository preferably via layman: | ||||
| Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). | ||||
|  | ||||
|     USE="git" emerge app-portage/layman | ||||
|     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 | ||||
| **Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) | ||||
|  | ||||
| The live ebuild (version 9999-r1) tracking the bleeding-edge WIP codebase also remains available. | ||||
| **Solus** users can install using `eopg`: | ||||
| ``` | ||||
| eopkg it cool-retro-term | ||||
| ``` | ||||
|  | ||||
| A word of warning: USE flags and keywords are to be added to portage's configuration files and every emerge operation should be executed with '-p' (short option for --pretend) appended to the command line first as per best practice! | ||||
| **macOS** users can grab the latest dmg from the [release page](https://github.com/Swordfish90/cool-retro-term/releases) or install via Homebrew: | ||||
| ``` | ||||
| brew cask install cool-retro-term | ||||
| ``` | ||||
|  | ||||
| Ubuntu users of 14.04 LTS (Trusty) up to 15.10 (Wily) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). | ||||
| **FreeBSD** users can install cool-retro-term with `pkg`: | ||||
|  | ||||
| Ubuntu 17.10 can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) | ||||
|     pkg install cool-retro-term | ||||
|      | ||||
| macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases | ||||
| ## Build instructions (FreeBSD) | ||||
|  | ||||
| Grab a copy of [the FreeBSD Ports Collection](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html), modify [`/usr/ports/x11/cool-retro-term/Makefile`](https://svnweb.freebsd.org/ports/head/x11/cool-retro-term/Makefile?view=markup) as you like, and then run `make install` to build and install the emulator: | ||||
|  | ||||
| ``` | ||||
| cd /usr/ports/x11/cool-retro-term | ||||
| make install | ||||
| ``` | ||||
|  | ||||
| ## Build instructions (Linux) | ||||
|  | ||||
| Build cool-retro-term yourself, you know, the retro way. | ||||
|  | ||||
| ## Dependencies | ||||
| Make sure to install these first. | ||||
|  | ||||
| @@ -82,6 +102,12 @@ Make sure to install these first. | ||||
|  | ||||
| --- | ||||
|  | ||||
| **snapcraft (most of distros)** | ||||
|  | ||||
|     sudo snap install cool-retro-term --classic | ||||
|  | ||||
| --- | ||||
|  | ||||
| **Debian Jessie and above** | ||||
|  | ||||
|     sudo apt install build-essential qmlscene qt5-qmake qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtgraphicaleffects qml-module-qtquick-dialogs qml-module-qtquick-localstorage qml-module-qtquick-window2 qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel | ||||
| @@ -173,6 +199,12 @@ cp -r qmltermwidget/QMLTermWidget cool-retro-term.app/Contents/PlugIns | ||||
| open cool-retro-term.app | ||||
| ``` | ||||
|  | ||||
| **Homebrew** | ||||
|  | ||||
| ```sh | ||||
| brew install --cask cool-retro-term | ||||
| ``` | ||||
|  | ||||
| ## Donations | ||||
| I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted). | ||||
|  | ||||
|   | ||||
							
								
								
									
										46
									
								
								app/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								app/main.cpp
									
									
									
									
									
								
							| @@ -33,11 +33,37 @@ int main(int argc, char *argv[]) | ||||
|     // This disables QT appmenu under Ubuntu, which is not working with QML apps. | ||||
|     setenv("QT_QPA_PLATFORMTHEME", "", 1); | ||||
|  | ||||
| #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]" << endl; | ||||
|         cout << "  --default-settings  Run cool-retro-term with the default settings" << endl; | ||||
|         cout << "  --workdir <dir>     Change working directory to 'dir'" << endl; | ||||
|         cout << "  -e <cmd>            Command to execute. This option will catch all following arguments, so use it as the last option." << endl; | ||||
|         cout << "  -T <title>          Set window title to 'title'." << endl; | ||||
|         cout << "  --fullscreen        Run cool-retro-term in fullscreen." << endl; | ||||
|         cout << "  -p|--profile <prof> Run cool-retro-term with the given profile." << endl; | ||||
|         cout << "  -h|--help           Print this help." << endl; | ||||
|         cout << "  --verbose           Print additional information such as profiles and settings." << endl; | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     QString appVersion("1.1.1"); | ||||
|  | ||||
|     if (argc>1 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version"))) { | ||||
|         QTextStream cout(stdout, QIODevice::WriteOnly); | ||||
|         cout << "cool-retro-term " << appVersion << endl; | ||||
| 	return 0; | ||||
|     } | ||||
|  | ||||
|     QApplication app(argc, argv); | ||||
|     // set application attributes | ||||
|     // Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293 | ||||
| @@ -55,25 +81,6 @@ int main(int argc, char *argv[]) | ||||
|  | ||||
|     // Manage command line arguments from the cpp side | ||||
|     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 +89,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); | ||||
|  | ||||
|   | ||||
| @@ -24,7 +24,7 @@ import QtQuick.Controls 1.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 //////////////////////////////////////////////////////// | ||||
| @@ -33,6 +33,9 @@ QtObject{ | ||||
|     readonly property real minimumFontScaling: 0.25 | ||||
|     readonly property real maximumFontScaling: 2.50 | ||||
|  | ||||
|     readonly property real minBurnInFadeTime: 160 | ||||
|     readonly property real maxBurnInFadeTime: 1600 | ||||
|  | ||||
|     // GENERAL SETTINGS /////////////////////////////////////////////////////// | ||||
|  | ||||
|     property int x: 100 | ||||
| @@ -48,11 +51,15 @@ QtObject{ | ||||
|     property bool showTerminalSize: true | ||||
|     property real windowScaling: 1.0 | ||||
|  | ||||
|     property real fps: 24 | ||||
|     property real fps: 20 | ||||
|     property bool verbose: false | ||||
|  | ||||
|     property real bloomQuality: 0.5 | ||||
|  | ||||
|     property real burnInQuality: 0.5 | ||||
|     property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true | ||||
|  | ||||
|     property bool blinkingCursor: false | ||||
|  | ||||
|     onWindowScalingChanged: handleFontChanged(); | ||||
|  | ||||
| @@ -73,7 +80,7 @@ QtObject{ | ||||
|     property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3)) | ||||
|  | ||||
|     property real staticNoise: 0.12 | ||||
|     property real screenCurvature: 0.2 | ||||
|     property real screenCurvature: 0.3 | ||||
|     property real glowingLine: 0.2 | ||||
|     property real burnIn: 0.25 | ||||
|     property real bloom: 0.55 | ||||
| @@ -88,6 +95,9 @@ QtObject{ | ||||
|  | ||||
|     property real rbgShift: 0.0 | ||||
|  | ||||
|     property real _margin: 0.5 | ||||
|     property real margin: Utils.lint(1.0, 20.0, _margin) | ||||
|  | ||||
|     readonly property int no_rasterization: 0 | ||||
|     readonly property int scanline_rasterization: 1 | ||||
|     readonly property int pixel_rasterization: 2 | ||||
| @@ -126,7 +136,7 @@ QtObject{ | ||||
|  | ||||
|     property FontLoader fontLoader: FontLoader { } | ||||
|  | ||||
|     onFontScalingChanged: handleFontChanged(); | ||||
|     onTotalFontScalingChanged: handleFontChanged(); | ||||
|     onFontWidthChanged: handleFontChanged(); | ||||
|  | ||||
|     function getIndexByName(name) { | ||||
| @@ -155,7 +165,7 @@ QtObject{ | ||||
|         if (index === undefined) return; | ||||
|  | ||||
|         fontManager.item.selectedFontIndex = index; | ||||
|         fontManager.item.scaling = totalFontScaling * windowScaling; | ||||
|         fontManager.item.scaling = totalFontScaling; | ||||
|  | ||||
|         var fontSource = fontManager.item.source; | ||||
|         var pixelSize = fontManager.item.pixelSize; | ||||
| @@ -199,7 +209,9 @@ QtObject{ | ||||
|             bloomQuality: bloomQuality, | ||||
|             burnInQuality: burnInQuality, | ||||
|             useCustomCommand: useCustomCommand, | ||||
|             customCommand: customCommand | ||||
|             customCommand: customCommand, | ||||
|             useFastBurnIn: useFastBurnIn, | ||||
|             blinkingCursor: blinkingCursor | ||||
|         } | ||||
|         return stringify(settings); | ||||
|     } | ||||
| @@ -225,7 +237,8 @@ QtObject{ | ||||
|             ambientLight: ambientLight, | ||||
|             windowOpacity: windowOpacity, | ||||
|             fontName: fontNames[rasterization], | ||||
|             fontWidth: fontWidth | ||||
|             fontWidth: fontWidth, | ||||
|             margin: _margin | ||||
|         } | ||||
|         return settings; | ||||
|     } | ||||
| @@ -284,6 +297,10 @@ QtObject{ | ||||
|  | ||||
|         useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand | ||||
|         customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand | ||||
|  | ||||
|         useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn; | ||||
|  | ||||
|         blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor | ||||
|     } | ||||
|  | ||||
|     function loadProfileString(profileString){ | ||||
| @@ -317,6 +334,8 @@ QtObject{ | ||||
|         fontNames[rasterization] = settings.fontName !== undefined ? settings.fontName : fontNames[rasterization]; | ||||
|         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; | ||||
|  | ||||
|         _margin = settings.margin !== undefined ? settings.margin : _margin; | ||||
|  | ||||
|         handleFontChanged(); | ||||
|     } | ||||
|  | ||||
| @@ -384,9 +403,10 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.2483, | ||||
|                   "screenCurvature": 0.1997, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -411,9 +431,10 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.0, | ||||
|                   "screenCurvature": 0.1997, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -438,9 +459,10 @@ QtObject{ | ||||
|                   "rasterization": 1, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.5, | ||||
|                   "screenCurvature": 0.2, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -466,8 +488,9 @@ QtObject{ | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0, | ||||
|                   "staticNoise": 0.1545, | ||||
|                   "windowOpacity": 1 | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -492,9 +515,10 @@ QtObject{ | ||||
|                   "rasterization": 1, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.8976, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.099, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -519,9 +543,10 @@ QtObject{ | ||||
|                   "rasterization": 1, | ||||
|                   "rbgShift": 0.2969, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.3003, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.2969, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -546,9 +571,10 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0.3524, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.401, | ||||
|                   "screenCurvature": 0.4, | ||||
|                   "staticNoise": 0.0503, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -573,9 +599,10 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.1997, | ||||
|                   "screenCurvature": 0.2, | ||||
|                   "staticNoise": 0, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -600,9 +627,10 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.4983, | ||||
|                   "screenCurvature": 0.05, | ||||
|                   "screenCurvature": 0, | ||||
|                   "staticNoise": 0.0955, | ||||
|                   "windowOpacity": 0.7 | ||||
|                   "windowOpacity": 0.7, | ||||
|                   "margin": 0.1 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
|   | ||||
| @@ -13,10 +13,12 @@ Loader { | ||||
|     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 | ||||
|     active: appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||
|  | ||||
|     anchors.fill: parent | ||||
|  | ||||
|     function completelyUpdate() { | ||||
|         prevLastUpdate = lastUpdate; | ||||
| @@ -33,16 +35,6 @@ Loader { | ||||
|     sourceComponent: Item { | ||||
|         property alias source: burnInEffectSource | ||||
|  | ||||
|         property int burnInScaling: scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         width: appSettings.lowResolutionFont | ||||
|                ? kterminal.width * Math.max(1, burnInScaling) | ||||
|                : kterminal.width * scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         height: appSettings.lowResolutionFont | ||||
|                 ? kterminal.height * Math.max(1, burnInScaling) | ||||
|                 : kterminal.height * scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         ShaderEffectSource { | ||||
|             id: burnInEffectSource | ||||
|  | ||||
| @@ -52,13 +44,10 @@ Loader { | ||||
|             live: false | ||||
|             recursive: true | ||||
|             hideSource: true | ||||
|             wrapMode: kterminalSource.wrapMode | ||||
|             wrapMode: ShaderEffectSource.ClampToEdge | ||||
|  | ||||
|             format: ShaderEffectSource.RGBA | ||||
|  | ||||
|             // Enabling smooth with a low burnInQuality causes bad artifacts because the FBO | ||||
|             // has different values when it's read back. This lowers the quality, but makes it more consistent. | ||||
|             smooth: appSettings.burnInQuality === 1.0 | ||||
|             smooth: true | ||||
|  | ||||
|             visible: false | ||||
|  | ||||
| @@ -91,7 +80,6 @@ Loader { | ||||
|             property real prevLastUpdate: burnInEffect.prevLastUpdate | ||||
|  | ||||
|             anchors.fill: parent | ||||
|  | ||||
|             blending: false | ||||
|  | ||||
|             fragmentShader: | ||||
|   | ||||
| @@ -236,7 +236,9 @@ QtObject{ | ||||
|     function addSystemFonts() { | ||||
|         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])) | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ import QtQuick 2.0 | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| ShaderEffect { | ||||
|     property color _staticFrameColor: "#dedede" | ||||
|     property color _staticFrameColor: "#ffffff" | ||||
|     property color _backgroundColor: appSettings.backgroundColor | ||||
|     property color _fontColor: appSettings.fontColor | ||||
|     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) | ||||
| @@ -13,7 +13,7 @@ ShaderEffect { | ||||
|     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize | ||||
|     property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) | ||||
|  | ||||
|     visible: screenCurvature != 0 | ||||
|     property size aadelta: Qt.size(1.0 / width, 1.0 / height) | ||||
|  | ||||
|     fragmentShader: " | ||||
|         #ifdef GL_ES | ||||
| @@ -24,6 +24,7 @@ ShaderEffect { | ||||
|         uniform lowp float shadowLength; | ||||
|         uniform highp float qt_Opacity; | ||||
|         uniform lowp vec4 frameColor; | ||||
|         uniform mediump vec2 aadelta; | ||||
|  | ||||
|         varying highp vec2 qt_TexCoord0; | ||||
|  | ||||
| @@ -41,6 +42,10 @@ ShaderEffect { | ||||
|             return min(v.x, v.y); | ||||
|         } | ||||
|  | ||||
|         float prod2(vec2 v) { | ||||
|             return v.x * v.y; | ||||
|         } | ||||
|  | ||||
|         float sum2(vec2 v) { | ||||
|             return v.x + v.y; | ||||
|         } | ||||
| @@ -53,17 +58,17 @@ ShaderEffect { | ||||
|             float alpha = 0.0; | ||||
|  | ||||
|             float outShadowLength = shadowLength; | ||||
|             float inShadowLength = 0.5 * shadowLength; | ||||
|             float inShadowLength = shadowLength * 0.5; | ||||
|  | ||||
|             float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords)); | ||||
|             outShadow = clamp(0.0, 1.0, outShadow); | ||||
|             color += frameColor.rgb * sqrt(outShadow); | ||||
|             alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords)); | ||||
|             alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow)); | ||||
|             outShadow = clamp(sqrt(outShadow), 0.0, 1.0); | ||||
|             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 = min2(step(vec2(0.0), coords) - step(vec2(1.0), coords)); | ||||
|             inShadow -= min2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords)); | ||||
|             alpha += 0.35 * inShadow; | ||||
|             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); | ||||
|         } | ||||
|   | ||||
| @@ -28,11 +28,12 @@ import "utils.js" as Utils | ||||
| Item{ | ||||
|     id: terminalContainer | ||||
|  | ||||
|     property size virtualResolution: Qt.size(kterminal.width, kterminal.height) | ||||
|     property size virtualResolution: Qt.size(kterminal.totalWidth, kterminal.totalHeight) | ||||
|     property alias mainTerminal: kterminal | ||||
|  | ||||
|     property ShaderEffectSource mainSource: kterminalSource | ||||
|     property BurnInEffect burnInEffect: burnInEffect | ||||
|     property SlowBurnIn slowBurnInEffect: slowBurnInEffect | ||||
|     property real fontWidth: 1.0 | ||||
|     property real screenScaling: 1.0 | ||||
|     property real scaleTexture: 1.0 | ||||
| @@ -69,14 +70,31 @@ Item{ | ||||
|  | ||||
|     QMLTermWidget { | ||||
|         id: kterminal | ||||
|         width: Math.floor(parent.width / (screenScaling * fontWidth)) | ||||
|         height: Math.floor(parent.height / screenScaling) | ||||
|  | ||||
|         property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1 | ||||
|         property int margin: appSettings.margin / screenScaling | ||||
|         property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth)) | ||||
|         property int totalHeight: Math.floor(parent.height / screenScaling) | ||||
|  | ||||
|         property int rawWidth: totalWidth - 2 * margin | ||||
|         property int rawHeight: totalHeight - 2 * margin | ||||
|  | ||||
|         textureSize: Qt.size(width / textureResolutionScale, height / textureResolutionScale) | ||||
|  | ||||
|         width: ensureMultiple(rawWidth, devicePixelRatio) | ||||
|         height: ensureMultiple(rawHeight, devicePixelRatio) | ||||
|  | ||||
|         /** Ensure size is a multiple of factor. This is needed for pixel perfect scaling on highdpi screens. */ | ||||
|         function ensureMultiple(size, factor) { | ||||
|             return Math.round(size / factor) * factor; | ||||
|         } | ||||
|  | ||||
|         colorScheme: "cool-retro-term" | ||||
|  | ||||
|         smooth: !appSettings.lowResolutionFont | ||||
|         enableBold: false | ||||
|         fullCursorHeight: true | ||||
|         blinkingCursor: appSettings.blinkingCursor | ||||
|  | ||||
|         session: QMLTermSession { | ||||
|             id: ksession | ||||
| @@ -167,6 +185,8 @@ Item{ | ||||
|     property alias contextmenu: menuLoader.item | ||||
|  | ||||
|     MouseArea{ | ||||
|         property real margin: appSettings.margin | ||||
|  | ||||
|         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton | ||||
|         anchors.fill: parent | ||||
|         cursorShape: kterminal.terminalUsesMouse ? Qt.ArrowCursor : Qt.IBeamCursor | ||||
| @@ -200,14 +220,14 @@ Item{ | ||||
|         } | ||||
|  | ||||
|         function correctDistortion(x, y){ | ||||
|             x = x / width; | ||||
|             y = y / height; | ||||
|             x = (x - margin) / width; | ||||
|             y = (y - margin) / height; | ||||
|  | ||||
|             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.width, | ||||
|                            (y - cc.height * (1+distortion) * distortion) * kterminal.height) | ||||
|             return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.totalWidth, | ||||
|                            (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight) | ||||
|         } | ||||
|     } | ||||
|     ShaderEffectSource{ | ||||
| @@ -216,10 +236,30 @@ Item{ | ||||
|         hideSource: true | ||||
|         wrapMode: ShaderEffectSource.Repeat | ||||
|         visible: false | ||||
|         textureSize: Qt.size(kterminal.width * scaleTexture, kterminal.height * scaleTexture); | ||||
|         textureSize: Qt.size(kterminal.totalWidth * scaleTexture, kterminal.totalHeight * scaleTexture) | ||||
|         sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight) | ||||
|     } | ||||
|  | ||||
|     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 | ||||
|         } | ||||
|  | ||||
|         SlowBurnIn { | ||||
|             id: slowBurnInEffect | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -27,13 +27,48 @@ import "Components" | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
| 
 | ||||
|         GroupBox{ | ||||
|             title: qsTr("General") | ||||
|             Layout.fillWidth: true | ||||
|             title: qsTr("Command") | ||||
|             ColumnLayout { | ||||
|                 anchors.fill: parent | ||||
|                 CheckBox{ | ||||
|                     id: useCustomCommand | ||||
|                     text: qsTr("Use custom command instead of shell at startup") | ||||
|                     checked: appSettings.useCustomCommand | ||||
|                     onCheckedChanged: appSettings.useCustomCommand = checked | ||||
|                 } | ||||
|                 // Workaround for QTBUG-31627 for pre 5.3.0 | ||||
|                 Binding{ | ||||
|                     target: useCustomCommand | ||||
|                     property: "checked" | ||||
|                     value: appSettings.useCustomCommand | ||||
|                 } | ||||
|                 TextField{ | ||||
|                     id: customCommand | ||||
|                     Layout.fillWidth: true | ||||
|                     text: appSettings.customCommand | ||||
|                     enabled: useCustomCommand.checked | ||||
|                     onEditingFinished: appSettings.customCommand = text | ||||
| 
 | ||||
|                     // Save text even if user forgets to press enter or unfocus | ||||
|                     function saveSetting() { | ||||
|                         appSettings.customCommand = text; | ||||
|                     } | ||||
|                     Component.onCompleted: settings_window.closing.connect(saveSetting) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         GroupBox{ | ||||
|             title: qsTr("Performance") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 rows: 2 | ||||
|                 columns: 3 | ||||
| 
 | ||||
|                 Label{text: qsTr("Effects FPS")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
| @@ -52,6 +87,7 @@ Tab{ | ||||
|                         enabled = true; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 SizedLabel{text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max")} | ||||
|                 Label{text: qsTr("Texture Quality")} | ||||
|                 Slider{ | ||||
| @@ -67,14 +103,7 @@ Tab{ | ||||
|                     } | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(txtslider.value * 100) + "%"} | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("Bloom") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 id: bloomQualityContainer | ||||
|                 anchors.fill: parent | ||||
| 
 | ||||
|                 Label{text: qsTr("Bloom Quality")} | ||||
|                 Slider{ | ||||
|                     Layout.fillWidth: true | ||||
| @@ -89,14 +118,6 @@ Tab{ | ||||
|                     } | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(bloomSlider.value * 100) + "%"} | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("BurnIn") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 id: blurQualityContainer | ||||
|                 anchors.fill: parent | ||||
| 
 | ||||
|                 Label{text: qsTr("BurnIn Quality")} | ||||
|                 Slider{ | ||||
| @@ -112,6 +133,12 @@ Tab{ | ||||
|                     } | ||||
|                 } | ||||
|                 SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} | ||||
|                 CheckBox{ | ||||
|                     Layout.columnSpan: 2 | ||||
|                     text: qsTr("Burnin optimization (Might display timing artifacts)") | ||||
|                     checked: appSettings.useFastBurnIn | ||||
|                     onCheckedChanged: appSettings.useFastBurnIn = checked | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -23,12 +23,17 @@ import QtQuick.Controls 1.1 | ||||
| import QtQuick.Layouts 1.1 | ||||
|  | ||||
| Tab{ | ||||
|     GroupBox{ | ||||
|         title: qsTr("Effects") | ||||
|         anchors.fill: parent | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
|         spacing: 2 | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Effects") | ||||
|             Layout.fillWidth: true | ||||
|  | ||||
|             ColumnLayout { | ||||
|                 anchors.fill: parent | ||||
|  | ||||
|                 CheckableSlider{ | ||||
|                     name: qsTr("Bloom") | ||||
|                     onNewValue: appSettings.bloom = newValue | ||||
| @@ -83,3 +88,4 @@ Tab{ | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -52,7 +52,7 @@ Tab{ | ||||
|                     Layout.fillWidth: false | ||||
|                     Button{ | ||||
|                         Layout.fillWidth: true | ||||
|                         text: qsTr("New") | ||||
|                         text: qsTr("Save") | ||||
|                         onClicked: { | ||||
|                             insertname.profileName = ""; | ||||
|                             insertname.show() | ||||
| @@ -164,34 +164,30 @@ Tab{ | ||||
|         } | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Screen") | ||||
|             Layout.fillWidth: true | ||||
|             title: qsTr("Command") | ||||
|             ColumnLayout { | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 CheckBox{ | ||||
|                     id: useCustomCommand | ||||
|                     text: qsTr("Use custom command instead of shell at startup") | ||||
|                     checked: appSettings.useCustomCommand | ||||
|                     onCheckedChanged: appSettings.useCustomCommand = checked | ||||
|                 columns: 2 | ||||
|                 Label{ text: qsTr("Brightness") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.brightness = value | ||||
|                     value: appSettings.brightness | ||||
|                 } | ||||
|                 // Workaround for QTBUG-31627 for pre 5.3.0 | ||||
|                 Binding{ | ||||
|                     target: useCustomCommand | ||||
|                     property: "checked" | ||||
|                     value: appSettings.useCustomCommand | ||||
|                 Label{ text: qsTr("Contrast") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.contrast = value | ||||
|                     value: appSettings.contrast | ||||
|                 } | ||||
|                 TextField{ | ||||
|                     id: customCommand | ||||
|                     Layout.fillWidth: true | ||||
|                     text: appSettings.customCommand | ||||
|                     enabled: useCustomCommand.checked | ||||
|                     onEditingFinished: appSettings.customCommand = text | ||||
|  | ||||
|                     // Save text even if user forgets to press enter or unfocus | ||||
|                     function saveSetting() { | ||||
|                         appSettings.customCommand = text; | ||||
|                 Label{ text: qsTr("Margin") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings._margin = value | ||||
|                     value: appSettings._margin | ||||
|                 } | ||||
|                     Component.onCompleted: settings_window.closing.connect(saveSetting) | ||||
|                 Label{ text: qsTr("Opacity") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.windowOpacity = value | ||||
|                     value: appSettings.windowOpacity | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -1,67 +0,0 @@ | ||||
| /******************************************************************************* | ||||
| * Copyright (c) 2013 "Filippo Scognamiglio" | ||||
| * https://github.com/Swordfish90/cool-retro-term | ||||
| * | ||||
| * This file is part of cool-retro-term. | ||||
| * | ||||
| * cool-retro-term is free software: you can redistribute it and/or modify | ||||
| * it under the terms of the GNU General Public License as published by | ||||
| * the Free Software Foundation, either version 3 of the License, or | ||||
| * (at your option) any later version. | ||||
| * | ||||
| * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| * GNU General Public License for more details. | ||||
| * | ||||
| * You should have received a copy of the GNU General Public License | ||||
| * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| *******************************************************************************/ | ||||
|  | ||||
| import QtQuick 2.2 | ||||
| import QtQuick.Controls 1.1 | ||||
| import QtQuick.Layouts 1.1 | ||||
| import QtQuick.Dialogs 1.1 | ||||
|  | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
|         GroupBox{ | ||||
|             title: qsTr("Rasterization Mode") | ||||
|             Layout.fillWidth: true | ||||
|             ComboBox { | ||||
|                 id: rasterizationBox | ||||
|                 property string selectedElement: model[currentIndex] | ||||
|                 anchors.fill: parent | ||||
|                 model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] | ||||
|                 currentIndex: appSettings.rasterization | ||||
|                 onCurrentIndexChanged: { | ||||
|                     appSettings.rasterization = currentIndex | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("Lights") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 columns: 2 | ||||
|                 Label{ text: qsTr("Brightness") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.brightness = value | ||||
|                     value: appSettings.brightness | ||||
|                 } | ||||
|                 Label{ text: qsTr("Contrast") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.contrast = value | ||||
|                     value: appSettings.contrast | ||||
|                 } | ||||
|                 Label{ text: qsTr("Opacity") } | ||||
|                 SimpleSlider{ | ||||
|                     onValueChanged: appSettings.windowOpacity = value | ||||
|                     value: appSettings.windowOpacity | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -27,13 +27,26 @@ import "Components" | ||||
| Tab{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
|  | ||||
|         GroupBox{ | ||||
|             property var rasterization: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")][appSettings.rasterization] | ||||
|             title: qsTr("Font " + "(" + rasterization + ")") | ||||
|             title: qsTr("Font") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 columns: 2 | ||||
|                 Label { text: qsTr("Rasterization") } | ||||
|                 ComboBox { | ||||
|                     id: rasterizationBox | ||||
|  | ||||
|                     property string selectedElement: model[currentIndex] | ||||
|  | ||||
|                     Layout.fillWidth: true | ||||
|                     model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] | ||||
|                     currentIndex: appSettings.rasterization | ||||
|                     onCurrentIndexChanged: { | ||||
|                         appSettings.rasterization = currentIndex | ||||
|                     } | ||||
|                 } | ||||
|                 Label{ text: qsTr("Name") } | ||||
|                 ComboBox{ | ||||
|                     id: fontChanger | ||||
| @@ -101,6 +114,24 @@ Tab{ | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("Cursor") | ||||
|             Layout.fillWidth: true | ||||
|             ColumnLayout { | ||||
|                 anchors.fill: parent | ||||
|                 CheckBox{ | ||||
|                     id: blinkingCursor | ||||
|                     text: qsTr("Blinking Cursor") | ||||
|                     checked: appSettings.blinkingCursor | ||||
|                     onCheckedChanged: appSettings.blinkingCursor = checked | ||||
|                 } | ||||
|                 Binding{ | ||||
|                     target: blinkingCursor | ||||
|                     property: "checked" | ||||
|                     value: appSettings.blinkingCursor | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         GroupBox{ | ||||
|             title: qsTr("Colors") | ||||
|             Layout.fillWidth: true | ||||
|   | ||||
| @@ -42,12 +42,6 @@ Window { | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsScreenTab{ | ||||
|             id: screenTab | ||||
|             title: qsTr("Screen") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsTerminalTab { | ||||
|             id: terminalTab | ||||
|             title: qsTr("Terminal") | ||||
| @@ -60,9 +54,9 @@ Window { | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsPerformanceTab{ | ||||
|         SettingsAdvancedTab { | ||||
|             id: performanceTab | ||||
|             title: qsTr("Performance") | ||||
|             title: qsTr("Advanced") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|   | ||||
| @@ -23,51 +23,66 @@ import QtGraphicalEffects 1.0 | ||||
|  | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| ShaderEffect { | ||||
| Item { | ||||
|     property SlowBurnIn slowBurnInEffect | ||||
|     property ShaderEffectSource source | ||||
|     property BurnInEffect burnInEffect | ||||
|     property ShaderEffectSource bloomSource | ||||
|  | ||||
|     property color fontColor: appSettings.fontColor | ||||
|     property color backgroundColor: appSettings.backgroundColor | ||||
|     property real bloom: appSettings.bloom * 2.5 | ||||
|  | ||||
|     property ShaderEffectSource burnInSource: burnInEffect.source | ||||
|     property real burnIn: appSettings.burnIn | ||||
|     property real burnInLastUpdate: burnInEffect.lastUpdate | ||||
|     property real burnInTime: burnInEffect.burnInFadeTime | ||||
|  | ||||
|     property real jitter: appSettings.jitter | ||||
|     property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) | ||||
|  | ||||
|     property real staticNoise: appSettings.staticNoise | ||||
|     property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), | ||||
|                                           (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) | ||||
|  | ||||
|     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize | ||||
|     property real glowingLine: appSettings.glowingLine * 0.2 | ||||
|  | ||||
|     property real chromaColor: appSettings.chromaColor; | ||||
|  | ||||
|     property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling | ||||
|  | ||||
|     property real flickering: appSettings.flickering | ||||
|     property real horizontalSync: appSettings.horizontalSync * 0.5 | ||||
|  | ||||
|     property int rasterization: appSettings.rasterization | ||||
|  | ||||
|     property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness) | ||||
|     property real chromaColor: appSettings.chromaColor | ||||
|  | ||||
|     property real ambientLight: appSettings.ambientLight * 0.2 | ||||
|  | ||||
|     property size virtual_resolution | ||||
|  | ||||
|      ShaderEffect { | ||||
|          id: dynamicShader | ||||
|  | ||||
|          property ShaderEffectSource screenBuffer: frameBuffer | ||||
|          property ShaderEffectSource burnInSource: burnInEffect.source | ||||
|          property ShaderEffectSource frameSource: terminalFrameLoader.item | ||||
|  | ||||
|          property color fontColor: parent.fontColor | ||||
|          property color backgroundColor: parent.backgroundColor | ||||
|          property real screenCurvature: parent.screenCurvature | ||||
|          property real chromaColor: parent.chromaColor | ||||
|          property real ambientLight: parent.ambientLight | ||||
|  | ||||
|          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.useFastBurnIn ? appSettings.burnIn : 0 | ||||
|          property real burnInLastUpdate: burnInEffect.lastUpdate | ||||
|          property real burnInTime: burnInEffect.burnInFadeTime | ||||
|  | ||||
|          // Slow burnin properties | ||||
|          property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn | ||||
|          property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source | ||||
|  | ||||
|          property real jitter: appSettings.jitter | ||||
|          property 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 virtual_resolution: parent.virtual_resolution | ||||
|  | ||||
|          property real time: timeManager.time | ||||
|          property ShaderEffectSource noiseSource: noiseShaderSource | ||||
|  | ||||
|          // If something goes wrong activate the fallback version of the shader. | ||||
|          property bool fallBack: false | ||||
|  | ||||
|          anchors.fill: parent | ||||
|          blending: false | ||||
|  | ||||
|          //Smooth random texture used for flickering effect. | ||||
| @@ -104,15 +119,12 @@ ShaderEffect { | ||||
|              (!fallBack ? " | ||||
|                  uniform sampler2D noiseSource;" : "") + | ||||
|  | ||||
|         (!fallBack && rbgShift !== 0.0 ?" | ||||
|             varying lowp vec4 constantNoise;" : "") + | ||||
|  | ||||
|              (!fallBack && flickering !== 0.0 ?" | ||||
|                  varying lowp float brightness; | ||||
|                  uniform lowp float flickering;" : "") + | ||||
|  | ||||
|              (!fallBack && horizontalSync !== 0.0 ?" | ||||
|             uniform lowp float horizontalSync; | ||||
|                  uniform lowp float horizontalSyncStrength; | ||||
|                  varying lowp float distortionScale; | ||||
|                  varying lowp float distortionFreq;" : "") + | ||||
|  | ||||
| @@ -121,20 +133,17 @@ ShaderEffect { | ||||
|                  qt_TexCoord0 = qt_MultiTexCoord0; | ||||
|                  vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" + | ||||
|  | ||||
|             (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ? | ||||
|                  (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ? | ||||
|                      "vec4 initialNoiseTexel = texture2D(noiseSource, coords);" | ||||
|                  : "") + | ||||
|  | ||||
|             (!fallBack && rbgShift !== 0.0 ?" | ||||
|                 constantNoise = initialNoiseTexel;" : "") + | ||||
|  | ||||
|                  (!fallBack && flickering !== 0.0 ? " | ||||
|                      brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" | ||||
|                  : "") + | ||||
|  | ||||
|                  (!fallBack && horizontalSync !== 0.0 ? " | ||||
|                 float randval = horizontalSync - initialNoiseTexel.r; | ||||
|                 distortionScale = step(0.0, randval) * randval * horizontalSync; | ||||
|                      float randval = horizontalSyncStrength - initialNoiseTexel.r; | ||||
|                      distortionScale = step(0.0, randval) * randval * horizontalSyncStrength; | ||||
|                      distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||
|                  : "") + | ||||
|  | ||||
| @@ -146,45 +155,43 @@ ShaderEffect { | ||||
|                  precision mediump float; | ||||
|              #endif | ||||
|  | ||||
|         uniform sampler2D source; | ||||
|              uniform sampler2D screenBuffer; | ||||
|              uniform highp float qt_Opacity; | ||||
|              uniform highp float time; | ||||
|              varying highp vec2 qt_TexCoord0; | ||||
|  | ||||
|              uniform highp vec4 fontColor; | ||||
|              uniform highp vec4 backgroundColor; | ||||
|         uniform lowp float screen_brightness; | ||||
|              uniform lowp float shadowLength; | ||||
|  | ||||
|              uniform highp vec2 virtual_resolution;" + | ||||
|  | ||||
|         (bloom !== 0 ? " | ||||
|             uniform highp sampler2D bloomSource; | ||||
|             uniform lowp float bloom;" : "") + | ||||
|              (burnIn !== 0 ? " | ||||
|                  uniform sampler2D burnInSource; | ||||
|                  uniform highp float burnInLastUpdate; | ||||
|                  uniform highp float burnInTime;" : "") + | ||||
|              (slowBurnIn !== 0 ? " | ||||
|                  uniform sampler2D slowBurnInSource;" : "") + | ||||
|              (staticNoise !== 0 ? " | ||||
|                  uniform highp float staticNoise;" : "") + | ||||
|         (((staticNoise !== 0 || jitter !== 0 || rbgShift) | ||||
|              (((staticNoise !== 0 || jitter !== 0) | ||||
|                ||(fallBack && (flickering || horizontalSync))) ? " | ||||
|                  uniform lowp sampler2D noiseSource; | ||||
|                  uniform highp vec2 scaleNoiseSize;" : "") + | ||||
|              (screenCurvature !== 0 ? " | ||||
|             uniform highp float screenCurvature;" : "") + | ||||
|                  uniform highp float screenCurvature; | ||||
|                  uniform lowp sampler2D frameSource;" : "") + | ||||
|              (glowingLine !== 0 ? " | ||||
|                  uniform highp float glowingLine;" : "") + | ||||
|              (chromaColor !== 0 ? " | ||||
|                  uniform lowp float chromaColor;" : "") + | ||||
|              (jitter !== 0 ? " | ||||
|                  uniform lowp vec2 jitterDisplacement;" : "") + | ||||
|         (rbgShift !== 0 ? " | ||||
|             uniform lowp float rbgShift;" : "") + | ||||
|              (ambientLight !== 0 ? " | ||||
|                  uniform lowp float ambientLight;" : "") + | ||||
|  | ||||
|              (fallBack && horizontalSync !== 0 ? " | ||||
|             uniform lowp float horizontalSync;" : "") + | ||||
|                  uniform lowp float horizontalSyncStrength;" : "") + | ||||
|              (fallBack && flickering !== 0.0 ?" | ||||
|                  uniform lowp float flickering;" : "") + | ||||
|              (!fallBack && flickering !== 0 ? " | ||||
| @@ -194,38 +201,41 @@ ShaderEffect { | ||||
|                  varying lowp float distortionScale; | ||||
|                  varying lowp float distortionFreq;" : "") + | ||||
|  | ||||
|         (!fallBack && rbgShift !== 0.0 ?" | ||||
|             varying lowp vec4 constantNoise;" : "") + | ||||
|  | ||||
|              (glowingLine !== 0 ? " | ||||
|                  float randomPass(vec2 coords){ | ||||
|                      return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); | ||||
|                  }" : "") + | ||||
|  | ||||
|         "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) { | ||||
|              "float min2(vec2 v) { | ||||
|                  return min(v.x, v.y); | ||||
|              } | ||||
|  | ||||
|              float rgb2grey(vec3 v){ | ||||
|                  return dot(v, vec3(0.21, 0.72, 0.04)); | ||||
|              } | ||||
|  | ||||
|              float isInScreen(vec2 v) { | ||||
|                  return min2(step(0.0, v) - step(1.0, v)); | ||||
|              } | ||||
|  | ||||
|              vec2 barrel(vec2 v, vec2 cc) {" + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      float distortion = dot(cc, cc) * screenCurvature; | ||||
|                      return (v - cc * (1.0 + distortion) * distortion);" | ||||
|                  : | ||||
|                      "return v;") + | ||||
|              "}" + | ||||
|  | ||||
|              "vec3 convertWithChroma(vec3 inColor) { | ||||
|                 vec3 outColor = inColor;" + | ||||
|  | ||||
|                  (chromaColor !== 0 ? | ||||
|                      "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);" | ||||
|                  : | ||||
|                      "outColor = fontColor.rgb * rgb2grey(inColor);") + | ||||
|  | ||||
|              "  return outColor; | ||||
|              }" + | ||||
|  | ||||
|              "void main() {" + | ||||
| @@ -233,7 +243,7 @@ ShaderEffect { | ||||
|                  "float distance = length(cc);" + | ||||
|  | ||||
|                  //FallBack if there are problems | ||||
|             (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ? | ||||
|                  (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ? | ||||
|                      "vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0))); | ||||
|                       vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);" | ||||
|                  : "") + | ||||
| @@ -241,33 +251,31 @@ ShaderEffect { | ||||
|                      float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" | ||||
|                  : "") + | ||||
|                  (fallBack && horizontalSync !== 0.0 ? " | ||||
|                 float randval = horizontalSync - initialNoiseTexel.r; | ||||
|                 float distortionScale = step(0.0, randval) * randval * horizontalSync; | ||||
|                      float randval = horizontalSyncStrength - initialNoiseTexel.r; | ||||
|                      float distortionScale = step(0.0, randval) * randval * horizontalSyncStrength; | ||||
|                      float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||
|                  : "") + | ||||
|             (fallBack && rbgShift !== 0.0 ?" | ||||
|                 lowp vec4 constantNoise = initialNoiseTexel;" : "") + | ||||
|  | ||||
|                  (staticNoise ? " | ||||
|                      float noise = staticNoise;" : "") + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                 float distortion = dot(cc, cc) * screenCurvature; | ||||
|                 vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion); | ||||
|                 vec2 staticCoords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;" | ||||
|                      vec2 staticCoords = barrel(qt_TexCoord0, cc);" | ||||
|                  :" | ||||
|                      vec2 staticCoords = qt_TexCoord0;") + | ||||
|  | ||||
|             "vec2 coords = staticCoords;" + | ||||
|                  "vec2 coords = qt_TexCoord0;" + | ||||
|  | ||||
|                  (horizontalSync !== 0 ? " | ||||
|                      float dst = sin((coords.y + time * 0.001) * distortionFreq); | ||||
|                      coords.x += dst * distortionScale;" + | ||||
|  | ||||
|                      (staticNoise ? " | ||||
|                          noise += distortionScale * 7.0;" : "") | ||||
|  | ||||
|                  : "") + | ||||
|  | ||||
|             (jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? | ||||
|                  (jitter !== 0 || staticNoise !== 0 ? | ||||
|                      "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" | ||||
|                  : "") + | ||||
|  | ||||
| @@ -285,49 +293,23 @@ ShaderEffect { | ||||
|                  (glowingLine !== 0 ? " | ||||
|                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + | ||||
|  | ||||
|             "vec3 txt_color = texture2D(source, txt_coords).rgb;" + | ||||
|  | ||||
|             (rbgShift !== 0 ? " | ||||
|                 vec2 displacement = vec2(12.0, 0.0) * rbgShift * (0.6 * constantNoise.r + 0.4); | ||||
|                 vec3 rightColor = texture2D(source, txt_coords + displacement).rgb; | ||||
|                 vec3 leftColor = texture2D(source, txt_coords - displacement).rgb; | ||||
|                 txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60; | ||||
|                 txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60; | ||||
|                 txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; | ||||
|             " : "") + | ||||
|                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + | ||||
|  | ||||
|                  (burnIn !== 0 ? " | ||||
|                      vec4 txt_blur = texture2D(burnInSource, staticCoords); | ||||
|                      float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); | ||||
|                 txt_color = max(txt_color, 0.5 * (txt_blur.rgb - vec3(blurDecay)));" | ||||
|                      vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay)); | ||||
|                      txt_color = max(txt_color, convertWithChroma(burnInColor));" | ||||
|                  : "") + | ||||
|  | ||||
|              "txt_color *= getScanlineIntensity(coords);" + | ||||
|                  (slowBurnIn !== 0 ? " | ||||
|                      vec4 txt_blur = texture2D(slowBurnInSource, staticCoords); | ||||
|                      txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a)); | ||||
|                  " : "") + | ||||
|  | ||||
|              "txt_color += vec3(color);" + | ||||
|              "float greyscale_color = rgb2grey(txt_color);" + | ||||
|                   "txt_color += fontColor.rgb * vec3(color);" + | ||||
|  | ||||
|             (chromaColor !== 0 ? | ||||
|                 "vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); | ||||
|                  vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);" | ||||
|             : | ||||
|                 "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") + | ||||
|  | ||||
|             (bloom !== 0 ? | ||||
|                 "vec4 bloomFullColor = texture2D(bloomSource, coords); | ||||
|                  vec3 bloomColor = bloomFullColor.rgb; | ||||
|                  float bloomAlpha = bloomFullColor.a;" + | ||||
|                 (chromaColor !== 0 ? | ||||
|                     "bloomColor = fontColor.rgb * mix(vec3(rgb2grey(bloomColor)), bloomColor, chromaColor);" | ||||
|                 : | ||||
|                     "bloomColor = fontColor.rgb * rgb2grey(bloomColor);") + | ||||
|                 "finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);" | ||||
|             : "") + | ||||
|  | ||||
|             (screenCurvature !== 0 ? " | ||||
|                 vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); | ||||
|                 finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" | ||||
|             :"") + | ||||
|                  "vec3 finalColor = txt_color;" + | ||||
|  | ||||
|                  (flickering !== 0 ? " | ||||
|                      finalColor *= brightness;" : "") + | ||||
| @@ -335,8 +317,12 @@ ShaderEffect { | ||||
|                  (ambientLight !== 0 ? " | ||||
|                      finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? | ||||
|                     "vec4 frameColor = texture2D(frameSource, qt_TexCoord0); | ||||
|                      finalColor = mix(finalColor, frameColor.rgb, frameColor.a);" | ||||
|                  : "") + | ||||
|  | ||||
|             "gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + | ||||
|                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|              "}" | ||||
|  | ||||
|           onStatusChanged: { | ||||
| @@ -350,3 +336,200 @@ ShaderEffect { | ||||
|               } | ||||
|           } | ||||
|      } | ||||
|  | ||||
|      Loader { | ||||
|          id: terminalFrameLoader | ||||
|  | ||||
|          active: screenCurvature !== 0 | ||||
|  | ||||
|          width: staticShader.width | ||||
|          height: staticShader.height | ||||
|  | ||||
|          sourceComponent: ShaderEffectSource { | ||||
|  | ||||
|              sourceItem: terminalFrame | ||||
|              hideSource: true | ||||
|              visible: false | ||||
|              format: ShaderEffectSource.RGBA | ||||
|  | ||||
|              NewTerminalFrame { | ||||
|                  id: terminalFrame | ||||
|                  blending: false | ||||
|                  anchors.fill: parent | ||||
|              } | ||||
|          } | ||||
|      } | ||||
|  | ||||
|      ShaderEffect { | ||||
|          id: staticShader | ||||
|  | ||||
|          width: parent.width * appSettings.windowScaling | ||||
|          height: parent.height * appSettings.windowScaling | ||||
|  | ||||
|          property ShaderEffectSource source: parent.source | ||||
|          property ShaderEffectSource bloomSource: parent.bloomSource | ||||
|  | ||||
|          property color fontColor: parent.fontColor | ||||
|          property color backgroundColor: parent.backgroundColor | ||||
|          property real bloom: appSettings.bloom * 2.5 | ||||
|  | ||||
|          property real screenCurvature: parent.screenCurvature | ||||
|  | ||||
|          property real chromaColor: appSettings.chromaColor; | ||||
|  | ||||
|          property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling // TODO FILIPPO width here is wrong. | ||||
|  | ||||
|          property int rasterization: appSettings.rasterization | ||||
|  | ||||
|          property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness) | ||||
|  | ||||
|          property real ambientLight: parent.ambientLight | ||||
|  | ||||
|          property size virtual_resolution: parent.virtual_resolution | ||||
|  | ||||
|          blending: false | ||||
|          visible: false | ||||
|  | ||||
|          //Print the number with a reasonable precision for the shader. | ||||
|          function str(num){ | ||||
|              return num.toFixed(8); | ||||
|          } | ||||
|  | ||||
|          fragmentShader: " | ||||
|              #ifdef GL_ES | ||||
|                  precision mediump float; | ||||
|              #endif | ||||
|  | ||||
|              uniform sampler2D source; | ||||
|              uniform highp float qt_Opacity; | ||||
|              varying highp vec2 qt_TexCoord0; | ||||
|  | ||||
|              uniform highp vec4 fontColor; | ||||
|              uniform highp vec4 backgroundColor; | ||||
|              uniform lowp float screen_brightness; | ||||
|  | ||||
|              uniform highp vec2 virtual_resolution;" + | ||||
|  | ||||
|              (bloom !== 0 ? " | ||||
|                  uniform highp sampler2D bloomSource; | ||||
|                  uniform lowp float bloom;" : "") + | ||||
|  | ||||
|              (screenCurvature !== 0 ? " | ||||
|                  uniform highp float screenCurvature;" : "") + | ||||
|  | ||||
|              (chromaColor !== 0 ? " | ||||
|                  uniform lowp float chromaColor;" : "") + | ||||
|  | ||||
|              (rbgShift !== 0 ? " | ||||
|                  uniform lowp float rbgShift;" : "") + | ||||
|  | ||||
|              (ambientLight !== 0 ? " | ||||
|                  uniform lowp float ambientLight;" : "") + | ||||
|  | ||||
|              "highp float getScanlineIntensity(vec2 coords) { | ||||
|                  float result = 1.0;" + | ||||
|  | ||||
|                 (appSettings.rasterization != appSettings.no_rasterization ? | ||||
|                     "float val = 0.0; | ||||
|                      vec2 rasterizationCoords = fract(coords * virtual_resolution); | ||||
|                      val += smoothstep(0.0, 0.5, rasterizationCoords.y); | ||||
|                      val -= smoothstep(0.5, 1.0, rasterizationCoords.y); | ||||
|                      result *= mix(0.5, 1.0, val);" : "") + | ||||
|  | ||||
|                 (appSettings.rasterization == appSettings.pixel_rasterization ? | ||||
|                     "val = 0.0; | ||||
|                      val += smoothstep(0.0, 0.5, rasterizationCoords.x); | ||||
|                      val -= smoothstep(0.5, 1.0, rasterizationCoords.x); | ||||
|                      result *= mix(0.5, 1.0, val);" : "") + " | ||||
|  | ||||
|                 return result; | ||||
|              } | ||||
|  | ||||
|              float min2(vec2 v) { | ||||
|                  return min(v.x, v.y); | ||||
|              } | ||||
|  | ||||
|              float sum2(vec2 v) { | ||||
|                  return v.x + v.y; | ||||
|              } | ||||
|  | ||||
|              float rgb2grey(vec3 v){ | ||||
|                  return dot(v, vec3(0.21, 0.72, 0.04)); | ||||
|              }" + | ||||
|  | ||||
|              "vec3 convertWithChroma(vec3 inColor) { | ||||
|                 vec3 outColor = inColor;" + | ||||
|  | ||||
|                  (chromaColor !== 0 ? | ||||
|                      "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);" | ||||
|                  : | ||||
|                      "outColor = fontColor.rgb * rgb2grey(inColor);") + | ||||
|  | ||||
|              "  return outColor; | ||||
|              }" + | ||||
|  | ||||
|  | ||||
|              "void main() {" + | ||||
|                  "vec2 cc = vec2(0.5) - qt_TexCoord0;" + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      float distortion = dot(cc, cc) * screenCurvature; | ||||
|                      vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion); | ||||
|                      vec2 txt_coords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;" | ||||
|                  :" | ||||
|                      vec2 txt_coords = qt_TexCoord0;") + | ||||
|  | ||||
|                  "vec3 txt_color = texture2D(source, txt_coords).rgb;" + | ||||
|  | ||||
|                  (rbgShift !== 0 ? " | ||||
|                      vec2 displacement = vec2(12.0, 0.0) * rbgShift; | ||||
|                      vec3 rightColor = texture2D(source, txt_coords + displacement).rgb; | ||||
|                      vec3 leftColor = texture2D(source, txt_coords - displacement).rgb; | ||||
|                      txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60; | ||||
|                      txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60; | ||||
|                      txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; | ||||
|                  " : "") + | ||||
|  | ||||
|                   "txt_color *= getScanlineIntensity(txt_coords);" + | ||||
|  | ||||
|                   "txt_color += vec3(0.0001);" + | ||||
|                   "float greyscale_color = rgb2grey(txt_color);" + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); | ||||
|                      reflectionMask = clamp(reflectionMask, 0.0, 1.0);" | ||||
|                  : | ||||
|                      "float reflectionMask = 1.0;") + | ||||
|  | ||||
|                  (chromaColor !== 0 ? | ||||
|                      "vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); | ||||
|                       vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * reflectionMask);" | ||||
|                  : | ||||
|                      "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") + | ||||
|  | ||||
|                      (bloom !== 0 ? | ||||
|                          "vec4 bloomFullColor = texture2D(bloomSource, txt_coords); | ||||
|                           vec3 bloomColor = bloomFullColor.rgb; | ||||
|                           float bloomAlpha = bloomFullColor.a; | ||||
|                           bloomColor = convertWithChroma(bloomColor); | ||||
|                           finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);" | ||||
|                      : "") + | ||||
|  | ||||
|                  "finalColor *= screen_brightness;" + | ||||
|  | ||||
|                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|              "}" | ||||
|  | ||||
|          onStatusChanged: { | ||||
|              // Print warning messages | ||||
|              if (log) console.log(log); | ||||
|          } | ||||
|      } | ||||
|  | ||||
|      ShaderEffectSource { | ||||
|          id: frameBuffer | ||||
|          visible: false | ||||
|          sourceItem: staticShader | ||||
|          hideSource: true | ||||
|      } | ||||
| } | ||||
|   | ||||
							
								
								
									
										122
									
								
								app/qml/SlowBurnIn.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								app/qml/SlowBurnIn.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| import QtQuick 2.0 | ||||
|  | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| Loader { | ||||
|     property ShaderEffectSource source: item ? item.source : null | ||||
|  | ||||
|     active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0 | ||||
|  | ||||
|     anchors.fill: parent | ||||
|  | ||||
|     sourceComponent: Item { | ||||
|         property alias source: burnInSourceEffect | ||||
|  | ||||
|         property int burnInScaling: scaleTexture * appSettings.burnInQuality | ||||
|  | ||||
|         ShaderEffectSource { | ||||
|             property bool updateBurnIn: false | ||||
|             property real burnIn: appSettings.burnIn | ||||
|             property real fps: appSettings.fps !== 0 ? appSettings.fps : 60 | ||||
|             property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn) | ||||
|             property real burnInCoefficient: 1000 / (fps * burnInFadeTime) | ||||
|             property real minBurnInFadeTime: appSettings.minBurnInFadeTime | ||||
|             property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime | ||||
|  | ||||
|             id: burnInSourceEffect | ||||
|  | ||||
|             anchors.fill: parent | ||||
|  | ||||
|             sourceItem: burnInEffect | ||||
|             recursive: true | ||||
|             live: false | ||||
|             hideSource: true | ||||
|             wrapMode: kterminalSource.wrapMode | ||||
|  | ||||
|             visible: false | ||||
|  | ||||
|             function restartBlurSource(){ | ||||
|                 livetimer.restart(); | ||||
|             } | ||||
|  | ||||
|             // This updates the burnin synched with the timer. | ||||
|             Connections { | ||||
|                 target: burnInSourceEffect.updateBurnIn ? timeManager : null | ||||
|                 ignoreUnknownSignals: false | ||||
|                 onTimeChanged: { | ||||
|                     burnInSourceEffect.scheduleUpdate(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             Timer{ | ||||
|                 id: livetimer | ||||
|  | ||||
|                 // The interval assumes 60 fps. This is the time needed burnout a white pixel. | ||||
|                 // We multiply 1.1 to have a little bit of margin over the theoretical value. | ||||
|                 // This solution is not extremely clean, but it's probably the best to avoid measuring fps. | ||||
|  | ||||
|                 interval: burnInSourceEffect.burnInFadeTime * 1.1 | ||||
|                 running: true | ||||
|                 onTriggered: burnInSourceEffect.updateBurnIn = false; | ||||
|             } | ||||
|             Connections{ | ||||
|                 target: kterminal | ||||
|                 onImagePainted:{ | ||||
|                     burnInSourceEffect.scheduleUpdate(); | ||||
|                     burnInSourceEffect.updateBurnIn = true; | ||||
|                     livetimer.restart(); | ||||
|                 } | ||||
|             } | ||||
|             // Restart blurred source settings change. | ||||
|             Connections{ | ||||
|                 target: appSettings | ||||
|                 onBurnInChanged: burnInSourceEffect.restartBlurSource(); | ||||
|                 onTerminalFontChanged: burnInSourceEffect.restartBlurSource(); | ||||
|                 onRasterizationChanged: burnInSourceEffect.restartBlurSource(); | ||||
|                 onBurnInQualityChanged: burnInSourceEffect.restartBlurSource(); | ||||
|             } | ||||
|             Connections { | ||||
|                 target: kterminalScrollbar | ||||
|                 onOpacityChanged: burnInSourceEffect.restartBlurSource(); | ||||
|             } | ||||
|  | ||||
|             ShaderEffect { | ||||
|                 id: burnInEffect | ||||
|  | ||||
|                 property variant txt_source: kterminalSource | ||||
|                 property variant blurredSource: burnInSourceEffect | ||||
|                 property real burnInCoefficient: burnInSourceEffect.burnInCoefficient | ||||
|  | ||||
|                 anchors.fill: parent | ||||
|                 blending: false | ||||
|  | ||||
|                 fragmentShader: | ||||
|                     "#ifdef GL_ES | ||||
|                     precision mediump float; | ||||
|                 #endif\n" + | ||||
|  | ||||
|                 "uniform lowp float qt_Opacity;" + | ||||
|                 "uniform lowp sampler2D txt_source;" + | ||||
|  | ||||
|                 "varying highp vec2 qt_TexCoord0; | ||||
|              uniform lowp sampler2D blurredSource; | ||||
|              uniform highp float burnInCoefficient;" + | ||||
|  | ||||
|                 "float max3(vec3 v) { | ||||
|                      return max (max (v.x, v.y), v.z); | ||||
|                 }" + | ||||
|  | ||||
|                 "void main() {" + | ||||
|                     "vec2 coords = qt_TexCoord0;" + | ||||
|                     "vec3 origColor = texture2D(txt_source, coords).rgb;" + | ||||
|                     "vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(burnInCoefficient);" + | ||||
|                     "vec3 color = min(origColor + blur_color, max(origColor, blur_color));" + | ||||
|  | ||||
|                     "gl_FragColor = vec4(color, max3(color - origColor));" + | ||||
|                 "}" | ||||
|  | ||||
|                 onStatusChanged: if (log) console.log(log) //Print warning messages | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -10,10 +10,9 @@ ShaderTerminal { | ||||
|     id: mainShader | ||||
|     opacity: appSettings.windowOpacity * 0.3 + 0.7 | ||||
|  | ||||
|     blending: false | ||||
|  | ||||
|     source: terminal.mainSource | ||||
|     burnInEffect: terminal.burnInEffect | ||||
|     slowBurnInEffect: terminal.slowBurnInEffect | ||||
|     virtual_resolution: terminal.virtualResolution | ||||
|  | ||||
|     TimeManager{ | ||||
| @@ -36,7 +35,7 @@ ShaderTerminal { | ||||
|         height: parent.height * appSettings.bloomQuality | ||||
|  | ||||
|         sourceComponent: FastBlur{ | ||||
|             radius: Utils.lint(16, 64, appSettings.bloomQuality * appSettings.windowScaling); | ||||
|             radius: Utils.lint(16, 64, appSettings.bloomQuality); | ||||
|             source: terminal.mainSource | ||||
|             transparentBorder: true | ||||
|         } | ||||
| @@ -56,11 +55,11 @@ ShaderTerminal { | ||||
|  | ||||
|     bloomSource: bloomSourceLoader.item | ||||
|  | ||||
|     NewTerminalFrame { | ||||
|         id: terminalFrame | ||||
|         anchors.fill: parent | ||||
|         blending: true | ||||
|     } | ||||
| //    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 | ||||
|   | ||||
| @@ -137,13 +137,8 @@ ApplicationWindow{ | ||||
|     TerminalContainer{ | ||||
|         id: terminalContainer | ||||
|         y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar. | ||||
|         width: parent.width * appSettings.windowScaling | ||||
|         height: (parent.height + Math.abs(y)) * appSettings.windowScaling | ||||
|  | ||||
|         transform: Scale { | ||||
|             xScale: 1 / appSettings.windowScaling | ||||
|             yScale: 1 / appSettings.windowScaling | ||||
|         } | ||||
|         width: parent.width | ||||
|         height: (parent.height + Math.abs(y)) | ||||
|     } | ||||
|     SettingsWindow{ | ||||
|         id: settingswindow | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
|         <file>fonts/1971-ibm-3278/3270Medium.ttf</file> | ||||
|         <file>Storage.qml</file> | ||||
|         <file>CRTMainMenuBar.qml</file> | ||||
|         <file>SettingsPerformanceTab.qml</file> | ||||
|         <file>SettingsAdvancedTab.qml</file> | ||||
|         <file>TerminalContainer.qml</file> | ||||
|         <file>images/crt256.png</file> | ||||
|         <file>utils.js</file> | ||||
| @@ -32,7 +32,6 @@ | ||||
|         <file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file> | ||||
|         <file>fonts/modern-hermit/Hermit-medium.otf</file> | ||||
|         <file>fonts/modern-inconsolata/Inconsolata.otf</file> | ||||
|         <file>SettingsScreenTab.qml</file> | ||||
|         <file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file> | ||||
|         <file>../icons/32x32/cool-retro-term.png</file> | ||||
|         <file>Components/SizedLabel.qml</file> | ||||
| @@ -44,5 +43,6 @@ | ||||
|         <file>BurnInEffect.qml</file> | ||||
|         <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file> | ||||
|         <file>NewTerminalFrame.qml</file> | ||||
|         <file>SlowBurnIn.qml</file> | ||||
|     </qresource> | ||||
| </RCC> | ||||
|   | ||||
| @@ -30,14 +30,17 @@ Print a help screen and exit. | ||||
| \fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR | ||||
| Run with the given profile. | ||||
| .TP | ||||
| \fB\-\-workdir\fR \fIDIR\fR | ||||
| Start with \fIDIR\fR as the working directory. | ||||
| \fB\-T\fR \fITITLE\fR | ||||
| Use \fITITLE\fR as the window title. | ||||
| .TP | ||||
| \fB\-\-verbose\fR | ||||
| Print additional information such as profiles and settings. | ||||
| .TP | ||||
| \fB\-v\fR, \fB\-\-version\fR | ||||
| Print the version number and exit. | ||||
| .TP | ||||
| \fB\-\-workdir\fR \fIDIR\fR | ||||
| Start with \fIDIR\fR as the working directory. | ||||
| .SH LICENCE | ||||
| This program is available under the terms of the GNU General Public License, | ||||
| version 3 or any later version, as published by the Free Software Foundation. | ||||
|   | ||||
 Submodule qmltermwidget updated: 48274c7566...59f967d5e1
									
								
							| @@ -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 | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user