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);
}
/**
* 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<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;
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<QChildEvent*>(ev);
QDockWidget *dock = qobject_cast<QDockWidget*>(event->child());
KToolBar *toolbar = qobject_cast<KToolBar*>(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<QChildEvent*>(ev);
QDockWidget *dock = qobject_cast<QDockWidget*>(event->child());
KToolBar *toolbar = qobject_cast<KToolBar*>(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()

View file

@ -30,29 +30,46 @@
#define KMAINWINDOW_P_H
#include <kconfiggroup.h>
#include <qpointer.h>
#include <QPointer>
#include <QObject>
#include <QTimer>
#define K_D(Class) Class##Private * const d = k_func()
#include <QObject>
#include <QTimer>
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<QObject> dockResizeListener;
QPointer<DockResizeListener> dockResizeListener;
QString dbusName;
bool letDirtySettings;