diff options
author | Bastien Nocera <hadess@hadess.net> | 2021-10-18 12:58:19 +0200 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2021-10-18 15:17:08 +0200 |
commit | 7b1ff8df213fb9ae0314bebb21e7afd4ff0854f1 (patch) | |
tree | ebdde964fb37c88007e5451d462c08b194e01b0f | |
parent | 310f543da1954938cad12bd8465548d0a827786b (diff) | |
download | gnome-settings-daemon-7b1ff8df213fb9ae0314bebb21e7afd4ff0854f1.tar.gz |
media-keys: Remove GNOME-specific MediaKeys API
It has since been superseded by MPRIS.
-rw-r--r-- | plugins/media-keys/README.media-keys-API | 51 | ||||
-rw-r--r-- | plugins/media-keys/gsd-media-keys-manager.c | 276 |
2 files changed, 5 insertions, 322 deletions
diff --git a/plugins/media-keys/README.media-keys-API b/plugins/media-keys/README.media-keys-API deleted file mode 100644 index 55d1a59a..00000000 --- a/plugins/media-keys/README.media-keys-API +++ /dev/null @@ -1,51 +0,0 @@ -This is very simple documentation to gnome-settings-daemon's -D-Bus API for media players. - -gnome-settings-daemon will send key press events from multimedia -keys to applications that register their interest in those events. -This allows the play/pause button to control an audio player that's -not focused for example. - -The D-Bus API is described in gsd-media-keys-manager.c (look for -introspection_xml), but a small explanation follows here. - -1. Create yourself a proxy object for the remote interface: -Object path: /org/gnome/SettingsDaemon/MediaKeys -D-Bus name: org.gnome.SettingsDaemon.MediaKeys -Interface name: org.gnome.SettingsDaemon.MediaKeys - -2. Register your application with gnome-settings-daemon -GrabMediaPlayerKeys ("my-application", 0) -with the second argument being the current time (usually 0, -or the time passed to you from an event, such as a mouse click) - -3. Listen to the MediaPlayerKeyPressed() signal - -4. When receiving a MediaPlayerKeyPressed() signal, -check whether the first argument (application) matches -the value you passed to GrabMediaPlayerKeys() and apply the -action depending on the key (2nd argument) - -Possible values of key are: -- Play -- Pause -- Stop -- Previous -- Next -- Rewind -- FastForward -- Repeat -- Shuffle - -5. Every time your application is focused, you should call -GrabMediaPlayerKeys() again, so that gnome-settings-daemon knows -which one was last used. This allows switching between a movie player -and a music player, for example, and have the buttons control the -last used application. - -6. When your application wants to stop using the functionality -it can call ReleaseMediaPlayerKeys(). If your application does -not call ReleaseMediaPlayerKeys() and releases its D-Bus connection -then the application will be automatically removed from the list of -applications held by gnome-settings-daemon. - diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c index b5f9506d..48894f82 100644 --- a/plugins/media-keys/gsd-media-keys-manager.c +++ b/plugins/media-keys/gsd-media-keys-manager.c @@ -94,24 +94,6 @@ * 3 seconds is the minimum necessary to make resume reliable */ #define GSD_REENABLE_POWER_BUTTON_DELAY 3000 /* ms */ -static const gchar introspection_xml[] = -"<node name='/org/gnome/SettingsDaemon/MediaKeys'>" -" <interface name='org.gnome.SettingsDaemon.MediaKeys'>" -" <annotation name='org.freedesktop.DBus.GLib.CSymbol' value='gsd_media_keys_manager'/>" -" <method name='GrabMediaPlayerKeys'>" -" <arg name='application' direction='in' type='s'/>" -" <arg name='time' direction='in' type='u'/>" -" </method>" -" <method name='ReleaseMediaPlayerKeys'>" -" <arg name='application' direction='in' type='s'/>" -" </method>" -" <signal name='MediaPlayerKeyPressed'>" -" <arg name='application' type='s'/>" -" <arg name='key' type='s'/>" -" </signal>" -" </interface>" -"</node>"; - #define SETTINGS_INTERFACE_DIR "org.gnome.desktop.interface" #define SETTINGS_POWER_DIR "org.gnome.settings-daemon.plugins.power" #define SETTINGS_XSETTINGS_DIR "org.gnome.settings-daemon.plugins.xsettings" @@ -237,16 +219,12 @@ typedef struct gint inhibit_suspend_fd; gboolean inhibit_suspend_taken; - GList *media_players; - - GDBusNodeInfo *introspection_data; GDBusConnection *connection; GCancellable *bus_cancellable; guint start_idle_id; /* Multimedia keys */ - guint mmkeys_name_id; MprisController *mpris_controller; } GsdMediaKeysManagerPrivate; @@ -1726,239 +1704,24 @@ on_control_stream_removed (GvcMixerControl *control, #endif } -static void -free_media_player (MediaPlayer *player) -{ - if (player->watch_id > 0) { - g_bus_unwatch_name (player->watch_id); - player->watch_id = 0; - } - g_free (player->application); - g_free (player->dbus_name); - g_free (player); -} - -static gint -find_by_application (gconstpointer a, - gconstpointer b) -{ - return strcmp (((MediaPlayer *)a)->application, b); -} - -static gint -find_by_name (gconstpointer a, - gconstpointer b) -{ - return strcmp (((MediaPlayer *)a)->dbus_name, b); -} - -static gint -find_by_time (gconstpointer a, - gconstpointer b) -{ - return ((MediaPlayer *)a)->time < ((MediaPlayer *)b)->time; -} - -static void -name_vanished_handler (GDBusConnection *connection, - const gchar *name, - GsdMediaKeysManager *manager) -{ - GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager); - GList *iter; - - iter = g_list_find_custom (priv->media_players, - name, - find_by_name); - - if (iter != NULL) { - MediaPlayer *player; - - player = iter->data; - g_debug ("Deregistering vanished %s (dbus_name: %s)", player->application, player->dbus_name); - free_media_player (player); - priv->media_players = g_list_delete_link (priv->media_players, iter); - } -} - -/* - * Register a new media player. Most applications will want to call - * this with time = GDK_CURRENT_TIME. This way, the last registered - * player will receive media events. In some cases, applications - * may want to register with a lower priority (usually 1), to grab - * events only nobody else is interested in. - */ -static void -gsd_media_keys_manager_grab_media_player_keys (GsdMediaKeysManager *manager, - const char *application, - const char *dbus_name, - guint32 time) -{ - GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager); - GList *iter; - MediaPlayer *media_player; - guint watch_id; - - if (time == GDK_CURRENT_TIME) { - GTimeVal tv; - - g_get_current_time (&tv); - time = tv.tv_sec * 1000 + tv.tv_usec / 1000; - } - - iter = g_list_find_custom (priv->media_players, - application, - find_by_application); - - if (iter != NULL) { - if (((MediaPlayer *)iter->data)->time < time) { - MediaPlayer *player = iter->data; - free_media_player (player); - priv->media_players = g_list_delete_link (priv->media_players, iter); - } else { - return; - } - } - - watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION, - dbus_name, - G_BUS_NAME_WATCHER_FLAGS_NONE, - NULL, - (GBusNameVanishedCallback) name_vanished_handler, - manager, - NULL); - - g_debug ("Registering %s at %u", application, time); - media_player = g_new0 (MediaPlayer, 1); - media_player->application = g_strdup (application); - media_player->dbus_name = g_strdup (dbus_name); - media_player->time = time; - media_player->watch_id = watch_id; - - priv->media_players = g_list_insert_sorted (priv->media_players, - media_player, - find_by_time); -} - -static void -gsd_media_keys_manager_release_media_player_keys (GsdMediaKeysManager *manager, - const char *application, - const char *name) -{ - GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager); - GList *iter = NULL; - - g_return_if_fail (application != NULL || name != NULL); - - if (application != NULL) { - iter = g_list_find_custom (priv->media_players, - application, - find_by_application); - } - - if (iter == NULL && name != NULL) { - iter = g_list_find_custom (priv->media_players, - name, - find_by_name); - } - - if (iter != NULL) { - MediaPlayer *player; - - player = iter->data; - g_debug ("Deregistering %s (dbus_name: %s)", application, player->dbus_name); - free_media_player (player); - priv->media_players = g_list_delete_link (priv->media_players, iter); - } -} - static gboolean -gsd_media_player_key_pressed (GsdMediaKeysManager *manager, - const char *key) +do_multimedia_player_action (GsdMediaKeysManager *manager, + const char *key) { GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager); - const char *application; - gboolean have_listeners; - GError *error = NULL; - MediaPlayer *player; g_return_val_if_fail (key != NULL, FALSE); g_debug ("Media key '%s' pressed", key); - /* Prefer MPRIS players to those using the native API */ if (mpris_controller_get_has_active_player (priv->mpris_controller)) { if (mpris_controller_key (priv->mpris_controller, key)) return TRUE; } - have_listeners = (priv->media_players != NULL); - - if (!have_listeners) { - /* Popup a dialog with an (/) icon */ - show_osd (manager, "action-unavailable-symbolic", NULL, -1, NULL); - return TRUE; - } - - player = priv->media_players->data; - application = player->application; - - if (g_dbus_connection_emit_signal (priv->connection, - player->dbus_name, - GSD_MEDIA_KEYS_DBUS_PATH, - GSD_MEDIA_KEYS_DBUS_NAME, - "MediaPlayerKeyPressed", - g_variant_new ("(ss)", application ? application : "", key), - &error) == FALSE) { - g_debug ("Error emitting signal: %s", error->message); - g_error_free (error); - } - - return !have_listeners; -} - -static void -handle_method_call (GDBusConnection *connection, - const gchar *sender, - const gchar *object_path, - const gchar *interface_name, - const gchar *method_name, - GVariant *parameters, - GDBusMethodInvocation *invocation, - gpointer user_data) -{ - GsdMediaKeysManager *manager = (GsdMediaKeysManager *) user_data; - - g_debug ("Calling method '%s' for media-keys", method_name); - - if (g_strcmp0 (method_name, "ReleaseMediaPlayerKeys") == 0) { - const char *app_name; - - g_variant_get (parameters, "(&s)", &app_name); - gsd_media_keys_manager_release_media_player_keys (manager, app_name, sender); - g_dbus_method_invocation_return_value (invocation, NULL); - } else if (g_strcmp0 (method_name, "GrabMediaPlayerKeys") == 0) { - const char *app_name; - guint32 time; - - g_variant_get (parameters, "(&su)", &app_name, &time); - gsd_media_keys_manager_grab_media_player_keys (manager, app_name, sender, time); - g_dbus_method_invocation_return_value (invocation, NULL); - } -} - -static const GDBusInterfaceVTable interface_vtable = -{ - handle_method_call, - NULL, /* Get Property */ - NULL, /* Set Property */ -}; - -static gboolean -do_multimedia_player_action (GsdMediaKeysManager *manager, - const char *key) -{ - return gsd_media_player_key_pressed (manager, key); + /* Popup a dialog with an (/) icon */ + show_osd (manager, "action-unavailable-symbolic", NULL, -1, NULL); + return TRUE; } static void @@ -3377,11 +3140,6 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager) priv->start_idle_id = 0; } - if (priv->mmkeys_name_id > 0) { - g_bus_unown_name (priv->mmkeys_name_id); - priv->mmkeys_name_id = 0; - } - if (priv->bus_cancellable != NULL) { g_cancellable_cancel (priv->bus_cancellable); g_object_unref (priv->bus_cancellable); @@ -3433,8 +3191,6 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager) g_clear_object (&priv->screencast_proxy); g_clear_object (&priv->iio_sensor_proxy); g_clear_pointer (&priv->chassis_type, g_free); - - g_clear_pointer (&priv->introspection_data, g_dbus_node_info_unref); g_clear_object (&priv->connection); if (priv->keys_sync_data) { @@ -3486,12 +3242,6 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager) g_clear_object (&priv->sink); g_clear_object (&priv->source); g_clear_object (&priv->volume); - - if (priv->media_players != NULL) { - g_list_free_full (priv->media_players, (GDestroyNotify) free_media_player); - priv->media_players = NULL; - } - g_clear_object (&priv->shell_proxy); if (priv->audio_selection_watch_id) @@ -3856,19 +3606,6 @@ on_bus_gotten (GObject *source_object, } priv->connection = connection; - g_dbus_connection_register_object (connection, - GSD_MEDIA_KEYS_DBUS_PATH, - priv->introspection_data->interfaces[0], - &interface_vtable, - manager, - NULL, - NULL); - - priv->mmkeys_name_id = g_bus_own_name_on_connection (priv->connection, - "org.gnome.SettingsDaemon.MediaKeys", - G_BUS_NAME_OWNER_FLAGS_NONE, - NULL, NULL, NULL, NULL); - g_dbus_proxy_new (priv->connection, G_DBUS_PROXY_FLAGS_NONE, NULL, @@ -3909,10 +3646,7 @@ register_manager (GsdMediaKeysManager *manager) { GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager); - priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); priv->bus_cancellable = g_cancellable_new (); - g_assert (priv->introspection_data != NULL); - g_bus_get (G_BUS_TYPE_SESSION, priv->bus_cancellable, (GAsyncReadyCallback) on_bus_gotten, |