/* SPDX-FileCopyrightText: 2004 Esben Mose Hansen SPDX-FileCopyrightText: Andrew Stanley-Jones SPDX-FileCopyrightText: 2000 Carsten Pfeiffer SPDX-License-Identifier: GPL-2.0-or-later */ #include "klipperpopup.h" #include #include #include #include #include #include #include #include "historymodel.h" #include "klipper.h" using namespace Qt::StringLiterals; KlipperPopup::KlipperPopup() : PlasmaQuick::PlasmaWindow() , m_model(HistoryModel::self()) { m_engine.engine()->setProperty("_kirigamiTheme", u"KirigamiPlasmaStyle"_s); m_engine.setInitializationDelayed(true); // used only by screen readers setTitle(i18n("Clipboard Popup")); connect(&m_engine, &PlasmaQuick::SharedQmlEngine::finished, this, &KlipperPopup::onObjectIncubated); m_engine.setSourceFromModule(u"org.kde.plasma.private.clipboard", u"KlipperPopup"); m_engine.completeInitialization(); connect(qGuiApp, &QGuiApplication::focusWindowChanged, this, &KlipperPopup::onFocusWindowChanged); } void KlipperPopup::show() { if (m_plasmashell) { hide(); } positionOnScreen(); setVisible(true); } void KlipperPopup::setPlasmaShell(KWayland::Client::PlasmaShell *plasmashell) { m_plasmashell = plasmashell; } void KlipperPopup::hide() { QWindow::hide(); if (m_plasmashell) { destroy(); // Required to recreate wl_surface } } void KlipperPopup::showEvent(QShowEvent *event) { if (KWindowSystem::isPlatformX11()) { KX11Extras::setOnAllDesktops(winId(), true); } PlasmaWindow::showEvent(event); // NET::SkipTaskbar | NET::SkipPager | NET::SkipSwitcher requestActivate(); if (KWindowSystem::isPlatformX11()) { KX11Extras::forceActiveWindow(winId()); } } void KlipperPopup::positionOnScreen() { if (KWindowSystem::isPlatformX11()) { setPosition(QCursor::pos()); KX11Extras::setOnDesktop(winId(), KX11Extras::currentDesktop()); } else if (m_plasmashell && KWindowSystem::isPlatformWayland()) { auto surface = KWayland::Client::Surface::fromWindow(this); auto plasmaSurface = m_plasmashell->createSurface(surface, this); plasmaSurface->openUnderCursor(); plasmaSurface->setSkipTaskbar(true); plasmaSurface->setSkipSwitcher(true); plasmaSurface->setRole(KWayland::Client::PlasmaShellSurface::Role::AppletPopup); } } void KlipperPopup::onObjectIncubated() { auto item = qobject_cast(m_engine.rootObject()); setMainItem(item); auto updateSize = [this]() { resize(QSize(mainItem()->implicitWidth(), mainItem()->implicitHeight()).grownBy(padding()).boundedTo(screen()->availableSize())); }; connect(item, &QQuickItem::implicitHeightChanged, this, updateSize); connect(this, &KlipperPopup::paddingChanged, this, updateSize); updateSize(); connect(item, SIGNAL(requestHidePopup()), this, SLOT(hide())); } void KlipperPopup::onFocusWindowChanged(QWindow *focusWindow) { if (focusWindow != this) { hide(); } } #include "moc_klipperpopup.cpp"