void LauncherApplication::setBamfApplication(BamfApplication *application) { if (application == NULL) { return; } m_application = application; if (!sticky()) { setDesktopFile(application->desktop_file()); } QObject::connect(application, SIGNAL(ActiveChanged(bool)), this, SIGNAL(activeChanged(bool))); QObject::connect(application, SIGNAL(RunningChanged(bool)), this, SLOT(updateCounterVisible())); /* FIXME: a bug somewhere makes connecting to the Closed() signal not work even though the emit Closed() in bamf-view.cpp is reached. */ /* Connect first the onBamfApplicationClosed slot, then the runningChanged signal, to avoid a race condition when an application is closed. See https://launchpad.net/bugs/634057 */ QObject::connect(application, SIGNAL(RunningChanged(bool)), this, SLOT(onBamfApplicationClosed(bool))); QObject::connect(application, SIGNAL(RunningChanged(bool)), this, SIGNAL(runningChanged(bool))); QObject::connect(application, SIGNAL(UrgentChanged(bool)), this, SIGNAL(urgentChanged(bool))); QObject::connect(application, SIGNAL(WindowAdded(BamfWindow*)), this, SLOT(updateHasVisibleWindow())); QObject::connect(application, SIGNAL(WindowRemoved(BamfWindow*)), this, SLOT(updateHasVisibleWindow())); QObject::connect(application, SIGNAL(WindowAdded(BamfWindow*)), this, SLOT(updateWindowCount())); QObject::connect(application, SIGNAL(WindowRemoved(BamfWindow*)), this, SLOT(updateWindowCount())); connect(application, SIGNAL(ChildAdded(BamfView*)), SLOT(slotChildAdded(BamfView*))); connect(application, SIGNAL(ChildRemoved(BamfView*)), SLOT(slotChildRemoved(BamfView*))); connect(application, SIGNAL(WindowAdded(BamfWindow*)), SLOT(onWindowAdded(BamfWindow*))); updateBamfApplicationDependentProperties(); updateCounterVisible(); }
void LauncherApplication::onDesktopFileChanged(const QString& path) { if (m_desktopFileWatcher->files().contains(path) || QFile::exists(path)) { /* The contents of the file have changed. */ setDesktopFile(path); } else { /* The desktop file has been deleted. This can happen in a number of cases: - the package it belongs to has been uninstalled - the package it belongs to has been upgraded, in which case it is likely that the desktop file has been removed and a new version of it has been installed in place of the old version - the file has been written to using an editor that first saves to a temporary file and then moves this temporary file to the destination file, which effectively results in the file being temporarily deleted (vi for example does that, whereas gedit doesn’t) In the first case, we want to remove the application from the launcher. In the last two cases, we need to consider that the desktop file’s contents have changed. At this point there is no way to be sure that the file has been permanently removed, so we want to give the application a grace period before checking for real deletion. */ QTimer::singleShot(1000, this, SLOT(checkDesktopFileReallyRemoved())); } }
void LauncherApplication::checkDesktopFileReallyRemoved() { QString path = desktop_file(); if (QFile::exists(path)) { /* The desktop file hasn’t really been removed, it was only temporarily deleted. */ setDesktopFile(path); } else { /* The desktop file has really been removed. */ setSticky(false); } }
void Application::setBamfApplication(BamfApplication *application) { if (application == NULL) { return; } m_application = application; if (!sticky()) { setDesktopFile(application->desktop_file()); } QObject::connect(application, SIGNAL(ActiveChanged(bool)), this, SIGNAL(activeChanged(bool))); QObject::connect(application, SIGNAL(RunningChanged(bool)), this, SLOT(updateCounterVisible())); /* FIXME: Signal-slot mappings below were based on the assumption that BamfWindow - Closed() was broken. This was fixed in bamf-qt (see https://bugs.launchpad.net/bamf-qt/+bug/968046), so this code may be revisited as we can now rely on Closed(). */ /* Connect first the onBamfApplicationClosed slot, then the runningChanged signal, to avoid a race condition when an application is closed. See https://launchpad.net/bugs/634057 */ QObject::connect(application, SIGNAL(RunningChanged(bool)), this, SLOT(onBamfApplicationClosed(bool))); QObject::connect(application, SIGNAL(RunningChanged(bool)), this, SIGNAL(runningChanged(bool))); QObject::connect(application, SIGNAL(UrgentChanged(bool)), this, SIGNAL(urgentChanged(bool))); QObject::connect(application, SIGNAL(WindowAdded(BamfWindow*)), this, SLOT(updateHasVisibleWindow())); QObject::connect(application, SIGNAL(WindowRemoved(BamfWindow*)), this, SLOT(updateHasVisibleWindow())); QObject::connect(application, SIGNAL(WindowAdded(BamfWindow*)), this, SLOT(updateWindowCount())); QObject::connect(application, SIGNAL(WindowRemoved(BamfWindow*)), this, SLOT(updateWindowCount())); connect(application, SIGNAL(ChildAdded(BamfView*)), SLOT(slotChildAdded(BamfView*))); connect(application, SIGNAL(ChildRemoved(BamfView*)), SLOT(slotChildRemoved(BamfView*))); connect(application, SIGNAL(WindowAdded(BamfWindow*)), SLOT(onWindowAdded(BamfWindow*))); updateBamfApplicationDependentProperties(); updateCounterVisible(); }