Skip to content

Commit 1a996c3

Browse files
Merge pull request #253 from CarterLi/master
[macOS] Disk & Media improvements
2 parents 007ded2 + ee7231d commit 1a996c3

File tree

11 files changed

+101
-54
lines changed

11 files changed

+101
-54
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ if(LINUX OR ANDROID OR BSD)
261261
list(APPEND LIBFASTFETCH_SRC
262262
src/detection/cpuUsage/cpuUsage_linux.c
263263
src/detection/battery/battery_linux.c
264+
src/detection/disk/disk_linux.c
264265
)
265266
endif()
266267

@@ -296,6 +297,7 @@ if(APPLE)
296297
src/detection/displayserver/displayserver_apple.c
297298
src/detection/terminalfont/terminalfont_apple.c
298299
src/detection/media/media_apple.m
300+
src/detection/disk/disk_apple.m
299301
)
300302
endif()
301303

src/common/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ static void defaultConfig(FFinstance* instance)
222222
instance->config.titleFQDN = false;
223223

224224
ffStrbufInitA(&instance->config.diskFolders, 0);
225+
instance->config.diskRemovable = false;
225226

226227
ffStrbufInitA(&instance->config.batteryDir, 0);
227228

src/data/help.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@ Library options: Set the path of a library to load
8787
--lib-plist <path>
8888

8989
Module specific options:
90-
--title-fqdn <?value>: sets if the title should use fully qualified domain name. Default is false.
90+
--title-fqdn <?value>: Sets if the title should use fully qualified domain name. Default is false.
9191
--separator-string <str>: Set the string printed by the separator module
9292
--os-file <path>: Set the path to the file containing OS informations
9393
--disk-folders <folders>: A colon separated list of folder paths for the disk output. Default is "/:/home"
94+
--disk-removable <?value>: Sets if removable volume should be printed. Default is false
9495
--battery-dir <folder>: The directory where the battery folders are. Standard: /sys/class/power_supply/
9596
--localip-show-ipv4 <?value>: Show ipv4 addresses in local ip module. Default is true
9697
--localip-show-ipv6 <?value>: Show ipv6 addresses in local ip module. Default is false

src/detection/disk/disk.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#pragma once
2+
3+
#ifndef FF_INCLUDED_detection_disk_disk
4+
#define FF_INCLUDED_detection_disk_disk
5+
6+
#include "fastfetch.h"
7+
8+
const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders);
9+
10+
#endif

src/detection/disk/disk_apple.m

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "disk.h"
2+
3+
#import <Foundation/Foundation.h>
4+
5+
const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders)
6+
{
7+
NSArray *keys = [NSArray arrayWithObjects:NSURLVolumeNameKey, nil];
8+
NSArray *urls = [NSFileManager.defaultManager mountedVolumeURLsIncludingResourceValuesForKeys:keys
9+
options:NSVolumeEnumerationSkipHiddenVolumes];
10+
if(urls == nil)
11+
return "[NSFileManager.defaultManager mountedVolumeURLsIncludingResourceValuesForKeys] failed";
12+
13+
for (NSURL *url in urls) {
14+
NSError *error;
15+
NSNumber* removable;
16+
if([url getResourceValue:&removable forKey:NSURLVolumeIsRemovableKey error:&error] == NO)
17+
continue;
18+
if(removable.boolValue && !instance->config.diskRemovable)
19+
continue;
20+
21+
ffStrbufInitS((FFstrbuf *)ffListAdd(folders), [url.relativePath cStringUsingEncoding:NSUTF8StringEncoding]);
22+
}
23+
24+
return NULL;
25+
}

src/detection/disk/disk_linux.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "disk.h"
2+
3+
#include <sys/statvfs.h>
4+
5+
const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders)
6+
{
7+
FF_UNUSED(instance);
8+
9+
struct statvfs fsRoot;
10+
int rootRet = statvfs(FASTFETCH_TARGET_DIR_ROOT"/", &fsRoot);
11+
if(rootRet != 0)
12+
return "statvfs(\"/\") failed";
13+
14+
ffStrbufInitS((FFstrbuf *)ffListAdd(folders), FASTFETCH_TARGET_DIR_ROOT"/");
15+
16+
struct statvfs fsHome;
17+
int homeRet = statvfs(FASTFETCH_TARGET_DIR_HOME, &fsHome);
18+
if(homeRet == 0 && (fsRoot.f_fsid != fsHome.f_fsid))
19+
ffStrbufInitS((FFstrbuf *)ffListAdd(folders), FASTFETCH_TARGET_DIR_HOME);
20+
21+
return NULL;
22+
}

src/detection/media/media_apple.m

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,27 @@
3232
});
3333

3434
dispatch_group_enter(group);
35+
__block const char* error = NULL;
3536
MRMediaRemoteGetNowPlayingInfo(queue, ^(_Nullable CFDictionaryRef info) {
36-
if(info != nil) {
37-
ffCfDictGetString(info, CFSTR("kMRMediaRemoteNowPlayingInfoTitle"), &result->song);
38-
ffCfDictGetString(info, CFSTR("kMRMediaRemoteNowPlayingInfoArtist"), &result->artist);
39-
ffCfDictGetString(info, CFSTR("kMRMediaRemoteNowPlayingInfoAlbum"), &result->album);
37+
if(info != nil)
38+
{
39+
error = ffCfDictGetString(info, CFSTR("kMRMediaRemoteNowPlayingInfoTitle"), &result->song);
40+
if(!error)
41+
{
42+
ffCfDictGetString(info, CFSTR("kMRMediaRemoteNowPlayingInfoArtist"), &result->artist);
43+
ffCfDictGetString(info, CFSTR("kMRMediaRemoteNowPlayingInfoAlbum"), &result->album);
44+
}
4045
}
46+
else
47+
error = "MRMediaRemoteGetNowPlayingInfo() failed";
48+
4149
dispatch_group_leave(group);
4250
});
4351

4452
dispatch_group_enter(group);
4553
MRMediaRemoteGetNowPlayingClient(queue, ^(_Nullable id clientObj) {
46-
if (clientObj != nil) {
54+
if (clientObj != nil)
55+
{
4756
CFStringRef identifier = MRNowPlayingClientGetBundleIdentifier(clientObj);
4857
if (identifier == nil)
4958
identifier = MRNowPlayingClientGetParentAppBundleIdentifier(clientObj);
@@ -65,7 +74,7 @@
6574
if(result->song.length > 0)
6675
return NULL;
6776

68-
return "MediaRemote failed";
77+
return error;
6978
}
7079

7180
void ffDetectMediaImpl(const FFinstance* instance, FFMediaResult* media)

src/fastfetch.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,6 +1255,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
12551255
instance->config.titleFQDN = optionParseBoolean(value);
12561256
else if(strcasecmp(key, "--disk-folders") == 0)
12571257
optionParseString(key, value, &instance->config.diskFolders);
1258+
else if(strcasecmp(key, "--disk-removable") == 0)
1259+
instance->config.diskRemovable = optionParseBoolean(value);
12581260
else if(strcasecmp(key, "--battery-dir") == 0)
12591261
optionParseString(key, value, &instance->config.batteryDir);
12601262
else if(strcasecmp(key, "--separator-string") == 0)

src/fastfetch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ typedef struct FFconfig
154154
bool titleFQDN;
155155

156156
FFstrbuf diskFolders;
157+
bool diskRemovable;
157158

158159
FFstrbuf batteryDir;
159160

src/modules/disk.c

Lines changed: 16 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "fastfetch.h"
22
#include "common/printing.h"
33
#include "common/parsing.h"
4+
#include "detection/disk/disk.h"
45

56
#include <sys/statvfs.h>
67

@@ -64,49 +65,7 @@ static void printStatvfs(FFinstance* instance, const FFstrbuf* key, const char*
6465
ffStrbufDestroy(&usedPretty);
6566
}
6667

67-
static void printFolderAutodetection(FFinstance* instance, const char* folderPath, struct statvfs* fs)
68-
{
69-
FFstrbuf key;
70-
ffStrbufInit(&key);
71-
createKey(instance, folderPath, &key);
72-
printStatvfs(instance, &key, folderPath, fs);
73-
ffStrbufDestroy(&key);
74-
}
75-
76-
static void printFoldersAutodetection(FFinstance* instance)
77-
{
78-
struct statvfs fsRoot;
79-
int rootRet = statvfs(FASTFETCH_TARGET_DIR_ROOT"/", &fsRoot);
80-
81-
if(rootRet != 0)
82-
{
83-
FFstrbuf key;
84-
ffStrbufInit(&key);
85-
createKey(instance, NULL, &key);
86-
ffPrintErrorString(instance, key.chars, 0, NULL, &instance->config.disk.errorFormat, "statvfs for / returned not zero: %i", rootRet);
87-
ffStrbufDestroy(&key);
88-
return;
89-
}
90-
91-
//On MacOS statvfs seems to return different f_fsid for the same filesystem.
92-
//Since it isn't really possible to install /Users on a separate disk anyway, just never print it by default.
93-
#ifndef __APPLE__
94-
struct statvfs fsHome;
95-
int homeRet = statvfs(FASTFETCH_TARGET_DIR_HOME, &fsHome);
96-
bool printHome = homeRet == 0 && (fsRoot.f_fsid != fsHome.f_fsid);
97-
#else
98-
bool printHome = false;
99-
#endif // !__APPLE__
100-
101-
printFolderAutodetection(instance, printHome ? FASTFETCH_TARGET_DIR_ROOT"/" : NULL, &fsRoot);
102-
103-
#ifndef __APPLE__
104-
if(printHome)
105-
printFolderAutodetection(instance, FASTFETCH_TARGET_DIR_HOME, &fsHome);
106-
#endif // !__APPLE__
107-
}
108-
109-
static void printFolderCustom(FFinstance* instance, const char* folderPath)
68+
static void printFolder(FFinstance* instance, const char* folderPath)
11069
{
11170
FFstrbuf key;
11271
ffStrbufInit(&key);
@@ -131,17 +90,28 @@ void ffPrintDisk(FFinstance* instance)
13190

13291
if(instance->config.diskFolders.length == 0)
13392
{
134-
printFoldersAutodetection(instance);
93+
FFlist folders;
94+
ffListInit(&folders, sizeof(FFstrbuf));
95+
const char* error = ffDiskAutodetectFolders(instance, &folders);
96+
if(error)
97+
ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &instance->config.disk, "%s", error);
98+
for(uint32_t i = 0; i < folders.length; ++i)
99+
{
100+
FFstrbuf* folder = (FFstrbuf*)ffListGet(&folders, i);
101+
printFolder(instance, folder->chars);
102+
ffStrbufDestroy(folder);
103+
}
104+
ffListDestroy(&folders);
135105
return;
136106
}
137107

138108
uint32_t startIndex = 0;
139-
while (startIndex < instance->config.diskFolders.length)
109+
while(startIndex < instance->config.diskFolders.length)
140110
{
141111
uint32_t colonIndex = ffStrbufNextIndexC(&instance->config.diskFolders, startIndex, ':');
142112
instance->config.diskFolders.chars[colonIndex] = '\0';
143113

144-
printFolderCustom(instance, instance->config.diskFolders.chars + startIndex);
114+
printFolder(instance, instance->config.diskFolders.chars + startIndex);
145115

146116
startIndex = colonIndex + 1;
147117
}

0 commit comments

Comments
 (0)