forked from quickshell/quickshell
		
	core/desktopentry: add StartupWMClass and heuristicLookup
This commit is contained in:
		
							parent
							
								
									7b417bb808
								
							
						
					
					
						commit
						77de23bb71
					
				
					 2 changed files with 37 additions and 0 deletions
				
			
		| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
#include "desktopentry.hpp"
 | 
					#include "desktopentry.hpp"
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <qcontainerfwd.h>
 | 
					#include <qcontainerfwd.h>
 | 
				
			||||||
#include <qdebug.h>
 | 
					#include <qdebug.h>
 | 
				
			||||||
| 
						 | 
					@ -108,6 +109,7 @@ void DesktopEntry::parseEntry(const QString& text) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (key == "Name") this->mName = value;
 | 
									if (key == "Name") this->mName = value;
 | 
				
			||||||
				else if (key == "GenericName") this->mGenericName = value;
 | 
									else if (key == "GenericName") this->mGenericName = value;
 | 
				
			||||||
 | 
									else if (key == "StartupWMClass") this->mStartupClass = value;
 | 
				
			||||||
				else if (key == "NoDisplay") this->mNoDisplay = value == "true";
 | 
									else if (key == "NoDisplay") this->mNoDisplay = value == "true";
 | 
				
			||||||
				else if (key == "Comment") this->mComment = value;
 | 
									else if (key == "Comment") this->mComment = value;
 | 
				
			||||||
				else if (key == "Icon") this->mIcon = value;
 | 
									else if (key == "Icon") this->mIcon = value;
 | 
				
			||||||
| 
						 | 
					@ -384,6 +386,25 @@ DesktopEntry* DesktopEntryManager::byId(const QString& id) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DesktopEntry* DesktopEntryManager::heuristicLookup(const QString& name) {
 | 
				
			||||||
 | 
						if (auto* entry = DesktopEntryManager::byId(name)) return entry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto& list = this->mApplications.valueList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto iter = std::ranges::find_if(list, [&](const DesktopEntry* entry) {
 | 
				
			||||||
 | 
							return name == entry->mStartupClass;
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (iter != list.end()) return *iter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						iter = std::ranges::find_if(list, [&](const DesktopEntry* entry) {
 | 
				
			||||||
 | 
							return name.toLower() == entry->mStartupClass.toLower();
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (iter != list.end()) return *iter;
 | 
				
			||||||
 | 
						return nullptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ObjectModel<DesktopEntry>* DesktopEntryManager::applications() { return &this->mApplications; }
 | 
					ObjectModel<DesktopEntry>* DesktopEntryManager::applications() { return &this->mApplications; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DesktopEntries::DesktopEntries() { DesktopEntryManager::instance(); }
 | 
					DesktopEntries::DesktopEntries() { DesktopEntryManager::instance(); }
 | 
				
			||||||
| 
						 | 
					@ -392,6 +413,10 @@ DesktopEntry* DesktopEntries::byId(const QString& id) {
 | 
				
			||||||
	return DesktopEntryManager::instance()->byId(id);
 | 
						return DesktopEntryManager::instance()->byId(id);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DesktopEntry* DesktopEntries::heuristicLookup(const QString& name) {
 | 
				
			||||||
 | 
						return DesktopEntryManager::instance()->heuristicLookup(name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ObjectModel<DesktopEntry>* DesktopEntries::applications() {
 | 
					ObjectModel<DesktopEntry>* DesktopEntries::applications() {
 | 
				
			||||||
	return DesktopEntryManager::instance()->applications();
 | 
						return DesktopEntryManager::instance()->applications();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,9 @@ class DesktopEntry: public QObject {
 | 
				
			||||||
	Q_PROPERTY(QString name MEMBER mName CONSTANT);
 | 
						Q_PROPERTY(QString name MEMBER mName CONSTANT);
 | 
				
			||||||
	/// Short description of the application, such as "Web Browser". May be empty.
 | 
						/// Short description of the application, such as "Web Browser". May be empty.
 | 
				
			||||||
	Q_PROPERTY(QString genericName MEMBER mGenericName CONSTANT);
 | 
						Q_PROPERTY(QString genericName MEMBER mGenericName CONSTANT);
 | 
				
			||||||
 | 
						/// Initial class or app id the app intends to use. May be useful for matching running apps
 | 
				
			||||||
 | 
						/// to desktop entries.
 | 
				
			||||||
 | 
						Q_PROPERTY(QString startupClass MEMBER mStartupClass CONSTANT);
 | 
				
			||||||
	/// If true, this application should not be displayed in menus and launchers.
 | 
						/// If true, this application should not be displayed in menus and launchers.
 | 
				
			||||||
	Q_PROPERTY(bool noDisplay MEMBER mNoDisplay CONSTANT);
 | 
						Q_PROPERTY(bool noDisplay MEMBER mNoDisplay CONSTANT);
 | 
				
			||||||
	/// Long description of the application, such as "View websites on the internet". May be empty.
 | 
						/// Long description of the application, such as "View websites on the internet". May be empty.
 | 
				
			||||||
| 
						 | 
					@ -81,6 +84,7 @@ public:
 | 
				
			||||||
	QString mId;
 | 
						QString mId;
 | 
				
			||||||
	QString mName;
 | 
						QString mName;
 | 
				
			||||||
	QString mGenericName;
 | 
						QString mGenericName;
 | 
				
			||||||
 | 
						QString mStartupClass;
 | 
				
			||||||
	bool mNoDisplay = false;
 | 
						bool mNoDisplay = false;
 | 
				
			||||||
	QString mComment;
 | 
						QString mComment;
 | 
				
			||||||
	QString mIcon;
 | 
						QString mIcon;
 | 
				
			||||||
| 
						 | 
					@ -151,6 +155,7 @@ public:
 | 
				
			||||||
	void scanDesktopEntries();
 | 
						void scanDesktopEntries();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[[nodiscard]] DesktopEntry* byId(const QString& id);
 | 
						[[nodiscard]] DesktopEntry* byId(const QString& id);
 | 
				
			||||||
 | 
						[[nodiscard]] DesktopEntry* heuristicLookup(const QString& name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[[nodiscard]] ObjectModel<DesktopEntry>* applications();
 | 
						[[nodiscard]] ObjectModel<DesktopEntry>* applications();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -186,7 +191,14 @@ public:
 | 
				
			||||||
	explicit DesktopEntries();
 | 
						explicit DesktopEntries();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// Look up a desktop entry by name. Includes NoDisplay entries. May return null.
 | 
						/// Look up a desktop entry by name. Includes NoDisplay entries. May return null.
 | 
				
			||||||
 | 
						///
 | 
				
			||||||
 | 
						/// While this function requires an exact match, @@heuristicLookup() will correctly
 | 
				
			||||||
 | 
						/// find an entry more often and is generally more useful.
 | 
				
			||||||
	Q_INVOKABLE [[nodiscard]] static DesktopEntry* byId(const QString& id);
 | 
						Q_INVOKABLE [[nodiscard]] static DesktopEntry* byId(const QString& id);
 | 
				
			||||||
 | 
						/// Look up a desktop entry by name using heuristics. Unline @@byId(),
 | 
				
			||||||
 | 
						/// if no exact matches are found this function will try to guess - potentially incorrectly.
 | 
				
			||||||
 | 
						/// May return null.
 | 
				
			||||||
 | 
						Q_INVOKABLE [[nodiscard]] static DesktopEntry* heuristicLookup(const QString& name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[[nodiscard]] static ObjectModel<DesktopEntry>* applications();
 | 
						[[nodiscard]] static ObjectModel<DesktopEntry>* applications();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue