From b9a208f18f3743e2e52b019170bf2a4810d38751 Mon Sep 17 00:00:00 2001 From: tbkizle Date: Tue, 4 Jan 2022 00:56:11 -0500 Subject: [PATCH] Update Windows Packaging * Rename instances of win32 to generic win or the appropriate bit where applicable * Remove files used in GTK2 * Add spec file for use with PyInstaller * Remove Python bbfreeze Script * Add Github Action To Build Releases * Add Modified script to make files used by NSIS * Update Readme Closes: https://github.com/deluge-torrent/deluge/pull/331 --- .github/workflows/cd.yml | 79 +++ packaging/win/README.md | 32 ++ .../deluge-win-installer.nsi} | 69 +-- packaging/win/delugewin.spec | 316 +++++++++++ packaging/{win32 => win}/installer-side.bmp | Bin packaging/{win32 => win}/installer-top.bmp | Bin packaging/win/setup_nsis.py | 50 ++ .../win32/DelugeStart Theme/etc/gtk-2.0/gtkrc | 25 - .../lib/gtk-2.0/2.10.0/engines/libmurrine.dll | Bin 156686 -> 0 bytes .../gtk-2.0/Check-Radio/check1.png | Bin 112 -> 0 bytes .../gtk-2.0/Check-Radio/check2.png | Bin 200 -> 0 bytes .../gtk-2.0/Check-Radio/check3.png | Bin 112 -> 0 bytes .../gtk-2.0/Check-Radio/check4.png | Bin 196 -> 0 bytes .../gtk-2.0/Check-Radio/check5.png | Bin 183 -> 0 bytes .../gtk-2.0/Check-Radio/checklight.png | Bin 81 -> 0 bytes .../gtk-2.0/Check-Radio/option1.png | Bin 121 -> 0 bytes .../gtk-2.0/Check-Radio/option2.png | Bin 168 -> 0 bytes .../gtk-2.0/Check-Radio/option3.png | Bin 124 -> 0 bytes .../gtk-2.0/Check-Radio/option4.png | Bin 171 -> 0 bytes .../DelugeStart/gtk-2.0/Icons/close.png | Bin 198 -> 0 bytes .../gtk-2.0/Scrollbars/scroll-thumb-horiz.png | Bin 82 -> 0 bytes .../gtk-2.0/Scrollbars/scroll-thumb-vert.png | Bin 82 -> 0 bytes .../Scrollbars/slider-horiz-insens.png | Bin 84 -> 0 bytes .../Scrollbars/slider-horiz-prelight.png | Bin 125 -> 0 bytes .../gtk-2.0/Scrollbars/slider-horiz.png | Bin 127 -> 0 bytes .../gtk-2.0/Scrollbars/slider-vert-insens.png | Bin 84 -> 0 bytes .../Scrollbars/slider-vert-prelight.png | Bin 128 -> 0 bytes .../gtk-2.0/Scrollbars/slider-vert.png | Bin 132 -> 0 bytes .../Scrollbars/trough-scrollbar-horiz.png | Bin 86 -> 0 bytes .../Scrollbars/trough-scrollbar-vert.png | Bin 84 -> 0 bytes .../share/themes/DelugeStart/gtk-2.0/gtkrc | 519 ------------------ .../gtk-2.0/styles/checkradiobutton | 179 ------ .../DelugeStart/gtk-2.0/styles/menu-menubar | 50 -- .../DelugeStart/gtk-2.0/styles/notebook | 29 - .../DelugeStart/gtk-2.0/styles/scrollbar | 125 ----- .../DelugeStart/gtk-2.0/styles/tooltips | 21 - .../share/themes/DelugeStart/index.theme | 12 - packaging/win32/Win32 README.txt | 22 - packaging/win32/deluge-bbfreeze.py | 262 --------- 39 files changed, 499 insertions(+), 1291 deletions(-) create mode 100644 .github/workflows/cd.yml create mode 100644 packaging/win/README.md rename packaging/{win32/deluge-win32-installer.nsi => win/deluge-win-installer.nsi} (83%) create mode 100644 packaging/win/delugewin.spec rename packaging/{win32 => win}/installer-side.bmp (100%) rename packaging/{win32 => win}/installer-top.bmp (100%) create mode 100644 packaging/win/setup_nsis.py delete mode 100644 packaging/win32/DelugeStart Theme/etc/gtk-2.0/gtkrc delete mode 100644 packaging/win32/DelugeStart Theme/lib/gtk-2.0/2.10.0/engines/libmurrine.dll delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check1.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check2.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check3.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check4.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check5.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/checklight.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/option1.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/option2.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/option3.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/option4.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Icons/close.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/scroll-thumb-horiz.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/scroll-thumb-vert.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-horiz-insens.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-horiz-prelight.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-horiz.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-vert-insens.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-vert-prelight.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-vert.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/trough-scrollbar-horiz.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/trough-scrollbar-vert.png delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/gtkrc delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/checkradiobutton delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/menu-menubar delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/notebook delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/scrollbar delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/tooltips delete mode 100644 packaging/win32/DelugeStart Theme/share/themes/DelugeStart/index.theme delete mode 100644 packaging/win32/Win32 README.txt delete mode 100644 packaging/win32/deluge-bbfreeze.py diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 000000000..d65b3d262 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,79 @@ +name: CD + +on: + push: + tags-ignore: + - "*.dev0" + pull_request: + branches: + - develop + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + Build: + runs-on: windows-latest + strategy: + matrix: + arch: [x64, x86] + python: [3.9] + libtorrent: [1.2.15] + + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python}} + architecture: ${{ matrix.arch }} + + - name: Cache pip + uses: actions/cache@v2 + with: + path: '%LOCALAPPDATA%\pip\Cache' + # Look to see if there is a cache hit for the corresponding requirements file + key: ${{ runner.os }}-pip-${{ hashFiles('tox.ini', 'setup.py', 'requirements*.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + ${{ runner.os }}- + + - name: Install dependencies + run: | + $WebClient = New-Object System.Net.WebClient + $WebClient.DownloadFile("https://github.com/deluge-torrent/gvsbuild-release/releases/download/latest/gvsbuild-py${{ matrix.python }}-vs16-${{ matrix.arch }}.zip","C:\GTK.zip") + 7z x C:\GTK.zip -oc:\GTK + $env:Path = "C:\GTK\release;C:\GTK\release\bin;C:\GTK\release\lib;$env:Path" + python -m pip install --upgrade pip wheel + $pycairopath = Get-Childitem –Path "C:\GTK\release\python\" -Include pycairo*.whl -File -Recurse -ErrorAction SilentlyContinue | select -expand FullName + $PyGObjectpath = Get-Childitem –Path "C:\GTK\release\python\" -Include PyGObject*.whl -File -Recurse -ErrorAction SilentlyContinue | select -expand FullName + pip install $pycairopath + pip install $PyGObjectpath + python -m pip install libtorrent==${{ matrix.libtorrent }} + pip install -r requirements.txt + pip install pyinstaller + + - name: Install Deluge + run: | + pip install . + python setup.py install_scripts + + - name: Freeze Deluge + run: | + $env:Path = "C:\GTK\release;C:\GTK\release\bin;C:\GTK\release\lib;$env:Path" + pyinstaller --clean $env:GITHUB_WORKSPACE\packaging\win\delugewin.spec --distpath $env:GITHUB_WORKSPACE\packaging\win\freeze + + - name: Make Deluge Installer + working-directory: ./packaging/win + run: | + python setup_nsis.py + makensis /Darch=${{ matrix.arch }} deluge-win-installer.nsi + + - uses: actions/upload-artifact@v2 + with: + name: deluge-py${{matrix.python}}-lt${{matrix.libtorrent}} + path: packaging/win/*.exe diff --git a/packaging/win/README.md b/packaging/win/README.md new file mode 100644 index 000000000..4b9924cc4 --- /dev/null +++ b/packaging/win/README.md @@ -0,0 +1,32 @@ += Deluge Installer for Windows = + +Instructions for building the Deluge NSIS Installer for Windows Vista/7/8/8.1/10/11. + +== Dependencies == + +- Deluge build: https://deluge.readthedocs.io/en/latest/depends.html +- PyInstaller: https://pypi.org/project/pyinstaller/ +- NSIS: http://nsis.sourceforge.net/Download + +== Build Steps == + +1. Build and Install Deluge on Windows. +2. Run the pyinstaller from the deluge\packaging\win directory.spec: + + `pyinstaller --clean delugewin.spec --distpath .\packaging\win\freeze` + + The result is a PyInstaller version of Deluge in `packaging\win\freeze`. + +3. Run the NSIS script: + + 64-bit python: + + `makensis /Darch=x64 deluge-win-installer.nsi` + + 32-bit python: + + `makensis /Darch=x86 deluge-win-installer.nsi` + + Note: If you don't specify arch defaults to trying x64 + +The result is a standalone installer in the `packaging\win` directory. diff --git a/packaging/win32/deluge-win32-installer.nsi b/packaging/win/deluge-win-installer.nsi similarity index 83% rename from packaging/win32/deluge-win32-installer.nsi rename to packaging/win/deluge-win-installer.nsi index cd481335d..333401509 100644 --- a/packaging/win32/deluge-win32-installer.nsi +++ b/packaging/win/deluge-win-installer.nsi @@ -9,7 +9,7 @@ # # Script version; displayed when running the installer -!define DELUGE_INSTALLER_VERSION "1.0" +!define DELUGE_INSTALLER_VERSION "2.0" # Deluge program information !define PROGRAM_NAME "Deluge" @@ -21,10 +21,17 @@ !define PROGRAM_WEB_SITE "http://deluge-torrent.org" !define LICENSE_FILEPATH "..\..\LICENSE" -# Python files generated with bbfreeze -!define BUILD_DIR "build-win32" -!define BBFREEZE_DIR "${BUILD_DIR}\deluge-bbfreeze-${PROGRAM_VERSION}" +!include FileFunc.nsh + +!ifndef arch +!define INSTALLER_FILENAME "deluge-${PROGRAM_VERSION}-win64-setup.exe" +!endif +!If "${arch}" == "x64" +!define INSTALLER_FILENAME "deluge-${PROGRAM_VERSION}-win64-setup.exe" +!EndIf +!If "${arch}" == "x86" !define INSTALLER_FILENAME "deluge-${PROGRAM_VERSION}-win32-setup.exe" +!EndIf # Set default compressor SetCompressor /FINAL /SOLID lzma @@ -69,8 +76,6 @@ Var StartMenuFolder !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder # Run installation !insertmacro MUI_PAGE_INSTFILES -# Popup Message if VC Redist missing -Page Custom VCRedistMessage # Display 'finished' page !insertmacro MUI_PAGE_FINISH # Uninstaller pages @@ -105,45 +110,6 @@ Function finishpageaction CreateShortCut "$DESKTOP\Deluge.lnk" "$INSTDIR\deluge.exe" FunctionEnd -# Test if Visual Studio Redistributables 2008 SP1 installed and returns -1 if none installed -Function CheckVCRedist2008 - Push $R0 - ClearErrors - ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}" "Version" - IfErrors 0 +2 - StrCpy $R0 "-1" - - Push $R1 - ClearErrors - ReadRegDword $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9BE518E6-ECC6-35A9-88E4-87755C07200F}" "Version" - IfErrors 0 VSRedistInstalled - StrCpy $R1 "-1" - - StrCmp $R0 "-1" +3 0 - Exch $R0 - Goto VSRedistInstalled - StrCmp $R1 "-1" +3 0 - Exch $R1 - Goto VSRedistInstalled - # else - Push "-1" - VSRedistInstalled: -FunctionEnd - -Function VCRedistMessage - Call CheckVCRedist2008 - Pop $R0 - StrCmp $R0 "-1" 0 end - MessageBox MB_YESNO|MB_ICONEXCLAMATION "Deluge requires an MSVC package to run \ - but the recommended package does not appear to be installed:$\r$\n$\r$\n\ - Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)$\r$\n$\r$\n\ - Would you like to download it now?" /SD IDNO IDYES clickyes - Goto end - clickyes: - ExecShell open "https://www.microsoft.com/en-us/download/details.aspx?id=26368" - end: -FunctionEnd - # --- Installation sections --- !define PROGRAM_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROGRAM_NAME}" !define PROGRAM_UNINST_ROOT_KEY "HKLM" @@ -151,8 +117,17 @@ FunctionEnd BrandingText "${PROGRAM_NAME} Windows Installer v${DELUGE_INSTALLER_VERSION}" Name "${PROGRAM_NAME} ${PROGRAM_VERSION}" -OutFile "${BUILD_DIR}\${INSTALLER_FILENAME}" -InstallDir "$PROGRAMFILES\Deluge" +OutFile "${INSTALLER_FILENAME}" + +!ifndef arch +InstallDir "$PROGRAMFILES64\Deluge" +!endif +!If "${arch}" == "x64" +InstallDir "$PROGRAMFILES64\Deluge" +!endIf +!If "${arch}" == "x86" +InstallDir "$PROGRAMFILES32\Deluge" +!endIf ShowInstDetails show ShowUnInstDetails show diff --git a/packaging/win/delugewin.spec b/packaging/win/delugewin.spec new file mode 100644 index 000000000..505f9c16a --- /dev/null +++ b/packaging/win/delugewin.spec @@ -0,0 +1,316 @@ + +# -*- mode: python ; coding: utf-8 -*- +import os +import sys +import deluge.common +from PyInstaller.compat import is_win +from PyInstaller.utils.hooks import collect_all, copy_metadata + +datas = [] +binaries = [] +hiddenimports = [] + +# Collect Meta Data +datas += copy_metadata('deluge', recursive=True) +datas += copy_metadata('service-identity', recursive=True) + +# Add Deluge Hidden Imports +tmp_ret = collect_all('deluge') +hiddenimports += tmp_ret[2] + +# Get build_version from installed deluge. +build_version = deluge.common.get_version() + +#Copy UI/Plugin files to where pyinstaller expects +datas += [ ('../../deluge/ui', 'deluge/ui'), + ('../../deluge/plugins', 'deluge/plugins') ] + + +block_cipher = None + + +a = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-console-script.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + [], + exclude_binaries=True, + name='deluge-console', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=True, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +b = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-gtk-script.pyw'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyzb = PYZ(b.pure, b.zipped_data, + cipher=block_cipher) +exeb = EXE(pyzb, + b.scripts, + [], + exclude_binaries=True, + name='deluge-gtk', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=False, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +c = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluged-script.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyzc = PYZ(c.pure, c.zipped_data, + cipher=block_cipher) + +exec = EXE(pyzc, + c.scripts, + [], + exclude_binaries=True, + name='deluged', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=False, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +d = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluged-debug-script.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyzd = PYZ(d.pure, d.zipped_data, + cipher=block_cipher) +exed = EXE(pyzd, + d.scripts, + [], + exclude_binaries=True, + name='deluged-debug', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=True, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +e = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-debug-script.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyze = PYZ(e.pure, e.zipped_data, + cipher=block_cipher) +exee = EXE(pyze, + e.scripts, + [], + exclude_binaries=True, + name='deluge-debug', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=True, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +f = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-script.pyw'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyzf = PYZ(f.pure, f.zipped_data, + cipher=block_cipher) +exef = EXE(pyzf, + f.scripts, + [], + exclude_binaries=True, + name='deluge', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=False, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +g = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-web-debug-script.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyzg = PYZ(g.pure, g.zipped_data, + cipher=block_cipher) +exeg = EXE(pyzg, + g.scripts, + [], + exclude_binaries=True, + name='deluge-web-debug', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=True, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +h = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-web-script.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyzh = PYZ(h.pure, h.zipped_data, + cipher=block_cipher) +exeh = EXE(pyzh, + h.scripts, + [], + exclude_binaries=True, + name='deluge-web', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + icon='../../deluge/ui/data/pixmaps/deluge.ico', + console=False, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) + +coll = COLLECT(exe, + a.binaries, + a.zipfiles, + a.datas, + exeb, + b.binaries, + b.zipfiles, + b.datas, + exec, + c.binaries, + c.zipfiles, + c.datas, + exed, + d.binaries, + d.zipfiles, + d.datas, + exee, + e.binaries, + e.zipfiles, + e.datas, + exef, + f.binaries, + f.zipfiles, + f.datas, + exeg, + g.binaries, + g.zipfiles, + g.datas, + exeh, + h.binaries, + h.zipfiles, + h.datas, + strip=False, + upx=True, + upx_exclude=[], + name='Deluge') diff --git a/packaging/win32/installer-side.bmp b/packaging/win/installer-side.bmp similarity index 100% rename from packaging/win32/installer-side.bmp rename to packaging/win/installer-side.bmp diff --git a/packaging/win32/installer-top.bmp b/packaging/win/installer-top.bmp similarity index 100% rename from packaging/win32/installer-top.bmp rename to packaging/win/installer-top.bmp diff --git a/packaging/win/setup_nsis.py b/packaging/win/setup_nsis.py new file mode 100644 index 000000000..bdd07a9ca --- /dev/null +++ b/packaging/win/setup_nsis.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Calum Lind +# Copyright (C) 2010 Damien Churchill +# Copyright (C) 2009-2010 Andrew Resch +# Copyright (C) 2009 Jesper Lund +# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. +# + +import os + +import deluge.common + +# Get build_version from installed deluge. +build_version = deluge.common.get_version() +build_dir = os.path.join('freeze', 'Deluge') + +# Copy version info to file for nsis script. +with open('VERSION.tmp', 'w') as ver_file: + ver_file.write('build_version = "%s"' % build_version) + +# Create the install and uninstall file list for NSIS. +filedir_list = [] +for root, dirnames, filenames in os.walk(build_dir): + dirnames.sort() + filenames.sort() + filedir_list.append((root[len(build_dir) :], filenames)) + +with open('install_files.nsh', 'w') as f: + f.write('; Files to install\n') + for dirname, files in filedir_list: + if not dirname: + dirname = os.sep + f.write('\nSetOutPath "$INSTDIR%s"\n' % dirname) + for filename in files: + f.write('File ' + build_dir + os.path.join(dirname, filename) + '\n') + +with open('uninstall_files.nsh', 'w') as f: + f.write('; Files to uninstall\n') + for dirname, files in reversed(filedir_list): + f.write('\n') + if not dirname: + dirname = os.sep + for filename in files: + f.write('Delete "$INSTDIR%s"\n' % os.path.join(dirname, filename)) + f.write('RMDir "$INSTDIR%s"\n' % dirname) diff --git a/packaging/win32/DelugeStart Theme/etc/gtk-2.0/gtkrc b/packaging/win32/DelugeStart Theme/etc/gtk-2.0/gtkrc deleted file mode 100644 index 3539a6289..000000000 --- a/packaging/win32/DelugeStart Theme/etc/gtk-2.0/gtkrc +++ /dev/null @@ -1,25 +0,0 @@ -gtk-theme-name = "DelugeStart" -gtk-icon-theme-name = "Tango" -gtk-fallback-icon-theme = "hicolor" -gtk-alternative-button-order = 1 -gtk-alternative-sort-arrows = 1 -gtk-auto-mnemonics = 1 -gtk-show-input-method-menu = 0 -gtk-show-unicode-menu = 0 - -#gtk-toolbar-icon-size = small-toolbar -gtk-button-images = 0 -gtk-menu-images = 1 - -style "notebook" -{ - xthickness = 1 - ythickness = 1 -} -widget_class "*" style "notebook" - -style "user-font" -{ - font_name="9" -} -widget_class "*" style "user-font" diff --git a/packaging/win32/DelugeStart Theme/lib/gtk-2.0/2.10.0/engines/libmurrine.dll b/packaging/win32/DelugeStart Theme/lib/gtk-2.0/2.10.0/engines/libmurrine.dll deleted file mode 100644 index 12134fc0abe80f9dc8e283171fbcf5055795352f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156686 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 z 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

3h^Tw51mlf{a9P`!y->lMK z2U*aCUv8#gI@zsp6+p$htUza4-@gI62s>|sBUO2)vANkrHJ~WDV`pzyxDVSx6}41Z zr;$qQ`(J`yI=>JIA-B!3&Y6pZcaT?-Uu>gfxH_pac(x-Qr%}S&LZ`Vqsm#?$r-A4r z2hD+SyJ8RWnii}+kZ@1cc&}m(v(t%Rui^_r-*jS@tC*r-Uif9X#(;vbSVfive;0na zAYH-q#_-Fz{m-KwWdnwHRIm+~{`KH(xE>{Cw;@S}(+4rGM;k|OGQ0GqRLZ!6St+tw zv&SYbD8v02`cjSH)gw10E-2}}est;-d1$T9VAgI=Ceb5kcM*meb>)F8Z6oCYD&omj zqC^P8APc;Zo30*bHZ=u*qe}9IN}ZT{RZKx>I8Yk7$qu47owS*{>>4RMR0W8Y98&Fz z6|XvQ6I2;xg5M!Xv#%7M2)~e%MglZoesaIR$N)90+IktD?<@CSl;vLabfx=D?31tO}l!fo; zhj5pNql=QatU{xqwwb(_yw}NU5{wOW;ZV?PBYQdn8&RmI{{++rQ^r*X zE1TXpZp@UfJD=p_hyLn6NLF>M6Q7UplUMGvyC=yLG6e9#b<&T~8J;SMJR)*w8&o%I8F@voyEGkC`Toe>@N z-Fzh)m*ACXT#9E$J=Q(>!cr|?Sm)-eSG};&fPl?-CFZx`DfWb8TPnK;7oUMa9$TH` zd1L}^KS}-ss=yfrA406T4&0(HpaPtMn9gw%x~{{;GUIBdUdz|S*;nILRZ@nRw$fzW z&@!1kVWnD*ssS>KSqBAREDBQg(MeAEskAay3%jwZL?m>u4|3tis-s&fthxd?M3Spk zD0EYq-vS3~Q5me6XnkWmD$E$Mj&;=At$>8KKh)9YjZQ)hi&(dqIfW9Ci*p#Y))H3b zR3l8D#Ze)gvDn*nVxVtHPO#9j`WV^3=aSrDVS}|Ep=bl2OT7Fh|3(}5Tv9-IGP2pg z=aM3(lbxdtd@d;qmRQTCB4o8p!_$0*VRI$JORAVR$?pa}m(&N3imk*IdY;%aK38DB z1dc=OX$MXX7WqEfz~`R!ToyV5L968kJk4hqHdivdr(H0lU_=}E+|yn_XfnOkB252` z2*65)_p}!=ky2o_EWp!zhGBCh!+YAxSTV&S+Q8?Yc3|9KQ9z;%eC}zlX9Pth+Q8@U z!Q>uBQEZ|Od?G4Wq9{Vq20jtxl_-i+w1H1V6-X3CE84&(qKZ7kZV^7LmPhe4pJCWs z$uN@3BnKrf+Q28Gsw9fi7j57ZQT2$jtO0zO4SXWXBNU}bMjQBKlyo%3Gupr>qlA*( z62&K@(A^CdMK#*MC!?gtDYnrDJ{eU;D2i~jflo$N`3&+46mFDw;Ul{4W4OPJDA$QXKdvsd@kctb4P3?E^Sxs!^X!+(-eUF!KJ_U`U z;8bhbOcZ9d1X=Ji44W$%wwBG7_&X$?VRI$J*0Oquk4QYj=1PXGWl@R0SK=8qS27IQ zLQ|JW+LMyTu(^_9YuQqXe^%ldHditXnM0mtNn0gp44W$%wyZWjf8EZQ28PXFG3@l! z1cXyMrormPXS9J&bgFq87jMD|#@)@QeHYAKb;-AJ<0SPYI6}e+SzmSTMj@9@AmL0|JZC_<}gz%y+T($4t?Di5A;&NulQ z-psH5IMS6DrLwJmBkZI@5Q{rw``bjnXVi0*u4mF`)H9m(T*9}BM*XqpQPQ6w%vX}+uD(K&M?+FteLO=cGPBF>K8`^8~=!8u0V1H zGWS2mxci+Vj`HCwCvz;K0|s?rPa;jVLitskaTRuMQEKGV zZjGwvP+rI4i5yAcb~4~tlW`GMgjf}~b$Ii}tIB_Z7()G=P=L5rkN~Cb2YF);&PV&q z+VCtmk)V8tZvhH*vPq(}sEuch>{QeZMSV)UZetHvw?(U;9D6+Xu z0ePCc8(;WeppVnJj&yQ0W#%f7YZhYw`Ilw=Px8NUiFi{k(2gddvm7a<{m{jG3KW2Sl zA$gS@Ln`W;s?y$(x>Q=3&0|_fqnQIdmbvm3*|jQ-Lmtu|a;16gF)D4lN;}GxR$!l? z(rQ%NUvwIY?Uk#VKn6S;l-e!tA}#s9B=Hw^{PCdtFB!8X;2pU z_o*}sQ$DBNId&7%R@!99?qrQL+nytFy((_3io20Mz8R*56PHwU~f? z?Kgnk^v0EkF=KbKQI)#}k&RaED(2UXC1I=VB}j-p$WaSP{rg<}2J6Xgkg{SAa->80 zi<#+F_K$TsEghu)F*Ci)zEG#rI6}IWnO_(1oxVh+KO*U25x_G0 zpJ*ETuv?{_nVHvX{|(8MmA|WWUuJr){U@FNhDv`Q8>3UQ1}?Mj)9C{${rZgbdXIgR zPJdmc|2ZSQ%41)o(_d5R_h+P+dF(TE`XZHnPX>NP9{X^e{;Ep9I3s_7$9@m}$oA2M z2JOzwNcVc|zv*;Z-AMOkq~jXUKk4)?mHz%-cl)u8?mnGP+aCE}cBeyo*f;5PP6m+v zXLouP(l65KoIN0&JIGV?EkpVlk`A}rdl>SP1xqn`<>+Kz2SPxH)wP>@%`K+*;Jpd& zcfif?cv#+qM+FOHEOTbLulza3GcNpbW$0CNm-(qx*KUs|Jt3U;ASFC-yD#!f=#7;$ zF6^^VGm~yWk{C-!1d;;v8w3>8g&OMoG}QMUsIgGS3X1X-lMA}wl1l9f+W!aWrnUBW zfkSLA=X1alE}8;o$la{cf2ON=>rWW7Xf=qH<1-#cK5ewjor!4k!62VNc?BV9Vbo&VO1{3CV#YqRnn>&jm*`6D|2n2h`%kf(sviCOvMh~n zc$np<=yQ*NbKa6kf3vnZdAZJUJ#v7UR&BG-xLn{lugQc@o~nV*asi(zz?}4C;qotN zD^lgKjJAFZ{+G6Xh(K)aCnQKFQ#`Npy^cvtx((E8vALY$WmWT_27jF392JG69)L?V zdx@U-&BYX?k5uf#@Q#{T-D|CF=fi<}C@8z@vE*2kgfRy;7OXqD-;P^A3zh-|bvnB> zuKpt=l>U@(dyQPJ!1A2=it~2-MISr?8X)iDNp!$q4pW5O;t!gT_6IrkDt*i(*mg+8 zBg~L|MrUX28;I?!n)v9?=%57S zznq~6LW_RQ&=Q0`S<29SgdV+zp?ZY8k2A!T_tM`o^e93%7zkBO?fN+*qKNR%XT()i z?=xa4BA%^h#Egpj8PSM{1$Q&F2%+LF4Bd;+syhiZt!7sA`q;AVh@i7>fgj_!xP?}f zA!^rSbJk5GOK=HMeB$<5k7eE~A~)Z`Q?R&(Bn54`-=(%MIi0+@E){E4Z^z!2WDR1i zXgv*hi_eDW3_PP2pRtw&d@kkFnd7%CktjYnhqspQguQ4r@5a+y#<1DKu(fnR;y;mi zhRqg+8=^l#&Zxzw6^-C&T71S@c7k(bOZi;UCJk+f{#Zcyw3d4KZ1&=5E@RkiVc3dB z8MgS0wLHt`Qa&}d4bh+ABWm$!EiK@)xe!lt8N+4^!wu0J@Qhk~##-9=T*_yv!5bxt zPjOU+C<^Qj0@gpk!-jHkJbVY7u{YiWtZmr6XtW(&jC(lUwnOFYA73&YmZ za*3~yc!tduhOOwm3|o9!(MAdLX+`Hrm``hIC7;cs7_*FFvxQ-6>1c@`EAb4QEetnA zZ^Scd@!1f)Ny2t)*3bHjl^CT*k23 z!f-=0h-cK|vmqLiFrQX*KAxtWGI@!1faEnz;br4#sUo`|QpjA65d zVQXoP#7~lVhRqg+8=|-38MXLqh~6e)J{zL9OPJ4w=p7Q~vmsh1VLq*;llg4E3Quzx z!)6P^*3zjGKTYBpHd`1@9{)&|Ry*r)NErl<*IxITkkG1$+DkOpmzw8Sny+Hr=7-dR zn^-^xl&cq_Aae#DpkzuVq#Z8qulJ1O?!D5UaRqo4_l)z({Tmb=}HS^1^ELuq)Q4fNnm|AMn| z0pkZX@K_{=XBT19#GKh>_^BvQXv>`06?l6>ug{r1nztBXVXyy1N1so`FR^fkBC;OJ zk^@~S?L?fPV;efLphOn~2QJF)^iVN>TlWD5F616|4Sm>oy4 z;MNm7UTq1Hy%c{&i;4WzTV&(L^pS1#bzQv9bWPu|yhE&7|7o>l*hjc|7;PMAk^Qd7~Fz)MPt{ez8y7z{kr@F>XRxG{i$RmE*7oUM8PqH)-q zAP&CBY+$M&1jrZRPDTQDYQU!jF!Z>6kxEGQ+ca0dtpcH(`jENcRo%C4nE5W4H2tyg zQiof9<;N7}VuAs3rn>;$@-^W@{>TLfC|-QaagjTn29oDv3Tk$O`Z>Pkb5qoRE!ly1 z?9Y@PDkNGpz;tt5LC3g4pB0lrG1Q*W3$`4WmnznhGP#%Z#l=t$jZtv0u}Q`HjDGN!B?ysG z4uwY``N={GgqT_iQ}9|NvSRHQKa4XD8x@J9Fr`ze#{0(#stUcLfTH8_t-EO~M#mjy z-CZbw!xM8oKp}Bu6*`ndra7)WF}FaXCLrntiK+?<$O#Ow>XxiT@gM8e#8nV4H9;Svd#OPISR zt^4L7j2oke*WaG&@kNG%Bprcm9;=mOA#Nzt@pq#!)Cq~X92Ib>kd(ubAkoAfmx;NP zB|KWf)Y^%rDhU%$*&?ZbT4i@tXq3h{9dm}pI~4;d2Jgse51#nw?w{lePjH3Dy26#N zu-_Ffal-wFs}OIx=DyaBz}6ha4!TQ!fN4)e_ogqhkYah?d^84on8f|s5qK-7Q}%qn zv~lCcPGcgPxN+l-bDM#zCwBYP*mLX{z=U6E|qPVr^iqr6{@QY9O;fd5;bq0qsushmDNGhxkVCcqJPl3O@dn344Q-qZ z=)~MAl%>uy;o=9SDdb!ezeHEau4;Z!TlB`LCvcw_p7z^xxH$X4=Ip@am*+dNKQ+zO z7~sCQ0Nf>AOylBQ0CAA}0fB2P!utn(_x4b-0+rzbg!dwRo-e{VUzIO%jX;%{JCkSc zK?ikq26_>LO}l-3Sxsad-}1X>kRE~UvFGaX4Z8-Hgqxdj*JE-Hy(fV#86&OQN(_a# z|FHtE^!Vsk<6|#gyu2G1BCyaoYh{F-q(?}KE=S1IAt|oYDAOB(W1I+~1M$KRpbB;( zO{=>fhU1P(PkhKbwY~6w%chtC!ng_(xKDOfqWQr&}puA{eej{kfeMV{0$#=l9)Le{r>%5q2D{GYQ7Et_W7j*ls>=X zO4Z+Y+2+IlAX?;MV^aCOGu& zbJ2SM2)Rniptl>YD-#Zv2egJ6jVhwf)2tz}Y1KW`+uZkw$X z>$gDKG-iT85PQnE52gY8`b@kX`Npu8lJ6FTA>Zr4Xz0h00)_qFg~=;EWXDtXtm-nD zAV;?z`d#?NAlcYKU$*OUUt|@6$rGDUAw(?Y%{mVlShZt8X#7IJXuK+|+EIAHjYxSf zSMrWuE8rZX3u zIXcP>w;&6yL)h9Q8yK0#(O2#~GqUm!&f#M>TvZla79WFo*egfQ1EH7FUdhy1I(ZkC z73>GZwsGboj^4@|uNI@n$jR(eax%Pka4b}W_hEE8iQ(Ex8MVHR@V9YCB02;N4WFtf zU&aiBgAiG2XL9cQE@g%Z>dCD>@-%W(VCa}l|vIxCYS`X6OojkrVOAnp}4F3C?kDmE7gPeh0c3CWH zEXIsE%@@l4(Yo(0;Ao#Dy6-?1{s&}(_||R@@5k>6EJH=U@F^&(!z z+sNK-B_~%I&}~$VLhWw>4d6=#c5H)ZTzuJ^*|H42bi+NH1*eeBKfrh7&QqV2$F1kw zaFes(hSqbZ-VdU7QO||<=LWwR-k;}_n>7?Bd3HO;cJ|;n^J1k`BU7jH!WG@HyNm?8;^iv010%PoWWr2C{c<314>(g(PGG7fiM`H zOQ~S+N`azIy!l;coDUCrVH+X=Ry}&(W7hRqO&qGy7Cron{6$XXtAn|b|AIL6j2OUU zB5qLq{7E1zKXxa73DLptCxM&tiAeQm;H9j8m@RpEI9bf$9-}^GA4isXgd46gG5z(u zvmE#Z2Nx$Tq)`G7>Y!|%rz`bj^g*T^5XloEr%au?K_Pi1$5l09k)t3W!xYFlyPwUC z!4S}Mh09{-j09@Q(3>@vq!leHKI1y})#pTDP$9rdfdH$u0)5~@V>SvItgc+i zDAAR69?*f!73jkuE!;bgbh(`IRRA#N9{R*+ll@06cUA1FYCgnB>lSB>a`#C+L@m4T zoH5D`H#rL~78uQ0KUoV%%e?G#3yktC=Iyk27Tt@Fkg9tyP+@-)E!KHlytTgpP;=-n zVSmrM{`0o@Uy9VjP%}tPGkhfS_`kE;@H9}lm-Q&^cme3Ym;n5X{r%UabF`( z+^UQFpq<5qzQLO*zRk*HDMpkLDtlF>evvuuMh^UF7#$g_BszE^6sK}h=L9P1SC0b% z9-r|=wEvWVzr&b_@8Qf@gVq5NVt+UIiBVg1^_%fc1iwY1DY7>=f*K&Vu^IHj&o)@k zu{Y*)up_iH(+V_V3WM77afOOumEen%BcgR7a)=^T9o{Cy!OwNQ25k?mGU&8dW^|$LLv$?fFID6PJK|T| ze35T5AEu*l15cd`1_q_&4Fs_->v7bWtXGsazCch#zv_a#oGkj)m4k4Y(rUk!ngx=6 zF`*xC*Ki0n*eLVA7BsbWIoni(mPnf-Q8009M@Bm%LB_qzxD>NT=!a{4opFV!yc;P1 zf&YjeaflhNVFV(W;^vc+J}-Zy+cy+{Nc(!AA|cf$ff>=?Za*D<(T^K6{tl6~zX0W; zd@hcC*x{N7uL40_td%kTy5Z(!!Rg-3SL42SCMX3tWu<4WQCi?nLyLarb~soSPEb;~ zDRmTx(<4tVO5^>Vk*wqnlH_+v-&#!+--f%n*fciJHr2W8*V#f&E2orHg{bit6LsMb??HL z47-{-G2ea%OGCC_OvP9}q9!1&exA1Pdlimkf^>vmfbP|?4fR@ysqE+p^idOrG{13T< z59mQOp{1qI!4bzq)NbihaK}BX{iuA$xvrv8ym1?fN>{rC1+px#flK+mz-m4wjeN`7 z?5&VF6S@R`zWAm~(Xx=;AIM|pRR%|Ma;HSi=v z0X`e1PfmkGpC5a3V}=WeGY+Ptu-eP}@CYBwDSu)FKSKXFrgDhJ0C|N-&dpsTaH> z?i^9%eYBl^kJQ$WsOsszf~7OBEsD(`_z_Yh_M!w@J6Fgr>;4U2$*1A&u#SQUqhL&~ zFLD%evyGe}T?{l~GBhFo+cCMzFvIHE_$Fwmd?`!oX-Vt}&5kGW8;|(ycjXljy8*IN zmNoW?k2gK`Dc_ga4%yBDI<3S5I+=(|OQ|BO(aSDVo$~`3lIPT=P?C*&WILWv((3(c z1St`NRPQRsl`W#)BjX6AET`f-RTNjqlfS-G^N<3sK*dDhUPOa51}{R=**-$u@rCqe z#KkSt-G&8p=jx>(sKT3v@GI2&6Mbq0^%ER&JR8lz-QbzAk(DR}Yu)GqKW7Dh#wYj+ zJ)hy*Q$8GaR4cHt--Rf1&6StqXUtD4UH+2=nS{$2AKh@lEV!jP_Fk3`>ZSC!8-9Ei zJmDNY?uIMPf&;!kV7XcPoQ<;U&?s5b&G3sb>2FNh4-r;G8pL33H>25lzb@9g4la8? z2D|@PWbb?NgUH_D6F;}?edCUU$=<7q!44*SH4yy&*JN)}hU~op;twTz`M0G|`kb=& z=3fqwz4<7FvlNlN5w~Z^-cnRd*(*YHmh9b%Z2xuHTLPQo-^<>4z~$Bk9vgd|dlm+)0vUlTcXw=ZMcL|fyvKOX>mnnNY$S$tM z8ts|z_05^J+;j?r-q+MO1#3GCTE}z?xT7=KSx8<`P zpW+`Hz$cfSU_IRYbBKO`SBgXi&^+GRq=x8+@zr`f0L6uaNIENM_u!|*NxkRT46H%W zVS!)SMFJ}FI!+7gStUSR=jseB0xT#e^ZZRdV>#Lvt6LIVHX3!LX87~dGklt2SajtQ zY}yjyEt;6&FQQ?lDGc}PoOQB_#+gfuw3m7QRHBJ1m>{LU0H0XWEBso3K63Y4l`rxN zZ~*3do=4+L_G5eqy4XGxDDvUV@#xF^LhYdCD`_H}_W<@Q@m=h3yz9w=Ir;nSA*bR6?q?KBM^Z>&U1V8rPSKG2-R(|cEc1s5xuwM{Vqa1;Iz&k!yM#Ef0J|gig50goF;aQq+4#sdM8eKgGDtpWHIzDDy9lZt`LyDOfTBB?%46RR%(-9j zvowm=UxJ#FR{~3WugpDLA7<5@Qz|4MYV-YKZF!fkwN36Z14EgCMK*VZi62Bc{ghIP zfjNMe%uCfaZ6W7rD3JWLMR=!=ikA~VbT*Ln*uAN~^iBYzrrR0_qOR}|RLJH|WvX(E zEJG?hbKmL=JSq&sGt22djLBq58Z(JIkuPq4I1BJbnvJiH3Tf#u^1zvFV2Yx67*KM&3td8v7yw7O=I)<8Z+9)~6VvokEPQc;jbqUjbjmFT zAKAyVCAEe0pz|IC?e5qN5T_;Ff9!DUZxBXHUIZJ0TW11a-IBzMz__DFIZk_&>)`*?9pZy2arx%bXMWH; z{8|~i8tq(;_6o<#kPcd<#(cMol%TWRGKZs2ScH4UY38jM*qmlIA&h43LC>L?_lR!OlB zxKWBJ;5B+Ertsm1H)Ju_u2~{i$%|1C3;ZqK_EZc}^i#?2%KhsGq^!$U_z|Ah$Ql;# zo39{lD~(eE)O+~AwK1TD3&@3Y8 zUIoy5Qe`RztVo3r?mYc>6q|w;5!PVKUO~sJeMlaAKpRpHUo8Lt>l94^W*0qCTNLwN zqPE|}B5P+r@cQo-+mHVAl>M$*{VO1t`YlAz_y>w@g %{PB+f#(PAkH$t!DR`m14 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 F{|_;5TFC$a diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check1.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check1.png deleted file mode 100644 index 8cdd1cb2333175e54edd2477645570ecfa5ef666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sLBp9rei+F()Q%R6tFatx`JstPhNL>hT#>Yw_#0%Vk@tDnm{ Hr-UW|H!U4{ diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check2.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check2.png deleted file mode 100644 index a484a7019b11b9b01e915443921c623bab78f6f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3Y$ZW{!9W@a@|Lkr1X8u0E{-7; zjAu_ZvN9#guwVH8{E3j?0-*y71EUs6&Qg_H7W#-GqnY^&x8o;97ybjEg;{+rFF9+` z=fM7;!aiK%yoRV|UOV@`*Nf&WF8c5;$AZvu tXL$jajxDe2_WoMo>9~7d45LQ<3s#q6of)$fzFL7C^JeMi&48 diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check3.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check3.png deleted file mode 100644 index faafa47480debc57f6f4067fce8d6039c07aa8c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sLBp9rei+F()Q%R6tFatx`a(chGT!Z7{6b9t18IA@c5gT>TEN$V<4kEUHx3v IIVCg!0A~dr%K!iX diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check4.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check4.png deleted file mode 100644 index bbaa5af1979068280a3a3ea71b67a1806a1868be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3Y$ZW{!9W@a@|Lkr1X7irE{-7; zj7J5IGBPW^;d$P=rXN|2^-j1iml%`SkX^y5BSM^v_;1h(B1vds*~MShvr^ z9d|ZN7bxuf`Q!Ep<;>b*Tan=FKSU;FD!%<1(CIB0?|q-sw5Q^|x8Zx^ou&=PUaZMk pS^Jb}mOwE>j>fhrd&;kWjAy7b4iAgJ({Tml7*AI}mvv4FO#riCON0Ob diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check5.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/check5.png deleted file mode 100644 index e6b81d80cd56bd0cbdf53d0338aa76af669823bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3Y$ZW{!9W@a@|Lkr1X4MkE{-7; zj7KjpvN073w0?ZQRySAZuKa z-f!+V-E7~N7DuNu5N(Xx;~*YCvsv;Prdd4plkEXQTPolF)!xN!Mt!tBBD~f&o$*rPd`1&8!UC Xvu#5+OHTI#8pq)2>gTe~DWM4fR|qQx diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/option4.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Check-Radio/option4.png deleted file mode 100644 index 42aed66794c25d2951e580954f1eb23cd56d2008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_B2O2`kP60Ri9-pe_v;3i{k{EF zzHR&8+u!(9+@`2~{9pH9GOy)tdWF!B_<#HDZ!qkc<+#k*bYa5L|BMN<3$s{e{b_y3 z8N>)y%iY#wKJ%_O_cQMnj~0I@~|H=&(Maw)6e|cqkHCt-gd69$9Joq{u3Uo_Y7>Jzs>BQ3>q4K(a;ezG0kCZ0d xRoLzmcjI>F%eD{yH3gP4o^(;@uPbC^IL7m1bLPu1FQCI1JYD@<);T3K0RV`IO&9mdKI;Vst0CvqLxBvhE diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-horiz.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-horiz.png deleted file mode 100644 index fe5babaaf27c6d024b2952988f79c0025145b91b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^MnKHR!3HFA+x^pll$)oEV@L&K@{j-j|8F=T!6a># z^TS@mz^}jH)^pUXO@geCwW11XOH diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-vert-insens.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/slider-vert-insens.png deleted file mode 100644 index ea9bd99994caf3ea872a628e310453027e28c076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^{6K8M2qYM|F3tZ0q?k&A{DK)68K?YR2jua3x;TbZ fFed-_pYNf-(0w33a>hdqIgoNsS3j3^P6Ygr+Ar*|t4Gk9<*x1fpFkoZ5b|HX`?c#-i_C(i)J*?jp dj;u~#U`W)~eSWFo$Sj~122WQ%mvv4FO#lY?D5C%X diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/trough-scrollbar-horiz.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/trough-scrollbar-horiz.png deleted file mode 100644 index 25a99c2042362d432cc23b4898471e490d64745c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^MnKHR2qYL>{}i19QcNX5e!&ckj8p!u1M>JiT^vIy h7?XeSv$4N$WoB49DNffVW>+dmgQu&X%Q~loCIH{g6bb+U diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/trough-scrollbar-vert.png b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/Scrollbars/trough-scrollbar-vert.png deleted file mode 100644 index 094364fa5ebd825bfd16698b3d2066d0cd046f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^d_Zi(2qYL>y05PSQcNX5e!&ckj8p!u1M+x1T^vIy f7?XeePZv;PU=2%VKh(i|6r|kK)z4*}Q$iB}w#XBG diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/gtkrc b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/gtkrc deleted file mode 100644 index de4001742..000000000 --- a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/gtkrc +++ /dev/null @@ -1,519 +0,0 @@ -# DelugeStart ( based upon ANewStart by alecive ) -# Licensed under the GPL. -# Requires Murrine v0.91.0 - -gtk_color_scheme = "bg_color:#F5F5F5\nselected_bg_color:#8DCCF0\nbase_color:#FFFFFF" # Background, base -gtk_color_scheme = "fg_color:#3C4343\nselected_fg_color:#1E2222\ntext_color:#3C4343" # Foreground, text -#gtk_color_scheme = "sidebar_color:#DEDEDE" # Custom colors -gtk_color_scheme = "tooltip_bg_color:#B7DB67\ntooltip_fg_color:#F5F5F5" # Tooltips -gtk_color_scheme = "theme_color_04:#a9a49c\ntheme_color_26:#292421\ntheme_color_27:#C7C7C7" # Other colors -#gtk_color_scheme = "link_color:#08C" # Hyperlinks - -gtk-icon-sizes = "panel-menu=23,23:panel=21,21:gtk-button=17,17:gtk-large-toolbar=22,22" - -gtk-button-images = 0 # Disables icons for buttons with text -gtk-toolbar-style = 0 # Disables text in toolbar -gtk-auto-mnemonics = 1 # Disables lines under menu items - -style "default" -{ - xthickness = 1 - ythickness = 1 - - GtkArrow::arrow-scaling = 0.6 - GtkComboBox::arrow-scaling = 0.2 - - GtkScrolledWindow ::scrollbar-spacing = 0 - GtkScrolledWindow ::scrollbar-within-bevel = 0 - - GtkScrollbar::slider_width = 11 - GtkScrollbar::has-backward-stepper = 0 - GtkScrollbar::has-forward-stepper = 0 - GtkScrollbar::min-slider-length = 30 - - GtkButton::child-displacement-x = 1 - GtkButton::child-displacement-y = 1 - GtkButton::default-border = { 0, 0, 0, 0 } - - GtkCheckButton::indicator-size = 12 - - GtkPaned::handle-size = 6 - - GtkRange::trough-border = 1 - GtkRange::stepper-size = 12 - GtkRange::trough-under-steppers = 1 - GtkRange::slider-width = 14 - - GtkScale::slider-length = 14 - GtkScale::slider-width = 14 - GtkScale::trough-side-details = 1 - GtkScale::trough-border = 1 - - GtkExpander::expander-size = 14 - GtkTreeView::expander-size = 14 - GtkTreeView::indent-expanders = 0 - - GtkMenu::horizontal-offset = 2 - GtkMenu::vertical-offset = 2 - GtkMenu::horizontal-padding = 2 - GtkMenu::vertical-padding = 2 - - GtkMenuItem::arrow-spacing = 0 - - GtkMenuBar::internal-padding = 2 - GtkMenuBar::shadow_type = GTK_SHADOW_NONE - - #set to the same as roundness, used for better hotspot selection of tabs - GtkNotebook::tab-curvature = 3 - GtkNotebook::tab-overlap = -1 - - GtkToolbar::internal-padding = 2 - GtkToolbar::horizontal-padding = 0 - GtkToolbar::vertical-padding = 0 - GtkToolbar::shadow_type = GTK_SHADOW_NONE #gtk.SHADOW_IN, gtk.SHADOW_OUT, gtk.SHADOW_ETCHED_IN or gtk.SHADOW_ETCHED_OUT - - WnckTasklist::fade-overlay-rect = 0 - # The following line hints to gecko (and possibly other appliations) - # that the entry should be drawn transparently on the canvas. - # Without this, gecko will fill in the background of the entry. - # GtkEntry::honors-transparent-bg-hint = 1 - - GtkEntry::progress-border = { 2, 2, 2, 2 } - - fg[NORMAL] = @fg_color - fg[PRELIGHT] = @fg_color - fg[SELECTED] = @selected_fg_color - fg[ACTIVE] = @fg_color - fg[INSENSITIVE] = darker (@bg_color) - - bg[NORMAL] = @bg_color - bg[PRELIGHT] = shade (1.04, @bg_color) - bg[SELECTED] = @selected_bg_color - bg[INSENSITIVE] = @bg_color - bg[ACTIVE] = shade (0.9, @bg_color) - - base[NORMAL] = @base_color - base[PRELIGHT] = shade (0.95, @bg_color) - base[ACTIVE] = mix (0.7, @selected_bg_color, @bg_color) - base[SELECTED] = @selected_bg_color - base[INSENSITIVE] = @bg_color - - text[NORMAL] = @text_color - text[PRELIGHT] = @text_color - text[ACTIVE] = @selected_fg_color - text[SELECTED] = @selected_fg_color - text[INSENSITIVE] = darker (@bg_color) - - engine "murrine" - { - animation = TRUE # FALSE = disabled, TRUE = enabled - arrowstyle = 1 -# border_shades = { 1.0, 1.0} # draw a gradient on the border. -# border_colors = { "#E6DDD5", "#E6DDD5" } - colorize_scrollbar = FALSE # FALSE = disabled, TRUE = enabled - comboboxstyle = 0 # colorize the GtkComboBox below the arrow. - contrast = .85 # 0.8 for less contrast, more than 1.0 for more contrast on borders -# focus_color = @selected_bg_color -# glazestyle = 5 # 0 = flat, 1 = curved, 2 = concave, 3 = top-curved, 4 = beryl - glazestyle = 4 # 0 = flat, 1 = curved, 2 = concave, 3 = top-curved, 4 = beryl - glow_shade = 1.15 # sets glow amount for buttons or widgets - glowstyle = 0 # 0 = top, 1 = bottom, 2 = top and bottom, 3 = center (vertical), 4 = center (horizontal) - gradient_shades = { 1.13, 1.02, 1.00, 1.02 } # default: {1.1,1.0,1.0,1.1} - highlight_shade = 1.0 # set highlight amount for buttons or widgets - lightborder_shade = 1.2 # sets lightborder amount for buttons or widgets - lightborderstyle = 1 # 0 = lightborder on top side, 1 = lightborder on all sides - listviewheaderstyle = 1 # 0 = flat, 1 = glassy, 2 = raised - listviewstyle = 0 # 0 = nothing, 1 = dotted - menubaritemstyle = 0 # 0 = menuitem look, 1 = button look - menubarstyle = 0 # 0 = flat, 1 = glassy, 2 = gradient, 3 = striped - menuitemstyle = 1 # 0 = flat, 1 = glassy, 2 = striped - menustyle = 0 # 0 = no vertical menu stripe, 1 = display vertical menu stripe - prelight_shade = 1.20 #to select the shade level used in the scrollbar's slider, GtkComboBox with comboboxstyle = 1 and in the prelight state with gradient_colors. - progressbarstyle = 0 # 0 = no stripes, 1 = diagonal stripes, 2 = vertical stripes - reliefstyle = 4 # 0 = flat, 1 = inset, 2 = shadow, = 3 for a gradient on shadow, = 4 for a stronger shadow. - rgba = FALSE # FALSE = disabled, TRUE = enabled - roundness = 2 # 0 = squared, 1 = old default, more will increase roundness - scrollbarstyle = 0 # 0 = nothing, 1 = circles, 2 = handles, 3 = diagonal stripes, 4 = diagonal stripes and handles, 5 = horizontal stripes, 6 = horizontal stripes and handles - shadow_shades = { 0.8, 2.2 } - sliderstyle = 0 # 0 = nothing added, 1 = handles - spinbuttonstyle = 1 - stepperstyle = 1 # 0 = standard, 1 = integrated stepper handles, 2 = squared steppers with a rounded slider -# textstyle = 1 - trough_shades = {1.1,0.87} - toolbarstyle = 0 # 0 = flat, 1 = glassy, 2 = gradient - separatorstyle = 1 # 0 = solid line, 1 = smooth separator - } -} - -style "wide" -{ - xthickness = 2 - ythickness = 2 -} - -style "wider" -{ - xthickness = 3 - ythickness = 3 -} - -style "dark" -{ - #bg[NORMAL] = @bg_color - #bg[SELECTED] = @selected_bg_color - #bg[PRELIGHT] = @selected_bg_color - #bg[ACTIVE] = @selected_bg_color - #bg[INSENSITIVE] = @bg_color - - - #fg[NORMAL] = @bg_color - #fg[PRELIGHT] = @selected_fg_color - #fg[SELECTED] = @selected_fg_color - #fg[ACTIVE] = @selected_fg_color - #fg[INSENSITIVE] = @selected_fg_color - -} - -style "button" = "wide" -{ - engine "murrine" - { - roundness = 3 - gradient_shades = { 1.06, 0.95, 1.06, 0.95} - border_shades = { .7, .6} - border_colors = { @bg_color, @bg_color } - - lightborderstyle = 1 - lightborder_shade = 1.26 - - shadow_shades = {2.5,2.2} - reliefstyle = 4 - } -} - -style "entry" { - xthickness = 3 - ythickness = 3 - - bg[SELECTED] = mix (0.4, @selected_bg_color, @base_color) - fg[SELECTED] = @text_color - - engine "murrine" - { - focus_color = @selected_bg_color - lightborder_shade = 1.06 - glow_shade = 1.9 - } -} - -style "terminal" -{ - text[NORMAL] = darker(@selected_bg_color) - base[NORMAL] = @bg_color - - TerminalScreen::background-darkness = 0.99 -} - -style "toolbar" -{ - ythickness = 0 - engine "murrine" - { - gradient_shades = {1.00,0.95,0.95,0.90} - toolbarstyle = 1 - } -} - -style "toolbar-toggle" = "toolbar" -{ - text[NORMAL] = @text_color - text[PRELIGHT] = @text_color - text[ACTIVE] = @selected_fg_color - text[SELECTED] = @selected_fg_color - text[INSENSITIVE] = darker (@bg_color) - - engine "murrine" - { - toolbarstyle = 0 - } -} - -style "dark-toolbar" = "dark" -{ - xthickness = 0 - ythickness = 2 - - engine "murrine" - { - border_shades = {1.2, 1.0} # draw a gradient on the border. - border_colors = { "#62635E", "#62635E" } - glowstyle = 0 - gradient_shades = {1.1,1.0,1.0,0.7} - highlight_shade = 1.0 - lightborder_shade = 1.0 - reliefstyle = 1 # 0 = flat, 1 = inset, 2 = shadow, = 3 for a gradient on shadow, = 4 for a stronger shadow. - } -} - -style "dark-toolbar-sep" = "dark-toolbar" -{ - xthickness = 2 -} - -style "panel" -{ - xthickness = 0 - ythickness = 0 - - bg[NORMAL] = "#E3E3E3" # # Default top/bottom panel background - bg[PRELIGHT] = "#E3E3E3" # @bg_color # panel prelight - - engine "murrine" - { - #border_shades = {1.2, 1.0} # draw a gradient on the border. - #border_colors = { "#2D2416", "#2D2416" } - roundness = 1 - } -} - -style "panel-button" = "panel" -{ - engine "murrine" { - roundness = 1 - border_colors = {"#7C7C7C", "#7C7C7C"} - border_shades = {1.0, 1.0} # draw a gradient on the border. - gradient_shades = {1.0,1.0,1.0,1.0} - } -} - -# Based on the default style so that the colors from the button -# style are overriden again. -style "treeview-header" = "default" -{ - xthickness = 1 - ythickness = 1 - - bg[NORMAL] = "#F2F1F0" - bg[PRELIGHT] = shade (1.04, "#F2F1F0") - bg[ACTIVE] = shade (0.96, "#F2F1F0") - bg[INSENSITIVE] = "#F2F1F0" - - engine "murrine" { - textstyle = 1 - border_shades = {0.90, 0.78} - glowstyle = 5 - glazestyle = 1 - contrast = 0.8 - lightborder_shade = 1.16 - textstyle = 1 - glow_shade = 1.0 - } -} - -style "progressbar" -{ - xthickness = 0 - ythickness = 0 - - - bg[ACTIVE] = @bg_color - fg[PRELIGHT] = @selected_fg_color - - engine "murrine" { - trough_shades = {0.9, 0.98} - roundness = 2 - lightborderstyle = 1 - lightborder_shade = 1.26 - border_shades = {0.8, 0.8} - gradient_shades = {0.95, 1.1, 0.95, 1.1} - #trough_border_shades = {0.9, 0.9} - } -} - -style "statusbar" -{ - ythickness = 0 - xthickness = 0 -} - -style "comboboxentry" -{ - ythickness = 3 - xthickness = 3 - - engine "murrine" - { - contrast = .8 - } -} - -style "spinbutton" -{ -} - -style "scale" -{ - bg[ACTIVE] = @bg_color - bg[PRELIGHT] = shade(1.1, @bg_color) - fg[PRELIGHT] = @selected_fg_color - - engine "murrine" { - trough_shades = {0.9, 0.98} - roundness = 6 - lightborderstyle = 1 - lightborder_shade = 1.26 - border_shades = {0.8, 0.8} - gradient_shades = {0.95, 1.1, 0.95, 1.1} - #trough_border_shades = {0.9, 0.9} - highlight_shade = 1.02 - contrast = 1.1 - reliefstyle = 1 - } -} - -style "frame" -{ -} - -style "frame-title" = "frame" -{ - fg[NORMAL] = lighter (@fg_color) -} - -style "font" -{ - font_name="9" -} -widget_class "*" style "font" - -######################################### -# Matches -######################################### - -# default style is applied to every widget -class "GtkWidget" style "default" - -# Increase the x/ythickness in some widgets -class "GtkRange" style "default" -class "GtkFrame" style "frame" -class "GtkSeparator" style "wide" -class "GtkEntry" style "entry" -class "GtkStatusbar" style "statusbar" - -widget_class "**" style "comboboxentry" -widget_class "**" style "comboboxentry" - -# Toolbar default: light -class "*HandleBox" style "toolbar" -class "GtkToolbar" style "toolbar" -widget_class "*HandleBox" style "toolbar" -widget_class "*.*" style "toolbar" - -# -# Toolbar exceptions: -# Browser-type and viewer-type applications get a dark toolbar. -# Everything below the toolbar for these apps are the content. This will make -# a separation on function (toolbar) and content (client area) - -# Work around for http://bugzilla.gnome.org/show_bug.cgi?id=382646 -style "text-is-fg-color-workaround" -{ - text[NORMAL] = @fg_color - text[PRELIGHT] = mix (0.8, @fg_color, '#ffffff') - text[SELECTED] = @selected_fg_color - text[ACTIVE] = @fg_color - text[INSENSITIVE] = darker (@bg_color) -} - -style "text-is-fg-color-workaround-dark" -{ - #Make it work with this theme! - text[NORMAL] = @bg_color - text[PRELIGHT] = mix (1.0, @bg_color, '#ffffff') -} - -# Workaround style for menus where the text color is used instead of the fg color. -style "menuitem-text-is-fg-color-workaround" { - text[NORMAL] = @fg_color - text[PRELIGHT] = @fg_color - text[SELECTED] = @selected_fg_color - text[ACTIVE] = @fg_color - text[INSENSITIVE] = darker (@bg_color) -} - -# Work around for http://bugzilla.gnome.org/show_bug.cgi?id=382646 -# Note that this work around assumes that the combobox is _not_ in appears-as-list mode. -widget_class "*.."style "text-is-fg-color-workaround" -# This is the part of the workaround that fixes the menus -widget "*.gtk-combobox-popup-menu.*" style "menuitem-text-is-fg-color-workaround" - -widget "*fullscreen-toolbar" style "dark-toolbar" -widget "*fullscreen-toolbar.*" style "dark-toolbar" -widget "*fullscreen-toolbar*.GtkComboBox.GtkCellView" style "text-is-fg-color-workaround-dark" - -class "GtkSpinButton" style "spinbutton" -class "GtkScale" style "scale" -class "GtkVScale" style "scale" -class "GtkHScale" style "scale" -class "GtkButton" style "button" - -# General matching following, the order is choosen so that the right styles override each other -# eg. progressbar needs to be more important then the menu match. - -widget_class "*" style "frame" -widget_class "*.." style "frame-title" - -widget_class "**" style "wider" -widget_class "*" style "progressbar" - -# Treeview header -widget_class "*.." style "treeview-header" -widget_class "*.." style "treeview-header" -widget_class "*.." style "treeview-header" -widget_class "*.." style "treeview-header" - -################################################### -# Special cases and work arounds -################################################### - -# Work around the usage of GtkLabel inside GtkListItems to display text. -# This breaks because the label is shown on a background that is based on the -# base color set. -style "fg-is-text-color-workaround" -{ - fg[NORMAL] = @text_color - fg[PRELIGHT] = @text_color - fg[ACTIVE] = @selected_fg_color - fg[SELECTED] = @selected_fg_color - fg[INSENSITIVE] = darker (@bg_color) -} -widget_class "**" style "fg-is-text-color-workaround" -# The same problem also exists for GtkCList and GtkCTree -# Only match GtkCList and not the parent widgets, because that would also change the headers. -widget_class "*" style "fg-is-text-color-workaround" - -style "dialog" = "dark" -{ - bg[NORMAL] = mix(0.4, @selected_bg_color, shade(0.7, @bg_color)) - fg[NORMAL] = shade(0.5, @fg_color) - text[NORMAL] = shade(0.5, @text_color) -} -style "dialog-button" = "dark" -{ - bg[NORMAL] = shade(0.15, @bg_color) - bg[PRELIGHT] = shade(0.18, @bg_color) -} - -include"styles/checkradiobutton" -include"styles/menu-menubar" -include"styles/notebook" -include"styles/scrollbar" -include"styles/tooltips" - -style "gnome-color-chooser-combobox" -{ - text[NORMAL] = @fg_color - text[PRELIGHT] = mix (0.8, @fg_color, '#ffffff') -} -widget_class "*.." style "gnome-color-chooser-combobox" -class "TerminalScreen" style "terminal" diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/checkradiobutton b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/checkradiobutton deleted file mode 100644 index c62a9a8ab..000000000 --- a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/checkradiobutton +++ /dev/null @@ -1,179 +0,0 @@ -style "checkbutton" = "default" -{ - engine "pixmap" - { - image - { - function = CHECK - recolorable = TRUE - state = NORMAL - shadow = OUT - overlay_file = "Check-Radio/check1.png" - overlay_stretch = FALSE - } - image - { - function = CHECK - recolorable = TRUE - state = PRELIGHT - shadow = OUT - overlay_file = "Check-Radio/check3.png" - overlay_stretch = FALSE - } - image - { - function = CHECK - recolorable = TRUE - state = ACTIVE - shadow = OUT - overlay_file = "Check-Radio/check3.png" - overlay_stretch = FALSE - } - image - { - function = CHECK - recolorable = TRUE - state = INSENSITIVE - shadow = OUT - overlay_file = "Check-Radio/check1.png" - overlay_stretch = FALSE - } - image - { - function = CHECK - recolorable = TRUE - state = NORMAL - shadow = IN - overlay_file = "Check-Radio/check2.png" - overlay_stretch = FALSE - } - image - { - function = CHECK - recolorable = TRUE - state = PRELIGHT - shadow = IN - overlay_file = "Check-Radio/check4.png" - overlay_stretch = FALSE - } - image - { - function = CHECK - recolorable = TRUE - state = ACTIVE - shadow = IN - overlay_file = "Check-Radio/check4.png" - overlay_stretch = FALSE - } - image - { - function = CHECK - recolorable = TRUE - state = INSENSITIVE - shadow = IN - overlay_file = "Check-Radio/check5.png" - overlay_stretch = FALSE - } - image - { - function = FLAT_BOX - recolorable = TRUE - stretch = TRUE - file = "Check-Radio/checklight.png" - border = { 2, 2, 2, 2 } - } - } -} - -style "radiobutton" = "default" -{ - engine "pixmap" - { - image - { - function = OPTION - recolorable = TRUE - state = NORMAL - shadow = OUT - overlay_file = "Check-Radio/option1.png" - overlay_stretch = FALSE - } - image - { - function = OPTION - recolorable = TRUE - state = PRELIGHT - shadow = OUT - overlay_file = "Check-Radio/option3.png" - overlay_stretch = FALSE - } - image - { - function = OPTION - recolorable = TRUE - state = ACTIVE - shadow = OUT - overlay_file = "Check-Radio/option3.png" - overlay_stretch = FALSE - } - image - { - function = OPTION - recolorable = TRUE - state = INSENSITIVE - shadow = OUT - overlay_file = "Check-Radio/option1.png" - overlay_stretch = FALSE - } - image - { - function = OPTION - recolorable = TRUE - state = NORMAL - shadow = IN - overlay_file = "Check-Radio/option2.png" - overlay_stretch = FALSE - } - image - { - function = OPTION - recolorable = TRUE - state = PRELIGHT - shadow = IN - overlay_file = "Check-Radio/option4.png" - overlay_stretch = FALSE - } - image - { - function = OPTION - recolorable = TRUE - state = ACTIVE - shadow = IN - overlay_file = "Check-Radio/option4.png" - overlay_stretch = FALSE - } - image - { - function = OPTION - recolorable = TRUE - state = INSENSITIVE - shadow = IN - overlay_file = "Check-Radio/option1.png" - overlay_stretch = FALSE - } - image - { - function = FLAT_BOX - recolorable = TRUE - stretch = TRUE - file = "Check-Radio/checklight.png" - border = { 2, 2, 2, 2 } - } - } -} - - -class "GtkRadioButton" style "radiobutton" -class "GtkRadioMenuItem" style "radiobutton" -class "GtkCheckButton" style "checkbutton" -class "GtkCheckMenuItem" style "checkbutton" diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/menu-menubar b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/menu-menubar deleted file mode 100644 index a15363a9b..000000000 --- a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/menu-menubar +++ /dev/null @@ -1,50 +0,0 @@ -style "menu" = "default" -{ - xthickness = 2 - ythickness = 2 - - bg[PRELIGHT] = shade (1.04, @selected_bg_color) -} - -style "menuitem" -{ - xthickness = 0 - ythickness = 0 - - engine "murrine" { - roundness = 1 - border_colors = {"#7C7C7C", "#7C7C7C"} - border_shades = {1.0, 1.0} # draw a gradient on the border. - gradient_shades = {1.0,1.0,1.0,1.0} - } -} - -style "menubar" = "dark-toolbar" -{ - ythickness = 0 - xthickness = 0 - - bg[PRELIGHT] = shade (1.04, @selected_bg_color) - - engine "murrine" { - roundness = 1 - border_shades = {1.0, 1.0} # draw a gradient on the border. - border_colors = {"#7C7C7C", "#7C7C7C"} - glowstyle = 0 - gradient_shades = {1.0,1.0,1.0,1.0} - highlight_shade = 1.0 - lightborder_shade = 1.0 - reliefstyle = 0 # 0 = flat, 1 = inset, 2 = shadow, = 3 for a gradient on shadow, = 4 for a stronger shadow. - } -} - -class "GtkMenu" style "menu" -class "GtkMenuBar*" style "menubar" -class "GtkMenuItem" style "menuitem" -class "GtkTearoffMenuItem" style "menuitem" - -widget_class "*GtkMenu.*" style "menu" -widget_class "*MenuBar.*" style "menubar" -widget_class "*.." style "menuitem" -# The panel menubar -widget_class "*Panel**" style "menubar" diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/notebook b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/notebook deleted file mode 100644 index 4c52077ed..000000000 --- a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/notebook +++ /dev/null @@ -1,29 +0,0 @@ -style "notebook-close" { - stock["gtk-close"] = { - { "Icons/close.png", *, *, * } - } -} - -style "notebook" = "wider" { - - bg[NORMAL] = shade (1.0615, @bg_color) - bg[ACTIVE] = shade (0.85, @bg_color) - - engine "murrine" { - - lightborder_shade = 1.1 - highlight_shade = 1.01 - } -} - -style "notebookthin" = "notebook" { - - xthickness = 2 - ythickness = 2 -} - -widget_class "**" style "notebook" -widget_class "**" style "notebook" -widget_class "**" style "notebook" -widget_class "*" style "notebook" -widget_class "**" style "notebook-close" diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/scrollbar b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/scrollbar deleted file mode 100644 index aa39423f5..000000000 --- a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/scrollbar +++ /dev/null @@ -1,125 +0,0 @@ -style "scrollbar" = "default" -{ - engine "pixmap" - { - image - { - function = BOX - recolorable = TRUE - detail = "trough" - file = "Scrollbars/trough-scrollbar-horiz.png" - border = { 20, 20, 0, 0 } - stretch = TRUE - orientation = HORIZONTAL - } - image - { - function = BOX - recolorable = TRUE - detail = "trough" - file = "Scrollbars/trough-scrollbar-vert.png" - border = { 0, 0, 20, 20 } - stretch = TRUE - orientation = VERTICAL - } -###########x SLIDERS ##################x - - image - { - function = SLIDER - recolorable = TRUE - state = NORMAL - file = "Scrollbars/slider-horiz.png" - border = { 10, 10, 0, 0 } - stretch = TRUE - orientation = HORIZONTAL - } - image - { - function = SLIDER - recolorable = TRUE - state = ACTIVE - shadow = IN - file = "Scrollbars/slider-horiz.png" - border = { 10, 10, 0, 0 } - stretch = TRUE - orientation = HORIZONTAL - - } - image - { - function = SLIDER - recolorable = TRUE - state = PRELIGHT - file = "Scrollbars/slider-horiz-prelight.png" - border = { 10, 10, 0, 0 } - stretch = TRUE - orientation = HORIZONTAL - - } - image - { - function = SLIDER - recolorable = TRUE - state = INSENSITIVE - file = "Scrollbars/slider-horiz-insens.png" - border = { 10, 10, 0, 0 } - stretch = TRUE - orientation = HORIZONTAL - - } -#############x verticals################xx - - image - { - function = SLIDER - recolorable = TRUE - state = NORMAL - file = "Scrollbars/slider-vert.png" - border = { 0, 0, 10, 10 } - stretch = TRUE - orientation = VERTICAL - - } - image - { - function = SLIDER - recolorable = TRUE - state = ACTIVE - shadow = IN - file = "Scrollbars/slider-vert.png" - border = { 0, 0, 10, 10 } - stretch = TRUE - orientation = VERTICAL - - } - image - { - function = SLIDER - recolorable = TRUE - state = PRELIGHT - file = "Scrollbars/slider-vert-prelight.png" - border = { 0, 0, 10, 10 } - stretch = TRUE - orientation = VERTICAL - - } - image - { - function = SLIDER - recolorable = TRUE - state = INSENSITIVE - file = "Scrollbars/slider-vert-insens.png" - border = { 0, 0, 10, 10 } - stretch = TRUE - orientation = VERTICAL - - } - -########### END SLIDERS ################## - } -} - -class "GtkScrollbar" style "scrollbar" -class "GtkVScrollbar" style "scrollbar" -class "GtkHScrollbar" style "scrollbar" diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/tooltips b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/tooltips deleted file mode 100644 index 6658f062f..000000000 --- a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/gtk-2.0/styles/tooltips +++ /dev/null @@ -1,21 +0,0 @@ -style "tooltips" -{ - xthickness = 4 - ythickness = 4 - - GtkWidget::new-tooltip-style = 1 - - bg[NORMAL] = @tooltip_bg_color - fg[NORMAL] = @tooltip_fg_color -} - - -widget "gtk-tooltips" style "tooltips" -class "*GtkTooltips*" style "tooltips" -widget_class "*Tooltips*" style "tooltips" -widget "*.nautilus-extra-view-widget" style:highest "tooltips" -style "nautilusrename" { -# fg[NORMAL] = "#e1e1e1" -} - -widget_class "*.EelEditableLabel" style "nautilusrename" diff --git a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/index.theme b/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/index.theme deleted file mode 100644 index d5d631b0f..000000000 --- a/packaging/win32/DelugeStart Theme/share/themes/DelugeStart/index.theme +++ /dev/null @@ -1,12 +0,0 @@ -[Desktop Entry] -Version=1.2 -Encoding=UTF-8 -Name=DelugeStart -Type=X-GNOME-Metatheme -Comment=DelugeStart theme by alecive - -[X-GNOME-Metatheme] -GtkTheme=DelugeStart -IconTheme=AwOken-303030 -CursorTheme=DMZ-White -ButtonLayout=menu:minimize,maximize,close diff --git a/packaging/win32/Win32 README.txt b/packaging/win32/Win32 README.txt deleted file mode 100644 index d74e02278..000000000 --- a/packaging/win32/Win32 README.txt +++ /dev/null @@ -1,22 +0,0 @@ -= Deluge Installer for Windows = - -Instructions for building the Deluge NSIS Installer for Windows XP/Vista/7. - -== Dependencies == - * Deluge build: http://dev.deluge-torrent.org/wiki/Installing/Source#WindowsDependencies - * Bbfreeze: http://pypi.python.org/pypi/bbfreeze - * NSIS: http://nsis.sourceforge.net/Download - -== Build Steps == - - 1. Build and Install Deluge on Windows. - - 2. Run the bbfreeze script from the win32 directory: - - python deluge-bbfreeze.py - - The result is a bbfreeze'd version of Deluge in `build-win32/deluge-bbfreeze-build_version`. - - 3. Run the NSIS script (right-click and choose `Compile with NSIS`) - - The result is a standalone installer in the `build-win32` directory. diff --git a/packaging/win32/deluge-bbfreeze.py b/packaging/win32/deluge-bbfreeze.py deleted file mode 100644 index 340a643fd..000000000 --- a/packaging/win32/deluge-bbfreeze.py +++ /dev/null @@ -1,262 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2012-2015 Calum Lind -# Copyright (C) 2010 Damien Churchill -# Copyright (C) 2009-2010 Andrew Resch -# Copyright (C) 2009 Jesper Lund -# -# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with -# the additional special exception to link portions of this program with the OpenSSL library. -# See LICENSE for more details. -# -# isort:skip_file - -import glob -import os -import re -import shutil -import sys - - -import bbfreeze -import gtk -from win32verstamp import stamp - -import deluge.common - - -class VersionInfo: - def __init__( - self, - version, - internalname=None, - originalfilename=None, - comments=None, - company=None, - description=None, - _copyright=None, - trademarks=None, - product=None, - dll=False, - debug=False, - verbose=True, - ): - parts = version.split('.') - while len(parts) < 4: - parts.append('0') - self.version = '.'.join(parts) - self.internal_name = internalname - self.original_filename = originalfilename - self.comments = comments - self.company = company - self.description = description - self.copyright = _copyright - self.trademarks = trademarks - self.product = product - self.dll = dll - self.debug = debug - self.verbose = verbose - - -DEBUG = False -if len(sys.argv) == 2 and sys.argv[1].lower() == 'debug': - DEBUG = True - -# Get build_version from installed deluge. -build_version = deluge.common.get_version() -python_path = os.path.dirname(sys.executable) -if python_path.endswith('Scripts'): - python_path = python_path[:-8] -gtk_root = os.path.join(gtk.__path__[0], '..', 'runtime') -build_dir = os.path.join('build-win32', 'deluge-bbfreeze-' + build_version) - -if DEBUG: - print('Python Path: %s' % python_path) - print('Gtk Path: %s' % gtk_root) - print('bbfreeze Output Path: %s' % build_dir) - -print('Freezing Deluge %s...' % build_version) -# Disable printing to console for bbfreezing. -if not DEBUG: - sys.stdout = open(os.devnull, 'w') - -# Include python modules not picked up automatically by bbfreeze. -includes = ( - 'libtorrent', - 'cairo', - 'pangocairo', - 'atk', - 'pango', - 'twisted.internet.utils', - 'gio', - 'gzip', - 'email.mime.multipart', - 'email.mime.text', - '_cffi_backend', -) -excludes = ('numpy', 'OpenGL', 'psyco', 'win32ui', 'unittest') - - -def recipe_gtk_override(mf): - # Override bbfreeze function so that it includes all gtk libraries - # in the installer so users don't require a separate GTK+ installation. - return True - - -bbfreeze.recipes.recipe_gtk_and_friends = recipe_gtk_override - -# Workaround for "ImportError: The 'packaging' package is required" with setuptools > 18.8. -# (https://github.com/pypa/setuptools/issues/517) -bbfreeze.recipes.recipe_pkg_resources = bbfreeze.recipes.include_whole_package( - 'pkg_resources' -) - -fzr = bbfreeze.Freezer(build_dir, includes=includes, excludes=excludes) -fzr.include_py = False -fzr.setIcon( - os.path.join( - os.path.dirname(deluge.common.__file__), 'ui', 'data', 'pixmaps', 'deluge.ico' - ) -) - -# TODO: Can/should we grab the script list from setup.py entry_points somehow. - -# Hide cmd console popup for these console entries force gui_script True. -force_gui = ['deluge-web', 'deluged'] - -for force_script in force_gui: - script_path = os.path.join(python_path, 'Scripts', force_script + '-script.py') - shutil.copy(script_path, script_path.replace('script', 'debug-script')) - -script_list = [] -for script in glob.glob(os.path.join(python_path, 'Scripts\\deluge*-script.py*')): - # Copy the scripts to remove the '-script' suffix before adding to freezer. - new_script = script.replace('-script', '') - shutil.copy(script, new_script) - - gui_script = False - script_splitext = os.path.splitext(os.path.basename(new_script)) - if script_splitext[1] == '.pyw' or script_splitext[0] in force_gui: - gui_script = True - try: - fzr.addScript(new_script, gui_only=gui_script) - script_list.append(new_script) - except Exception: - os.remove(script) - -# Start the freezing process. -fzr() - -# Clean up the duplicated scripts. -for script in script_list: - os.remove(script) - -# Exclude files which are already included in GTK or Windows. Also exclude unneeded pygame dlls. -exclude_dlls = ( - 'MSIMG32.dll', - 'MSVCR90.dll', - 'MSVCP90.dll', - 'MSVCR120.dll', - 'POWRPROF.dll', - 'DNSAPI.dll', - 'USP10.dll', - 'MPR.dll', - 'jpeg.dll', - 'libfreetype-6.dll', - 'libpng12-0.dll', - 'libtiff.dll', - 'SDL_image.dll', - 'SDL_ttf.dll', -) -for exclude_dll in exclude_dlls: - try: - os.remove(os.path.join(build_dir, exclude_dll)) - except OSError: - pass - -# Re-enable printing. -if not DEBUG: - sys.stdout = sys.__stdout__ - -# Copy gtk locale files. -gtk_locale = os.path.join(gtk_root, 'share/locale') -locale_include_list = ['gtk20.mo', 'locale.alias'] - - -def ignored_files(adir, ignore_filenames): - return [ - ignore_file - for ignore_file in ignore_filenames - if not os.path.isdir(os.path.join(adir, ignore_file)) - and ignore_file not in locale_include_list - ] - - -shutil.copytree( - gtk_locale, os.path.join(build_dir, 'share/locale'), ignore=ignored_files -) - -# Copy gtk theme files. -theme_include_list = [ - [gtk_root, 'share/icons/hicolor/index.theme'], - [gtk_root, 'lib/gtk-2.0/2.10.0/engines'], - [gtk_root, 'share/themes/MS-Windows'], - ['DelugeStart Theme', 'lib/gtk-2.0/2.10.0/engines/libmurrine.dll'], - ['DelugeStart Theme', 'share/themes/DelugeStart'], - ['DelugeStart Theme', 'etc/gtk-2.0/gtkrc'], -] -for path_root, path in theme_include_list: - full_path = os.path.join(path_root, path) - if os.path.isdir(full_path): - shutil.copytree(full_path, os.path.join(build_dir, path)) - else: - dst_dir = os.path.join(build_dir, os.path.dirname(path)) - try: - os.makedirs(dst_dir) - except OSError: - pass - shutil.copy(full_path, dst_dir) - -# Add version information to exe files. -for script in script_list: - script_exe = os.path.splitext(os.path.basename(script))[0] + '.exe' - # Don't add to dev build versions. - if not re.search('[a-zA-Z_-]', build_version): - version_info = VersionInfo( - build_version, - description='Deluge Bittorrent Client', - company='Deluge Team', - product='Deluge', - _copyright='Deluge Team', - ) - stamp(os.path.join(build_dir, script_exe), version_info) - -# Copy version info to file for nsis script. -with open('VERSION.tmp', 'w') as ver_file: - ver_file.write('build_version = "%s"' % build_version) - -# Create the install and uninstall file list for NSIS. -filedir_list = [] -for root, dirnames, filenames in os.walk(build_dir): - dirnames.sort() - filenames.sort() - filedir_list.append((root[len(build_dir) :], filenames)) - -with open('install_files.nsh', 'w') as f: - f.write('; Files to install\n') - for dirname, files in filedir_list: - if not dirname: - dirname = os.sep - f.write('\nSetOutPath "$INSTDIR%s"\n' % dirname) - for filename in files: - f.write('File "${BBFREEZE_DIR}%s"\n' % os.path.join(dirname, filename)) - -with open('uninstall_files.nsh', 'w') as f: - f.write('; Files to uninstall\n') - for dirname, files in reversed(filedir_list): - f.write('\n') - if not dirname: - dirname = os.sep - for filename in files: - f.write('Delete "$INSTDIR%s"\n' % os.path.join(dirname, filename)) - f.write('RMDir "$INSTDIR%s"\n' % dirname)