Compare commits
	
		
			78 Commits
		
	
	
		
			framebuffe
			...
			adammathes
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | e7e3dfed00 | ||
|   | aa82250232 | ||
|   | 88f59d2016 | ||
|   | 8021ff4256 | ||
|   | 32eab18da9 | ||
|   | 52140c4c45 | ||
|   | 6e4d5cfddd | ||
|   | 10fd2a11ee | ||
|   | 749ea88909 | ||
|   | 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 | ||
|   | db7a7f38f7 | ||
|   | 3f0653106e | ||
|   | 9954fde6f1 | ||
|   | 3ec46ea833 | ||
|   | 4bff6efe97 | ||
|   | c514dc7a24 | ||
|   | 24754edb6a | ||
|   | 79fbb76524 | ||
|   | b85aede966 | ||
|   | c66ca6e44f | ||
|   | a192024fef | ||
|   | 918df9098a | ||
|   | c9271bfa36 | ||
|   | fa162c818b | ||
|   | ff976e3ec2 | ||
|   | 17c5651305 | ||
|   | 7c7b049ba1 | ||
|   | 0823fe8b3d | ||
|   | e787fd0fb5 | ||
|   | 650497bff4 | ||
|   | 2f25bd30b0 | ||
|   | d58157a450 | ||
|   | 9d049bd041 | ||
|   | 988222b711 | ||
|   | f42bd3036f | ||
|   | 297239fb5c | ||
|   | dbd46d44aa | ||
|   | 254f4d6e92 | ||
|   | d59ac20e38 | ||
|   | 7ce6571e1f | 
							
								
								
									
										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)/ | ||||
							
								
								
									
										39
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								README.md
									
									
									
									
									
								
							| @@ -13,18 +13,24 @@ 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. | ||||
|  | ||||
| ## 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 offcial repositories. All you have to do is `sudo dnf install cool-retro-term`. | ||||
|  | ||||
| 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): | ||||
|  | ||||
|     yaourt -S aur/cool-retro-term-git | ||||
|  | ||||
| @@ -34,25 +40,32 @@ 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: | ||||
| **Gentoo** users can now install the third release "1.1.0" from a 3rd-party repository preferably via layman: | ||||
|  | ||||
|     USE="git" emerge app-portage/layman | ||||
|     wget https://www.gerczei.eu/files/gerczei.xml -O /etc/layman/overlays/gerczei.xml | ||||
|     layman -f -a qt -a gerczei # those who've added the repo before 27/08/17 should remove, update and add it again as its source has changed | ||||
|     ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.0.1::gerczei | ||||
|     ACCEPT_KEYWORDS="~*" emerge =x11-terms/cool-retro-term-1.1.0::gerczei | ||||
|  | ||||
| The live ebuild (version 9999-r1) tracking the bleeding-edge WIP codebase also remains available. | ||||
|  | ||||
| A word of warning: USE flags and keywords are to be added to portage's configuration files and every emerge operation should be executed with '-p' (short option for --pretend) appended to the command line first as per best practice! | ||||
|  | ||||
| Ubuntu users of 14.04 LTS (Trusty) up to 15.10 (Wily) can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). | ||||
| Users of **Ubuntu 14.04 LTS (Trusty) up to 15.10 (Wily)** can use [this PPA](https://launchpad.net/~bugs-launchpad-net-falkensweb). | ||||
|  | ||||
| Ubuntu 17.10 can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) | ||||
| **Ubuntu 17.10** can use [this PPA](https://launchpad.net/%7Evantuz/+archive/ubuntu/cool-retro-term) | ||||
|  | ||||
| macOS users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases | ||||
| **Solus** users can install using `eopg`: | ||||
| ``` | ||||
| eopkg it cool-retro-term | ||||
| ``` | ||||
|  | ||||
| **macOS** users can grab the latest dmg from the release page: https://github.com/Swordfish90/cool-retro-term/releases | ||||
|  | ||||
| ## Build instructions (Linux) | ||||
|  | ||||
| Build cool-retro-term yourself, you know, the retro way. | ||||
|  | ||||
| ## Dependencies | ||||
| Make sure to install these first. | ||||
|  | ||||
|   | ||||
							
								
								
									
										11
									
								
								app/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								app/main.cpp
									
									
									
									
									
								
							| @@ -33,6 +33,10 @@ 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); | ||||
| @@ -70,8 +74,10 @@ int main(int argc, char *argv[]) | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     QString appVersion("1.1.1"); | ||||
|  | ||||
|     if (args.contains("-v") || args.contains("--version")) { | ||||
|         qDebug() << "cool-retro-term 1.0.1"; | ||||
|         qDebug() << ("cool-retro-term " + appVersion).toStdString().c_str(); | ||||
| 	return 0; | ||||
|     } | ||||
|  | ||||
| @@ -82,6 +88,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); | ||||
|  | ||||
| @@ -98,7 +105,7 @@ int main(int argc, char *argv[]) | ||||
|     importPathList.prepend(QCoreApplication::applicationDirPath() + "/../../../qmltermwidget"); | ||||
|     engine.setImportPathList(importPathList); | ||||
|  | ||||
|     engine.load(QUrl(QStringLiteral ("qrc:/main.qml"))); | ||||
|     engine.load(QUrl(QStringLiteral ("qrc:/root.qml"))); | ||||
|  | ||||
|     if (engine.rootObjects().isEmpty()) { | ||||
|         qDebug() << "Cannot load QML interface"; | ||||
|   | ||||
| @@ -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 | ||||
| @@ -52,7 +55,9 @@ QtObject{ | ||||
|     property bool verbose: false | ||||
|  | ||||
|     property real bloomQuality: 0.5 | ||||
|  | ||||
|     property real burnInQuality: 0.5 | ||||
|     property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true | ||||
|  | ||||
|     onWindowScalingChanged: handleFontChanged(); | ||||
|  | ||||
| @@ -88,6 +93,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 +134,7 @@ QtObject{ | ||||
|  | ||||
|     property FontLoader fontLoader: FontLoader { } | ||||
|  | ||||
|     onFontScalingChanged: handleFontChanged(); | ||||
|     onTotalFontScalingChanged: handleFontChanged(); | ||||
|     onFontWidthChanged: handleFontChanged(); | ||||
|  | ||||
|     function getIndexByName(name) { | ||||
| @@ -199,7 +207,8 @@ QtObject{ | ||||
|             bloomQuality: bloomQuality, | ||||
|             burnInQuality: burnInQuality, | ||||
|             useCustomCommand: useCustomCommand, | ||||
|             customCommand: customCommand | ||||
|             customCommand: customCommand, | ||||
|             useFastBurnIn: useFastBurnIn | ||||
|         } | ||||
|         return stringify(settings); | ||||
|     } | ||||
| @@ -225,7 +234,8 @@ QtObject{ | ||||
|             ambientLight: ambientLight, | ||||
|             windowOpacity: windowOpacity, | ||||
|             fontName: fontNames[rasterization], | ||||
|             fontWidth: fontWidth | ||||
|             fontWidth: fontWidth, | ||||
|             margin: _margin | ||||
|         } | ||||
|         return settings; | ||||
|     } | ||||
| @@ -284,6 +294,8 @@ QtObject{ | ||||
|  | ||||
|         useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand | ||||
|         customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand | ||||
|  | ||||
|         useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn; | ||||
|     } | ||||
|  | ||||
|     function loadProfileString(profileString){ | ||||
| @@ -317,6 +329,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(); | ||||
|     } | ||||
|  | ||||
| @@ -386,7 +400,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.2483, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -413,7 +428,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.0, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -440,7 +456,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.5, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -467,7 +484,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0, | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -494,7 +512,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.099, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -521,7 +540,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.2969, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -548,7 +568,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.4, | ||||
|                   "staticNoise": 0.0503, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -575,7 +596,8 @@ QtObject{ | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.2, | ||||
|                   "staticNoise": 0, | ||||
|                   "windowOpacity": 1 | ||||
|                   "windowOpacity": 1, | ||||
|                   "margin": 0.5 | ||||
|                 }' | ||||
|             builtin: true | ||||
|         } | ||||
| @@ -602,7 +624,8 @@ QtObject{ | ||||
|                   "saturationColor": 0.4983, | ||||
|                   "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: | ||||
|   | ||||
| @@ -9,6 +9,12 @@ MenuBar { | ||||
|         visible: defaultMenuBar.visible | ||||
|         MenuItem {action: quitAction} | ||||
|     } | ||||
|     Menu { | ||||
|         title: qsTr("Terminal") | ||||
|         visible: defaultMenuBar.visible | ||||
|         MenuItem {action: newAction} | ||||
|         MenuItem {action: closeAction} | ||||
|     } | ||||
|     Menu { | ||||
|         title: qsTr("Edit") | ||||
|         visible: defaultMenuBar.visible && appSettings.showMenubar | ||||
|   | ||||
| @@ -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,6 +13,8 @@ ShaderEffect { | ||||
|     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize | ||||
|     property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) | ||||
|  | ||||
|     property size aadelta: Qt.size(1.0 / width, 1.0 / height) | ||||
|  | ||||
|     fragmentShader: " | ||||
|         #ifdef GL_ES | ||||
|             precision mediump float; | ||||
| @@ -22,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; | ||||
|  | ||||
| @@ -39,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; | ||||
|         } | ||||
| @@ -51,12 +58,17 @@ ShaderEffect { | ||||
|             float alpha = 0.0; | ||||
|  | ||||
|             float outShadowLength = shadowLength; | ||||
|             float inShadowLength = shadowLength * 0.5; | ||||
|  | ||||
|             float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords)); | ||||
|             outShadow = clamp(0.0, 1.0, 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 = 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,8 +70,24 @@ 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" | ||||
|  | ||||
| @@ -167,6 +184,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 +219,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 +235,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 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -87,29 +87,5 @@ Tab{ | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         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 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -28,7 +28,7 @@ Window { | ||||
|     id: settings_window | ||||
|     title: qsTr("Settings") | ||||
|     width: 580 | ||||
|     height: 500 | ||||
|     height: 400 | ||||
|  | ||||
|     property int tabmargins: 15 | ||||
|  | ||||
| @@ -54,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 | ||||
|         } | ||||
|   | ||||
| @@ -24,6 +24,7 @@ import QtGraphicalEffects 1.0 | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| Item { | ||||
|     property SlowBurnIn slowBurnInEffect | ||||
|     property ShaderEffectSource source | ||||
|     property BurnInEffect burnInEffect | ||||
|     property ShaderEffectSource bloomSource | ||||
| @@ -44,6 +45,7 @@ Item { | ||||
|  | ||||
|          property ShaderEffectSource screenBuffer: frameBuffer | ||||
|          property ShaderEffectSource burnInSource: burnInEffect.source | ||||
|          property ShaderEffectSource frameSource: terminalFrameLoader.item | ||||
|  | ||||
|          property color fontColor: parent.fontColor | ||||
|          property color backgroundColor: parent.backgroundColor | ||||
| @@ -52,11 +54,19 @@ Item { | ||||
|          property real ambientLight: parent.ambientLight | ||||
|  | ||||
|          property real flickering: appSettings.flickering | ||||
|          property real horizontalSync: appSettings.horizontalSync * 0.5 | ||||
|          property real horizontalSync: appSettings.horizontalSync | ||||
|          property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync) | ||||
|          property real glowingLine: appSettings.glowingLine * 0.2 | ||||
|          property real burnIn: appSettings.burnIn | ||||
|  | ||||
|          // 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) | ||||
| @@ -114,7 +124,7 @@ Item { | ||||
|                  uniform lowp float flickering;" : "") + | ||||
|  | ||||
|              (!fallBack && horizontalSync !== 0.0 ?" | ||||
|                  uniform lowp float horizontalSync; | ||||
|                  uniform lowp float horizontalSyncStrength; | ||||
|                  varying lowp float distortionScale; | ||||
|                  varying lowp float distortionFreq;" : "") + | ||||
|  | ||||
| @@ -132,8 +142,8 @@ Item { | ||||
|                  : "") + | ||||
|  | ||||
|                  (!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);" | ||||
|                  : "") + | ||||
|  | ||||
| @@ -160,6 +170,8 @@ Item { | ||||
|                  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) | ||||
| @@ -167,7 +179,8 @@ Item { | ||||
|                  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 ? " | ||||
| @@ -178,7 +191,7 @@ Item { | ||||
|                  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 ? " | ||||
| @@ -238,8 +251,8 @@ Item { | ||||
|                      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);" | ||||
|                  : "") + | ||||
|  | ||||
| @@ -247,12 +260,9 @@ Item { | ||||
|                      float noise = staticNoise;" : "") + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      vec2 curvatureCoords = barrel(qt_TexCoord0, cc); | ||||
|                      float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords)); | ||||
|                      vec2 staticCoords = curvatureCoords;" | ||||
|                      vec2 staticCoords = barrel(qt_TexCoord0, cc);" | ||||
|                  :" | ||||
|                      vec2 staticCoords = qt_TexCoord0; | ||||
|                      float staticInScreen = 1.0;") + | ||||
|                      vec2 staticCoords = qt_TexCoord0;") + | ||||
|  | ||||
|                  "vec2 coords = qt_TexCoord0;" + | ||||
|  | ||||
| @@ -283,10 +293,7 @@ Item { | ||||
|                  (glowingLine !== 0 ? " | ||||
|                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + | ||||
|  | ||||
|                  "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen); | ||||
|                   float inScreen2 = isInScreen(barrel(txt_coords, cc)); | ||||
|                   vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb; | ||||
|                   vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" + | ||||
|                  "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + | ||||
|  | ||||
|                  (burnIn !== 0 ? " | ||||
|                      vec4 txt_blur = texture2D(burnInSource, staticCoords); | ||||
| @@ -295,6 +302,11 @@ Item { | ||||
|                      txt_color = max(txt_color, convertWithChroma(burnInColor));" | ||||
|                  : "") + | ||||
|  | ||||
|                  (slowBurnIn !== 0 ? " | ||||
|                      vec4 txt_blur = texture2D(slowBurnInSource, staticCoords); | ||||
|                      txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a)); | ||||
|                  " : "") + | ||||
|  | ||||
|                   "txt_color += fontColor.rgb * vec3(color);" + | ||||
|  | ||||
|                  "vec3 finalColor = txt_color;" + | ||||
| @@ -305,13 +317,12 @@ Item { | ||||
|                  (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);" | ||||
|                  : "") + | ||||
|  | ||||
|                  "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords)); | ||||
|                   inShadow = pow(inShadow, 100.0) + 0.35 * inShadow * inShadow;  // Inner shadow and antialiasing when screen background is bright. | ||||
|                   finalColor = mix(finalColor, vec3(0.0), inShadow); | ||||
|  | ||||
|                   finalColor = mix(origTxtColor, finalColor, staticInScreen); | ||||
|                   gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|              "}" | ||||
|  | ||||
|           onStatusChanged: { | ||||
| @@ -326,6 +337,29 @@ Item { | ||||
|           } | ||||
|      } | ||||
|  | ||||
|      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 | ||||
|  | ||||
| @@ -415,6 +449,10 @@ Item { | ||||
|                  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)); | ||||
|              }" + | ||||
| @@ -457,11 +495,17 @@ Item { | ||||
|                   "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);" | ||||
|                       vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * reflectionMask);" | ||||
|                  : | ||||
|                      "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") + | ||||
|                      "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") + | ||||
|  | ||||
|                      (bloom !== 0 ? | ||||
|                          "vec4 bloomFullColor = texture2D(bloomSource, txt_coords); | ||||
| @@ -473,23 +517,9 @@ Item { | ||||
|  | ||||
|                  "finalColor *= screen_brightness;" + | ||||
|  | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); | ||||
|                      finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" | ||||
|                  :"") + | ||||
|  | ||||
|                  "gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|              "}" | ||||
|  | ||||
|          Loader { | ||||
|              anchors.fill: parent | ||||
|              active: screenCurvature !== 0 | ||||
|  | ||||
|              sourceComponent: NewTerminalFrame { | ||||
|                  blending: true | ||||
|              } | ||||
|          } | ||||
|  | ||||
|          onStatusChanged: { | ||||
|              // Print warning messages | ||||
|              if (log) console.log(log); | ||||
|   | ||||
							
								
								
									
										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 | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -12,6 +12,7 @@ ShaderTerminal { | ||||
|  | ||||
|     source: terminal.mainSource | ||||
|     burnInEffect: terminal.burnInEffect | ||||
|     slowBurnInEffect: terminal.slowBurnInEffect | ||||
|     virtual_resolution: terminal.virtualResolution | ||||
|  | ||||
|     TimeManager{ | ||||
|   | ||||
| @@ -67,6 +67,22 @@ ApplicationWindow{ | ||||
|     color: "#00000000" | ||||
|     title: terminalContainer.title || qsTr(appSettings.wintitle) | ||||
|  | ||||
| 	Action { | ||||
|         id: newAction | ||||
|         text: qsTr("New Window") | ||||
|         shortcut: Qt.platform.os === "osx" ? StandardKey.New : "Ctrl+Shift+N" | ||||
|         onTriggered: { | ||||
|             root.newWindow() | ||||
|         } | ||||
|     } | ||||
|     Action { | ||||
|         id: closeAction | ||||
|         text: qsTr("Close Window") | ||||
|         shortcut: Qt.platform.os === "osx" ? StandardKey.Close : "Ctrl+Shift+W" | ||||
|         onTriggered: { | ||||
|             terminalWindow.close() | ||||
|         } | ||||
|     } | ||||
|     Action { | ||||
|         id: showMenubarAction | ||||
|         text: qsTr("Show Menubar") | ||||
| @@ -157,9 +173,6 @@ ApplicationWindow{ | ||||
|         } | ||||
|     } | ||||
|     onClosing: { | ||||
|         // OSX Since we are currently supporting only one window | ||||
|         // quit the application when it is closed. | ||||
|         if (Qt.platform.os === "osx") | ||||
|             Qt.quit() | ||||
|         root.closeWindow() | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -17,13 +17,14 @@ | ||||
|         <file>InsertNameDialog.qml</file> | ||||
|         <file>SettingsEffectsTab.qml</file> | ||||
|         <file>main.qml</file> | ||||
|         <file>root.qml</file> | ||||
|         <file>SettingsTerminalTab.qml</file> | ||||
|         <file>FontScanlines.qml</file> | ||||
|         <file>fonts/1977-apple2/PrintChar21.ttf</file> | ||||
|         <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> | ||||
| @@ -43,5 +44,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> | ||||
|   | ||||
							
								
								
									
										43
									
								
								app/qml/root.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								app/qml/root.qml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| /******************************************************************************* | ||||
|  * 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.Window 2.1 | ||||
|  | ||||
| QtObject { | ||||
|     id: root | ||||
|     property int terminalCount | ||||
|  | ||||
|     function newWindow() { | ||||
|         var component = Qt.createComponent("main.qml") | ||||
|         var window = component.createObject()			 | ||||
|         window.show() | ||||
|         terminalCount = terminalCount + 1 | ||||
|     } | ||||
|     function closeWindow() { | ||||
|         terminalCount = terminalCount - 1 | ||||
|         if (terminalCount == 0) { | ||||
|             Qt.quit() | ||||
|         } | ||||
|     } | ||||
|     Component.onCompleted: { | ||||
|         terminalCount = 0 | ||||
|         root.newWindow() | ||||
|     } | ||||
| } | ||||
| @@ -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,12 @@ 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 | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user