// used by mapplauncherd to bring a binary to the front void WindowModel::launchProcess(const QString &binaryName) { LipstickCompositor *c = LipstickCompositor::instance(); if (!m_complete || !c) return; QStringList binaryParts = binaryName.split(QRegExp(QRegExp("\\s+"))); for (QHash<int, LipstickCompositorWindow *>::ConstIterator iter = c->m_mappedSurfaces.begin(); iter != c->m_mappedSurfaces.end(); ++iter) { LipstickCompositorWindow *win = iter.value(); if (!approveWindow(win)) continue; QString pidFile = QString::fromLatin1("/proc/%1/cmdline").arg(win->processId()); QFile f(pidFile); if (!f.open(QIODevice::ReadOnly)) { qWarning() << Q_FUNC_INFO << "Cannot open cmdline for " << pidFile; continue; } // Command line arguments are split by '\0' in /proc/*/cmdline QStringList proc; QByteArray data = f.readAll(); Q_FOREACH (const QByteArray &array, data.split('\0')) { QString part = QString::fromUtf8(array); if (part.size() > 0) { proc << part; } } // Cannot match, as the cmdline has less arguments than then binary part if (binaryParts.size() > proc.size()) { continue; } bool match = true; // All parts of binaryName must be contained in this order in the // process command line to match the given process for (int i=0; i<binaryParts.count(); i++) { if (proc[i] != binaryParts[i]) { match = false; break; } } if (match) { win->surface()->raiseRequested(); break; } } }
QWaylandSurface *LipstickCompositor::surfaceForId(int id) const { LipstickCompositorWindow *window = m_mappedSurfaces.value(id, 0); return window?window->surface():0; }
void LipstickCompositor::closeClientForWindowId(int id) { LipstickCompositorWindow *window = m_mappedSurfaces.value(id, 0); if (window && window->surface()) destroyClientForSurface(window->surface()); }