try to fix calls to qprocess:startdetached
This commit is contained in:
parent
dfbaf3601d
commit
ab68236cbc
@ -26,7 +26,7 @@
|
|||||||
<url type="donation">https://github.com/sponsors/martinrotter</url>
|
<url type="donation">https://github.com/sponsors/martinrotter</url>
|
||||||
<content_rating type="oars-1.1" />
|
<content_rating type="oars-1.1" />
|
||||||
<releases>
|
<releases>
|
||||||
<release version="4.2.3" date="2022-06-21"/>
|
<release version="4.2.3" date="2022-07-07"/>
|
||||||
</releases>
|
</releases>
|
||||||
<content_rating type="oars-1.0">
|
<content_rating type="oars-1.0">
|
||||||
<content_attribute id="violence-cartoon">none</content_attribute>
|
<content_attribute id="violence-cartoon">none</content_attribute>
|
||||||
|
@ -80,7 +80,7 @@ cd "$old_pwd"
|
|||||||
# Build application.
|
# Build application.
|
||||||
mkdir "rssguard-build"
|
mkdir "rssguard-build"
|
||||||
cd "rssguard-build"
|
cd "rssguard-build"
|
||||||
& "$cmake_path" ".." -G Ninja -DCMAKE_BUILD_TYPE="Release" -DBUILD_WITH_QT6="$with_qt6" -DREVISION_FROM_GIT=ON -DUSE_WEBENGINE="$webengine" -DFEEDLY_CLIENT_ID="$env:FEEDLY_CLIENT_ID" -DFEEDLY_CLIENT_SECRET="$env:FEEDLY_CLIENT_SECRET" -DGMAIL_CLIENT_ID="$env:GMAIL_CLIENT_ID" -DGMAIL_CLIENT_SECRET="$env:GMAIL_CLIENT_SECRET" -DINOREADER_CLIENT_ID="$env:INOREADER_CLIENT_ID" -DINOREADER_CLIENT_SECRET="$env:INOREADER_CLIENT_SECRET"
|
& "$cmake_path" ".." -G Ninja -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DBUILD_WITH_QT6="$with_qt6" -DREVISION_FROM_GIT=ON -DUSE_WEBENGINE="$webengine" -DFEEDLY_CLIENT_ID="$env:FEEDLY_CLIENT_ID" -DFEEDLY_CLIENT_SECRET="$env:FEEDLY_CLIENT_SECRET" -DGMAIL_CLIENT_ID="$env:GMAIL_CLIENT_ID" -DGMAIL_CLIENT_SECRET="$env:GMAIL_CLIENT_SECRET" -DINOREADER_CLIENT_ID="$env:INOREADER_CLIENT_ID" -DINOREADER_CLIENT_SECRET="$env:INOREADER_CLIENT_SECRET"
|
||||||
& "$cmake_path" --build .
|
& "$cmake_path" --build .
|
||||||
& "$cmake_path" --install . --prefix app
|
& "$cmake_path" --install . --prefix app
|
||||||
|
|
||||||
|
@ -6,306 +6,308 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
|
|
||||||
#define SERVICE_CODE_STD_RSS "std-rss"
|
#define SERVICE_CODE_STD_RSS "std-rss"
|
||||||
#define SERVICE_CODE_TT_RSS "tt-rss"
|
#define SERVICE_CODE_TT_RSS "tt-rss"
|
||||||
#define SERVICE_CODE_OWNCLOUD "owncloud"
|
#define SERVICE_CODE_OWNCLOUD "owncloud"
|
||||||
#define SERVICE_CODE_GREADER "greader"
|
#define SERVICE_CODE_GREADER "greader"
|
||||||
#define SERVICE_CODE_FEEDLY "feedly"
|
#define SERVICE_CODE_FEEDLY "feedly"
|
||||||
#define SERVICE_CODE_INOREADER "inoreader"
|
#define SERVICE_CODE_INOREADER "inoreader"
|
||||||
#define SERVICE_CODE_GMAIL "gmail"
|
#define SERVICE_CODE_GMAIL "gmail"
|
||||||
#define SERVICE_CODE_REDDIT "reddit"
|
#define SERVICE_CODE_REDDIT "reddit"
|
||||||
#define SERVICE_CODE_NEWSBLUR "newsblur"
|
#define SERVICE_CODE_NEWSBLUR "newsblur"
|
||||||
|
|
||||||
#define ADBLOCK_SERVER_PORT 48484
|
#define ADBLOCK_SERVER_PORT 48484
|
||||||
#define ADBLOCK_HOWTO "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#adbl"
|
#define ADBLOCK_HOWTO "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#adbl"
|
||||||
#define ADBLOCK_ICON_ACTIVE "adblock"
|
#define ADBLOCK_ICON_ACTIVE "adblock"
|
||||||
#define ADBLOCK_ICON_DISABLED "adblock-disabled"
|
#define ADBLOCK_ICON_DISABLED "adblock-disabled"
|
||||||
|
|
||||||
#define OAUTH_DECRYPTION_KEY 11451167756100761335ul
|
#define OAUTH_DECRYPTION_KEY 11451167756100761335ul
|
||||||
#define OAUTH_REDIRECT_URI "http://localhost"
|
#define OAUTH_REDIRECT_URI "http://localhost"
|
||||||
|
|
||||||
#define ENCLOSURES_OUTER_SEPARATOR '#'
|
#define ENCLOSURES_OUTER_SEPARATOR '#'
|
||||||
#define ECNLOSURES_INNER_SEPARATOR '&'
|
#define ECNLOSURES_INNER_SEPARATOR '&'
|
||||||
|
|
||||||
#define URI_SCHEME_FEED_SHORT "feed:"
|
#define URI_SCHEME_FEED_SHORT "feed:"
|
||||||
#define URI_SCHEME_FEED "feed://"
|
#define URI_SCHEME_FEED "feed://"
|
||||||
|
|
||||||
#define URI_SCHEME_HTTP_SHORT "http:"
|
#define URI_SCHEME_HTTP_SHORT "http:"
|
||||||
#define URI_SCHEME_HTTP "http://"
|
#define URI_SCHEME_HTTP "http://"
|
||||||
|
|
||||||
#define URI_SCHEME_HTTPS_SHORT "https:"
|
#define URI_SCHEME_HTTPS_SHORT "https:"
|
||||||
#define URI_SCHEME_HTTPS "https://"
|
#define URI_SCHEME_HTTPS "https://"
|
||||||
|
|
||||||
#define DEFAULT_LOCALE "en_US"
|
#define DEFAULT_LOCALE "en_US"
|
||||||
|
|
||||||
#define NO_PARENT_CATEGORY -1
|
#define NO_PARENT_CATEGORY -1
|
||||||
#define ID_RECYCLE_BIN -2
|
#define ID_RECYCLE_BIN -2
|
||||||
#define ID_IMPORTANT -3
|
#define ID_IMPORTANT -3
|
||||||
#define ID_LABELS -4
|
#define ID_LABELS -4
|
||||||
#define ID_UNREAD -5
|
#define ID_UNREAD -5
|
||||||
|
|
||||||
#define MSG_SCORE_MAX 100.0
|
#define MSG_SCORE_MAX 100.0
|
||||||
#define MSG_SCORE_MIN 0.0
|
#define MSG_SCORE_MIN 0.0
|
||||||
|
|
||||||
#define LOWER_TITLE_ROLE 64
|
#define LOWER_TITLE_ROLE 64
|
||||||
#define HIGHLIGHTED_FOREGROUND_TITLE_ROLE 128
|
#define HIGHLIGHTED_FOREGROUND_TITLE_ROLE 128
|
||||||
|
|
||||||
#define SOUNDS_BUILTIN_DIRECTORY ":/sounds"
|
#define SOUNDS_BUILTIN_DIRECTORY ":/sounds"
|
||||||
#define ARGUMENTS_LIST_SEPARATOR "\n"
|
#define ARGUMENTS_LIST_SEPARATOR "\n"
|
||||||
#define IS_IN_ARRAY(offset, \
|
#define IS_IN_ARRAY(offset, array) ((offset >= 0) && (offset < array.count()))
|
||||||
array) ((offset >= 0) && (offset < array.count()))
|
#define DEFAULT_SQL_MESSAGES_FILTER "0 > 1"
|
||||||
#define DEFAULT_SQL_MESSAGES_FILTER "0 > 1"
|
#define MAX_MULTICOLUMN_SORT_STATES 3
|
||||||
#define MAX_MULTICOLUMN_SORT_STATES 3
|
#define RELEASES_LIST "https://api.github.com/repos/martinrotter/rssguard/releases"
|
||||||
#define RELEASES_LIST "https://api.github.com/repos/martinrotter/rssguard/releases"
|
#define MSG_FILTERING_HELP "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#fltr"
|
||||||
#define MSG_FILTERING_HELP "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#fltr"
|
#define URL_REGEXP \
|
||||||
#define URL_REGEXP "^(http|https|feed|ftp):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$"
|
"^(http|https|feed|ftp):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/" \
|
||||||
#define SCRIPT_SOURCE_TYPE_REGEXP "^.+#.*$"
|
"~\\+#])?$"
|
||||||
#define TEXT_TITLE_LIMIT 30
|
#define SCRIPT_SOURCE_TYPE_REGEXP "^.+#.*$"
|
||||||
#define TEXT_TOOLTIP_LIMIT 50
|
#define TEXT_TITLE_LIMIT 30
|
||||||
#define RESELECT_MESSAGE_THRESSHOLD 500
|
#define TEXT_TOOLTIP_LIMIT 50
|
||||||
#define ICON_SIZE_SETTINGS 16
|
#define RESELECT_MESSAGE_THRESSHOLD 500
|
||||||
#define TRAY_ICON_BUBBLE_TIMEOUT 20000
|
#define ICON_SIZE_SETTINGS 16
|
||||||
#define CLOSE_LOCK_TIMEOUT 500
|
#define TRAY_ICON_BUBBLE_TIMEOUT 20000
|
||||||
#define DOWNLOAD_TIMEOUT 30000
|
#define CLOSE_LOCK_TIMEOUT 500
|
||||||
#define MESSAGES_VIEW_DEFAULT_COL 100
|
#define DOWNLOAD_TIMEOUT 30000
|
||||||
#define MESSAGES_VIEW_MINIMUM_COL 16
|
#define MESSAGES_VIEW_DEFAULT_COL 100
|
||||||
#define FEEDS_VIEW_COLUMN_COUNT 2
|
#define MESSAGES_VIEW_MINIMUM_COL 16
|
||||||
#define DEFAULT_DAYS_TO_DELETE_MSG 14
|
#define FEEDS_VIEW_COLUMN_COUNT 2
|
||||||
#define ELLIPSIS_LENGTH 3
|
#define DEFAULT_DAYS_TO_DELETE_MSG 14
|
||||||
#define DEFAULT_AUTO_UPDATE_INTERVAL 15
|
#define ELLIPSIS_LENGTH 3
|
||||||
#define AUTO_UPDATE_INTERVAL 60000
|
#define DEFAULT_AUTO_UPDATE_INTERVAL 15
|
||||||
#define STARTUP_UPDATE_DELAY 15.0 // In seconds.
|
#define AUTO_UPDATE_INTERVAL 60000
|
||||||
#define TIMEZONE_OFFSET_LIMIT 6
|
#define STARTUP_UPDATE_DELAY 15.0 // In seconds.
|
||||||
#define CHANGE_EVENT_DELAY 250
|
#define TIMEZONE_OFFSET_LIMIT 6
|
||||||
#define FLAG_ICON_SUBFOLDER "flags"
|
#define CHANGE_EVENT_DELAY 250
|
||||||
#define SEARCH_BOX_ACTION_NAME "search"
|
#define FLAG_ICON_SUBFOLDER "flags"
|
||||||
#define HIGHLIGHTER_ACTION_NAME "highlighter"
|
#define SEARCH_BOX_ACTION_NAME "search"
|
||||||
#define FILTER_ACTION_NAME "filter"
|
#define HIGHLIGHTER_ACTION_NAME "highlighter"
|
||||||
#define SPACER_ACTION_NAME "spacer"
|
#define FILTER_ACTION_NAME "filter"
|
||||||
#define SEPARATOR_ACTION_NAME "separator"
|
#define SPACER_ACTION_NAME "spacer"
|
||||||
#define FILTER_WIDTH 125
|
#define SEPARATOR_ACTION_NAME "separator"
|
||||||
#define FILTER_RIGHT_MARGIN 5
|
#define FILTER_WIDTH 125
|
||||||
#define FEEDS_VIEW_INDENTATION 10
|
#define FILTER_RIGHT_MARGIN 5
|
||||||
#define MIME_TYPE_ITEM_POINTER "rssguard/itempointer"
|
#define FEEDS_VIEW_INDENTATION 10
|
||||||
#define DOWNLOADER_ICON_SIZE 48
|
#define MIME_TYPE_ITEM_POINTER "rssguard/itempointer"
|
||||||
#define ENCRYPTION_FILE_NAME "key.private"
|
#define DOWNLOADER_ICON_SIZE 48
|
||||||
#define RELOAD_MODEL_BORDER_NUM 10
|
#define ENCRYPTION_FILE_NAME "key.private"
|
||||||
#define COOKIE_URL_IDENTIFIER ":COOKIE:"
|
#define RELOAD_MODEL_BORDER_NUM 10
|
||||||
#define DEFAULT_NOTIFICATION_VOLUME 50
|
#define COOKIE_URL_IDENTIFIER ":COOKIE:"
|
||||||
|
#define DEFAULT_NOTIFICATION_VOLUME 50
|
||||||
|
|
||||||
#define GOOGLE_SEARCH_URL "https://www.google.com/search?q=%1&ie=utf-8&oe=utf-8"
|
#define GOOGLE_SEARCH_URL "https://www.google.com/search?q=%1&ie=utf-8&oe=utf-8"
|
||||||
#define GOOGLE_SUGGEST_URL "http://suggestqueries.google.com/complete/search?output=toolbar&hl=en&q=%1"
|
#define GOOGLE_SUGGEST_URL "http://suggestqueries.google.com/complete/search?output=toolbar&hl=en&q=%1"
|
||||||
|
|
||||||
#define EXECUTION_LINE_SEPARATOR "#"
|
#define EXTERNAL_TOOL_SEPARATOR "|||"
|
||||||
#define EXTERNAL_TOOL_SEPARATOR "|||"
|
|
||||||
|
|
||||||
#define USER_DATA_PLACEHOLDER "%data%"
|
#define USER_DATA_PLACEHOLDER "%data%"
|
||||||
#define SKIN_STYLE_PLACEHOLDER "%style%"
|
#define SKIN_STYLE_PLACEHOLDER "%style%"
|
||||||
|
|
||||||
#define CLI_VER_SHORT "v"
|
#define CLI_VER_SHORT "v"
|
||||||
#define CLI_VER_LONG "version"
|
#define CLI_VER_LONG "version"
|
||||||
|
|
||||||
#define CLI_HELP_SHORT "h"
|
#define CLI_HELP_SHORT "h"
|
||||||
#define CLI_HELP_LONG "help"
|
#define CLI_HELP_LONG "help"
|
||||||
|
|
||||||
#define CLI_LOG_SHORT "l"
|
#define CLI_LOG_SHORT "l"
|
||||||
#define CLI_LOG_LONG "log"
|
#define CLI_LOG_LONG "log"
|
||||||
|
|
||||||
#define CLI_DAT_SHORT "d"
|
#define CLI_DAT_SHORT "d"
|
||||||
#define CLI_DAT_LONG "data"
|
#define CLI_DAT_LONG "data"
|
||||||
|
|
||||||
#define CLI_SIN_SHORT "s"
|
#define CLI_SIN_SHORT "s"
|
||||||
#define CLI_SIN_LONG "no-single-instance"
|
#define CLI_SIN_LONG "no-single-instance"
|
||||||
|
|
||||||
#define CLI_NSTDOUTERR_SHORT "n"
|
#define CLI_NSTDOUTERR_SHORT "n"
|
||||||
#define CLI_NSTDOUTERR_LONG "no-standard-output"
|
#define CLI_NSTDOUTERR_LONG "no-standard-output"
|
||||||
|
|
||||||
#define CLI_STYLE_SHORT "t"
|
#define CLI_STYLE_SHORT "t"
|
||||||
#define CLI_STYLE_LONG "style"
|
#define CLI_STYLE_LONG "style"
|
||||||
|
|
||||||
#define CLI_NDEBUG_SHORT "g"
|
#define CLI_NDEBUG_SHORT "g"
|
||||||
#define CLI_NDEBUG_LONG "no-debug-output"
|
#define CLI_NDEBUG_LONG "no-debug-output"
|
||||||
|
|
||||||
#define CLI_FORCE_NOWEBENGINE_SHORT "w"
|
#define CLI_FORCE_NOWEBENGINE_SHORT "w"
|
||||||
#define CLI_FORCE_NOWEBENGINE_LONG "no-web-engine"
|
#define CLI_FORCE_NOWEBENGINE_LONG "no-web-engine"
|
||||||
|
|
||||||
#define CLI_QUIT_INSTANCE "q"
|
#define CLI_QUIT_INSTANCE "q"
|
||||||
#define CLI_IS_RUNNING "a"
|
#define CLI_IS_RUNNING "a"
|
||||||
|
|
||||||
#define HTTP_HEADERS_ACCEPT "Accept"
|
#define HTTP_HEADERS_ACCEPT "Accept"
|
||||||
#define HTTP_HEADERS_CONTENT_TYPE "Content-Type"
|
#define HTTP_HEADERS_CONTENT_TYPE "Content-Type"
|
||||||
#define HTTP_HEADERS_CONTENT_LENGTH "Content-Length"
|
#define HTTP_HEADERS_CONTENT_LENGTH "Content-Length"
|
||||||
#define HTTP_HEADERS_AUTHORIZATION "Authorization"
|
#define HTTP_HEADERS_AUTHORIZATION "Authorization"
|
||||||
#define HTTP_HEADERS_USER_AGENT "User-Agent"
|
#define HTTP_HEADERS_USER_AGENT "User-Agent"
|
||||||
#define HTTP_HEADERS_COOKIE "Cookie"
|
#define HTTP_HEADERS_COOKIE "Cookie"
|
||||||
|
|
||||||
#define LOGSEC_NETWORK "network: "
|
#define LOGSEC_NETWORK "network: "
|
||||||
#define LOGSEC_ADBLOCK "adblock: "
|
#define LOGSEC_ADBLOCK "adblock: "
|
||||||
#define LOGSEC_FEEDMODEL "feed-model: "
|
#define LOGSEC_FEEDMODEL "feed-model: "
|
||||||
#define LOGSEC_FEEDDOWNLOADER "feed-downloader: "
|
#define LOGSEC_FEEDDOWNLOADER "feed-downloader: "
|
||||||
#define LOGSEC_MESSAGEMODEL "message-model: "
|
#define LOGSEC_MESSAGEMODEL "message-model: "
|
||||||
#define LOGSEC_JS "javascript: "
|
#define LOGSEC_JS "javascript: "
|
||||||
#define LOGSEC_GUI "gui: "
|
#define LOGSEC_GUI "gui: "
|
||||||
#define LOGSEC_CORE "core: "
|
#define LOGSEC_CORE "core: "
|
||||||
#define LOGSEC_NODEJS "nodejs: "
|
#define LOGSEC_NODEJS "nodejs: "
|
||||||
#define LOGSEC_DB "database: "
|
#define LOGSEC_DB "database: "
|
||||||
#define LOGSEC_NEXTCLOUD "nextcloud: "
|
#define LOGSEC_NEXTCLOUD "nextcloud: "
|
||||||
#define LOGSEC_GREADER "greader: "
|
#define LOGSEC_GREADER "greader: "
|
||||||
#define LOGSEC_FEEDLY "feedly: "
|
#define LOGSEC_FEEDLY "feedly: "
|
||||||
#define LOGSEC_TTRSS "tt-rss: "
|
#define LOGSEC_TTRSS "tt-rss: "
|
||||||
#define LOGSEC_GMAIL "gmail: "
|
#define LOGSEC_GMAIL "gmail: "
|
||||||
#define LOGSEC_OAUTH "oauth: "
|
#define LOGSEC_OAUTH "oauth: "
|
||||||
#define LOGSEC_REDDIT "reddit: "
|
#define LOGSEC_REDDIT "reddit: "
|
||||||
#define LOGSEC_NEWSBLUR "newsblur: "
|
#define LOGSEC_NEWSBLUR "newsblur: "
|
||||||
|
|
||||||
#define MAX_ZOOM_FACTOR 5.0f
|
#define MAX_ZOOM_FACTOR 5.0f
|
||||||
#define MIN_ZOOM_FACTOR 0.25f
|
#define MIN_ZOOM_FACTOR 0.25f
|
||||||
#define DEFAULT_ZOOM_FACTOR 1.0f
|
#define DEFAULT_ZOOM_FACTOR 1.0f
|
||||||
#define ZOOM_FACTOR_STEP 0.05f
|
#define ZOOM_FACTOR_STEP 0.05f
|
||||||
|
|
||||||
#if defined(USE_WEBENGINE)
|
#if defined(USE_WEBENGINE)
|
||||||
#define HTTP_COMPLETE_USERAGENT (QWebEngineProfile::defaultProfile()->httpUserAgent().toLocal8Bit() + QByteArrayLiteral(" ") + QByteArrayLiteral(APP_USERAGENT))
|
#define HTTP_COMPLETE_USERAGENT \
|
||||||
|
(QWebEngineProfile::defaultProfile()->httpUserAgent().toLocal8Bit() + QByteArrayLiteral(" ") + \
|
||||||
|
QByteArrayLiteral(APP_USERAGENT))
|
||||||
#else
|
#else
|
||||||
#define HTTP_COMPLETE_USERAGENT (QByteArrayLiteral( \
|
#define HTTP_COMPLETE_USERAGENT \
|
||||||
"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.15.2 Chrome/83.0.4103.122 Safari/537.36 ") \
|
(QByteArrayLiteral("Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " \
|
||||||
+ \
|
"QtWebEngine/5.15.2 Chrome/83.0.4103.122 Safari/537.36 ") + \
|
||||||
QByteArrayLiteral(APP_USERAGENT))
|
QByteArrayLiteral(APP_USERAGENT))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define INTERNAL_URL_MESSAGE "http://rssguard.message"
|
#define INTERNAL_URL_MESSAGE "http://rssguard.message"
|
||||||
#define INTERNAL_URL_BLANK "http://rssguard.blank"
|
#define INTERNAL_URL_BLANK "http://rssguard.blank"
|
||||||
#define INTERNAL_URL_ADBLOCKED "http://rssguard.adblocked"
|
#define INTERNAL_URL_ADBLOCKED "http://rssguard.adblocked"
|
||||||
#define INTERNAL_URL_MESSAGE_HOST "rssguard.message"
|
#define INTERNAL_URL_MESSAGE_HOST "rssguard.message"
|
||||||
|
|
||||||
#define FEED_REGEX_MATCHER "<link[^>]+type=\"application\\/(?:atom\\+xml|rss\\+xml|feed\\+json|json)\"[^>]*>"
|
#define FEED_REGEX_MATCHER "<link[^>]+type=\"application\\/(?:atom\\+xml|rss\\+xml|feed\\+json|json)\"[^>]*>"
|
||||||
#define FEED_HREF_REGEX_MATCHER "href=\"([^\"]+)\""
|
#define FEED_HREF_REGEX_MATCHER "href=\"([^\"]+)\""
|
||||||
|
|
||||||
#define PLACEHOLDER_UNREAD_COUNTS "%unread"
|
#define PLACEHOLDER_UNREAD_COUNTS "%unread"
|
||||||
#define PLACEHOLDER_ALL_COUNTS "%all"
|
#define PLACEHOLDER_ALL_COUNTS "%all"
|
||||||
|
|
||||||
#define BACKUP_NAME_SETTINGS "config"
|
#define BACKUP_NAME_SETTINGS "config"
|
||||||
#define BACKUP_SUFFIX_SETTINGS ".ini.backup"
|
#define BACKUP_SUFFIX_SETTINGS ".ini.backup"
|
||||||
#define BACKUP_NAME_DATABASE "database"
|
#define BACKUP_NAME_DATABASE "database"
|
||||||
#define BACKUP_SUFFIX_DATABASE ".db.backup"
|
#define BACKUP_SUFFIX_DATABASE ".db.backup"
|
||||||
|
|
||||||
#define APP_DB_MYSQL_DRIVER "QMYSQL"
|
#define APP_DB_MYSQL_DRIVER "QMYSQL"
|
||||||
#define APP_DB_MYSQL_INIT "db_init_mysql.sql"
|
#define APP_DB_MYSQL_INIT "db_init_mysql.sql"
|
||||||
#define APP_DB_MYSQL_TEST "MySQLTest"
|
#define APP_DB_MYSQL_TEST "MySQLTest"
|
||||||
#define APP_DB_MYSQL_PORT 3306
|
#define APP_DB_MYSQL_PORT 3306
|
||||||
|
|
||||||
#define APP_DB_SQLITE_DRIVER "QSQLITE"
|
#define APP_DB_SQLITE_DRIVER "QSQLITE"
|
||||||
#define APP_DB_SQLITE_INIT "db_init_sqlite.sql"
|
#define APP_DB_SQLITE_INIT "db_init_sqlite.sql"
|
||||||
#define APP_DB_SQLITE_PATH "database"
|
#define APP_DB_SQLITE_PATH "database"
|
||||||
#define APP_DB_SQLITE_FILE "database.db"
|
#define APP_DB_SQLITE_FILE "database.db"
|
||||||
|
|
||||||
// Keep this in sync with schema versions declared in SQL initialization code.
|
// Keep this in sync with schema versions declared in SQL initialization code.
|
||||||
#define APP_DB_SCHEMA_VERSION "2"
|
#define APP_DB_SCHEMA_VERSION "2"
|
||||||
#define APP_DB_UPDATE_FILE_PATTERN "db_update_%1_%2_%3.sql"
|
#define APP_DB_UPDATE_FILE_PATTERN "db_update_%1_%2_%3.sql"
|
||||||
#define APP_DB_COMMENT_SPLIT "-- !\n"
|
#define APP_DB_COMMENT_SPLIT "-- !\n"
|
||||||
#define APP_DB_INCLUDE_PLACEHOLDER "!!"
|
#define APP_DB_INCLUDE_PLACEHOLDER "!!"
|
||||||
#define APP_DB_NAME_PLACEHOLDER "##"
|
#define APP_DB_NAME_PLACEHOLDER "##"
|
||||||
#define APP_DB_AUTO_INC_PRIM_KEY_PLACEHOLDER "$$"
|
#define APP_DB_AUTO_INC_PRIM_KEY_PLACEHOLDER "$$"
|
||||||
#define APP_DB_BLOB_PLACEHOLDER "^^"
|
#define APP_DB_BLOB_PLACEHOLDER "^^"
|
||||||
|
|
||||||
#define APP_CFG_PATH "config"
|
#define APP_CFG_PATH "config"
|
||||||
#define APP_CFG_FILE "config.ini"
|
#define APP_CFG_FILE "config.ini"
|
||||||
|
|
||||||
#define APP_SKIN_USER_FOLDER "skins"
|
#define APP_SKIN_USER_FOLDER "skins"
|
||||||
#define APP_SKIN_DEFAULT "nudus-light"
|
#define APP_SKIN_DEFAULT "nudus-light"
|
||||||
#define APP_SKIN_METADATA_FILE "metadata.xml"
|
#define APP_SKIN_METADATA_FILE "metadata.xml"
|
||||||
#define APP_STYLE_DEFAULT "Fusion"
|
#define APP_STYLE_DEFAULT "Fusion"
|
||||||
|
|
||||||
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
||||||
#define APP_THEME_DEFAULT ""
|
#define APP_THEME_DEFAULT ""
|
||||||
#else
|
#else
|
||||||
#define APP_THEME_DEFAULT "Breeze"
|
#define APP_THEME_DEFAULT "Breeze"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define APP_LOCAL_THEME_FOLDER "icons"
|
#define APP_LOCAL_THEME_FOLDER "icons"
|
||||||
#define APP_NO_THEME ""
|
#define APP_NO_THEME ""
|
||||||
|
|
||||||
// Indexes of columns as they are DEFINED IN THE TABLE for MESSAGES.
|
// Indexes of columns as they are DEFINED IN THE TABLE for MESSAGES.
|
||||||
#define MSG_DB_ID_INDEX 0
|
#define MSG_DB_ID_INDEX 0
|
||||||
#define MSG_DB_READ_INDEX 1
|
#define MSG_DB_READ_INDEX 1
|
||||||
#define MSG_DB_IMPORTANT_INDEX 2
|
#define MSG_DB_IMPORTANT_INDEX 2
|
||||||
#define MSG_DB_DELETED_INDEX 3
|
#define MSG_DB_DELETED_INDEX 3
|
||||||
#define MSG_DB_PDELETED_INDEX 4
|
#define MSG_DB_PDELETED_INDEX 4
|
||||||
#define MSG_DB_FEED_CUSTOM_ID_INDEX 5
|
#define MSG_DB_FEED_CUSTOM_ID_INDEX 5
|
||||||
#define MSG_DB_TITLE_INDEX 6
|
#define MSG_DB_TITLE_INDEX 6
|
||||||
#define MSG_DB_URL_INDEX 7
|
#define MSG_DB_URL_INDEX 7
|
||||||
#define MSG_DB_AUTHOR_INDEX 8
|
#define MSG_DB_AUTHOR_INDEX 8
|
||||||
#define MSG_DB_DCREATED_INDEX 9
|
#define MSG_DB_DCREATED_INDEX 9
|
||||||
#define MSG_DB_CONTENTS_INDEX 10
|
#define MSG_DB_CONTENTS_INDEX 10
|
||||||
#define MSG_DB_ENCLOSURES_INDEX 11
|
#define MSG_DB_ENCLOSURES_INDEX 11
|
||||||
#define MSG_DB_SCORE_INDEX 12
|
#define MSG_DB_SCORE_INDEX 12
|
||||||
#define MSG_DB_ACCOUNT_ID_INDEX 13
|
#define MSG_DB_ACCOUNT_ID_INDEX 13
|
||||||
#define MSG_DB_CUSTOM_ID_INDEX 14
|
#define MSG_DB_CUSTOM_ID_INDEX 14
|
||||||
#define MSG_DB_CUSTOM_HASH_INDEX 15
|
#define MSG_DB_CUSTOM_HASH_INDEX 15
|
||||||
#define MSG_DB_FEED_TITLE_INDEX 16
|
#define MSG_DB_FEED_TITLE_INDEX 16
|
||||||
#define MSG_DB_HAS_ENCLOSURES 17
|
#define MSG_DB_HAS_ENCLOSURES 17
|
||||||
|
|
||||||
// Indexes of columns as they are DEFINED IN THE TABLE for CATEGORIES.
|
// Indexes of columns as they are DEFINED IN THE TABLE for CATEGORIES.
|
||||||
#define CAT_DB_ID_INDEX 0
|
#define CAT_DB_ID_INDEX 0
|
||||||
#define CAT_DB_ORDER_INDEX 1
|
#define CAT_DB_ORDER_INDEX 1
|
||||||
#define CAT_DB_PARENT_ID_INDEX 2
|
#define CAT_DB_PARENT_ID_INDEX 2
|
||||||
#define CAT_DB_TITLE_INDEX 3
|
#define CAT_DB_TITLE_INDEX 3
|
||||||
#define CAT_DB_DESCRIPTION_INDEX 4
|
#define CAT_DB_DESCRIPTION_INDEX 4
|
||||||
#define CAT_DB_DCREATED_INDEX 5
|
#define CAT_DB_DCREATED_INDEX 5
|
||||||
#define CAT_DB_ICON_INDEX 6
|
#define CAT_DB_ICON_INDEX 6
|
||||||
#define CAT_DB_ACCOUNT_ID_INDEX 7
|
#define CAT_DB_ACCOUNT_ID_INDEX 7
|
||||||
#define CAT_DB_CUSTOM_ID_INDEX 8
|
#define CAT_DB_CUSTOM_ID_INDEX 8
|
||||||
|
|
||||||
// Indexes of columns as they are DEFINED IN THE TABLE for FEEDS.
|
// Indexes of columns as they are DEFINED IN THE TABLE for FEEDS.
|
||||||
#define FDS_DB_ID_INDEX 0
|
#define FDS_DB_ID_INDEX 0
|
||||||
#define FDS_DB_ORDER_INDEX 1
|
#define FDS_DB_ORDER_INDEX 1
|
||||||
#define FDS_DB_TITLE_INDEX 2
|
#define FDS_DB_TITLE_INDEX 2
|
||||||
#define FDS_DB_DESCRIPTION_INDEX 3
|
#define FDS_DB_DESCRIPTION_INDEX 3
|
||||||
#define FDS_DB_DCREATED_INDEX 4
|
#define FDS_DB_DCREATED_INDEX 4
|
||||||
#define FDS_DB_ICON_INDEX 5
|
#define FDS_DB_ICON_INDEX 5
|
||||||
#define FDS_DB_CATEGORY_INDEX 6
|
#define FDS_DB_CATEGORY_INDEX 6
|
||||||
#define FDS_DB_SOURCE_INDEX 7
|
#define FDS_DB_SOURCE_INDEX 7
|
||||||
#define FDS_DB_UPDATE_TYPE_INDEX 8
|
#define FDS_DB_UPDATE_TYPE_INDEX 8
|
||||||
#define FDS_DB_UPDATE_INTERVAL_INDEX 9
|
#define FDS_DB_UPDATE_INTERVAL_INDEX 9
|
||||||
#define FDS_DB_IS_OFF_INDEX 10
|
#define FDS_DB_IS_OFF_INDEX 10
|
||||||
#define FDS_DB_OPEN_ARTICLES_INDEX 11
|
#define FDS_DB_OPEN_ARTICLES_INDEX 11
|
||||||
#define FDS_DB_ACCOUNT_ID_INDEX 12
|
#define FDS_DB_ACCOUNT_ID_INDEX 12
|
||||||
#define FDS_DB_CUSTOM_ID_INDEX 13
|
#define FDS_DB_CUSTOM_ID_INDEX 13
|
||||||
#define FDS_DB_CUSTOM_DATA_INDEX 14
|
#define FDS_DB_CUSTOM_DATA_INDEX 14
|
||||||
|
|
||||||
// Indexes of columns for feed models.
|
// Indexes of columns for feed models.
|
||||||
#define FDS_MODEL_TITLE_INDEX 0
|
#define FDS_MODEL_TITLE_INDEX 0
|
||||||
#define FDS_MODEL_COUNTS_INDEX 1
|
#define FDS_MODEL_COUNTS_INDEX 1
|
||||||
|
|
||||||
// Indexes of columns for message filter manager models.
|
// Indexes of columns for message filter manager models.
|
||||||
#define MFM_MODEL_ISREAD 0
|
#define MFM_MODEL_ISREAD 0
|
||||||
#define MFM_MODEL_ISIMPORTANT 1
|
#define MFM_MODEL_ISIMPORTANT 1
|
||||||
#define MFM_MODEL_ISDELETED 2
|
#define MFM_MODEL_ISDELETED 2
|
||||||
#define MFM_MODEL_TITLE 3
|
#define MFM_MODEL_TITLE 3
|
||||||
#define MFM_MODEL_URL 4
|
#define MFM_MODEL_URL 4
|
||||||
#define MFM_MODEL_AUTHOR 5
|
#define MFM_MODEL_AUTHOR 5
|
||||||
#define MFM_MODEL_CREATED 6
|
#define MFM_MODEL_CREATED 6
|
||||||
#define MFM_MODEL_SCORE 7
|
#define MFM_MODEL_SCORE 7
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
#define OS_ID "Linux"
|
#define OS_ID "Linux"
|
||||||
#elif defined(Q_OS_FREEBSD)
|
#elif defined(Q_OS_FREEBSD)
|
||||||
#define OS_ID "FreeBSD"
|
#define OS_ID "FreeBSD"
|
||||||
#elif defined(Q_OS_NETBSD)
|
#elif defined(Q_OS_NETBSD)
|
||||||
#define OS_ID "NetBSD"
|
#define OS_ID "NetBSD"
|
||||||
#elif defined(Q_OS_OPENBSD)
|
#elif defined(Q_OS_OPENBSD)
|
||||||
#define OS_ID "OpenBSD"
|
#define OS_ID "OpenBSD"
|
||||||
#elif defined(Q_OS_OS2)
|
#elif defined(Q_OS_OS2)
|
||||||
#define OS_ID "OS2"
|
#define OS_ID "OS2"
|
||||||
#elif defined(Q_OS_OSX)
|
#elif defined(Q_OS_OSX)
|
||||||
#define OS_ID "macOS"
|
#define OS_ID "macOS"
|
||||||
#elif defined(Q_OS_WIN)
|
#elif defined(Q_OS_WIN)
|
||||||
#define OS_ID "Windows"
|
#define OS_ID "Windows"
|
||||||
#elif defined(Q_OS_ANDROID)
|
#elif defined(Q_OS_ANDROID)
|
||||||
#define OS_ID "Android"
|
#define OS_ID "Android"
|
||||||
#elif defined(Q_OS_UNIX)
|
#elif defined(Q_OS_UNIX)
|
||||||
#define OS_ID "Unix"
|
#define OS_ID "Unix"
|
||||||
#else
|
#else
|
||||||
#define OS_ID ""
|
#define OS_ID ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Paths.
|
// Paths.
|
||||||
|
@ -35,11 +35,15 @@ SingleNotificationEditor::SingleNotificationEditor(const Notification& notificat
|
|||||||
}
|
}
|
||||||
|
|
||||||
Notification SingleNotificationEditor::notification() const {
|
Notification SingleNotificationEditor::notification() const {
|
||||||
return Notification(m_notificationEvent, m_ui.m_cbBalloon->isChecked(), m_ui.m_txtSound->text(), m_ui.m_slidVolume->value());
|
return Notification(m_notificationEvent,
|
||||||
|
m_ui.m_cbBalloon->isChecked(),
|
||||||
|
m_ui.m_txtSound->text(),
|
||||||
|
m_ui.m_slidVolume->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SingleNotificationEditor::selectSoundFile() {
|
void SingleNotificationEditor::selectSoundFile() {
|
||||||
auto fil = QFileDialog::getOpenFileName(window(), tr("Select sound file"),
|
auto fil = QFileDialog::getOpenFileName(window(),
|
||||||
|
tr("Select sound file"),
|
||||||
qApp->homeFolder(),
|
qApp->homeFolder(),
|
||||||
tr("WAV files (*.wav);;MP3 files (*.mp3)"));
|
tr("WAV files (*.wav);;MP3 files (*.mp3)"));
|
||||||
|
|
||||||
|
@ -82,6 +82,9 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QSlider" name="m_slidVolume">
|
<widget class="QSlider" name="m_slidVolume">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
|
@ -71,9 +71,14 @@ void ExternalTool::setToolsToSettings(QVector<ExternalTool>& tools) {
|
|||||||
|
|
||||||
bool ExternalTool::run(const QString& target) {
|
bool ExternalTool::run(const QString& target) {
|
||||||
if (parameters().isEmpty()) {
|
if (parameters().isEmpty()) {
|
||||||
return IOFactory::startProcessDetached(executable(), { target });
|
return IOFactory::startProcessDetached(executable(), {target});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return IOFactory::startProcessDetached(executable(), QStringList() << parameters() << target);
|
auto pars = parameters();
|
||||||
|
pars += QSL(" \"%1\"").arg(target);
|
||||||
|
|
||||||
|
auto params = TextFactory::tokenizeProcessArguments(pars);
|
||||||
|
|
||||||
|
return IOFactory::startProcessDetached(executable(), params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,23 +72,13 @@ QString IOFactory::filterBadCharsFromFilename(const QString& name) {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IOFactory::startProcessDetached(const QString& program, const QStringList& arguments,
|
bool IOFactory::startProcessDetached(const QString& executable,
|
||||||
const QString& native_arguments, const QString& working_directory) {
|
const QStringList& arguments,
|
||||||
|
const QString& working_directory) {
|
||||||
QProcess process;
|
QProcess process;
|
||||||
|
|
||||||
process.setProgram(program);
|
process.setProgram(executable);
|
||||||
process.setArguments(arguments);
|
process.setArguments(arguments);
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
|
|
||||||
if (!native_arguments.isEmpty()) {
|
|
||||||
process.setNativeArguments(native_arguments);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (arguments.isEmpty() && !native_arguments.isEmpty()) {
|
|
||||||
process.setArguments({ native_arguments });
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
process.setWorkingDirectory(working_directory);
|
process.setWorkingDirectory(working_directory);
|
||||||
|
|
||||||
return process.startDetached(nullptr);
|
return process.startDetached(nullptr);
|
||||||
@ -134,8 +124,7 @@ QString IOFactory::startProcessGetOutput(const QString& executable,
|
|||||||
|
|
||||||
proc.start();
|
proc.start();
|
||||||
|
|
||||||
if (proc.waitForFinished() &&
|
if (proc.waitForFinished() && proc.exitStatus() == QProcess::ExitStatus::NormalExit &&
|
||||||
proc.exitStatus() == QProcess::ExitStatus::NormalExit &&
|
|
||||||
proc.exitCode() == EXIT_SUCCESS) {
|
proc.exitCode() == EXIT_SUCCESS) {
|
||||||
return proc.readAllStandardOutput();
|
return proc.readAllStandardOutput();
|
||||||
}
|
}
|
||||||
@ -179,11 +168,8 @@ bool IOFactory::copyFile(const QString& source, const QString& destination) {
|
|||||||
if (QFile::exists(destination)) {
|
if (QFile::exists(destination)) {
|
||||||
QFile file(destination);
|
QFile file(destination);
|
||||||
|
|
||||||
file.setPermissions(file.permissions() |
|
file.setPermissions(file.permissions() | QFileDevice::WriteOwner | QFileDevice::WriteUser |
|
||||||
QFileDevice::WriteOwner |
|
QFileDevice::WriteGroup | QFileDevice::WriteOther);
|
||||||
QFileDevice::WriteUser |
|
|
||||||
QFileDevice::WriteGroup |
|
|
||||||
QFileDevice::WriteOther);
|
|
||||||
|
|
||||||
if (!QFile::remove(destination)) {
|
if (!QFile::remove(destination)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
|
||||||
class IOFactory {
|
class IOFactory {
|
||||||
Q_DECLARE_TR_FUNCTIONS(IOFactory)
|
Q_DECLARE_TR_FUNCTIONS(IOFactory)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IOFactory();
|
IOFactory();
|
||||||
@ -28,9 +28,8 @@ class IOFactory {
|
|||||||
|
|
||||||
// Filters out shit characters from filename.
|
// Filters out shit characters from filename.
|
||||||
static QString filterBadCharsFromFilename(const QString& name);
|
static QString filterBadCharsFromFilename(const QString& name);
|
||||||
static bool startProcessDetached(const QString& program,
|
static bool startProcessDetached(const QString& executable,
|
||||||
const QStringList& arguments,
|
const QStringList& arguments = {},
|
||||||
const QString& native_arguments = {},
|
|
||||||
const QString& working_directory = {});
|
const QString& working_directory = {});
|
||||||
static void startProcess(QProcess* const proc,
|
static void startProcess(QProcess* const proc,
|
||||||
const QString& executable,
|
const QString& executable,
|
||||||
|
@ -50,14 +50,15 @@ void Notification::playSound(Application* app) const {
|
|||||||
|
|
||||||
if (m_soundPath.startsWith(QSL(":"))) {
|
if (m_soundPath.startsWith(QSL(":"))) {
|
||||||
play->setSource(QUrl(QSL("qrc") + m_soundPath));
|
play->setSource(QUrl(QSL("qrc") + m_soundPath));
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
play->setSource(QUrl::fromLocalFile(
|
play
|
||||||
QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath))));
|
->setSource(QUrl::
|
||||||
|
fromLocalFile(QDir::toNativeSeparators(app
|
||||||
|
->replaceDataUserDataFolderPlaceholder(m_soundPath))));
|
||||||
}
|
}
|
||||||
|
|
||||||
play->setVolume(m_volume);
|
play->setVolume(fractionalVolume());
|
||||||
play->play();
|
play->play();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -79,13 +80,15 @@ void Notification::playSound(Application* app) const {
|
|||||||
|
|
||||||
if (m_soundPath.startsWith(QSL(":"))) {
|
if (m_soundPath.startsWith(QSL(":"))) {
|
||||||
play->setSource(QUrl(QSL("qrc") + m_soundPath));
|
play->setSource(QUrl(QSL("qrc") + m_soundPath));
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
play->setSource(QUrl::fromLocalFile(QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath))));
|
play
|
||||||
|
->setSource(QUrl::
|
||||||
|
fromLocalFile(QDir::toNativeSeparators(app
|
||||||
|
->replaceDataUserDataFolderPlaceholder(m_soundPath))));
|
||||||
}
|
}
|
||||||
|
|
||||||
play->audioOutput()->setVolume((m_volume * 1.0f) / 100.0f);
|
play->audioOutput()->setVolume(fractionalVolume());
|
||||||
play->play();
|
play->play();
|
||||||
#else
|
#else
|
||||||
QObject::connect(play, &QMediaPlayer::stateChanged, play, [play](QMediaPlayer::State state) {
|
QObject::connect(play, &QMediaPlayer::stateChanged, play, [play](QMediaPlayer::State state) {
|
||||||
@ -96,12 +99,10 @@ void Notification::playSound(Application* app) const {
|
|||||||
|
|
||||||
if (m_soundPath.startsWith(QSL(":"))) {
|
if (m_soundPath.startsWith(QSL(":"))) {
|
||||||
play->setMedia(QMediaContent(QUrl(QSL("qrc") + m_soundPath)));
|
play->setMedia(QMediaContent(QUrl(QSL("qrc") + m_soundPath)));
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
play->setMedia(QMediaContent(
|
play->setMedia(QMediaContent(
|
||||||
QUrl::fromLocalFile(
|
QUrl::fromLocalFile(QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath)))));
|
||||||
QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath)))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
play->setVolume(m_volume);
|
play->setVolume(m_volume);
|
||||||
@ -113,16 +114,14 @@ void Notification::playSound(Application* app) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QList<Notification::Event> Notification::allEvents() {
|
QList<Notification::Event> Notification::allEvents() {
|
||||||
return {
|
return {Event::GeneralEvent,
|
||||||
Event::GeneralEvent,
|
Event::NewUnreadArticlesFetched,
|
||||||
Event::NewUnreadArticlesFetched,
|
Event::ArticlesFetchingStarted,
|
||||||
Event::ArticlesFetchingStarted,
|
Event::LoginDataRefreshed,
|
||||||
Event::LoginDataRefreshed,
|
Event::LoginFailure,
|
||||||
Event::LoginFailure,
|
Event::NewAppVersionAvailable,
|
||||||
Event::NewAppVersionAvailable,
|
Event::NodePackageUpdated,
|
||||||
Event::NodePackageUpdated,
|
Event::NodePackageFailedToUpdate};
|
||||||
Event::NodePackageFailedToUpdate
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Notification::nameForEvent(Notification::Event event) {
|
QString Notification::nameForEvent(Notification::Event event) {
|
||||||
@ -160,6 +159,10 @@ int Notification::volume() const {
|
|||||||
return m_volume;
|
return m_volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qreal Notification::fractionalVolume() const {
|
||||||
|
return (m_volume * 1.0f) / 100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
void Notification::setVolume(int volume) {
|
void Notification::setVolume(int volume) {
|
||||||
m_volume = volume;
|
m_volume = volume;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,9 @@ class Notification {
|
|||||||
NodePackageFailedToUpdate = 8
|
NodePackageFailedToUpdate = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit Notification(Event event = Event::NoEvent, bool balloon = {}, const QString& sound_path = {},
|
explicit Notification(Event event = Event::NoEvent,
|
||||||
|
bool balloon = {},
|
||||||
|
const QString& sound_path = {},
|
||||||
int volume = DEFAULT_NOTIFICATION_VOLUME);
|
int volume = DEFAULT_NOTIFICATION_VOLUME);
|
||||||
|
|
||||||
bool balloonEnabled() const;
|
bool balloonEnabled() const;
|
||||||
@ -52,6 +54,7 @@ class Notification {
|
|||||||
void setEvent(Event event);
|
void setEvent(Event event);
|
||||||
|
|
||||||
int volume() const;
|
int volume() const;
|
||||||
|
qreal fractionalVolume() const;
|
||||||
void setVolume(int volume);
|
void setVolume(int volume);
|
||||||
|
|
||||||
// Returns full path to audio file which should be played when notification
|
// Returns full path to audio file which should be played when notification
|
||||||
@ -69,7 +72,7 @@ class Notification {
|
|||||||
Event m_event;
|
Event m_event;
|
||||||
bool m_balloonEnabled;
|
bool m_balloonEnabled;
|
||||||
QString m_soundPath;
|
QString m_soundPath;
|
||||||
int m_volume;
|
qreal m_volume;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // NOTIFICATION_H
|
#endif // NOTIFICATION_H
|
||||||
|
@ -28,8 +28,7 @@
|
|||||||
#include <QWebEngineUrlScheme>
|
#include <QWebEngineUrlScheme>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
WebFactory::WebFactory(QObject* parent)
|
WebFactory::WebFactory(QObject* parent) : QObject(parent) {
|
||||||
: QObject(parent) {
|
|
||||||
m_adBlock = new AdBlockManager(this);
|
m_adBlock = new AdBlockManager(this);
|
||||||
|
|
||||||
#if defined(USE_WEBENGINE)
|
#if defined(USE_WEBENGINE)
|
||||||
@ -63,17 +62,21 @@ WebFactory::~WebFactory() {
|
|||||||
|
|
||||||
bool WebFactory::sendMessageViaEmail(const Message& message) {
|
bool WebFactory::sendMessageViaEmail(const Message& message) {
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) {
|
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) {
|
||||||
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
|
const QString browser =
|
||||||
const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString();
|
qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
|
||||||
|
const QString arguments =
|
||||||
|
qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString();
|
||||||
|
const QStringList tokenized_arguments =
|
||||||
|
TextFactory::tokenizeProcessArguments(arguments.arg(message.m_title, stripTags(message.m_contents)));
|
||||||
|
|
||||||
return IOFactory::startProcessDetached(browser, {}, arguments.arg(message.m_title, stripTags(message.m_contents)));
|
return IOFactory::startProcessDetached(browser, tokenized_arguments);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Send it via mailto protocol.
|
// Send it via mailto protocol.
|
||||||
// NOTE: http://en.wikipedia.org/wiki/Mailto
|
// NOTE: http://en.wikipedia.org/wiki/Mailto
|
||||||
return QDesktopServices::openUrl(QSL("mailto:?subject=%1&body=%2").arg(QString(QUrl::toPercentEncoding(message.m_title)),
|
return QDesktopServices::openUrl(QSL("mailto:?subject=%1&body=%2")
|
||||||
QString(QUrl::toPercentEncoding(stripTags(
|
.arg(QString(QUrl::toPercentEncoding(message.m_title)),
|
||||||
message.m_contents)))));
|
QString(QUrl::toPercentEncoding(stripTags(message.m_contents)))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,13 +86,15 @@ bool WebFactory::openUrlInExternalBrowser(const QString& url) const {
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) {
|
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) {
|
||||||
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString();
|
const QString browser =
|
||||||
const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString();
|
qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString();
|
||||||
auto nice_args = arguments.arg(url);
|
const QString arguments =
|
||||||
|
qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString();
|
||||||
|
const auto nice_args = arguments.arg(url);
|
||||||
|
|
||||||
qDebugNN << LOGSEC_NETWORK << "Arguments for external browser:" << QUOTE_W_SPACE_DOT(nice_args);
|
qDebugNN << LOGSEC_NETWORK << "Arguments for external browser:" << QUOTE_W_SPACE_DOT(nice_args);
|
||||||
|
|
||||||
result = IOFactory::startProcessDetached(browser, {}, nice_args);
|
result = IOFactory::startProcessDetached(browser, TextFactory::tokenizeProcessArguments(nice_args));
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
qDebugNN << LOGSEC_NETWORK << "External web browser call failed.";
|
qDebugNN << LOGSEC_NETWORK << "External web browser call failed.";
|
||||||
@ -105,7 +110,8 @@ bool WebFactory::openUrlInExternalBrowser(const QString& url) const {
|
|||||||
QMessageBox::Icon::Critical,
|
QMessageBox::Icon::Critical,
|
||||||
tr("Navigate to website manually"),
|
tr("Navigate to website manually"),
|
||||||
tr("%1 was unable to launch your web browser with the given URL, you need to open the "
|
tr("%1 was unable to launch your web browser with the given URL, you need to open the "
|
||||||
"below website URL in your web browser manually.").arg(QSL(APP_NAME)),
|
"below website URL in your web browser manually.")
|
||||||
|
.arg(QSL(APP_NAME)),
|
||||||
{},
|
{},
|
||||||
url,
|
url,
|
||||||
QMessageBox::StandardButton::Ok);
|
QMessageBox::StandardButton::Ok);
|
||||||
@ -127,10 +133,11 @@ QString WebFactory::unescapeHtml(const QString& html) {
|
|||||||
generateUnescapes();
|
generateUnescapes();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString output; output.reserve(html.size());
|
QString output;
|
||||||
|
output.reserve(html.size());
|
||||||
|
|
||||||
// Traverse input HTML string and replace named/number entities.
|
// Traverse input HTML string and replace named/number entities.
|
||||||
for (int pos = 0; pos < html.size(); ) {
|
for (int pos = 0; pos < html.size();) {
|
||||||
const QChar first = html.at(pos);
|
const QChar first = html.at(pos);
|
||||||
|
|
||||||
if (first == QChar('&')) {
|
if (first == QChar('&')) {
|
||||||
@ -223,9 +230,8 @@ QString WebFactory::processFeedUriScheme(const QString& url) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebFactory::updateProxy() {
|
void WebFactory::updateProxy() {
|
||||||
const QNetworkProxy::ProxyType selected_proxy_type = static_cast<QNetworkProxy::ProxyType>(qApp->settings()->value(GROUP(Proxy),
|
const QNetworkProxy::ProxyType selected_proxy_type =
|
||||||
SETTING(Proxy::Type)).
|
static_cast<QNetworkProxy::ProxyType>(qApp->settings()->value(GROUP(Proxy), SETTING(Proxy::Type)).toInt());
|
||||||
toInt());
|
|
||||||
|
|
||||||
if (selected_proxy_type == QNetworkProxy::NoProxy) {
|
if (selected_proxy_type == QNetworkProxy::NoProxy) {
|
||||||
qDebugNN << LOGSEC_NETWORK << "Disabling application-wide proxy completely.";
|
qDebugNN << LOGSEC_NETWORK << "Disabling application-wide proxy completely.";
|
||||||
@ -249,10 +255,8 @@ void WebFactory::updateProxy() {
|
|||||||
new_proxy.setPassword(settings->password(GROUP(Proxy), SETTING(Proxy::Password)).toString());
|
new_proxy.setPassword(settings->password(GROUP(Proxy), SETTING(Proxy::Password)).toString());
|
||||||
|
|
||||||
qWarningNN << LOGSEC_NETWORK
|
qWarningNN << LOGSEC_NETWORK
|
||||||
<< "Activating application-wide custom proxy, address:"
|
<< "Activating application-wide custom proxy, address:" << QUOTE_W_SPACE_COMMA(new_proxy.hostName())
|
||||||
<< QUOTE_W_SPACE_COMMA(new_proxy.hostName())
|
<< " type:" << QUOTE_W_SPACE_DOT(new_proxy.type());
|
||||||
<< " type:"
|
|
||||||
<< QUOTE_W_SPACE_DOT(new_proxy.type());
|
|
||||||
|
|
||||||
QNetworkProxy::setApplicationProxy(new_proxy);
|
QNetworkProxy::setApplicationProxy(new_proxy);
|
||||||
}
|
}
|
||||||
@ -269,7 +273,8 @@ NetworkUrlInterceptor* WebFactory::urlIinterceptor() const {
|
|||||||
|
|
||||||
QAction* WebFactory::engineSettingsAction() {
|
QAction* WebFactory::engineSettingsAction() {
|
||||||
if (m_engineSettings == nullptr) {
|
if (m_engineSettings == nullptr) {
|
||||||
m_engineSettings = new QAction(qApp->icons()->fromTheme(QSL("applications-internet")), tr("Web engine settings"), this);
|
m_engineSettings =
|
||||||
|
new QAction(qApp->icons()->fromTheme(QSL("applications-internet")), tr("Web engine settings"), this);
|
||||||
m_engineSettings->setMenu(new QMenu());
|
m_engineSettings->setMenu(new QMenu());
|
||||||
createMenu(m_engineSettings->menu());
|
createMenu(m_engineSettings->menu());
|
||||||
connect(m_engineSettings->menu(), &QMenu::aboutToShow, this, [this]() {
|
connect(m_engineSettings->menu(), &QMenu::aboutToShow, this, [this]() {
|
||||||
@ -294,35 +299,56 @@ void WebFactory::createMenu(QMenu* menu) {
|
|||||||
|
|
||||||
actions << createEngineSettingsAction(tr("Auto-load images"), QWebEngineSettings::WebAttribute::AutoLoadImages);
|
actions << createEngineSettingsAction(tr("Auto-load images"), QWebEngineSettings::WebAttribute::AutoLoadImages);
|
||||||
actions << createEngineSettingsAction(tr("JS enabled"), QWebEngineSettings::WebAttribute::JavascriptEnabled);
|
actions << createEngineSettingsAction(tr("JS enabled"), QWebEngineSettings::WebAttribute::JavascriptEnabled);
|
||||||
actions << createEngineSettingsAction(tr("JS can open popup windows"), QWebEngineSettings::WebAttribute::JavascriptCanOpenWindows);
|
actions << createEngineSettingsAction(tr("JS can open popup windows"),
|
||||||
actions << createEngineSettingsAction(tr("JS can access clipboard"), QWebEngineSettings::WebAttribute::JavascriptCanAccessClipboard);
|
QWebEngineSettings::WebAttribute::JavascriptCanOpenWindows);
|
||||||
actions << createEngineSettingsAction(tr("Hyperlinks can get focus"), QWebEngineSettings::WebAttribute::LinksIncludedInFocusChain);
|
actions << createEngineSettingsAction(tr("JS can access clipboard"),
|
||||||
actions << createEngineSettingsAction(tr("Local storage enabled"), QWebEngineSettings::WebAttribute::LocalStorageEnabled);
|
QWebEngineSettings::WebAttribute::JavascriptCanAccessClipboard);
|
||||||
actions << createEngineSettingsAction(tr("Local content can access remote URLs"), QWebEngineSettings::WebAttribute::LocalContentCanAccessRemoteUrls);
|
actions << createEngineSettingsAction(tr("Hyperlinks can get focus"),
|
||||||
actions << createEngineSettingsAction(tr("XSS auditing enabled"), QWebEngineSettings::WebAttribute::XSSAuditingEnabled);
|
QWebEngineSettings::WebAttribute::LinksIncludedInFocusChain);
|
||||||
actions << createEngineSettingsAction(tr("Spatial navigation enabled"), QWebEngineSettings::WebAttribute::SpatialNavigationEnabled);
|
actions << createEngineSettingsAction(tr("Local storage enabled"),
|
||||||
actions << createEngineSettingsAction(tr("Local content can access local files"), QWebEngineSettings::WebAttribute::LocalContentCanAccessFileUrls);
|
QWebEngineSettings::WebAttribute::LocalStorageEnabled);
|
||||||
actions << createEngineSettingsAction(tr("Hyperlink auditing enabled"), QWebEngineSettings::WebAttribute::HyperlinkAuditingEnabled);
|
actions << createEngineSettingsAction(tr("Local content can access remote URLs"),
|
||||||
actions << createEngineSettingsAction(tr("Animate scrolling"), QWebEngineSettings::WebAttribute::ScrollAnimatorEnabled);
|
QWebEngineSettings::WebAttribute::LocalContentCanAccessRemoteUrls);
|
||||||
|
actions << createEngineSettingsAction(tr("XSS auditing enabled"),
|
||||||
|
QWebEngineSettings::WebAttribute::XSSAuditingEnabled);
|
||||||
|
actions << createEngineSettingsAction(tr("Spatial navigation enabled"),
|
||||||
|
QWebEngineSettings::WebAttribute::SpatialNavigationEnabled);
|
||||||
|
actions << createEngineSettingsAction(tr("Local content can access local files"),
|
||||||
|
QWebEngineSettings::WebAttribute::LocalContentCanAccessFileUrls);
|
||||||
|
actions << createEngineSettingsAction(tr("Hyperlink auditing enabled"),
|
||||||
|
QWebEngineSettings::WebAttribute::HyperlinkAuditingEnabled);
|
||||||
|
actions << createEngineSettingsAction(tr("Animate scrolling"),
|
||||||
|
QWebEngineSettings::WebAttribute::ScrollAnimatorEnabled);
|
||||||
actions << createEngineSettingsAction(tr("Error pages enabled"), QWebEngineSettings::WebAttribute::ErrorPageEnabled);
|
actions << createEngineSettingsAction(tr("Error pages enabled"), QWebEngineSettings::WebAttribute::ErrorPageEnabled);
|
||||||
actions << createEngineSettingsAction(tr("Plugins enabled"), QWebEngineSettings::WebAttribute::PluginsEnabled);
|
actions << createEngineSettingsAction(tr("Plugins enabled"), QWebEngineSettings::WebAttribute::PluginsEnabled);
|
||||||
actions << createEngineSettingsAction(tr("Fullscreen enabled"), QWebEngineSettings::WebAttribute::FullScreenSupportEnabled);
|
actions << createEngineSettingsAction(tr("Fullscreen enabled"),
|
||||||
|
QWebEngineSettings::WebAttribute::FullScreenSupportEnabled);
|
||||||
|
|
||||||
#if !defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
#if !defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
||||||
actions << createEngineSettingsAction(tr("Screen capture enabled"), QWebEngineSettings::WebAttribute::ScreenCaptureEnabled);
|
actions << createEngineSettingsAction(tr("Screen capture enabled"),
|
||||||
|
QWebEngineSettings::WebAttribute::ScreenCaptureEnabled);
|
||||||
actions << createEngineSettingsAction(tr("WebGL enabled"), QWebEngineSettings::WebAttribute::WebGLEnabled);
|
actions << createEngineSettingsAction(tr("WebGL enabled"), QWebEngineSettings::WebAttribute::WebGLEnabled);
|
||||||
actions << createEngineSettingsAction(tr("Accelerate 2D canvas"), QWebEngineSettings::WebAttribute::Accelerated2dCanvasEnabled);
|
actions << createEngineSettingsAction(tr("Accelerate 2D canvas"),
|
||||||
actions << createEngineSettingsAction(tr("Print element backgrounds"), QWebEngineSettings::WebAttribute::PrintElementBackgrounds);
|
QWebEngineSettings::WebAttribute::Accelerated2dCanvasEnabled);
|
||||||
actions << createEngineSettingsAction(tr("Allow running insecure content"), QWebEngineSettings::WebAttribute::AllowRunningInsecureContent);
|
actions << createEngineSettingsAction(tr("Print element backgrounds"),
|
||||||
actions << createEngineSettingsAction(tr("Allow geolocation on insecure origins"), QWebEngineSettings::WebAttribute::AllowGeolocationOnInsecureOrigins);
|
QWebEngineSettings::WebAttribute::PrintElementBackgrounds);
|
||||||
|
actions << createEngineSettingsAction(tr("Allow running insecure content"),
|
||||||
|
QWebEngineSettings::WebAttribute::AllowRunningInsecureContent);
|
||||||
|
actions << createEngineSettingsAction(tr("Allow geolocation on insecure origins"),
|
||||||
|
QWebEngineSettings::WebAttribute::AllowGeolocationOnInsecureOrigins);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
actions << createEngineSettingsAction(tr("JS can activate windows"), QWebEngineSettings::WebAttribute::AllowWindowActivationFromJavaScript);
|
actions << createEngineSettingsAction(tr("JS can activate windows"),
|
||||||
|
QWebEngineSettings::WebAttribute::AllowWindowActivationFromJavaScript);
|
||||||
actions << createEngineSettingsAction(tr("Show scrollbars"), QWebEngineSettings::WebAttribute::ShowScrollBars);
|
actions << createEngineSettingsAction(tr("Show scrollbars"), QWebEngineSettings::WebAttribute::ShowScrollBars);
|
||||||
actions << createEngineSettingsAction(tr("Media playback with gestures"), QWebEngineSettings::WebAttribute::PlaybackRequiresUserGesture);
|
actions << createEngineSettingsAction(tr("Media playback with gestures"),
|
||||||
actions << createEngineSettingsAction(tr("WebRTC uses only public interfaces"), QWebEngineSettings::WebAttribute::WebRTCPublicInterfacesOnly);
|
QWebEngineSettings::WebAttribute::PlaybackRequiresUserGesture);
|
||||||
actions << createEngineSettingsAction(tr("JS can paste from clipboard"), QWebEngineSettings::WebAttribute::JavascriptCanPaste);
|
actions << createEngineSettingsAction(tr("WebRTC uses only public interfaces"),
|
||||||
actions << createEngineSettingsAction(tr("DNS prefetch enabled"), QWebEngineSettings::WebAttribute::DnsPrefetchEnabled);
|
QWebEngineSettings::WebAttribute::WebRTCPublicInterfacesOnly);
|
||||||
|
actions << createEngineSettingsAction(tr("JS can paste from clipboard"),
|
||||||
|
QWebEngineSettings::WebAttribute::JavascriptCanPaste);
|
||||||
|
actions << createEngineSettingsAction(tr("DNS prefetch enabled"),
|
||||||
|
QWebEngineSettings::WebAttribute::DnsPrefetchEnabled);
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050D00 // Qt >= 5.13.0
|
#if QT_VERSION >= 0x050D00 // Qt >= 5.13.0
|
||||||
actions << createEngineSettingsAction(tr("PDF viewer enabled"), QWebEngineSettings::WebAttribute::PdfViewerEnabled);
|
actions << createEngineSettingsAction(tr("PDF viewer enabled"), QWebEngineSettings::WebAttribute::PdfViewerEnabled);
|
||||||
@ -345,7 +371,9 @@ QAction* WebFactory::createEngineSettingsAction(const QString& title, QWebEngine
|
|||||||
|
|
||||||
act->setData(attribute);
|
act->setData(attribute);
|
||||||
act->setCheckable(true);
|
act->setCheckable(true);
|
||||||
act->setChecked(qApp->settings()->value(WebEngineAttributes::ID, QString::number(static_cast<int>(attribute)), true).toBool());
|
act->setChecked(qApp->settings()
|
||||||
|
->value(WebEngineAttributes::ID, QString::number(static_cast<int>(attribute)), true)
|
||||||
|
.toBool());
|
||||||
QWebEngineProfile::defaultProfile()->settings()->setAttribute(attribute, act->isChecked());
|
QWebEngineProfile::defaultProfile()->settings()->setAttribute(attribute, act->isChecked());
|
||||||
connect(act, &QAction::toggled, this, &WebFactory::webEngineSettingChanged);
|
connect(act, &QAction::toggled, this, &WebFactory::webEngineSettingChanged);
|
||||||
return act;
|
return act;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user