From 31a592e18eea2b09702f1c6481edeeb55957ac1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 17 Apr 2023 12:18:35 +0200 Subject: [PATCH 1/7] debian/symbols: Bump all symbol dependencies to 0.1.1 We want to make sure apps run against a recent version even on partial upgrades. --- debian/libfeedback-0.0-0.symbols | 52 ++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/debian/libfeedback-0.0-0.symbols b/debian/libfeedback-0.0-0.symbols index a2e0106..939de4d 100644 --- a/debian/libfeedback-0.0-0.symbols +++ b/debian/libfeedback-0.0-0.symbols @@ -1,3 +1,51 @@ libfeedback-0.0.so.0 libfeedback-0.0-0 #MINVER# -* Build-Depends-Package: libfeedback-dev - *@LIBFEEDBACK_0_0_0 0.0.0+git20200707 + LIBFEEDBACK_0_0_0@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_end_feedback@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_end_feedback_async@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_end_feedback_finish@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_end_reason_get_type@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_get_end_reason@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_get_event@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_get_feedback_profile@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_get_state@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_get_timeout@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_get_type@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_new@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_set_feedback_profile@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_set_timeout@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_state_get_type@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_trigger_feedback@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_trigger_feedback_async@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_trigger_feedback_finish@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_call_end_feedback@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_call_end_feedback_finish@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_call_end_feedback_sync@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_call_trigger_feedback@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_call_trigger_feedback_finish@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_call_trigger_feedback_sync@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_complete_end_feedback@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_complete_trigger_feedback@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_dup_profile@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_emit_feedback_ended@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_get_profile@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_get_type@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_interface_info@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_override_properties@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_proxy_get_type@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_proxy_new@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_proxy_new_finish@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_proxy_new_for_bus@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_proxy_new_for_bus_finish@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_proxy_new_for_bus_sync@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_proxy_new_sync@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_set_profile@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_skeleton_get_type@LIBFEEDBACK_0_0_0 0.1.1 + lfb_gdbus_feedback_skeleton_new@LIBFEEDBACK_0_0_0 0.1.1 + lfb_get_app_id@LIBFEEDBACK_0_0_0 0.1.1 + lfb_get_feedback_profile@LIBFEEDBACK_0_0_0 0.1.1 + lfb_get_proxy@LIBFEEDBACK_0_0_0 0.1.1 + lfb_init@LIBFEEDBACK_0_0_0 0.1.1 + lfb_is_initted@LIBFEEDBACK_0_0_0 0.1.1 + lfb_set_app_id@LIBFEEDBACK_0_0_0 0.1.1 + lfb_set_feedback_profile@LIBFEEDBACK_0_0_0 0.1.1 + lfb_uninit@LIBFEEDBACK_0_0_0 0.1.1 From 1a5cd090de92b35c7c6e62906a7d92bd1a090a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 17 Apr 2023 12:07:07 +0200 Subject: [PATCH 2/7] lfb-event: Avoid allocation when getting profile We can return the const *. This makes it consistent with other getters. This is an API change we didn't find any users and the API is declared unstable. --- libfeedback/lfb-event.c | 12 +++++++----- libfeedback/lfb-event.h | 2 +- tests/test-lfb-event.c | 4 +--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libfeedback/lfb-event.c b/libfeedback/lfb-event.c index 0582bd0..3756ddf 100644 --- a/libfeedback/lfb-event.c +++ b/libfeedback/lfb-event.c @@ -244,7 +244,7 @@ lfb_event_get_property (GObject *object, g_value_set_int (value, self->timeout); break; case PROP_FEEDBACK_PROFILE: - g_value_set_string (value, self->profile); + g_value_set_string (value, lfb_event_get_feedback_profile (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -716,13 +716,15 @@ lfb_event_set_feedback_profile (LfbEvent *self, const gchar *profile) * lfb_event_get_feedback_profile: * @self: The event * - * Returns:(transfer full): The set feedback profile to use for this - * event or %NULL. + * Gets the set feedback profile. If no profile was set it returns + * %NULL. The event uses the system wide profile in this case. + * + * Returns: The set feedback profile to use for this event or %NULL. */ -char * +const char * lfb_event_get_feedback_profile (LfbEvent *self) { g_return_val_if_fail (LFB_IS_EVENT (self), NULL); - return g_strdup (self->profile); + return self->profile; } diff --git a/libfeedback/lfb-event.h b/libfeedback/lfb-event.h index 651b75d..921bd7f 100644 --- a/libfeedback/lfb-event.h +++ b/libfeedback/lfb-event.h @@ -74,7 +74,7 @@ gboolean lfb_event_end_feedback_finish (LfbEvent *self, void lfb_event_set_timeout (LfbEvent *self, gint timeout); gint lfb_event_get_timeout (LfbEvent *self); void lfb_event_set_feedback_profile (LfbEvent *self, const char *profile); -char *lfb_event_get_feedback_profile (LfbEvent *self); +const char *lfb_event_get_feedback_profile (LfbEvent *self); const char *lfb_event_get_event (LfbEvent *self); LfbEventState lfb_event_get_state (LfbEvent *self); LfbEventEndReason lfb_event_get_end_reason (LfbEvent *self); diff --git a/tests/test-lfb-event.c b/tests/test-lfb-event.c index 49d5b33..955a193 100644 --- a/tests/test-lfb-event.c +++ b/tests/test-lfb-event.c @@ -35,9 +35,7 @@ test_lfb_event_props (void) g_object_set (event, "feedback-profile", "full", NULL); g_object_get (event, "feedback-profile", &profile, NULL); g_assert_cmpstr (profile, ==, "full"); - g_free (profile); - profile = lfb_event_get_feedback_profile (event); - g_assert_cmpstr (profile, ==, "full"); + g_assert_cmpstr (lfb_event_get_feedback_profile (event), ==, "full"); lfb_uninit (); } From a58b47e1eb6a8e5cb9d5a2d3d6353bc0b5ab6222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 17 Apr 2023 12:07:08 +0200 Subject: [PATCH 3/7] tests: Get properties all at once --- tests/test-lfb-event.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/test-lfb-event.c b/tests/test-lfb-event.c index 955a193..b5ed27c 100644 --- a/tests/test-lfb-event.c +++ b/tests/test-lfb-event.c @@ -21,17 +21,18 @@ test_lfb_event_props (void) event = lfb_event_new ("window-close"); g_assert_true (LFB_IS_EVENT (event)); - g_object_get (event, "event", &evname, NULL); + g_object_get (event, + "event", &evname, + "timeout", &timeout, + "feedback-profile", &profile, + NULL); g_assert_cmpstr (evname, ==, "window-close"); - - g_object_get (event, "timeout", &timeout, NULL); g_assert_cmpint (timeout, ==, -1); + g_assert_null (profile); g_assert_cmpint (lfb_event_get_end_reason (event), ==, LFB_EVENT_END_REASON_NATURAL); g_assert_cmpint (lfb_event_get_state (event), ==, LFB_EVENT_STATE_NONE); - g_object_get (event, "feedback-profile", &profile, NULL); - g_assert_null (profile); g_object_set (event, "feedback-profile", "full", NULL); g_object_get (event, "feedback-profile", &profile, NULL); g_assert_cmpstr (profile, ==, "full"); From 2de190fb09f73c8ffbe4ad3d28ae065cf06013d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 17 Apr 2023 12:07:09 +0200 Subject: [PATCH 4/7] lfb-event: Add getter and setter for app-id For applications this is figured out automatically but notification daemons and portal implementations might want to override it to have the per-app feedback profile picked up automatically. --- libfeedback/lfb-event.c | 77 +++++++++++++++++++++++++++++++++++++++-- libfeedback/lfb-event.h | 2 ++ tests/test-lfb-event.c | 8 +++++ 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/libfeedback/lfb-event.c b/libfeedback/lfb-event.c index 3756ddf..8ce3f8f 100644 --- a/libfeedback/lfb-event.c +++ b/libfeedback/lfb-event.c @@ -79,6 +79,7 @@ enum { PROP_STATE, PROP_END_REASON, PROP_FEEDBACK_PROFILE, + PROP_APP_ID, PROP_LAST_PROP, }; static GParamSpec *props[PROP_LAST_PROP]; @@ -95,6 +96,7 @@ typedef struct _LfbEvent { char *event; gint timeout; gchar *profile; + char *app_id; guint id; LfbEventState state; @@ -221,6 +223,9 @@ lfb_event_set_property (GObject *object, case PROP_FEEDBACK_PROFILE: lfb_event_set_feedback_profile (self, g_value_get_string (value)); break; + case PROP_APP_ID: + lfb_event_set_app_id (self, g_value_get_string (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -246,6 +251,9 @@ lfb_event_get_property (GObject *object, case PROP_FEEDBACK_PROFILE: g_value_set_string (value, lfb_event_get_feedback_profile (self)); break; + case PROP_APP_ID: + g_value_set_string (value, lfb_event_get_app_id (self)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -262,6 +270,7 @@ lfb_event_finalize (GObject *object) g_clear_pointer (&self->event, g_free); g_clear_pointer (&self->profile, g_free); + g_clear_pointer (&self->app_id, g_free); G_OBJECT_CLASS (lfb_event_parent_class)->finalize (object); } @@ -336,6 +345,20 @@ lfb_event_class_init (LfbEventClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + /** + * LfbEvent:app-id: + * + * The application id to use for the event. + * [method@LfbEvent.set_feedback_profile]() for details. + */ + props[PROP_APP_ID] = + g_param_spec_string ( + "app-id", + "Application Id", + "The Application id to use for this event", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (object_class, PROP_LAST_PROP, props); /** @@ -411,6 +434,7 @@ lfb_event_trigger_feedback (LfbEvent *self, GError **error) { LfbGdbusFeedback *proxy; gboolean success; + const char *app_id; g_return_val_if_fail (LFB_IS_EVENT (self), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); @@ -429,8 +453,9 @@ lfb_event_trigger_feedback (LfbEvent *self, GError **error) G_CONNECT_SWAPPED); } + app_id = self->app_id ?: lfb_get_app_id (); success = lfb_gdbus_feedback_call_trigger_feedback_sync (proxy, - lfb_get_app_id (), + app_id, self->event, build_hints (self), self->timeout, @@ -462,6 +487,7 @@ lfb_event_trigger_feedback_async (LfbEvent *self, { LfbAsyncData *data; LfbGdbusFeedback *proxy; + const char *app_id; g_return_if_fail (LFB_IS_EVENT (self)); if (!lfb_is_initted ()) @@ -481,8 +507,10 @@ lfb_event_trigger_feedback_async (LfbEvent *self, data = g_new0 (LfbAsyncData, 1); data->task = g_task_new (self, cancellable, callback, user_data); data->event = g_object_ref (self); + + app_id = self->app_id ?: lfb_get_app_id (); lfb_gdbus_feedback_call_trigger_feedback (proxy, - lfb_get_app_id (), + app_id, self->event, build_hints (self), self->timeout, @@ -728,3 +756,48 @@ lfb_event_get_feedback_profile (LfbEvent *self) return self->profile; } + +/** + * lfb_event_set_app_id: + * @self: The event + * @app_id: The application id to use + * + * Tells the feedback server to use the given application id for + * this event when it is submitted. The server might ignore this + * request. This can be used by notification daemons to honor per + * application settings automatically. + * + * The functions is usually not used by applications. + * + * A value of %NULL (the default) lets the server pick the profile. + */ +void +lfb_event_set_app_id (LfbEvent *self, const gchar *app_id) +{ + g_return_if_fail (LFB_IS_EVENT (self)); + + if (!g_strcmp0 (self->app_id, app_id)) + return; + + g_free (self->app_id); + self->app_id = g_strdup (app_id); + g_object_notify_by_pspec (G_OBJECT (self), props[PROP_APP_ID]); +} + +/** + * lfb_event_get_app_id: + * @self: The event + * + * Returns the app-id for this event. If no app-id has been explicitly + * set, %NULL is returned. The event uses the app-id returns by + * [func@lfb_get_app_id] in this case. + * + * Returns:(transfer none): The set app-id for this event or %NULL. + */ +const char * +lfb_event_get_app_id (LfbEvent *self) +{ + g_return_val_if_fail (LFB_IS_EVENT (self), NULL); + + return self->app_id; +} diff --git a/libfeedback/lfb-event.h b/libfeedback/lfb-event.h index 921bd7f..6437c60 100644 --- a/libfeedback/lfb-event.h +++ b/libfeedback/lfb-event.h @@ -75,6 +75,8 @@ void lfb_event_set_timeout (LfbEvent *self, gint timeout); gint lfb_event_get_timeout (LfbEvent *self); void lfb_event_set_feedback_profile (LfbEvent *self, const char *profile); const char *lfb_event_get_feedback_profile (LfbEvent *self); +void lfb_event_set_app_id (LfbEvent *self, const char *app_id); +const char *lfb_event_get_app_id (LfbEvent *self); const char *lfb_event_get_event (LfbEvent *self); LfbEventState lfb_event_get_state (LfbEvent *self); LfbEventEndReason lfb_event_get_end_reason (LfbEvent *self); diff --git a/tests/test-lfb-event.c b/tests/test-lfb-event.c index b5ed27c..d52b9fb 100644 --- a/tests/test-lfb-event.c +++ b/tests/test-lfb-event.c @@ -14,6 +14,7 @@ test_lfb_event_props (void) g_autoptr(LfbEvent) event = NULL; g_autofree gchar *evname = NULL; g_autofree gchar *profile = NULL; + g_autofree gchar *app_id = NULL; gint timeout; g_assert_true (lfb_init (TEST_APP_ID, NULL)); @@ -25,10 +26,12 @@ test_lfb_event_props (void) "event", &evname, "timeout", &timeout, "feedback-profile", &profile, + "app-id", &app_id, NULL); g_assert_cmpstr (evname, ==, "window-close"); g_assert_cmpint (timeout, ==, -1); g_assert_null (profile); + g_assert_null (app_id); g_assert_cmpint (lfb_event_get_end_reason (event), ==, LFB_EVENT_END_REASON_NATURAL); g_assert_cmpint (lfb_event_get_state (event), ==, LFB_EVENT_STATE_NONE); @@ -38,6 +41,11 @@ test_lfb_event_props (void) g_assert_cmpstr (profile, ==, "full"); g_assert_cmpstr (lfb_event_get_feedback_profile (event), ==, "full"); + g_object_set (event, "app-id", "com.example.foo", NULL); + g_object_get (event, "app-id", &app_id, NULL); + g_assert_cmpstr (app_id, ==, "com.example.foo"); + g_assert_cmpstr (lfb_event_get_app_id (event), ==, "com.example.foo"); + lfb_uninit (); } From f9aae0b68931003b3e07a3a6e9109d9cfc3b845b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 17 Apr 2023 12:10:14 +0200 Subject: [PATCH 5/7] build: Bump version to 0.2.0 We have a slight api change --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index beedde1..f3c49af 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('feedbackd', 'c', - version : '0.1.1', + version : '0.2.0', license : 'LGPLv3+', meson_version : '>= 0.56.0', default_options : [ From 08ee0daa12c936fdab8485a6ebeb244693e80d23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 17 Apr 2023 12:20:44 +0200 Subject: [PATCH 6/7] debian/symbols: Update with new API --- debian/libfeedback-0.0-0.symbols | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/libfeedback-0.0-0.symbols b/debian/libfeedback-0.0-0.symbols index 939de4d..fc1d6d6 100644 --- a/debian/libfeedback-0.0-0.symbols +++ b/debian/libfeedback-0.0-0.symbols @@ -4,6 +4,7 @@ libfeedback-0.0.so.0 libfeedback-0.0-0 #MINVER# lfb_event_end_feedback_async@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_end_feedback_finish@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_end_reason_get_type@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_get_app_id@LIBFEEDBACK_0_0_0 0.2.0 lfb_event_get_end_reason@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_get_event@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_get_feedback_profile@LIBFEEDBACK_0_0_0 0.1.1 @@ -11,6 +12,7 @@ libfeedback-0.0.so.0 libfeedback-0.0-0 #MINVER# lfb_event_get_timeout@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_get_type@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_new@LIBFEEDBACK_0_0_0 0.1.1 + lfb_event_set_app_id@LIBFEEDBACK_0_0_0 0.2.0 lfb_event_set_feedback_profile@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_set_timeout@LIBFEEDBACK_0_0_0 0.1.1 lfb_event_state_get_type@LIBFEEDBACK_0_0_0 0.1.1 From 8d4b1a09ab0fdab1e377273903dbcade65fdb458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 17 Apr 2023 12:14:38 +0200 Subject: [PATCH 7/7] Document changes and release 0.2.0 --- debian/changelog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index 607b24e..a437961 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +feedbackd (0.2.0) experimental; urgency=medium + + * build: Bump version to 0.2.0. We have a slight api change. + * lfb-event: Avoid allocation when getting profile. + We can return the const *. This makes it consistent with other getters. + This is an API change we didn't find any users and the API is declared + unstable. + * tests: Get properties all at once + * lfb-event: Add getter and setter for app-id. + For applications this is figured out automatically but notification + daemons and portal implementations might want to override it to have the + per-app feedback profile picked up automatically. + + -- Guido Günther Mon, 17 Apr 2023 12:14:14 +0200 + feedbackd (0.1.1) experimental; urgency=medium * build: Avoid meson deprecation warning