From 8f9beb2789f446c71c802477a6f74c7bbe701dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 6 Jun 2023 18:34:54 +0800 Subject: [PATCH] Wallpaper (macOS): add support --- CMakeLists.txt | 4 +-- README.md | 1 + src/common/settings.c | 42 +++++++++++++++++++++++ src/common/settings.h | 1 + src/detection/wallpaper/wallpaper_apple.c | 31 +++++++++++++++++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 src/detection/wallpaper/wallpaper_apple.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ace7c2d5..6c39af58d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ cmake_dependent_option(ENABLE_GIO "Enable gio-2.0" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_DCONF "Enable dconf" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_DBUS "Enable dbus-1" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_XFCONF "Enable libxfconf-0" ON "LINUX OR BSD" OFF) -cmake_dependent_option(ENABLE_SQLITE3 "Enable sqlite3" ON "LINUX OR BSD" OFF) +cmake_dependent_option(ENABLE_SQLITE3 "Enable sqlite3" ON "LINUX OR BSD OR APPLE" OFF) cmake_dependent_option(ENABLE_RPM "Enable rpm" ON "LINUX" OFF) cmake_dependent_option(ENABLE_IMAGEMAGICK7 "Enable imagemagick 7" ON "LINUX OR BSD OR APPLE OR WIN32" OFF) cmake_dependent_option(ENABLE_IMAGEMAGICK6 "Enable imagemagick 6" ON "LINUX OR BSD OR APPLE" OFF) @@ -494,7 +494,7 @@ elseif(APPLE) src/detection/terminalshell/terminalshell_linux.c src/detection/uptime/uptime_bsd.c src/detection/users/users_linux.c - src/detection/wallpaper/wallpaper_nosupport.c + src/detection/wallpaper/wallpaper_apple.c src/detection/wifi/wifi_apple.m src/detection/wmtheme/wmtheme_apple.m src/util/apple/cf_helpers.c diff --git a/README.md b/README.md index 034c05a98..ef9536c06 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ The following libraries are used if present at runtime: * [`MoltenVK`](https://github.com/KhronosGroup/MoltenVK): Vulkan driver for macOS. [`molten-vk`](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/molten-vk.rb) * [`libmagickcore` (ImageMagick)](https://www.imagemagick.org/): Images in terminal using sixel graphics protocol. [`imagemagick`](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/imagemagick.rb) * [`libchafa`](https://github.com/hpjansson/chafa): Image output as ascii art. [`chafa`](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/chafa.rb) +* [`libsqlite3`](https://www.sqlite.org/index.html): Used for fast wallpaper detection ( fallback to AppleScript ) For the image logo, iTerm with iterm image protocol should work. Apple Terminal is not supported. diff --git a/src/common/settings.c b/src/common/settings.c index 8e05c3958..fe53fcb73 100644 --- a/src/common/settings.c +++ b/src/common/settings.c @@ -297,6 +297,7 @@ typedef struct SQLiteData FF_LIBRARY_SYMBOL(sqlite3_step) FF_LIBRARY_SYMBOL(sqlite3_data_count) FF_LIBRARY_SYMBOL(sqlite3_column_int) + FF_LIBRARY_SYMBOL(sqlite3_column_text) FF_LIBRARY_SYMBOL(sqlite3_finalize) FF_LIBRARY_SYMBOL(sqlite3_close) } SQLiteData; @@ -310,6 +311,7 @@ static const SQLiteData* getSQLiteData(const FFinstance* instance) FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_step) FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_data_count) FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_column_int) + FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_column_text) FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_finalize) FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_close) @@ -350,12 +352,52 @@ int ffSettingsGetSQLite3Int(const FFinstance* instance, const char* dbPath, cons return result; } + +bool ffSettingsGetSQLite3String(const FFinstance* instance, const char* dbPath, const char* query, FFstrbuf* result) +{ + if(!ffPathExists(dbPath, FF_PATHTYPE_FILE)) + return false; + + const SQLiteData* data = getSQLiteData(instance); + if(data == NULL) + return false; + + sqlite3* db; + if(data->ffsqlite3_open_v2(dbPath, &db, SQLITE_OPEN_READONLY, NULL) != SQLITE_OK) + return false; + + sqlite3_stmt* stmt; + if(data->ffsqlite3_prepare_v2(db, query, (int) strlen(query), &stmt, NULL) != SQLITE_OK) + { + data->ffsqlite3_close(db); + return false; + } + + if(data->ffsqlite3_step(stmt) != SQLITE_ROW || data->ffsqlite3_data_count(stmt) < 1) + { + data->ffsqlite3_finalize(stmt); + data->ffsqlite3_close(db); + return false; + } + + ffStrbufSetS(result, (const char *) data->ffsqlite3_column_text(stmt, 0)); + + data->ffsqlite3_finalize(stmt); + data->ffsqlite3_close(db); + + return true; +} #else //FF_HAVE_SQLITE3 int ffSettingsGetSQLite3Int(const FFinstance* instance, const char* dbPath, const char* query) { FF_UNUSED(instance, dbPath, query) return 0; } +bool ffSettingsGetSQLite3String(const FFinstance* instance, const char* dbPath, const char* query, FFstrbuf* result) +{ + FF_UNUSED(instance, dbPath, query, result) + return false; +} #endif //FF_HAVE_SQLITE3 #ifdef __ANDROID__ diff --git a/src/common/settings.h b/src/common/settings.h index 6ce213cfd..57fbf5673 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -31,6 +31,7 @@ FFvariant ffSettingsGet(const FFinstance* instance, const char* dconfKey, const FFvariant ffSettingsGetXFConf(const FFinstance* instance, const char* channelName, const char* propertyName, FFvarianttype type); int ffSettingsGetSQLite3Int(const FFinstance* instance, const char* dbPath, const char* query); +bool ffSettingsGetSQLite3String(const FFinstance* instance, const char* dbPath, const char* query, FFstrbuf* result); #ifdef __ANDROID__ void ffSettingsGetAndroidProperty(const char* propName, FFstrbuf* result); diff --git a/src/detection/wallpaper/wallpaper_apple.c b/src/detection/wallpaper/wallpaper_apple.c new file mode 100644 index 000000000..f1235ba1e --- /dev/null +++ b/src/detection/wallpaper/wallpaper_apple.c @@ -0,0 +1,31 @@ +#include "wallpaper.h" +#include "common/settings.h" +#include "util/apple/osascript.h" + +const char* ffDetectWallpaper(FF_MAYBE_UNUSED const FFinstance* instance, FFstrbuf* result) +{ + // https://stackoverflow.com/questions/301215/getting-desktop-background-on-mac + + #ifdef FF_HAVE_SQLITE3 + + FF_STRBUF_AUTO_DESTROY path; + ffStrbufInitCopy(&path, &instance->state.platform.homeDir); + ffStrbufAppendS(&path, "Library/Application Support/Dock/desktoppicture.db"); + if (ffSettingsGetSQLite3String(instance, path.chars, + "SELECT value\n" + "FROM preferences\n" + "JOIN data ON preferences.data_id=data.ROWID\n" + "JOIN pictures ON preferences.picture_id=pictures.ROWID\n" + "JOIN displays ON pictures.display_id=displays.ROWID\n" + "JOIN spaces ON pictures.space_id=spaces.ROWID\n" + "WHERE display_id=1 AND space_id=1 AND key=1", result) + ) + return NULL; + + #endif + + if (!ffOsascript("tell application \"Finder\" to get POSIX path of (get desktop picture as alias)", result)) + return "ffOsascript() failed"; + + return NULL; +}