]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix an issue with focus lost after closing terminal panel
authorAndrey Yashkin <andreyyashkin@gmail.com>
Sun, 11 Aug 2019 11:11:37 +0000 (13:11 +0200)
committerElvis Angelaccio <elvis.angelaccio@kde.org>
Sun, 11 Aug 2019 11:14:00 +0000 (13:14 +0200)
Summary:
After leaving terminal with Ctrl-D or exit commands the input focus isn't set back to the folder view.
The problem appears, because `TerminalPanel::isHiddenInVisibleWindow` returns not what it supposed to return,
since when the terminal process exits, `m_terminal` is set to nullptr.

I moved unwanted checks from it inside `TerminalPanel::dockVisibilityChanged`

This change also exposes a crash in `DolphinMainWindow::slotTerminalPanelVisibilityChanged()`,
which was previously working only by luck.
Now we check whether `m_activeViewContainer` is not null before using it.

BUG: 407979
FIXED-IN: 19.11.80

Test Plan:
1. Open Dolphin
2. Press F4 to open the terminal panel
3. Type exit<Enter> or press Ctrl-D
4. Check current focus widget

Reviewers: #dolphin

Subscribers: ngraham, elvisangelaccio, kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D22420

src/dolphinmainwindow.cpp
src/panels/terminal/terminalpanel.cpp

index 19f7906629ad75dd2145c15d2ea0b37b8c5d93e9..ad193b0517392c3a7e82f1807f4a3ebc6ca35e7b 100644 (file)
@@ -751,7 +751,7 @@ void DolphinMainWindow::togglePanelLockState()
 
 void DolphinMainWindow::slotTerminalPanelVisibilityChanged()
 {
-    if (m_terminalPanel->isHiddenInVisibleWindow()) {
+    if (m_terminalPanel->isHiddenInVisibleWindow() && m_activeViewContainer) {
         m_activeViewContainer->view()->setFocus();
     }
 }
index 52d2a77df7a31dd08b8a26c76f49080e88789388..86974d200e4d23190222367c07b86d226037e813 100644 (file)
@@ -82,16 +82,14 @@ void TerminalPanel::terminalExited()
 bool TerminalPanel::isHiddenInVisibleWindow() const
 {
     return parentWidget()
-        && parentWidget()->isHidden()
-        && m_terminal
-        && !hasProgramRunning();
+        && parentWidget()->isHidden();
 }
 
 void TerminalPanel::dockVisibilityChanged()
 {
     // Only react when the DockWidget itself (not some parent) is hidden. This way we don't
     // respond when e.g. Dolphin is minimized.
-    if (isHiddenInVisibleWindow()) {
+    if (isHiddenInVisibleWindow() && m_terminal && !hasProgramRunning()) {
         // Make sure that the following "cd /" command will not affect the view.
         disconnect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)),
                    this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString)));