aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/libLumina/LuminaXDG.h
blob: 5c012b9afeb855d784a99d5e3de7c85cb5619d98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
//===========================================
//  Lumina-DE source code
//  Copyright (c) 2013, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
// These structures/classes are for conforming to the FreeDesktop standards
// REFERENCE: (*.desktop files) http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s05.html
// -- Current Implementation (OCT 2013) --
// Desktop File Version Compliance: 1.0 (except "DBusActivatable")
// Icon Theme Compliance: Built in to Qt (QIcon::fromTheme()) with "oxygen" theme default
// *.desktop Exec Compliance Updated: 9/9/2014
// Mime Application Version Compliance: 1.0.1 (11/14/14) (Skips random *.desktop parsing: ~80% compliant)
//===========================================

  
#ifndef _LUMINA_LIBRARY_XDG_H
#define _LUMINA_LIBRARY_XDG_H

#include <QFile>
#include <QFileSystemWatcher>
#include <QDir>
#include <QFileInfo>
#include <QStringList>
#include <QString>
#include <QIcon>
#include <QList>
#include <QHash>
#include <QLocale>
#include <QTextStream>
#include <QDateTime>
#include <QDebug>


// ======================
// FreeDesktop Desktop Actions Framework (data structure)
// ======================
struct XDGDesktopAction{
//public:
  //Admin variables
  QString ID; //The ID name for this action (should correspond to an entry in the "actionList" for the XDGDesktop below)
  //General Variables
  QString name, icon, exec;
};

// ======================
//  FreeDesktop Desktop Entry Framework (data structure)
// ======================
struct XDGDesktop{
//public:
  enum XDGDesktopType { BAD, APP, LINK, DIR };

  //Admin variables
  QString filePath; //which file this structure contains the information for (absolute path)
  QDateTime lastRead; //when this structure was created from the file
  XDGDesktopType type;
  //General variables
  QString name, genericName, comment, icon;
  QStringList showInList, notShowInList;
  bool isHidden;
  //Type 1 (APP) variables
  QString exec, tryexec, path, startupWM;
  QStringList actionList, mimeList, catList, keyList;
  bool useTerminal, startupNotify;
  QList<XDGDesktopAction> actions;
  //Type 2 (LINK) variables
  QString url;

  //Constructor/destructor
  XDGDesktop(){}
  ~XDGDesktop(){
    actions.clear();
    showInList.clear(); notShowInList.clear(); actionList.clear(); mimeList.clear(); catList.clear(); keyList.clear();
    name.clear(); genericName.clear(); comment.clear(); icon.clear();
    exec.clear(); tryexec.clear(); path.clear(); startupWM.clear(); url.clear();
  }
};

// ========================
//  Data Structure for keeping track of known system applications
// ========================
class XDGDesktopList : public QObject{
	Q_OBJECT
public:
	//Functions
	XDGDesktopList(QObject *parent = 0, bool watchdirs = false);
	~XDGDesktopList();
	//Main Interface functions
	QList<XDGDesktop> apps(bool showAll, bool showHidden); //showAll: include invalid files, showHidden: include NoShow/Hidden files

	//Administration variables (not typically used directly)
	QDateTime lastCheck;
	QStringList newApps, removedApps; //list of "new/removed" apps found during the last check
	QHash<QString, XDGDesktop> files; //<filepath>/<XDGDesktop structure>

public slots:
	void updateList(); //run the check routine

private:
	QFileSystemWatcher *watcher;
	QTimer *synctimer;
	bool keepsynced;

private slots:
	void watcherChanged();
signals:
	void appsUpdated();
};

// ========================
// File Information simplification class (combine QFileInfo with XDGDesktop)
//  Need some extra information not usually available by a QFileInfo
// ========================
class LFileInfo : public QFileInfo{
private:
	QString mime, icon;
	XDGDesktop desk;

	void loadExtraInfo();
	
public:
	//Couple overloaded contructors
	LFileInfo(QString filepath);
	LFileInfo(QFileInfo info);
	~LFileInfo(){}
	
	//Functions for accessing the extra information
	// -- Return the mimetype for the file
	QString mimetype();
	
	// -- Return the icon file to use for this file
	QString iconfile(); //Note: This string is auto-formatted for use in the LXDG::findIcon() routine.
	
	// -- Check if this is an XDG desktop file
	bool isDesktopFile();
	
	// -- Allow access to the internal XDG desktop data structure
	XDGDesktop* XDG();
	
	//Other file type identification routines
	bool isImage(); //Is a readable image file (for thumbnail support)
	bool isAVFile(); //Is an audio/video file
};
typedef QList<LFileInfo> LFileInfoList;

// ================================
//  Collection of FreeDesktop standards interaction routines
// ================================
class LXDG{
public:
	//Read/write a *.desktop file
	static XDGDesktop loadDesktopFile(QString filePath, bool& ok);
	static bool saveDesktopFile(XDGDesktop dFile, bool merge = true);
	//Check a *.desktop file for validity (showAll skips the DE-exclusivity checks)
	static bool checkValidity(XDGDesktop dFile, bool showAll = true); 
	//Check for a valid executable
	static bool checkExec(QString exec);
	//Get a list of all the directories where *.desktop files exist
	static QStringList systemApplicationDirs();
	//Get a list of all the *.desktop files available on the system
        static XDGDesktopList* systemAppsList(); //return a pointer to the entire class
	static QList<XDGDesktop> systemDesktopFiles(bool showAll = false, bool showHidden = false); //simplification for getting just the files
	//Sort a list of Desktop files into the proper categories
	static QHash< QString, QList<XDGDesktop> > sortDesktopCats(QList<XDGDesktop> apps);
	//Return the icon to use for the given category
	static QString DesktopCatToIcon(QString cat);
	//Sort a list of Desktop files by name
	static QList<XDGDesktop> sortDesktopNames(QList<XDGDesktop> apps);
	//Get the executable line from a Desktop file
	static QString getDesktopExec(XDGDesktop app, QString ActionID = "");
	//Set all the default XDG Environment variables
	static void setEnvironmentVars();
	//Find an icon from the current/default theme
	static QIcon findIcon(QString iconName, QString fallback = "");
	//Recursivly compile a list of child directories with *.png files in them
	static QStringList getChildIconDirs(QString parent);
	//List all the mime-type directories
	static QStringList systemMimeDirs();
	//Find the mime-type icon for a particular file extension
	static QIcon findMimeIcon(QString extension);
	//Find the mime-type of a particular file extension
	static QString findAppMimeForFile(QString filename, bool multiple = false);
	//Find the file extension for a particular mime-type
	static QStringList findFilesForMime(QString mime);
	// Simplification function for finding all info regarding current mime defaults
	static QStringList listFileMimeDefaults();
	//Find the localized comment string for a particular mime-type
	static QString findMimeComment(QString mime);
	//Find the default application for a mime-type
	static QString findDefaultAppForMime(QString mime);
	//Fine the available applications for a mime-type
	static QStringList findAvailableAppsForMime(QString mime);
	//Set the default application for a mime-type
	static void setDefaultAppForMime(QString mime, QString app);
	//List all the registered audio/video file extensions
	static QStringList findAVFileExtensions();
	//Load all the "globs2" mime database files
	static QStringList loadMimeFileGlobs2();
	
	//Find all the autostart *.desktop files
	static QList<XDGDesktop> findAutoStartFiles(bool includeInvalid = false);
	static bool setAutoStarted(bool autostart, XDGDesktop app);
	static bool setAutoStarted(bool autostart, QString filePath); //for convenience
};

#endif
bgstack15