From 936a4e3e84c23878788f4bfc8359416683420455 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Sat, 20 Apr 2024 21:40:37 +0300 Subject: [PATCH] kdeui: new/delete size mismatch fix Signed-off-by: Ivailo Monev --- kdeui/widgets/kmainwindow.cpp | 84 +++++++++++++---------------------- kdeui/widgets/kmainwindow_p.h | 35 +++++++++++---- 2 files changed, 57 insertions(+), 62 deletions(-) diff --git a/kdeui/widgets/kmainwindow.cpp b/kdeui/widgets/kmainwindow.cpp index 2d7242d1..2c81feaf 100644 --- a/kdeui/widgets/kmainwindow.cpp +++ b/kdeui/widgets/kmainwindow.cpp @@ -78,45 +78,24 @@ static KStatusBar *internalStatusBar(KMainWindow *mw) return KGlobal::findDirectChild(mw); } -/** - * Listens to resize events from QDockWidgets. The KMainWindow - * settings are set as dirty, as soon as at least one resize - * event occurred. The listener is attached to the dock widgets - * by dock->installEventFilter(dockResizeListener) inside - * KMainWindow::event(). - */ -class DockResizeListener : public QObject -{ -public: - DockResizeListener(KMainWindow *win); - virtual ~DockResizeListener(); - virtual bool eventFilter(QObject *watched, QEvent *event); - -private: - KMainWindow *m_win; -}; - DockResizeListener::DockResizeListener(KMainWindow *win) : QObject(win), m_win(win) { } -DockResizeListener::~DockResizeListener() -{ -} - bool DockResizeListener::eventFilter(QObject *watched, QEvent *event) { - switch( event->type() ) { - case QEvent::Resize: - case QEvent::Move: - case QEvent::Hide: - m_win->k_ptr->setSettingsDirty(true); - break; - - default: - break; + switch (event->type()) { + case QEvent::Resize: + case QEvent::Move: + case QEvent::Hide: { + m_win->k_ptr->setSettingsDirty(true); + break; + } + default: { + break; + } } return QObject::eventFilter(watched, event); @@ -128,9 +107,7 @@ public: KMWSessionManager() { } - ~KMWSessionManager() - { - } + bool dummyInit() { return true; } bool saveState( QSessionManager& ) { @@ -448,7 +425,7 @@ void KMainWindow::parseGeometry(bool parsewidth) KMainWindow::~KMainWindow() { sMemberList->removeAll( this ); - delete static_cast(k_ptr->dockResizeListener); //so we don't get anymore events after k_ptr is destroyed + delete k_ptr->dockResizeListener.data(); // to not get events after k_ptr is destroyed delete k_ptr; KGlobal::deref(); } @@ -924,24 +901,25 @@ void KMainWindow::saveAutoSaveSettings() { K_D(KMainWindow); Q_ASSERT( d->autoSaveSettings ); - //kDebug(200) << "KMainWindow::saveAutoSaveSettings -> saving settings"; + // kDebug(200) << "KMainWindow::saveAutoSaveSettings -> saving settings"; saveMainWindowSettings(d->autoSaveGroup); d->autoSaveGroup.sync(); d->settingsDirty = false; } -bool KMainWindow::event( QEvent* ev ) +bool KMainWindow::event(QEvent *ev) { K_D(KMainWindow); - switch( ev->type() ) { - case QEvent::Resize: - d->setSizeDirty(); - break; - case QEvent::Polish: - d->polish(this); - break; - case QEvent::ChildPolished: - { + switch (ev->type()) { + case QEvent::Resize: { + d->setSizeDirty(); + break; + } + case QEvent::Polish: { + d->polish(this); + break; + } + case QEvent::ChildPolished: { QChildEvent *event = static_cast(ev); QDockWidget *dock = qobject_cast(event->child()); KToolBar *toolbar = qobject_cast(event->child()); @@ -966,10 +944,9 @@ bool KMainWindow::event( QEvent* ev ) // hence install an event filter instead menubar->installEventFilter(k_ptr->dockResizeListener); } + break; } - break; - case QEvent::ChildRemoved: - { + case QEvent::ChildRemoved: { QChildEvent *event = static_cast(ev); QDockWidget *dock = qobject_cast(event->child()); KToolBar *toolbar = qobject_cast(event->child()); @@ -987,12 +964,13 @@ bool KMainWindow::event( QEvent* ev ) } else if (menubar) { menubar->removeEventFilter(k_ptr->dockResizeListener); } + break; + } + default: { + break; } - break; - default: - break; } - return QMainWindow::event( ev ); + return QMainWindow::event(ev); } bool KMainWindow::hasMenuBar() diff --git a/kdeui/widgets/kmainwindow_p.h b/kdeui/widgets/kmainwindow_p.h index f30e530b..0320433b 100644 --- a/kdeui/widgets/kmainwindow_p.h +++ b/kdeui/widgets/kmainwindow_p.h @@ -30,29 +30,46 @@ #define KMAINWINDOW_P_H #include -#include +#include +#include +#include #define K_D(Class) Class##Private * const d = k_func() -#include -#include class KHelpMenu; +/** + * Listens to resize events from QDockWidgets. The KMainWindow settings are set as dirty as soon as + * at least one resize event occurred. The listener is attached to the dock widgets installing + * event filter inside KMainWindow::event(). + */ +class DockResizeListener : public QObject +{ +public: + DockResizeListener(KMainWindow *win); + + bool eventFilter(QObject *watched, QEvent *event) final; + +private: + KMainWindow *m_win; +}; + + class KMainWindowPrivate { public: - bool autoSaveSettings:1; - bool settingsDirty:1; - bool autoSaveWindowSize:1; - bool care_about_geometry:1; - bool sizeApplied:1; + bool autoSaveSettings; + bool settingsDirty; + bool autoSaveWindowSize; + bool care_about_geometry; + bool sizeApplied; KConfigGroup autoSaveGroup; QTimer *settingsTimer; QTimer *sizeTimer; QRect defaultWindowSize; KHelpMenu *helpMenu; KMainWindow *q; - QPointer dockResizeListener; + QPointer dockResizeListener; QString dbusName; bool letDirtySettings;