bool WindowList::eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::ContextMenu) { KMenu *menu = qobject_cast<KMenu*>(object); if (menu && menu->activeAction() && menu->activeAction()->data().type() == QVariant::ULongLong) { QContextMenuEvent *cmEvent = static_cast<QContextMenuEvent *>(event); QList<QAction*> actionList; TaskManager::TaskItem item(this, TaskManager::TaskManager::self()->findTask((WId)menu->activeAction()->data().toULongLong())); TaskManager::GroupManager groupManager(this); TaskManager::BasicMenu taskMenu(NULL, &item, &groupManager, actionList); if (taskMenu.exec(cmEvent->globalPos())) { m_listMenu->hide(); } return true; } } else if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); if (mouseEvent->button() != Qt::LeftButton) { return false; } KMenu *menu = static_cast<KMenu*>(object); if (menu && menu->activeAction() && menu->activeAction()->data().type() == QVariant::ULongLong) { m_dragStartPosition = mouseEvent->pos(); } } else if (event->type() == QEvent::MouseMove) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); if (!(mouseEvent->buttons() & Qt::LeftButton) || (mouseEvent->pos() - m_dragStartPosition).manhattanLength() < QApplication::startDragDistance()) { return false; } KMenu *menu = static_cast<KMenu*>(object); if (menu && menu->activeAction() && menu->activeAction()->data().type() == QVariant::ULongLong) { QDrag *drag = new QDrag(menu); QMimeData *mimeData = new QMimeData; QByteArray data; WId window = (WId)menu->activeAction()->data().toULongLong(); data.resize(sizeof(WId)); memcpy(data.data(), &window, sizeof(WId)); mimeData->setData("windowsystem/winid", data); drag->setMimeData(mimeData); drag->setPixmap(menu->activeAction()->icon().pixmap(32, 32)); m_listMenu->hide(); drag->exec(); return true; } } return QObject::eventFilter(object, event); }