void TabSwitcherWidget::showEvent(QShowEvent *event) { setFocus(); MainWindowSessionItem *mainWindowItem(SessionsManager::getModel()->getMainWindowItem(m_mainWindow)); if (mainWindowItem) { const bool useSorting(SettingsManager::getOption(SettingsManager::Interface_TabSwitchingModeOption).toString() != QLatin1String("noSort")); for (int i = 0; i < mainWindowItem->rowCount(); ++i) { WindowSessionItem *windowItem(static_cast<WindowSessionItem*>(mainWindowItem->child(i, 0))); if (windowItem) { m_model->appendRow(createRow(windowItem->getActiveWindow(), (useSorting ? QVariant(windowItem->getActiveWindow()->getLastActivity()) : QVariant(i)))); } } } m_model->sort(0, ((SettingsManager::getOption(SettingsManager::Interface_TabSwitchingModeOption).toString() == QLatin1String("noSort")) ? Qt::AscendingOrder : Qt::DescendingOrder)); Window *activeWindow(m_mainWindow->getActiveWindow()); const int contentsHeight(m_model->rowCount() * 22); m_tabsView->setCurrentIndex(m_model->index((activeWindow ? findRow(activeWindow->getIdentifier()) : 0), 0)); m_tabsView->setMinimumHeight(qMin(contentsHeight, int(height() * 0.9))); QWidget::showEvent(event); connect(m_mainWindow, SIGNAL(windowAdded(quint64)), this, SLOT(handleWindowAdded(quint64))); connect(m_mainWindow, SIGNAL(windowRemoved(quint64)), this, SLOT(handleWindowRemoved(quint64))); }
void TabSwitcherWidget::hideEvent(QHideEvent *event) { QWidget::hideEvent(event); disconnect(m_mainWindow, SIGNAL(windowAdded(quint64)), this, SLOT(handleWindowAdded(quint64))); disconnect(m_mainWindow, SIGNAL(windowRemoved(quint64)), this, SLOT(handleWindowRemoved(quint64))); m_model->clear(); }
bool KWD::Decorator::x11EventFilter (XEvent *xevent) { KWD::Window *client; int status; switch (xevent->type) { case ConfigureNotify: { XConfigureEvent *xce = reinterpret_cast <XConfigureEvent *> (xevent); if (mFrames.contains (xce->window)) mFrames[xce->window]->updateFrame (xce->window); } break; case SelectionRequest: decor_handle_selection_request (QX11Info::display (), xevent, mDmSnTimestamp); break; case SelectionClear: status = decor_handle_selection_clear (QX11Info::display (), xevent, 0); if (status == DECOR_SELECTION_GIVE_UP) KApplication::exit (0); break; case CreateNotify: /* We only care about windows that aren't managed here */ if (!KWindowSystem::hasWId (xevent->xcreatewindow.window)) { WId select; KWD::trapXError (); XSelectInput (QX11Info::display (), xevent->xcreatewindow.window, StructureNotifyMask | PropertyChangeMask); KWD::popXError (); if (KWD::readWindowProperty (xevent->xcreatewindow.window, Atoms::switchSelectWindow, (long *) &select)) handleWindowAdded (xevent->xcreatewindow.window); } case PropertyNotify: if (xevent->xproperty.atom == Atoms::netInputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::netOutputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::compizShadowInfo || xevent->xproperty.atom == Atoms::compizShadowColor) { updateShadowProperties (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::switchSelectWindow) { WId id = xevent->xproperty.window; if (!mSwitcher || mSwitcher->xid () != id) handleWindowAdded (id); mSwitcher->update (); } else if (xevent->xproperty.atom == Atoms::netWmWindowOpacity) { if (mClients.contains (xevent->xproperty.window)) mClients[xevent->xproperty.window]->updateOpacity (); } break; case EnterNotify: { XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent); QWidget *child; if (!mFrames.contains (xce->window)) break; client = mFrames[xce->window]; if (!client->decorWidget ()) break; child = client->childAt (xce->x, xce->y); if (child) { QEvent qe (QEvent::Enter); QApplication::sendEvent (child, &qe); client->setActiveChild (child); client->updateCursor (QPoint (xce->x, xce->y)); } } break; case LeaveNotify: { XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent); if (mFrames.contains (xce->window)) { QEvent qe (QEvent::Leave); client = mFrames[xce->window]; if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qe); XUndefineCursor (QX11Info::display (), client->frameId ()); } } break; case MotionNotify: { XMotionEvent *xme = reinterpret_cast <XMotionEvent *> (xevent); QWidget *child; if (!mFrames.contains (xme->window)) break; client = mFrames[xme->window]; if (!client->decorWidget ()) break; child = client->childAt (xme->x, xme->y); if (child) { QPoint qp (xme->x, xme->y); if (child != client->activeChild ()) { QEvent qee (QEvent::Enter); QEvent qle (QEvent::Leave); if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qle); QApplication::sendEvent (child, &qee); client->setActiveChild (child); } if (client->decorWidget () != child) qp = child->mapFrom (client->decorWidget (), qp); QMouseEvent qme (QEvent::MouseMove, qp, Qt::NoButton, Qt::NoButton, Qt::NoModifier); QApplication::sendEvent (child, &qme); client->updateCursor (QPoint (xme->x, xme->y)); } } break; case ButtonPress: case ButtonRelease: { XButtonEvent *xbe = reinterpret_cast <XButtonEvent *> (xevent); QWidget *child; if (!mFrames.contains (xbe->window)) break; client = mFrames[xbe->window]; if (!client->decorWidget ()) break; child = client->childAt (xbe->x, xbe->y); if (child) { XButtonEvent xbe2 = *xbe; xbe2.window = child->winId (); QPoint p; p = client->mapToChildAt (QPoint (xbe->x, xbe->y)); xbe2.x = p.x (); xbe2.y = p.y (); p = child->mapToGlobal(p); xbe2.x_root = p.x (); xbe2.y_root = p.y (); client->setFakeRelease (false); QApplication::x11ProcessEvent ((XEvent *) &xbe2); /* We won't get a button release event, because of the screengrabs in compiz */ if (client->getFakeRelease () && xevent->type == ButtonPress) { xbe2.type = ButtonRelease; QApplication::x11ProcessEvent ((XEvent *) &xbe2); } return true; } } break; case ClientMessage: if (xevent->xclient.message_type == Atoms::toolkitActionAtom) { unsigned long action; action = xevent->xclient.data.l[0]; if (action == Atoms::toolkitActionWindowMenuAtom) { if (mClients.contains (xevent->xclient.window)) { QPoint pos; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) { pos = QPoint (xevent->xclient.data.l[3], xevent->xclient.data.l[4]); } else { pos = client->clientGeometry ().topLeft (); } client->showWindowMenu (pos); } } else if (action == Atoms::toolkitActionForceQuitDialogAtom) { if (mClients.contains (xevent->xclient.window)) { Time timestamp = xevent->xclient.data.l[1]; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) client->showKillProcessDialog (timestamp); else client->hideKillProcessDialog (); } } } break; default: break; } return KApplication::x11EventFilter (xevent); }
bool KWD::Decorator::enableDecorations (Time timestamp) { QList <WId>::ConstIterator it; unsigned int nchildren; WId *children; WId root, parent; long int select; mDmSnTimestamp = timestamp; if (!pluginManager ()->loadPlugin ("")) return false; updateAllShadowOptions (); KWD::trapXError (); (void) QApplication::desktop (); // trigger creation of desktop widget KWD::popXError (); updateShadow (); /* FIXME: Implement proper decoration lists and remove this */ mDecorNormal = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow (), 0, Window::Default); mDecorActive = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow (), 0, Window::DefaultActive); mActiveId = KWindowSystem::activeWindow (); connect (KWindowSystem::self (), SIGNAL (windowAdded (WId)), SLOT (handleWindowAdded (WId))); connect (KWindowSystem::self (), SIGNAL (windowRemoved (WId)), SLOT (handleWindowRemoved (WId))); connect (KWindowSystem::self (), SIGNAL (activeWindowChanged (WId)), SLOT (handleActiveWindowChanged (WId))); connect (KWindowSystem::self (), SIGNAL (windowChanged (WId, const unsigned long *)), SLOT (handleWindowChanged (WId, const unsigned long *))); foreach (WId id, KWindowSystem::windows ()) handleWindowAdded (id); /* Find the switcher and add it too * FIXME: Doing XQueryTree and then * XGetWindowProperty on every window * like this is really expensive, surely * there is a better way to do this */ XQueryTree (QX11Info::display (), QX11Info::appRootWindow (), &root, &parent, &children, &nchildren); for (unsigned int i = 0; i < nchildren; i++) { if (KWD::readWindowProperty (children[i], Atoms::switchSelectWindow, &select)) { handleWindowAdded(children[i]); break; } } connect (Plasma::Theme::defaultTheme (), SIGNAL (themeChanged ()), SLOT (plasmaThemeChanged ())); // select for client messages XSelectInput (QX11Info::display (), QX11Info::appRootWindow (), SubstructureNotifyMask | StructureNotifyMask | PropertyChangeMask); return true; }