From 54c409d967f9e823afdb8d9f94d775074c284aa0 Mon Sep 17 00:00:00 2001
From: Behnam Emamian <emamian@persianprocess.com>
Date: Fri, 17 Feb 2017 23:50:27 +1100
Subject: [PATCH] Use external video player by hidden setting (#3021)

Signed-off-by: Behnam Emamian <emamian@persianprocess.com> (github: BehnamEmamian)
---
 Telegram/SourceFiles/localstorage.cpp             | 10 ++++++++++
 Telegram/SourceFiles/settings.cpp                 |  1 +
 Telegram/SourceFiles/settings.h                   |  1 +
 Telegram/SourceFiles/settings/settings_widget.cpp |  8 ++++++++
 Telegram/SourceFiles/window/main_window.cpp       | 12 ++++++++----
 5 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/Telegram/SourceFiles/localstorage.cpp b/Telegram/SourceFiles/localstorage.cpp
index 928ffed1d..4be868571 100644
--- a/Telegram/SourceFiles/localstorage.cpp
+++ b/Telegram/SourceFiles/localstorage.cpp
@@ -559,6 +559,7 @@ enum {
 	dbiNotificationsCorner = 0x46,
 	dbiTheme = 0x47,
 	dbiDialogsWidthRatio = 0x48,
+	dbiUseExternalVideoPlayer = 0x49,
 
 	dbiEncryptedWithSalt = 333,
 	dbiEncrypted = 444,
@@ -928,6 +929,14 @@ bool _readSetting(quint32 blockId, QDataStream &stream, int version) {
 		cSetSendToMenu(v == 1);
 	} break;
 
+	case dbiUseExternalVideoPlayer: {
+		qint32 v;
+		stream >> v;
+		if (!_checkStreamStatus(stream)) return false;
+
+		cSetUseExternalVideoPlayer(v == 1);
+	} break;
+
 	case dbiSoundNotify: {
 		qint32 v;
 		stream >> v;
@@ -1656,6 +1665,7 @@ void _writeUserSettings() {
 	data.stream << quint32(dbiModerateMode) << qint32(Global::ModerateModeEnabled() ? 1 : 0);
 	data.stream << quint32(dbiAutoPlay) << qint32(cAutoPlayGif() ? 1 : 0);
 	data.stream << quint32(dbiDialogsWidthRatio) << qint32(snap(qRound(Global::DialogsWidthRatio() * 1000000), 0, 1000000));
+	data.stream << quint32(dbiUseExternalVideoPlayer) << qint32(cUseExternalVideoPlayer());
 
 	{
 		RecentEmojisPreload v(cRecentEmojisPreload());
diff --git a/Telegram/SourceFiles/settings.cpp b/Telegram/SourceFiles/settings.cpp
index eebfbc1b6..5d1a59c7d 100644
--- a/Telegram/SourceFiles/settings.cpp
+++ b/Telegram/SourceFiles/settings.cpp
@@ -51,6 +51,7 @@ bool gStartMinimized = false;
 bool gStartInTray = false;
 bool gAutoStart = false;
 bool gSendToMenu = false;
+bool gUseExternalVideoPlayer = false;
 bool gAutoUpdate = true;
 TWindowPos gWindowPos;
 LaunchMode gLaunchMode = LaunchModeNormal;
diff --git a/Telegram/SourceFiles/settings.h b/Telegram/SourceFiles/settings.h
index 2801d48b1..afacd7025 100644
--- a/Telegram/SourceFiles/settings.h
+++ b/Telegram/SourceFiles/settings.h
@@ -69,6 +69,7 @@ DeclareSetting(bool, AutoStart);
 DeclareSetting(bool, StartMinimized);
 DeclareSetting(bool, StartInTray);
 DeclareSetting(bool, SendToMenu);
+DeclareSetting(bool, UseExternalVideoPlayer);
 enum LaunchMode {
 	LaunchModeNormal = 0,
 	LaunchModeAutoStart,
diff --git a/Telegram/SourceFiles/settings/settings_widget.cpp b/Telegram/SourceFiles/settings/settings_widget.cpp
index 6db50f88e..f107776f5 100644
--- a/Telegram/SourceFiles/settings/settings_widget.cpp
+++ b/Telegram/SourceFiles/settings/settings_widget.cpp
@@ -88,6 +88,14 @@ void fillCodes() {
 			main->getDifference();
 		}
 	});
+	Codes.insert(qsl("videoplayer"), []() {
+		auto text = cUseExternalVideoPlayer() ? qsl("Use internal video player?") : qsl("Use external video player?");
+		Ui::show(Box<ConfirmBox>(text, [] {
+			cSetUseExternalVideoPlayer(!cUseExternalVideoPlayer());
+			Local::writeUserSettings();
+			Ui::hideLayer();
+		}));
+	});
 }
 
 void codesFeedString(const QString &text) {
diff --git a/Telegram/SourceFiles/window/main_window.cpp b/Telegram/SourceFiles/window/main_window.cpp
index 11a64eed3..5881928ad 100644
--- a/Telegram/SourceFiles/window/main_window.cpp
+++ b/Telegram/SourceFiles/window/main_window.cpp
@@ -99,10 +99,14 @@ void MainWindow::showPhoto(PhotoData *photo, PeerData *peer) {
 }
 
 void MainWindow::showDocument(DocumentData *doc, HistoryItem *item) {
-	if (_mediaView->isHidden()) Ui::hideLayer(true);
-	_mediaView->showDocument(doc, item);
-	_mediaView->activateWindow();
-	_mediaView->setFocus();
+	if (cUseExternalVideoPlayer() && doc->isVideo()) {
+		QDesktopServices::openUrl(QUrl("file:///" + doc->location(false).fname));
+	} else {
+		if (_mediaView->isHidden()) Ui::hideLayer(true);
+		_mediaView->showDocument(doc, item);
+		_mediaView->activateWindow();
+		_mediaView->setFocus();
+	}
 }
 
 bool MainWindow::ui_isMediaViewShown() {