Skip to content
Snippets Groups Projects
Commit 1c9e333d authored by Dylan Van Assche's avatar Dylan Van Assche
Browse files

temp/feedbackd: device-specific feedbackd themes

parent 15a07ac7
No related branches found
No related tags found
No related merge requests found
From 32f64705654442221bd0c1f6eaf4d473ca892c79 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sat, 28 Nov 2020 16:58:32 +0100
Subject: [PATCH] fbd-feedback-manager: Allow device-specific feedbackd themes
---
data/meson.build | 11 ++-
data/pine64,pinephone-1.0.json | 1 +
data/pine64,pinephone-1.1.json | 1 +
data/pine64,pinephone-1.2.json | 175 +++++++++++++++++++++++++++++++++
src/fbd-feedback-manager.c | 54 +++++++++-
5 files changed, 234 insertions(+), 8 deletions(-)
create mode 120000 data/pine64,pinephone-1.0.json
create mode 120000 data/pine64,pinephone-1.1.json
create mode 100644 data/pine64,pinephone-1.2.json
diff --git a/data/meson.build b/data/meson.build
index d90230e..19ae64a 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -44,20 +44,21 @@ configure_file(
install_dir: servicedir,
)
-theme_json = ['default.json']
+themes_json = ['default.json', 'pine64,pinephone-1.0.json',
+ 'pine64,pinephone-1.1.json', 'pine64,pinephone-1.2.json']
install_data(
- theme_json,
+ themes_json,
install_dir: feedbackd_theme_dir,
)
if json_glib_validate.found()
jsons = []
- foreach theme : theme_json
- jsons += (join_paths(meson.current_source_dir(), theme_json))
+ foreach theme : themes_json
+ jsons += (join_paths(meson.current_source_dir(), theme))
endforeach
custom_target('validate-json',
build_by_default: true,
- input: theme_json,
+ input: theme,
output: 'json_validate_stamp',
command: [json_glib_validate.path()] + jsons)
endif
diff --git a/data/pine64,pinephone-1.0.json b/data/pine64,pinephone-1.0.json
new file mode 120000
index 0000000..4de3923
--- /dev/null
+++ b/data/pine64,pinephone-1.0.json
@@ -0,0 +1 @@
+pine64,pinephone-1.2.json
\ No newline at end of file
diff --git a/data/pine64,pinephone-1.1.json b/data/pine64,pinephone-1.1.json
new file mode 120000
index 0000000..4de3923
--- /dev/null
+++ b/data/pine64,pinephone-1.1.json
@@ -0,0 +1 @@
+pine64,pinephone-1.2.json
\ No newline at end of file
diff --git a/data/pine64,pinephone-1.2.json b/data/pine64,pinephone-1.2.json
new file mode 100644
index 0000000..2b62845
--- /dev/null
+++ b/data/pine64,pinephone-1.2.json
@@ -0,0 +1,175 @@
+{
+ "name" : "default",
+ "profiles" : [
+ {
+ "name" : "full",
+ "feedbacks" : [
+ {
+ "event-name" : "alarm-clock-elapsed",
+ "type" : "Sound",
+ "effect" : "alarm-clock-elapsed"
+ },
+ {
+ "event-name" : "button-pressed",
+ "type" : "Sound",
+ "effect" : "button-pressed"
+ },
+ {
+ "event-name" : "button-released",
+ "type" : "Sound",
+ "effect" : "button-released"
+ },
+ {
+ "event-name" : "message-new-email",
+ "type" : "Sound",
+ "effect" : "message-new-email"
+ },
+ {
+ "event-name" : "message-new-instant",
+ "type" : "Sound",
+ "effect" : "message-new-instant"
+ },
+ {
+ "event-name" : "message-new-sms",
+ "type" : "Sound",
+ "effect" : "message-new-instant"
+ },
+ {
+ "event-name" : "phone-incoming-call",
+ "type" : "Sound",
+ "effect" : "phone-incoming-call"
+ },
+ {
+ "event-name" : "timeout-completed",
+ "type" : "Sound",
+ "effect" : "complete"
+ },
+ {
+ "event-name" : "theme-demo",
+ "type" : "Sound",
+ "effect" : "theme-demo"
+ },
+ {
+ "event-name" : "window-close",
+ "type" : "Sound",
+ "effect" : "theme-demo"
+ }
+ ]
+ },
+ {
+ "name" : "quiet",
+ "feedbacks" : [
+ {
+ "event-name" : "alarm-clock-elapsed",
+ "type" : "VibraPeriodic",
+ "magnitude" : 32767,
+ "duration" : 10000,
+ "fade-in-time" : 10000,
+ "fade-in-level": 4096
+ },
+ {
+ "event-name" : "bell-terminal",
+ "type" : "VibraRumble",
+ "duration" : 100
+ },
+ {
+ "event-name" : "button-pressed",
+ "type" : "VibraRumble",
+ "duration" : 80
+ },
+ {
+ "event-name" : "button-released",
+ "type" : "VibraRumble",
+ "duration" : 40
+ },
+ {
+ "event-name" : "message-new-email",
+ "type" : "VibraRumble",
+ "duration" : 750,
+ "count" : 3,
+ "pause" : 100
+ },
+ {
+ "event-name" : "message-new-instant",
+ "type" : "VibraRumble",
+ "duration" : 750
+ },
+ {
+ "event-name" : "message-new-sms",
+ "type" : "VibraRumble",
+ "duration" : 1250,
+ "count" : 2,
+ "pause" : 250
+ },
+ {
+ "event-name" : "message-sent-instant",
+ "type" : "VibraRumble",
+ "duration" : 250
+ },
+ {
+ "event-name" : "phone-incoming-call",
+ "type" : "VibraPeriodic",
+ "duration" : 10000
+ },
+ {
+ "event-name" : "timeout-completed",
+ "type" : "VibraRumble",
+ "duration" : 500
+ },
+ {
+ "event-name" : "theme-demo",
+ "type" : "VibraPeriodic",
+ "magnitude" : 32767,
+ "duration" : 5000
+ },
+ {
+ "event-name" : "window-close",
+ "type" : "VibraRumble",
+ "duration" : 75
+ }
+ ]
+ },
+ {
+ "name" : "silent",
+ "feedbacks" : [
+ {
+ "event-name" : "battery-caution",
+ "type" : "Led",
+ "color" : "red",
+ "frequency" : 5000
+ },
+ {
+ "event-name" : "phone-missed-call",
+ "type" : "Led",
+ "color" : "blue",
+ "frequency" : 3000
+ },
+ {
+ "event-name" : "message-missed-email",
+ "type" : "Led",
+ "color" : "blue",
+ "frequency" : 2000
+ },
+ {
+ "event-name" : "message-missed-instant",
+ "type" : "Led",
+ "color" : "blue",
+ "frequency" : 1000
+ },
+ {
+ "event-name" : "message-missed-notification",
+ "type" : "Led",
+ "color" : "blue",
+ "frequency" : 500
+ },
+ {
+ "event-name" : "message-missed-sms",
+ "type" : "Led",
+ "color" : "blue",
+ "frequency" : 2000
+ }
+ ]
+ }
+ ]
+}
+
diff --git a/src/fbd-feedback-manager.c b/src/fbd-feedback-manager.c
index ef508c7..a5c07ef 100644
--- a/src/fbd-feedback-manager.c
+++ b/src/fbd-feedback-manager.c
@@ -21,10 +21,13 @@
#define FEEDBACKD_SCHEMA_ID "org.sigxcpu.feedbackd"
#define FEEDBACKD_KEY_PROFILE "profile"
+#define FEEDBACKD_THEME_VAR "FEEDBACK_THEME"
#define APP_SCHEMA FEEDBACKD_SCHEMA_ID ".application"
#define APP_PREFIX "/org/sigxcpu/feedbackd/application/"
+#define DEVICE_TREE_PATH "/proc/device-tree/compatible"
+
/**
* SECTION:fbd-feedback-manager
@@ -352,18 +355,63 @@ fbd_feedback_manager_handle_end_feedback (LfbGdbusFeedback *object,
return TRUE;
}
+static gboolean
+find_config (gchar **themefile) {
+ gboolean success = FALSE;
+ g_autofree gchar *device_name = NULL;
+ g_autofree gchar *config_path = NULL;
+
+ // Try to read the device name
+ if (g_file_test(DEVICE_TREE_PATH, (G_FILE_TEST_EXISTS))) {
+ g_debug("Found device tree device name path");
+
+ // Check if feedbackd has a proper config available this device
+ if (g_file_get_contents (DEVICE_TREE_PATH, &device_name, NULL, NULL)) {
+ g_debug("Read device name: %s", device_name);
+ config_path = g_strconcat(FEEDBACKD_THEME_DIR, "/", device_name, ".json", NULL);
+ g_info("Searching for device specific themefile in %s", config_path);
+
+ // Check if theme exist
+ if (g_file_test(config_path, (G_FILE_TEST_EXISTS))) {
+ g_info("Found themefile for this device!");
+ *themefile = g_strdup(config_path);
+ success = TRUE;
+ }
+ else {
+ g_info("No feedbackd theme available for '%s', falling back to default", device_name);
+ }
+ }
+ else {
+ g_info("Unable to read device name from device tree");
+ }
+ }
+ else {
+ g_info("Device tree path does not exist: %s", DEVICE_TREE_PATH);
+ }
+
+ return success;
+}
+
static void
fbd_feedback_manager_constructed (GObject *object)
{
g_autoptr (GError) err = NULL;
FbdFeedbackManager *self = FBD_FEEDBACK_MANAGER (object);
- const gchar *themefile;
+ gchar *themefile = NULL;
G_OBJECT_CLASS (fbd_feedback_manager_parent_class)->constructed (object);
- themefile = g_getenv ("FEEDBACK_THEME");
+ // Search for device-specific configuration
+ find_config (&themefile);
+
+ // Overide themefile with environment variable if requested
+ if (g_getenv(FEEDBACKD_THEME_VAR))
+ themefile = g_strdup (g_getenv (FEEDBACKD_THEME_VAR));
+
+ // Fallback to default configuration if needed
if (!themefile)
- themefile = FEEDBACKD_THEME_DIR "/default.json";
+ themefile = g_strconcat(FEEDBACKD_THEME_DIR, "/default.json", NULL);
+ g_info("Using themefile: %s", themefile);
self->theme = fbd_feedback_theme_new_from_file (themefile, &err);
if (!self->theme) {
--
2.25.1
# Forked from Alpine to provide a newer version
pkgname=feedbackd
pkgver=0_git20200726
pkgrel=0
pkgdesc="A daemon to provide haptic (and later more) feedback on events"
url="https://source.puri.sm/Librem5/feedbackd"
arch="all"
license="GPL-3.0-or-later"
depends="dbus"
makedepends="meson glib-dev gsound-dev libgudev-dev json-glib-dev gtk-doc
vala gobject-introspection-dev"
subpackages="$pkgname-dev"
source="https://source.puri.sm/Librem5/feedbackd/-/archive/v0.0.0+${pkgver#0_}/feedbackd-v0.0.0+${pkgver#0_}.tar.gz
0001-fbd-feedback-manager-Allow-device-specific-feedbackd.patch"
builddir="$srcdir/$pkgname-v0.0.0+${pkgver#0_}"
options="!check" # Tests fail in QEMU
build() {
abuild-meson \
-Dgtk_doc=false \
. output
meson compile ${JOBS:+-j ${JOBS}} -C output
}
check() {
meson test --no-rebuild -v -C output
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
install -Dm644 "$builddir"/debian/feedbackd.udev \
"$pkgdir"/usr/lib/udev/rules.d/90-feedbackd.rules
}
sha512sums="2a3e443c5f565dce7cdc25ade73934b5ab29c9efc6ceaa2d404111bfcd67fbc9b02893fc34559c8071aaba218686f2ba8109b2fd92a74e9f16955406ed6af6f6 feedbackd-v0.0.0+git20200726.tar.gz
3bb88ef76e4b42feebaf65c09a4a9ae28bcee3ed895940f464ab2e87352978c01d30a4138914d14cd7d92acc64ffce986f8df588a2a2acf731be910656c1ab02 0001-fbd-feedback-manager-Allow-device-specific-feedbackd.patch"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment