-
-
Notifications
You must be signed in to change notification settings - Fork 182
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement v2 notification spec #1298
base: main
Are you sure you want to change the base?
Conversation
What is the case for letting an app play a sound freely? In the discussion there was talk of linking sound playback to specific cases, e.g. alarm, new message, new email. Also, it seems to me that the question of custom sounds versus system sounds still needs to be resolved for these example cases, unless there is a valid case to allow an app to play sound freely. |
It's not that apps are allowed to play sound freely, they are allowed to set it. The server may decided whether to play the sound. In GNOME Shell we have a policy system that controls whether a notification can have a sound or not.
I think this doesn't need to be exclusive and I don't see how it would conflict with class specific sounds.
Apps already can play any sound if they have the correct sandbox permission. So we prefer that apps use the notification sound so that the system policy can be respected e.g. do-not-disturb. Although, we may want to restrict the type and length of the sound a notification can have. |
What is driving me nuts in the freedesktop notification spec is that there's no way to know that system sounds are supported and which music formats are supported for custom sounds. This made the sound spec part just unusable when I attempted to play sound with it:
This resulted in application always playing the notification sound on its own. I really hope these problems will be solved in the new API. |
eae298c
to
6cb0d0b
Compare
1c893d7
to
9c11013
Compare
Adding a notification may fail, instead of waiting for the timeout we can check the result we get in the callback.
For debugging it's important that the backend doesn't just crash without telling the reason. It would be even nicer if the test would fail immediately instead of hitting the timeout, but that' currently not possible since the client doesn't know whether the backend failed.
We can reuse most of the test setup for all tests. This will make it easier to test more properties.
This filters unsupported properties from a notification request without failing it. This allows backwards compatibility after adding new properties. This should had been the case from the beginning so that we don't have to break API when extending the notification interface. See [1]. [1] https://dbus.freedesktop.org/doc/dbus-api-design.html#extensibility
This allows setting a custom path for the icon validator, especially useful when testing without installing.
The sandbox for the icon-validator needs a privileged container. And it needs librsvg to be able to validate SVGs.
If debug messages are turned on the output of validate-icon isn't a valid key file since it contains log output as well.
9c11013
to
60db472
Compare
I think one thing to check is if there are static permissions that can help apps guess what mode the device is in (sound, vibration, silent, DND). For example, alarms will certainly be allowed by users, because they are logically important to them. In fact, apps that will use alarm notifications will be able to play sound (because in any mode you cannot completely mute the sound, unless it can be done selectively without dynamic permission), but especially to present a notification (even more so if this is also not constrained by specific experience and actions). |
5705ffc
to
049806c
Compare
b2a4da8
to
391d8f0
Compare
Should something like a progress bar support be added here? for the likes of file transfer or download operation notification? |
Sounds like a good addition to me but we should focus on getting the current scope done first. |
This property allows applications to specify a sound to be played whenever the notification is displayed. The format used is inspired by the serialized from of GIcons.
391d8f0
to
802cb4a
Compare
The `markup-body` property allows applications to set markup on the body. The used markup is a subset of html limted to <b>, <i> and <a>.
The `desktop-file-id` allows applications to specify the desktop file that should be used to look up information about the app. This is especially useful for unsandboxed apps where the portal can't look up the desktop file id based on the app id.
This property allows apps to specify how the notification is displayed.
We need to hand out the activation token for XDG Activation in some way. I think it's pretty nice that we can just add the same platform data as used for DBus Activation to the ActionInvoked signal.
The category allows the notification server to handle specific notification different. E.g. calls notifications.
The purpose for a button allows the notification server to style the button specially and know the purpose of the button.
Let applications query supported options for category and button purpose.
802cb4a
to
ca5691c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My review is not yet complete, but here are a few comments so we can get this rolling sooner.
|
||
keyfile = g_key_file_new (); | ||
|
||
g_key_file_set_string (keyfile, "notification", "supported-options", "{ 'something': <'sdfs'> }"); //supported_options); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please remove the //supported_options);
from this line
This documentation describes version 1 of this interface. | ||
This documentation describes version 2 of this interface. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This commit is fine, but it should be placed in the beginning of the patchset, before any API-bumping change is introduced.
static void | ||
notification_succeed (GObject *source, | ||
GAsyncResult *result, | ||
gpointer data) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
static void | |
notification_succeed (GObject *source, | |
GAsyncResult *result, | |
gpointer data) | |
static void | |
notification_succeed (GObject *source, | |
GAsyncResult *result, | |
gpointer data) |
static void | ||
notification_fail (GObject *source, | ||
GAsyncResult *result, | ||
gpointer data) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
static void | |
notification_fail (GObject *source, | |
GAsyncResult *result, | |
gpointer data) | |
static void | |
notification_fail (GObject *source, | |
GAsyncResult *result, | |
gpointer data) |
} | ||
|
||
static void | ||
test_themed_icon () |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All functions without arguments should be in the form of foo (void)
. This commit contains a few of them, please update them all.
@@ -243,6 +243,31 @@ test_bytes_icon () | |||
test_icon (serialized_icon_s, NULL, FALSE); | |||
} | |||
|
|||
static void | |||
test_file_icon () |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto about foo (void)
|
||
file = g_file_new_tmp ("iconXXXXXX", &iostream, NULL); | ||
stream = g_io_stream_get_output_stream (G_IO_STREAM (iostream)); | ||
g_output_stream_write_all (stream, IMAGE_DATA, strlen(IMAGE_DATA), NULL, NULL, NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
g_output_stream_write_all (stream, IMAGE_DATA, strlen(IMAGE_DATA), NULL, NULL, NULL); | |
g_output_stream_write_all (stream, SVG_IMAGE_DATA, strlen (SVG_IMAGE_DATA), NULL, NULL, NULL); |
GOutputStream *stream = NULL; | ||
|
||
file = g_file_new_tmp ("iconXXXXXX", &iostream, NULL); | ||
stream = g_io_stream_get_output_stream (G_IO_STREAM (iostream)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see. So, the include I mentioned earlier should have been added in this commit, not that other one.
g_autofree char *uri = NULL; | ||
g_autofree char *serialized_icon_s = NULL; | ||
g_autofree char *exp_serialized_icon_s = NULL; | ||
g_autoptr(GVariant) serialized_icon = NULL; | ||
g_autoptr(GFile) file = NULL; | ||
g_autoptr(GIcon) icon = NULL; | ||
g_autoptr(GFileIOStream) iostream = NULL; | ||
GOutputStream *stream = NULL; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I'm borderline OCD, sorry.
g_autofree char *uri = NULL; | |
g_autofree char *serialized_icon_s = NULL; | |
g_autofree char *exp_serialized_icon_s = NULL; | |
g_autoptr(GVariant) serialized_icon = NULL; | |
g_autoptr(GFile) file = NULL; | |
g_autoptr(GIcon) icon = NULL; | |
g_autoptr(GFileIOStream) iostream = NULL; | |
GOutputStream *stream = NULL; | |
g_autoptr(GFileIOStream) iostream = NULL; | |
g_autoptr(GVariant) serialized_icon = NULL; | |
g_autoptr(GIcon) icon = NULL; | |
g_autoptr(GFile) file = NULL; | |
GOutputStream *stream = NULL; | |
g_autofree char *exp_serialized_icon_s = NULL; | |
g_autofree char *serialized_icon_s = NULL; | |
g_autofree char *uri = NULL; |
g_autofree char *uri = NULL; | ||
g_autofree char *serialized_icon_s = NULL; | ||
g_autofree char *exp_serialized_icon_s = NULL; | ||
g_autoptr(GVariant) serialized_icon = NULL; | ||
g_autoptr(GFile) file = NULL; | ||
g_autoptr(GIcon) icon = NULL; | ||
g_autoptr(GFileIOStream) iostream = NULL; | ||
GOutputStream *stream = NULL; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this one needs g_autoptr
as well, no?
I took the liberty to cherry-pick some of the commits here into a separate branch, and merged it: #1386 All commits which a modified have a "Co-authored-by" in their message. One of the commits introduced tests that were timing out, and I took the liberty to fix these tests as well. This PR now needs to be rebased against the main branch. Some of the review comments I've made won't apply anymore, but others will. |
After lot of consideration I started implementing parts of the proposed and discussed notification API
For now this includes:
desktop-file-id
propertymarkup-body
propertydisplay-hint
propertynew actions, similar to buttons (the name may be a little confusing, open for suggestions)Part of buttons nowcontent-typecategory
propertycontent-typecategory
,action purposeand button purpose APIThis needs changes in libportal flatpak/libportal#147 for tests.
I also started writing the changes needed in xdg-desktop-portal-gtk: https://github.com/jsparber/xdg-desktop-portal-gtk/tree/implement_notification_v2 and other portal backends need to do the same thing.
Parts that didn't made it from #1304 into this MR may be added it a later revision of the portal.
Fixes: #485