From 7faf96368daff41b9ff36babadea643a01587a3d Mon Sep 17 00:00:00 2001 From: ArsenDarkwind Date: Wed, 24 Sep 2014 00:16:22 -0400 Subject: [PATCH 001/390] Updated the README.md with some more up to date screenshots showing off some of the settings and at different resolutions too. --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d08f7f1..a0ccab8 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,11 @@ It uses the Konsole engine which is powerful and mature. This terminal emulator requires Qt 5.2 or higher to run. ##Screenshots -![Image]() -![Image]() -![Image]() +![Image]() +![Image]() +![Image]() +![Image]() +![Image]() ## 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: -- 2.52.0 From 8c83b14cc645b44403ef6a1a7263779c449973cd Mon Sep 17 00:00:00 2001 From: ArsenDarkwind Date: Wed, 24 Sep 2014 13:37:05 -0400 Subject: [PATCH 002/390] Fixed screenshots to be more consistant and show off usage a bit better --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a0ccab8..20acf7c 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,10 @@ It uses the Konsole engine which is powerful and mature. This terminal emulator requires Qt 5.2 or higher to run. ##Screenshots -![Image]() -![Image]() -![Image]() -![Image]() -![Image]() +![Image]() +![Image]() +![Image]() +![Image]() ## 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: @@ -93,4 +92,4 @@ qmake && make # Have fun! ./cool-retro-term -``` +``` \ No newline at end of file -- 2.52.0 From 9caae00db95ff6b158f9d986c56434a7c1628914 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Sun, 28 Sep 2014 02:47:34 -0400 Subject: [PATCH 003/390] adds compiled files to the gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 8204296..db0327d 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,7 @@ Makefile* # Ubuntu SDk *.excludes *.json + +# Excludes compiled files +imports +cool-retro-term -- 2.52.0 From a08c738a65cf4efd7f4f8078ef38e198f06962db Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sun, 28 Sep 2014 18:23:14 +0200 Subject: [PATCH 004/390] Font width is customizable. Introducing non squared pixels resolutions. --- app/qml/ApplicationSettings.qml | 3 +++ app/qml/FontPixels.qml | 7 ------- app/qml/FontScanlines.qml | 7 ------- app/qml/PreprocessedTerminal.qml | 4 +++- app/qml/SettingsTerminalTab.qml | 15 +++++++++++++++ app/qml/SettingsWindow.qml | 2 +- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 350bc41..9ee4ecc 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -120,6 +120,9 @@ Item{ property var fontScalingList: [0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5] property int fontScalingIndex: 5 + property real fontWidth: 1.0 + onFontWidthChanged: handleFontChanged(); + function setScalingIndex(newScaling){ fontScalingIndex = newScaling; fontScalingChanged(); diff --git a/app/qml/FontPixels.qml b/app/qml/FontPixels.qml index 4c0afbd..9f5143f 100644 --- a/app/qml/FontPixels.qml +++ b/app/qml/FontPixels.qml @@ -32,13 +32,6 @@ Item{ ListModel{ id: fontlist - ListElement{ - text: "Commodore PET 2Y (1977)" - source: "fonts/1977-commodore-pet/COMMODORE_PET_2y.ttf" - lineSpacing: 2 - pixelSize: 16 - baseScaling: 3.0 - } ListElement{ text: "Commodore PET (1977)" source: "fonts/1977-commodore-pet/COMMODORE_PET.ttf" diff --git a/app/qml/FontScanlines.qml b/app/qml/FontScanlines.qml index 4c0afbd..9f5143f 100644 --- a/app/qml/FontScanlines.qml +++ b/app/qml/FontScanlines.qml @@ -32,13 +32,6 @@ Item{ ListModel{ id: fontlist - ListElement{ - text: "Commodore PET 2Y (1977)" - source: "fonts/1977-commodore-pet/COMMODORE_PET_2y.ttf" - lineSpacing: 2 - pixelSize: 16 - baseScaling: 3.0 - } ListElement{ text: "Commodore PET (1977)" source: "fonts/1977-commodore-pet/COMMODORE_PET.ttf" diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 5d6118a..4fcc4b1 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -104,7 +104,9 @@ Item{ font.pixelSize = pixelSize; font.family = fontLoader.name; - width = Qt.binding(function() {return Math.floor(terminalContainer.width / screenScaling);}); + var fontWidth = 1.0 / shadersettings.fontWidth; + + width = Qt.binding(function() {return Math.floor(fontWidth * terminalContainer.width / screenScaling);}); height = Qt.binding(function() {return Math.floor(terminalContainer.height / screenScaling);}); setLineSpacing(lineSpacing); diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml index 22c6084..2b2dcc8 100644 --- a/app/qml/SettingsTerminalTab.qml +++ b/app/qml/SettingsTerminalTab.qml @@ -87,6 +87,21 @@ Tab{ text: shadersettings.fontScalingList[scalingChanger.value].toFixed(2) } } + Text{ text: qsTr("Font Width") } + RowLayout{ + Layout.fillWidth: true + Slider{ + Layout.fillWidth: true + id: widthChanger + onValueChanged: shadersettings.fontWidth = value; + value: shadersettings.fontWidth + stepSize: 0.05 + Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 + } + Text{ + text: Math.round(widthChanger.value * 100) + "%" + } + } } } GroupBox{ diff --git a/app/qml/SettingsWindow.qml b/app/qml/SettingsWindow.qml index e7ab486..a121bcc 100644 --- a/app/qml/SettingsWindow.qml +++ b/app/qml/SettingsWindow.qml @@ -28,7 +28,7 @@ Window { id: settings_window title: qsTr("Settings") width: 640 - height: 450 + height: 480 property int tabmargins: 15 -- 2.52.0 From d885f27e0b0fbfa694383597665853cf49567bf4 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Mon, 29 Sep 2014 01:41:43 +0200 Subject: [PATCH 005/390] Font width is now stored and loaded. Profiles have been updated. --- app/qml/ApplicationSettings.qml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 9ee4ecc..037920d 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -196,7 +196,8 @@ Item{ contrast: contrast, ambient_light: ambient_light, windowOpacity: windowOpacity, - fontIndex: fontIndexes[rasterization] + fontIndex: fontIndexes[rasterization], + fontWidth: fontWidth } return JSON.stringify(settings); } @@ -272,6 +273,7 @@ Item{ windowOpacity = settings.windowOpacity !== undefined ? settings.windowOpacity : windowOpacity; fontIndexes[rasterization] = settings.fontIndex !== undefined ? settings.fontIndex : fontIndexes[rasterization]; + fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth; } function storeCustomProfiles(){ @@ -323,47 +325,47 @@ Item{ id: profileslist ListElement{ text: "Default Amber" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.65,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.4,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.65,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.4,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Default Green" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.45,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.08,"jitter":0.18,"motion_blur":0.45,"noise_strength":0.1,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Default Scanlines" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#00ff5b","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.07,"jitter":0.11,"motion_blur":0.4,"noise_strength":0.05,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#00ff5b","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.07,"jitter":0.11,"motion_blur":0.4,"noise_strength":0.05,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Default Pixelated" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.1,"jitter":0,"motion_blur":0.45,"noise_strength":0.14,"rasterization":2,"screen_distortion":0.05,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.1,"contrast":0.85,"fontIndex":0,"font_color":"#ff8100","frames_index":1,"glowing_line_strength":0.2,"horizontal_sincronization":0.1,"jitter":0,"motion_blur":0.45,"noise_strength":0.14,"rasterization":2,"screen_distortion":0.05,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Apple ][" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.5,"brightness":0.5,"brightness_flickering":0.2,"contrast":0.85,"fontIndex":2,"font_color":"#2fff91","frames_index":1,"glowing_line_strength":0.22,"horizontal_sincronization":0.08,"jitter":0.1,"motion_blur":0.65,"noise_strength":0.08,"rasterization":1,"screen_distortion":0.18,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.5,"brightness":0.5,"brightness_flickering":0.2,"contrast":0.85,"fontIndex":2,"font_color":"#2fff91","frames_index":1,"glowing_line_strength":0.22,"horizontal_sincronization":0.08,"jitter":0.1,"motion_blur":0.65,"noise_strength":0.08,"rasterization":1,"screen_distortion":0.18,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Vintage" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.54,"contrast":0.85,"fontIndex":0,"font_color":"#00ff3e","frames_index":2,"glowing_line_strength":0.3,"horizontal_sincronization":0.2,"jitter":0.4,"motion_blur":0.75,"noise_strength":0.2,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.54,"contrast":0.85,"fontIndex":0,"font_color":"#00ff3e","frames_index":2,"glowing_line_strength":0.3,"horizontal_sincronization":0.2,"jitter":0.4,"motion_blur":0.75,"noise_strength":0.2,"rasterization":1,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "IBM Dos" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":1,"saturation_color":0,"rgb_shift":0.5}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4,"brightness":0.5,"brightness_flickering":0.07,"contrast":0.85,"fontIndex":7,"font_color":"#ffffff","frames_index":1,"glowing_line_strength":0.13,"horizontal_sincronization":0,"jitter":0.08,"motion_blur":0.3,"noise_strength":0.03,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":1,"saturation_color":0,"rgb_shift":0.5,"fontWidth":1.0}' builtin: true } ListElement{ text: "IBM 3278" - obj_string: '{"ambient_light":0.1,"background_color":"#000000","bloom_strength":0.15,"brightness":0.5,"brightness_flickering":0,"contrast":0.95,"fontIndex":8,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0,"horizontal_sincronization":0,"jitter":0,"motion_blur":0.6,"noise_strength":0,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.1,"background_color":"#000000","bloom_strength":0.15,"brightness":0.5,"brightness_flickering":0,"contrast":0.95,"fontIndex":8,"font_color":"#0ccc68","frames_index":1,"glowing_line_strength":0,"horizontal_sincronization":0,"jitter":0,"motion_blur":0.6,"noise_strength":0,"rasterization":0,"screen_distortion":0.1,"windowOpacity":1,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } ListElement{ text: "Transparent Green" - obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4549689440993788,"brightness":0.5,"brightness_flickering":0.20341614906832298,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":0,"glowing_line_strength":0.15993788819875776,"horizontal_sincronization":0.05045871559633028,"jitter":0.20341614906832298,"motion_blur":0.24999999999999997,"noise_strength":0.20031055900621117,"rasterization":0,"screen_distortion":0.05045871559633028,"windowOpacity":0.5956221198156681,"chroma_color":0,"saturation_color":0,"rgb_shift":0}' + obj_string: '{"ambient_light":0.2,"background_color":"#000000","bloom_strength":0.4549689440993788,"brightness":0.5,"brightness_flickering":0.20341614906832298,"contrast":0.85,"fontIndex":0,"font_color":"#0ccc68","frames_index":0,"glowing_line_strength":0.15993788819875776,"horizontal_sincronization":0.05045871559633028,"jitter":0.20341614906832298,"motion_blur":0.24999999999999997,"noise_strength":0.20031055900621117,"rasterization":0,"screen_distortion":0.05045871559633028,"windowOpacity":0.5956221198156681,"chroma_color":0,"saturation_color":0,"rgb_shift":0,"fontWidth":1.0}' builtin: true } } -- 2.52.0 From 1dd633be0bf3c66cfd4960eac557cb54a67f9f5f Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Mon, 29 Sep 2014 02:00:54 +0200 Subject: [PATCH 006/390] Reorganize settings window. --- app/qml/SettingsGeneralTab.qml | 46 +++-------------- app/qml/SettingsPerformanceTab.qml | 82 ++++++++++++++++++++++++++++++ app/qml/SettingsTerminalTab.qml | 14 ----- app/qml/SettingsWindow.qml | 12 ++++- app/qml/resources.qrc | 1 + 5 files changed, 101 insertions(+), 54 deletions(-) create mode 100644 app/qml/SettingsPerformanceTab.qml diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml index c4ea35a..8c6cb47 100644 --- a/app/qml/SettingsGeneralTab.qml +++ b/app/qml/SettingsGeneralTab.qml @@ -92,49 +92,17 @@ Tab{ } } GroupBox{ - title: qsTr("Performace") + title: qsTr("Frame") Layout.fillWidth: true - Layout.columnSpan: 2 - anchors.left: parent.left - anchors.right: parent.right - GridLayout{ + RowLayout{ anchors.fill: parent - rows: 3 - columns: 3 - CheckBox{ - Layout.columnSpan: 3 - checked: !shadersettings._frameReflections - text: qsTr("Disable reflections") - onCheckedChanged: shadersettings._frameReflections = !checked - enabled: shadersettings.reflectionsAllowed - } - CheckBox{ - property int fps: checked ? slider.value : 0 - onFpsChanged: shadersettings.fps = fps - checked: shadersettings.fps !== 0 - text: qsTr("Limit FPS") - } - Slider{ - id: slider + ComboBox{ + id: framescombobox Layout.fillWidth: true - stepSize: 1 - maximumValue: 60 - minimumValue: 1 - enabled: shadersettings.fps !== 0 - value: shadersettings.fps !== 0 ? shadersettings.fps : 60 + model: shadersettings.frames_list + currentIndex: shadersettings.frames_index + onCurrentIndexChanged: shadersettings.frames_index = currentIndex } - Text{text: slider.value} - Text{text: qsTr("Texture quality")} - Slider{ - Layout.fillWidth: true - id: txtslider - onValueChanged: shadersettings.window_scaling = value; - value: shadersettings.window_scaling - tickmarksEnabled: true - stepSize: 0.25 - Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 - } - Text{text: Math.round(txtslider.value * 100) + "%"} } } } diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml new file mode 100644 index 0000000..66c555e --- /dev/null +++ b/app/qml/SettingsPerformanceTab.qml @@ -0,0 +1,82 @@ +/******************************************************************************* +* 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 . +*******************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 + +Tab{ + ColumnLayout{ + anchors.fill: parent + GroupBox{ + title: qsTr("General") + Layout.fillWidth: true + Layout.columnSpan: 2 + anchors.left: parent.left + anchors.right: parent.right + GridLayout{ + anchors.fill: parent + rows: 2 + columns: 3 + CheckBox{ + property int fps: checked ? slider.value : 0 + onFpsChanged: shadersettings.fps = fps + checked: shadersettings.fps !== 0 + text: qsTr("Limit FPS") + } + Slider{ + id: slider + Layout.fillWidth: true + stepSize: 1 + maximumValue: 60 + minimumValue: 1 + enabled: shadersettings.fps !== 0 + value: shadersettings.fps !== 0 ? shadersettings.fps : 60 + } + Text{text: slider.value} + Text{text: qsTr("Texture quality")} + Slider{ + Layout.fillWidth: true + id: txtslider + onValueChanged: shadersettings.window_scaling = value; + value: shadersettings.window_scaling + tickmarksEnabled: true + stepSize: 0.25 + Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 + } + Text{text: Math.round(txtslider.value * 100) + "%"} + } + } + GroupBox{ + title: qsTr("Frame") + Layout.fillWidth: true + Layout.columnSpan: 2 + anchors.left: parent.left + anchors.right: parent.right + CheckBox{ + Layout.columnSpan: 3 + checked: !shadersettings._frameReflections + text: qsTr("Disable reflections") + onCheckedChanged: shadersettings._frameReflections = !checked + enabled: shadersettings.reflectionsAllowed + } + } + } +} diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml index 2b2dcc8..7cdc9d1 100644 --- a/app/qml/SettingsTerminalTab.qml +++ b/app/qml/SettingsTerminalTab.qml @@ -142,19 +142,5 @@ Tab{ } } } - GroupBox{ - title: qsTr("Frame") - Layout.fillWidth: true - RowLayout{ - anchors.fill: parent - ComboBox{ - id: framescombobox - Layout.fillWidth: true - model: shadersettings.frames_list - currentIndex: shadersettings.frames_index - onCurrentIndexChanged: shadersettings.frames_index = currentIndex - } - } - } } } diff --git a/app/qml/SettingsWindow.qml b/app/qml/SettingsWindow.qml index a121bcc..7726402 100644 --- a/app/qml/SettingsWindow.qml +++ b/app/qml/SettingsWindow.qml @@ -28,27 +28,37 @@ Window { id: settings_window title: qsTr("Settings") width: 640 - height: 480 + height: 440 property int tabmargins: 15 TabView{ + id: tabView anchors.fill: parent anchors.margins: 10 SettingsGeneralTab{ + id: generalTab title: qsTr("General") anchors.fill: parent anchors.margins: tabmargins } SettingsTerminalTab{ + id: terminalTab title: qsTr("Terminal") anchors.fill: parent anchors.margins: tabmargins } SettingsEffectsTab{ + id: effectsTab title: qsTr("Effects") anchors.fill: parent anchors.margins: tabmargins } + SettingsPerformanceTab{ + id: performanceTab + title: qsTr("Performance") + anchors.fill: parent + anchors.margins: tabmargins + } } } diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index a9df1ff..dfc44ca 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -64,5 +64,6 @@ fonts/1985-ibm-pc-vga/dos437.txt Storage.qml CRTMainMenuBar.qml + SettingsPerformanceTab.qml -- 2.52.0 From 2ff6c71c23de9e46ad3d86af17513ac701db023a Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Mon, 29 Sep 2014 21:26:41 +0200 Subject: [PATCH 007/390] Adding adjustable scanline quality. Textures are now always smoothed. Terminal texture is now scaled (by integer factors) depending on the scaling level. --- app/qml/ApplicationSettings.qml | 8 +++++- app/qml/PreprocessedTerminal.qml | 18 +++++++++--- app/qml/SettingsPerformanceTab.qml | 45 ++++++++++++++++++++++++++++-- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 037920d..6752953 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -85,6 +85,9 @@ Item{ property int rasterization: no_rasterization + property int scanline_quality: 3 + onScanline_qualityChanged: handleFontChanged(); + ListModel{ id: framelist ListElement{text: "No frame"; source: "./frames/NoFrame.qml"; reflections: false} @@ -170,7 +173,8 @@ Item{ fontScalingIndex: fontScalingIndex, fontIndexes: fontIndexes, frameReflections: _frameReflections, - showMenubar: showMenubar + showMenubar: showMenubar, + scanline_quality: scanline_quality } return JSON.stringify(settings); } @@ -240,6 +244,8 @@ Item{ _frameReflections = settings.frameReflections !== undefined ? settings.frameReflections : _frameReflections; showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar; + + scanline_quality = settings.scanline_quality !== undefined ? settings.scanline_quality : scanline_quality; } function loadProfileString(profileString){ diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 4fcc4b1..ae696c8 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -84,6 +84,8 @@ Item{ colorScheme: "cool-retro-term" + smooth: false + session: KSession { id: ksession kbScheme: "xterm" @@ -109,6 +111,12 @@ Item{ width = Qt.binding(function() {return Math.floor(fontWidth * terminalContainer.width / screenScaling);}); height = Qt.binding(function() {return Math.floor(terminalContainer.height / screenScaling);}); + var scaleTexture = Math.max(Math.round(screenScaling / shadersettings.scanline_quality), 1.0); + + kterminalSource.textureSize = Qt.binding(function () { + return Qt.size(kterminal.width * scaleTexture, kterminal.height * scaleTexture); + }); + setLineSpacing(lineSpacing); update(); restartBlurredSource(); @@ -176,7 +184,6 @@ Item{ id: kterminalSource sourceItem: kterminal hideSource: true - smooth: mScanlines == shadersettings.no_rasterization wrapMode: ShaderEffectSource.ClampToEdge live: false @@ -202,8 +209,6 @@ Item{ hideSource: true wrapMode: kterminalSource.wrapMode - smooth: mScanlines == shadersettings.no_rasterization - function restartBlurSource(){ livetimer.restart(); } @@ -230,12 +235,17 @@ Item{ livetimer.restart(); } } + Connections{ + target: shadersettings + onScanline_qualityChanged: restartBlurredSource(); + } } } Loader{ id: blurredTerminalLoader - anchors.fill: kterminal + width: kterminalSource.textureSize.width + height: kterminalSource.textureSize.height active: mBlur !== 0 sourceComponent: ShaderEffect { diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml index 66c555e..16ae7f1 100644 --- a/app/qml/SettingsPerformanceTab.qml +++ b/app/qml/SettingsPerformanceTab.qml @@ -28,7 +28,6 @@ Tab{ GroupBox{ title: qsTr("General") Layout.fillWidth: true - Layout.columnSpan: 2 anchors.left: parent.left anchors.right: parent.right GridLayout{ @@ -64,14 +63,54 @@ Tab{ Text{text: Math.round(txtslider.value * 100) + "%"} } } + GroupBox{ + title: qsTr("Rasterization") + Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right + GridLayout{ + id: scanlineQualityContainer + anchors.fill: parent + columns: 3 + property alias valsIndex: scanlineQualitySlider.value + property var vals: [4,3,2] + property var valsStrings: [ + qsTr("Low"), + qsTr("Medium"), + qsTr("High"), + qsTr("Very high") + ] + + onValsIndexChanged: shadersettings.scanline_quality = vals[valsIndex]; + + Text{text: qsTr("Scanline quality")} + Slider{ + id: scanlineQualitySlider + Layout.fillWidth: true + onValueChanged: parent.valsIndex = value; + stepSize: 1 + Component.onCompleted: { + minimumValue = 0; + maximumValue = 2; + value = parent.vals.indexOf(shadersettings.scanline_quality); + } + Connections{ + target: shadersettings + onScanline_qualityChanged: + scanlineQualityContainer.valsIndex = scanlineQualityContainer.vals.indexOf(shadersettings.scanline_quality); + } + } + Text{ + text: parent.valsStrings[parent.valsIndex]; + } + } + } GroupBox{ title: qsTr("Frame") Layout.fillWidth: true - Layout.columnSpan: 2 anchors.left: parent.left anchors.right: parent.right CheckBox{ - Layout.columnSpan: 3 checked: !shadersettings._frameReflections text: qsTr("Disable reflections") onCheckedChanged: shadersettings._frameReflections = !checked -- 2.52.0 From e815fe27873e820cad04fd7129580a09da2580c4 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Mon, 29 Sep 2014 22:38:33 +0200 Subject: [PATCH 008/390] Setting scaling stepSize to 0.05 instead of 0.1. Refactored scaling handling. --- app/qml/ApplicationSettings.qml | 27 +++++++++++++-------------- app/qml/SettingsTerminalTab.qml | 29 +++++++++++++---------------- app/qml/main.qml | 11 ++--------- 3 files changed, 28 insertions(+), 39 deletions(-) diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 6752953..d907efd 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -119,30 +119,29 @@ Item{ onLoaded: handleFontChanged() } - signal fontScalingChanged - property var fontScalingList: [0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5] - property int fontScalingIndex: 5 + property real fontScaling: 1.0 + onFontScalingChanged: handleFontChanged(); - property real fontWidth: 1.0 - onFontWidthChanged: handleFontChanged(); - - function setScalingIndex(newScaling){ - fontScalingIndex = newScaling; - fontScalingChanged(); + function incrementScaling(){ + fontScaling = Math.min(fontScaling + 0.05, 2.50); handleFontChanged(); } - function getScalingIndex(){ - return fontScalingIndex; + function decrementScaling(){ + fontScaling = Math.max(fontScaling - 0.05, 0.50); + handleFontChanged(); } + property real fontWidth: 1.0 + onFontWidthChanged: handleFontChanged(); + property var fontIndexes: [0,0,0] property var fontlist: fontManager.item.fontlist function handleFontChanged(){ if(!fontManager.item) return; fontManager.item.selectedFontIndex = fontIndexes[rasterization]; - fontManager.item.scaling = fontScalingList[fontScalingIndex]; + fontManager.item.scaling = fontScaling; var fontSource = fontManager.item.source; var pixelSize = fontManager.item.pixelSize; @@ -170,7 +169,7 @@ Item{ fps: fps, window_scaling: window_scaling, show_terminal_size: show_terminal_size, - fontScalingIndex: fontScalingIndex, + fontScaling: fontScaling, fontIndexes: fontIndexes, frameReflections: _frameReflections, showMenubar: showMenubar, @@ -239,7 +238,7 @@ Item{ window_scaling = settings.window_scaling !== undefined ? settings.window_scaling : window_scaling fontIndexes = settings.fontIndexes !== undefined ? settings.fontIndexes : fontIndexes - fontScalingIndex = settings.fontScalingIndex !== undefined ? settings.fontScalingIndex : fontScalingIndex + fontScaling = settings.fontScaling !== undefined ? settings.fontScaling : fontScaling _frameReflections = settings.frameReflections !== undefined ? settings.frameReflections : _frameReflections; diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml index 7cdc9d1..02799dc 100644 --- a/app/qml/SettingsTerminalTab.qml +++ b/app/qml/SettingsTerminalTab.qml @@ -35,11 +35,8 @@ Tab{ model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")] currentIndex: shadersettings.rasterization onCurrentIndexChanged: { - scalingChanger.enabled = false; shadersettings.rasterization = currentIndex fontChanger.updateIndex(); - scalingChanger.updateIndex(); - scalingChanger.enabled = true; } } } @@ -67,24 +64,24 @@ Tab{ RowLayout{ Layout.fillWidth: true Slider{ - id: scalingChanger Layout.fillWidth: true - minimumValue: 0 - maximumValue: shadersettings.fontScalingList.length - 1 - stepSize: 1 - tickmarksEnabled: true - value: updateIndex() - onValueChanged: { - if(!enabled) return; //Ugly and hacky solution. Look for a better solution. - shadersettings.setScalingIndex(value); + id: fontScalingChanger + onValueChanged: if(enabled) shadersettings.fontScaling = value + stepSize: 0.05 + enabled: false // Another trick to fix initial bad behavior. + Component.onCompleted: { + minimumValue = 0.5; + maximumValue = 2.5; + value = shadersettings.fontScaling; + enabled = true; } - function updateIndex(){ - value = shadersettings.getScalingIndex(); + Connections{ + target: shadersettings + onFontScalingChanged: fontScalingChanger.value = shadersettings.fontScaling; } - Component.onCompleted: shadersettings.fontScalingChanged.connect(updateIndex); } Text{ - text: shadersettings.fontScalingList[scalingChanger.value].toFixed(2) + text: Math.round(fontScalingChanger.value * 100) + "%" } } Text{ text: qsTr("Font Width") } diff --git a/app/qml/main.qml b/app/qml/main.qml index 96bf53e..8b0089b 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -85,20 +85,13 @@ ApplicationWindow{ id: zoomIn text: qsTr("Zoom In") shortcut: "Ctrl++" - onTriggered: { - var oldScaling = shadersettings.fontScalingIndex; - var maxScalingIndex = shadersettings.fontScalingList.length - 1; - shadersettings.setScalingIndex(Math.min(oldScaling + 1, maxScalingIndex)); - } + onTriggered: shadersettings.incrementScaling(); } Action{ id: zoomOut text: qsTr("Zoom Out") shortcut: "Ctrl+-" - onTriggered: { - var oldScaling = shadersettings.fontScalingIndex; - shadersettings.setScalingIndex(Math.max(oldScaling - 1, 0)); - } + onTriggered: shadersettings.decrementScaling(); } Action{ id: showAboutAction -- 2.52.0 From cc72a28ee34ca5fa384f6be0826d36ad89aa0d69 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Tue, 30 Sep 2014 00:10:14 +0200 Subject: [PATCH 009/390] Updating sources when font settings are changed. --- app/qml/PreprocessedTerminal.qml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index ae696c8..49f9b84 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -77,6 +77,23 @@ Item{ kterminal.copyClipboard(); } + //When settings are updated sources need to be redrawn. + Connections{ + target: shadersettings + onFontScalingChanged: terminalContainer.updateSources(); + onFontWidthChanged: terminalContainer.updateSources(); + } + Connections{ + target: terminalContainer + onWidthChanged: terminalContainer.updateSources(); + onHeightChanged: terminalContainer.updateSources(); + } + function updateSources() { + kterminal.update(); + kterminal.updateImage(); + } + + KTerminal { id: kterminal width: parent.width @@ -95,9 +112,6 @@ Item{ } } - onWidthChanged: update(); - onHeightChanged: update(); - FontLoader{ id: fontLoader } Text{id: fontMetrics; text: "B"; visible: false} -- 2.52.0 From ba77e218173cd691c3507403df838a583750783f Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Tue, 30 Sep 2014 00:57:57 +0200 Subject: [PATCH 010/390] Bloom quality is now customizable in performance tab. --- app/qml/ApplicationSettings.qml | 6 +++- app/qml/PreprocessedTerminal.qml | 9 ++--- app/qml/SettingsPerformanceTab.qml | 55 +++++++++++++++++++++++++----- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index d907efd..66327bf 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -69,6 +69,8 @@ Item{ property real motion_blur: 0.40 property real bloom_strength: 0.65 + property real bloom_quality: 1.0 + property real chroma_color: 0.0 property real saturation_color: 0.0 @@ -173,7 +175,8 @@ Item{ fontIndexes: fontIndexes, frameReflections: _frameReflections, showMenubar: showMenubar, - scanline_quality: scanline_quality + scanline_quality: scanline_quality, + bloom_quality: bloom_quality } return JSON.stringify(settings); } @@ -245,6 +248,7 @@ Item{ showMenubar = settings.showMenubar !== undefined ? settings.showMenubar : showMenubar; scanline_quality = settings.scanline_quality !== undefined ? settings.scanline_quality : scanline_quality; + bloom_quality = settings.bloom_quality !== undefined ? settings.bloom_quality : bloom_quality; } function loadProfileString(profileString){ diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 49f9b84..c8e9b29 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -303,14 +303,15 @@ Item{ // BLOOM //////////////////////////////////////////////////////////////// Loader{ + property real scaling: shadersettings.bloom_quality id: bloomEffectLoader active: mBloom != 0 - anchors.fill: parent + width: parent.width * scaling + height: parent.height * scaling sourceComponent: FastBlur{ - radius: 48 + radius: 48 * scaling source: kterminal transparentBorder: true - smooth: false } } Loader{ @@ -319,7 +320,7 @@ Item{ sourceComponent: ShaderEffectSource{ sourceItem: bloomEffectLoader.item hideSource: true - smooth: false + smooth: true } } diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml index 16ae7f1..a0963b8 100644 --- a/app/qml/SettingsPerformanceTab.qml +++ b/app/qml/SettingsPerformanceTab.qml @@ -50,7 +50,7 @@ Tab{ value: shadersettings.fps !== 0 ? shadersettings.fps : 60 } Text{text: slider.value} - Text{text: qsTr("Texture quality")} + Text{text: qsTr("Texture Quality")} Slider{ Layout.fillWidth: true id: txtslider @@ -77,13 +77,12 @@ Tab{ property var valsStrings: [ qsTr("Low"), qsTr("Medium"), - qsTr("High"), - qsTr("Very high") + qsTr("High") ] onValsIndexChanged: shadersettings.scanline_quality = vals[valsIndex]; - Text{text: qsTr("Scanline quality")} + Text{text: qsTr("Scanlines Quality")} Slider{ id: scanlineQualitySlider Layout.fillWidth: true @@ -105,16 +104,56 @@ Tab{ } } } + GroupBox{ + title: qsTr("Bloom") + Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right + GridLayout{ + id: bloomQualityContainer + anchors.fill: parent + columns: 3 + property alias valsIndex: bloomQualitySlider.value + property var vals: [0.25, 0.50, 1.00] + property var valsStrings: [ + qsTr("Low"), + qsTr("Medium"), + qsTr("High") + ] + + onValsIndexChanged: shadersettings.bloom_quality = vals[valsIndex]; + + Text{text: qsTr("Bloom Quality")} + Slider{ + id: bloomQualitySlider + Layout.fillWidth: true + onValueChanged: parent.valsIndex = value; + stepSize: 1 + Component.onCompleted: { + minimumValue = 0; + maximumValue = 2; + value = parent.vals.indexOf(shadersettings.bloom_quality); + } + Connections{ + target: shadersettings + onBloom_qualityChanged: + bloomQualityContainer.valsIndex = bloomQualityContainer.vals.indexOf(shadersettings.bloom_quality); + } + } + Text{ + text: parent.valsStrings[parent.valsIndex]; + } + } + } GroupBox{ title: qsTr("Frame") Layout.fillWidth: true anchors.left: parent.left anchors.right: parent.right CheckBox{ - checked: !shadersettings._frameReflections - text: qsTr("Disable reflections") - onCheckedChanged: shadersettings._frameReflections = !checked - enabled: shadersettings.reflectionsAllowed + checked: shadersettings._frameReflections + text: qsTr("Frame Reflections") + onCheckedChanged: shadersettings._frameReflections = checked } } } -- 2.52.0 From 466fea495d38a41092072ab35a93343052c01d95 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Tue, 30 Sep 2014 16:21:56 +0200 Subject: [PATCH 011/390] Setting asynchronous in loaders. --- app/qml/PreprocessedTerminal.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index c8e9b29..a009476 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -213,6 +213,7 @@ Item{ } Loader{ id: blurredSourceLoader + asynchronous: true active: mBlur !== 0 sourceComponent: ShaderEffectSource{ @@ -261,6 +262,7 @@ Item{ width: kterminalSource.textureSize.width height: kterminalSource.textureSize.height active: mBlur !== 0 + asynchronous: true sourceComponent: ShaderEffect { property variant txt_source: kterminalSource @@ -306,6 +308,7 @@ Item{ property real scaling: shadersettings.bloom_quality id: bloomEffectLoader active: mBloom != 0 + asynchronous: true width: parent.width * scaling height: parent.height * scaling sourceComponent: FastBlur{ @@ -317,6 +320,7 @@ Item{ Loader{ id: bloomSourceLoader active: mBloom != 0 + asynchronous: true sourceComponent: ShaderEffectSource{ sourceItem: bloomEffectLoader.item hideSource: true -- 2.52.0 From 5cfee38329d8459fb93e05321083a4a02b9d37d0 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Tue, 30 Sep 2014 16:33:22 +0200 Subject: [PATCH 012/390] Bloom effect is now updated manually as the others. --- app/qml/PreprocessedTerminal.qml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index a009476..0c0d033 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -322,9 +322,15 @@ Item{ active: mBloom != 0 asynchronous: true sourceComponent: ShaderEffectSource{ + id: _bloomEffectSource sourceItem: bloomEffectLoader.item hideSource: true + live: false smooth: true + Connections{ + target: kterminalSource + onSourceUpdate: _bloomEffectSource.scheduleUpdate(); + } } } -- 2.52.0 From dab4b13bfdb1d9da89f0bb44e7211129eca2e121 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 4 Oct 2014 00:43:15 +0200 Subject: [PATCH 013/390] Adding command line parameters to reset the default settings and to change the initial profile. --- app/main.cpp | 10 +++++++++- app/qml/ApplicationSettings.qml | 24 +++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/app/main.cpp b/app/main.cpp index 259b64f..10c6b96 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -13,7 +13,15 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); QQmlApplicationEngine engine; - // Managing some env variables + // Manage command line arguments from the cpp side + QStringList args = app.arguments(); + if (args.contains("-h") || args.contains("--help")) { + qDebug() << "Usage: " + args.at(0) + " [--default-settings] [-h|--help]"; + qDebug() << " --default-settings Run cool-old-term with the default settings"; + qDebug() << " -p|--profile Run cool-old-term with the given profile."; + qDebug() << " -h|--help Print this help."; + return 0; + } // Manage import paths QStringList importPathList = engine.importPathList(); diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 66327bf..e9fd1b8 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -379,9 +379,31 @@ Item{ } } + function getProfileIndexByName(name) { + for (var i = 0; i < profileslist.count; i++) { + if(profileslist.get(i).text === name) + return i; + } + return -1; + } + Component.onCompleted: { - loadSettings(); + // Manage the arguments from the QML side. + var args = Qt.application.arguments; + if (args.indexOf("--default-settings") === -1) { + loadSettings(); + } + loadCustomProfiles(); + + var profileArgPosition = args.indexOf("--profile"); + if (profileArgPosition !== -1) { + var profileIndex = getProfileIndexByName(args[profileArgPosition + 1]); + if (profileIndex !== -1) + loadProfile(profileIndex); + else + console.log("Warning: selected profile is not valid; ignoring it"); + } } Component.onDestruction: { storeSettings(); -- 2.52.0 From f15440c3c3c8ca865acf66202eaa29ca97a63920 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 4 Oct 2014 14:09:49 +0200 Subject: [PATCH 014/390] Provide a fallback if samplers in vertex shader are not supported. --- app/qml/ShaderTerminal.qml | 51 ++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index dc30bbd..b035ad4 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -56,6 +56,9 @@ ShaderEffect { property real time: timeManager.time property variant randomFunctionSource: randfuncsource + // If something goes wrong activate the fallback version of the shader. + property bool fallBack: false + blending: false //Smooth random texture used for flickering effect. @@ -84,7 +87,6 @@ ShaderEffect { vertexShader: " uniform highp mat4 qt_Matrix; uniform highp float time; - uniform sampler2D randomFunctionSource; uniform highp float disp_left; uniform highp float disp_right; @@ -96,10 +98,13 @@ ShaderEffect { varying highp vec2 qt_TexCoord0;" + - (brightness_flickering !== 0.0 ?" + (!fallBack ? " + uniform sampler2D randomFunctionSource;" : "") + + + (!fallBack && brightness_flickering !== 0.0 ?" varying lowp float brightness; uniform lowp float brightness_flickering;" : "") + - (horizontal_sincronization !== 0.0 ?" + (!fallBack && horizontal_sincronization !== 0.0 ?" varying lowp float horizontal_distortion; uniform lowp float horizontal_sincronization;" : "") + " @@ -107,11 +112,11 @@ ShaderEffect { qt_TexCoord0.x = (qt_MultiTexCoord0.x - disp_left) / (1.0 - disp_left - disp_right); qt_TexCoord0.y = (qt_MultiTexCoord0.y - disp_top) / (1.0 - disp_top - disp_bottom); vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" + - (brightness_flickering !== 0.0 ? " + (!fallBack && brightness_flickering !== 0.0 ? " brightness = 1.0 + (texture2D(randomFunctionSource, coords).g - 0.5) * brightness_flickering;" : "") + - (horizontal_sincronization !== 0.0 ? " + (!fallBack && horizontal_sincronization !== 0.0 ? " float randval = 1.5 * texture2D(randomFunctionSource,(vec2(1.0) -coords) * 0.5).g; float negsinc = 1.0 - 0.6 * horizontal_sincronization;" + " horizontal_distortion = step(negsinc, randval) * (randval - negsinc) * 0.3*horizontal_sincronization;" @@ -148,9 +153,16 @@ ShaderEffect { uniform lowp float jitter;" : "") + (rgb_shift !== 0 ? " uniform lowp float rgb_shift;" : "") + - (brightness_flickering !== 0 ? " + + (fallBack && (brightness_flickering || horizontal_sincronization) ? " + uniform lowp sampler2D randomFunctionSource;" : "") + + (fallBack && horizontal_sincronization !== 0 ? " + uniform lowp float horizontal_sincronization;" : "") + + (fallBack && brightness_flickering !== 0.0 ?" + uniform lowp float brightness_flickering;" : "") + + (!fallBack && brightness_flickering !== 0 ? " varying lowp float brightness;" : "") + - (horizontal_sincronization !== 0 ? " + (!fallBack && horizontal_sincronization !== 0 ? " varying lowp float horizontal_distortion;" : "") + (glowing_line_strength !== 0 ? " @@ -166,6 +178,20 @@ ShaderEffect { "vec2 cc = vec2(0.5) - qt_TexCoord0;" + "float distance = length(cc);" + + //FallBack if there are problem + (fallBack && (brightness_flickering || horizontal_sincronization) ? " + vec2 randCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" : "") + + + (fallBack && brightness_flickering !== 0.0 ? " + float brightness = 1.0 + (texture2D(randomFunctionSource, randCoords).g - 0.5) * brightness_flickering;" + : "") + + + (fallBack && horizontal_sincronization !== 0.0 ? " + float randval = 1.5 * texture2D(randomFunctionSource,(vec2(1.0) - randCoords) * 0.5).g; + float negsinc = 1.0 - 0.6 * horizontal_sincronization;" + " + float horizontal_distortion = step(negsinc, randval) * (randval - negsinc) * 0.3*horizontal_sincronization;" + : "") + + (noise_strength ? " float noise = noise_strength;" : "") + @@ -238,5 +264,14 @@ ShaderEffect { "gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + "}" - onStatusChanged: if (log) console.log(log) //Print warning messages + onStatusChanged: { + // Print warning messages + if (log) + console.log(log); + + // Activate fallback mode + if (status == ShaderEffect.Error) { + fallBack = true; + } + } } -- 2.52.0 From 15a951288d9d65f9b2c78b7e3516a8abb751cab8 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 4 Oct 2014 15:01:50 +0200 Subject: [PATCH 015/390] Imported initial directory implementation from terminal-app. --- app/qml/PreprocessedTerminal.qml | 1 + konsole-qml-plugin/src/Session.cpp | 10 +++++++--- konsole-qml-plugin/src/ksession.cpp | 22 +++++++--------------- konsole-qml-plugin/src/ksession.h | 12 +++++++----- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 0c0d033..6ca87ad 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -137,6 +137,7 @@ Item{ } Component.onCompleted: { shadersettings.terminalFontChanged.connect(handleFontChange); + ksession.startShellProgram(); forceActiveFocus(); } } diff --git a/konsole-qml-plugin/src/Session.cpp b/konsole-qml-plugin/src/Session.cpp index 5eee57f..a3aeb68 100644 --- a/konsole-qml-plugin/src/Session.cpp +++ b/konsole-qml-plugin/src/Session.cpp @@ -31,8 +31,7 @@ #include // Qt -#include -#include +#include #include #include @@ -143,7 +142,12 @@ WId Session::windowId() const // window = window->parentWidget(); // } - return QGuiApplication::focusWindow()->winId(); + //return QGuiApplication::focusWindow()->winId(); + + //There is an issue here! Probably this always returns zero. + //but I try to preseve the behavior there was before. + QQuickWindow * window = _views.first()->window(); + return (window ? window->winId() : 0); } } diff --git a/konsole-qml-plugin/src/ksession.cpp b/konsole-qml-plugin/src/ksession.cpp index a12e838..a1ced10 100644 --- a/konsole-qml-plugin/src/ksession.cpp +++ b/konsole-qml-plugin/src/ksession.cpp @@ -35,8 +35,6 @@ KSession::KSession(QObject *parent) : QObject(parent), m_session(createSession("KSession")) { connect(m_session, SIGNAL(finished()), this, SLOT(sessionFinished())); - - m_session->run(); } KSession::~KSession() @@ -159,33 +157,27 @@ void KSession::setEnvironment(const QStringList &environment) void KSession::setShellProgram(const QString &progname) { - if (!m_session) - return; - m_session->setProgram(progname); } -void KSession::setWorkingDirectory(const QString &dir) +void KSession::setInitialWorkingDirectory(const QString &dir) { - if (!m_session) - return; - + _initialWorkingDirectory = dir; m_session->setInitialWorkingDirectory(dir); } +QString KSession::getInitialWorkingDirectory() +{ + return _initialWorkingDirectory; +} + void KSession::setArgs(QStringList &args) { - if (!m_session) - return; - m_session->setArguments(args); } void KSession::setTextCodec(QTextCodec *codec) { - if (!m_session) - return; - m_session->setCodec(codec); } diff --git a/konsole-qml-plugin/src/ksession.h b/konsole-qml-plugin/src/ksession.h index eb18339..c935b4d 100644 --- a/konsole-qml-plugin/src/ksession.h +++ b/konsole-qml-plugin/src/ksession.h @@ -34,6 +34,7 @@ class KSession : public QObject { Q_OBJECT Q_PROPERTY(QString kbScheme READ getKeyBindings WRITE setKeyBindings NOTIFY changedKeyBindings) + Q_PROPERTY(QString initialWorkingDirectory READ getInitialWorkingDirectory WRITE setInitialWorkingDirectory) public: KSession(QObject *parent = 0); @@ -43,9 +44,6 @@ public: //bool setup(); void addView(KTerminalDisplay *displa); - //start shell program if it was not started in constructor - void startShellProgram(); - int getRandomSeed(); QString getKeyBindings(); @@ -57,8 +55,9 @@ public: // Shell program, default is /bin/bash void setShellProgram(const QString & progname); - //working directory - void setWorkingDirectory(const QString & dir); + //Initial working directory + void setInitialWorkingDirectory(const QString & dir); + QString getInitialWorkingDirectory(); // Shell program args, default is none void setArgs(QStringList & args); @@ -106,6 +105,8 @@ public slots: void setKeyBindings(const QString & kb); void setTitle(QString name); + void startShellProgram(); + int getShellPID(); void changeDir(const QString & dir); @@ -125,6 +126,7 @@ private slots: private: //Konsole::KTerminalDisplay *m_terminalDisplay; + QString _initialWorkingDirectory; Session *m_session; }; -- 2.52.0 From a9ed10573bd3cc6189691e15fc355bc5d07db10a Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 4 Oct 2014 15:26:09 +0200 Subject: [PATCH 016/390] Plugin: export shell program to QML. --- konsole-qml-plugin/src/ksession.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/konsole-qml-plugin/src/ksession.h b/konsole-qml-plugin/src/ksession.h index c935b4d..dbb912e 100644 --- a/konsole-qml-plugin/src/ksession.h +++ b/konsole-qml-plugin/src/ksession.h @@ -52,9 +52,6 @@ public: //environment void setEnvironment(const QStringList & environment); - // Shell program, default is /bin/bash - void setShellProgram(const QString & progname); - //Initial working directory void setInitialWorkingDirectory(const QString & dir); QString getInitialWorkingDirectory(); @@ -107,6 +104,9 @@ public slots: void startShellProgram(); + // Shell program, default is /bin/bash + void setShellProgram(const QString & progname); + int getShellPID(); void changeDir(const QString & dir); -- 2.52.0 From 614793ecd062199e0b1fc4efaa733aa3bf845b67 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 4 Oct 2014 16:21:17 +0200 Subject: [PATCH 017/390] Added --workdir and --program flags. --- app/main.cpp | 16 ++++++++++++++-- app/qml/PreprocessedTerminal.qml | 7 +++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/main.cpp b/app/main.cpp index 10c6b96..0cb4bb6 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -1,12 +1,20 @@ #include #include +#include +#include + #include #include #include +QString getNamedArgument(QStringList args, QString name) { + int index = args.indexOf(name); + return (index != -1) ? args[index + 1] : QString(""); +} + int main(int argc, char *argv[]) { setenv("QT_QPA_PLATFORMTHEME", "", 1); @@ -16,13 +24,18 @@ 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")) { - qDebug() << "Usage: " + args.at(0) + " [--default-settings] [-h|--help]"; + qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir ] [--program ] [-h|--help]"; qDebug() << " --default-settings Run cool-old-term with the default settings"; + qDebug() << " --workdir Change working directory to 'dir'"; + qDebug() << " --program Run the 'prog' in the new terminal."; qDebug() << " -p|--profile Run cool-old-term with the given profile."; qDebug() << " -h|--help Print this help."; return 0; } + engine.rootContext()->setContextProperty("workdir", getNamedArgument(args, "--workdir")); + engine.rootContext()->setContextProperty("shellProgram", getNamedArgument(args, "--program")); + // Manage import paths QStringList importPathList = engine.importPathList(); importPathList.prepend(QCoreApplication::applicationDirPath() + "/imports/"); @@ -32,4 +45,3 @@ int main(int argc, char *argv[]) return app.exec(); } - diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 6ca87ad..97318c5 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -137,6 +137,13 @@ Item{ } Component.onCompleted: { shadersettings.terminalFontChanged.connect(handleFontChange); + + // Retrieve the variable set in main.cpp if arguments are passed. + if (shellProgram) + ksession.setShellProgram(shellProgram); + if (workdir) + ksession.initialWorkingDirectory = workdir; + ksession.startShellProgram(); forceActiveFocus(); } -- 2.52.0 From 10cc27e7cf0291502f176ddf4dc83b702d327f9c Mon Sep 17 00:00:00 2001 From: Michael Shigorin Date: Mon, 6 Oct 2014 13:44:33 +0400 Subject: [PATCH 018/390] drop dummy banana method see also https://github.com/Swordfish90/cool-retro-term/issues/143 --- konsole-qml-plugin/src/TerminalDisplay.h | 2 -- konsole-qml-plugin/src/plugins.qmltypes | 7 ------- 2 files changed, 9 deletions(-) diff --git a/konsole-qml-plugin/src/TerminalDisplay.h b/konsole-qml-plugin/src/TerminalDisplay.h index 2084b41..05a17e7 100644 --- a/konsole-qml-plugin/src/TerminalDisplay.h +++ b/konsole-qml-plugin/src/TerminalDisplay.h @@ -407,8 +407,6 @@ public slots: ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// - void banana(int x, int y, int z, int w); - void setSession(KSession * session); KSession * getSession() const { return m_session; } diff --git a/konsole-qml-plugin/src/plugins.qmltypes b/konsole-qml-plugin/src/plugins.qmltypes index 45aa3ab..4a153ae 100644 --- a/konsole-qml-plugin/src/plugins.qmltypes +++ b/konsole-qml-plugin/src/plugins.qmltypes @@ -178,13 +178,6 @@ Module { Parameter { name: "color"; type: "QColor" } } Method { name: "selectionChanged" } - Method { - name: "banana" - Parameter { name: "x"; type: "int" } - Parameter { name: "y"; type: "int" } - Parameter { name: "z"; type: "int" } - Parameter { name: "w"; type: "int" } - } Method { name: "setSession" Parameter { name: "session"; type: "KSession"; isPointer: true } -- 2.52.0 From 9bd0ca74b683a6c743e4d2ca95842c66df15856c Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Tue, 7 Oct 2014 21:50:02 +0200 Subject: [PATCH 019/390] Removed useless flag in main.qml. --- app/qml/main.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/qml/main.qml b/app/qml/main.qml index 8b0089b..56647c1 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -39,7 +39,6 @@ ApplicationWindow{ //Workaround: if menubar is assigned ugly margins are visible. menuBar: shadersettings.showMenubar ? defaultMenuBar : null - flags: Qt.WA_TranslucentBackground color: "#00000000" title: qsTr("cool-retro-term") -- 2.52.0 From a78231eac58f6f76e22e431250b3fc7d5390ac55 Mon Sep 17 00:00:00 2001 From: Anton Simakov Date: Thu, 9 Oct 2014 21:27:26 +0400 Subject: [PATCH 020/390] Build for mac os without significant changes of master's code (insead of osx branch). A bit later I can provide signed binary build for osx. --- .gitignore | 5 +++++ konsole-qml-plugin/konsole-qml-plugin.pro | 5 ++++- konsole-qml-plugin/src/kpty.cpp | 10 ++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index db0327d..ba2c815 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,8 @@ Makefile* # Excludes compiled files imports cool-retro-term + +# Mac OSX + +.DS_Store +*.app diff --git a/konsole-qml-plugin/konsole-qml-plugin.pro b/konsole-qml-plugin/konsole-qml-plugin.pro index 55e6fab..3fd6eeb 100644 --- a/konsole-qml-plugin/konsole-qml-plugin.pro +++ b/konsole-qml-plugin/konsole-qml-plugin.pro @@ -6,7 +6,10 @@ TEMPLATE = lib CONFIG += qt plugin hide_symbols QT += qml quick widgets -DEFINES += HAVE_POSIX_OPENPT HAVE_SYS_TIME_H HAVE_UPDWTMPX +DEFINES += HAVE_POSIX_OPENPT HAVE_SYS_TIME_H + +!macx:DEFINES += HAVE_UPDWTMPX +macx:DEFINES += HAVE_UTMPX HAVE_UT_USER #MANUALY DEFINED PLATFORM DEFINES += Q_WS_UBUNTU diff --git a/konsole-qml-plugin/src/kpty.cpp b/konsole-qml-plugin/src/kpty.cpp index 5ea5200..d383172 100644 --- a/konsole-qml-plugin/src/kpty.cpp +++ b/konsole-qml-plugin/src/kpty.cpp @@ -506,7 +506,11 @@ void KPty::login(const char * user, const char * remotehost) // note: strncpy without terminators _is_ correct here. man 4 utmp if (user) { +# ifdef HAVE_UT_USER + strncpy(l_struct.ut_user, user, sizeof(l_struct.ut_user)); +#elif strncpy(l_struct.ut_name, user, sizeof(l_struct.ut_name)); +#endif } if (remotehost) { @@ -617,7 +621,13 @@ void KPty::logout() setutent(); if ((ut = getutline(&l_struct))) { # endif + +# ifdef HAVE_UT_USER + memset(ut->ut_user, 0, sizeof(*ut->ut_user)); +#elif memset(ut->ut_name, 0, sizeof(*ut->ut_name)); +#endif + memset(ut->ut_host, 0, sizeof(*ut->ut_host)); # ifdef HAVE_STRUCT_UTMP_UT_SYSLEN ut->ut_syslen = 0; -- 2.52.0 From 0e765e427b1edf1b78a807ee99c64db01250fcf0 Mon Sep 17 00:00:00 2001 From: Michael Underwood Date: Thu, 9 Oct 2014 16:05:34 -0600 Subject: [PATCH 021/390] Patch incorrect #elif directives to #else directives --- konsole-qml-plugin/src/kpty.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/konsole-qml-plugin/src/kpty.cpp b/konsole-qml-plugin/src/kpty.cpp index d383172..c002c14 100644 --- a/konsole-qml-plugin/src/kpty.cpp +++ b/konsole-qml-plugin/src/kpty.cpp @@ -508,7 +508,7 @@ void KPty::login(const char * user, const char * remotehost) if (user) { # ifdef HAVE_UT_USER strncpy(l_struct.ut_user, user, sizeof(l_struct.ut_user)); -#elif +#else strncpy(l_struct.ut_name, user, sizeof(l_struct.ut_name)); #endif } @@ -624,7 +624,7 @@ void KPty::logout() # ifdef HAVE_UT_USER memset(ut->ut_user, 0, sizeof(*ut->ut_user)); -#elif +#else memset(ut->ut_name, 0, sizeof(*ut->ut_name)); #endif -- 2.52.0 From 29ec02b65ec6eb67b74b39d52b3f3ccc10c32acd Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Fri, 10 Oct 2014 00:40:31 +0200 Subject: [PATCH 022/390] Add --fullscreen command line parameter. Fix some mistakes in --help. --- app/main.cpp | 7 ++++--- app/qml/ApplicationSettings.qml | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/main.cpp b/app/main.cpp index 0cb4bb6..445989b 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -24,11 +24,12 @@ 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")) { - qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir ] [--program ] [-h|--help]"; - qDebug() << " --default-settings Run cool-old-term with the default settings"; + qDebug() << "Usage: " + args.at(0) + " [--default-settings] [--workdir ] [--program ] [-p|--profile ] [--fullscreen] [-h|--help]"; + qDebug() << " --default-settings Run cool-retro-term with the default settings"; qDebug() << " --workdir Change working directory to 'dir'"; qDebug() << " --program Run the 'prog' in the new terminal."; - qDebug() << " -p|--profile Run cool-old-term with the given profile."; + qDebug() << " --fullscreen Run cool-retro-term in fullscreen."; + qDebug() << " -p|--profile Run cool-retro-term with the given profile."; qDebug() << " -h|--help Print this help."; return 0; } diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index e9fd1b8..9ab6aae 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -404,6 +404,11 @@ Item{ else console.log("Warning: selected profile is not valid; ignoring it"); } + + if (args.indexOf("--fullscreen") !== -1) { + fullscreen = true; + showMenubar = false; + } } Component.onDestruction: { storeSettings(); -- 2.52.0 From c57ef45ce68b64fb10c61d7b2de01a01038d5c9f Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Fri, 10 Oct 2014 14:39:42 +0200 Subject: [PATCH 023/390] Add QML import directory for buldle. --- app/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/main.cpp b/app/main.cpp index 445989b..ff93931 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -37,9 +37,10 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("workdir", getNamedArgument(args, "--workdir")); engine.rootContext()->setContextProperty("shellProgram", getNamedArgument(args, "--program")); - // Manage import paths + // Manage import paths for Linux and OSX. QStringList importPathList = engine.importPathList(); importPathList.prepend(QCoreApplication::applicationDirPath() + "/imports/"); + importPathList.prepend(QCoreApplication::applicationDirPath() + "/../PlugIns"); engine.setImportPathList(importPathList); engine.load(QUrl("qrc:/main.qml")); -- 2.52.0 From 093cead31288895e4062b1a26fd82704f59389e6 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Fri, 10 Oct 2014 15:12:28 +0200 Subject: [PATCH 024/390] Fixed a couple of UI issues under osx. --- app/qml/CRTMainMenuBar.qml | 8 ++++---- app/qml/PreprocessedTerminal.qml | 6 +++--- app/qml/SettingsPerformanceTab.qml | 1 - app/qml/main.qml | 6 +++++- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/app/qml/CRTMainMenuBar.qml b/app/qml/CRTMainMenuBar.qml index 3fd4dec..7bbe6bd 100644 --- a/app/qml/CRTMainMenuBar.qml +++ b/app/qml/CRTMainMenuBar.qml @@ -14,15 +14,15 @@ MenuBar { visible: defaultMenuBar.visible MenuItem {action: copyAction} MenuItem {action: pasteAction} - MenuSeparator{} + MenuSeparator{visible: Qt.platform.os !== "osx"} MenuItem {action: showsettingsAction} } Menu{ title: qsTr("View") visible: defaultMenuBar.visible - MenuItem {action: fullscreenAction} - MenuItem {action: showMenubarAction} - MenuSeparator{} + MenuItem {action: fullscreenAction; visible: fullscreenAction.enabled} + MenuItem {action: showMenubarAction; visible: showMenubarAction.enabled} + MenuSeparator{visible: showMenubarAction.enabled} MenuItem {action: zoomIn} MenuItem {action: zoomOut} } diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 97318c5..21d4c31 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -152,9 +152,9 @@ Item{ id: contextmenu MenuItem{action: copyAction} MenuItem{action: pasteAction} - MenuSeparator{} - MenuItem{action: fullscreenAction} - MenuItem{action: showMenubarAction} + MenuSeparator{visible: Qt.platform.os !== "osx"} + MenuItem{action: fullscreenAction; visible: Qt.platform.os !== "osx"} + MenuItem{action: showMenubarAction; visible: Qt.platform.os !== "osx"} MenuSeparator{visible: !shadersettings.showMenubar} CRTMainMenuBar{visible: !shadersettings.showMenubar} } diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml index a0963b8..8286e5d 100644 --- a/app/qml/SettingsPerformanceTab.qml +++ b/app/qml/SettingsPerformanceTab.qml @@ -56,7 +56,6 @@ Tab{ id: txtslider onValueChanged: shadersettings.window_scaling = value; value: shadersettings.window_scaling - tickmarksEnabled: true stepSize: 0.25 Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 } diff --git a/app/qml/main.qml b/app/qml/main.qml index 56647c1..c062d68 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -37,7 +37,9 @@ ApplicationWindow{ onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed) //Workaround: if menubar is assigned ugly margins are visible. - menuBar: shadersettings.showMenubar ? defaultMenuBar : null + menuBar: Qt.platform.os === "osx" + ? defaultMenuBar + : shadersettings.showMenubar ? defaultMenuBar : null color: "#00000000" title: qsTr("cool-retro-term") @@ -45,6 +47,7 @@ ApplicationWindow{ Action { id: showMenubarAction text: qsTr("Show Menubar") + enabled: Qt.platform.os !== "osx" checkable: true checked: shadersettings.showMenubar onTriggered: shadersettings.showMenubar = !shadersettings.showMenubar @@ -52,6 +55,7 @@ ApplicationWindow{ Action { id: fullscreenAction text: qsTr("Fullscreen") + enabled: Qt.platform.os !== "osx" shortcut: "Alt+F11" onTriggered: shadersettings.fullscreen = !shadersettings.fullscreen; checkable: true -- 2.52.0 From 539a5ed74fab7091a08967faaa709c160b5fd2ca Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Fri, 10 Oct 2014 15:43:38 +0200 Subject: [PATCH 025/390] Add missing arguments when -i and -l when starting under OSX. Thanks to sirgatez. --- konsole-qml-plugin/src/Session.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/konsole-qml-plugin/src/Session.cpp b/konsole-qml-plugin/src/Session.cpp index a3aeb68..146d4f7 100644 --- a/konsole-qml-plugin/src/Session.cpp +++ b/konsole-qml-plugin/src/Session.cpp @@ -307,6 +307,13 @@ void Session::run() QString argsTmp(_arguments.join(" ").trimmed()); QStringList arguments; arguments << exec; + +#ifdef Q_OS_OSX + // Fix osx initial behavior with -i (interactive) and -l (login). + arguments.append("-i"); + arguments.append("-l"); +#endif + if (argsTmp.length()) arguments << _arguments; -- 2.52.0 From 413a32f33fb695deba3de216066f86abbd1e3400 Mon Sep 17 00:00:00 2001 From: Jeka Der Date: Fri, 10 Oct 2014 21:38:01 +0200 Subject: [PATCH 026/390] debian packaging, initial commit --- packaging/debian/changelog | 5 +++++ packaging/debian/compat | 1 + packaging/debian/control | 15 +++++++++++++++ packaging/debian/rules | 4 ++++ packaging/debian/source/format | 1 + 5 files changed, 26 insertions(+) create mode 100644 packaging/debian/changelog create mode 100644 packaging/debian/compat create mode 100644 packaging/debian/control create mode 100755 packaging/debian/rules create mode 100644 packaging/debian/source/format diff --git a/packaging/debian/changelog b/packaging/debian/changelog new file mode 100644 index 0000000..890f094 --- /dev/null +++ b/packaging/debian/changelog @@ -0,0 +1,5 @@ +cool-retro-term (0.9-1) UNRELEASED; urgency=medium + + * Initial release. (Closes: #XXXXXX) + + -- Jeka Der Fri, 10 Oct 2014 19:58:29 +0200 diff --git a/packaging/debian/compat b/packaging/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/packaging/debian/compat @@ -0,0 +1 @@ +9 diff --git a/packaging/debian/control b/packaging/debian/control new file mode 100644 index 0000000..419a1a2 --- /dev/null +++ b/packaging/debian/control @@ -0,0 +1,15 @@ +Source: cool-retro-term +Maintainer: Jeka Der +Section: misc +Priority: optional +Standards-Version: 3.9.2 +Build-Depends: debhelper (>= 9),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 + +Package: cool-retro-term +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: terminal emulator which mimics old screens + cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. It has been designed to be eye-candy, customizable, and reasonably lightweight. \ No newline at end of file diff --git a/packaging/debian/rules b/packaging/debian/rules new file mode 100755 index 0000000..4f2c774 --- /dev/null +++ b/packaging/debian/rules @@ -0,0 +1,4 @@ +#!/usr/bin/make -f +%: + dh $@ + diff --git a/packaging/debian/source/format b/packaging/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/packaging/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) -- 2.52.0 From 71020e40a57280956968f368297f3ea3fe6b8c0e Mon Sep 17 00:00:00 2001 From: darkpioneer Date: Fri, 10 Oct 2014 20:54:30 +0100 Subject: [PATCH 027/390] Update main.qml Added keyboard shortcut to show menu bar again --- app/qml/main.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/qml/main.qml b/app/qml/main.qml index c062d68..18180cf 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -48,6 +48,7 @@ ApplicationWindow{ id: showMenubarAction text: qsTr("Show Menubar") enabled: Qt.platform.os !== "osx" + shortcut: "Ctrl+Shift+M" checkable: true checked: shadersettings.showMenubar onTriggered: shadersettings.showMenubar = !shadersettings.showMenubar -- 2.52.0 From 8c08f638818a67530b996e65e9939c0c5f4fc3de Mon Sep 17 00:00:00 2001 From: Jeka Der Date: Fri, 10 Oct 2014 22:12:37 +0200 Subject: [PATCH 028/390] fixing lintian warnings --- packaging/debian/control | 10 ++++++---- packaging/debian/copyright | 13 +++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 packaging/debian/copyright diff --git a/packaging/debian/control b/packaging/debian/control index 419a1a2..0ed2d04 100644 --- a/packaging/debian/control +++ b/packaging/debian/control @@ -2,9 +2,9 @@ Source: cool-retro-term Maintainer: Jeka Der Section: misc Priority: optional -Standards-Version: 3.9.2 -Build-Depends: debhelper (>= 9),qmlscene, qt5-qmake, - qt5-default, qtdeclarative5-dev, qml-module-qtquick-controls, +Standards-Version: 3.9.6 +Build-Depends: debhelper (>= 9),qmlscene, + qt5-qmake, qtdeclarative5-dev, qml-module-qtquick-controls, qml-module-qtgraphicaleffects, qml-module-qtquick-dialogs, qml-module-qtquick-localstorage, qml-module-qtquick-window2 @@ -12,4 +12,6 @@ Package: cool-retro-term Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: terminal emulator which mimics old screens - cool-retro-term is a terminal emulator which mimics the look and feel of the old cathode tube screens. It has been designed to be eye-candy, customizable, and reasonably lightweight. \ No newline at end of file + 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. diff --git a/packaging/debian/copyright b/packaging/debian/copyright new file mode 100644 index 0000000..9d1d34f --- /dev/null +++ b/packaging/debian/copyright @@ -0,0 +1,13 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: cool-retro-term +Upstream-Contact: Filippo Scognamiglio +Source: https://github.com/Swordfish90/cool-retro-term + +Files: * +Copyright: 2014 Filippo Scognamiglio +License: GPL-3 + On Debian systems, the full text of the GNU General Public + License version 3 can be found in the file + `/usr/share/common-licenses/GPL-3'. + + -- 2.52.0 From 438c50d77570aad2aa5d5c08a72f1716d546a8b8 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 11 Oct 2014 01:24:20 +0200 Subject: [PATCH 029/390] Texture quality is actually working. (And also quite useful for high-dpi screens). --- app/qml/ApplicationSettings.qml | 2 +- app/qml/PreprocessedTerminal.qml | 8 +++-- app/qml/SettingsPerformanceTab.qml | 4 +-- app/qml/ShaderTerminal.qml | 8 ++--- app/qml/TerminalContainer.qml | 55 ++++++++++++++++++++++++++++++ app/qml/main.qml | 34 ++---------------- app/qml/resources.qrc | 1 + 7 files changed, 70 insertions(+), 42 deletions(-) create mode 100644 app/qml/TerminalContainer.qml diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 9ab6aae..0555478 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -143,7 +143,7 @@ Item{ function handleFontChanged(){ if(!fontManager.item) return; fontManager.item.selectedFontIndex = fontIndexes[rasterization]; - fontManager.item.scaling = fontScaling; + fontManager.item.scaling = fontScaling * window_scaling; var fontSource = fontManager.item.source; var pixelSize = fontManager.item.pixelSize; diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 21d4c31..3627916 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -160,10 +160,12 @@ Item{ } MouseArea{ acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton - anchors.fill: parent + // This is incredibly ugly. All this file should be reorganized. + width: (parent.width + dleft + dright) / shadersettings.window_scaling - dleft -dright + height: (parent.height + dtop + dbottom) / shadersettings.window_scaling - dtop - dbottom onWheel:{ if(wheel.modifiers & Qt.ControlModifier){ - wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger(); + wheel.angleDelta.y > 0 ? zoomIn.trigger() : zoomOut.trigger(); } else { var coord = correctDistortion(wheel.x, wheel.y); var lines = wheel.angleDelta.y > 0 ? -1 : 1; @@ -313,7 +315,7 @@ Item{ // BLOOM //////////////////////////////////////////////////////////////// Loader{ - property real scaling: shadersettings.bloom_quality + property real scaling: shadersettings.bloom_quality * shadersettings.window_scaling id: bloomEffectLoader active: mBloom != 0 asynchronous: true diff --git a/app/qml/SettingsPerformanceTab.qml b/app/qml/SettingsPerformanceTab.qml index 8286e5d..bad4731 100644 --- a/app/qml/SettingsPerformanceTab.qml +++ b/app/qml/SettingsPerformanceTab.qml @@ -56,8 +56,8 @@ Tab{ id: txtslider onValueChanged: shadersettings.window_scaling = value; value: shadersettings.window_scaling - stepSize: 0.25 - Component.onCompleted: minimumValue = 0.5 //Without this value gets set to 0.5 + stepSize: 0.10 + Component.onCompleted: minimumValue = 0.3 //Without this value gets set to 0.5 } Text{text: Math.round(txtslider.value * 100) + "%"} } diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index b035ad4..ebb7ae8 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -46,10 +46,10 @@ ShaderEffect { property bool frameReflections: shadersettings.frameReflections - property real disp_top: frame.item.displacementTop / height - property real disp_bottom: frame.item.displacementBottom / height - property real disp_left: frame.item.displacementLeft / width - property real disp_right: frame.item.displacementRight / width + property real disp_top: (frame.item.displacementTop * shadersettings.window_scaling) / height + property real disp_bottom: (frame.item.displacementBottom * shadersettings.window_scaling) / height + property real disp_left: (frame.item.displacementLeft * shadersettings.window_scaling) / width + property real disp_right: (frame.item.displacementRight * shadersettings.window_scaling) / width property real screen_brightness: shadersettings.brightness * 1.5 + 0.5 diff --git a/app/qml/TerminalContainer.qml b/app/qml/TerminalContainer.qml new file mode 100644 index 0000000..3a67ed0 --- /dev/null +++ b/app/qml/TerminalContainer.qml @@ -0,0 +1,55 @@ +import QtQuick 2.2 + +Item{ + Item{ + id: scalableContent + width: parent.width * shadersettings.window_scaling + height: parent.height * shadersettings.window_scaling + + Loader{ + id: frame + anchors.fill: parent + z: 2.1 + source: shadersettings.frame_source + } + PreprocessedTerminal{ + id: terminal + anchors.fill: parent + } + ShaderTerminal{ + id: shadercontainer + anchors.fill: parent + opacity: shadersettings.windowOpacity * 0.3 + 0.7 + z: 1.9 + } + } + + // This is used to render the texture to a lower resolution then scale it up. + Loader{ + id: scalableContentSource + active: shadersettings.window_scaling < 1 + sourceComponent: ShaderEffectSource{ + sourceItem: scalableContent + hideSource: true + smooth: true + } + } + Loader{ + active: shadersettings.window_scaling < 1 + anchors.fill: parent + sourceComponent: ShaderEffect{ + property var source: scalableContentSource.item + } + } + + // Terminal size overlay. Shown when terminal size changes. + Loader{ + id: sizeoverlayloader + z: 3 + anchors.centerIn: parent + active: shadersettings.show_terminal_size + sourceComponent: SizeOverlay{ + terminalSize: terminal.terminalSize + } + } +} diff --git a/app/qml/main.qml b/app/qml/main.qml index c062d68..639cdc7 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -113,29 +113,8 @@ ApplicationWindow{ id: timeManager enableTimer: terminalWindow.visible } - Item{ - id: maincontainer - anchors.centerIn: parent - width: parent.width * shadersettings.window_scaling - height: parent.height * shadersettings.window_scaling - scale: 1.0 / shadersettings.window_scaling - opacity: shadersettings.windowOpacity * 0.3 + 0.7 - - Loader{ - id: frame - anchors.fill: parent - z: 2.1 - source: shadersettings.frame_source - } - PreprocessedTerminal{ - id: terminal - anchors.fill: parent - } - ShaderTerminal{ - id: shadercontainer - anchors.fill: parent - z: 1.9 - } + TerminalContainer{ + anchors.fill: parent } SettingsWindow{ id: settingswindow @@ -145,14 +124,5 @@ ApplicationWindow{ id: aboutDialog visible: false } - Loader{ - id: sizeoverlayloader - z: 3 - anchors.centerIn: parent - active: shadersettings.show_terminal_size - sourceComponent: SizeOverlay{ - terminalSize: terminal.terminalSize - } - } Component.onCompleted: shadersettings.handleFontChanged(); } diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index dfc44ca..8cf78e2 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -65,5 +65,6 @@ Storage.qml CRTMainMenuBar.qml SettingsPerformanceTab.qml + TerminalContainer.qml -- 2.52.0 From 2dd4e0d841e3c65edeca705e747d8c8d517fbbc6 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 11 Oct 2014 13:20:23 +0200 Subject: [PATCH 030/390] Update README.md with OSX build instructions and donations link. --- README.md | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d08f7f1..b03083e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This terminal emulator requires Qt 5.2 or higher to run. ![Image]() ![Image]() -## Get cool-retro-term +##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: Users of Fedora and openSUSE can grab a package from [Open Build Service](http://software.opensuse.org/package/cool-retro-term). @@ -22,7 +22,7 @@ Arch users can install this [package](https://aur.archlinux.org/packages/cool-re yaourt -S aur/cool-retro-term-git -##Build instructions +##Build instructions (Linux) ##Dependencies Make sure to install these first. @@ -43,13 +43,13 @@ Make sure to install these first. **Fedora** This command should install the known fedora dependencies: -``` -sudo yum -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols -``` + + sudo yum -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols + or: -``` -sudo dnf -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols -``` + + sudo dnf -y install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols + --- **Arch Linux** @@ -75,6 +75,7 @@ Install dependencies: Install Qt directly from here http://qt-project.org/downloads . Once done export them in you path (replace "_/opt/Qt5.3.1/5.3/gcc_64/bin_" with your correct folder): export PATH=/opt/Qt5.3.1/5.3/gcc_64/bin/:$PATH +--- ###Compile Once you installed all dependencies (Qt is installed and in your path) you need to compile and run the application: @@ -92,3 +93,17 @@ qmake && make # Have fun! ./cool-retro-term ``` + +##Build instructions (OSX) + + brew install qt5 + git clone https://github.com/Swordfish90/cool-retro-term.git + export CPPFLAGS="-I/usr/local/opt/qt5/include" + export LDFLAGS="-L/usr/local/opt/qt5/lib" + export PATH=/usr/local/opt/qt5/bin:$PATH + cd cool-retro-term + qmake && make + open cool-retro-term.app + +##Donations +I made this project in my spare time because I love what I'm doing. If you are enjoying it and you want to buy me a beer click [here](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=flscogna%40gmail%2ecom&lc=IT&item_name=Filippo%20Scognamiglio¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted) . -- 2.52.0 From 058bafe0338e6a5626e50323eec139358c32536d Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sat, 11 Oct 2014 14:54:41 +0200 Subject: [PATCH 031/390] Finally added new shiny icon. --- app/app.pro | 2 ++ app/icons/crt.icns | Bin 0 -> 120474 bytes app/icons/crt128.png | Bin 0 -> 33217 bytes app/icons/crt256.png | Bin 0 -> 63001 bytes app/icons/crt32.png | Bin 0 -> 8565 bytes app/icons/crt64.png | Bin 0 -> 19229 bytes app/qml/AboutDialog.qml | 10 ++++++++-- app/qml/images/crt256.png | Bin 0 -> 63001 bytes app/qml/resources.qrc | 1 + 9 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 app/icons/crt.icns create mode 100644 app/icons/crt128.png create mode 100644 app/icons/crt256.png create mode 100644 app/icons/crt32.png create mode 100644 app/icons/crt64.png create mode 100644 app/qml/images/crt256.png diff --git a/app/app.pro b/app/app.pro index 3e47c73..d400020 100644 --- a/app/app.pro +++ b/app/app.pro @@ -4,6 +4,8 @@ TARGET = cool-retro-term DESTDIR = $$OUT_PWD/../ SOURCES = main.cpp +macx:ICON = icons/crt.icns + RESOURCES += qml/resources.qrc ######################################### diff --git a/app/icons/crt.icns b/app/icons/crt.icns new file mode 100644 index 0000000000000000000000000000000000000000..3af2b33655c7cb8b8089f952cd41ef3617bf9645 GIT binary patch literal 120474 zcmd?SXLwXswk=vpm2=KPDwRr7Nh*a>&RGbFAaXJ}nG7a_*RCoFi6A3_iEUCFng%0rjW&A%}b5_e6?Y2?0(3T z8@zMxn{<`WAXi#+W%qtImzI~77uxRL`T5?x`!`HEfgHT^Eb7cH;Hjmu~eBOV0@eZvOm*SLM{o)pld$KW^Xs`R+FjPUqJ@9`(QZ z-HmEjTI$U^H@r%bO(WMh^2|+K%vtWNcHWB}vsv%OJ~aBh|MA6lex*Y%)0j;bo894L zt_)|;>97}AEhdxK@7JhRN|jwJ*BDcCLq)~GoUE)8XI^$7E8uY^dze%1Fd0k+l~iLi zfBx-v;cu;fa~2l_vjZ9a)MSs_<#OXX^s42n{(df2(*KpSG?bg2>Gyk6yl%J0Z6A2q z`oX>apD=58KXYUU(o#Jhr_*LLTg(=dR;Q3@Ox7=={pK(2x!Hc7*We#J~-=wxD*&UEvq zpMSb{|K1PZno@lpCoXC<84R#wy+$pSsILtT3lvI~LM~TI)iS9}EEI_3 z3YCVoEpEhMFj`D_Djn|ApfMOVN@<)}q0t*5>{1KJY>2NwUYgkuz=Z2*!tHrux<#4@JuawF) z3e&MKa6e8Bm&AO02 z5BryEm5#Y{HJU|J);^@wKFZ3f9^UA-+N{y4&|mkpx2v3>x%Sx; zv@Yy#D|U#wfyVq(cL@y*be*7@jAELft`X2Sd0b(Hkno?#`?7F+Ov&q7jGS@ zwc{nDf$8F5(oCaQ!02U4b;r)#yYQ=TjK*#^o0w694{EgV@+uYo`snUG++OLP$r=oA zwVEuZutBENYcx_3ZmuP|o!cpicDU?TTw1RSYbIjDC>0WkRHCe7-qB!VD6yXu%8vCL);-E`Yep+g__$W9 zQAbqG_`Fz%X&bg|_1bmo*R39>H0bdP?IQ(USs_zMgi@KJZP=J`lc!9cGFpKf)6#YE zK(yhMaDwku$u+L

SGO^g#Vfgo-ZzVUl}mmoeqUKmakB_s%iiHSmC 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