1
//=============================================================================
3
// File : KviMdiManager.cpp
4
// Creation date : Wed Jun 21 2000 17:28:04 by Szymon Stefanek
6
// This file is part of the KVIrc irc client distribution
7
// Copyright (C) 2000 Szymon Stefanek (pragma at kvirc dot net)
8
// Copyright (C) 2008 TheXception (kvirc at thexception dot net)
10
// This program is FREE software. You can redistribute it and/or
11
// modify it under the terms of the GNU General Public License
12
// as published by the Free Software Foundation; either version 2
13
// of the License, or (at your opinion) any later version.
15
// This program is distributed in the HOPE that it will be USEFUL,
16
// but WITHOUT ANY WARRANTY; without even the implied warranty of
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18
// See the GNU General Public License for more details.
20
// You should have received a copy of the GNU General Public License
21
// along with this program. If not, write to the Free Software Foundation,
22
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24
//=============================================================================
27
* \file KviMdiManager.cpp
28
* \brief The MDI-manager
32
#include "kvi_debug.h"
33
#include "kvi_settings.h"
34
#include "KviMdiManager.h"
35
#include "KviMdiChild.h"
36
#include "KviLocale.h"
37
#include "KviOptions.h"
38
#include "KviIconManager.h"
39
#include "KviMainWindow.h"
40
#include "KviMenuBar.h"
41
#include "KviApplication.h"
42
#include "KviTalPopupMenu.h"
43
#include "KviTalHBox.h"
50
#include <QMouseEvent>
52
#include <QToolButton>
54
#ifdef COMPILE_PSEUDO_TRANSPARENCY
56
extern QPixmap * g_pShadedParentGlobalDesktopBackground;
63
* \def KVI_MDICHILD_MIN_WIDTH Defines the minimum width of the child
64
* \def KVI_MDICHILD_MIN_HEIGHT Defines the minimum height of the child
66
#define KVI_MDICHILD_MIN_WIDTH 100
67
#define KVI_MDICHILD_MIN_HEIGHT 40
69
KviMdiManager::KviMdiManager(QWidget * parent,KviMainWindow * pFrm,const char *)
72
setFrameShape(NoFrame);
73
m_bInSDIMode = KVI_OPTION_BOOL(KviOption_boolMdiManagerInSdiMode);
76
m_pWindowPopup = new KviTalPopupMenu(this);
77
connect(m_pWindowPopup,SIGNAL(activated(int)),this,SLOT(menuActivated(int)));
78
connect(m_pWindowPopup,SIGNAL(aboutToShow()),this,SLOT(fillWindowPopup()));
79
m_pTileMethodPopup = new KviTalPopupMenu(this);
80
connect(m_pTileMethodPopup,SIGNAL(activated(int)),this,SLOT(tileMethodMenuActivated(int)));
81
connect(this, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(slotSubWindowActivated(QMdiSubWindow *)));
83
setAutoFillBackground(false);
84
viewport()->setAutoFillBackground(false);
86
setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
87
setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
90
KviMdiManager::~KviMdiManager()
94
void KviMdiManager::paintEvent(QPaintEvent * e)
96
QPainter p(viewport());
98
#ifdef COMPILE_PSEUDO_TRANSPARENCY
99
if(KVI_OPTION_BOOL(KviOption_boolUseCompositingForTransparency) && g_pApp->supportsCompositing())
102
p.setCompositionMode(QPainter::CompositionMode_Source);
103
QColor col=KVI_OPTION_COLOR(KviOption_colorGlobalTransparencyFade);
104
col.setAlphaF((float)((float)KVI_OPTION_UINT(KviOption_uintGlobalTransparencyParentFadeFactor) / (float)100));
105
p.fillRect(e->rect(), col);
108
} else if(g_pShadedParentGlobalDesktopBackground)
110
QPoint pnt = viewport()->mapTo(g_pMainWindow, e->rect().topLeft() + scrollBarsOffset());
111
p.drawTiledPixmap(e->rect(),*(g_pShadedParentGlobalDesktopBackground), pnt);
115
if(KVI_OPTION_PIXMAP(KviOption_pixmapMdiBackground).pixmap())
117
QPoint pnt = viewport()->mapTo(g_pMainWindow, e->rect().topLeft() + scrollBarsOffset());
118
p.drawTiledPixmap(e->rect(),*(KVI_OPTION_PIXMAP(KviOption_pixmapMdiBackground).pixmap()), pnt);
120
p.fillRect(e->rect(),KVI_OPTION_COLOR(KviOption_colorMdiBackground));
124
void KviMdiManager::manageChild(KviMdiChild * lpC, bool, QRect *)
126
addSubWindow((QMdiSubWindow*)lpC);
129
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))
133
void KviMdiManager::showAndActivate(KviMdiChild * lpC)
137
lpC->showMaximized();
139
//qDebug("Showing window %x->%x",lpC,lpC->client());
141
//qDebug("Window %x->%x is visible is %d",lpC,lpC->client(),lpC->isVisible());
142
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))
145
setActiveSubWindow(lpC);
148
//qDebug("show and activate window %x->%x: geometry is %d,%d,%d,%d, visible is %d",lpC,lpC->client(),lpC->geometry().x(),lpC->geometry().y(),lpC->geometry().width(),lpC->geometry().height(),lpC->isVisible());
151
KviMdiChild * KviMdiManager::topChild()
153
return (KviMdiChild*)activeSubWindow();
156
void KviMdiManager::hideChild(KviMdiChild *lpC)
158
focusPreviousTopChild(lpC);
162
void KviMdiManager::destroyChild(KviMdiChild *lpC)
164
removeSubWindow(lpC);
169
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))
174
void KviMdiManager::setIsInSDIMode(bool bMode)
176
// qDebug("Sdi Mode %d", bMode);
177
m_bInSDIMode = bMode;
179
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
182
void KviMdiManager::focusPreviousTopChild(KviMdiChild * pExcludeThis)
184
KviMdiChild * lpC = NULL;
186
//QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::ActivationHistoryOrder);
187
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
188
QListIterator<QMdiSubWindow*> wl(tmp);
191
while(wl.hasPrevious())
193
QMdiSubWindow * pSubWindow = wl.previous();
195
if(!pSubWindow->inherits("KviMdiChild"))
198
lpC = static_cast<KviMdiChild *>(pSubWindow);
200
if(lpC == pExcludeThis)
203
if(!lpC->isVisible())
206
if(lpC->state() != KviMdiChild::Minimized)
216
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))
224
#define KVI_TILE_METHOD_ANODINE 0
225
#define KVI_TILE_METHOD_PRAGMA4HOR 1
226
#define KVI_TILE_METHOD_PRAGMA4VER 2
227
#define KVI_TILE_METHOD_PRAGMA6HOR 3
228
#define KVI_TILE_METHOD_PRAGMA6VER 4
229
#define KVI_TILE_METHOD_PRAGMA9HOR 5
230
#define KVI_TILE_METHOD_PRAGMA9VER 6
232
#define KVI_NUM_TILE_METHODS 7
234
void KviMdiManager::fillWindowPopup()
236
m_pWindowPopup->clear();
238
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::CascadeWindows)),(__tr2qs("&Cascade Windows")),this,SLOT(cascadeWindows()));
239
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::CascadeWindows)),(__tr2qs("Cascade &Maximized")),this,SLOT(cascadeMaximized()));
241
m_pWindowPopup->insertSeparator();
242
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("&Tile Windows")),this,SLOT(tile()));
244
m_pTileMethodPopup->clear();
245
int id = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::AutoTileWindows)),(__tr2qs("&Auto Tile")),this,SLOT(toggleAutoTile()));
246
m_pTileMethodPopup->setItemChecked(id,KVI_OPTION_BOOL(KviOption_boolAutoTileWindows));
247
m_pTileMethodPopup->setItemParameter(id,-1);
248
m_pTileMethodPopup->insertSeparator();
249
int ids[KVI_NUM_TILE_METHODS];
250
ids[KVI_TILE_METHOD_ANODINE] = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Anodine's Full Grid")));
251
m_pTileMethodPopup->setItemParameter(ids[KVI_TILE_METHOD_ANODINE],KVI_TILE_METHOD_ANODINE);
252
ids[KVI_TILE_METHOD_PRAGMA4HOR] = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Pragma's Horizontal 4-Grid")));
253
m_pTileMethodPopup->setItemParameter(ids[KVI_TILE_METHOD_PRAGMA4HOR],KVI_TILE_METHOD_PRAGMA4HOR);
254
ids[KVI_TILE_METHOD_PRAGMA4VER] = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Pragma's Vertical 4-Grid")));
255
m_pTileMethodPopup->setItemParameter(ids[KVI_TILE_METHOD_PRAGMA4VER],KVI_TILE_METHOD_PRAGMA4VER);
256
ids[KVI_TILE_METHOD_PRAGMA6HOR] = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Pragma's Horizontal 6-Grid")));
257
m_pTileMethodPopup->setItemParameter(ids[KVI_TILE_METHOD_PRAGMA6HOR],KVI_TILE_METHOD_PRAGMA6HOR);
258
ids[KVI_TILE_METHOD_PRAGMA6VER] = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Pragma's Vertical 6-Grid")));
259
m_pTileMethodPopup->setItemParameter(ids[KVI_TILE_METHOD_PRAGMA6VER],KVI_TILE_METHOD_PRAGMA6VER);
260
ids[KVI_TILE_METHOD_PRAGMA9HOR] = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Pragma's Horizontal 9-Grid")));
261
m_pTileMethodPopup->setItemParameter(ids[KVI_TILE_METHOD_PRAGMA9HOR],KVI_TILE_METHOD_PRAGMA9HOR);
262
ids[KVI_TILE_METHOD_PRAGMA9VER] = m_pTileMethodPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Pragma's Vertical 9-Grid")));
263
m_pTileMethodPopup->setItemParameter(ids[KVI_TILE_METHOD_PRAGMA9VER],KVI_TILE_METHOD_PRAGMA9VER);
265
if(KVI_OPTION_UINT(KviOption_uintTileMethod) >= KVI_NUM_TILE_METHODS)KVI_OPTION_UINT(KviOption_uintTileMethod) = KVI_TILE_METHOD_PRAGMA9HOR;
266
m_pTileMethodPopup->setItemChecked(ids[KVI_OPTION_UINT(KviOption_uintTileMethod)],true);
268
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::TileWindows)),(__tr2qs("Tile Met&hod")),m_pTileMethodPopup);
270
m_pWindowPopup->insertSeparator();
271
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::MaxVertical)),(__tr2qs("Expand &Vertically")),this,SLOT(expandVertical()));
272
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::MaxHorizontal)),(__tr2qs("Expand &Horizontally")),this,SLOT(expandHorizontal()));
274
m_pWindowPopup->insertSeparator();
275
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::Minimize)),(__tr2qs("Mi&nimize All")),this,SLOT(minimizeAll()));
276
m_pWindowPopup->insertItem(*(g_pIconManager->getSmallIcon(KviIconManager::Restore)),(__tr2qs("&Restore all")),this,SLOT(restoreAll()));
278
m_pWindowPopup->insertSeparator();
282
QList<QMdiSubWindow*> tmp = subWindowList(QMdiArea::StackingOrder);
283
QListIterator<QMdiSubWindow*> it(tmp);
289
lpC = (KviMdiChild *) it.next();
291
if (!lpC->inherits("KviMdiChild"))
297
szItem.setNum(((uint)i)-99);
300
szCaption = lpC->windowTitle();
301
if(szCaption.length() > 30)
303
QString trail = szCaption.right(12);
304
szCaption.truncate(12);
309
if(lpC->state()==KviMdiChild::Minimized)
314
} else szItem+=szCaption;
316
const QPixmap * pix = lpC->icon();
318
if (pix && !(pix->isNull()))
320
m_pWindowPopup->insertItem(*pix, szItem,i);
322
m_pWindowPopup->insertItem(szItem);
325
//this is useless, since the windows are listed in stacking order, the active one
326
//will always be the last anyway.
327
//if(lpC==currentSubWindow())
328
// m_pWindowPopup->setItemChecked(i, true );
333
void KviMdiManager::menuActivated(int id)
337
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
339
if(id >= tmp.count()) return;
340
if (!tmp.at(id)->inherits("KviMdiChild")) return;
342
KviMdiChild * lpC = (KviMdiChild *) tmp.at(id);
345
if(lpC->state() == KviMdiChild::Minimized)
348
setActiveSubWindow(lpC);
351
void KviMdiManager::ensureNoMaximized()
353
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
357
for(int i = 0; i < tmp.count(); i++)
359
if (tmp.at(i)->inherits("KviMdiChild"))
361
lpC = (KviMdiChild *) tmp.at(i);
362
if(lpC->state() == KviMdiChild::Maximized)lpC->restore();
367
void KviMdiManager::tileMethodMenuActivated(int id)
369
int idx = m_pTileMethodPopup->itemParameter(id);
372
if(idx >= KVI_NUM_TILE_METHODS) idx = KVI_TILE_METHOD_PRAGMA9VER;
374
KVI_OPTION_UINT(KviOption_uintTileMethod) = idx;
376
//we don't check the m_bInSDIMode value here, since it was
377
//the user forcing windows to be tiled
379
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows)) tile();
382
void KviMdiManager::cascadeWindows()
387
void KviMdiManager::cascadeMaximized()
390
QList<QMdiSubWindow *> tmp = subWindowList();
393
for(int i = 0; i < tmp.count(); i++)
395
if (tmp.at(i)->inherits("KviMdiChild"))
397
lpC = (KviMdiChild *) tmp.at(i);
398
if(lpC->state() != KviMdiChild::Minimized)
400
QPoint pnt(lpC->pos());
401
QSize curSize(viewport()->width() - pnt.x(),viewport()->height() - pnt.y());
402
if((lpC->minimumSize().width() > curSize.width()) ||
403
(lpC->minimumSize().height() > curSize.height()))lpC->resize(lpC->minimumSize());
404
else lpC->resize(curSize);
410
void KviMdiManager::expandVertical()
413
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
416
for(int i = 0; i < tmp.count(); i++)
418
if (tmp.at(i)->inherits("KviMdiChild"))
420
lpC = (KviMdiChild *) tmp.at(i);
421
if(lpC->state() != KviMdiChild::Minimized)
423
lpC->move(lpC->x(),0);
424
lpC->resize(lpC->width(),viewport()->height());
430
void KviMdiManager::expandHorizontal()
433
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
436
for(int i = 0; i < tmp.count(); i++)
438
if (tmp.at(i)->inherits("KviMdiChild"))
440
lpC = (KviMdiChild *) tmp.at(i);
441
if(lpC->state() != KviMdiChild::Minimized)
443
lpC->move(0,lpC->y());
444
lpC->resize(viewport()->width(),lpC->height());
450
void KviMdiManager::minimizeAll()
452
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
456
for(int i = 0; i < tmp.count(); i++)
458
if (tmp.at(i)->inherits("KviMdiChild"))
460
lpC = (KviMdiChild *) tmp.at(i);
461
if(lpC->state() != KviMdiChild::Minimized) lpC->minimize();
467
void KviMdiManager::restoreAll()
469
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
473
for(int i = 0; i < tmp.count(); i++)
475
if (tmp.at(i)->inherits("KviMdiChild"))
477
lpC = (KviMdiChild *) tmp.at(i);
478
if(lpC->state() == KviMdiChild::Minimized) lpC->restore();
482
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))tile();
485
int KviMdiManager::getVisibleChildCount()
487
QList<QMdiSubWindow *> l = subWindowList();
491
for(i = 0; i < l.count(); i++)
493
if(!l.at(i)->isMinimized()) cnt++;
498
void KviMdiManager::tile()
500
switch(KVI_OPTION_UINT(KviOption_uintTileMethod))
502
case KVI_TILE_METHOD_ANODINE: tileAnodine(); break;
503
case KVI_TILE_METHOD_PRAGMA4HOR: tileAllInternal(4,true); break;
504
case KVI_TILE_METHOD_PRAGMA4VER: tileAllInternal(4,false); break;
505
case KVI_TILE_METHOD_PRAGMA6HOR: tileAllInternal(6,true); break;
506
case KVI_TILE_METHOD_PRAGMA6VER: tileAllInternal(6,false); break;
507
case KVI_TILE_METHOD_PRAGMA9HOR: tileAllInternal(9,true); break;
508
case KVI_TILE_METHOD_PRAGMA9VER: tileAllInternal(9,false); break;
510
KVI_OPTION_UINT(KviOption_uintTileMethod) = KVI_TILE_METHOD_PRAGMA9HOR;
511
tileAllInternal(9,true);
516
void KviMdiManager::toggleAutoTile()
518
if(KVI_OPTION_BOOL(KviOption_boolAutoTileWindows))
520
KVI_OPTION_BOOL(KviOption_boolAutoTileWindows) = false;
522
KVI_OPTION_BOOL(KviOption_boolAutoTileWindows) = true;
527
void KviMdiManager::tileAllInternal(int maxWnds, bool bHorizontal) //int maxWnds,bool bHorizontal
530
//NUM WINDOWS = 1,2,3,4,5,6,7,8,9
531
static int colstable[9]={ 1,1,1,2,2,2,3,3,3 }; //num columns
532
static int rowstable[9]={ 1,2,3,2,3,3,3,3,3 }; //num rows
533
static int lastwindw[9]={ 1,1,1,1,2,1,3,2,1 }; //last window multiplier
534
static int colrecall[9]={ 0,0,0,3,3,3,6,6,6 }; //adjust self
535
static int rowrecall[9]={ 0,0,0,0,4,4,4,4,4 }; //adjust self
537
int * pColstable = bHorizontal ? colstable : rowstable;
538
int * pRowstable = bHorizontal ? rowstable : colstable;
539
int * pColrecall = bHorizontal ? colrecall : rowrecall;
540
int * pRowrecall = bHorizontal ? rowrecall : colrecall;
543
if (g_pApp->kviClosingDown()) return;
545
KviMdiChild * lpTop = topChild();
548
int numVisible = getVisibleChildCount();
550
if (numVisible < 1) return;
552
int numToHandle = ((numVisible > maxWnds) ? maxWnds : numVisible);
553
int xQuantum = viewport()->width() / pColstable[numToHandle-1];
555
if(xQuantum < ((lpTop->minimumSize().width() > KVI_MDICHILD_MIN_WIDTH) ? lpTop->minimumSize().width() : KVI_MDICHILD_MIN_WIDTH))
557
if (pColrecall[numToHandle-1] == 0) qDebug("Tile : Not enouh space");
558
else tileAllInternal(pColrecall[numToHandle-1], bHorizontal);
562
int yQuantum = viewport()->height() / pRowstable[numToHandle-1];
564
if(yQuantum < ((lpTop->minimumSize().height() > KVI_MDICHILD_MIN_HEIGHT) ? lpTop->minimumSize().height() : KVI_MDICHILD_MIN_HEIGHT))
566
if (pRowrecall[numToHandle-1] == 0) qDebug("Tile : Not enough space");
567
else tileAllInternal(pRowrecall[numToHandle-1], bHorizontal);
577
QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder);
579
for(int i = 0; i < tmp.count(); i++)
581
KviMdiChild * lpC = (KviMdiChild*) tmp.at(i);
583
if(lpC->state()!=KviMdiChild::Minimized)
585
if((curWin%numToHandle)==0)
587
lpC->move(curX, curY);
588
lpC->resize(xQuantum * lastwindw[numToHandle-1], yQuantum);
590
lpC->move(curX, curY);
591
lpC->resize(xQuantum, yQuantum);
593
//example : 12 windows : 3 cols 3 rows
594
if (curCol < pColstable[numToHandle-1])
596
curX += xQuantum; //add a column in the same row
597
curCol++; //increase current column
600
curCol = 1; //column 1
601
if (curRow < pRowstable[numToHandle-1])
603
curY += yQuantum; //add a row
606
curY = 0; //restart from beginning
613
if(lpTop)lpTop->setFocus();
616
void KviMdiManager::tileAnodine()
618
this->tileSubWindows();
621
void KviMdiManager::slotSubWindowActivated(QMdiSubWindow * pMdiChild)
625
if(((KviMdiChild*)pMdiChild)->client() && g_pMainWindow->isActiveWindow())
627
//qDebug("subwindowactivated %p %s",pMdiChild, ((KviMdiChild*)pMdiChild)->plainCaption().toUtf8().data());
628
g_pMainWindow->childWindowActivated((KviWindow *)((KviMdiChild*)pMdiChild)->client());
630
//qDebug("(inactive) subwindowactivated %p %s",pMdiChild, ((KviMdiChild*)pMdiChild)->plainCaption().toUtf8().data());
633
//last subwindow deactivated
634
//qDebug("subwindowactivated 0x0");
638
bool KviMdiManager::eventFilter(QObject *obj, QEvent *event)
642
(event->type() == QEvent::KeyPress) ||
643
(event->type() == QEvent::KeyRelease)
648
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
649
if ( (keyEvent->modifiers() & Qt::MetaModifier) ||
650
(keyEvent->modifiers() & Qt::ControlModifier)
653
// While in sdi mode, avoid qt4's internal window switching
654
if(keyEvent->key() == Qt::Key_Tab)
656
if(event->type() == QEvent::KeyRelease) g_pMainWindow->switchToNextWindow();
659
if(keyEvent->key() == Qt::Key_Backtab)
661
if(event->type() == QEvent::KeyRelease) g_pMainWindow->switchToPrevWindow();
667
* Filter out some (de)activation events from the QMdiArea handling
668
* this fixed #425 and #519 (unwanted mdichild activation when KviMainWindow is not the active window)
670
if( event->type() == QEvent::ApplicationActivate ||
671
event->type() == QEvent::ApplicationDeactivate
674
return QMdiArea::eventFilter(obj, event);