From c7e10ced977528c76e341c6e336b417afd667514 Mon Sep 17 00:00:00 2001
From: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
Date: Wed, 28 Oct 2026 06:21:34 -0300
Subject: Avoid Konsole widget class-name dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Track terminals through the shared Session registry and guard lookup during widget teardown.

Signed-off-by: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
---
 yakuake/src/session.cpp           | 84 ++++++++++++++++++++++++++++++++++-----
 yakuake/src/session.h             | 11 ++++-
 yakuake/src/terminal_splitter.cpp | 10 +++--
 yakuake/src/terminal_splitter.h   |  6 ++-
 4 files changed, 95 insertions(+), 16 deletions(-)

diff --git a/yakuake/src/session.cpp b/yakuake/src/session.cpp
index d644074..660b9f1 100644
--- a/yakuake/src/session.cpp
+++ b/yakuake/src/session.cpp
@@ -33,7 +33,7 @@ Session::Session(TQWidget* parent, SessionType type, const char* name) : TQObjec
     focus_watcher = new TerminalFocusWatcher(this);
     connect(focus_watcher, TQ_SIGNAL(focusChanged()), this, TQ_SLOT(slotFocusChanged()));
 
-    base_widget = new TerminalSplitter(TQt::Horizontal, parent, "base");
+    base_widget = new TerminalSplitter(TQt::Horizontal, this, parent, "base");
     connect(base_widget, TQ_SIGNAL(destroyed()), this, TQ_SLOT(slotLastTerminalClosed()));
 
     setenv("DCOP_YAKUAKE_SESSION", TQString::number(session_id).ascii(), 1);
@@ -265,10 +265,12 @@ void Session::createInitialSplits(SessionType type)
 
             base_widget->setOrientation(TQt::Vertical);
 
-            TerminalSplitter* upper_splitter = new TerminalSplitter(TQt::Horizontal, base_widget);
+            TerminalSplitter* upper_splitter = new TerminalSplitter(TQt::Horizontal,
+                this, base_widget);
             connect(upper_splitter, TQ_SIGNAL(destroyed()), this, TQ_SLOT(cleanup()));
 
-            TerminalSplitter* lower_splitter = new TerminalSplitter(TQt::Horizontal, base_widget);
+            TerminalSplitter* lower_splitter = new TerminalSplitter(TQt::Horizontal,
+                this, base_widget);
             connect(lower_splitter, TQ_SIGNAL(destroyed()), this, TQ_SLOT(cleanup()));
 
             Terminal* terminal = addTerminal(upper_splitter);
@@ -332,7 +334,7 @@ void Session::split(TQWidget* active_terminal, TQt::Orientation o)
         // add-and-remove action is done screwing with the splitter.
         TQValueList<int> splitter_sizes = splitter->sizes();
 
-        TerminalSplitter* new_splitter = new TerminalSplitter(o, splitter);
+        TerminalSplitter* new_splitter = new TerminalSplitter(o, this, splitter);
         connect(new_splitter, TQ_SIGNAL(destroyed()), this, TQ_SLOT(cleanup()));
 
         if (splitter->isFirst(active_terminal)) splitter->moveToFirst(new_splitter);
@@ -372,12 +374,71 @@ Terminal* Session::addTerminal(TQWidget* parent)
     return terminal;
 }
 
+bool Session::terminalIsInSplitter(TQWidget* widget, const TerminalSplitter* splitter,
+    bool recursive) const
+{
+    if (!widget || !splitter) return false;
+
+    TQWidget* parent = widget->parentWidget();
+    if (recursive)
+    {
+        while (parent && parent != splitter)
+            parent = parent->parentWidget();
+    }
+
+    return parent == splitter;
+}
+
+TQWidget* Session::findTerminalInSplitter(const TerminalSplitter* splitter, bool recursive) const
+{
+    if (!splitter) return nullptr;
+
+    for (const TQGuardedPtr<TQWidget>& widget_ptr : terminal_widgets)
+    {
+        TQWidget* widget = widget_ptr;
+        if (widget && terminalIsInSplitter(widget, splitter, recursive)) return widget;
+    }
+
+    return nullptr;
+}
+
+int Session::countTerminalsInSplitter(const TerminalSplitter* splitter, bool recursive) const
+{
+    if (!splitter) return 0;
+
+    int count = 0;
+
+    for (const TQGuardedPtr<TQWidget>& widget_ptr : terminal_widgets)
+    {
+        TQWidget* widget = widget_ptr;
+        if (widget && terminalIsInSplitter(widget, splitter, recursive)) ++count;
+    }
+
+    return count;
+}
+
 void Session::cleanup(int terminal_id)
 {
     /* Clean up the id <-> terminals */
 
+    TQMap<int, TQGuardedPtr<TQWidget> >::ConstIterator it = terminal_widgets.find(terminal_id);
+    TQWidget* widget = it != terminal_widgets.end() ? it.data() : nullptr;
+    if (widget)
+        terminal_ids.erase(widget);
+    else
+    {
+        TQMap<TQWidget*, int>::Iterator id_it = terminal_ids.begin();
+        for (; id_it != terminal_ids.end(); ++id_it)
+        {
+            if (id_it.data() == terminal_id)
+                break;
+        }
+
+        if (id_it != terminal_ids.end())
+            terminal_ids.erase(id_it);
+    }
+
     terminals.erase(terminal_id);
-    terminal_ids.erase(terminal_widgets[terminal_id]);
     terminal_widgets.erase(terminal_id);
     terminal_parts.erase(terminal_id);
 
@@ -412,11 +473,14 @@ void Session::slotTitleChange(TQWidget* w, const TQString& title)
 
 bool Session::checkFocusWidget()
 {
-    if (base_widget->focusWidget()
-        && base_widget->focusWidget()->isA(TQCString("Konsole::TEWidget")))
+    TQWidget* focus_widget = base_widget->focusWidget();
+    if (!focus_widget) return false;
+
+    for (const TQGuardedPtr<TQWidget>& widget_ptr : terminal_widgets)
     {
-        return true;
+        if (static_cast<TQWidget*>(widget_ptr) == focus_widget)
+            return true;
     }
-    else
-        return false;
+
+    return false;
 }
diff --git a/yakuake/src/session.h b/yakuake/src/session.h
index 329ae80..68fecd0 100644
--- a/yakuake/src/session.h
+++ b/yakuake/src/session.h
@@ -17,6 +17,8 @@
 
 #include <tqobject.h>
 #include <tqwidget.h>
+#include <tqguardedptr.h>
+#include <tqmap.h>
 
 
 class Terminal;
@@ -81,8 +83,15 @@ class Session : public TQObject
         void createInitialSplits(SessionType);
         void split(TQWidget* active_terminal, TQt::Orientation o);
         Terminal* addTerminal(TQWidget* parent);
+        // Null splitter queries return false, nullptr, or zero, respectively.
+        bool terminalIsInSplitter(TQWidget* widget, const TerminalSplitter* splitter,
+            bool recursive) const;
+        TQWidget* findTerminalInSplitter(const TerminalSplitter* splitter, bool recursive) const;
+        int countTerminalsInSplitter(const TerminalSplitter* splitter, bool recursive) const;
         bool checkFocusWidget();
 
+        friend class TerminalSplitter;
+
         static int available_session_id;
         int session_id;
         TQString session_title;
@@ -94,7 +103,7 @@ class Session : public TQObject
 
         TQMap<int, Terminal*> terminals;
         TQMap<TQWidget*, int> terminal_ids;
-        TQMap<int, TQWidget*> terminal_widgets;
+        TQMap<int, TQGuardedPtr<TQWidget> > terminal_widgets;
         TQMap<int, TerminalInterface*> terminal_parts;
 
 
diff --git a/yakuake/src/terminal_splitter.cpp b/yakuake/src/terminal_splitter.cpp
index e021ff0..1035771 100644
--- a/yakuake/src/terminal_splitter.cpp
+++ b/yakuake/src/terminal_splitter.cpp
@@ -12,12 +12,14 @@
 
 #include "terminal_splitter.h"
 #include "terminal_splitter.moc"
+#include "session.h"
 
 #include <tqobjectlist.h>
 
 
-TerminalSplitter::TerminalSplitter(TQt::Orientation o, TQWidget* parent, const char* name)
- : TQSplitter(o, parent, name)
+TerminalSplitter::TerminalSplitter(TQt::Orientation o,
+    Session* owner, TQWidget* parent, const char* name)
+ : TQSplitter(o, parent, name), session(owner)
 {
     is_shutting_down = false;
 }
@@ -47,7 +49,7 @@ void TerminalSplitter::focusLast()
 
     if (terminalCount(true) == 1)
     {
-        TQWidget* w = static_cast<TQWidget*>(child(0, TQCString("Konsole::TEWidget"), true));
+        TQWidget* w = session->findTerminalInSplitter(this, true);
         if (w) w->setFocus();
     }
     else
@@ -64,7 +66,7 @@ int TerminalSplitter::count()
 
 int TerminalSplitter::terminalCount(bool recursive)
 {
-    return queryList(TQCString("Konsole::TEWidget"), 0, false, recursive)->count();
+    return session->countTerminalsInSplitter(this, recursive);
 }
 
 int TerminalSplitter::splitterCount(bool recursive)
diff --git a/yakuake/src/terminal_splitter.h b/yakuake/src/terminal_splitter.h
index 353f241..9926438 100644
--- a/yakuake/src/terminal_splitter.h
+++ b/yakuake/src/terminal_splitter.h
@@ -17,13 +17,16 @@
 #include <tqsplitter.h>
 
 
+class Session;
+
 class TerminalSplitter : public TQSplitter
 {
     TQ_OBJECT
   
 
     public:
-        explicit TerminalSplitter(TQt::Orientation o, TQWidget* parent=0, const char* name=0);
+        explicit TerminalSplitter(TQt::Orientation o, Session* session,
+            TQWidget* parent=0, const char* name=0);
         ~TerminalSplitter();
 
         void focusNext();
@@ -43,6 +46,7 @@ class TerminalSplitter : public TQSplitter
 
     private:
         bool is_shutting_down;
+        Session* session;
 
 };
 
-- 
cgit v1.2.3

