From 9d6f50ac5096282841739c2feedf3aee3671927d Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Thu, 23 Oct 2014 23:17:43 +0200 Subject: [PATCH 1/3] Connect to the currentDirectoryChanged signal after the shell setup This fixes the problem that the view URL may be reset to the Home URL when opening the Terminal Panel while browsing a remote URL. Moreover, it fixes crashes that can occur when the signal is received during the shell setup if the DolphinMainWindow does not have a valid m_activeViewContainer yet. BUG: 339502 BUG: 340233 REVIEW: 120726 FIXED-IN: 4.14.3 --- src/panels/terminal/terminalpanel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index bfd3002f0b..1e5a33617d 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -116,11 +116,11 @@ void TerminalPanel::showEvent(QShowEvent* event) } } if (m_terminal) { - connect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)), - this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString))); m_terminal->showShellInDir(url().toLocalFile()); changeDir(url()); m_terminalWidget->setFocus(); + connect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)), + this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString))); } Panel::showEvent(event); From 3f28c704236e8a909bb47bcd2695c0e0a9d74c23 Mon Sep 17 00:00:00 2001 From: Andrey Bondrov Date: Fri, 24 Oct 2014 08:21:37 +0200 Subject: [PATCH 2/3] Fix the information panel video player in Dolphin. Patch from ROSA Linux. BUG: 337107 BUG: 337033 BUG: 334924 CCBUG: 339882 REVIEW: 120745 FIXED-IN: 4.14.3 --- src/panels/information/phononwidget.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/panels/information/phononwidget.cpp b/src/panels/information/phononwidget.cpp index a36ada1801..3d9909239c 100644 --- a/src/panels/information/phononwidget.cpp +++ b/src/panels/information/phononwidget.cpp @@ -184,6 +184,13 @@ void PhononWidget::play() m_seekSlider->setMediaObject(m_media); } + if (!m_videoPlayer) { + m_videoPlayer = new EmbeddedVideoPlayer(this); + m_topLayout->insertWidget(0, m_videoPlayer); + Phonon::createPath(m_media, m_videoPlayer); + applyVideoSize(); + } + if (!m_audioOutput) { m_audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); Phonon::createPath(m_media, m_audioOutput); @@ -217,15 +224,6 @@ void PhononWidget::slotHasVideoChanged(bool hasVideo) emit hasVideoChanged(hasVideo); if (hasVideo) { - if (!m_videoPlayer) { - // Replay the media to apply path changes - m_media->stop(); - m_videoPlayer = new EmbeddedVideoPlayer(this); - m_topLayout->insertWidget(0, m_videoPlayer); - Phonon::createPath(m_media, m_videoPlayer); - m_media->play(); - } - applyVideoSize(); m_videoPlayer->show(); } } From d9700c4d432ba5ae034bb76635984800373ade33 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Fri, 24 Oct 2014 18:13:47 +0200 Subject: [PATCH 3/3] Make the view/Terminal Panel synchronization less error-prone The previous solution could cause problems if the user navigates to a different URL in one view, and then activates another split view very quickly: the new active view might be switched to the same URL as the first view, which is unwanted. To fix this problem, we record a history of "cd" commands that Dolphin sends to the Terminal Panel in a queue. If a currentDirectoryChanged signal is received, and the new terminal directory is "dir", this patch does the following: 1. If the queue is empty, change the view URL to "dir". 2. Otherwise, take the queue's head, and check if it is equal to "dir". If that is the case, ignore the signal and return. 3. Go back to step 1. This ensures that every currentDirectoryChange signal that is caused by a "cd" that was sent from Dolphin to the terminal is ignored. BUG: 339009 BUG: 314038 REVIEW: 120768 --- src/panels/terminal/terminalpanel.cpp | 27 +++++++++++++++++---------- src/panels/terminal/terminalpanel.h | 3 +++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 1e5a33617d..f827503a2b 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -42,7 +42,8 @@ TerminalPanel::TerminalPanel(QWidget* parent) : m_terminal(0), m_terminalWidget(0), m_konsolePart(0), - m_konsolePartCurrentDirectory() + m_konsolePartCurrentDirectory(), + m_sendCdToTerminalHistory() { m_layout = new QVBoxLayout(this); m_layout->setMargin(0); @@ -161,7 +162,12 @@ void TerminalPanel::sendCdToTerminal(const QString& dir) } m_terminal->sendInput(" cd " + KShell::quoteArg(dir) + '\n'); - m_konsolePartCurrentDirectory = dir; + + // We want to ignore the currentDirectoryChanged(QString) signal, which we will receive after + // the directory change, because this directory change is not caused by a "cd" command that the + // user entered in the panel. Therefore, we have to remember 'dir'. Note that it could also be + // a symbolic link -> remember the 'canonical' path. + m_sendCdToTerminalHistory.enqueue(QDir(dir).canonicalPath()); if (m_clearTerminal) { m_terminal->sendInput(" clear\n"); @@ -182,16 +188,17 @@ void TerminalPanel::slotMostLocalUrlResult(KJob* job) void TerminalPanel::slotKonsolePartCurrentDirectoryChanged(const QString& dir) { - m_konsolePartCurrentDirectory = dir; + m_konsolePartCurrentDirectory = QDir(dir).canonicalPath(); - // Only change the view URL if 'dir' is different from the current view URL. - // Note that the current view URL could also be a symbolic link to 'dir' - // -> use QDir::canonicalPath() to check that. - const KUrl oldUrl(url()); - const KUrl newUrl(dir); - if (newUrl != oldUrl && dir != QDir(oldUrl.path()).canonicalPath()) { - emit changeUrl(newUrl); + // Only emit a changeUrl signal if the directory change was caused by the user inside the + // terminal, and not by sendCdToTerminal(QString). + while (!m_sendCdToTerminalHistory.empty()) { + if (m_konsolePartCurrentDirectory == m_sendCdToTerminalHistory.dequeue()) { + return; + } } + + emit changeUrl(dir); } #include "terminalpanel.moc" diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index 374476e1c0..b65239baf3 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -22,6 +22,8 @@ #include +#include + class TerminalInterfaceV2; class QVBoxLayout; class QWidget; @@ -82,6 +84,7 @@ private: QWidget* m_terminalWidget; KParts::ReadOnlyPart* m_konsolePart; QString m_konsolePartCurrentDirectory; + QQueue m_sendCdToTerminalHistory; }; #endif // TERMINALPANEL_H