kdeui: new/delete size mismatch fix

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-04-20 21:40:37 +03:00
parent a70b781c58
commit 936a4e3e84
2 changed files with 57 additions and 62 deletions

View file

@ -78,45 +78,24 @@ static KStatusBar *internalStatusBar(KMainWindow *mw)
return KGlobal::findDirectChild<KStatusBar *>(mw); return KGlobal::findDirectChild<KStatusBar *>(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) : DockResizeListener::DockResizeListener(KMainWindow *win) :
QObject(win), QObject(win),
m_win(win) m_win(win)
{ {
} }
DockResizeListener::~DockResizeListener()
{
}
bool DockResizeListener::eventFilter(QObject *watched, QEvent *event) bool DockResizeListener::eventFilter(QObject *watched, QEvent *event)
{ {
switch( event->type() ) { switch (event->type()) {
case QEvent::Resize: case QEvent::Resize:
case QEvent::Move: case QEvent::Move:
case QEvent::Hide: case QEvent::Hide: {
m_win->k_ptr->setSettingsDirty(true); m_win->k_ptr->setSettingsDirty(true);
break; break;
}
default: default: {
break; break;
}
} }
return QObject::eventFilter(watched, event); return QObject::eventFilter(watched, event);
@ -128,9 +107,7 @@ public:
KMWSessionManager() KMWSessionManager()
{ {
} }
~KMWSessionManager()
{
}
bool dummyInit() { return true; } bool dummyInit() { return true; }
bool saveState( QSessionManager& ) bool saveState( QSessionManager& )
{ {
@ -448,7 +425,7 @@ void KMainWindow::parseGeometry(bool parsewidth)
KMainWindow::~KMainWindow() KMainWindow::~KMainWindow()
{ {
sMemberList->removeAll( this ); sMemberList->removeAll( this );
delete static_cast<QObject *>(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; delete k_ptr;
KGlobal::deref(); KGlobal::deref();
} }
@ -924,24 +901,25 @@ void KMainWindow::saveAutoSaveSettings()
{ {
K_D(KMainWindow); K_D(KMainWindow);
Q_ASSERT( d->autoSaveSettings ); Q_ASSERT( d->autoSaveSettings );
//kDebug(200) << "KMainWindow::saveAutoSaveSettings -> saving settings"; // kDebug(200) << "KMainWindow::saveAutoSaveSettings -> saving settings";
saveMainWindowSettings(d->autoSaveGroup); saveMainWindowSettings(d->autoSaveGroup);
d->autoSaveGroup.sync(); d->autoSaveGroup.sync();
d->settingsDirty = false; d->settingsDirty = false;
} }
bool KMainWindow::event( QEvent* ev ) bool KMainWindow::event(QEvent *ev)
{ {
K_D(KMainWindow); K_D(KMainWindow);
switch( ev->type() ) { switch (ev->type()) {
case QEvent::Resize: case QEvent::Resize: {
d->setSizeDirty(); d->setSizeDirty();
break; break;
case QEvent::Polish: }
d->polish(this); case QEvent::Polish: {
break; d->polish(this);
case QEvent::ChildPolished: break;
{ }
case QEvent::ChildPolished: {
QChildEvent *event = static_cast<QChildEvent*>(ev); QChildEvent *event = static_cast<QChildEvent*>(ev);
QDockWidget *dock = qobject_cast<QDockWidget*>(event->child()); QDockWidget *dock = qobject_cast<QDockWidget*>(event->child());
KToolBar *toolbar = qobject_cast<KToolBar*>(event->child()); KToolBar *toolbar = qobject_cast<KToolBar*>(event->child());
@ -966,10 +944,9 @@ bool KMainWindow::event( QEvent* ev )
// hence install an event filter instead // hence install an event filter instead
menubar->installEventFilter(k_ptr->dockResizeListener); menubar->installEventFilter(k_ptr->dockResizeListener);
} }
break;
} }
break; case QEvent::ChildRemoved: {
case QEvent::ChildRemoved:
{
QChildEvent *event = static_cast<QChildEvent*>(ev); QChildEvent *event = static_cast<QChildEvent*>(ev);
QDockWidget *dock = qobject_cast<QDockWidget*>(event->child()); QDockWidget *dock = qobject_cast<QDockWidget*>(event->child());
KToolBar *toolbar = qobject_cast<KToolBar*>(event->child()); KToolBar *toolbar = qobject_cast<KToolBar*>(event->child());
@ -987,12 +964,13 @@ bool KMainWindow::event( QEvent* ev )
} else if (menubar) { } else if (menubar) {
menubar->removeEventFilter(k_ptr->dockResizeListener); menubar->removeEventFilter(k_ptr->dockResizeListener);
} }
break;
}
default: {
break;
} }
break;
default:
break;
} }
return QMainWindow::event( ev ); return QMainWindow::event(ev);
} }
bool KMainWindow::hasMenuBar() bool KMainWindow::hasMenuBar()

View file

@ -30,29 +30,46 @@
#define KMAINWINDOW_P_H #define KMAINWINDOW_P_H
#include <kconfiggroup.h> #include <kconfiggroup.h>
#include <qpointer.h> #include <QPointer>
#include <QObject>
#include <QTimer>
#define K_D(Class) Class##Private * const d = k_func() #define K_D(Class) Class##Private * const d = k_func()
#include <QObject>
#include <QTimer>
class KHelpMenu; 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 class KMainWindowPrivate
{ {
public: public:
bool autoSaveSettings:1; bool autoSaveSettings;
bool settingsDirty:1; bool settingsDirty;
bool autoSaveWindowSize:1; bool autoSaveWindowSize;
bool care_about_geometry:1; bool care_about_geometry;
bool sizeApplied:1; bool sizeApplied;
KConfigGroup autoSaveGroup; KConfigGroup autoSaveGroup;
QTimer *settingsTimer; QTimer *settingsTimer;
QTimer *sizeTimer; QTimer *sizeTimer;
QRect defaultWindowSize; QRect defaultWindowSize;
KHelpMenu *helpMenu; KHelpMenu *helpMenu;
KMainWindow *q; KMainWindow *q;
QPointer<QObject> dockResizeListener; QPointer<DockResizeListener> dockResizeListener;
QString dbusName; QString dbusName;
bool letDirtySettings; bool letDirtySettings;