diff -Nru obs-downstream-keyer-0.2.2/CMakeLists.txt obs-downstream-keyer-0.2.3/CMakeLists.txt --- obs-downstream-keyer-0.2.2/CMakeLists.txt 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/CMakeLists.txt 2022-05-30 17:17:31.000000000 +0000 @@ -1,8 +1,11 @@ -project(downstream-keyer VERSION 0.2.2) +cmake_minimum_required(VERSION 3.18) +project(downstream-keyer VERSION 0.2.3) set(PROJECT_FULL_NAME "Downstream keyer") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h) +find_package(Qt5Widgets) + set(CMAKE_AUTOMOC ON) set(downstream-keyer_HEADERS downstream-keyer-dock.hpp diff -Nru obs-downstream-keyer-0.2.2/data/locale/en-US.ini obs-downstream-keyer-0.2.3/data/locale/en-US.ini --- obs-downstream-keyer-0.2.2/data/locale/en-US.ini 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/data/locale/en-US.ini 2022-05-30 17:17:31.000000000 +0000 @@ -18,3 +18,4 @@ FallbackColor="Fallback Color" EnableTie="Enable Tie" DisablTie="Disable Tie" +ExcludeScene="Exclude Scene" diff -Nru obs-downstream-keyer-0.2.2/data/locale/pt-BR.ini obs-downstream-keyer-0.2.3/data/locale/pt-BR.ini --- obs-downstream-keyer-0.2.2/data/locale/pt-BR.ini 1970-01-01 00:00:00.000000000 +0000 +++ obs-downstream-keyer-0.2.3/data/locale/pt-BR.ini 2022-05-30 17:17:31.000000000 +0000 @@ -0,0 +1,20 @@ +DownstreamKeyer="Downstream Keyer" +Description="Downstream Keyer" +DSKName="Nome do Downstream Keyer?" +Add="Adicionar" +Rename="Renomear" +Remove="Remover" +MoveUp="Mover para cima" +MoveDown="Mover para baixo" +Transition="Transição" +ShowTransition="Mostrar Transição" +HideTransition="Esconder Transição" +None="Nenhuma" +DefaultName="DSK 1" +EnableDSK="Mostrar em" +DisableDSK="Esconder em" +OutputSource="Fonte de Saída" +Channel="Canal" +FallbackColor="Cor Substituta" +EnableTie="Habilitar Ligação" +DisablTie="Desabilitar Ligação" diff -Nru obs-downstream-keyer-0.2.2/debian/changelog obs-downstream-keyer-0.2.3/debian/changelog --- obs-downstream-keyer-0.2.2/debian/changelog 2022-03-05 02:22:27.000000000 +0000 +++ obs-downstream-keyer-0.2.3/debian/changelog 2022-06-05 13:56:35.000000000 +0000 @@ -1,3 +1,11 @@ +obs-downstream-keyer (0.2.3-1) unstable; urgency=medium + + * New upstream version 0.2.3. + * debian/patches/010_fix-cmake.patch: updated to make it compliant with the + new upstream release. + + -- Joao Eriberto Mota Filho Sun, 05 Jun 2022 10:56:35 -0300 + obs-downstream-keyer (0.2.2-1) unstable; urgency=medium * New upstream version 0.2.2. diff -Nru obs-downstream-keyer-0.2.2/debian/patches/010_fix-cmake.patch obs-downstream-keyer-0.2.3/debian/patches/010_fix-cmake.patch --- obs-downstream-keyer-0.2.2/debian/patches/010_fix-cmake.patch 2022-03-05 02:22:27.000000000 +0000 +++ obs-downstream-keyer-0.2.3/debian/patches/010_fix-cmake.patch 2022-06-05 13:56:35.000000000 +0000 @@ -2,27 +2,21 @@ Originally, the plugin is built inside of obs-studio. Author: Joao Eriberto Mota Filho Forwarded: not-needed -Last-Update: 2022-03-04 +Last-Update: 2022-06-05 Index: obs-downstream-keyer/CMakeLists.txt =================================================================== --- obs-downstream-keyer.orig/CMakeLists.txt +++ obs-downstream-keyer/CMakeLists.txt -@@ -1,8 +1,14 @@ -+cmake_minimum_required(VERSION 3.18) - project(downstream-keyer VERSION 0.2.2) - set(PROJECT_FULL_NAME "Downstream keyer") +@@ -6,6 +6,8 @@ configure_file(${CMAKE_CURRENT_SOURCE_DI - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h) + find_package(Qt5Widgets) -+# Find the QtWidgets library -+find_package(Qt5Widgets) -+ +include_directories("/usr/include/obs") + set(CMAKE_AUTOMOC ON) set(downstream-keyer_HEADERS downstream-keyer-dock.hpp -@@ -37,7 +43,7 @@ add_library(downstream-keyer MODULE +@@ -40,7 +42,7 @@ add_library(downstream-keyer MODULE target_link_libraries(downstream-keyer obs-frontend-api Qt5::Widgets diff -Nru obs-downstream-keyer-0.2.2/downstream-keyer.cpp obs-downstream-keyer-0.2.3/downstream-keyer.cpp --- obs-downstream-keyer-0.2.2/downstream-keyer.cpp 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/downstream-keyer.cpp 2022-05-30 17:17:31.000000000 +0000 @@ -242,14 +242,8 @@ scenesList->setCurrentRow(-1); } -void DownstreamKeyer::apply_selected_source() +void DownstreamKeyer::apply_source(obs_source_t *const newSource) { - const auto l = scenesList->selectedItems(); - const auto newSource = - l.count() - ? obs_get_source_by_name(QT_TO_UTF8(l.value(0)->text())) - : nullptr; - obs_source_t *prevSource = obs_get_output_source(outputChannel); obs_source_t *prevTransition = nullptr; if (prevSource && @@ -285,6 +279,17 @@ obs_source_release(prevSource); obs_source_release(prevTransition); +} + +void DownstreamKeyer::apply_selected_source() +{ + const auto l = scenesList->selectedItems(); + const auto newSource = + l.count() + ? obs_get_source_by_name(QT_TO_UTF8(l.value(0)->text())) + : nullptr; + + apply_source(newSource); obs_source_release(newSource); } @@ -359,6 +364,15 @@ obs_data_set_array(data, "disable_tie_hotkey", dth); obs_data_array_release(eth); obs_data_array_release(dth); + auto excludes = obs_data_array_create(); + for (auto t : exclude_scenes) { + const auto obj = obs_data_create(); + obs_data_set_string(obj, "name", t.c_str()); + obs_data_array_push_back(excludes, obj); + obs_data_release(obj); + } + obs_data_set_array(data, "exclude_scenes", excludes); + obs_data_array_release(excludes); } std::string DownstreamKeyer::GetTransition(enum transitionType transition_type) @@ -455,8 +469,33 @@ return transitionDuration; } -void DownstreamKeyer::SceneChanged() +void DownstreamKeyer::SceneChanged(std::string scene) { + auto found = false; + for (const auto &e : exclude_scenes) { + if (scene == e) + found = true; + } + + if (found) { + apply_source(nullptr); + return; + } else { + obs_source_t *prevSource = obs_get_output_source(outputChannel); + if (prevSource && obs_source_get_type(prevSource) == + OBS_SOURCE_TYPE_TRANSITION) { + obs_source_t *prevTransition = prevSource; + prevSource = obs_transition_get_active_source( + prevTransition); + obs_source_release(prevTransition); + } + if (prevSource == nullptr) { + apply_selected_source(); + return; + } + obs_source_release(prevSource); + } + if (!tie->isChecked()) return; @@ -526,6 +565,14 @@ } obs_data_array_release(sceneArray); } + if (sceneName.isEmpty()) { + for (int i = 0; i < scenesList->count(); i++) { + scenesList->item(i)->setSelected(false); + } + const auto row = scenesList->currentRow(); + if (row != -1) + scenesList->setCurrentRow(-1); + } obs_data_array_t *nh = obs_data_get_array(data, "null_hotkey"); obs_hotkey_load(null_hotkey_id, nh); obs_data_array_release(nh); @@ -534,6 +581,19 @@ obs_hotkey_pair_load(tie_hotkey_id, eth, dth); obs_data_array_release(eth); obs_data_array_release(dth); + + auto excludes = obs_data_get_array(data, "exclude_scenes"); + exclude_scenes.clear(); + if (excludes) { + auto count = obs_data_array_count(excludes); + for (size_t i = 0; i < count; i++) { + const auto sceneData = obs_data_array_item(excludes, i); + exclude_scenes.emplace( + obs_data_get_string(sceneData, "name")); + obs_data_release(sceneData); + } + obs_data_array_release(excludes); + } } void DownstreamKeyer::source_rename(void *data, calldata_t *calldata) @@ -643,6 +703,30 @@ return true; } +void DownstreamKeyer::AddExcludeScene(const char *scene_name) +{ + exclude_scenes.emplace(scene_name); + const auto scene = obs_frontend_get_current_scene(); + const auto sn = obs_source_get_name(scene); + if (strcmp(sn, scene_name) == 0) + SceneChanged(sn); + obs_source_release(scene); +} + +void DownstreamKeyer::RemoveExcludeScene(const char *scene_name) +{ + exclude_scenes.erase(scene_name); + const auto scene = obs_frontend_get_current_scene(); + const auto sn = obs_source_get_name(scene); + if (strcmp(sn, scene_name) == 0) + SceneChanged(sn); + obs_source_release(scene); +} +bool DownstreamKeyer::IsSceneExcluded(const char *scene_name) +{ + return exclude_scenes.find(scene_name) != exclude_scenes.end(); +} + LockedCheckBox::LockedCheckBox() {} LockedCheckBox::LockedCheckBox(QWidget *parent) : QCheckBox(parent) {} diff -Nru obs-downstream-keyer-0.2.2/downstream-keyer-dock.cpp obs-downstream-keyer-0.2.3/downstream-keyer-dock.cpp --- obs-downstream-keyer-0.2.2/downstream-keyer-dock.cpp 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/downstream-keyer-dock.cpp 2022-05-30 17:17:31.000000000 +0000 @@ -158,7 +158,7 @@ void DownstreamKeyerDock::AddDefaultKeyer() { - if (outputChannel < 7 || outputChannel >= MAX_CHANNELS) + if (outputChannel < 7 || outputChannel >= MAX_CHANNELS) outputChannel = 7; auto keyer = new DownstreamKeyer( outputChannel, QT_UTF8(obs_module_text("DefaultName"))); @@ -167,11 +167,14 @@ void DownstreamKeyerDock::SceneChanged() { const int count = tabs->count(); + const auto scene = obs_frontend_get_current_scene(); + const auto scene_name = obs_source_get_name(scene); for (int i = 0; i < count; i++) { auto w = dynamic_cast(tabs->widget(i)); if (w) - w->SceneChanged(); + w->SceneChanged(scene_name); } + obs_source_release(scene); } void DownstreamKeyerDock::AddTransitionMenu(QMenu *tm, @@ -227,7 +230,7 @@ if (w) w->SetTransitionDuration(duration, transition_type); }; - connect(duration, (void (QSpinBox::*)(int)) & QSpinBox::valueChanged, + connect(duration, (void(QSpinBox::*)(int)) & QSpinBox::valueChanged, setDuration); QWidgetAction *durationAction = new QWidgetAction(tm); @@ -236,6 +239,42 @@ tm->addAction(durationAction); } +void DownstreamKeyerDock::AddExcludeSceneMenu(QMenu *tm) +{ + auto setSceneExclude = [this](std::string name, bool add) { + const auto w = + dynamic_cast(tabs->currentWidget()); + if (w) { + if (add) { + w->AddExcludeScene(name.c_str()); + } else { + w->RemoveExcludeScene(name.c_str()); + } + } + }; + const auto w = dynamic_cast(tabs->currentWidget()); + struct obs_frontend_source_list scenes = {}; + obs_frontend_get_scenes(&scenes); + for (size_t i = 0; i < scenes.sources.num; i++) { + obs_source_t *source = scenes.sources.array[i]; + auto name = obs_source_get_name(scenes.sources.array[i]); + auto a = tm->addAction(QT_UTF8(name)); + + a->setCheckable(true); + bool excluded = false; + if (w) { + excluded = w->IsSceneExcluded(name); + } + a->setChecked(excluded); + excluded = !excluded; + connect(a, &QAction::triggered, + [setSceneExclude, name, excluded] { + return setSceneExclude(name, excluded); + }); + } + obs_frontend_source_list_free(&scenes); +} + void DownstreamKeyerDock::ConfigClicked() { QMenu popup; @@ -251,6 +290,8 @@ AddTransitionMenu(tm, transitionType::show); tm = popup.addMenu(QT_UTF8(obs_module_text("HideTransition"))); AddTransitionMenu(tm, transitionType::hide); + tm = popup.addMenu(QT_UTF8(obs_module_text("ExcludeScene"))); + AddExcludeSceneMenu(tm); popup.exec(QCursor::pos()); } @@ -258,7 +299,7 @@ { std::string name = obs_module_text("DefaultName"); if (NameDialog::AskForName(this, name)) { - if (outputChannel < 7 || outputChannel >= MAX_CHANNELS) + if (outputChannel < 7 || outputChannel >= MAX_CHANNELS) outputChannel = 7; auto keyer = new DownstreamKeyer(outputChannel + tabs->count(), QT_UTF8(name.c_str())); diff -Nru obs-downstream-keyer-0.2.2/downstream-keyer-dock.hpp obs-downstream-keyer-0.2.3/downstream-keyer-dock.hpp --- obs-downstream-keyer-0.2.2/downstream-keyer-dock.hpp 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/downstream-keyer-dock.hpp 2022-05-30 17:17:31.000000000 +0000 @@ -24,6 +24,7 @@ void ConfigClicked(); void SceneChanged(); void AddTransitionMenu(QMenu *tm, enum transitionType transition_type); + void AddExcludeSceneMenu(QMenu * tm); private slots: void Add(); void Rename(); diff -Nru obs-downstream-keyer-0.2.2/downstream-keyer.hpp obs-downstream-keyer-0.2.3/downstream-keyer.hpp --- obs-downstream-keyer-0.2.2/downstream-keyer.hpp 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/downstream-keyer.hpp 2022-05-30 17:17:31.000000000 +0000 @@ -7,6 +7,7 @@ #include #include #include +#include #include "obs.h" @@ -36,6 +37,7 @@ LockedCheckBox *tie; obs_hotkey_id null_hotkey_id; obs_hotkey_pair_id tie_hotkey_id; + std::set exclude_scenes; static void source_rename(void *data, calldata_t *calldata); static void source_remove(void *data, calldata_t *calldata); @@ -60,6 +62,7 @@ void on_actionSceneUp_triggered(); void on_actionSceneDown_triggered(); void on_actionSceneNull_triggered(); + void apply_source(obs_source_t *newSource); void apply_selected_source(); void on_scenesList_itemSelectionChanged(); signals: @@ -76,5 +79,8 @@ void SetTransitionDuration(int duration, enum transitionType transition_type = match); int GetTransitionDuration(enum transitionType transition_type = match); - void SceneChanged(); + void SceneChanged(std::string scene); + void AddExcludeScene(const char *scene_name); + void RemoveExcludeScene(const char *scene_name); + bool IsSceneExcluded(const char *scene_name); }; diff -Nru obs-downstream-keyer-0.2.2/.github/workflows/build.yml obs-downstream-keyer-0.2.3/.github/workflows/build.yml --- obs-downstream-keyer-0.2.2/.github/workflows/build.yml 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/.github/workflows/build.yml 2022-05-30 17:17:31.000000000 +0000 @@ -206,9 +206,22 @@ with: name: '${{ env.FILE_NAME }}' path: '*.tar.gz' - windows: - name: Windows + windows-build: + name: 'Windows Build' runs-on: [windows-latest] + strategy: + fail-fast: true + matrix: + target: [x64, x86] + include: + - target: x64 + cmake_build: 'x64' + qt_ext: '_64' + deps_ext: '64' + - target: x86 + cmake_build: 'Win32' + qt_ext: '' + deps_ext: '32' env: QT_VERSION: '5.15.2' CMAKE_GENERATOR: "Visual Studio 17 2022" @@ -261,27 +274,66 @@ - name: Configure run: | mkdir ./package - mkdir ./build32 - cd ./build32 - cmake -G"${{ env.CMAKE_GENERATOR }}" -A"Win32" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=false -DBUILD_VST=false -DBUILD_VIRTUALCAM=false -DBUILD_CAPTIONS=false -DCOMPILE_D3D12_HOOK=false -DENABLE_SCRIPTING=false -DDepsPath="${{ github.workspace }}/cmbuild/deps/win32" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2019" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE .. - cd .. - mkdir ./build64 - cd ./build64 - cmake -G"${{ env.CMAKE_GENERATOR }}" -A"x64" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=false -DBUILD_VST=false -DBUILD_VIRTUALCAM=false -DBUILD_CAPTIONS=false -DCOMPILE_D3D12_HOOK=false -DENABLE_SCRIPTING=false -DDepsPath="${{ github.workspace }}/cmbuild/deps/win64" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2019_64" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE .. - - name: 'Build 32' - run: msbuild /m /p:Configuration=RelWithDebInfo .\build32\obs-studio.sln - - name: 'Build 64' - run: msbuild /m /p:Configuration=RelWithDebInfo .\build64\obs-studio.sln + mkdir ./installer + mkdir ./installer/media + mkdir ./build + cd ./build + cmake -G"${{ env.CMAKE_GENERATOR }}" -A"${{ matrix.cmake_build }}" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=false -DBUILD_VST=false -DBUILD_VIRTUALCAM=false -DBUILD_CAPTIONS=false -DCOMPILE_D3D12_HOOK=false -DENABLE_SCRIPTING=false -DDepsPath="${{ github.workspace }}/cmbuild/deps/win${{ matrix.deps_ext }}" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2019${{ matrix.qt_ext }}" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE .. + - name: 'Build' + run: msbuild /m /p:Configuration=RelWithDebInfo .\build\obs-studio.sln - name: Package if: success() run: | + $env:FILE_NAME="${{ env.PLUGIN_NAME }}-${{ github.sha }}-windows-${{ matrix.target }}" + echo "FILE_NAME=${env:FILE_NAME}" >> ${env:GITHUB_ENV} + robocopy .\build\rundir\RelWithDebInfo\obs-plugins\${{ matrix.deps_ext }}bit\ .\package\obs-plugins\${{ matrix.deps_ext }}bit ${{ env.PLUGIN_NAME }}.* /E /XF .gitignore + robocopy .\build\rundir\RelWithDebInfo\data\obs-plugins\${{ env.PLUGIN_NAME }}\ .\package\data\obs-plugins\${{ env.PLUGIN_NAME }}\ /E /XF .gitignore + copy .\build\UI\frontend-plugins\${{ env.PLUGIN_NAME }}\installer.iss .\installer\installer.iss + robocopy .\UI\frontend-plugins\${{ env.PLUGIN_NAME}}\media\ .\installer\media\ /E /XF .gitignore + exit 0 + - name: Publish zip + if: success() + uses: actions/upload-artifact@v2.2.0 + with: + name: '${{ env.FILE_NAME }}' + path: package/* + - name: Publish Installer Files + if: success() + uses: actions/upload-artifact@v2.2.0 + with: + name: 'installer-files' + path: installer/* + windows-package: + name: 'Windows Package' + runs-on: [windows-latest] + needs: [windows-build] + steps: + - name: Init + if: success() + run: | + mkdir ./package $env:FILE_DATE=(Get-Date -UFormat "%F") $env:FILE_NAME="${{ env.PLUGIN_NAME }}-${env:FILE_DATE}-${{ github.sha }}-windows" echo "FILE_NAME=${env:FILE_NAME}" >> ${env:GITHUB_ENV} - robocopy .\build32\rundir\RelWithDebInfo\obs-plugins\32bit\ .\package\obs-plugins\32bit ${{ env.PLUGIN_NAME }}.* /E /XF .gitignore - robocopy .\build64\rundir\RelWithDebInfo\obs-plugins\64bit\ .\package\obs-plugins\64bit ${{ env.PLUGIN_NAME }}.* /E /XF .gitignore - robocopy .\build64\rundir\RelWithDebInfo\data\obs-plugins\${{ env.PLUGIN_NAME }}\ .\package\data\obs-plugins\${{ env.PLUGIN_NAME }}\ /E /XF .gitignore - exit 0 + $env:FILE_NAME_X86="${{ env.PLUGIN_NAME }}-${{ github.sha }}-windows-x86" + echo "FILE_NAME_X86=${env:FILE_NAME_X86}" >> ${env:GITHUB_ENV} + $env:FILE_NAME_X64="${{ env.PLUGIN_NAME }}-${{ github.sha }}-windows-x64" + echo "FILE_NAME_X64=${env:FILE_NAME_X64}" >> ${env:GITHUB_ENV} + - name: Retrieve x86 build + uses: actions/download-artifact@v2 + with: + name: '${{ env.FILE_NAME_X86 }}' + path: ./package + - name: Retrieve x64 build + uses: actions/download-artifact@v2 + with: + name: '${{ env.FILE_NAME_X64 }}' + path: ./package + - name: Retrieve installer files + uses: actions/download-artifact@v2 + with: + name: 'installer-files' + path: . - name: Create Code Signing Certificate if: success() && github.event_name != 'pull_request' run: | @@ -309,7 +361,7 @@ .\inno.exe /VERYSILENT /SP- /SUPPRESSMSGBOXES /NORESTART - name: "Package Installer (Compile)" run: | - & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' /Qp ".\build64\UI\frontend-plugins\${{ env.PLUGIN_NAME }}\installer.iss" + & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' /Qp ".\installer.iss" - name: Code Sign Installer if: success() && github.event_name != 'pull_request' run: | @@ -320,3 +372,7 @@ with: name: '${{ env.FILE_NAME }}-installer' path: package/*.exe + - name: Remove temp artifacts + uses: geekyeggo/delete-artifact@v1 + with: + name: "${{ env.FILE_NAME_X86 }}\n${{ env.FILE_NAME_X64 }}\ninstaller-files" diff -Nru obs-downstream-keyer-0.2.2/installer.iss.in obs-downstream-keyer-0.2.3/installer.iss.in --- obs-downstream-keyer-0.2.2/installer.iss.in 2022-03-03 17:39:37.000000000 +0000 +++ obs-downstream-keyer-0.2.3/installer.iss.in 2022-05-30 17:17:31.000000000 +0000 @@ -27,12 +27,13 @@ DefaultDirName={code:GetDirName} DefaultGroupName={#MyAppName} AllowNoIcons=yes -OutputDir="@ISS_FILES_DIR@" +OutputDir="package" OutputBaseFilename=@PROJECT_NAME@-installer +DirExistsWarning=no ; Wizard Information WizardStyle=modern WizardResizable=yes -SetupIconFile="@PROJECT_SOURCE_DIR@/media/icon.ico" +SetupIconFile="media/icon.ico" [Languages] Name: "english"; MessagesFile: "compiler:Default.isl"