Merge branch 'dev' into version-v2, alpha release v1.99.2

Former-commit-id: 4dbfd74f4b
This commit is contained in:
Leroy.H.Y 2019-11-27 10:51:17 +08:00
commit c35fa4466c
146 changed files with 12577 additions and 4653 deletions

View File

@ -36,7 +36,7 @@ jobs:
cd build
cd release
del *.cpp *.h *.o *.qrc *.qm
windeployqt ./Qv2ray.exe --compiler-runtime
windeployqt ./qv2ray.exe --compiler-runtime
cd ..
..\tools\7z.exe a Qv2ray.zip .\release
- name: Uploading artifact
@ -71,10 +71,10 @@ jobs:
- name: Making release tarball
run: |
cd build
cd Qv2ray.app
cd qv2ray.app
macdeployqt ./
cd ..
tar czf Qv2ray.app.tar.gz Qv2ray.app
tar czf Qv2ray.app.tar.gz qv2ray.app
- name: Uploading Artifact
uses: actions/upload-artifact@master
with:
@ -117,7 +117,7 @@ jobs:
cd AppDir
mkdir -p ./usr/lib/
mkdir -p ./usr/bin/
mv ./usr/local/bin/Qv2ray ./usr/bin/Qv2ray
mv ./usr/local/bin/qv2ray ./usr/bin/qv2ray
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 ./usr/lib/
- name: Building AppImage using linuxdeployqt
run: |
@ -126,7 +126,7 @@ jobs:
chmod +x ./linuxdeployqt-6-x86_64.AppImage
./linuxdeployqt-6-x86_64.AppImage --appimage-extract
cd AppDir
../squashfs-root/AppRun usr/share/applications/Qv2ray.desktop -appimage -no-strip -always-overwrite
../squashfs-root/AppRun usr/share/applications/qv2ray.desktop -appimage -no-strip -always-overwrite
mv ./Qv2ray*.AppImage ./Qv2ray.AppImage
- name: Uploading artifact
uses: actions/upload-artifact@master

View File

@ -38,7 +38,7 @@ jobs:
cd build
cd release
del *.cpp *.h *.o *.qrc *.qm
windeployqt ./Qv2ray.exe --compiler-runtime
windeployqt ./qv2ray.exe --compiler-runtime
cd ..
..\tools\7z.exe a Qv2ray.zip .\release
- name: Uploading artifact
@ -81,10 +81,10 @@ jobs:
- name: Making release tarball
run: |
cd build
cd Qv2ray.app
cd qv2ray.app
macdeployqt ./
cd ..
tar czf Qv2ray.app.tar.gz Qv2ray.app
tar czf Qv2ray.app.tar.gz qv2ray.app
- name: Uploading Artifact
uses: actions/upload-artifact@master
with:
@ -135,7 +135,7 @@ jobs:
cd AppDir
mkdir -p ./usr/lib/
mkdir -p ./usr/bin/
mv ./usr/local/bin/Qv2ray ./usr/bin/Qv2ray
mv ./usr/local/bin/qv2ray ./usr/bin/qv2ray
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 ./usr/lib/
- name: Building AppImage using linuxdeployqt
run: |
@ -144,7 +144,7 @@ jobs:
chmod +x ./linuxdeployqt-6-x86_64.AppImage
./linuxdeployqt-6-x86_64.AppImage --appimage-extract
cd AppDir
../squashfs-root/AppRun usr/share/applications/Qv2ray.desktop -appimage -no-strip -always-overwrite
../squashfs-root/AppRun usr/share/applications/qv2ray.desktop -appimage -no-strip -always-overwrite
mv ./Qv2ray*.AppImage ./Qv2ray.AppImage
- name: Uploading artifact
uses: actions/upload-artifact@master

1
.gitignore vendored
View File

@ -4,6 +4,7 @@
*.qm
./.vscode
SourceTrail/
libs/gen/
libs/gRPC-win32/

6
.gitmodules vendored
View File

@ -1,3 +1,9 @@
[submodule "3rdparty/x2struct"]
path = 3rdparty/x2struct
url = https://github.com/xyz347/x2struct
[submodule "3rdparty/qzxing_noTests"]
path = 3rdparty/qzxing_noTests
url = https://github.com/lhy0403/qzxing_noTests
[submodule "3rdparty/qhttpserver"]
path = 3rdparty/qhttpserver
url = https://github.com/nikhilm/qhttpserver

1
3rdparty/qhttpserver vendored Submodule

@ -0,0 +1 @@
Subproject commit 02a6e7174b5be76e2c0e74a109817e39a141b9fd

1
3rdparty/qzxing_noTests vendored Submodule

@ -0,0 +1 @@
Subproject commit c29307b6124e012ba1287ba0906e8807424e45c2

2
3rdparty/x2struct vendored

@ -1 +1 @@
Subproject commit 61abc0a4df4b5b3d730b926231b05593560369c2
Subproject commit f2200a5f662730f2c5e49bccb680edbd533f1ff8

View File

@ -1 +1 @@
155
917

View File

@ -6,10 +6,15 @@
QT += core gui widgets network charts
TARGET = Qv2ray
TARGET = qv2ray
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11 openssl-linked lrelease embed_translations
# Don't merge those configs with below.
CONFIG += enable_decoder_qr_code enable_encoder_qr_code
include(3rdparty/qzxing_noTests/QZXing-components.pri)
# Main config
CONFIG += qt c++11 openssl-linked lrelease embed_translations
# Now read build number file.
_BUILD_NUMBER=$$cat(Build.Counter)
@ -17,66 +22,79 @@ VERSION = 1.99.1.$$_BUILD_NUMBER
_BUILD_NUMBER = $$num_add($$_BUILD_NUMBER, 1)
write_file("Build.Counter", _BUILD_NUMBER)
DEFINES += QV2RAY_VERSION_STRING=\"\\\"v$${VERSION}\\\"\"
DEFINES += QT_DEPRECATED_WARNINGS QV2RAY_VERSION_STRING=\"\\\"v$${VERSION}\\\"\"
SOURCES += \
src/components/QvComponentsHandler.cpp \
src/components/QvPACHandler.cpp \
src/components/QvSystemProxyConfigurator.cpp \
src/main.cpp \
src/components/QvCoreInteractions.cpp \
src/components/QvGFWPACConverter.cpp \
src/components/QvHTTPRequestHelper.cpp \
src/QvCoreConfigOperations.cpp \
src/QvConfigUpgrade.cpp \
src/QvCoreConfigOperations_Convertion.cpp \
src/QvCoreConfigOperations_Generation.cpp \
src/QvCoreConfigOperations_Verification.cpp \
src/QvCoreInteractions.cpp \
src/QvUtils.cpp \
src/ui/NetSpeedBar/QvNetSpeedBar.cpp \
src/utils/QObjectMessageProxy.cpp \
src/utils/QvPingModel.cpp \
src/utils/QvRunguard.cpp \
src/utils/QJsonModel.cpp \
src/ui/w_ExportConfig.cpp \
src/ui/w_InboundEditor.cpp \
src/ui/w_OutboundEditor.cpp \
src/ui/w_RoutesEditor.cpp \
src/ui/w_SubscriptionEditor.cpp \
src/utils/QObjectMessageProxy.cpp \
src/utils/QPingModel.cpp \
src/utils/QvHTTPRequestHelper.cpp \
src/utils/QvRunguard.cpp \
src/utils/QJsonModel.cpp \
src/ui/w_JsonEditor.cpp \
src/ui/w_MainWindow.cpp \
src/ui/w_ImportConfig.cpp \
src/ui/w_PrefrencesWindow.cpp \
src/ui/w_ScreenShot_Core.cpp \
src/ui/NetSpeedBar/QvNetSpeedBar.cpp \
libs/gen/v2ray_api_commands.pb.cc \
libs/gen/v2ray_api_commands.grpc.pb.cc
INCLUDEPATH += \
3rdparty/ \
src/ \
src/components \
src/ui/ \
src/utils/ \
libs/gen/
HEADERS += \
src/Qv2rayBase.h \
src/QvCoreConfigObjects.h \
src/QvCoreConfigOperations.h \
src/QvCoreInteractions.h \
src/QvUtils.h \
src/ui/w_InboundEditor.h \
src/ui/w_OutboundEditor.h \
src/ui/w_RoutesEditor.h \
src/ui/w_SubscriptionEditor.h \
src/Qv2rayBase.hpp \
src/QvCoreConfigObjects.hpp \
src/QvCoreConfigOperations.hpp \
src/QvUtils.hpp \
src/components/QvComponentsHandler.hpp \
src/components/QvCoreInteractions.hpp \
src/components/QvHTTPRequestHelper.hpp \
src/components/QvNetSpeedPlugin.hpp \
src/components/QvPACHandler.hpp \
src/components/QvSystemProxyConfigurator.hpp \
src/ui/w_ExportConfig.hpp \
src/ui/w_ImportConfig.hpp \
src/ui/w_InboundEditor.hpp \
src/ui/w_JsonEditor.hpp \
src/ui/w_MainWindow.hpp \
src/ui/w_OutboundEditor.hpp \
src/ui/w_PrefrencesWindow.hpp \
src/ui/w_RoutesEditor.hpp \
src/ui/w_SubscriptionEditor.hpp \
src/ui/w_ScreenShot_Core.hpp \
src/utils/QvTinyLog.hpp \
src/utils/QJsonModel.hpp \
src/utils/QJsonObjectInsertMacros.h \
src/utils/QObjectMessageProxy.h \
src/utils/QPingModel.h \
src/utils/QvHTTPRequestHelper.h \
src/utils/QvNetSpeedPlugin.h \
src/utils/QvRunguard.h \
src/utils/QvTinyLog.h \
src/utils/QJsonModel.h \
src/ui/w_JsonEditor.h \
src/ui/w_ImportConfig.h \
src/ui/w_MainWindow.h \
src/ui/w_PrefrencesWindow.h \
src/utils/QObjectMessageProxy.hpp \
src/utils/QvPingModel.hpp \
src/utils/QvRunguard.hpp \
libs/gen/v2ray_api_commands.pb.h \
libs/gen/v2ray_api_commands.grpc.pb.h
FORMS += \
src/ui/w_ExportConfig.ui \
src/ui/w_ImportConfig.ui \
src/ui/w_InboundEditor.ui \
src/ui/w_JsonEditor.ui \
@ -84,6 +102,7 @@ FORMS += \
src/ui/w_OutboundEditor.ui \
src/ui/w_PrefrencesWindow.ui \
src/ui/w_RoutesEditor.ui \
src/ui/w_ScreenShot_Core.ui \
src/ui/w_SubscriptionEditor.ui
RESOURCES += \
@ -102,8 +121,10 @@ message("| |")
message("| See: https://www.gnu.org/licenses/gpl-3.0.html |")
message("|-------------------------------------------------|")
message(" ")
RC_ICONS += ./icons/Qv2ray.ico
ICON = ./icons/Qv2ray.icns
RC_ICONS += ./icons/qv2ray.ico
ICON = ./icons/qv2ray.icns
# ------------------------------------------ Begin checking gRPC and protobuf headers.
!exists(libs/gen/v2ray_api_commands.grpc.pb.h) || !exists(libs/gen/v2ray_api_commands.grpc.pb.cc) || !exists(libs/gen/v2ray_api_commands.pb.h) || !exists(libs/gen/v2ray_api_commands.pb.cc) {
@ -128,7 +149,8 @@ for(var, $$list($$files("translations/*.ts", true))) {
LOCALE_FILENAME = $$basename(var)
message(" --> Found:" $$LOCALE_FILENAME)
!equals(LOCALE_FILENAME, "en-US.ts") {
# ONLY USED IN LRELEASE CONTEXTen-US is not EXTRA...
# ONLY USED IN LRELEASE CONTEXT
# en-US is not EXTRA...
EXTRA_TRANSLATIONS += translations/$$LOCALE_FILENAME
}
}
@ -136,9 +158,23 @@ message("Qv2ray will build with" $${replace(EXTRA_TRANSLATIONS, "translations/",
TRANSLATIONS += translations/en-US.ts
message(" ")
QMAKE_CXXFLAGS += "-Wno-missing-field-initializers" "-Wno-unused-parameter" "-Wno-unused-variable"
QMAKE_CXXFLAGS += -Wno-missing-field-initializers -Wno-unused-parameter -Wno-unused-variable
message("Adding QHttpServer Support")
message(" --> Adding qhttpserver")
HEADERS += $$PWD/3rdparty/qhttpserver/src/*.h
SOURCES += $$PWD/3rdparty/qhttpserver/src/*.cpp
INCLUDEPATH += 3rdparty/qhttpserver/src/
message(" --> Adding http parser")
HEADERS += 3rdparty/qhttpserver/http-parser/http_parser.h
SOURCES += 3rdparty/qhttpserver/http-parser/http_parser.c
INCLUDEPATH += 3rdparty/qhttpserver/http-parser/
message(" ")
win32 {
message("Configuring for win32 environment")
DEFINES += QHTTPSERVER_EXPORT
message(" --> Setting up target descriptions")
QMAKE_TARGET_DESCRIPTION = "Qv2ray, a cross-platform v2ray GUI client."
QMAKE_TARGET_PRODUCT = "Qv2ray"
@ -153,6 +189,9 @@ win32 {
message(" --> Linking against gRPC and protobuf library.")
LIBS += -L$$PWD/libs/gRPC-win32/lib/ -llibgrpc++.dll -llibprotobuf.dll
message(" --> Linking against winHTTP.")
LIBS += -lwinhttp -lwininet
INCLUDEPATH += $$PWD/libs/gRPC-win32/include
DEPENDPATH += $$PWD/libs/gRPC-win32/include
PRE_TARGETDEPS += $$PWD/libs/gRPC-win32/lib/libgrpc++.dll.a $$PWD/libs/gRPC-win32/lib/libprotobuf.dll.a
@ -173,11 +212,11 @@ unix {
SOURCES += src/ui/NetSpeedBar/QvNetSpeedBar_linux.cpp
message(" --> Generating desktop dependency.")
desktop.files += ./icons/Qv2ray.desktop
desktop.files += ./icons/qv2ray.desktop
desktop.path = /usr/share/applications/
message(" --> Generating icons dependency.")
icon.files += ./icons/Qv2ray.png
icon.files += ./icons/qv2ray.png
icon.path = /usr/share/icons/hicolor/256x256/apps/
target.path = /usr/local/bin/

View File

@ -37,20 +37,20 @@
- 访问链接: [https://jenkins.lhy0403.top/](https://jenkins.lhy0403.top/)
| | [Master](https://github.com/lhy0403/Qv2ray/tree/master) | [Developement](https://github.com/lhy0403/Qv2ray/tree/dev) | [Version v1](https://github.com/lhy0403/Qv2ray/tree/version-v1) | [Version v2](https://github.com/lhy0403/Qv2ray/tree/version-v2) | Testing |
| -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| Linux AppImage | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Release/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Release/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Dev/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Dev/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Version1/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Version1/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Version2/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Version2/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Testing/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Testing/) |
| Windows Zip | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Release/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Release/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Dev/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Dev/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Version1/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Version1/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Version2/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Version2/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Testing/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Testing/) |
| | [Master](https://github.com/lhy0403/Qv2ray/tree/master) | [Version v1](https://github.com/lhy0403/Qv2ray/tree/version-v1) |
| -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| Linux AppImage | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Release/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Release/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Version1/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-AppImage-Version1/) |
| Windows Zip | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Release/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Release/) | [![Build Status](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Version1/badge/icon)](https://jenkins.lhy0403.top/job/Qv2ray-Win32-Version1/) |
### Travis & Appveyor 多平台构建状态
*Travis per machine badge provided by: [badge-matrix](https://github.com/exogen/badge-matrix)*
| OS | 主分支 [master](https://github.com/lhy0403/Qv2ray/tree/master) | 开发分支 [dev](https://github.com/lhy0403/Qv2ray/tree/dev) | 版本分支 [version-v1](https://github.com/lhy0403/Qv2ray/tree/version-v1) | 版本分支 [version-v2](https://github.com/lhy0403/Qv2ray/tree/version-v2) |
| --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| [Linux](https://travis-ci.com/lhy0403/Qv2ray) | ![Build Status Linux in master](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=linux&label=Linux-master&branch=master) | ![Build Status Linux in dev](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=linux&label=Linux-dev&branch=dev) | ![Build Status Linux in v1.0.0](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=linux&label=Linux-v1&branch=version-v1) | ![Build Status Linux in v2.0.0](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=linux&label=Linux-v2&branch=version-v2) |
| [macOS](https://travis-ci.com/lhy0403/Qv2ray) | ![Build Status macOS in master](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=osx&label=macOS-master&branch=master) | ![Build Status macOS in dev](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=osx&label=macOS-dev&branch=dev) | ![Build Status macOS in v1](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=osx&label=macOS-v1&branch=version-v1) | ![Build Status macOS in v2](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=osx&label=macOS-v2&branch=version-v2) |
| [Windows](https://ci.appveyor.com/project/lhy0403/qv2ray) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/master?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/dev?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/dev) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/version-v1?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/version-v1) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/version-v2?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/version-v2) |
| OS | 主分支 [master](https://github.com/lhy0403/Qv2ray/tree/master) | 版本分支 [version-v1](https://github.com/lhy0403/Qv2ray/tree/version-v1) |
| --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| [Linux](https://travis-ci.com/lhy0403/Qv2ray) | ![Build Status Linux in master](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=linux&label=Linux-master&branch=master) | ![Build Status Linux in v1.0.0](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=linux&label=Linux-v1&branch=version-v1) |
| [macOS](https://travis-ci.com/lhy0403/Qv2ray) | ![Build Status macOS in master](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=osx&label=macOS-master&branch=master) | ![Build Status macOS in v1](http://badges.herokuapp.com/travis.com/lhy0403/Qv2ray?style=flat-square&env=BADGE=osx&label=macOS-v1&branch=version-v1) |
| [Windows](https://ci.appveyor.com/project/lhy0403/qv2ray) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/master?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/version-v1?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/version-v1) |

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg16"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="add_connection_btn.svg">
<defs
id="defs10" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="-311.88599"
inkscape:cy="374.18688"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1050"
inkscape:window-x="1920"
inkscape:window-y="30"
inkscape:window-maximized="1" />
<metadata
id="metadata13">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="rect74-7"
style="fill:#808080;stroke-width:0.23007688"
d="M 110.29167,82.354162 V 214.64584 H 99.708338 l -10e-7,-132.291678 z M 38.854163,143.20833 H 171.14584 v 10.58333 H 38.854163 Z"
inkscape:connector-curvature="0"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,319 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 12.699999 12.7"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="Qv2ray_AppLogo-noBG.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/qv2ray.png"
inkscape:export-xdpi="292.57144"
inkscape:export-ydpi="292.57144">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient908">
<stop
style="stop-color:#6e7678;stop-opacity:1"
offset="0"
id="stop904" />
<stop
style="stop-color:#2e3235;stop-opacity:1"
offset="1"
id="stop906" />
</linearGradient>
<linearGradient
id="linearGradient1014"
inkscape:collect="always">
<stop
id="stop1010"
offset="0"
style="stop-color:#232629;stop-opacity:1" />
<stop
id="stop1012"
offset="1"
style="stop-color:#282728;stop-opacity:0.6574803" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient847">
<stop
style="stop-color:#c1fe6f;stop-opacity:1"
offset="0"
id="stop843" />
<stop
style="stop-color:#60fe6f;stop-opacity:1"
offset="1"
id="stop845" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5057">
<stop
style="stop-color:#3c3c3c;stop-opacity:1;"
offset="0"
id="stop5053" />
<stop
style="stop-color:#282728;stop-opacity:0.6574803"
offset="1"
id="stop5055" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4759">
<stop
style="stop-color:#2eec71;stop-opacity:1"
offset="0"
id="stop4755" />
<stop
style="stop-color:#1cdc9a;stop-opacity:1"
offset="1"
id="stop4757" />
</linearGradient>
<linearGradient
id="linearGradient4713"
inkscape:collect="always">
<stop
id="stop4709"
offset="0"
style="stop-color:#3de256;stop-opacity:1" />
<stop
id="stop4711"
offset="1"
style="stop-color:#2fbeba;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4713"
id="linearGradient4707"
x1="89.965836"
y1="19.458199"
x2="108.00179"
y2="39.934193"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(38.574145,1.3181723)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5057"
id="linearGradient5059"
x1="92.227142"
y1="48.940449"
x2="140.26065"
y2="94.022179"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4759"
id="linearGradient953"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.34597512,0.06144722,-0.06655638,0.31941658,-25.119909,272.6237)"
x1="85.229973"
y1="28.293249"
x2="113.08728"
y2="35.515835" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient847"
id="linearGradient955"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.15666471,0,0,0.15666471,-5.1504396,254.55225)"
x1="39.630962"
y1="196.65211"
x2="56.496174"
y2="208.57474" />
<linearGradient
gradientTransform="matrix(0.20376549,0,0,0.20074727,-14.31152,285.69187)"
inkscape:collect="always"
xlink:href="#linearGradient1014"
id="linearGradient976"
x1="85.003403"
y1="24.072737"
x2="90.152313"
y2="29.206858"
gradientUnits="userSpaceOnUse" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath922">
<rect
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625"
id="rect924"
width="12.7"
height="12.170834"
x="9.5367426e-08"
y="284.56458"
ry="1.0638391" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient908"
id="linearGradient910"
x1="12.7"
y1="284.29999"
x2="12.7"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.87500008,0,0,0.87505491,0.81442048,36.315602)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4759"
id="linearGradient874"
x1="255.39789"
y1="156.97427"
x2="256.42874"
y2="156.97427"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient908"
id="linearGradient62"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.87500008,0,0,0.87505491,-13.281515,36.362432)"
x1="12.7"
y1="284.29999"
x2="12.7"
y2="297" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.980121"
inkscape:cx="20.802729"
inkscape:cy="23.989658"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-smooth-nodes="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-midpoints="true"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-center="true"
inkscape:snap-text-baseline="true"
inkscape:snap-global="true"
inkscape:snap-grids="false"
inkscape:snap-to-guides="true">
<inkscape:grid
type="xygrid"
id="grid885" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-284.29999)">
<ellipse
id="path64"
cx="6.3760843"
cy="290.90906"
rx="6.2284365"
ry="6.1347756"
style="fill:url(#linearGradient62)"
z="9" />
<g
id="g889"
transform="matrix(0.77674917,0,0,0.77993751,1.4662318,64.012038)">
<path
style="fill:#27b181;fill-opacity:1;stroke:none;stroke-width:0.02480469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.9266835,288.67208 c 0,0 -0.3728772,0.72708 -0.5817291,0.90212 -0.1467587,0.12299 -0.5403878,0.19489 -0.5403878,0.19489 l 0.7707172,0.2259 1.6743163,-0.39422 c 0,0 -0.7913874,-1.07043 -1.3229166,-0.92869 z"
id="path879-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscccc" />
<path
sodipodi:nodetypes="cscc"
inkscape:connector-curvature="0"
id="path4715-0"
d="m 4.1744977,288.92304 c 0,0 1.1173813,-2.75102 3.3019109,-0.59828 2.1845217,2.15274 3.6949274,5.47345 3.6949274,5.47345 0,0 -2.9944654,-4.26031 -6.9968383,-4.87517 z"
style="fill:#1cd28e;fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4715-6-93"
d="m 2.2426889,288.4487 c 0,0 -0.1508518,-2.94653 2.7747518,-1.81527 2.9256022,1.13127 6.6242253,4.28351 6.6242253,4.28351 0,0 -4.8112308,-3.07932 -9.3989771,-2.46824 z"
style="fill:url(#linearGradient953);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cscc"
inkscape:connector-curvature="0"
id="path4715-6-9-6"
d="m 1.3229167,287.74194 c 0,0 -1.322916666666666,-2.64583 1.9849644,-2.35592 3.1595803,0.27691 7.8046189,2.09134 7.8046189,2.09134 0,0 -5.6043102,-1.52438 -9.7895833,0.26458 z"
style="fill:url(#linearGradient955);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.27755448;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 3.6416708,289.91693 c -0.7492351,0 -1.3524704,0.69167 -1.3524704,1.5509 v 1.17083 c 0,0.85923 0.6032353,1.55108 1.3524704,1.55108 h 0.5832971 c 0.7492363,0 1.3524712,-0.69185 1.3524712,-1.55108 v -1.17083 c 0,-0.85923 -0.6032349,-1.5509 -1.3524712,-1.5509 z m 0.1234318,0.60551 h 0.3346139 c 0.429567,0 0.7753625,0.37687 0.7753625,0.84495 v 1.40023 c 0,0.46808 -0.3457955,0.84495 -0.7753625,0.84495 H 3.7651026 c -0.4295666,0 -0.7753632,-0.37687 -0.7753632,-0.84495 v -1.40023 c 0,-0.46808 0.3457966,-0.84495 0.7753632,-0.84495 z"
id="rect4871-6"
inkscape:connector-curvature="0" />
<rect
style="fill:url(#linearGradient874);fill-opacity:1.0;stroke:none;stroke-width:0.28459525;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4892-2"
width="1.0308615"
height="0.77975327"
x="255.39789"
y="156.5844"
rx="0"
ry="0"
transform="matrix(0.54708146,0.83707937,-0.86047141,0.50949872,0,0)" />
<rect
style="opacity:0.5;fill:url(#linearGradient976);fill-opacity:0.5;stroke:none;stroke-width:0.6178087;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect968"
width="1.8878751"
height="3.0746891"
x="2.9962649"
y="290.52454"
ry="0.7882148" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.77398825px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.04434972"
x="6.0134816"
y="291.99249"
id="text877"
transform="scale(0.99392476,1.0061124)"><tspan
sodipodi:role="line"
id="tspan875"
x="6.0134816"
y="291.99249"
style="fill:#ffffff;fill-opacity:1;stroke-width:0.04434972">V2ray</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,271 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 12.699999 12.7"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="Applogo_Frameless.svg"
inkscape:export-filename="/media/Storage/Projects/Qv2ray/icons/qv.png"
inkscape:export-xdpi="512"
inkscape:export-ydpi="512">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient908">
<stop
style="stop-color:#6e7678;stop-opacity:1"
offset="0"
id="stop904" />
<stop
style="stop-color:#2e3235;stop-opacity:1"
offset="1"
id="stop906" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient847">
<stop
style="stop-color:#c1fe6f;stop-opacity:1"
offset="0"
id="stop843" />
<stop
style="stop-color:#60fe6f;stop-opacity:1"
offset="1"
id="stop845" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5057">
<stop
style="stop-color:#3c3c3c;stop-opacity:1;"
offset="0"
id="stop5053" />
<stop
style="stop-color:#282728;stop-opacity:0.6574803"
offset="1"
id="stop5055" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4759">
<stop
style="stop-color:#2eec71;stop-opacity:1"
offset="0"
id="stop4755" />
<stop
style="stop-color:#1cdc9a;stop-opacity:1"
offset="1"
id="stop4757" />
</linearGradient>
<linearGradient
id="linearGradient4713"
inkscape:collect="always">
<stop
id="stop4709"
offset="0"
style="stop-color:#3de256;stop-opacity:1" />
<stop
id="stop4711"
offset="1"
style="stop-color:#2fbeba;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4713"
id="linearGradient4707"
x1="89.965836"
y1="19.458199"
x2="108.00179"
y2="39.934193"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(38.574145,1.3181723)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5057"
id="linearGradient5059"
x1="92.227142"
y1="48.940449"
x2="140.26065"
y2="94.022179"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4759"
id="linearGradient953"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.34597512,0.06144722,-0.06655638,0.31941658,-25.119909,272.6237)"
x1="85.229973"
y1="28.293249"
x2="113.08728"
y2="35.515835" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient847"
id="linearGradient955"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.15666471,0,0,0.15666471,-5.1504396,254.55225)"
x1="39.630962"
y1="196.65211"
x2="56.496174"
y2="208.57474" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath922">
<rect
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625"
id="rect924"
width="12.7"
height="12.170834"
x="9.5367426e-08"
y="284.56458"
ry="1.0638391" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient908"
id="linearGradient910"
x1="12.7"
y1="284.29999"
x2="12.7"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.87500008,0,0,0.87505491,0.81442048,36.315602)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4759"
id="linearGradient874"
x1="255.39789"
y1="156.97427"
x2="256.42874"
y2="156.97427"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="31.960242"
inkscape:cx="19.684095"
inkscape:cy="21.19423"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="false"
inkscape:snap-smooth-nodes="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-midpoints="false"
units="px"
inkscape:snap-nodes="false"
inkscape:snap-others="false"
inkscape:object-paths="false"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-center="false"
inkscape:snap-text-baseline="false"
inkscape:snap-global="false"
inkscape:snap-grids="false"
inkscape:snap-to-guides="false">
<inkscape:grid
type="xygrid"
id="grid885" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-284.29999)">
<g
id="g889"
transform="matrix(0.77674917,0,0,0.77993751,1.4662318,64.012038)">
<path
style="fill:#27b181;fill-opacity:1;stroke:none;stroke-width:0.02480469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.9266835,288.67208 c 0,0 -0.3728772,0.72708 -0.5817291,0.90212 -0.1467587,0.12299 -0.5403878,0.19489 -0.5403878,0.19489 l 0.7707172,0.2259 1.6743163,-0.39422 c 0,0 -0.7913874,-1.07043 -1.3229166,-0.92869 z"
id="path879-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscccc" />
<path
sodipodi:nodetypes="cscc"
inkscape:connector-curvature="0"
id="path4715-0"
d="m 4.1744977,288.92304 c 0,0 1.1173813,-2.75102 3.3019109,-0.59828 2.1845217,2.15274 3.6949274,5.47345 3.6949274,5.47345 0,0 -2.9944654,-4.26031 -6.9968383,-4.87517 z"
style="fill:#1cd28e;fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4715-6-93"
d="m 2.2426889,288.4487 c 0,0 -0.1508518,-2.94653 2.7747518,-1.81527 2.9256022,1.13127 6.6242253,4.28351 6.6242253,4.28351 0,0 -4.8112308,-3.07932 -9.3989771,-2.46824 z"
style="fill:url(#linearGradient953);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cscc"
inkscape:connector-curvature="0"
id="path4715-6-9-6"
d="m 1.3229167,287.74194 c 0,0 -1.322916666666666,-2.64583 1.9849644,-2.35592 3.1595803,0.27691 7.8046189,2.09134 7.8046189,2.09134 0,0 -5.6043102,-1.52438 -9.7895833,0.26458 z"
style="fill:url(#linearGradient955);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
style="fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.27755448;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 3.6416708,289.91693 c -0.7492351,0 -1.3524704,0.69167 -1.3524704,1.5509 v 1.17083 c 0,0.85923 0.6032353,1.55108 1.3524704,1.55108 h 0.5832971 c 0.7492363,0 1.3524712,-0.69185 1.3524712,-1.55108 v -1.17083 c 0,-0.85923 -0.6032349,-1.5509 -1.3524712,-1.5509 z m 0.1234318,0.60551 h 0.3346139 c 0.429567,0 0.7753625,0.37687 0.7753625,0.84495 v 1.40023 c 0,0.46808 -0.3457955,0.84495 -0.7753625,0.84495 H 3.7651026 c -0.4295666,0 -0.7753632,-0.37687 -0.7753632,-0.84495 v -1.40023 c 0,-0.46808 0.3457966,-0.84495 0.7753632,-0.84495 z"
id="rect4871-6"
inkscape:connector-curvature="0" />
<rect
style="fill:url(#linearGradient874);fill-opacity:1.0;stroke:none;stroke-width:0.28459525;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4892-2"
width="1.0308615"
height="0.77975327"
x="255.39789"
y="156.5844"
rx="0"
ry="0"
transform="matrix(0.54708146,0.83707937,-0.86047141,0.50949872,0,0)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.77398825px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.04434972;"
x="6.0134816"
y="291.99249"
id="text877"
transform="scale(0.99392476,1.0061124)"><tspan
sodipodi:role="line"
id="tspan875"
x="6.0134816"
y="291.99249"
style="fill:#666666;fill-opacity:1;stroke-width:0.04434972;">V2ray</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@ -0,0 +1,383 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 12.699999 12.7"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="Qv2ray_Green.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/qv2ray.png"
inkscape:export-xdpi="292.57144"
inkscape:export-ydpi="292.57144">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient908">
<stop
style="stop-color:#6e7678;stop-opacity:1"
offset="0"
id="stop904" />
<stop
style="stop-color:#2e3235;stop-opacity:1"
offset="1"
id="stop906" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient881">
<stop
style="stop-color:#4d595a;stop-opacity:1"
offset="0"
id="stop877" />
<stop
style="stop-color:#313537;stop-opacity:1"
offset="1"
id="stop879" />
</linearGradient>
<linearGradient
id="linearGradient1014"
inkscape:collect="always">
<stop
id="stop1010"
offset="0"
style="stop-color:#232629;stop-opacity:1" />
<stop
id="stop1012"
offset="1"
style="stop-color:#282728;stop-opacity:0.6574803" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient974">
<stop
style="stop-color:#232629;stop-opacity:1;"
offset="0"
id="stop970" />
<stop
style="stop-color:#232629;stop-opacity:0;"
offset="1"
id="stop972" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient847">
<stop
style="stop-color:#c1fe6f;stop-opacity:1"
offset="0"
id="stop843" />
<stop
style="stop-color:#60fe6f;stop-opacity:1"
offset="1"
id="stop845" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5057">
<stop
style="stop-color:#3c3c3c;stop-opacity:1;"
offset="0"
id="stop5053" />
<stop
style="stop-color:#282728;stop-opacity:0.6574803"
offset="1"
id="stop5055" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4759">
<stop
style="stop-color:#2eec71;stop-opacity:1"
offset="0"
id="stop4755" />
<stop
style="stop-color:#1cdc9a;stop-opacity:1"
offset="1"
id="stop4757" />
</linearGradient>
<linearGradient
id="linearGradient4713"
inkscape:collect="always">
<stop
id="stop4709"
offset="0"
style="stop-color:#3de256;stop-opacity:1" />
<stop
id="stop4711"
offset="1"
style="stop-color:#2fbeba;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4713"
id="linearGradient4707"
x1="89.965836"
y1="19.458199"
x2="108.00179"
y2="39.934193"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(38.574145,1.3181723)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5057"
id="linearGradient5059"
x1="92.227142"
y1="48.940449"
x2="140.26065"
y2="94.022179"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4759"
id="linearGradient953"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.34597512,0.06144722,-0.06655638,0.31941658,-25.119909,272.6237)"
x1="85.229973"
y1="28.293249"
x2="113.08728"
y2="35.515835" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient847"
id="linearGradient955"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.15666471,0,0,0.15666471,-5.1504396,254.55225)"
x1="39.630962"
y1="196.65211"
x2="56.496174"
y2="208.57474" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient974"
id="linearGradient984"
x1="2.1166666"
y1="290.38541"
x2="8.2020836"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.77674916,0,0,0.77993748,0.85059819,64.012035)" />
<linearGradient
gradientTransform="matrix(0.20376549,0,0,0.20074727,-14.31152,285.69187)"
inkscape:collect="always"
xlink:href="#linearGradient1014"
id="linearGradient976"
x1="85.003403"
y1="24.072737"
x2="90.152313"
y2="29.206858"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient974"
id="linearGradient1028"
x1="1.3229166"
y1="286.15207"
x2="13.41244"
y2="297.00031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.77674916,0,0,0.77993748,1.4662318,64.013879)" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath922">
<rect
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625"
id="rect924"
width="12.7"
height="12.170834"
x="9.5367426e-08"
y="284.56458"
ry="1.0638391" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient881"
id="linearGradient883"
x1="0"
y1="284.82916"
x2="12.7"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.87499999,0,0,0.8892651,0.79374991,32.185238)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient908"
id="linearGradient910"
x1="12.7"
y1="284.29999"
x2="12.7"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.87500008,0,0,0.87505491,0.81442048,36.315602)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4759"
id="linearGradient874"
x1="255.39789"
y1="156.97427"
x2="256.42874"
y2="156.97427"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.649826"
inkscape:cx="-54.381415"
inkscape:cy="54.29098"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-smooth-nodes="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-midpoints="true"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-center="true"
inkscape:snap-text-baseline="true"
inkscape:snap-global="true"
inkscape:snap-grids="false">
<inkscape:grid
type="xygrid"
id="grid885" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-284.29999)">
<rect
style="fill:url(#linearGradient910);fill-opacity:1;stroke:none;stroke-width:0.21816222;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4910-1"
width="11.1125"
height="11.113197"
x="0.79374999"
y="285.09375"
ry="0.52915668" />
<rect
style="fill:url(#linearGradient883);fill-opacity:1;stroke:none;stroke-width:0.08627162;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4910-2-2"
width="11.1125"
height="10.352571"
x="0.79374999"
y="285.47388"
ry="0.52494615" />
<path
style="opacity:0.65;fill:url(#linearGradient1028);fill-opacity:1;stroke:none;stroke-width:0.20593624px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 2.4938062,288.43277 1.8496339,1.85724 1.0275745,0.41087 4.9323574,4.95258 1.583192,0.002 -0.0022,-5.63289 -1.786476,-1.79602 -3.4937536,-1.0318 -3.699268,0.61907 z"
id="path1020"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc"
clip-path="none" />
<g
id="g889"
transform="matrix(0.77674917,0,0,0.77993751,1.4662318,64.012038)">
<path
style="fill:#27b181;fill-opacity:1;stroke:none;stroke-width:0.02480469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.9266835,288.67208 c 0,0 -0.3728772,0.72708 -0.5817291,0.90212 -0.1467587,0.12299 -0.5403878,0.19489 -0.5403878,0.19489 l 0.7707172,0.2259 1.6743163,-0.39422 c 0,0 -0.7913874,-1.07043 -1.3229166,-0.92869 z"
id="path879-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscccc" />
<path
sodipodi:nodetypes="cscc"
inkscape:connector-curvature="0"
id="path4715-0"
d="m 4.1744977,288.92304 c 0,0 1.1173813,-2.75102 3.3019109,-0.59828 2.1845217,2.15274 3.6949274,5.47345 3.6949274,5.47345 0,0 -2.9944654,-4.26031 -6.9968383,-4.87517 z"
style="fill:#1cd28e;fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4715-6-93"
d="m 2.2426889,288.4487 c 0,0 -0.1508518,-2.94653 2.7747518,-1.81527 2.9256022,1.13127 6.6242253,4.28351 6.6242253,4.28351 0,0 -4.8112308,-3.07932 -9.3989771,-2.46824 z"
style="fill:url(#linearGradient953);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cscc"
inkscape:connector-curvature="0"
id="path4715-6-9-6"
d="m 1.3229167,287.74194 c 0,0 -1.322916666666666,-2.64583 1.9849644,-2.35592 3.1595803,0.27691 7.8046189,2.09134 7.8046189,2.09134 0,0 -5.6043102,-1.52438 -9.7895833,0.26458 z"
style="fill:url(#linearGradient955);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
style="opacity:0.75;fill:url(#linearGradient984);fill-opacity:1;stroke:none;stroke-width:0.20593624px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 2.4947173,293.38352 2.0551488,2.26995 h 5.7544159 l -4.9323566,-4.95259 -0.9012783,-0.24572 0.7071424,0.71003 v 1.99987 l -0.5092722,0.51136 -0.5164926,0.29941 h -0.823185 l -0.6048485,-0.60732 z"
id="path966"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccc" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.27755448;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 3.6416708,289.91693 c -0.7492351,0 -1.3524704,0.69167 -1.3524704,1.5509 v 1.17083 c 0,0.85923 0.6032353,1.55108 1.3524704,1.55108 h 0.5832971 c 0.7492363,0 1.3524712,-0.69185 1.3524712,-1.55108 v -1.17083 c 0,-0.85923 -0.6032349,-1.5509 -1.3524712,-1.5509 z m 0.1234318,0.60551 h 0.3346139 c 0.429567,0 0.7753625,0.37687 0.7753625,0.84495 v 1.40023 c 0,0.46808 -0.3457955,0.84495 -0.7753625,0.84495 H 3.7651026 c -0.4295666,0 -0.7753632,-0.37687 -0.7753632,-0.84495 v -1.40023 c 0,-0.46808 0.3457966,-0.84495 0.7753632,-0.84495 z"
id="rect4871-6"
inkscape:connector-curvature="0" />
<rect
style="fill:url(#linearGradient874);fill-opacity:1.0;stroke:none;stroke-width:0.28459525;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4892-2"
width="1.0308615"
height="0.77975327"
x="255.39789"
y="156.5844"
rx="0"
ry="0"
transform="matrix(0.54708146,0.83707937,-0.86047141,0.50949872,0,0)" />
<rect
style="opacity:0.5;fill:url(#linearGradient976);fill-opacity:1;stroke:none;stroke-width:0.6178087;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect968"
width="1.8878751"
height="3.0746891"
x="2.9962649"
y="290.52454"
ry="0.7882148" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.77398825px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.04434972"
x="6.0134816"
y="291.99249"
id="text877"
transform="scale(0.99392476,1.0061124)"><tspan
sodipodi:role="line"
id="tspan875"
x="6.0134816"
y="291.99249"
style="fill:#ffffff;fill-opacity:1;stroke-width:0.04434972">V2ray</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

471
icons/designs/banner.svg Normal file
View File

@ -0,0 +1,471 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="615.74542"
height="323.61377"
viewBox="0 0 224.48847 117.98311"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="Qv2ray_Banner.svg"
inkscape:export-filename="/home/axionl/Qv2ray_Banner.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient1299">
<stop
style="stop-color:#d1f8de;stop-opacity:0.7421875"
offset="0"
id="stop1295" />
<stop
style="stop-color:#e8fff1;stop-opacity:0.26171875"
offset="1"
id="stop1297" />
</linearGradient>
<linearGradient
id="linearGradient5057"
inkscape:collect="always">
<stop
id="stop5053"
offset="0"
style="stop-color:#3c3c3c;stop-opacity:1;" />
<stop
id="stop5055"
offset="1"
style="stop-color:#282728;stop-opacity:0.6574803" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4713">
<stop
style="stop-color:#3de256;stop-opacity:1"
offset="0"
id="stop4709" />
<stop
style="stop-color:#2fbeba;stop-opacity:1"
offset="1"
id="stop4711" />
</linearGradient>
<linearGradient
gradientTransform="translate(38.574145,1.3181723)"
gradientUnits="userSpaceOnUse"
y2="39.934193"
x2="108.00179"
y1="19.458199"
x1="89.965836"
id="linearGradient4707"
xlink:href="#linearGradient4713"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="94.022179"
x2="140.26065"
y1="48.940449"
x1="92.227142"
id="linearGradient5059"
xlink:href="#linearGradient5057"
inkscape:collect="always" />
<clipPath
id="clipPath922"
clipPathUnits="userSpaceOnUse">
<rect
ry="1.0638391"
y="284.56458"
x="9.5367426e-08"
height="12.170834"
width="12.7"
id="rect924"
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625" />
</clipPath>
<linearGradient
inkscape:collect="always"
id="linearGradient1014">
<stop
style="stop-color:#232629;stop-opacity:1"
offset="0"
id="stop1010" />
<stop
style="stop-color:#282728;stop-opacity:0.6574803"
offset="1"
id="stop1012" />
</linearGradient>
<linearGradient
id="linearGradient974"
inkscape:collect="always">
<stop
id="stop970"
offset="0"
style="stop-color:#232629;stop-opacity:1;" />
<stop
id="stop972"
offset="1"
style="stop-color:#232629;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient847"
inkscape:collect="always">
<stop
id="stop843"
offset="0"
style="stop-color:#c1fe6f;stop-opacity:1" />
<stop
id="stop845"
offset="1"
style="stop-color:#60fe6f;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient4759"
inkscape:collect="always">
<stop
id="stop4755"
offset="0"
style="stop-color:#2eec71;stop-opacity:1" />
<stop
id="stop4757"
offset="1"
style="stop-color:#1cdc9a;stop-opacity:1" />
</linearGradient>
<clipPath
id="clipPath922-0"
clipPathUnits="userSpaceOnUse">
<rect
ry="1.0638391"
y="284.56458"
x="9.5367426e-08"
height="12.170834"
width="12.7"
id="rect924-6"
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1299"
id="linearGradient1293"
x1="10.783128"
y1="217.78912"
x2="177.85728"
y2="339.11475"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient908"
id="linearGradient910"
x1="12.7"
y1="284.29999"
x2="12.7"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.2056978,0,0,1.2057734,77.261682,-114.9911)" />
<linearGradient
inkscape:collect="always"
id="linearGradient908">
<stop
style="stop-color:#6e7678;stop-opacity:1"
offset="0"
id="stop904" />
<stop
style="stop-color:#2e3235;stop-opacity:1"
offset="1"
id="stop906" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient881"
id="linearGradient883"
x1="0"
y1="284.82916"
x2="12.7"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.2056977,0,0,1.2253541,77.233199,-120.6825)" />
<linearGradient
inkscape:collect="always"
id="linearGradient881">
<stop
style="stop-color:#4d595a;stop-opacity:1"
offset="0"
id="stop877" />
<stop
style="stop-color:#313537;stop-opacity:1"
offset="1"
id="stop879" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient974"
id="linearGradient1028-3"
x1="1.3229166"
y1="286.15207"
x2="13.41244"
y2="297.00031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0703139,0,0,1.0747072,78.159839,-76.824538)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4759"
id="linearGradient953-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.34597512,0.06144722,-0.06655638,0.31941658,-25.119909,272.6237)"
x1="85.229973"
y1="28.293249"
x2="113.08728"
y2="35.515835" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient847"
id="linearGradient955-6"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.15666471,0,0,0.15666471,-5.1504396,254.55225)"
x1="39.630962"
y1="196.65211"
x2="56.496174"
y2="208.57474" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient974"
id="linearGradient984-1"
x1="2.1166666"
y1="290.38541"
x2="8.2020836"
y2="297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0703139,0,0,1.0747072,77.311532,-76.827079)" />
<linearGradient
gradientTransform="matrix(0.28077666,0,0,0.27661774,56.41904,228.63448)"
inkscape:collect="always"
xlink:href="#linearGradient1014"
id="linearGradient976-2"
x1="85.003403"
y1="24.072737"
x2="90.152313"
y2="29.206858"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="302.28651"
inkscape:cy="226.42951"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:object-paths="true"
inkscape:snap-bbox="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-nodes="true"
scale-x="0.36458"
fit-margin-top="25"
fit-margin-left="25"
fit-margin-right="25"
fit-margin-bottom="25"
inkscape:snap-intersection-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-text-baseline="true"
inkscape:snap-global="true"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid1234"
originx="46.619838"
originy="24.11246" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(46.619838,-221.12875)">
<rect
style="opacity:1;fill:none;fill-opacity:0.26171875;stroke:none;stroke-width:0.04547203;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625"
id="rect1328"
width="226.03961"
height="120.3114"
x="-47.395409"
y="220.2086" />
<path
style="fill:url(#linearGradient1293);fill-opacity:1;stroke:none;stroke-width:0.36458001px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -37.461738,329.95377 9.160997,9.16099 H 177.85728 l 0.26073,-84.45811 -9.40747,-9.40747 v 84.70459 z"
id="path1285"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
style="opacity:1;fill:#fffefa;fill-opacity:1;stroke:#23d829;stroke-width:0.08719815;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625"
id="rect1254"
width="206.17227"
height="84.704582"
x="-37.461739"
y="245.24918"
ry="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:20.29482841px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.50737071"
x="30.43325"
y="289.26395"
id="text1204"><tspan
sodipodi:role="line"
id="tspan1202"
x="30.43325"
y="289.26395"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans';-inkscape-font-specification:'Noto Sans';fill:#4d4d4d;fill-opacity:1;stroke-width:0.50737071">QV2ray</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:20.68452454px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.51711321"
x="16.455324"
y="304.12708"
id="text1204-7"><tspan
sodipodi:role="line"
id="tspan1202-5"
x="16.455324"
y="304.12708"
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:7.58432627px;font-family:'Noto Sans CJK SC';-inkscape-font-specification:'Noto Sans CJK SC Light';fill:#666666;stroke-width:0.51711321">The V2ray GUI client using Qt</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:20.68452454px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:0.51711321"
x="23.02709"
y="314.99207"
id="text1204-7-7"><tspan
sodipodi:role="line"
id="tspan1202-5-8"
x="23.02709"
y="314.99207"
style="font-style:normal;font-variant:normal;font-weight:100;font-stretch:normal;font-size:7.58432627px;font-family:'Noto Sans CJK SC';-inkscape-font-specification:'Noto Sans CJK SC Thin';fill:#b3b3b3;stroke-width:0.51711321">Windows / Linux / macOS</tspan></text>
<g
id="g963"
transform="matrix(2.3388721,0,0,2.3388721,-132.92101,-303.99427)">
<rect
ry="0.7291463"
y="227.81032"
x="77.2332"
height="15.313321"
width="15.31236"
id="rect4910-1-9"
style="fill:url(#linearGradient910);fill-opacity:1;stroke:none;stroke-width:0.30061451;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="0.72334439"
y="228.33411"
x="77.2332"
height="14.265224"
width="15.31236"
id="rect4910-2-2-3"
style="fill:url(#linearGradient883);fill-opacity:1;stroke:none;stroke-width:0.11887714;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
clip-path="none"
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="path1020-6"
d="m 79.575775,232.41128 2.548685,2.55917 1.415936,0.56615 6.796493,6.82436 2.181544,0.003 -0.003,-7.76179 -2.461662,-2.47482 -4.814184,-1.42176 -5.09737,0.85304 z"
style="opacity:0.65;fill:url(#linearGradient1028-3);fill-opacity:1;stroke:none;stroke-width:0.28376782px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<g
transform="matrix(1.0703139,0,0,1.0747072,78.159839,-76.82709)"
id="g889">
<path
sodipodi:nodetypes="cscccc"
inkscape:connector-curvature="0"
id="path879-7-0"
d="m 4.9266835,288.67208 c 0,0 -0.3728772,0.72708 -0.5817291,0.90212 -0.1467587,0.12299 -0.5403878,0.19489 -0.5403878,0.19489 l 0.7707172,0.2259 1.6743163,-0.39422 c 0,0 -0.7913874,-1.07043 -1.3229166,-0.92869 z"
style="fill:#27b181;fill-opacity:1;stroke:none;stroke-width:0.02480469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:#1cd28e;fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.1744977,288.92304 c 0,0 1.1173813,-2.75102 3.3019109,-0.59828 2.1845217,2.15274 3.6949274,5.47345 3.6949274,5.47345 0,0 -2.9944654,-4.26031 -6.9968383,-4.87517 z"
id="path4715-0-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscc" />
<path
style="fill:url(#linearGradient953-5);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 2.2426889,288.4487 c 0,0 -0.1508518,-2.94653 2.7747518,-1.81527 2.9256022,1.13127 6.6242253,4.28351 6.6242253,4.28351 0,0 -4.8112308,-3.07932 -9.3989771,-2.46824 z"
id="path4715-6-93-2"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient955-6);fill-opacity:1;stroke:none;stroke-width:0.08956835px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 1.3229167,287.74194 c 0,0 -1.322916666666666,-2.64583 1.9849644,-2.35592 3.1595803,0.27691 7.8046189,2.09134 7.8046189,2.09134 0,0 -5.6043102,-1.52438 -9.7895833,0.26458 z"
id="path4715-6-9-6-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscc" />
</g>
<path
sodipodi:nodetypes="cccccccccccc"
inkscape:connector-curvature="0"
id="path966-1"
d="m 79.57703,239.23312 2.831873,3.12785 h 7.92924 l -6.796492,-6.82437 -1.241908,-0.33859 0.9744,0.97838 v 2.7557 l -0.701746,0.70463 -0.711696,0.41257 h -1.1343 l -0.833445,-0.83686 z"
style="opacity:0.75;fill:url(#linearGradient984-1);fill-opacity:1;stroke:none;stroke-width:0.28376782px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<g
transform="matrix(0.28077666,0,0,0.27661773,56.412455,228.61984)"
id="g4906-0-8">
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.37232864;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 88.130575,21.09953 c -3.676948,0 -6.637387,3.445469 -6.637387,7.725603 v 5.832396 c 0,4.280138 2.960439,7.726498 6.637387,7.726498 h 2.86259 c 3.676954,0 6.637391,-3.44636 6.637391,-7.726498 v -5.832396 c 0,-4.280134 -2.960437,-7.725603 -6.637391,-7.725603 z m 0.605754,3.016265 h 1.642152 c 2.108144,0 3.805171,1.877318 3.805171,4.20901 v 6.975112 c 0,2.331691 -1.697027,4.209009 -3.805171,4.209009 h -1.642152 c -2.108142,0 -3.805174,-1.877318 -3.805174,-4.209009 v -6.975112 c 0,-2.331692 1.697032,-4.20901 3.805174,-4.20901 z"
id="rect4871-6-7"
inkscape:connector-curvature="0" />
<rect
style="fill:#3bdc66;fill-opacity:1;stroke:none;stroke-width:1.4067868;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4892-2-9"
width="5.1124744"
height="3.841737"
x="82.512436"
y="-58.410168"
rx="0"
ry="0"
transform="matrix(0.54136549,0.84078737,-0.85710765,0.51513734,0,0)" />
</g>
<rect
ry="1.0861129"
y="235.29361"
x="80.268135"
height="4.2367373"
width="2.6013789"
id="rect968-2"
style="opacity:0.5;fill:url(#linearGradient976-2);fill-opacity:1;stroke:none;stroke-width:0.85130346;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<text
transform="scale(0.99392474,1.0061124)"
id="text877"
y="238.31897"
x="84.891068"
style="font-style:normal;font-weight:normal;font-size:2.44444966px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.06111126"
xml:space="preserve"><tspan
style="fill:#ffffff;fill-opacity:1;stroke-width:0.06111126"
y="238.31897"
x="84.891068"
id="tspan875"
sodipodi:role="line">V2ray</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,85 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg68"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="edit_connection_btn.svg">
<defs
id="defs62" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.16"
inkscape:cx="-1959.3444"
inkscape:cy="-96.386561"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1050"
inkscape:window-x="1920"
inkscape:window-y="30"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true" />
<metadata
id="metadata65">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g151"
transform="matrix(0.77998462,0.45032433,-0.4818899,0.83465778,88.833102,-18.057022)"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<path
inkscape:connector-curvature="0"
d="m 109.71346,185.45443 16.6138,18.51253 -16.6138,18.51253 -16.613804,-18.51253 z M 93.099655,112.60424 h 33.309325 v 91.36272 H 93.099657 Z"
style="fill:#808080;stroke-width:0.22257984"
id="rect24" />
<rect
y="88.811867"
x="93.099655"
height="11.896188"
width="33.309326"
id="rect33"
style="fill:#808080;stroke-width:0.33672053" />
</g>
<rect
style="fill:#808080;stroke-width:0.29884946"
id="rect39"
width="132.29167"
height="10.583333"
x="37.750366"
y="219.70386"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -1,74 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="import_connection_btn.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.78038721"
inkscape:cx="175.16557"
inkscape:cy="540.28184"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1050"
inkscape:window-x="1920"
inkscape:window-y="30"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="rect38"
style="fill:#808080;stroke-width:0.26458332"
d="M 106.7982,81.639253 66.522106,121.91483 H 147.07378 Z M 91.79793,121.91507 h 30 v 67.94371 h -30 z"
inkscape:connector-curvature="0"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
<rect
style="fill:#808080;stroke-width:0.29884946"
id="rect39-3"
width="132.29167"
height="10.583333"
x="40.652103"
y="203.34738"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="459px" height="459px" viewBox="0 0 459 459" style="enable-background:new 0 0 459 459;" xml:space="preserve">
<g>
<g id="swap-vert">
<path fill="#808080" d="M331.5,357V178.5h-51V357H204l102,102l102-102H331.5z M153,0L51,102h76.5v178.5h51V102H255L153,0z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 658 B

4
icons/Qv2ray.desktop → icons/qv2ray.desktop Executable file → Normal file
View File

@ -2,7 +2,7 @@
Type=Application
Keywords=Internet;VPN;Proxy;v2ray;Qt;
Categories=Network;Qt;
Icon=Qv2ray
Exec=Qv2ray
Icon=qv2ray
Exec=qv2ray
Name=Qv2ray
Comment=Cross platform v2ray Qt GUI Client.

BIN
icons/qv2ray.icns Normal file

Binary file not shown.

BIN
icons/qv2ray.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
icons/qv2ray.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,103 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="remove_connection_btn.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.78038721"
inkscape:cx="319.47995"
inkscape:cy="722.22587"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1050"
inkscape:window-x="0"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true">
<sodipodi:guide
position="131.95044,215.36075"
orientation="0,1"
id="guide11"
inkscape:locked="false" />
<sodipodi:guide
position="70.590597,83.065066"
orientation="0,1"
id="guide13"
inkscape:locked="false" />
<sodipodi:guide
position="38.854164,198.30448"
orientation="1,0"
id="guide15"
inkscape:locked="false" />
<sodipodi:guide
position="171.14584,198.30448"
orientation="1,0"
id="guide17"
inkscape:locked="false" />
<sodipodi:guide
position="131.95044,199.48575"
orientation="0,1"
id="guide86"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:#ff5555;stroke-width:0.32981005"
d="m 54.174686,120.78453 v 93.15021 H 155.82533 v -93.15021 z m 14.650783,15.23548 h 13.229166 v 62.67925 H 68.825469 Z m 30.427083,0 h 13.229168 v 62.67925 H 99.252552 Z m 30.427598,0 h 13.22917 v 62.67925 h -13.22917 z"
id="rect9"
inkscape:connector-curvature="0"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
<path
id="rect39-3-3"
style="fill:#ff5555;stroke-width:0.23363064"
d="m 78.049561,81.639252 h 53.900889 v 15.875 H 78.049561 Z m -39.195389,15.875 H 171.14584 V 113.38925 H 38.854172 Z"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

BIN
icons/ui_dark/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

BIN
icons/ui_dark/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

View File

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="add.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/add_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="-6.067921"
inkscape:cy="6.3620808"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)"
style="opacity:1">
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 24.145831,229.70159 v 1.05834 h -1.058334 v 1.05833 h 1.058334 v 1.05833 h 1.058333 v -1.05833 h 1.058333 v -1.05833 h -1.058333 v -1.05834 h -0.264583 z m 0.264583,0.26459 h 0.529167 v 1.05833 h 1.058333 v 0.52917 h -1.058333 v 1.05833 h -0.529167 v -1.05833 h -1.058333 v -0.52917 h 1.058333 z"
id="path830"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159"
width="2.6458333"
height="0.26458332"
x="20.972286"
y="228.64551" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1"
width="2.6458333"
height="0.26458332"
x="20.972509"
y="229.71312" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 15 20 L 8 20 L 8 21 L 15 21 L 15 20 z "
id="path839"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 9.5859375 4 L 3.9960938 9.5898438 L 4 10 L 4 25 L 15 25 L 15 24 L 5 24 L 5 10 L 10 10 L 10 5 L 20 5 L 20 15 L 21 15 L 21 4 L 10 4 L 9.5859375 4 z M 9 6 L 9 9 L 6 9 L 9 6 z "
id="path1214"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="delete.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/remove_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568543"
inkscape:cx="-71.005696"
inkscape:cy="8.8646449"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.058,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
<sodipodi:guide
position="0,7.408"
orientation="0,1"
id="guide826"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
<sodipodi:guide
position="1.3229167,1.058"
orientation="0,1"
id="guide830"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
<sodipodi:guide
position="7.408,7.4083334"
orientation="1,0"
id="guide869"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<path
style="fill:#e6e6e6;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 20.970831,228.64326 v 3.96875 h 4.233333 v -3.96875 h 0.264583 v 4.23333 h -4.7625 v -4.23333 z"
id="path835"
inkscape:connector-curvature="0" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.76458,229.17243 v 2.91041 h 0.264584 v -2.91041 z"
id="path837"
inkscape:connector-curvature="0" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 22.955205,229.17243 v 2.91041 h 0.264584 v -2.91041 z"
id="path837-3"
inkscape:connector-curvature="0" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 24.145831,229.17243 v 2.91041 h 0.264584 v -2.91041 z"
id="path837-3-6"
inkscape:connector-curvature="0" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.76458,226.52693 v 0.79341 h 0.264584 v -0.52916 h 2.116666 v 0.52916 h 0.264584 v -0.79375 z"
id="path871"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 4 7 L 4 12 L 27.998047 12 L 27.998047 7 L 4 7 z M 5 8 L 27 8 L 27 11 L 5 11 L 5 8 z "
id="rect881"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="duplicate.svg"
inkscape:export-filename="/home/axionl/Desktop/Qv2ray_Design/duplicate_connection_btn.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568542"
inkscape:cx="-15.536765"
inkscape:cy="26.519006"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159"
width="2.6458333"
height="0.26458332"
x="22.559788"
y="229.43913" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1"
width="2.6458333"
height="0.26458332"
x="22.560011"
y="230.50674" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-9"
width="2.6458333"
height="0.26458332"
x="22.558331"
y="231.55368" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-4"
width="0.26458308"
height="0.26457855"
x="20.970831"
y="228.64326"
ry="0" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-7"
width="0.26435992"
height="0.25530019"
x="20.971054"
y="229.71088" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-9-8"
width="0.2660403"
height="0.2666975"
x="20.969374"
y="230.75781" />
<path
id="path1214"
style="fill:#e6e6e6;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 21.764581,228.90784 h 1.322916 v -1.32291 l -0.264583,0.26458 v 0.79375 h -0.79375 z m -0.265642,-0.10855 1.479049,-1.47905 0.109509,10e-5 v 0.26459 l -1.322916,1.32291 h -0.264584 z m 4.498975,4.0773 v -5.55625 h -2.910417 v 0.26459 h 2.645834 v 5.02708 z m -0.264583,-0.26458 h -3.96875 v -3.70417 h -0.264584 v 3.96875 h 4.497917 z" />
<path
id="path1214-4"
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 20.177081,228.11409 h 1.322916 v -1.32291 l -0.264583,0.26458 v 0.79375 h -0.79375 z m -0.265642,-0.10855 1.479049,-1.47905 0.109509,1e-4 v 0.26459 l -1.322916,1.32291 h -0.264584 z m 4.498975,-0.94978 v -0.52917 h -2.910417 v 0.26459 h 2.645834 v 0.26458 z m -3.175,4.7625 h -1.058333 v -3.70417 h -0.264584 v 3.96875 h 1.322917 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,213 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="edit.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/edit_connection_btn.png"
inkscape:export-xdpi="192"
inkscape:export-ydpi="192">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.627417"
inkscape:cx="5.0653219"
inkscape:cy="19.649966"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="3.703984,3.4395567"
orientation="0,1"
id="guide833"
inkscape:locked="false" />
<sodipodi:guide
position="3.4587786,3.6265368"
orientation="1,0"
id="guide1021"
inkscape:locked="false" />
<sodipodi:guide
position="3.6459543,3.4395567"
orientation="1,0"
id="guide1023"
inkscape:locked="false" />
<sodipodi:guide
position="6.0108124,5.8043835"
orientation="1,0"
id="guide1033"
inkscape:locked="false" />
<sodipodi:guide
position="5.823721,5.9914767"
orientation="1,0"
id="guide1035"
inkscape:locked="false" />
<sodipodi:guide
position="5.823721,5.9914767"
orientation="0,1"
id="guide1037"
inkscape:locked="false" />
<sodipodi:guide
position="6.0108124,5.8043835"
orientation="0,1"
id="guide1039"
inkscape:locked="false" />
<sodipodi:guide
position="3.4587786,3.6265368"
orientation="0,1"
id="guide1041"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,5.2916667"
orientation="1,0"
id="guide1116"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<path
id="path944"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 25.343714,10.264687 -0.70702,-0.7070204 -7.599585,7.6005364 -2.886718,2.884766 H 12.003906 L 11.980469,17.970703 21.909591,8.0421546 24.0309,10.163462 24.636694,9.5576666 21.808273,6.7292423 10.990234,17.548828 l 0.0059,1.408203 0.0078,2.085938 3.552735,0.0078 1.007812,-1.007812 z" />
<path
id="path842-6"
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 24.537109,4 -2.123047,2.1230469 0.707032,0.7070312 2.121094,2.1210938 0.707338,-0.7063383 -2.121306,-2.1213082 0.706936,-0.7075098 2.121094,2.1210938 -1.414062,1.4140625 0.707031,0.7070312 2.121093,-2.1210937 z"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="fill:#e6e6e6;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 22.312943,230.30839 v 0.18698 h 0.187175 l 2.364858,-2.36483 -0.187091,-0.18709 z"
id="path1029"
inkscape:connector-curvature="0" />
<path
style="fill:#e6e6e6;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0"
d="m 22.312943,230.30839 v 0.18698 h 0.18698 l 2.365051,-2.36483 -0.187089,-0.18709 z"
id="path1031"
inkscape:connector-curvature="0" />
<path
style="fill:#e6e6e6;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 22.312943,230.30839 v 0.18698 h 0.187175 l 2.364855,-2.36483 -0.187088,-0.18709 z"
id="path1043"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 12 15 L 8 15 L 8 16 L 11 16 L 12 15 z "
id="path925"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 17,20.035156 h 1 v -1.035055 z"
id="path960"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 10,19.035156 8,19 v 1.035156 h 2 z"
id="path958"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-9"
width="2.6458333"
height="0.26458332"
x="20.969374"
y="231.55156" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 20,7 H 10 9.5859375 L 3.9960938,12.589844 4,13 V 28 H 21 V 16 l -1,1 V 27 H 5 V 13 h 5 V 8 h 9 z M 9,9 v 3 H 6 Z"
id="path838"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="import.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/import_connection_btn.png"
inkscape:export-xdpi="191.99707"
inkscape:export-ydpi="191.99707">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="8.271398"
inkscape:cy="16.201975"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<g
id="g832"
transform="translate(-0.66092917,-0.79374667)"
style="fill:#e6e6e6">
<rect
y="229.43913"
x="22.559788"
height="0.26458332"
width="2.6458333"
id="rect1159"
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="230.50674"
x="22.560011"
height="0.26458332"
width="2.6458333"
id="rect1159-1"
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="231.55368"
x="22.558331"
height="0.26458332"
width="2.6458333"
id="rect1159-1-9"
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m 21.764581,228.90784 h 1.322916 v -1.32291 l -0.264583,0.26458 v 0.79375 h -0.79375 z m -0.265642,-0.10855 1.479049,-1.47905 0.109509,10e-5 v 0.26459 l -1.322916,1.32291 h -0.264584 z m 4.498975,4.0773 v -5.55625 h -2.910417 v 0.26459 h 2.645834 v 5.02708 z m -0.264583,-0.26458 h -3.96875 v -3.70417 h -0.264584 v 3.96875 h 4.497917 z"
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path1214"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:#e6e6e6;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 19.912497,231.28909 h 0.529167 v 0.26459 h -0.264583 v 1.05833 h 5.820833 v -1.05833 h -0.264583 v -0.26459 h 0.529166 v 1.5875 h -6.35 z"
id="path834"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="json.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/add_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="20.318725"
inkscape:cx="-1.4115197"
inkscape:cy="9.6750041"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="false"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="3.175,7.1437467"
orientation="0,1"
id="guide840"
inkscape:locked="false" />
<sodipodi:guide
position="2.1166665,5.8189079"
orientation="0,1"
id="guide842"
inkscape:locked="false" />
<sodipodi:guide
position="2.6458333,3.175"
orientation="0,1"
id="guide1086"
inkscape:locked="false" />
<sodipodi:guide
position="2.6458333,3.4395833"
orientation="0,1"
id="guide1088"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)"
style="opacity:1">
<g
id="g1116"
style="fill:#e6e6e6">
<path
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path1214-6"
d="M 9.5898438 4 L 4 9.5898438 L 4.0039062 10 L 4.0039062 25 L 11 25 L 11 24 L 5.0039062 24 L 5.0039062 10 L 10.003906 10 L 10.003906 5 L 20.003906 5 L 20.003906 10.007812 L 21.003906 10.007812 L 21.003906 4 L 10.003906 4 L 9.5898438 4 z M 9.0039062 6 L 9.0039062 9 L 6.0039062 9 L 9.0039062 6 z "
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1032"
d="m 22.822914,228.37868 a 0.79374999,0.79374999 0 0 0 -0.79375,0.79375 v 0.79375 a 0.52916663,0.52916663 0 0 1 -0.529167,0.52916 v 0.26459 a 0.52916663,0.52916663 0 0 1 0.529167,0.52916 v 0.79375 a 0.79374999,0.79374999 0 0 0 0.79375,0.79375 v -0.26458 a 0.52916663,0.52916663 0 0 1 -0.529167,-0.52917 v -0.79375 a 0.79374999,0.79374999 0 0 0 -0.35605,-0.66145 0.79374999,0.79374999 0 0 0 0.35605,-0.66146 v -0.79375 a 0.52916663,0.52916663 0 0 1 0.529167,-0.52917 z"
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path1032-1"
d="m 24.93958,228.37867 a 0.79375,0.79375 0 0 1 0.79375,0.79375 v 0.79375 a 0.52916664,0.52916664 0 0 0 0.529167,0.52917 v 0.26458 a 0.52916664,0.52916664 0 0 0 -0.529167,0.52917 v 0.79375 a 0.79375,0.79375 0 0 1 -0.79375,0.79375 V 232.612 a 0.52916664,0.52916664 0 0 0 0.529167,-0.52916 v -0.79375 a 0.79375,0.79375 0 0 1 0.356051,-0.66146 0.79375,0.79375 0 0 1 -0.356051,-0.66146 v -0.79375 a 0.52916664,0.52916664 0 0 0 -0.529167,-0.52917 z"
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
inkscape:connector-curvature="0" />
<g
id="g1108"
style="fill:#e6e6e6">
<circle
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1067"
cx="23.881247"
cy="229.96617"
r="0.26458332" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 19 21 A 0.99999994 0.99999994 0 0 0 18 22 A 0.99999994 0.99999994 0 0 0 18.722656 22.958984 C 18.426399 23.545698 18 24 18 24 C 18 24 19.261784 23.422924 19.775391 22.630859 A 0.99999994 0.99999994 0 0 0 19.914062 22.402344 A 0.99999994 0.99999994 0 0 0 20 22 A 0.99999994 0.99999994 0 0 0 19 21 z "
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path1067-2" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="netspeed_arrow.svg"
inkscape:export-filename="/home/axionl/Desktop/Qv2ray_Design/duplicate_connection_btn.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="9.4046517"
inkscape:cy="5.7825006"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,6.6145834"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="3.0380535,7.4083327"
orientation="1,0"
id="guide859"
inkscape:locked="false" />
<sodipodi:guide
position="1.4336343,5.2927882"
orientation="0,1"
id="guide864"
inkscape:locked="false" />
<sodipodi:guide
position="4.6517755,5.2927883"
orientation="1,0"
id="guide890"
inkscape:locked="false" />
<sodipodi:guide
position="2.504455,5.5525067"
orientation="0,1"
id="guide944"
inkscape:locked="false" />
<sodipodi:guide
position="4.4979167,6.0854167"
orientation="1,0"
id="guide967"
inkscape:locked="false" />
<sodipodi:guide
position="3.96875,3.175"
orientation="1,0"
id="guide969"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 13.582031 19 L 14.582031 19 L 14.582031 11.996094 L 16 11.996094 L 16 11.013672 L 13.582031 11.013672 L 13.582031 19 z "
id="path1005"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 12.064453,4 4,11.996094 H 9.5820312 V 25 L 14,25 V 24 H 10.582031 V 11.013672 L 6.4648438,11.011719 12.064453,5.4140625 16,9.3496094 V 7.9355469 Z"
id="path842"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccc" />
<path
id="path842-6"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 17.519531,6.9980469 V 20.001953 H 15 v 0.982422 h 3.519531 V 7.9980469 h 3 V 20.984375 h 4.082031 L 20.001953,26.583984 15,21.580078 v 1.458984 l 5.001953,4.958985 7.996094,-7.996094 H 22.519531 V 6.9980469 Z M 15,23.039062 V 21.580078 L 14.404297,20.984375 H 15 v -0.982422 h -3.0625 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="ping_gauge.svg"
inkscape:export-filename="/home/axionl/Desktop/Qv2ray_Design/duplicate_connection_btn.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="-3.8227905"
inkscape:cy="5.4884252"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="false"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,6.6145834"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="4.2333333,0.79375"
orientation="1,0"
id="guide862"
inkscape:locked="false" />
<sodipodi:guide
position="1.058333,4.2333126"
orientation="0,1"
id="guide896"
inkscape:locked="false" />
<sodipodi:guide
position="5.4787523,1.9843804"
orientation="0,1"
id="guide1290"
inkscape:locked="false" />
<sodipodi:guide
position="5.4787523,1.719793"
orientation="0,1"
id="guide1292"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<circle
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1148"
cx="23.087498"
cy="229.7016"
r="0.26458338" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.25420347px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 23.087497,229.51453 2.245078,-2.24507 0.187089,0.18709 -2.245064,2.24506 z"
id="path1150"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1222"
width="0.26458332"
height="0.26458332"
x="-147.91432"
y="179.55203"
transform="rotate(-45)" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.499997,231.95055 0.474373,0 0.583961,-0.58396 1.05833,1.05833 0.474377,-0.47437 h 0.588094 v 0.26458 h -0.478511 l -0.583962,0.58397 -1.058328,-1.05833 -0.474368,0.47436 h -0.582932 z"
id="path1298"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccc" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 16 4 A 11.999921 11.999921 0 0 0 4 16 A 11.999921 11.999921 0 0 0 7.5195312 24.480469 L 11.052734 21.267578 L 11.759766 20.560547 A 5.9999984 5.9999984 0 0 1 10 16.320312 A 5.9999984 5.9999984 0 0 1 16 10.320312 A 5.9999984 5.9999984 0 0 1 18.841797 11.037109 L 19.570312 10.308594 A 6.9999998 6.9999998 0 0 0 16 9.3203125 A 6.9999998 6.9999998 0 0 0 9 16.320312 A 6.9999998 6.9999998 0 0 0 10.375 20.46875 L 7.5566406 23.033203 A 10.999999 10.999999 0 0 1 5 16 A 10.999999 10.999999 0 0 1 16 5 A 10.999999 10.999999 0 0 1 22.634766 7.2421875 L 23.353516 6.5234375 A 11.999921 11.999921 0 0 0 16 4 z "
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path951" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 20.427734 12.279297 L 21.132812 11.574219 A 6.9999999 6.9999999 0 0 0 20.408203 10.884766 L 19.693359 11.599609 A 5.9999985 5.9999985 0 0 1 20.427734 12.279297 z "
id="path947"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 25.46875 8.6523438 L 24.759766 9.3632812 A 10.999999 10.999999 0 0 1 27 16 A 10.999999 10.999999 0 0 1 24.445312 23.033203 L 21.623047 20.46875 A 6.9999998 6.9999998 0 0 0 23 16.320312 A 6.9999998 6.9999998 0 0 0 21.767578 12.353516 L 21.046875 13.076172 A 5.9999984 5.9999984 0 0 1 22 16.320312 A 5.9999984 5.9999984 0 0 1 20.240234 20.560547 L 20.947266 21.267578 L 24.480469 24.480469 A 11.999921 11.999921 0 0 0 28 16 A 11.999921 11.999921 0 0 0 25.46875 8.6523438 z "
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path943" />
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 24.115234 7.1777344 L 23.408203 7.8847656 A 10.999999 10.999999 0 0 1 24.117188 8.5917969 L 24.822266 7.8867188 A 11.999921 11.999921 0 0 0 24.115234 7.1777344 z "
id="path937"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="share.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/add_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="12.190575"
inkscape:cy="12.106514"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="true"
inkscape:bbox-paths="false"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="false">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="2.1166665,5.8189079"
orientation="0,1"
id="guide842"
inkscape:locked="false" />
<sodipodi:guide
position="4.4368395,3.1750017"
orientation="1,0"
id="guide961"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)"
style="opacity:1">
<path
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.07559059;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 20,13.292969 V 14.707031 18 l -3.230469,0 h -2.683593 c -1.598676,0.07502 -2.856968,1.391754 -2.859376,2.992188 V 21 28 h 4.566407 V 27 23 L 20,23 v 3.292969 1.414062 l 1,-1 5.5,-5.5 L 27.207031,20.5 26.5,19.792969 l -5.5,-5.5 z M 21,15.707031 25.792969,20.5 21,25.292969 V 22 l -5.207031,0 -0.02344,-2 v -0.002 c -3.54e-4,-0.03325 9.5e-4,-0.06649 0.0039,-0.09961 0.0035,-0.03345 0.0087,-0.06669 0.01562,-0.09961 0.0069,-0.0323 0.01535,-0.06424 0.02539,-0.0957 0.0095,-0.03178 0.02059,-0.06307 0.0332,-0.09375 0.01346,-0.03068 0.02845,-0.06067 0.04492,-0.08984 0.01549,-0.02947 0.03243,-0.05815 0.05078,-0.08594 0.01883,-0.02769 0.03904,-0.05442 0.06055,-0.08008 0.02157,-0.02521 0.04439,-0.04933 0.06836,-0.07227 0.02426,-0.02341 0.04968,-0.04557 0.07617,-0.06641 0.02571,-0.02084 0.05243,-0.0404 0.08008,-0.05859 0.02846,-0.01774 0.05779,-0.03404 0.08789,-0.04883 0.02925,-0.01514 0.05924,-0.02883 0.08984,-0.04102 0.03136,-0.01202 0.0633,-0.02245 0.0957,-0.03125 0.03217,-0.0088 0.06477,-0.01596 0.09766,-0.02148 0.03299,-0.0056 0.06623,-0.0095 0.09961,-0.01172 0.02341,-0.0015 0.04686,-0.0021 0.07031,-0.002 L 21,19 Z M 14.085938,19 h 0.955078 c -0.176442,0.303122 -0.270068,0.647315 -0.271485,0.998047 V 20 l 0.02344,2 v 5 h -2.566407 v -6 -0.0059 c -5.6e-5,-0.06653 0.0032,-0.133016 0.0098,-0.199219 0.0065,-0.0662 0.01626,-0.132039 0.0293,-0.197266 0.01363,-0.06592 0.03058,-0.131104 0.05078,-0.195312 0.01965,-0.0636 0.04247,-0.126177 0.06836,-0.1875 0.02564,-0.06129 0.05432,-0.121256 0.08594,-0.179688 0.0323,-0.05836 0.0675,-0.115076 0.105469,-0.169922 0.0376,-0.05605 0.07802,-0.11015 0.121094,-0.162109 0.0431,-0.05108 0.08873,-0.09997 0.136718,-0.146484 0.04729,-0.04604 0.09683,-0.08972 0.148438,-0.13086 0.05268,-0.0418 0.107439,-0.08091 0.164062,-0.117187 0.05624,-0.03609 0.114262,-0.06933 0.173828,-0.09961 0.05918,-0.02968 0.119806,-0.05641 0.181641,-0.08008 0.06204,-0.02463 0.125266,-0.04614 0.189453,-0.06445 0.06435,-0.01757 0.129533,-0.03191 0.195313,-0.04297 0.06601,-0.01048 0.132495,-0.01766 0.199219,-0.02148 z"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path966"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
<path
inkscape:connector-curvature="0"
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.391477,226.52659 -1.47898,1.47898 0.001,0.10852 v 3.96875 h 1.5865 v -0.26458 H 20.17808 v -3.70417 h 1.322917 v -1.32291 h 2.645833 v 1.85208 h 0.264583 v -2.11667 h -2.910416 z m -0.15503,0.52917 v 0.79375 h -0.79375 z"
id="path1214-6"
sodipodi:nodetypes="cccccccccccccccccccc" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect846"
width="2.9104166"
height="0.26458332"
x="20.706247"
y="228.64326" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect846-3"
width="2.9104166"
height="0.26458332"
x="20.706247"
y="229.43701" />
<rect
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect846-3-6"
width="1.0583333"
height="0.2645874"
x="20.706247"
y="230.23076" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="22"
height="22"
viewBox="0 0 5.8208333 5.8208333"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="Qv2ray_System_Tray_Light.svg"
inkscape:export-filename="/home/axionl/Desktop/Qv2ray_Design/qv2ray.png"
inkscape:export-xdpi="558.54999"
inkscape:export-ydpi="558.54999">
<defs
id="defs2">
<linearGradient
id="linearGradient841"
osb:paint="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop839" />
</linearGradient>
<linearGradient
id="linearGradient5057"
inkscape:collect="always">
<stop
id="stop5053"
offset="0"
style="stop-color:#3c3c3c;stop-opacity:1;" />
<stop
id="stop5055"
offset="1"
style="stop-color:#282728;stop-opacity:0.6574803" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4713">
<stop
style="stop-color:#3de256;stop-opacity:1"
offset="0"
id="stop4709" />
<stop
style="stop-color:#2fbeba;stop-opacity:1"
offset="1"
id="stop4711" />
</linearGradient>
<linearGradient
gradientTransform="translate(38.574145,1.3181723)"
gradientUnits="userSpaceOnUse"
y2="39.934193"
x2="108.00179"
y1="19.458199"
x1="89.965836"
id="linearGradient4707"
xlink:href="#linearGradient4713"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="94.022179"
x2="140.26065"
y1="48.940449"
x1="92.227142"
id="linearGradient5059"
xlink:href="#linearGradient5057"
inkscape:collect="always" />
<clipPath
id="clipPath922"
clipPathUnits="userSpaceOnUse">
<rect
ry="1.0638391"
y="284.56458"
x="9.5367426e-08"
height="12.170834"
width="12.7"
id="rect924"
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625" />
</clipPath>
<clipPath
id="clipPath922-6"
clipPathUnits="userSpaceOnUse">
<rect
ry="1.0638391"
y="284.56458"
x="9.5367426e-08"
height="12.170834"
width="12.7"
id="rect924-2"
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625" />
</clipPath>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter1510">
<feFlood
flood-opacity="0.976471"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood1500" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1502" />
<feGaussianBlur
in="composite1"
stdDeviation="0.1"
result="blur"
id="feGaussianBlur1504" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset1506" />
<feComposite
in="offset"
in2="SourceGraphic"
operator="out"
result="composite2"
id="feComposite1508" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter1859">
<feFlood
flood-opacity="0.266667"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood1849" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1851" />
<feGaussianBlur
in="composite1"
stdDeviation="0.2"
result="blur"
id="feGaussianBlur1853" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset1855" />
<feComposite
in="offset"
in2="SourceGraphic"
operator="out"
result="composite2"
id="feComposite1857" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.627417"
inkscape:cx="5.9585184"
inkscape:cy="11.144438"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-bottom="5"
fit-margin-right="5"
inkscape:snap-global="true"
inkscape:object-paths="false"
inkscape:snap-intersection-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-grids="false"
inkscape:snap-object-midpoints="true"
showguides="true"
inkscape:guide-bbox="true"
scale-x="1"
guidecolor="#00ffff"
guideopacity="0.49803922"
guidehicolor="#ff5184"
guidehiopacity="0.62745098"
inkscape:snap-nodes="true"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid815"
originx="0"
originy="0"
color="#3f513e"
opacity="0.04313725"
empcolor="#3f3742"
empopacity="0.16470588"
empspacing="5"
dotted="false" />
<sodipodi:guide
position="28.284675,2.8909227"
orientation="1,0"
id="guide924"
inkscape:locked="false" />
<sodipodi:guide
position="26.141,6.3542733"
orientation="1,0"
id="guide932"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,255,236)" />
<sodipodi:guide
position="0.79375,4.4979166"
orientation="1,0"
id="guide1884"
inkscape:locked="false" />
<sodipodi:guide
position="3.96875,5.0270833"
orientation="0,1"
id="guide1886"
inkscape:locked="false" />
<sodipodi:guide
position="5.0270833,0.26458333"
orientation="1,0"
id="guide1888"
inkscape:locked="false" />
<sodipodi:guide
position="4.4979166,0.79375"
orientation="0,1"
id="guide1890"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-1.9173392,-290.74464)">
<path
id="path1962"
transform="matrix(0.26458333,0,0,0.26458333,1.9173392,290.74464)"
style="fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 7,11 6.2929688,11.707031 8.5859375,14 H 18 V 13 H 9 Z M 6.2929688,11.707031 5,13 H 4 v 1 H 5.4140625 L 7,12.414062 Z M 3,3 V 18.999988 H 19 V 3 Z M 3.9999999,3.9999875 H 18 V 18 H 3.9999999 Z" />
<rect
style="opacity:0.5;fill:none;fill-opacity:1;stroke:none;stroke-width:0.04583338;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect844"
width="5.8208332"
height="5.8208447"
x="1.9173392"
y="290.74463"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64" />
<path
style="fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.5631726,292.06756 -0.2645834,0.26459 v 0.52916 l 0.2645834,-0.26458 v 0.26458 0.52917 l 0.5291666,0.79375 0.5291667,1.32291 v -0.79374 l 0.2645833,-0.26459 -0.2645833,-0.52916 v -0.79375 l -0.2645833,-0.52917 z"
id="path1934"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
icons/ui_dark/duplicate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
icons/ui_dark/edit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
icons/ui_dark/import.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

BIN
icons/ui_dark/json.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
icons/ui_dark/share.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
icons/ui_dark/tray.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
icons/ui_light/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

BIN
icons/ui_light/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

View File

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="add_connection_btn.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/add_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="12.167264"
inkscape:cy="15.865066"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="474"
inkscape:window-height="388"
inkscape:window-x="901"
inkscape:window-y="663"
inkscape:window-maximized="0"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)"
style="opacity:1">
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 24.145831,229.70159 v 1.05834 h -1.058334 v 1.05833 h 1.058334 v 1.05833 h 1.058333 v -1.05833 h 1.058333 v -1.05833 h -1.058333 v -1.05834 h -0.264583 z m 0.264583,0.26459 h 0.529167 v 1.05833 h 1.058333 v 0.52917 h -1.058333 v 1.05833 h -0.529167 v -1.05833 h -1.058333 v -0.52917 h 1.058333 z"
id="path830"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159"
width="2.6458333"
height="0.26458332"
x="20.972286"
y="228.64551" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1"
width="2.6458333"
height="0.26458332"
x="20.972509"
y="229.71312" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 15 20 L 8 20 L 8 21 L 15 21 L 15 20 z "
id="path839"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 9.5859375 4 L 3.9960938 9.5898438 L 4 10 L 4 25 L 15 25 L 15 24 L 5 24 L 5 10 L 10 10 L 10 5 L 20 5 L 20 15 L 21 15 L 21 4 L 10 4 L 9.5859375 4 z M 9 6 L 9 9 L 6 9 L 9 6 z "
id="path1214"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="remove_connection_btn.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/remove_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568543"
inkscape:cx="-7.7196395"
inkscape:cy="8.8646449"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.058,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
<sodipodi:guide
position="0,7.408"
orientation="0,1"
id="guide826"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
<sodipodi:guide
position="1.3229167,1.058"
orientation="0,1"
id="guide830"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
<sodipodi:guide
position="7.408,7.4083334"
orientation="1,0"
id="guide869"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,220,255)" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<path
style="fill:#31363b;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 20.970831,228.64326 v 3.96875 h 4.233333 v -3.96875 h 0.264583 v 4.23333 h -4.7625 v -4.23333 z"
id="path835"
inkscape:connector-curvature="0" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.76458,229.17243 v 2.91041 h 0.264584 v -2.91041 z"
id="path837"
inkscape:connector-curvature="0" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 22.955205,229.17243 v 2.91041 h 0.264584 v -2.91041 z"
id="path837-3"
inkscape:connector-curvature="0" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 24.145831,229.17243 v 2.91041 h 0.264584 v -2.91041 z"
id="path837-3-6"
inkscape:connector-curvature="0" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.76458,226.52693 v 0.79341 h 0.264584 v -0.52916 h 2.116666 v 0.52916 h 0.264584 v -0.79375 z"
id="path871"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 4 7 L 4 12 L 27.998047 12 L 27.998047 7 L 4 7 z M 5 8 L 27 8 L 27 11 L 5 11 L 5 8 z "
id="rect881"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="duplicate_connection_btn.svg"
inkscape:export-filename="/home/axionl/Desktop/Qv2ray_Design/duplicate_connection_btn.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568542"
inkscape:cx="16.106264"
inkscape:cy="26.519006"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159"
width="2.6458333"
height="0.26458332"
x="22.559788"
y="229.43913" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1"
width="2.6458333"
height="0.26458332"
x="22.560011"
y="230.50674" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-9"
width="2.6458333"
height="0.26458332"
x="22.558331"
y="231.55368" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-4"
width="0.26458308"
height="0.26457855"
x="20.970831"
y="228.64326"
ry="0" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-7"
width="0.26435992"
height="0.25530019"
x="20.971054"
y="229.71088" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-9-8"
width="0.2660403"
height="0.2666975"
x="20.969374"
y="230.75781" />
<path
id="path1214"
style="fill:#31363b;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 21.764581,228.90784 h 1.322916 v -1.32291 l -0.264583,0.26458 v 0.79375 h -0.79375 z m -0.265642,-0.10855 1.479049,-1.47905 0.109509,10e-5 v 0.26459 l -1.322916,1.32291 h -0.264584 z m 4.498975,4.0773 v -5.55625 h -2.910417 v 0.26459 h 2.645834 v 5.02708 z m -0.264583,-0.26458 h -3.96875 v -3.70417 h -0.264584 v 3.96875 h 4.497917 z" />
<path
id="path1214-4"
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 20.177081,228.11409 h 1.322916 v -1.32291 l -0.264583,0.26458 v 0.79375 h -0.79375 z m -0.265642,-0.10855 1.479049,-1.47905 0.109509,1e-4 v 0.26459 l -1.322916,1.32291 h -0.264584 z m 4.498975,-0.94978 v -0.52917 h -2.910417 v 0.26459 h 2.645834 v 0.26458 z m -3.175,4.7625 h -1.058333 v -3.70417 h -0.264584 v 3.96875 h 1.322917 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,213 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="edit_connection_btn.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/edit_connection_btn.png"
inkscape:export-xdpi="192"
inkscape:export-ydpi="192">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.627417"
inkscape:cx="12.976079"
inkscape:cy="19.649966"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="3.703984,3.4395567"
orientation="0,1"
id="guide833"
inkscape:locked="false" />
<sodipodi:guide
position="3.4587786,3.6265368"
orientation="1,0"
id="guide1021"
inkscape:locked="false" />
<sodipodi:guide
position="3.6459543,3.4395567"
orientation="1,0"
id="guide1023"
inkscape:locked="false" />
<sodipodi:guide
position="6.0108124,5.8043835"
orientation="1,0"
id="guide1033"
inkscape:locked="false" />
<sodipodi:guide
position="5.823721,5.9914767"
orientation="1,0"
id="guide1035"
inkscape:locked="false" />
<sodipodi:guide
position="5.823721,5.9914767"
orientation="0,1"
id="guide1037"
inkscape:locked="false" />
<sodipodi:guide
position="6.0108124,5.8043835"
orientation="0,1"
id="guide1039"
inkscape:locked="false" />
<sodipodi:guide
position="3.4587786,3.6265368"
orientation="0,1"
id="guide1041"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,5.2916667"
orientation="1,0"
id="guide1116"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<path
id="path944"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 25.343714,10.264687 -0.70702,-0.7070204 -7.599585,7.6005364 -2.886718,2.884766 H 12.003906 L 11.980469,17.970703 21.909591,8.0421546 24.0309,10.163462 24.636694,9.5576666 21.808273,6.7292423 10.990234,17.548828 l 0.0059,1.408203 0.0078,2.085938 3.552735,0.0078 1.007812,-1.007812 z" />
<path
id="path842-6"
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 24.537109,4 -2.123047,2.1230469 0.707032,0.7070312 2.121094,2.1210938 0.707338,-0.7063383 -2.121306,-2.1213082 0.706936,-0.7075098 2.121094,2.1210938 -1.414062,1.4140625 0.707031,0.7070312 2.121093,-2.1210937 z"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="fill:none;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 22.312943,230.30839 v 0.18698 h 0.187175 l 2.364858,-2.36483 -0.187091,-0.18709 z"
id="path1029"
inkscape:connector-curvature="0" />
<path
style="fill:#ea6de6;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0"
d="m 22.312943,230.30839 v 0.18698 h 0.18698 l 2.365051,-2.36483 -0.187089,-0.18709 z"
id="path1031"
inkscape:connector-curvature="0" />
<path
style="fill:#31363b;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 22.312943,230.30839 v 0.18698 h 0.187175 l 2.364855,-2.36483 -0.187088,-0.18709 z"
id="path1043"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 12 15 L 8 15 L 8 16 L 11 16 L 12 15 z "
id="path925"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 17,20.035156 h 1 v -1.035055 z"
id="path960"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 10,19.035156 8,19 v 1.035156 h 2 z"
id="path958"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1159-1-9"
width="2.6458333"
height="0.26458332"
x="20.969374"
y="231.55156" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 20,7 H 10 9.5859375 L 3.9960938,12.589844 4,13 V 28 H 21 V 16 l -1,1 V 27 H 5 V 13 h 5 V 8 h 9 z M 9,9 v 3 H 6 Z"
id="path838"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="import_connection_btn.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/import_connection_btn.png"
inkscape:export-xdpi="191.99707"
inkscape:export-ydpi="191.99707">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="13.865148"
inkscape:cy="16.201975"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<g
id="g832"
transform="translate(-0.66092917,-0.79374667)">
<rect
y="229.43913"
x="22.559788"
height="0.26458332"
width="2.6458333"
id="rect1159"
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="230.50674"
x="22.560011"
height="0.26458332"
width="2.6458333"
id="rect1159-1"
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="231.55368"
x="22.558331"
height="0.26458332"
width="2.6458333"
id="rect1159-1-9"
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m 21.764581,228.90784 h 1.322916 v -1.32291 l -0.264583,0.26458 v 0.79375 h -0.79375 z m -0.265642,-0.10855 1.479049,-1.47905 0.109509,10e-5 v 0.26459 l -1.322916,1.32291 h -0.264584 z m 4.498975,4.0773 v -5.55625 h -2.910417 v 0.26459 h 2.645834 v 5.02708 z m -0.264583,-0.26458 h -3.96875 v -3.70417 h -0.264584 v 3.96875 h 4.497917 z"
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path1214"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:#31363b;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 19.912497,231.28909 h 0.529167 v 0.26459 h -0.264583 v 1.05833 h 5.820833 v -1.05833 h -0.264583 v -0.26459 h 0.529166 v 1.5875 h -6.35 z"
id="path834"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="json_connectio_btn.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/add_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="20.318725"
inkscape:cx="7.3980882"
inkscape:cy="9.6750041"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="false"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="3.175,7.1437467"
orientation="0,1"
id="guide840"
inkscape:locked="false" />
<sodipodi:guide
position="2.1166665,5.8189079"
orientation="0,1"
id="guide842"
inkscape:locked="false" />
<sodipodi:guide
position="2.6458333,3.175"
orientation="0,1"
id="guide1086"
inkscape:locked="false" />
<sodipodi:guide
position="2.6458333,3.4395833"
orientation="0,1"
id="guide1088"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)"
style="opacity:1">
<g
id="g1116">
<path
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path1214-6"
d="M 9.5898438 4 L 4 9.5898438 L 4.0039062 10 L 4.0039062 25 L 11 25 L 11 24 L 5.0039062 24 L 5.0039062 10 L 10.003906 10 L 10.003906 5 L 20.003906 5 L 20.003906 10.007812 L 21.003906 10.007812 L 21.003906 4 L 10.003906 4 L 9.5898438 4 z M 9.0039062 6 L 9.0039062 9 L 6.0039062 9 L 9.0039062 6 z "
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1032"
d="m 22.822914,228.37868 a 0.79374999,0.79374999 0 0 0 -0.79375,0.79375 v 0.79375 a 0.52916663,0.52916663 0 0 1 -0.529167,0.52916 v 0.26459 a 0.52916663,0.52916663 0 0 1 0.529167,0.52916 v 0.79375 a 0.79374999,0.79374999 0 0 0 0.79375,0.79375 v -0.26458 a 0.52916663,0.52916663 0 0 1 -0.529167,-0.52917 v -0.79375 a 0.79374999,0.79374999 0 0 0 -0.35605,-0.66145 0.79374999,0.79374999 0 0 0 0.35605,-0.66146 v -0.79375 a 0.52916663,0.52916663 0 0 1 0.529167,-0.52917 z"
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path1032-1"
d="m 24.93958,228.37867 a 0.79375,0.79375 0 0 1 0.79375,0.79375 v 0.79375 a 0.52916664,0.52916664 0 0 0 0.529167,0.52917 v 0.26458 a 0.52916664,0.52916664 0 0 0 -0.529167,0.52917 v 0.79375 a 0.79375,0.79375 0 0 1 -0.79375,0.79375 V 232.612 a 0.52916664,0.52916664 0 0 0 0.529167,-0.52916 v -0.79375 a 0.79375,0.79375 0 0 1 0.356051,-0.66146 0.79375,0.79375 0 0 1 -0.356051,-0.66146 v -0.79375 a 0.52916664,0.52916664 0 0 0 -0.529167,-0.52917 z"
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
inkscape:connector-curvature="0" />
<g
id="g1108">
<circle
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1067"
cx="23.881247"
cy="229.96617"
r="0.26458332" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 19 21 A 0.99999994 0.99999994 0 0 0 18 22 A 0.99999994 0.99999994 0 0 0 18.722656 22.958984 C 18.426399 23.545698 18 24 18 24 C 18 24 19.261784 23.422924 19.775391 22.630859 A 0.99999994 0.99999994 0 0 0 19.914062 22.402344 A 0.99999994 0.99999994 0 0 0 20 22 A 0.99999994 0.99999994 0 0 0 19 21 z "
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path1067-2" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="netspeed-arrows.svg"
inkscape:export-filename="/home/axionl/Desktop/Qv2ray_Design/duplicate_connection_btn.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="45.254833"
inkscape:cx="12.163083"
inkscape:cy="11.227074"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,6.6145834"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="3.0380535,7.4083327"
orientation="1,0"
id="guide859"
inkscape:locked="false" />
<sodipodi:guide
position="1.4336343,5.2927882"
orientation="0,1"
id="guide864"
inkscape:locked="false" />
<sodipodi:guide
position="4.6517755,5.2927883"
orientation="1,0"
id="guide890"
inkscape:locked="false" />
<sodipodi:guide
position="2.504455,5.5525067"
orientation="0,1"
id="guide944"
inkscape:locked="false" />
<sodipodi:guide
position="4.4979167,6.0854167"
orientation="1,0"
id="guide967"
inkscape:locked="false" />
<sodipodi:guide
position="3.96875,3.175"
orientation="1,0"
id="guide969"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 13.582031 19 L 14.582031 19 L 14.582031 11.996094 L 16 11.996094 L 16 11.013672 L 13.582031 11.013672 L 13.582031 19 z "
id="path1005"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 12.064453,4 4,11.996094 H 9.5820312 V 25 L 14,25 V 24 H 10.582031 V 11.013672 L 6.4648438,11.011719 12.064453,5.4140625 16,9.3496094 V 7.9355469 Z"
id="path842"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccc" />
<path
id="path842-6"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 17.519531,6.9980469 V 20.001953 H 15 v 0.982422 h 3.519531 V 7.9980469 h 3 V 20.984375 h 4.082031 L 20.001953,26.583984 15,21.580078 v 1.458984 l 5.001953,4.958985 7.996094,-7.996094 H 22.519531 V 6.9980469 Z M 15,23.039062 V 21.580078 L 14.404297,20.984375 H 15 v -0.982422 h -3.0625 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="ping_connection_btn.svg"
inkscape:export-filename="/home/axionl/Desktop/Qv2ray_Design/duplicate_connection_btn.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="45.254833"
inkscape:cx="20.545509"
inkscape:cy="11.164374"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-grids="false"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,6.6145834"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="4.2333333,0.79375"
orientation="1,0"
id="guide862"
inkscape:locked="false" />
<sodipodi:guide
position="1.058333,4.2333126"
orientation="0,1"
id="guide896"
inkscape:locked="false" />
<sodipodi:guide
position="5.4787523,1.9843804"
orientation="0,1"
id="guide1290"
inkscape:locked="false" />
<sodipodi:guide
position="5.4787523,1.719793"
orientation="0,1"
id="guide1292"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)">
<circle
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1148"
cx="23.087498"
cy="229.7016"
r="0.26458338" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.25420347px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 23.087497,229.51453 2.245078,-2.24507 0.187089,0.18709 -2.245064,2.24506 z"
id="path1150"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1222"
width="0.26458332"
height="0.26458332"
x="-147.91432"
y="179.55203"
transform="rotate(-45)" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.499997,231.95055 0.474373,0 0.583961,-0.58396 1.05833,1.05833 0.474377,-0.47437 h 0.588094 v 0.26458 h -0.478511 l -0.583962,0.58397 -1.058328,-1.05833 -0.474368,0.47436 h -0.582932 z"
id="path1298"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccc" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 16 4 A 11.999921 11.999921 0 0 0 4 16 A 11.999921 11.999921 0 0 0 7.5195312 24.480469 L 11.052734 21.267578 L 11.759766 20.560547 A 5.9999984 5.9999984 0 0 1 10 16.320312 A 5.9999984 5.9999984 0 0 1 16 10.320312 A 5.9999984 5.9999984 0 0 1 18.841797 11.037109 L 19.570312 10.308594 A 6.9999998 6.9999998 0 0 0 16 9.3203125 A 6.9999998 6.9999998 0 0 0 9 16.320312 A 6.9999998 6.9999998 0 0 0 10.375 20.46875 L 7.5566406 23.033203 A 10.999999 10.999999 0 0 1 5 16 A 10.999999 10.999999 0 0 1 16 5 A 10.999999 10.999999 0 0 1 22.634766 7.2421875 L 23.353516 6.5234375 A 11.999921 11.999921 0 0 0 16 4 z "
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path951" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 20.427734 12.279297 L 21.132812 11.574219 A 6.9999999 6.9999999 0 0 0 20.408203 10.884766 L 19.693359 11.599609 A 5.9999985 5.9999985 0 0 1 20.427734 12.279297 z "
id="path947"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 25.46875 8.6523438 L 24.759766 9.3632812 A 10.999999 10.999999 0 0 1 27 16 A 10.999999 10.999999 0 0 1 24.445312 23.033203 L 21.623047 20.46875 A 6.9999998 6.9999998 0 0 0 23 16.320312 A 6.9999998 6.9999998 0 0 0 21.767578 12.353516 L 21.046875 13.076172 A 5.9999984 5.9999984 0 0 1 22 16.320312 A 5.9999984 5.9999984 0 0 1 20.240234 20.560547 L 20.947266 21.267578 L 24.480469 24.480469 A 11.999921 11.999921 0 0 0 28 16 A 11.999921 11.999921 0 0 0 25.46875 8.6523438 z "
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path943" />
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.03779528;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 24.115234 7.1777344 L 23.408203 7.8847656 A 10.999999 10.999999 0 0 1 24.117188 8.5917969 L 24.822266 7.8867188 A 11.999921 11.999921 0 0 0 24.115234 7.1777344 z "
id="path937"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666667 8.4666667"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="share_connectio_btn.svg"
inkscape:export-filename="/tmp/makepkg/qv2ray-dev-git/src/qv2ray-dev-git/icons/add_connection_btn.png"
inkscape:export-xdpi="144.00002"
inkscape:export-ydpi="144.00002">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="17.784325"
inkscape:cy="12.106514"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1874"
inkscape:window-height="1050"
inkscape:window-x="46"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-bottom="20"
fit-margin-right="20"
guidecolor="#00dcff"
guideopacity="0.49803922"
guidehicolor="#1ce300"
guidehiopacity="0.49803922"
units="px"
inkscape:snap-nodes="true"
inkscape:snap-others="true"
inkscape:bbox-paths="false"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="false">
<inkscape:grid
type="xygrid"
id="grid822"
color="#3f4842"
opacity="0.02745098"
empcolor="#3f1212"
empopacity="0.05098039"
spacingx="0"
spacingy="0" />
<sodipodi:guide
position="1.0583333,1.8520833"
orientation="1,0"
id="guide824"
inkscape:locked="false" />
<sodipodi:guide
position="0,7.4083334"
orientation="0,1"
id="guide826"
inkscape:locked="false" />
<sodipodi:guide
position="7.4083334,0.79375"
orientation="1,0"
id="guide828"
inkscape:locked="false" />
<sodipodi:guide
position="1.3229167,1.0583333"
orientation="0,1"
id="guide830"
inkscape:locked="false" />
<sodipodi:guide
position="2.1166665,5.8189079"
orientation="0,1"
id="guide842"
inkscape:locked="false" />
<sodipodi:guide
position="4.4368395,3.1750017"
orientation="1,0"
id="guide961"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-18.854164,-225.46826)"
style="opacity:1">
<path
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.07559059;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 20,13.292969 V 14.707031 18 l -3.230469,0 h -2.683593 c -1.598676,0.07502 -2.856968,1.391754 -2.859376,2.992188 V 21 28 h 4.566407 V 27 23 L 20,23 v 3.292969 1.414062 l 1,-1 5.5,-5.5 L 27.207031,20.5 26.5,19.792969 l -5.5,-5.5 z M 21,15.707031 25.792969,20.5 21,25.292969 V 22 l -5.207031,0 -0.02344,-2 v -0.002 c -3.54e-4,-0.03325 9.5e-4,-0.06649 0.0039,-0.09961 0.0035,-0.03345 0.0087,-0.06669 0.01562,-0.09961 0.0069,-0.0323 0.01535,-0.06424 0.02539,-0.0957 0.0095,-0.03178 0.02059,-0.06307 0.0332,-0.09375 0.01346,-0.03068 0.02845,-0.06067 0.04492,-0.08984 0.01549,-0.02947 0.03243,-0.05815 0.05078,-0.08594 0.01883,-0.02769 0.03904,-0.05442 0.06055,-0.08008 0.02157,-0.02521 0.04439,-0.04933 0.06836,-0.07227 0.02426,-0.02341 0.04968,-0.04557 0.07617,-0.06641 0.02571,-0.02084 0.05243,-0.0404 0.08008,-0.05859 0.02846,-0.01774 0.05779,-0.03404 0.08789,-0.04883 0.02925,-0.01514 0.05924,-0.02883 0.08984,-0.04102 0.03136,-0.01202 0.0633,-0.02245 0.0957,-0.03125 0.03217,-0.0088 0.06477,-0.01596 0.09766,-0.02148 0.03299,-0.0056 0.06623,-0.0095 0.09961,-0.01172 0.02341,-0.0015 0.04686,-0.0021 0.07031,-0.002 L 21,19 Z M 14.085938,19 h 0.955078 c -0.176442,0.303122 -0.270068,0.647315 -0.271485,0.998047 V 20 l 0.02344,2 v 5 h -2.566407 v -6 -0.0059 c -5.6e-5,-0.06653 0.0032,-0.133016 0.0098,-0.199219 0.0065,-0.0662 0.01626,-0.132039 0.0293,-0.197266 0.01363,-0.06592 0.03058,-0.131104 0.05078,-0.195312 0.01965,-0.0636 0.04247,-0.126177 0.06836,-0.1875 0.02564,-0.06129 0.05432,-0.121256 0.08594,-0.179688 0.0323,-0.05836 0.0675,-0.115076 0.105469,-0.169922 0.0376,-0.05605 0.07802,-0.11015 0.121094,-0.162109 0.0431,-0.05108 0.08873,-0.09997 0.136718,-0.146484 0.04729,-0.04604 0.09683,-0.08972 0.148438,-0.13086 0.05268,-0.0418 0.107439,-0.08091 0.164062,-0.117187 0.05624,-0.03609 0.114262,-0.06933 0.173828,-0.09961 0.05918,-0.02968 0.119806,-0.05641 0.181641,-0.08008 0.06204,-0.02463 0.125266,-0.04614 0.189453,-0.06445 0.06435,-0.01757 0.129533,-0.03191 0.195313,-0.04297 0.06601,-0.01048 0.132495,-0.01766 0.199219,-0.02148 z"
transform="matrix(0.26458333,0,0,0.26458333,18.854164,225.46826)"
id="path966"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
<path
inkscape:connector-curvature="0"
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 21.391477,226.52659 -1.47898,1.47898 0.001,0.10852 v 3.96875 h 1.5865 v -0.26458 H 20.17808 v -3.70417 h 1.322917 v -1.32291 h 2.645833 v 1.85208 h 0.264583 v -2.11667 h -2.910416 z m -0.15503,0.52917 v 0.79375 h -0.79375 z"
id="path1214-6"
sodipodi:nodetypes="cccccccccccccccccccc" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect846"
width="2.9104166"
height="0.26458332"
x="20.706247"
y="228.64326" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect846-3"
width="2.9104166"
height="0.26458332"
x="20.706247"
y="229.43701" />
<rect
style="opacity:1;fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.01;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect846-3-6"
width="1.0583333"
height="0.2645874"
x="20.706247"
y="230.23076" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -0,0 +1,344 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="22"
height="22"
viewBox="0 0 5.8208333 5.8208333"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="qv2ray_tray.svg"
inkscape:export-filename="/media/Storage/Projects/Qv2ray/icons/ui_components/qv2ray_tray.png"
inkscape:export-xdpi="558.54999"
inkscape:export-ydpi="558.54999">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient876">
<stop
style="stop-color:#31363b;stop-opacity:0.58823532"
offset="0"
id="stop872" />
<stop
style="stop-color:#31363b;stop-opacity:0;"
offset="1"
id="stop874" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient866">
<stop
style="stop-color:#31363b;stop-opacity:0.58823532"
offset="0"
id="stop862" />
<stop
style="stop-color:#31363b;stop-opacity:0;"
offset="1"
id="stop864" />
</linearGradient>
<linearGradient
id="linearGradient841"
osb:paint="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop839" />
</linearGradient>
<linearGradient
id="linearGradient5057"
inkscape:collect="always">
<stop
id="stop5053"
offset="0"
style="stop-color:#3c3c3c;stop-opacity:1;" />
<stop
id="stop5055"
offset="1"
style="stop-color:#282728;stop-opacity:0.6574803" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4713">
<stop
style="stop-color:#3de256;stop-opacity:1"
offset="0"
id="stop4709" />
<stop
style="stop-color:#2fbeba;stop-opacity:1"
offset="1"
id="stop4711" />
</linearGradient>
<linearGradient
gradientTransform="translate(38.574145,1.3181723)"
gradientUnits="userSpaceOnUse"
y2="39.934193"
x2="108.00179"
y1="19.458199"
x1="89.965836"
id="linearGradient4707"
xlink:href="#linearGradient4713"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="94.022179"
x2="140.26065"
y1="48.940449"
x1="92.227142"
id="linearGradient5059"
xlink:href="#linearGradient5057"
inkscape:collect="always" />
<clipPath
id="clipPath922"
clipPathUnits="userSpaceOnUse">
<rect
ry="1.0638391"
y="284.56458"
x="9.5367426e-08"
height="12.170834"
width="12.7"
id="rect924"
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625" />
</clipPath>
<clipPath
id="clipPath922-6"
clipPathUnits="userSpaceOnUse">
<rect
ry="1.0638391"
y="284.56458"
x="9.5367426e-08"
height="12.170834"
width="12.7"
id="rect924-2"
style="fill:none;fill-opacity:1;stroke:#23d829;stroke-width:0.044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72265625" />
</clipPath>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter1510">
<feFlood
flood-opacity="0.976471"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood1500" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1502" />
<feGaussianBlur
in="composite1"
stdDeviation="0.1"
result="blur"
id="feGaussianBlur1504" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset1506" />
<feComposite
in="offset"
in2="SourceGraphic"
operator="out"
result="composite2"
id="feComposite1508" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter1859">
<feFlood
flood-opacity="0.266667"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood1849" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1851" />
<feGaussianBlur
in="composite1"
stdDeviation="0.2"
result="blur"
id="feGaussianBlur1853" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset1855" />
<feComposite
in="offset"
in2="SourceGraphic"
operator="out"
result="composite2"
id="feComposite1857" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient866"
id="linearGradient868"
x1="4.2985892"
y1="292.06757"
x2="7.7381635"
y2="295.50714"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient876"
id="linearGradient878"
x1="5.6215057"
y1="294.44879"
x2="6.6798391"
y2="295.50714"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="2.5129442"
inkscape:cy="10.477946"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-bottom="5"
fit-margin-right="5"
inkscape:snap-global="true"
inkscape:object-paths="false"
inkscape:snap-intersection-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-grids="false"
inkscape:snap-object-midpoints="true"
showguides="true"
inkscape:guide-bbox="true"
scale-x="1"
guidecolor="#00ffff"
guideopacity="0.49803922"
guidehicolor="#ff5184"
guidehiopacity="0.62745098"
inkscape:snap-nodes="true"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid815"
originx="0"
originy="0"
color="#3f513e"
opacity="0.04313725"
empcolor="#3f3742"
empopacity="0.16470588"
empspacing="5"
dotted="false" />
<sodipodi:guide
position="11.244792,0.79375"
orientation="1,0"
id="guide924"
inkscape:locked="false" />
<sodipodi:guide
position="-1.6867187,5.0270833"
orientation="1,0"
id="guide932"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,255,236)" />
<sodipodi:guide
position="0.79375,4.4979166"
orientation="1,0"
id="guide1884"
inkscape:locked="false" />
<sodipodi:guide
position="3.96875,5.0270833"
orientation="0,1"
id="guide1886"
inkscape:locked="false" />
<sodipodi:guide
position="5.0270833,0.26458333"
orientation="1,0"
id="guide1888"
inkscape:locked="false" />
<sodipodi:guide
position="4.4979166,0.79375"
orientation="0,1"
id="guide1890"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-1.9173392,-290.74464)">
<path
style="fill:url(#linearGradient878);stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;opacity:0.65"
d="m 5.6215058,295.50714 v -0.79375 l 0.2645833,-0.26458 0.79375,0.79375 v 0.26458 z"
id="path870"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient868);stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;opacity:0.65"
d="m 4.2985892,292.86131 2.3812499,2.38125 v -1.32292 l -1.3229166,-1.32292 -0.79375,-0.52916 -0.2645833,0.26458 z"
id="path860"
inkscape:connector-curvature="0" />
<path
id="path1962"
transform="matrix(0.26458333,0,0,0.26458333,1.9173392,290.74464)"
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 7,11 6.2929688,11.707031 8.5859375,14 H 18 V 13 H 9 Z M 6.2929688,11.707031 5,13 H 4 v 1 H 5.4140625 L 7,12.414062 Z M 3,3 V 18.999988 H 19 V 3 Z M 3.9999999,3.9999875 H 18 V 18 H 3.9999999 Z" />
<rect
style="opacity:0.5;fill:none;fill-opacity:1;stroke:none;stroke-width:0.04583338;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect844"
width="5.8208332"
height="5.8208447"
x="1.9173392"
y="290.74463"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64" />
<path
style="fill:#31363b;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.5631726,292.06756 -0.2645834,0.26459 v 0.52916 l 0.2645834,-0.26458 v 0.26458 0.52917 l 0.5291666,0.79375 0.5291667,1.32291 v -0.79374 l 0.2645833,-0.26459 -0.2645833,-0.52916 v -0.79375 l -0.2645833,-0.52917 z"
id="path1934"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 927 B

BIN
icons/ui_light/edit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
icons/ui_light/import.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

BIN
icons/ui_light/json.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
icons/ui_light/share.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
icons/ui_light/tray.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1,10 +1,27 @@
<RCC>
<qresource prefix="/">
<file>icons/Qv2ray.ico</file>
<file>icons/add_connection_btn.png</file>
<file>icons/import_connection_btn.png</file>
<file>icons/remove_connection_btn.png</file>
<file>icons/edit_connection_btn.png</file>
<file>icons/netspeed-arrows.svg</file>
<file>icons/qv2ray.icns</file>
<file>icons/qv2ray.png</file>
<file>icons/qv2ray.ico</file>
<file>icons/ui_dark/add.png</file>
<file>icons/ui_dark/delete.png</file>
<file>icons/ui_dark/duplicate.png</file>
<file>icons/ui_dark/edit.png</file>
<file>icons/ui_dark/import.png</file>
<file>icons/ui_dark/json.png</file>
<file>icons/ui_dark/netspeed_arrow.png</file>
<file>icons/ui_dark/ping_gauge.png</file>
<file>icons/ui_dark/share.png</file>
<file>icons/ui_light/add.png</file>
<file>icons/ui_light/delete.png</file>
<file>icons/ui_light/duplicate.png</file>
<file>icons/ui_light/edit.png</file>
<file>icons/ui_light/import.png</file>
<file>icons/ui_light/json.png</file>
<file>icons/ui_light/netspeed_arrow.png</file>
<file>icons/ui_light/ping_gauge.png</file>
<file>icons/ui_light/share.png</file>
<file>icons/ui_light/tray.png</file>
<file>icons/ui_dark/tray.png</file>
</qresource>
</RCC>

View File

@ -1,188 +0,0 @@
#ifndef QV2RAYBASE_H
#define QV2RAYBASE_H
#include <QtCore>
#include "QvTinyLog.h"
#include "QvCoreConfigObjects.h"
#include "QvNetSpeedPlugin.h"
#include "QObjectMessageProxy.h"
#define QV2RAY_CONFIG_VERSION 8
// Base folder suffix.
#ifdef QT_DEBUG
#define QV2RAY_CONFIG_DIR_SUFFIX "_debug/"
#else
#define QV2RAY_CONFIG_DIR_SUFFIX "/"
#endif
// Get Configured Config Dir Path
#define QV2RAY_CONFIG_DIR (Qv2ray::Utils::GetConfigDirPath())
#define QV2RAY_CONFIG_FILE (QV2RAY_CONFIG_DIR + "Qv2ray.conf")
#define QV2RAY_CONFIG_FILE_EXTENSION ".qv2ray.json"
#define QV2RAY_GENERATED_DIR (QV2RAY_CONFIG_DIR + "generated/")
#define QV2RAY_GENERATED_FILE_PATH (QV2RAY_GENERATED_DIR + "config.gen.json")
#ifndef QV2RAY_DEFAULT_VCORE_PATH
#ifdef _WIN32
#define QV2RAY_DEFAULT_VCORE_PATH (QV2RAY_CONFIG_DIR + "vcore/v2ray.exe")
#else
#define QV2RAY_DEFAULT_VCORE_PATH (QV2RAY_CONFIG_DIR + "vcore/v2ray")
#endif
#endif
#define QV2RAY_VCORE_LOG_DIRNAME "logs/"
#define QV2RAY_VCORE_ACCESS_LOG_FILENAME "access.log"
#define QV2RAY_VCORE_ERROR_LOG_FILENAME "error.log"
// GUI TOOLS
#define RED(obj) \
auto _temp = ui->obj->palette(); \
_temp.setColor(QPalette::Text, Qt::red); \
ui->obj->setPalette(_temp);
#define BLACK(obj) \
auto _temp = ui->obj->palette(); \
_temp.setColor(QPalette::Text, Qt::black); \
ui->obj->setPalette(_temp);
#define QSTRING(std_string) QString::fromStdString(std_string)
#define NEWLINE "\r\n"
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
namespace Qv2ray
{
namespace QvConfigModels
{
enum QvConfigType {
CONFIGTYPE_CONFIG,
CONFIGTYPE_SUBSCRIPTION
};
struct Qv2rayCoreInboundsConfig {
string listenip;
// SOCKS
int socks_port;
bool socks_useAuth;
bool socksUDP;
string socksLocalIP;
AccountObject socksAccount;
// HTTP
int http_port;
bool http_useAuth;
AccountObject httpAccount;
Qv2rayCoreInboundsConfig(): listenip(), socks_port(), socks_useAuth(), socksAccount(), http_port(), http_useAuth(), httpAccount() {}
Qv2rayCoreInboundsConfig(string listen, int socksPort, int httpPort): Qv2rayCoreInboundsConfig()
{
socks_port = socksPort;
http_port = httpPort;
listenip = listen;
socksLocalIP = "0.0.0.0";
socksUDP = true;
}
XTOSTRUCT(O(listenip, socks_port, socks_useAuth, socksAccount, socksUDP, socksLocalIP, http_port, http_useAuth, httpAccount))
};
struct Qv2rayConfig {
int config_version;
bool tProxySupport;
int logLevel;
//
string language;
string v2CorePath;
string v2AssetsPath;
string autoStartConfig;
//
string ignoredVersion;
//
bool bypassCN;
bool enableProxy;
bool withLocalDNS;
//
bool enableStats;
int statsPort;
//
list<string> dnsList;
//
Qv2rayCoreInboundsConfig inBoundSettings;
#ifdef newFeature
map<string, QvConfigType> configs;
#else
list<string> configs;
#endif
map<string, string> subscribes;
QvNetSpeedBarConfig speedBarConfig;
Qv2rayConfig():
config_version(QV2RAY_CONFIG_VERSION),
tProxySupport(false),
logLevel(),
language(),
v2CorePath(),
v2AssetsPath(),
autoStartConfig(),
ignoredVersion(),
bypassCN(),
enableProxy(),
withLocalDNS(),
enableStats(),
statsPort(15934),
dnsList(),
inBoundSettings(),
configs(),
subscribes(),
speedBarConfig() { }
Qv2rayConfig(string lang, string assetsPath, int log, Qv2rayCoreInboundsConfig _inBoundSettings): Qv2rayConfig()
{
// These settings below are defaults.
ignoredVersion = "";
autoStartConfig = "";
language = lang;
v2AssetsPath = assetsPath;
inBoundSettings = _inBoundSettings;
logLevel = log;
tProxySupport = false;
dnsList.push_back("8.8.8.8");
dnsList.push_back("8.8.4.4");
dnsList.push_back("1.1.1.1");
bypassCN = true;
enableProxy = true;
withLocalDNS = true;
enableStats = true;
statsPort = 15934;
}
XTOSTRUCT(O(config_version,
enableStats,
statsPort,
tProxySupport,
logLevel,
language,
autoStartConfig,
ignoredVersion,
v2CorePath,
v2AssetsPath,
enableProxy,
bypassCN,
withLocalDNS,
dnsList,
inBoundSettings,
configs,
subscribes,
speedBarConfig))
};
// Extra header for QvConfigUpgrade.cpp
QJsonObject UpgradeConfig(int fromVersion, int toVersion, QJsonObject root);
}
}
using namespace std;
using namespace Qv2ray;
using namespace Qv2ray::V2ConfigModels;
using namespace Qv2ray::QvConfigModels;
#endif // QV2RAYBASE_H

236
src/Qv2rayBase.hpp Normal file
View File

@ -0,0 +1,236 @@
#ifndef QV2RAYBASE_H
#define QV2RAYBASE_H
#include <QtCore>
#include <QtGui>
#include <QMap>
#include <vector>
#include "QvTinyLog.hpp"
#include "QvCoreConfigObjects.hpp"
#include "QObjectMessageProxy.hpp"
#define QV2RAY_CONFIG_VERSION 12
// Linux DEs should handle the ui schemes themselves.
// --> Or.. should we change this into a modifyable setting?
#ifdef Q_OS_LINUX
#define QV2RAY_USE_BUILTIN_DARKTHEME false
#else
#define QV2RAY_USE_BUILTIN_DARKTHEME true
#endif
// Base folder suffix.
#ifdef QT_DEBUG
#define QV2RAY_CONFIG_DIR_SUFFIX "_debug/"
#else
#define QV2RAY_CONFIG_DIR_SUFFIX "/"
#endif
// Get Configured Config Dir Path
#define QV2RAY_CONFIG_DIR (Qv2ray::Utils::GetConfigDirPath())
#define QV2RAY_CONFIG_FILE (QV2RAY_CONFIG_DIR + "Qv2ray.conf")
#define QV2RAY_QRCODE_DIR (QV2RAY_CONFIG_DIR + "qr_images/")
// Get GFWList and PAC file path.
#define QV2RAY_RULES_DIR (QV2RAY_CONFIG_DIR + "rules/")
#define QV2RAY_RULES_GFWLIST_PATH (QV2RAY_RULES_DIR + "gfwList.txt")
#define QV2RAY_RULES_PAC_PATH (QV2RAY_RULES_DIR + "pac.txt")
#define QV2RAY_CONFIG_FILE_EXTENSION ".qv2ray.json"
#define QV2RAY_GENERATED_DIR (QV2RAY_CONFIG_DIR + "generated/")
#define QV2RAY_GENERATED_FILE_PATH (QV2RAY_GENERATED_DIR + "config.gen.json")
#ifndef QV2RAY_DEFAULT_VCORE_PATH
#ifdef Q_OS_WIN
#define QV2RAY_DEFAULT_VCORE_PATH (QV2RAY_CONFIG_DIR + "vcore/v2ray.exe")
#else
#define QV2RAY_DEFAULT_VCORE_PATH (QV2RAY_CONFIG_DIR + "vcore/v2ray")
#endif
#endif
#define QV2RAY_VCORE_LOG_DIRNAME "logs/"
#define QV2RAY_VCORE_ACCESS_LOG_FILENAME "access.log"
#define QV2RAY_VCORE_ERROR_LOG_FILENAME "error.log"
// GUI TOOLS
#define QV2RAY_IS_DARKTHEME (GetGlobalConfig().uiConfig.useDarkTheme)
#define RED(obj) \
auto _temp = obj->palette(); \
_temp.setColor(QPalette::Text, Qt::red); \
obj->setPalette(_temp);
#define BLACK(obj) \
obj->setPalette(this->palette());
#define QV2RAY_UI_RESOURCES_ROOT QSTRING(QV2RAY_IS_DARKTHEME ? ":/icons/ui_dark/" : ":/icons/ui_light/")
#define QICON_R(file) QIcon(QV2RAY_UI_RESOURCES_ROOT + file)
#define QSTRING(std_string) QString::fromStdString(std_string)
#define NEWLINE "\r\n"
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
namespace Qv2ray
{
// Extra header for QvConfigUpgrade.cpp
QJsonObject UpgradeConfig(int fromVersion, int toVersion, QJsonObject root);
struct QvBarLine {
string Family;
bool Bold;
bool Italic;
int ColorA;
int ColorR;
int ColorG;
int ColorB;
int ContentType;
double Size;
string Message;
QvBarLine()
: Family("Consolas")
, Bold(true)
, Italic(false)
, ColorA(255), ColorR(255), ColorG(255), ColorB(255)
, ContentType(0)
, Size(9),
Message() { }
XTOSTRUCT(O(Bold, Italic, ColorA, ColorR, ColorG, ColorB, Size, Family, Message, ContentType))
};
struct QvBarPage {
int OffsetYpx;
vector<QvBarLine> Lines;
QvBarPage() : OffsetYpx(5) { }
XTOSTRUCT(O(OffsetYpx, Lines))
};
struct Qv2rayToolBarConfig {
vector<QvBarPage> Pages;
XTOSTRUCT(O(Pages))
};
namespace QvConfigModels
{
struct Qv2rayPACConfig {
bool usePAC;
int port;
string proxyIP;
bool useSocksProxy;
Qv2rayPACConfig() : usePAC(false), port(8989), useSocksProxy(false) { }
XTOSTRUCT(O(usePAC, port, proxyIP, useSocksProxy))
};
struct Qv2rayInboundsConfig {
string listenip;
bool setSystemProxy;
Qv2rayPACConfig pacConfig;
// SOCKS
bool useSocks;
int socks_port;
bool socks_useAuth;
bool socksUDP;
string socksLocalIP;
AccountObject socksAccount;
// HTTP
bool useHTTP;
int http_port;
bool http_useAuth;
AccountObject httpAccount;
Qv2rayInboundsConfig():
listenip(), setSystemProxy(), pacConfig(),
useSocks(), socks_port(), socks_useAuth(), socksUDP(true), socksAccount(),
useHTTP(), http_port(), http_useAuth(), httpAccount() {}
Qv2rayInboundsConfig(const string &listen, int socksPort, int httpPort): Qv2rayInboundsConfig()
{
socks_port = socksPort;
http_port = httpPort;
listenip = listen;
socksLocalIP = "0.0.0.0";
socksUDP = true;
setSystemProxy = true;
}
XTOSTRUCT(O(setSystemProxy, pacConfig, listenip, useSocks, useHTTP, socks_port, socks_useAuth, socksAccount, socksUDP, socksLocalIP, http_port, http_useAuth, httpAccount))
};
struct Qv2rayUIConfig {
string theme;
string language;
bool useDarkTheme;
bool useDarkTrayIcon;
Qv2rayUIConfig() : theme(""), language("en-US"), useDarkTheme(false), useDarkTrayIcon(true) { }
XTOSTRUCT(O(theme, language, useDarkTheme, useDarkTrayIcon))
};
struct Qv2rayConnectionConfig {
bool bypassCN;
bool enableProxy;
bool withLocalDNS;
list<string> dnsList;
bool enableStats;
int statsPort;
Qv2rayConnectionConfig() : bypassCN(true), enableProxy(true), withLocalDNS(true), dnsList(), enableStats(true), statsPort(15490) { }
XTOSTRUCT(O(bypassCN, enableProxy, withLocalDNS, dnsList, enableStats, statsPort))
};
struct Qv2rayConfig {
int config_version;
bool tProxySupport;
int logLevel;
//
string v2CorePath;
string v2AssetsPath;
string autoStartConfig;
string ignoredVersion;
//
list<string> configs;
map<string, string> subscribes;
//
Qv2rayUIConfig uiConfig;
Qv2rayInboundsConfig inboundConfig;
Qv2rayConnectionConfig connectionConfig;
Qv2rayToolBarConfig toolBarConfig;
Qv2rayConfig():
config_version(QV2RAY_CONFIG_VERSION),
tProxySupport(false),
logLevel(),
v2CorePath(),
v2AssetsPath(),
autoStartConfig(),
ignoredVersion(),
configs(),
subscribes(),
uiConfig(),
inboundConfig(),
connectionConfig(),
toolBarConfig() { }
//
Qv2rayConfig(const string &assetsPath, int log, const Qv2rayInboundsConfig &_inBoundSettings): Qv2rayConfig()
{
// These settings below are defaults.
v2AssetsPath = assetsPath;
inboundConfig = _inBoundSettings;
logLevel = log;
tProxySupport = false;
}
XTOSTRUCT(O(config_version,
ignoredVersion,
tProxySupport,
logLevel,
autoStartConfig,
v2CorePath, v2AssetsPath,
configs,
uiConfig,
subscribes, inboundConfig, connectionConfig, toolBarConfig))
};
}
}
using namespace std;
using namespace Qv2ray;
using namespace Qv2ray::V2ConfigModels;
using namespace Qv2ray::QvConfigModels;
#endif // QV2RAYBASE_H

View File

@ -1,15 +1,13 @@
//
//
// This file handles some important migration
// from old to newer versions of Qv2ray.
//
#include "QvUtils.h"
#include "QvUtils.hpp"
#define UPDATELOG(msg) LOG(MODULE_CONFIG, " [" + to_string(fromVersion) + "-" + to_string(fromVersion + 1) + "] --> " msg)
namespace Qv2ray
{
namespace QvConfigModels
{
// Private member
QJsonObject UpgradeConfig_Inc(int fromVersion, QJsonObject root)
@ -31,7 +29,7 @@ namespace Qv2ray
// We also need v2ctl
auto v2CtlFilePath = QFileInfo(vCoreFilePath).dir().path() + "/v2ctl";
auto v2CtlDestPath = QFileInfo(vCoreDestPath).dir().path() + "/v2ctl";
#ifdef __WIN32
#ifdef Q_OS_WIN
v2CtlFilePath = v2CtlFilePath.append(".exe");
v2CtlDestPath = v2CtlDestPath.append(".exe");
#endif
@ -54,6 +52,8 @@ namespace Qv2ray
break;
}
// --------------------------------------------------------------------------------------
// Below is for version 2
case 4: {
// From 2 to 3, we changed the "proxyCN" to "bypassCN" as it's easier to understand....
auto v2_oldProxyCN = root["proxyCN"].toBool();
@ -85,6 +85,42 @@ namespace Qv2ray
UPDATELOG("Added v2CorePath to the config file.")
break;
}
case 8: {
auto lang = root["language"].toString();
QJsonObject uiSettings;
uiSettings["language"] = lang;
root["uiConfig"] = uiSettings;
UPDATELOG("Reconstructing config file.")
break;
}
case 9: {
root["uiConfig"] = root["UISettings"];
root.remove("UISettings");
UPDATELOG("Renamed UISettings to uiConfig.")
break;
}
case 10: {
root["inboundConfig"] = root["inBoundSettings"];
root.remove("inBoundSettings");
UPDATELOG("Renamed inBoundSettings to inboundConfig.")
break;
}
case 11: {
//connectionConfig
QJsonObject o;
o["dnsList"] = root["dnsList"];
o["withLocalDNS"] = root["withLocalDNS"];
o["enableProxy"] = root["enableProxy"];
o["bypassCN"] = root["bypassCN"];
o["enableStats"] = root["enableStats"];
o["statsPort"] = root["statsPort"];
root["connectionConfig"] = o;
UPDATELOG("Renamed some connection configs to connectionConfig.")
}
}
root["config_version"] = root["config_version"].toInt() + 1;
@ -102,6 +138,4 @@ namespace Qv2ray
return root;
}
}
}

View File

@ -63,6 +63,7 @@ namespace Qv2ray
struct RuleObject {
// Added due to the request of @aliyuchang33
bool QV2RAY_RULE_ENABLED;
bool QV2RAY_RULE_USE_BALANCER;
//
string type;
list<string> domain;
@ -76,8 +77,8 @@ namespace Qv2ray
string attrs;
string outboundTag;
string balancerTag;
RuleObject() : QV2RAY_RULE_ENABLED(true), type("field"), domain(), ip(), port(""), network(""), source(), user(), inboundTag(), protocol(), attrs(), outboundTag(""), balancerTag("") {}
XTOSTRUCT(O(QV2RAY_RULE_ENABLED, type, domain, ip, port, network, source, user, inboundTag, protocol, attrs, outboundTag, balancerTag))
RuleObject() : QV2RAY_RULE_ENABLED(true), QV2RAY_RULE_USE_BALANCER(false), type("field"), domain(), ip(), port(""), network(""), source(), user(), inboundTag(), protocol(), attrs(), outboundTag(""), balancerTag("") {}
XTOSTRUCT(O(QV2RAY_RULE_ENABLED, QV2RAY_RULE_USE_BALANCER, type, domain, ip, port, network, source, user, inboundTag, protocol, attrs, outboundTag, balancerTag))
};
//
//

View File

@ -0,0 +1,48 @@
#include "QvCoreConfigOperations.hpp"
namespace Qv2ray
{
namespace ConfigOperations
{
QMap<QString, QJsonObject> GetConnections(list<string> connectionNames)
{
QMap<QString, QJsonObject> list;
for (auto conn : connectionNames) {
QString jsonString = StringFromFile(new QFile(QV2RAY_CONFIG_DIR + QSTRING(conn) + QV2RAY_CONFIG_FILE_EXTENSION));
QJsonObject connectionObject = JsonFromString(jsonString);
list.insert(QString::fromStdString(conn), connectionObject);
}
return list;
}
bool CheckIsComplexConfig(QJsonObject root)
{
bool cRouting = root.contains("routing");
bool cRule = cRouting && root["routing"].toObject().contains("rules");
bool cRules = cRule && root["routing"].toObject()["rules"].toArray().count() > 0;
return cRules;
}
int StartPreparation(QJsonObject fullConfig)
{
// Writes the final configuration to the disk.
QString json = JsonToString(fullConfig);
StringToFile(&json, new QFile(QV2RAY_GENERATED_FILE_PATH));
return 0;
}
int FindIndexByTag(QJsonArray list, QString *tag)
{
for (int i = 0; i < list.count(); i++) {
auto value = list[i].toObject();
if (value.contains("tag") && value["tag"].toString() == *tag)
return i;
}
return -1;
}
}
}

View File

@ -1,76 +0,0 @@
#ifndef CONFIGGENERATION_H
#define CONFIGGENERATION_H
#include "QvUtils.h"
#include "QJsonObjectInsertMacros.h"
#define OUTBOUND_TAG_DIRECT "outBound_DIRECT"
#define OUTBOUND_TAG_PROXY "outBound_PROXY"
#define API_TAG_DEFAULT "_QV2RAY_API_"
#define API_TAG_INBOUND "_QV2RAY_API_INBOUND_"
#define DROOT QJsonObject root;
#define RROOT return root;
#define JSON_ROOT_TRY_REMOVE(obj) if (root.contains(obj)) { root.remove(obj); }
namespace Qv2ray
{
namespace ConfigOperations
{
// -------------------------- BEGIN CONFIG GENERATIONS ---------------------------------------------
QJsonObject GenerateRoutes(bool enableProxy, bool cnProxy);
QJsonObject GenerateSingleRouteRule(QStringList list, bool isDomain, QString outboundTag, QString type = "field");
QJsonObject GenerateDNS(bool withLocalhost, QStringList dnsServers);
QJsonObject GenerateAPIEntry(QString tag, bool withHandler = true, bool withLogger = true, bool withStats = true);
//
// OutBoundProtocols
QJsonObject GenerateFreedomOUT(QString domainStrategy, QString redirect, int userLevel);
QJsonObject GenerateBlackHoleOUT(bool useHTTP);
QJsonObject GenerateShadowSocksServerOUT(QString email, QString address, int port, QString method, QString password, bool ota, int level);
QJsonObject GenerateShadowSocksOUT(QList<QJsonObject> servers);
//
// InBoundsProtocols
QJsonObject GenerateDokodemoIN(QString address, int port, QString network, int timeout, bool followRedirect, int userLevel);
QJsonObject GenerateHTTPIN(QList<AccountObject> accounts, int timeout = 300, bool allowTransparent = true, int userLevel = 0);
QJsonObject GenerateSocksIN(QString auth, QList<AccountObject> _accounts, bool udp = false, QString ip = "127.0.0.1", int userLevel = 0);
//
// Misc
template<typename T>
QJsonObject GetRootObject(T t)
{
auto json = StructToJsonString(t);
QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(json.toStdString()));
return doc.object();
}
template QJsonObject GetRootObject<RuleObject>(RuleObject t);
template QJsonObject GetRootObject<StreamSettingsObject>(StreamSettingsObject t);
template QJsonObject GetRootObject<VMessServerObject>(VMessServerObject t);
//
// Generate FINAL Configs
QJsonObject GenerateRuntimeConfig(QJsonObject root);
QJsonObject GenerateOutboundEntry(QString protocol, QJsonObject settings, QJsonObject streamSettings, QJsonObject mux = QJsonObject(), QString sendThrough = "0.0.0.0", QString tag = "");
QJsonObject GenerateInboundEntry(QString listen, int port, QString protocol, QJsonObject settings, QString tag, QJsonObject sniffing = QJsonObject(), QJsonObject allocate = QJsonObject());
//
// -------------------------- BEGIN CONFIG VALIDATIONS ---------------------------------------------
int VerifyVMessProtocolString(QString vmess);
QString GetVmessFromBase64OrPlain(QByteArray arr);
//
// -------------------------- BEGIN CONFIG CONVERSIONS ---------------------------------------------
// Save Connection Config
bool SaveConnectionConfig(QJsonObject obj, QString *alias, bool canOverrideExisting);
bool RemoveConnection(const QString *alias);
bool RenameConnection(QString originalName, QString newName);
// VMess Protocol
QJsonObject ConvertConfigFromVMessString(QString vmess);
QJsonObject ConvertConfigFromFile(QString sourceFilePath, bool overrideInbounds);
// Load Configs
QMap<QString, QJsonObject> GetConnections(list<string> connections);
// Startup Prepares
int StartPreparation(QJsonObject fullConfig);
int FindIndexByTag(QJsonArray list, QString *tag);
}
}
using namespace Qv2ray::ConfigOperations;
#endif // CONFIGGENERATION_H

View File

@ -0,0 +1,73 @@
#ifndef CONFIGGENERATION_H
#define CONFIGGENERATION_H
#include "QvUtils.hpp"
#include "QJsonObjectInsertMacros.h"
#define OUTBOUND_TAG_DIRECT "outBound_DIRECT"
#define OUTBOUND_TAG_PROXY "outBound_PROXY"
#define QV2RAY_API_TAG_DEFAULT "_QV2RAY_API_"
#define QV2RAY_API_TAG_INBOUND "_QV2RAY_API_INBOUND_"
#define JSON_ROOT_TRY_REMOVE(obj) if (root.contains(obj)) { root.remove(obj); }
namespace Qv2ray
{
// -------------------------- BEGIN GENERAL FUNCTIONS ----------------------------------------------
namespace ConfigOperations
{
QMap<QString, QJsonObject> GetConnections(list<string> connections);
bool CheckIsComplexConfig(QJsonObject root);
int StartPreparation(QJsonObject fullConfig);
int FindIndexByTag(QJsonArray list, QString *tag);
//
// -------------------------- BEGIN CONFIG CONVERSIONS --------------------------
namespace Convertion
{
//int VerifyVMessProtocolString(QString vmess);
QString DecodeSubscriptionString(QByteArray arr);
//
// Save Connection Config
bool SaveConnectionConfig(QJsonObject obj, QString *alias, bool canOverrideExisting);
bool RemoveConnection(const QString &alias);
bool RenameConnection(QString originalName, QString newName);
// VMess URI Protocol
QJsonObject ConvertConfigFromVMessString(QString vmess, QString *alias, QString *errMessage);
QJsonObject ConvertConfigFromFile(QString sourceFilePath, bool keepInbounds);
QString ConvertConfigToVMessString(const StreamSettingsObject &transfer, const VMessServerObject &serverConfig, const QString &alias);
}
//
// -------------------------- BEGIN CONFIG GENERATIONS ---------------------------------------------
namespace Generation
{
QJsonObject GenerateRoutes(bool enableProxy, bool cnProxy);
QJsonObject GenerateSingleRouteRule(QStringList list, bool isDomain, QString outboundTag, QString type = "field");
QJsonObject GenerateDNS(bool withLocalhost, QStringList dnsServers);
QJsonObject GenerateAPIEntry(QString tag, bool withHandler = true, bool withLogger = true, bool withStats = true);
//
// Outbound Protocols
QJsonObject GenerateFreedomOUT(QString domainStrategy, QString redirect, int userLevel);
QJsonObject GenerateBlackHoleOUT(bool useHTTP);
QJsonObject GenerateShadowSocksServerOUT(QString email, QString address, int port, QString method, QString password, bool ota, int level);
QJsonObject GenerateShadowSocksOUT(QList<QJsonObject> servers);
//
// Inbounds Protocols
QJsonObject GenerateDokodemoIN(QString address, int port, QString network, int timeout, bool followRedirect, int userLevel);
QJsonObject GenerateHTTPIN(QList<AccountObject> accounts, int timeout = 300, bool allowTransparent = true, int userLevel = 0);
QJsonObject GenerateSocksIN(QString auth, QList<AccountObject> _accounts, bool udp = false, QString ip = "127.0.0.1", int userLevel = 0);
//
// Generate FINAL Configs
QJsonObject GenerateRuntimeConfig(QJsonObject root);
QJsonObject GenerateOutboundEntry(QString protocol, QJsonObject settings, QJsonObject streamSettings, QJsonObject mux = QJsonObject(), QString sendThrough = "0.0.0.0", QString tag = "");
QJsonObject GenerateInboundEntry(QString listen, int port, QString protocol, QJsonObject settings, QString tag, QJsonObject sniffing = QJsonObject(), QJsonObject allocate = QJsonObject());
}
}
}
using namespace Qv2ray::ConfigOperations;
using namespace Qv2ray::ConfigOperations::Convertion;
using namespace Qv2ray::ConfigOperations::Generation;
#endif // CONFIGGENERATION_H

View File

@ -1,8 +1,58 @@
#include "QvCoreConfigOperations.h"
#include "QvCoreConfigOperations.hpp"
namespace Qv2ray
{
namespace ConfigOperations
{
namespace Convertion
{
// From https://github.com/2dust/v2rayN/wiki/%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E(ver-2)
QString ConvertConfigToVMessString(const StreamSettingsObject &transfer, const VMessServerObject &serverConfig, const QString &alias)
{
QJsonObject vmessUriRoot;
// Constant
vmessUriRoot["v"] = 2;
vmessUriRoot["ps"] = alias;
vmessUriRoot["add"] = QSTRING(serverConfig.address);
vmessUriRoot["port"] = serverConfig.port;
vmessUriRoot["id"] = QSTRING(serverConfig.users.front().id);
vmessUriRoot["aid"] = serverConfig.users.front().alterId;
vmessUriRoot["net"] = QSTRING(transfer.network);
vmessUriRoot["tls"] = QSTRING(transfer.security);
if (transfer.network == "tcp") {
vmessUriRoot["type"] = QSTRING(transfer.tcpSettings.header.type);
} else if (transfer.network == "kcp") {
vmessUriRoot["type"] = QSTRING(transfer.kcpSettings.header.type);
} else if (transfer.network == "quic") {
vmessUriRoot["type"] = QSTRING(transfer.quicSettings.header.type);
vmessUriRoot["host"] = QSTRING(transfer.quicSettings.security);
vmessUriRoot["path"] = QSTRING(transfer.quicSettings.key);
} else if (transfer.network == "ws") {
auto x = QMap<string, string>(transfer.wsSettings.headers);
auto host = x.contains("host");
auto CapHost = x.contains("Host");
auto realHost = host ? x["host"] : (CapHost ? x["Host"] : "");
//
vmessUriRoot["host"] = QSTRING(realHost);
vmessUriRoot["path"] = QSTRING(transfer.wsSettings.path);
} else if (transfer.network == "h2" || transfer.network == "http") {
vmessUriRoot["host"] = Stringify(transfer.httpSettings.host, ",");
vmessUriRoot["path"] = QSTRING(transfer.httpSettings.path);
}
//
auto vmessPart = Base64Encode(JsonToString(vmessUriRoot, QJsonDocument::JsonFormat::Compact));
return "vmess://" + vmessPart;
}
QString DecodeSubscriptionString(QByteArray arr)
{
// Some subscription providers may use plain vmess:// saperated by lines
// But others may use base64 of above.
auto result = QString::fromUtf8(arr).trimmed();
return result.startsWith("vmess://") ? result : Base64Decode(result);
}
//
/// Save Connection to a place, with checking if there's existing file.
/// If so, append "_N" to the name.
bool SaveConnectionConfig(QJsonObject obj, QString *alias, bool canOverrideExisting)
@ -12,36 +62,90 @@ namespace Qv2ray
// If there's already a file AND we CANNOT override existing file.
if (config->exists() && !canOverrideExisting) {
// I don't think there will be someone using the same name for
// a connection for more than 50 times...
for (int i = 1; i < 50; i++) {
if (QFile(QV2RAY_CONFIG_DIR + *alias + "_" + QString::number(i) + QV2RAY_CONFIG_FILE_EXTENSION).exists()) {
LOG(MODULE_CONFIG, "Config file with name: " << (*alias + QV2RAY_CONFIG_FILE_EXTENSION).toStdString() << " already exists")
LOG(MODULE_CONFIG, "canOverride is off, we try another filename.")
continue;
} else {
*alias = *alias + QString("_") + QString::number(i);
// Alias is a pointer to a QString.
DeducePossibleFileName(QV2RAY_CONFIG_DIR, alias, QV2RAY_CONFIG_FILE_EXTENSION);
config = new QFile(QV2RAY_CONFIG_DIR + *alias + QV2RAY_CONFIG_FILE_EXTENSION);
break;
}
}
}
LOG(MODULE_CONFIG, "Saving a config named: " + alias->toStdString())
return StringToFile(&str, config);
}
bool RemoveConnection(const QString *alias)
bool RemoveConnection(const QString &alias)
{
QFile config(QV2RAY_CONFIG_DIR + *alias + QV2RAY_CONFIG_FILE_EXTENSION);
return config.exists() && config.remove();
QFile config(QV2RAY_CONFIG_DIR + alias + QV2RAY_CONFIG_FILE_EXTENSION);
if (!config.exists()) {
LOG(MODULE_FILE, "Trying to remove a non-existing file?")
return false;
} else {
return config.remove();
}
}
// This generates global config containing only one outbound....
QJsonObject ConvertConfigFromVMessString(QString str)
QJsonObject ConvertConfigFromVMessString(QString vmess, QString *alias, QString *errMessage)
{
// Reset errMessage
*errMessage = "";
if (!vmess.toLower().startsWith("vmess://")) {
*errMessage = QObject::tr("VMess string should start with 'vmess://'");
return QJsonObject();
}
try {
QStringRef vmessJsonB64(&vmess, 8, vmess.length() - 8);
auto b64Str = vmessJsonB64.toString();
if (b64Str.isEmpty()) {
*errMessage = QObject::tr("VMess string should be a valid base64 string");
return QJsonObject();
}
auto vmessString = Base64Decode(b64Str);
auto jsonErr = VerifyJsonString(&vmessString);
if (!jsonErr.isEmpty()) {
*errMessage = jsonErr;
return QJsonObject();
}
auto vmessConf = JsonFromString(vmessString);
if (vmessConf.isEmpty()) {
*errMessage = QObject::tr("JSON should not be empty");
return QJsonObject();
}
// C is a quick hack...
#define C(k) vmessConf.contains(k)
bool flag = true;
flag = flag && C("id");
flag = flag && C("aid");
flag = flag && C("port");
flag = flag && C("add");
// Stream Settings
auto net = C("net") ? vmessConf["net"].toString() : "tcp";
if (net == "http" || net == "ws")
flag = flag && C("host") && C("path");
else if (net == "domainsocket")
flag = flag && C("path");
else if (net == "quic")
flag = flag && C("host") && C("type") && C("path");
#undef C
//return flag ? 0 : 1;
} catch (exception *e) {
LOG(MODULE_CONNECTION_VMESS, "Failed to decode vmess string: " << e->what())
*errMessage = QSTRING(e->what());
return QJsonObject();
}
// --------------------------------------------------------------------------------------
DROOT
QStringRef vmessJsonB64(&str, 8, str.length() - 8);
QStringRef vmessJsonB64(&vmess, 8, vmess.length() - 8);
auto vmessConf = JsonFromString(Base64Decode(vmessJsonB64.toString()));
//
string ps, add, id, net, type, host, path, tls;
@ -85,9 +189,9 @@ namespace Qv2ray
if (net == "tcp") {
streaming.tcpSettings.header.type = type;
} else if (net == "http") {
} else if (net == "http" || net == "h2") {
// Fill hosts for HTTP
foreach (auto _host, QString::fromStdString(host).split(',')) {
for (auto _host : QString::fromStdString(host).split(',')) {
streaming.httpSettings.host.push_back(_host.toStdString());
}
@ -111,20 +215,27 @@ namespace Qv2ray
streaming.network = net;
//
// WARN Mux is missing here.
auto outbound = GenerateOutboundEntry("vmess", vConf, GetRootObject(streaming), QJsonObject() /*GetRootObject(GetGlobalConfig().mux) */, "0.0.0.0", OUTBOUND_TAG_PROXY);
auto outbound = GenerateOutboundEntry("vmess", vConf, GetRootObject(streaming), QJsonObject(), "0.0.0.0", OUTBOUND_TAG_PROXY);
//
QJsonArray outbounds;
outbounds.append(outbound);
root.insert("outbounds", outbounds);
root.insert("QV2RAY_ALIAS", QString::fromStdString(ps));
root["outbounds"] = outbounds;
*alias = *alias + "_" + QSTRING(ps);
RROOT
}
QJsonObject ConvertConfigFromFile(QString sourceFilePath, bool overrideInbounds)
QJsonObject ConvertConfigFromFile(QString sourceFilePath, bool keepInbounds)
{
auto root = JsonFromString(StringFromFile(new QFile(sourceFilePath)));
QFile source(sourceFilePath);
if (overrideInbounds) {
if (!source.exists()) {
LOG(MODULE_FILE, "Trying to import from an non-existing file.")
return QJsonObject();
}
auto root = JsonFromString(StringFromFile(&source));
if (!keepInbounds) {
JSON_ROOT_TRY_REMOVE("inbounds")
}
@ -139,7 +250,7 @@ namespace Qv2ray
{
QMap<QString, QJsonObject> list;
foreach (auto conn, connectionNames) {
for (auto conn : connectionNames) {
QString jsonString = StringFromFile(new QFile(QV2RAY_CONFIG_DIR + QSTRING(conn) + QV2RAY_CONFIG_FILE_EXTENSION));
QJsonObject connectionObject = JsonFromString(jsonString);
list.insert(QString::fromStdString(conn), connectionObject);
@ -150,7 +261,8 @@ namespace Qv2ray
bool RenameConnection(QString originalName, QString newName)
{
return QFile(QV2RAY_CONFIG_DIR + originalName + QV2RAY_CONFIG_FILE_EXTENSION).rename(QV2RAY_CONFIG_DIR + newName + QV2RAY_CONFIG_FILE_EXTENSION);
LOG(MODULE_FILE, "[RENAME] --> ORIGINAL: " + originalName.toStdString() + ", NEW: " + newName.toStdString())
return QFile::rename(QV2RAY_CONFIG_DIR + originalName + QV2RAY_CONFIG_FILE_EXTENSION, QV2RAY_CONFIG_DIR + newName + QV2RAY_CONFIG_FILE_EXTENSION);
}
int StartPreparation(QJsonObject fullConfig)
@ -174,3 +286,4 @@ namespace Qv2ray
}
}
}
}

View File

@ -1,8 +1,10 @@
#include "QvCoreConfigOperations.h"
#include "QvCoreConfigOperations.hpp"
namespace Qv2ray
{
namespace ConfigOperations
{
namespace Generation
{
// Important config generation algorithms.
static const QStringList vLogLevels = {"none", "debug", "info", "warning", "error"};
@ -84,6 +86,8 @@ namespace Qv2ray
if (withLocalhost) {
// https://github.com/lhy0403/Qv2ray/issues/64
// The fix patch didn't touch this line below.
//
// Should we APPEND localhost or PUSH_FRONT localhost?
servers.append("localhost");
}
@ -179,27 +183,26 @@ namespace Qv2ray
//
QStringList dnsList;
foreach (auto str, gConf.dnsList) {
foreach (auto str, gConf.connectionConfig.dnsList) {
dnsList.append(QString::fromStdString(str));
}
auto dnsObject = GenerateDNS(gConf.withLocalDNS, dnsList);
auto dnsObject = GenerateDNS(gConf.connectionConfig.withLocalDNS, dnsList);
root.insert("dns", dnsObject);
//
//
//
QJsonArray inboundsList;
// HTTP InBound
if (gConf.inBoundSettings.http_port != 0) {
if (gConf.inboundConfig.http_port != 0) {
QJsonObject httpInBoundObject;
httpInBoundObject.insert("listen", QString::fromStdString(gConf.inBoundSettings.listenip));
httpInBoundObject.insert("port", gConf.inBoundSettings.http_port);
httpInBoundObject.insert("listen", QString::fromStdString(gConf.inboundConfig.listenip));
httpInBoundObject.insert("port", gConf.inboundConfig.http_port);
httpInBoundObject.insert("protocol", "http");
httpInBoundObject.insert("tag", "http_IN");
if (gConf.inBoundSettings.http_useAuth) {
auto httpInSettings = GenerateHTTPIN(QList<AccountObject>() << gConf.inBoundSettings.httpAccount);
if (gConf.inboundConfig.http_useAuth) {
auto httpInSettings = GenerateHTTPIN(QList<AccountObject>() << gConf.inboundConfig.httpAccount);
httpInBoundObject.insert("settings", httpInSettings);
}
@ -207,16 +210,16 @@ namespace Qv2ray
}
// SOCKS InBound
if (gConf.inBoundSettings.socks_port != 0) {
if (gConf.inboundConfig.socks_port != 0) {
QJsonObject socksInBoundObject;
socksInBoundObject.insert("listen", QString::fromStdString(gConf.inBoundSettings.listenip));
socksInBoundObject.insert("port", gConf.inBoundSettings.socks_port);
socksInBoundObject.insert("listen", QString::fromStdString(gConf.inboundConfig.listenip));
socksInBoundObject.insert("port", gConf.inboundConfig.socks_port);
socksInBoundObject.insert("protocol", "socks");
socksInBoundObject.insert("tag", "socks_IN");
auto socksInSettings = GenerateSocksIN(gConf.inBoundSettings.socks_useAuth ? "password" : "noauth",
QList<AccountObject>() << gConf.inBoundSettings.socksAccount,
gConf.inBoundSettings.socksUDP,
QSTRING(gConf.inBoundSettings.socksLocalIP));
auto socksInSettings = GenerateSocksIN(gConf.inboundConfig.socks_useAuth ? "password" : "noauth",
QList<AccountObject>() << gConf.inboundConfig.socksAccount,
gConf.inboundConfig.socksUDP,
QSTRING(gConf.inboundConfig.socksLocalIP));
socksInBoundObject.insert("settings", socksInSettings);
inboundsList.append(socksInBoundObject);
}
@ -227,27 +230,16 @@ namespace Qv2ray
// Note: The part below always makes the whole functionality in trouble......
// BE EXTREME CAREFUL when changing these code below...
// See: https://github.com/lhy0403/Qv2ray/issues/129
// routeCountLabel in Mainwindow makes here failed to ENOUGH-ly check the routing tables
bool isComplex = CheckIsComplexConfig(root);
// For SOME configs, there is no "route" entries, so, we add some...
if (!root.contains("routing")) {
if (root["outbounds"].toArray().count() != 1) {
// There are no ROUTING but 2 or more outbounds.... This is rare, but possible.
LOG(MODULE_CONNECTION, "WARN: This message usually indicates the config file has some logic errors:")
LOG(MODULE_CONNECTION, "WARN: --> The config file has NO routing section, however more than 1 outbounds are detected.")
}
LOG(MODULE_CONNECTION, "Current connection has NO ROUTING section, we insert default values.")
auto routeObject = GenerateRoutes(gConf.enableProxy, gConf.bypassCN);
root.insert("routing", routeObject);
QJsonArray outbounds = root["outbounds"].toArray();
outbounds.append(GenerateOutboundEntry("freedom", GenerateFreedomOUT("AsIs", ":0", 0), QJsonObject(), QJsonObject(), "0.0.0.0", OUTBOUND_TAG_DIRECT));
root["outbounds"] = outbounds;
} else {
// For some config files that has routing entries already.
// We don't add extra routings.
//
if (isComplex) { // For some config files that has routing entries already.
// We DO NOT add extra routings.
//
// HOWEVER, we need to verify the QV2RAY_RULE_ENABLED entry.
// And what's more, process (by removing unused items) from a rule object.
QJsonObject routing = root["routing"].toObject();
QJsonArray rules;
LOG(MODULE_CONNECTION, "Processing an existing routing table.")
@ -255,6 +247,19 @@ namespace Qv2ray
for (auto _a : routing["rules"].toArray()) {
auto _b = _a.toObject();
if (_b.contains("QV2RAY_RULE_USE_BALANCER")) {
if (_b["QV2RAY_RULE_USE_BALANCER"].toBool()) {
// We use balancer
_b.remove("outboundTag");
} else {
// We only use the normal outbound
_b.remove("balancerTag");
}
} else {
LOG(MODULE_CONFIG, "We found a rule without QV2RAY_RULE_USE_BALANCER, and we didn't process it.")
}
// If this entry has been disabled.
if (_b.contains("QV2RAY_RULE_ENABLED") && _b["QV2RAY_RULE_ENABLED"].toBool() == true) {
rules.append(_b);
} else {
@ -264,31 +269,47 @@ namespace Qv2ray
routing["rules"] = rules;
root["routing"] = routing;
} else {
//
LOG(MODULE_CONNECTION, "Current connection has NO ROUTING section, we insert default values.")
if (root["outbounds"].toArray().count() != 1) {
// There are no ROUTING but 2 or more outbounds.... This is rare, but possible.
LOG(MODULE_CONNECTION, "WARN: This message usually indicates the config file has logic errors:")
LOG(MODULE_CONNECTION, "WARN: --> The config file has NO routing section, however more than 1 outbounds are detected.")
}
auto routeObject = GenerateRoutes(gConf.connectionConfig.enableProxy, gConf.connectionConfig.bypassCN);
root.insert("routing", routeObject);
QJsonArray outbounds = root["outbounds"].toArray();
outbounds.append(GenerateOutboundEntry("freedom", GenerateFreedomOUT("AsIs", ":0", 0), QJsonObject(), QJsonObject(), "0.0.0.0", OUTBOUND_TAG_DIRECT));
root["outbounds"] = outbounds;
}
// Let's process some api features.
if (gConf.enableStats) {
if (gConf.connectionConfig.enableStats) {
//
// Stats
{
//
root.insert("stats", QJsonObject());
}
//
// Routes
{
//
QJsonObject routing = root["routing"].toObject();
QJsonArray routingRules = routing["rules"].toArray();
QJsonObject APIRouteRoot;
APIRouteRoot["type"] = "field";
APIRouteRoot["outboundTag"] = API_TAG_DEFAULT;
APIRouteRoot["outboundTag"] = QV2RAY_API_TAG_DEFAULT;
QJsonArray inboundTag;
inboundTag.append(API_TAG_INBOUND);
inboundTag.append(QV2RAY_API_TAG_INBOUND);
APIRouteRoot["inboundTag"] = inboundTag;
// Add this to root.
routingRules.push_front(APIRouteRoot);
routing["rules"] = routingRules;
root["routing"] = routing;
}
//
// Policy
{
//
QJsonObject policyRoot = root.contains("policy") ? root["policy"].toObject() : QJsonObject();
QJsonObject systemPolicy = policyRoot.contains("system") ? policyRoot["system"].toObject() : QJsonObject();
systemPolicy["statsInboundUplink"] = true;
@ -296,23 +317,24 @@ namespace Qv2ray
policyRoot["system"] = systemPolicy;
// Add this to root.
root["policy"] = policyRoot;
}
//
// Inbounds
{
//
QJsonArray inbounds = root["inbounds"].toArray();
QJsonObject fakeDocodemoDoor;
fakeDocodemoDoor["address"] = "127.0.0.1";
QJsonObject apiInboundsRoot = GenerateInboundEntry("127.0.0.1", gConf.statsPort, "dokodemo-door", fakeDocodemoDoor, API_TAG_INBOUND);
QJsonObject apiInboundsRoot = GenerateInboundEntry("127.0.0.1", gConf.connectionConfig.statsPort, "dokodemo-door", fakeDocodemoDoor, QV2RAY_API_TAG_INBOUND);
inbounds.push_front(apiInboundsRoot);
root["inbounds"] = inbounds;
}
//
// API
{
root["api"] = GenerateAPIEntry(API_TAG_DEFAULT);
}
//
root["api"] = GenerateAPIEntry(QV2RAY_API_TAG_DEFAULT);
//
}
return root;
}
}
}
}

View File

@ -1,52 +0,0 @@
#include "QvCoreConfigOperations.h"
#include "QvUtils.h"
namespace Qv2ray
{
namespace ConfigOperations
{
// -------------------------- BEGIN CONFIG VALIDATIONS ----------------------------------------------------------------------------
int VerifyVMessProtocolString(QString vmess)
{
if (!vmess.toLower().startsWith("vmess://")) {
return -1;
}
try {
QStringRef vmessJsonB64(&vmess, 8, vmess.length() - 8);
auto vmessString = Base64Decode(vmessJsonB64.toString());
auto vmessConf = JsonFromString(vmessString);
// C is a quick hack...
#define C(k) vmessConf.contains(k)
bool flag = true;
flag = flag && C("id");
flag = flag && C("aid");
flag = flag && C("port");
flag = flag && C("add");
// Stream Settings
auto net = C("net") ? vmessConf["net"].toString() : "tcp";
if (net == "http" || net == "ws")
flag = flag && C("host") && C("path");
else if (net == "domainsocket")
flag = flag && C("path");
else if (net == "quic")
flag = flag && C("host") && C("type") && C("path");
#undef C
return flag ? 0 : 1;
} catch (exception *e) {
LOG(MODULE_CONNECTION_VMESS, "Failed to decode vmess string: " << e->what())
return -2;
}
}
QString GetVmessFromBase64OrPlain(QByteArray arr)
{
// Fine this is just a hack due to some EXTREMELY strange proxy providers.
auto result = QString::fromUtf8(arr).trimmed();
return result.startsWith("vmess://") ? result : Base64Decode(result);
}
}
}

View File

@ -1,159 +0,0 @@
#include <QObject>
#include <QWidget>
#include <QDesktopServices>
#include "QvCoreInteractions.h"
#include "QvCoreConfigOperations.h"
#include "QvTinyLog.h"
#include "w_MainWindow.h"
namespace Qv2ray
{
bool Qv2Instance::ValidateConfig(const QString *path)
{
if (ValidateKernal()) {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("V2RAY_LOCATION_ASSET", QString::fromStdString(GetGlobalConfig().v2AssetsPath));
QProcess process;
process.setProcessEnvironment(env);
process.start(QSTRING(GetGlobalConfig().v2CorePath), QStringList() << "-test" << "-config" << *path, QIODevice::ReadWrite | QIODevice::Text);
if (!process.waitForFinished()) {
LOG(MODULE_VCORE, "v2ray core failed with exitcode: " << process.exitCode())
return false;
}
QString output = QString(process.readAllStandardOutput());
if (process.exitCode() != 0) {
Utils::QvMessageBox(nullptr, QObject::tr("Configuration Error"), output.mid(output.indexOf("anti-censorship.") + 17));
return false;
}
return true;
}
return false;
}
Qv2Instance::Qv2Instance(QWidget *parent)
{
auto proc = new QProcess();
vProcess = proc;
QObject::connect(vProcess, &QProcess::readyReadStandardOutput, static_cast<MainWindow *>(parent), &MainWindow::UpdateLog);
VCoreStatus = STOPPED;
}
void Qv2Instance::SetAPIPort(int port)
{
// Config API
this->port = port;
Channel = grpc::CreateChannel("127.0.0.1:" + to_string(port), grpc::InsecureChannelCredentials());
StatsService service;
Stub = service.NewStub(Channel);
}
QString Qv2Instance::ReadProcessOutput()
{
return vProcess->readAllStandardOutput();
}
bool Qv2Instance::ValidateKernal()
{
if (!QFile::exists(QSTRING(GetGlobalConfig().v2CorePath))) {
Utils::QvMessageBox(nullptr, QObject::tr("Cannot start v2ray"),
QObject::tr("v2ray core file cannot be found at:") + NEWLINE +
QSTRING(GetGlobalConfig().v2CorePath) + NEWLINE + NEWLINE +
QObject::tr("Please go to prefrence window to change the location.") + NEWLINE +
QObject::tr("Or put v2ray core file in the location above."));
return false;
} else return true;
}
bool Qv2Instance::StartVCore()
{
if (VCoreStatus != STOPPED) {
return false;
}
VCoreStatus = STARTING;
if (ValidateKernal()) {
auto filePath = QV2RAY_GENERATED_FILE_PATH;
if (ValidateConfig(&filePath)) {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("V2RAY_LOCATION_ASSET", QSTRING(GetGlobalConfig().v2AssetsPath));
vProcess->setProcessEnvironment(env);
vProcess->start(QSTRING(GetGlobalConfig().v2CorePath), QStringList() << "-config" << filePath, QIODevice::ReadWrite | QIODevice::Text);
vProcess->waitForStarted();
VCoreStatus = STARTED;
return true;
} else {
VCoreStatus = STOPPED;
return false;
}
} else {
VCoreStatus = STOPPED;
return false;
}
}
void Qv2Instance::StopVCore()
{
vProcess->close();
totalDataTransfered = QMap<QString, long>();
dataTransferSpeed = QMap<QString, long>();
VCoreStatus = STOPPED;
}
Qv2Instance::~Qv2Instance()
{
StopVCore();
delete vProcess;
}
long Qv2Instance::CallStatsAPIByName(QString name)
{
GetStatsRequest request;
request.set_name(name.toStdString());
request.set_reset(false);
GetStatsResponse response;
ClientContext context;
Status status = Stub->GetStats(&context, request, &response);
if (!status.ok()) {
LOG(MODULE_VCORE, "API call returns: " + to_string(status.error_code()))
}
return response.stat().value();
}
long Qv2Instance::getTagLastUplink(QString tag)
{
auto val = CallStatsAPIByName("inbound>>>" + tag + ">>>traffic>>>uplink");
auto data = val - totalDataTransfered[tag + "_up"];
totalDataTransfered[tag + "_up"] = val;
dataTransferSpeed[tag + "_up"] = data;
return data;
}
long Qv2Instance::getTagLastDownlink(QString tag)
{
auto val = CallStatsAPIByName("inbound>>>" + tag + ">>>traffic>>>downlink");
auto data = val - totalDataTransfered[tag + "_down"];
totalDataTransfered[tag + "_down"] = val;
dataTransferSpeed[tag + "_down"] = data;
return data;
}
long Qv2Instance::getTagTotalUplink(QString tag)
{
return totalDataTransfered[tag + "_up"];
}
long Qv2Instance::getTagTotalDownlink(QString tag)
{
return totalDataTransfered[tag + "_down"];
}
}

View File

@ -1,58 +0,0 @@
#ifndef VINTERACT_H
#define VINTERACT_H
#include <QProcess>
#include <QString>
#include "Qv2rayBase.h"
#include <grpc++/grpc++.h>
#include "QvUtils.h"
#include "v2ray_api_commands.pb.h"
#include "v2ray_api_commands.grpc.pb.h"
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using namespace std;
using namespace v2ray::core::app::stats::command;
namespace Qv2ray
{
namespace QvInteration
{
enum V2RAY_INSTANCE_STARTUP_STATUS {
STOPPED,
STARTING,
STARTED
};
class Qv2Instance
{
public:
explicit Qv2Instance(QWidget *parent = nullptr);
void SetAPIPort(int port);
long getTagTotalDownlink(QString tag);
long getTagTotalUplink(QString tag);
long getTagLastDownlink(QString tag);
long getTagLastUplink(QString tag);
bool StartVCore();
void StopVCore();
V2RAY_INSTANCE_STARTUP_STATUS VCoreStatus;
static bool ValidateConfig(const QString *path);
static bool ValidateKernal();
QString ReadProcessOutput();
~Qv2Instance();
QMap<QString, long> totalDataTransfered;
QMap<QString, long> dataTransferSpeed;
private:
long CallStatsAPIByName(QString name);
QProcess *vProcess;
std::shared_ptr<::grpc::Channel> Channel;
std::unique_ptr<StatsService::Stub> Stub;
int port;
};
}
}
using namespace Qv2ray::QvInteration;
#endif // VINTERACT_H

View File

@ -1,4 +1,4 @@
#include "QvUtils.h"
#include "QvUtils.hpp"
#include <QTextStream>
namespace Qv2ray
@ -21,8 +21,9 @@ namespace Qv2ray
QString randomString;
for (int i = 0; i < len; ++i) {
int index = qrand() % possibleCharacters.length();
QChar nextChar = possibleCharacters.at(index);
uint rand = QRandomGenerator::system()->generate();
uint max = static_cast<uint>(possibleCharacters.length());
QChar nextChar = possibleCharacters[rand % max];
randomString.append(nextChar);
}
@ -104,18 +105,18 @@ namespace Qv2ray
return JsonFromString(json);
}
QString JsonToString(QJsonObject json)
QString JsonToString(QJsonObject json, QJsonDocument::JsonFormat format)
{
QJsonDocument doc;
doc.setObject(json);
return doc.toJson();
return doc.toJson(format);
}
QString JsonToString(QJsonArray array)
QString JsonToString(QJsonArray array, QJsonDocument::JsonFormat format)
{
QJsonDocument doc;
doc.setArray(array);
return doc.toJson();
return doc.toJson(format);
}
QString VerifyJsonString(const QString *source)
@ -140,15 +141,13 @@ namespace Qv2ray
QString Base64Encode(QString string)
{
QByteArray ba;
ba.append(string);
QByteArray ba = string.toUtf8();
return ba.toBase64();
}
QString Base64Decode(QString string)
{
QByteArray ba;
ba.append(string);
QByteArray ba = string.toUtf8();
return QString(QByteArray::fromBase64(ba));
}
@ -178,14 +177,14 @@ namespace Qv2ray
file.close();
}
QStringList getFileList(QDir dir)
QStringList GetFileList(QDir dir)
{
return dir.entryList(QStringList() << "*" << "*.*", QDir::Hidden | QDir::Files);
}
bool CheckFile(QDir dir, QString fileName)
{
return getFileList(dir).indexOf(fileName) >= 0;
return GetFileList(dir).indexOf(fileName) >= 0;
}
void QvMessageBox(QWidget *parent, QString title, QString text)
@ -213,11 +212,34 @@ namespace Qv2ray
}
QTranslator *getTranslator(const QString *lang)
QTranslator *getTranslator(const QString &lang)
{
QTranslator *translator = new QTranslator();
translator->load(*lang + ".qm", ":/translations/");
translator->load(lang + ".qm", ":/translations/");
return translator;
}
/// This returns a file name without extensions.
void DeducePossibleFileName(const QString &baseDir, QString *fileName, const QString &extension)
{
int i = 1;
if (!QDir(baseDir).exists()) {
QDir(baseDir).mkpath(baseDir);
LOG(MODULE_FILE, "Making path: " + baseDir.toStdString())
}
while (true) {
if (!QFile(baseDir + "/" + fileName + "_" + QString::number(i) + extension).exists()) {
*fileName = *fileName + "_" + QString::number(i);
return;
} else {
//LOG(MODULE_FILE, "File with name: " << (fileName + "_" + QString::number(i) + extension).toStdString() << " already exists")
}
i++;
}
}
}
}

View File

@ -1,7 +1,7 @@
#ifndef UTILS_H
#ifndef UTILS_H
#define UTILS_H
#include "Qv2rayBase.h"
#include "Qv2rayBase.hpp"
#include <QMessageBox>
#include <QUuid>
@ -9,9 +9,9 @@ namespace Qv2ray
{
namespace Utils
{
QTranslator *getTranslator(const QString *lang);
QTranslator *getTranslator(const QString &lang);
QStringList getFileList(QDir dir);
QStringList GetFileList(QDir dir);
QString Base64Encode(QString string);
QString Base64Decode(QString string);
@ -37,8 +37,8 @@ namespace Qv2ray
bool StringToFile(const QString *text, QFile *target);
//
QJsonObject JsonFromString(QString string);
QString JsonToString(QJsonObject json);
QString JsonToString(QJsonArray array);
QString JsonToString(QJsonObject json, QJsonDocument::JsonFormat format = QJsonDocument::JsonFormat::Indented);
QString JsonToString(QJsonArray array, QJsonDocument::JsonFormat format = QJsonDocument::JsonFormat::Indented);
//
QString VerifyJsonString(const QString *source);
//
@ -60,7 +60,20 @@ namespace Qv2ray
X::loadjson(str.toStdString(), v, false);
return v;
}
//
// Misc
template<typename T>
QJsonObject GetRootObject(T t)
{
auto json = StructToJsonString(t);
QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(json.toStdString()));
return doc.object();
}
template QJsonObject GetRootObject<RuleObject>(RuleObject t);
template QJsonObject GetRootObject<StreamSettingsObject>(StreamSettingsObject t);
template QJsonObject GetRootObject<VMessServerObject>(VMessServerObject t);
//
//
template <typename T>
void RemoveItem(std::vector<T> &vec, size_t pos)
{
@ -70,6 +83,10 @@ namespace Qv2ray
}
QString FormatBytes(long long bytes);
void DeducePossibleFileName(const QString &baseDir, QString *fileName, const QString &extension);
//
//
QString ConvertGFWToPAC(const QString &rawContent, const QString &customProxyString);
}
}

View File

@ -0,0 +1,3 @@
#include "QvComponentsHandler.hpp"

View File

@ -0,0 +1,14 @@
#ifndef QVCOMPONENTSHANDLER_H
#define QVCOMPONENTSHANDLER_H
#include "QvUtils.hpp"
namespace Qv2ray
{
namespace Components
{
// TODO
}
}
using namespace Qv2ray::Components;
#endif // QVCOMPONENTSHANDLER_H

View File

@ -0,0 +1,189 @@
#include <QObject>
#include <QWidget>
#include <QDesktopServices>
#include "QvCoreInteractions.hpp"
#include "QvCoreConfigOperations.hpp"
#include "QvTinyLog.hpp"
#include "w_MainWindow.hpp"
using namespace v2ray::core::app::stats::command;
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
// Check 20 times before telling user that API has failed.
#define QV2RAY_API_CALL_FAILEDCHECK_THRESHOLD 10
namespace Qv2ray
{
namespace QvCoreInteration
{
bool ConnectionInstance::ValidateConfig(const QString &path)
{
if (ValidateKernal()) {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("V2RAY_LOCATION_ASSET", QString::fromStdString(GetGlobalConfig().v2AssetsPath));
QProcess process;
process.setProcessEnvironment(env);
process.start(QSTRING(GetGlobalConfig().v2CorePath), QStringList() << "-test" << "-config" << path, QIODevice::ReadWrite | QIODevice::Text);
if (!process.waitForFinished()) {
LOG(MODULE_VCORE, "v2ray core failed with exitcode: " << process.exitCode())
return false;
}
QString output = QString(process.readAllStandardOutput());
if (process.exitCode() != 0) {
Utils::QvMessageBox(nullptr, tr("Configuration Error"), output.mid(output.indexOf("anti-censorship.") + 17));
return false;
}
return true;
}
return false;
}
ConnectionInstance::ConnectionInstance(QWidget *parent) : apiFailedCounter(0), port(0)
{
auto proc = new QProcess();
vProcess = proc;
connect(vProcess, &QProcess::readyReadStandardOutput, static_cast<MainWindow *>(parent), &MainWindow::UpdateLog);
ConnectionStatus = STOPPED;
}
void ConnectionInstance::SetAPIPort(int port)
{
// Config API
this->port = port;
Channel = grpc::CreateChannel("127.0.0.1:" + to_string(port), grpc::InsecureChannelCredentials());
StatsService service;
Stub = service.NewStub(Channel);
}
QString ConnectionInstance::ReadProcessOutput()
{
return vProcess->readAllStandardOutput();
}
bool ConnectionInstance::ValidateKernal()
{
if (!QFile::exists(QSTRING(GetGlobalConfig().v2CorePath))) {
Utils::QvMessageBox(nullptr, tr("Cannot start v2ray"),
tr("v2ray core file cannot be found at:") + NEWLINE +
QSTRING(GetGlobalConfig().v2CorePath) + NEWLINE + NEWLINE +
tr("Please go to prefrence window to change the location.") + NEWLINE +
tr("Or put v2ray core file in the location above."));
return false;
} else return true;
}
bool ConnectionInstance::StartV2rayCore()
{
if (ConnectionStatus != STOPPED) {
LOG(MODULE_VCORE, "Status is invalid, expect STOPPED when calling StartV2rayCore")
return false;
}
ConnectionStatus = STARTING;
if (ValidateKernal()) {
auto filePath = QV2RAY_GENERATED_FILE_PATH;
if (ValidateConfig(filePath)) {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("V2RAY_LOCATION_ASSET", QSTRING(GetGlobalConfig().v2AssetsPath));
vProcess->setProcessEnvironment(env);
vProcess->start(QSTRING(GetGlobalConfig().v2CorePath), QStringList() << "-config" << filePath, QIODevice::ReadWrite | QIODevice::Text);
vProcess->waitForStarted();
ConnectionStatus = STARTED;
return true;
} else {
ConnectionStatus = STOPPED;
return false;
}
} else {
ConnectionStatus = STOPPED;
return false;
}
}
void ConnectionInstance::StopV2rayCore()
{
vProcess->close();
apiFailedCounter = 0;
totalDataTransfered.clear();
dataTransferSpeed.clear();
ConnectionStatus = STOPPED;
}
ConnectionInstance::~ConnectionInstance()
{
StopV2rayCore();
delete vProcess;
}
long ConnectionInstance::CallStatsAPIByName(QString name)
{
if (ConnectionStatus != STARTED) {
LOG(MODULE_VCORE, "Invalid connection status when calling API")
return 0;
}
if (apiFailedCounter == QV2RAY_API_CALL_FAILEDCHECK_THRESHOLD) {
LOG(MODULE_VCORE, "API call failure threshold reached, cancelling further API aclls.")
QvMessageBox(nullptr, tr("API Call Failed"), tr("Failed to get statistics data, please check if v2ray is running properly"));
totalDataTransfered.clear();
dataTransferSpeed.clear();
apiFailedCounter++;
return 0;
} else if (apiFailedCounter > QV2RAY_API_CALL_FAILEDCHECK_THRESHOLD) {
return 0;
}
GetStatsRequest request;
request.set_name(name.toStdString());
request.set_reset(false);
GetStatsResponse response;
ClientContext context;
Status status = Stub->GetStats(&context, request, &response);
if (!status.ok()) {
LOG(MODULE_VCORE, "API call returns: " << status.error_code() << " (" << status.error_message() << ")")
apiFailedCounter++;
}
return response.stat().value();
}
long ConnectionInstance::getTagLastUplink(const QString &tag)
{
auto val = CallStatsAPIByName("inbound>>>" + tag + ">>>traffic>>>uplink");
auto data = val - totalDataTransfered[tag + "_up"];
totalDataTransfered[tag + "_up"] = val;
dataTransferSpeed[tag + "_up"] = data;
return data;
}
long ConnectionInstance::getTagLastDownlink(const QString &tag)
{
auto val = CallStatsAPIByName("inbound>>>" + tag + ">>>traffic>>>downlink");
auto data = val - totalDataTransfered[tag + "_down"];
totalDataTransfered[tag + "_down"] = val;
dataTransferSpeed[tag + "_down"] = data;
return data;
}
long ConnectionInstance::getTagTotalUplink(const QString &tag)
{
return totalDataTransfered[tag + "_up"];
}
long ConnectionInstance::getTagTotalDownlink(const QString &tag)
{
return totalDataTransfered[tag + "_down"];
}
}
}

View File

@ -0,0 +1,57 @@
#ifndef VINTERACT_H
#define VINTERACT_H
#include <QProcess>
#include <QString>
#include "Qv2rayBase.hpp"
#include <grpc++/grpc++.h>
#include "QvUtils.hpp"
#include "v2ray_api_commands.pb.h"
#include "v2ray_api_commands.grpc.pb.h"
namespace Qv2ray
{
namespace QvCoreInteration
{
enum QvInstanceStatus {
STOPPED,
STARTING,
STARTED
};
class ConnectionInstance : public QObject
{
Q_OBJECT
public:
explicit ConnectionInstance(QWidget *parent = nullptr);
void SetAPIPort(int port);
//
long getTagTotalDownlink(const QString &tag);
long getTagTotalUplink(const QString &tag);
long getTagLastDownlink(const QString &tag);
long getTagLastUplink(const QString &tag);
//
bool StartV2rayCore();
void StopV2rayCore();
QvInstanceStatus ConnectionStatus;
QString ReadProcessOutput();
//
static bool ValidateConfig(const QString &path);
static bool ValidateKernal();
~ConnectionInstance();
QMap<QString, long> totalDataTransfered;
QMap<QString, long> dataTransferSpeed;
private:
int apiFailedCounter;
long CallStatsAPIByName(QString name);
QProcess *vProcess;
std::shared_ptr<::grpc::Channel> Channel;
std::unique_ptr<::v2ray::core::app::stats::command::StatsService::Stub> Stub;
int port;
};
}
}
using namespace Qv2ray::QvCoreInteration;
#endif // VINTERACT_H

View File

@ -0,0 +1,132 @@
/* ORIGINAL LICENSE: Do What The F*ck You Want To Public License
* AUTHOR: LBYPatrick
*
* MODIFIED BY Leroy.H.Y @lhy0403 re-licenced under GPLv3
*/
#include "QvUtils.hpp"
namespace Qv2ray
{
namespace Utils
{
// Private function
string getRawDomain(string originLine)
{
size_t startPosition = 0;
size_t endPosition = originLine.size();
string returnBuffer;
bool skipRule1 = originLine.find("[") != string::npos; // [Auto xxxx...
bool skipRule2 = originLine.find("!") != string::npos; // Comments
bool skipRule3 = originLine.find("@") != string::npos; // Non-proxy Lines
bool skipRule4 = originLine.find("*") != string::npos;
bool passRule1 = originLine.find("|") != string::npos; // Proxy Lines
bool passRule2 = originLine.find(".") != string::npos; // Link-Contained Lines
if (originLine[endPosition] == '\n') {
endPosition -= 1;
}
if (originLine.find("http://") != string::npos) {
startPosition += 8;
} else if (originLine.find("https://") != string::npos) {
startPosition += 9;
}
// Skip unrelated lines
if (skipRule1 || skipRule2 || skipRule3 || skipRule4) {
return "";
} else if (passRule2) {
if (passRule1) {
startPosition += originLine.find_last_of("|") + 1;
}
if (originLine[startPosition] == '\n') startPosition += 1;
for (size_t i = startPosition; i < endPosition; ++i) {
returnBuffer += originLine[i];
}
}
return returnBuffer;
}
QString ConvertGFWToPAC(const QString &rawContent, const QString &customProxyString)
{
auto rawFileContent = Base64Decode(rawContent).toStdString();
string readBuffer = ""; //cleanup
string writeBuffer;
string domainListCache = "";
for (size_t i = 0; i < rawFileContent.size(); ++i) {
readBuffer += rawFileContent[i];
if (rawFileContent[i + 1] == '\n') {
writeBuffer = getRawDomain(readBuffer);
if (writeBuffer != "") {
domainListCache += writeBuffer + "\n";
}
readBuffer = "";
i += 1;
}
}
size_t rotatorTwo = 0;
string readDomainBuffer = "";
bool isFirstLine = true;
string outputContent = "";
//Header
outputContent += "var domains = {\n";
//Read and process output content line by line
while (rotatorTwo < domainListCache.size()) {
while (true) {
//Get Domain
readDomainBuffer += domainListCache[rotatorTwo];
if (domainListCache[rotatorTwo + 1] == '\n') {
rotatorTwo += 2;
break;
}
rotatorTwo++;
}
//Format
if (!isFirstLine) outputContent += ",\n";
else isFirstLine = false;
outputContent += "\t\"";
outputContent += readDomainBuffer;
outputContent += "\" : 1";
readDomainBuffer = "";
}
//End Message
outputContent += "\n\n};\n\n\n";
outputContent += "var proxy = \"";
outputContent += customProxyString.toStdString();
outputContent += "\";\n";
outputContent += "var direct = 'DIRECT;';\n";
outputContent += "var hasOwnProperty = Object.hasOwnProperty;\n\n";
outputContent += "function FindProxyForURL(url, host) {\n\n";
outputContent += "\tvar suffix;\n";
outputContent += "\tvar pos = host.lastIndexOf('.');\n";
outputContent += "\tpos = host.lastIndexOf('.', pos - 1);\n\n";
outputContent += "\twhile(1) {\n";
outputContent += "\t\tif (pos <= 0) {\n";
outputContent += "\t\t\tif (hasOwnProperty.call(domains, host)) ";
outputContent += "return proxy;\n";
outputContent += "\t\t\telse ";
outputContent += "return direct;\n";
outputContent += "\t\t}\n\n";
outputContent += "\tsuffix = host.substring(pos + 1);\n";
outputContent += "\tif (hasOwnProperty.call(domains, suffix))";
outputContent += "return proxy;\n";
outputContent += "\tpos = host.lastIndexOf('.', pos - 1);\n\t}\n}";
return QSTRING(outputContent);
}
}
}

View File

@ -0,0 +1,105 @@
#include "QvHTTPRequestHelper.hpp"
#include <QByteArray>
#include <QNetworkProxy>
namespace Qv2ray
{
QvHttpRequestHelper::QvHttpRequestHelper() : reply()
{
}
QvHttpRequestHelper::~QvHttpRequestHelper()
{
accessManager.disconnect();
}
bool QvHttpRequestHelper::setUrl(const QString &url)
{
QUrl qUrl = QUrl(url);
if (!qUrl.isValid()) {
LOG(MODULE_NETWORK, "Provided URL is invalid")
return false;
}
request.setUrl(qUrl);
return true;
}
void QvHttpRequestHelper::setHeader(const QByteArray &key, const QByteArray &value)
{
request.setRawHeader(key, value);
}
QByteArray QvHttpRequestHelper::syncget(const QString &url)
{
this->setUrl(url);
LOG(MODULE_NETWORK, "Using system proxy settings");
accessManager.setProxy(QNetworkProxyFactory::systemProxyForQuery().first());
reply = accessManager.get(request);
connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished);
//
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
// Data or timeout?
auto data = reply->readAll();
return data;
}
void QvHttpRequestHelper::get(const QString &url)
{
this->setUrl(url);
// request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
reply = accessManager.get(request);
connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished);
connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead);
}
//void QvHttpRequestHelper::post(const QString &url, const QByteArray &data)
//{
// this->setUrl(url);
// request.setRawHeader("Content-Type", "application/json");
// reply = accessManager.post(request, data);
// connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished);
// connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead);
//}
// void QvHttpRequestHelper::put(const QString &url, const QByteArray &data)
// {
// this->setUrl(url);
// request.setRawHeader("Content-Type", "application/json");
// reply = accessManager.put(request, data);
// connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished);
// connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead);
// }
// void QvHttpRequestHelper::del(const QString &url)
// {
// this->setUrl(url);
// request.setRawHeader("Content-Type", "application/json");
// reply = accessManager.deleteResource(request);
// connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished);
// connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead);
// }
// void QvHttpRequestHelper::login(const QString &url, const QByteArray &data)
// {
// this->setUrl(url);
// request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
// reply = accessManager.post(request, data);
// connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished);
// connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead);
// }
void QvHttpRequestHelper::onRequestFinished()
{
LOG(MODULE_NETWORK, "Network request errcode: " + to_string(reply->error()))
emit httpRequestFinished(this->data);
}
void QvHttpRequestHelper::onReadyRead()
{
this->data += reply->readAll();
}
}

View File

@ -1,5 +1,4 @@
/*
* Qv2ray
/*
Copyright (C) 2019 SoneWinstone (jianwenzhen@qq.com)
Copyright (C) 2019 Leroy.H.Y
@ -24,7 +23,7 @@
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include "QvUtils.h"
#include "QvUtils.hpp"
namespace Qv2ray
{
@ -39,13 +38,13 @@ namespace Qv2ray
// get
QByteArray syncget(const QString &url);
void get(const QString &url);
// insert
void post(const QString &url, const QByteArray &data);
// update
void put(const QString &url, const QByteArray &data);
// delete
void del(const QString &url);
void login(const QString &url, const QByteArray &data);
//// insert
//void post(const QString &url, const QByteArray &data);
//// update
//void put(const QString &url, const QByteArray &data);
//// delete
//void del(const QString &url);
//void login(const QString &url, const QByteArray &data);
signals:
void httpRequestFinished(QByteArray &data);

View File

@ -1,11 +1,10 @@
#ifndef QVNETSPEEDBARJSON_H
#define QVNETSPEEDBARJSON_H
#include "x2struct/x2struct.hpp"
#include <QtGui>
#include "Qv2rayBase.hpp"
//
// For Windows
#ifdef _WIN32
#ifdef Q_OS_WIN
#include <windows.h>
#endif
//
@ -14,7 +13,7 @@
//
namespace Qv2ray
{
namespace Utils
namespace Components
{
namespace NetSpeedPlugin
{
@ -40,14 +39,14 @@ namespace Qv2ray
};
void StartProcessingPlugins(QWidget *mainWindow);
void StopProcessingPlugins();
#ifdef _WIN32
#ifdef Q_OS_WIN
namespace _win
{
void StartNamedPipeThread();
void KillNamedPipeThread();
}
#endif
#ifdef __linux__
#ifdef Q_OS_LINUX
namespace _linux
{
// This function is called within a QThread
@ -58,40 +57,6 @@ namespace Qv2ray
}
#endif
struct QvBarLine {
std::string Family;
bool Bold;
bool Italic;
int ColorA;
int ColorR;
int ColorG;
int ColorB;
int ContentType;
double Size;
std::string Message;
QvBarLine()
: Family("Consolas")
, Bold(true)
, Italic(false)
, ColorA(255), ColorR(255), ColorG(255), ColorB(255)
, ContentType(0)
, Size(9),
Message() { }
XTOSTRUCT(O(Bold, Italic, ColorA, ColorR, ColorG, ColorB, Size, Family, Message, ContentType))
};
struct QvBarPage {
int OffsetYpx;
std::vector<QvBarLine> Lines;
XTOSTRUCT(O(OffsetYpx, Lines))
QvBarPage() : OffsetYpx(5) { }
};
struct QvNetSpeedBarConfig {
std::vector<QvBarPage> Pages;
XTOSTRUCT(O(Pages))
};
QString GetAnswerToRequest(const QString &pchRequest);
}
@ -102,5 +67,5 @@ namespace Qv2ray
//
//
using namespace Qv2ray::Utils::NetSpeedPlugin;
using namespace Qv2ray::Components::NetSpeedPlugin;
#endif // QVNETSPEEDBARJSON_H

View File

@ -0,0 +1,77 @@
#include "QvPACHandler.hpp"
#include "qhttprequest.h"
#include "qhttpresponse.h"
namespace Qv2ray
{
namespace Components
{
PACHandler::PACHandler() : QObject()
{
pacServer = new QHttpServer();
connect(pacServer, &QHttpServer::newRequest, this, &PACHandler::onNewRequest);
}
PACHandler::~PACHandler()
{
pacServer->close();
delete pacServer;
}
void PACHandler::SetProxyString(const QString &proxyString)
{
this->proxyString = proxyString;
}
void PACHandler::StartListen()
{
LOG(MODULE_PROXY, "Starting PAC listener")
pacServer = new QHttpServer();
connect(pacServer, &QHttpServer::newRequest, this, &PACHandler::onNewRequest);
//
auto conf = GetGlobalConfig();
auto address = QSTRING(conf.inboundConfig.listenip);
auto port = conf.inboundConfig.pacConfig.port;
//
QString gfwContent = StringFromFile(new QFile(QV2RAY_RULES_GFWLIST_PATH));
pacContent = ConvertGFWToPAC(gfwContent, proxyString);
//
auto result = pacServer->listen(QHostAddress(address), static_cast<ushort>(port));
if (result) {
isStarted = true;
LOG(MODULE_PROXY, "Started PAC listener")
} else {
LOG(MODULE_PROXY, "Failed to listen on port " + to_string(port) + ", please verify the permission.")
QvMessageBox(nullptr, tr("PAC Handler"), tr("Failed to listen PAC request on this port, please verify the permissions"));
}
}
void PACHandler::StopServer()
{
if (isStarted) {
pacServer->close();
delete pacServer;
isStarted = false;
}
}
void PACHandler::onNewRequest(QHttpRequest *req, QHttpResponse *rsp)
{
rsp->setHeader("Server", "Qv2ray/" QV2RAY_VERSION_STRING " PAC_Handler");
if (req->method() == QHttpRequest::HTTP_GET) {
//
if (req->path() == "/pac") {
rsp->setHeader("Content-Type", "application/javascript; charset=utf-8");
rsp->writeHead(QHttpResponse::StatusCode::STATUS_OK);
rsp->end(pacContent.toUtf8());
DEBUG(MODULE_PROXY, "Serving a pac file...")
} else {
rsp->writeHead(QHttpResponse::StatusCode::STATUS_NOT_FOUND);
rsp->end("NOT FOUND");
}
} else {
rsp->writeHead(QHttpResponse::StatusCode::STATUS_METHOD_NOT_ALLOWED);
rsp->end("PAC ONLY SUPPORT GET");
}
}
}
}

View File

@ -0,0 +1,35 @@
#ifndef QVPACHANDLER_H
#define QVPACHANDLER_H
#include "QvUtils.hpp"
#include "qhttpserver.h"
#include <QObject>
namespace Qv2ray
{
namespace Components
{
class PACHandler : public QObject
{
Q_OBJECT
public:
explicit PACHandler();
~PACHandler();
void SetProxyString(const QString &proxyString);
void StartListen();
void StopServer();
QString gfwFilePath;
public slots:
void onNewRequest(QHttpRequest *request, QHttpResponse *response);
private:
bool isStarted;
QHttpServer *pacServer;
QString pacContent;
QString proxyString;
};
}
}
using namespace Qv2ray::Components;
#endif // QVPACHANDLER_H

View File

@ -0,0 +1,223 @@
#include "QvSystemProxyConfigurator.hpp"
#ifdef Q_OS_WIN
#include "wininet.h"
#include <windows.h>
#endif
namespace Qv2ray
{
namespace Components
{
#ifdef Q_OS_WIN
#define NO_CONST(expr) const_cast<wchar_t *>(expr)
//static auto DEFAULT_CONNECTION_NAME = NO_CONST(L"DefaultConnectionSettings");
///
/// INTERNAL FUNCTION
bool __QueryProxyOptions()
{
INTERNET_PER_CONN_OPTION_LIST List;
INTERNET_PER_CONN_OPTION Option[5];
//
unsigned long nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
Option[1].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
Option[2].dwOption = INTERNET_PER_CONN_FLAGS;
Option[3].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
Option[4].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
//
List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = nullptr;// NO_CONST(DEFAULT_CONNECTION_NAME);
List.dwOptionCount = 5;
List.dwOptionError = 0;
List.pOptions = Option;
if (!InternetQueryOption(nullptr, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
LOG(MODULE_PROXY, "InternetQueryOption failed: " << GetLastError());
LOG(MODULE_PROXY, "System default proxy info:")
if (Option[0].Value.pszValue != nullptr)
LOG(MODULE_PROXY, QString::fromWCharArray(Option[0].Value.pszValue).toStdString());
if ((Option[2].Value.dwValue & PROXY_TYPE_AUTO_PROXY_URL) == PROXY_TYPE_AUTO_PROXY_URL)
LOG(MODULE_PROXY, "PROXY_TYPE_AUTO_PROXY_URL");
if ((Option[2].Value.dwValue & PROXY_TYPE_AUTO_DETECT) == PROXY_TYPE_AUTO_DETECT)
LOG(MODULE_PROXY, "PROXY_TYPE_AUTO_DETECT");
if ((Option[2].Value.dwValue & PROXY_TYPE_DIRECT) == PROXY_TYPE_DIRECT)
LOG(MODULE_PROXY, "PROXY_TYPE_DIRECT");
if ((Option[2].Value.dwValue & PROXY_TYPE_PROXY) == PROXY_TYPE_PROXY)
LOG(MODULE_PROXY, "PROXY_TYPE_PROXY");
if (!InternetQueryOption(nullptr, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
LOG(MODULE_PROXY, "InternetQueryOption failed: " << GetLastError());
if (Option[4].Value.pszValue != nullptr)
LOG(MODULE_PROXY, Option[4].Value.pszValue);
INTERNET_VERSION_INFO Version;
nSize = sizeof(INTERNET_VERSION_INFO);
InternetQueryOption(nullptr, INTERNET_OPTION_VERSION, &Version, &nSize);
if (Option[0].Value.pszValue != nullptr)
GlobalFree(Option[0].Value.pszValue);
if (Option[3].Value.pszValue != nullptr)
GlobalFree(Option[3].Value.pszValue);
if (Option[4].Value.pszValue != nullptr)
GlobalFree(Option[4].Value.pszValue);
return false;
}
bool __SetProxyOptions(LPWSTR proxy_full_addr, bool isPAC)
{
INTERNET_PER_CONN_OPTION_LIST list;
BOOL bReturn;
DWORD dwBufSize = sizeof(list);
// Fill the list structure.
list.dwSize = sizeof(list);
// NULL == LAN, otherwise connectoid name.
list.pszConnection = nullptr;
if (isPAC) {
LOG(MODULE_PROXY, "Setting system proxy for PAC")
//
list.dwOptionCount = 2;
list.pOptions = new INTERNET_PER_CONN_OPTION[2];
// Ensure that the memory was allocated.
if (nullptr == list.pOptions) {
// Return FALSE if the memory wasn't allocated.
return FALSE;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_AUTO_PROXY_URL;
// Set proxy name.
list.pOptions[1].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
list.pOptions[1].Value.pszValue = proxy_full_addr;
} else {
LOG(MODULE_PROXY, "Setting system proxy for Global Proxy")
//
list.dwOptionCount = 3;
list.pOptions = new INTERNET_PER_CONN_OPTION[3];
if (nullptr == list.pOptions) {
return false;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
// Set proxy name.
list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
list.pOptions[1].Value.pszValue = proxy_full_addr;
// Set proxy override.
list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
auto localhost = L"localhost";
list.pOptions[2].Value.pszValue = NO_CONST(localhost);
}
// Set the options on the connection.
bReturn = InternetSetOption(nullptr, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
delete [] list.pOptions;
InternetSetOption(nullptr, INTERNET_OPTION_SETTINGS_CHANGED, nullptr, 0);
InternetSetOption(nullptr, INTERNET_OPTION_REFRESH, nullptr, 0);
return bReturn;
}
#endif
bool SetSystemProxy(const QString &address, int port, bool usePAC)
{
#ifdef Q_OS_WIN
QString __a;
if (usePAC) {
__a = address;
} else {
__a = "http://" + address + ":" + QString::number(port);
}
auto proxyStrW = new WCHAR[__a.length() + 1];
wcscpy(proxyStrW, __a.toStdWString().c_str());
//
__QueryProxyOptions();
if (!__SetProxyOptions(proxyStrW, usePAC)) {
LOG(MODULE_PROXY, "Failed to set proxy.")
return false;
}
__QueryProxyOptions();
return true;
#elif defined(Q_OS_LINUX)
bool result = true;
if (usePAC) {
result = result && QProcess::execute("gsettings set org.gnome.system.proxy mode 'auto'") == QProcess::NormalExit;
result = result && QProcess::execute("gsettings set org.gnome.system.proxy autoconfig-url '" + address + "'") == QProcess::NormalExit;
} else {
result = result && QProcess::execute("gsettings set org.gnome.system.proxy mode 'manual'") == QProcess::NormalExit;
result = result && QProcess::execute("gsettings set org.gnome.system.proxy.http host '" + address + "'") == QProcess::NormalExit;
result = result && QProcess::execute("gsettings set org.gnome.system.proxy.http port " + QString::number(port)) == QProcess::NormalExit;
}
if (!result) {
LOG(MODULE_PROXY, "Something wrong happens when setting system proxy -> Gnome ONLY.")
LOG(MODULE_PROXY, "If you are using KDE Plasma and receiving this message, just simply ignore this.")
}
return result;
#else
Q_UNUSED(port)
Q_UNUSED(address)
Q_UNUSED(usePAC)
return false;
#endif
}
bool ClearSystemProxy()
{
#ifdef Q_OS_WIN
LOG(MODULE_PROXY, "Cleaning system proxy settings.")
INTERNET_PER_CONN_OPTION_LIST list;
BOOL bReturn;
DWORD dwBufSize = sizeof(list);
// Fill out list struct.
list.dwSize = sizeof(list);
// nullptr == LAN, otherwise connectoid name.
list.pszConnection = nullptr;
// Set three options.
list.dwOptionCount = 1;
list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount];
// Make sure the memory was allocated.
if (nullptr == list.pOptions) {
// Return FALSE if the memory wasn't allocated.
LOG(MODULE_PROXY, "Failed to allocat memory in DisableConnectionProxy()");
return FALSE;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT;
//
// Set the options on the connection.
bReturn = InternetSetOption(nullptr, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
delete [] list.pOptions;
InternetSetOption(nullptr, INTERNET_OPTION_SETTINGS_CHANGED, nullptr, 0);
InternetSetOption(nullptr, INTERNET_OPTION_REFRESH, nullptr, 0);
return bReturn;
#elif defined(Q_OS_LINUX)
return QProcess::execute("gsettings set org.gnome.system.proxy mode 'none'") == QProcess::ExitStatus::NormalExit;
#else
return false;
#endif
}
}
}

View File

@ -0,0 +1,17 @@
#ifndef QVSYSTEMPROXYCONFIGURATOR_H
#define QVSYSTEMPROXYCONFIGURATOR_H
#include "QvUtils.hpp"
#include <QObject>
//
namespace Qv2ray
{
namespace Components
{
bool ClearSystemProxy();
bool SetSystemProxy(const QString &address, int port, bool usePAC);
}
}
using namespace Qv2ray::Components;
#endif // QVSYSTEMPROXYCONFIGURATOR_H

Some files were not shown because too many files have changed in this diff Show More