summaryrefslogtreecommitdiff
path: root/plugins/media-keys
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/media-keys')
-rw-r--r--plugins/media-keys/Makefile.am13
-rw-r--r--plugins/media-keys/acme.h1
-rw-r--r--plugins/media-keys/msd-media-keys-manager.c526
-rw-r--r--plugins/media-keys/msd-media-keys-manager.h1
-rw-r--r--plugins/media-keys/msd-media-keys-manager.xml13
-rw-r--r--plugins/media-keys/msd-media-keys-plugin.c1
-rw-r--r--plugins/media-keys/msd-media-keys-plugin.h1
-rw-r--r--plugins/media-keys/msd-media-keys-window.c31
-rw-r--r--plugins/media-keys/msd-media-keys-window.h3
-rw-r--r--plugins/media-keys/test-media-keys.c1
-rw-r--r--plugins/media-keys/test-media-window.c1
11 files changed, 343 insertions, 249 deletions
diff --git a/plugins/media-keys/Makefile.am b/plugins/media-keys/Makefile.am
index 3effdcb..7111525 100644
--- a/plugins/media-keys/Makefile.am
+++ b/plugins/media-keys/Makefile.am
@@ -6,22 +6,10 @@ NULL =
plugin_LTLIBRARIES = libmedia-keys.la
BUILT_SOURCES = \
- $(msd_media_keys_built_sources) \
msd-marshal.h \
msd-marshal.c \
$(NULL)
-msd_media_keys_built_sources = \
- msd-media-keys-generated.h \
- msd-media-keys-generated.c \
- $(NULL)
-
-$(msd_media_keys_built_sources) : $(srcdir)/msd-media-keys-manager.xml
- $(AM_V_GEN) $(GDBUS_CODEGEN) \
- --interface-prefix org.mate.SettingsDaemon. \
- --c-namespace MateSettings \
- --generate-c-code msd-media-keys-generated $<
-
msd-marshal.c: msd-marshal.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=msd_marshal $< --body --prototypes --internal > $@
@@ -143,7 +131,6 @@ gtkbuilder_DATA = \
$(NULL)
EXTRA_DIST = \
- msd-media-keys-manager.xml \
msd-marshal.list \
$(plugin_in_files) \
$(gtkbuilder_DATA)
diff --git a/plugins/media-keys/acme.h b/plugins/media-keys/acme.h
index 412ad59..0c25907 100644
--- a/plugins/media-keys/acme.h
+++ b/plugins/media-keys/acme.h
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2001 Bastien Nocera <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/plugins/media-keys/msd-media-keys-manager.c b/plugins/media-keys/msd-media-keys-manager.c
index f5b97c3..5ab8946 100644
--- a/plugins/media-keys/msd-media-keys-manager.c
+++ b/plugins/media-keys/msd-media-keys-manager.c
@@ -1,9 +1,9 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- * vim: set ts=8 sts=8 sw=8 expandtab:
*
* Copyright (C) 2001-2003 Bastien Nocera <[email protected]>
* Copyright (C) 2006-2007 William Jon McCann <[email protected]>
* Copyright (C) 2014 Michal Ratajsky <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -41,7 +41,6 @@
#include "mate-settings-profile.h"
#include "msd-marshal.h"
#include "msd-media-keys-manager.h"
-#include "msd-media-keys-generated.h"
#include "eggaccelerators.h"
#include "acme.h"
@@ -56,9 +55,28 @@
#define TOUCHPAD_SCHEMA "org.mate.peripherals-touchpad"
#define TOUCHPAD_ENABLED_KEY "touchpad-enabled"
+#define SOUND_SCHEMA "org.mate.sound"
+#define VOLUME_OVERAMPLIFIABLE_KEY "volume-overamplifiable"
+
+static const gchar introspection_xml[] =
+"<node name='/org/mate/SettingsDaemon/MediaKeys'>"
+" <interface name='org.mate.SettingsDaemon.MediaKeys'>"
+" <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'/>"
+" </interface>"
+"</node>";
+
typedef struct {
char *application;
+ char *dbus_name;
guint32 time;
+ guint watch_id;
} MediaPlayer;
struct _MsdMediaKeysManagerPrivate
@@ -73,6 +91,7 @@ struct _MsdMediaKeysManagerPrivate
#endif
GtkWidget *dialog;
GSettings *settings;
+ GSettings *sound_settings;
GVolumeMonitor *volume_monitor;
/* Multihead stuff */
@@ -86,31 +105,20 @@ struct _MsdMediaKeysManagerPrivate
GList *media_players;
+ GDBusNodeInfo *introspection_data;
GDBusConnection *connection;
- guint bus_name_id;
- MateSettingsMediaKeys *skeleton;
+ GCancellable *bus_cancellable;
- guint notify[HANDLED_KEYS];
-};
+ guint start_idle_id;
-enum {
- MEDIA_PLAYER_KEY_PRESSED,
- LAST_SIGNAL
+ guint owner_id;
+ guint notify[HANDLED_KEYS];
};
-static guint signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE_WITH_PRIVATE (MsdMediaKeysManager, msd_media_keys_manager, G_TYPE_OBJECT)
static gpointer manager_object = NULL;
-static gboolean on_grab_media_player_keys (MateSettingsMediaKeys *object,
- GDBusMethodInvocation *invocation,
- const gchar *application,
- guint time,
- gpointer user_data);
-static gboolean on_release_media_player_keys (MateSettingsMediaKeys *object,
- GDBusMethodInvocation *invocation,
- const gchar *application,
- gpointer user_data);
+static void register_manager (MsdMediaKeysManager *manager);
static void
init_screens (MsdMediaKeysManager *manager)
@@ -139,7 +147,7 @@ acme_error (char * msg)
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
- msg, NULL);
+ "%s", msg);
gtk_dialog_set_default_response (GTK_DIALOG (error_dialog),
GTK_RESPONSE_OK);
gtk_widget_show (error_dialog);
@@ -329,8 +337,7 @@ update_kbd_cb (GSettings *settings,
g_warning ("Grab failed for some keys, another application may already have access the them.");
}
-static void
-init_kbd (MsdMediaKeysManager* manager)
+static void init_kbd(MsdMediaKeysManager* manager)
{
int i;
GdkDisplay *dpy;
@@ -486,26 +493,31 @@ dialog_show (MsdMediaKeysManager *manager)
}
static void
+launch_default_for_uri_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GError *error = NULL;
+ gchar *uri = user_data;
+
+ if (!g_app_info_launch_default_for_uri_finish (res, &error))
+ {
+ g_warning ("Could not launch '%s': %s", uri,
+ error->message);
+ g_clear_error (&error);
+ }
+ g_free (uri);
+}
+
+static void
do_url_action (MsdMediaKeysManager *manager,
const gchar *scheme)
{
- GError *error = NULL;
- GAppInfo *app_info;
-
- app_info = g_app_info_get_default_for_uri_scheme (scheme);
-
- if (app_info != NULL) {
- if (!g_app_info_launch (app_info, NULL, NULL, &error)) {
- g_warning ("Could not launch '%s': %s",
- g_app_info_get_commandline (app_info),
- error->message);
- g_object_unref (app_info);
- g_error_free (error);
- }
- }
- else {
- g_warning ("Could not find default application for '%s' scheme", scheme);
- }
+ g_app_info_launch_default_for_uri_async (scheme,
+ NULL,
+ NULL,
+ launch_default_for_uri_cb,
+ g_strdup (scheme));
}
static void
@@ -610,7 +622,6 @@ do_eject_action (MsdMediaKeysManager *manager)
continue;
if (score < SCORE_HAS_MEDIA) {
fav_drive = drive;
- score = SCORE_HAS_MEDIA;
break;
}
}
@@ -627,7 +638,7 @@ do_eject_action (MsdMediaKeysManager *manager)
if (fav_drive != NULL)
fav_drive = g_object_ref (fav_drive);
- g_list_foreach (drives, (GFunc) g_object_unref, NULL);
+ g_list_free_full (drives, g_object_unref);
if (fav_drive == NULL)
return;
@@ -676,7 +687,7 @@ update_dialog (MsdMediaKeysManager *manager,
gboolean is_mic)
{
if (muted)
- volume = 0.0;
+ volume = 0;
dialog_init (manager);
@@ -716,7 +727,8 @@ do_sound_action (MsdMediaKeysManager *manager,
gboolean sound_changed = FALSE;
guint volume;
guint volume_min, volume_max;
- guint volume_step;
+ gint volume_step;
+ guint volume_step_scaled;
guint volume_last;
MateMixerStreamControl *control;
@@ -732,17 +744,21 @@ do_sound_action (MsdMediaKeysManager *manager,
/* Theoretically the volume limits might be different for different
* streams, also the minimum might not always start at 0 */
volume_min = mate_mixer_stream_control_get_min_volume (control);
- volume_max = mate_mixer_stream_control_get_normal_volume (control);
+ if (g_settings_get_boolean (manager->priv->sound_settings, VOLUME_OVERAMPLIFIABLE_KEY))
+ volume_max = mate_mixer_stream_control_get_max_volume (control);
+ else
+ volume_max = mate_mixer_stream_control_get_normal_volume (control);
volume_step = g_settings_get_int (manager->priv->settings, "volume-step");
if (volume_step <= 0 || volume_step > 100) {
GVariant *variant = g_settings_get_default_value (manager->priv->settings, "volume-step");
- volume_step = g_variant_get_int32 (variant);
+ gint32 volume_step_default = g_variant_get_int32 (variant);
+ volume_step = (gint) volume_step_default;
g_variant_unref (variant);
}
/* Scale the volume step size accordingly to the range used by the control */
- volume_step = (volume_max - volume_min) * volume_step / 100;
+ volume_step_scaled = (volume_max - volume_min) * (guint) volume_step / 100;
volume = volume_last =
mate_mixer_stream_control_get_volume (control);
@@ -755,11 +771,11 @@ do_sound_action (MsdMediaKeysManager *manager,
muted = !muted;
break;
case VOLUME_DOWN_KEY:
- if (volume <= (volume_min + volume_step)) {
+ if (volume <= (volume_min + volume_step_scaled)) {
volume = volume_min;
muted = TRUE;
} else {
- volume -= volume_step;
+ volume -= volume_step_scaled;
muted = FALSE;
}
break;
@@ -767,9 +783,9 @@ do_sound_action (MsdMediaKeysManager *manager,
if (muted) {
muted = FALSE;
if (volume <= volume_min)
- volume = volume_min + volume_step;
+ volume = volume_min + volume_step_scaled;
} else
- volume = CLAMP (volume + volume_step,
+ volume = CLAMP (volume + volume_step_scaled,
volume_min,
volume_max);
break;
@@ -1048,6 +1064,18 @@ do_display_osd_action (MsdMediaKeysManager *manager)
dialog_show (manager);
}
+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)
@@ -1056,16 +1084,131 @@ find_by_application (gconstpointer a,
}
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,
+ MsdMediaKeysManager *manager)
+{
+ GList *iter;
+
+ iter = g_list_find_custom (manager->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);
+ manager->priv->media_players = g_list_delete_link (manager->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 is interested.
+ */
+static void
+msd_media_keys_manager_grab_media_player_keys (MsdMediaKeysManager *manager,
+ const char *application,
+ const char *dbus_name,
+ guint32 time)
+{
+ GList *iter;
+ MediaPlayer *media_player;
+ guint watch_id;
+
+ if (time == GDK_CURRENT_TIME) {
+ time = (guint32)(g_get_monotonic_time () / 1000);
+ }
+
+ iter = g_list_find_custom (manager->priv->media_players,
+ application,
+ find_by_application);
+
+ if (iter != NULL) {
+ if (((MediaPlayer *)iter->data)->time < time) {
+ MediaPlayer *player = iter->data;
+ free_media_player (player);
+ manager->priv->media_players = g_list_delete_link (manager->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;
+
+ manager->priv->media_players = g_list_insert_sorted (manager->priv->media_players,
+ media_player,
+ find_by_time);
+}
+
+static void
+msd_media_keys_manager_release_media_player_keys (MsdMediaKeysManager *manager,
+ const char *application,
+ const char *name)
+{
+ GList *iter = NULL;
+
+ g_return_if_fail (application != NULL || name != NULL);
+
+ if (application != NULL) {
+ iter = g_list_find_custom (manager->priv->media_players,
+ application,
+ find_by_application);
+ }
+
+ if (iter == NULL && name != NULL) {
+ iter = g_list_find_custom (manager->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);
+ manager->priv->media_players = g_list_delete_link (manager->priv->media_players, iter);
+ }
+}
+
static gboolean
msd_media_player_key_pressed (MsdMediaKeysManager *manager,
const char *key)
{
+ GError *error = NULL;
const char *application = NULL;
gboolean have_listeners;
@@ -1075,11 +1218,55 @@ msd_media_player_key_pressed (MsdMediaKeysManager *manager,
application = ((MediaPlayer *)manager->priv->media_players->data)->application;
}
- g_signal_emit (manager, signals[MEDIA_PLAYER_KEY_PRESSED], 0, application, key);
+ if (g_dbus_connection_emit_signal (manager->priv->connection,
+ NULL,
+ MSD_MEDIA_KEYS_DBUS_PATH,
+ MSD_MEDIA_KEYS_DBUS_NAME,
+ "MediaPlayerKeyPressed",
+ g_variant_new ("(ss)", 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)
+{
+ MsdMediaKeysManager *manager = (MsdMediaKeysManager *) 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);
+ msd_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);
+ msd_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 =
+{
+ .method_call = handle_method_call,
+};
+
static gboolean
do_multimedia_player_action (MsdMediaKeysManager *manager,
const char *key)
@@ -1343,7 +1530,7 @@ rfkill_appeared_cb (GDBusConnection *connection,
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
0, NULL,
- "org.mate.SettingsDaemon.Rfkill",
+ "org.mate.SettingsDaemon",
"/org/mate/SettingsDaemon/Rfkill",
"org.mate.SettingsDaemon.Rfkill",
manager->priv->rfkill_cancellable,
@@ -1365,6 +1552,7 @@ start_media_keys_idle_cb (MsdMediaKeysManager *manager)
manager->priv->volume_monitor = g_volume_monitor_get ();
manager->priv->settings = g_settings_new (BINDING_SCHEMA);
+ manager->priv->sound_settings = g_settings_new (SOUND_SCHEMA);
ensure_cancellable (&manager->priv->rfkill_cancellable);
@@ -1407,6 +1595,8 @@ start_media_keys_idle_cb (MsdMediaKeysManager *manager)
mate_settings_profile_end (NULL);
+ manager->priv->start_idle_id = 0;
+
return FALSE;
}
@@ -1443,7 +1633,8 @@ msd_media_keys_manager_start (MsdMediaKeysManager *manager, GError **error)
mate_settings_profile_end ("mate_mixer_context_new");
}
#endif
- g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager);
+ manager->priv->start_idle_id = g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager);
+ g_source_set_name_by_id (manager->priv->start_idle_id, "[mate-settings-daemon] start_media_keys_idle_cb");
mate_settings_profile_end (NULL);
@@ -1478,16 +1669,39 @@ msd_media_keys_manager_stop (MsdMediaKeysManager *manager)
priv->settings = NULL;
}
+ if (priv->sound_settings != NULL) {
+ g_object_unref (priv->sound_settings);
+ priv->sound_settings = NULL;
+ }
+
if (priv->volume_monitor != NULL) {
g_object_unref (priv->volume_monitor);
priv->volume_monitor = NULL;
}
+ if (priv->start_idle_id != 0) {
+ g_source_remove (priv->start_idle_id);
+ priv->start_idle_id = 0;
+ }
+
+ if (priv->owner_id > 0) {
+ g_bus_unown_name (priv->owner_id);
+ priv->owner_id = 0;
+ }
+
if (priv->connection != NULL) {
g_object_unref (priv->connection);
priv->connection = NULL;
}
+ if (priv->bus_cancellable != NULL) {
+ g_cancellable_cancel (priv->bus_cancellable);
+ g_object_unref (priv->bus_cancellable);
+ priv->bus_cancellable = NULL;
+ }
+
+ g_clear_pointer (&priv->introspection_data, g_dbus_node_info_unref);
+
need_flush = FALSE;
dpy = gdk_display_get_default ();
gdk_x11_display_error_trap_push (dpy);
@@ -1538,187 +1752,82 @@ msd_media_keys_manager_stop (MsdMediaKeysManager *manager)
priv->media_players = NULL;
}
-/*
- * 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 is interested.
- */
-static gboolean
-on_grab_media_player_keys (MateSettingsMediaKeys *object,
- GDBusMethodInvocation *invocation,
- const gchar *application,
- guint time,
- gpointer user_data)
+static void
+msd_media_keys_manager_finalize (GObject *object)
{
- GList *iter;
- MediaPlayer *media_player;
MsdMediaKeysManager *manager;
- if (time == GDK_CURRENT_TIME) {
- GTimeVal tv;
-
- g_get_current_time (&tv);
- time = tv.tv_sec * 1000 + tv.tv_usec / 1000;
- }
-
- manager = MSD_MEDIA_KEYS_MANAGER (user_data);
- iter = g_list_find_custom (manager->priv->media_players,
- application,
- find_by_application);
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (MSD_IS_MEDIA_KEYS_MANAGER (object));
- if (iter != NULL) {
- if (((MediaPlayer *)iter->data)->time < time) {
- g_free (((MediaPlayer *)iter->data)->application);
- g_free (iter->data);
- manager->priv->media_players = g_list_delete_link (manager->priv->media_players, iter);
- } else {
- mate_settings_media_keys_complete_grab_media_player_keys (object, invocation);
- return TRUE;
- }
- }
+ manager = MSD_MEDIA_KEYS_MANAGER (object);
- g_debug ("Registering %s at %u", application, time);
- media_player = g_new0 (MediaPlayer, 1);
- media_player->application = g_strdup (application);
- media_player->time = time;
+ g_return_if_fail (manager->priv != NULL);
- manager->priv->media_players = g_list_insert_sorted (manager->priv->media_players,
- media_player,
- find_by_time);
+ msd_media_keys_manager_stop (manager);
- mate_settings_media_keys_complete_grab_media_player_keys (object, invocation);
- return TRUE;
+ G_OBJECT_CLASS (msd_media_keys_manager_parent_class)->finalize (object);
}
-static gboolean
-on_release_media_player_keys (MateSettingsMediaKeys *object,
- GDBusMethodInvocation *invocation,
- const gchar *application,
- gpointer user_data)
-{
- GList *iter;
- MsdMediaKeysManager *manager;
- manager = MSD_MEDIA_KEYS_MANAGER (user_data);
- iter = g_list_find_custom (manager->priv->media_players,
- application,
- find_by_application);
-
- if (iter != NULL) {
- g_debug ("Deregistering %s", application);
- g_free (((MediaPlayer *)iter->data)->application);
- g_free (iter->data);
- manager->priv->media_players = g_list_delete_link (manager->priv->media_players, iter);
- }
+static void
+msd_media_keys_manager_class_init (MsdMediaKeysManagerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
- mate_settings_media_keys_complete_release_media_player_keys (object, invocation);
- return TRUE;
+ object_class->finalize = msd_media_keys_manager_finalize;
}
static void
-bus_acquired_handler_cb (GDBusConnection *connection,
- const gchar *name G_GNUC_UNUSED,
- gpointer user_data)
+msd_media_keys_manager_init (MsdMediaKeysManager *manager)
{
- MsdMediaKeysManager *manager;
- GError *error = NULL;
- gboolean exported;
-
- manager = MSD_MEDIA_KEYS_MANAGER (user_data);
-
- g_signal_connect (manager->priv->skeleton,
- "handle-grab-media-player-keys",
- G_CALLBACK (on_grab_media_player_keys),
- manager);
- g_signal_connect (manager->priv->skeleton,
- "handle-release-media-player-keys",
- G_CALLBACK (on_release_media_player_keys),
- manager);
-
- exported = g_dbus_interface_skeleton_export (
- G_DBUS_INTERFACE_SKELETON (manager->priv->skeleton),
- connection,
- MSD_MEDIA_KEYS_DBUS_PATH,
- &error);
- if (!exported)
- {
- g_warning ("Failed to export interface: %s", error->message);
- g_error_free (error);
- gtk_main_quit ();
- }
- manager->priv->connection = g_object_ref(connection);
+ manager->priv = msd_media_keys_manager_get_instance_private (manager);
}
-static void msd_media_keys_manager_constructed (GObject *object)
-{
- MsdMediaKeysManager *manager;
- manager = MSD_MEDIA_KEYS_MANAGER (object);
- G_OBJECT_CLASS (msd_media_keys_manager_parent_class)->constructed (object);
-
- manager->priv->bus_name_id = g_bus_own_name (G_BUS_TYPE_SESSION,
- MSD_MEDIA_KEYS_DBUS_NAME,
- G_BUS_NAME_OWNER_FLAGS_NONE,
- bus_acquired_handler_cb,
- NULL,
- NULL,
- manager,
- NULL);
-}
-
-static void msd_media_keys_manager_dispose (GObject *object)
+static void
+on_bus_gotten (GObject *source_object,
+ GAsyncResult *res,
+ MsdMediaKeysManager *manager)
{
- MsdMediaKeysManager *manager;
- manager = MSD_MEDIA_KEYS_MANAGER (object);
-
- if (manager->priv->skeleton != NULL)
- {
- GDBusInterfaceSkeleton *skeleton;
-
- skeleton = G_DBUS_INTERFACE_SKELETON (manager->priv->skeleton);
- g_dbus_interface_skeleton_unexport (skeleton);
- g_clear_object (&manager->priv->skeleton);
- }
+ GDBusConnection *connection;
+ GError *error = NULL;
- if (manager->priv->bus_name_id > 0)
- {
- g_bus_unown_name (manager->priv->bus_name_id);
- manager->priv->bus_name_id = 0;
+ connection = g_bus_get_finish (res, &error);
+ if (connection == NULL) {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Could not get session bus: %s", error->message);
+ g_error_free (error);
+ return;
}
-
- G_OBJECT_CLASS (msd_media_keys_manager_parent_class)->dispose (object);
+ manager->priv->connection = connection;
+
+ g_dbus_connection_register_object (connection,
+ MSD_MEDIA_KEYS_DBUS_PATH,
+ manager->priv->introspection_data->interfaces[0],
+ &interface_vtable,
+ manager,
+ NULL,
+ NULL);
+
+ manager->priv->owner_id = g_bus_own_name_on_connection (manager->priv->connection,
+ "org.mate.SettingsDaemon",
+ G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT,
+ NULL, NULL, NULL, NULL);
}
-
static void
-msd_media_keys_manager_class_init (MsdMediaKeysManagerClass *klass)
+register_manager (MsdMediaKeysManager *manager)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->constructed = msd_media_keys_manager_constructed;
- object_class->dispose = msd_media_keys_manager_dispose;
-
- signals[MEDIA_PLAYER_KEY_PRESSED] =
- g_signal_new ("media-player-key-pressed",
- G_OBJECT_CLASS_TYPE (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (MsdMediaKeysManagerClass, media_player_key_pressed),
- NULL,
- NULL,
- msd_marshal_VOID__STRING_STRING,
- G_TYPE_NONE,
- 2,
- G_TYPE_STRING,
- G_TYPE_STRING);
-}
+ manager->priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
+ manager->priv->bus_cancellable = g_cancellable_new ();
+ g_assert (manager->priv->introspection_data != NULL);
-static void
-msd_media_keys_manager_init (MsdMediaKeysManager *manager)
-{
- manager->priv = msd_media_keys_manager_get_instance_private (manager);
- manager->priv->skeleton = mate_settings_media_keys_skeleton_new ();
+ g_bus_get (G_BUS_TYPE_SESSION,
+ manager->priv->bus_cancellable,
+ (GAsyncReadyCallback) on_bus_gotten,
+ manager);
}
MsdMediaKeysManager *
@@ -1728,6 +1837,9 @@ msd_media_keys_manager_new (void)
g_object_ref (manager_object);
} else {
manager_object = g_object_new (MSD_TYPE_MEDIA_KEYS_MANAGER, NULL);
+ g_object_add_weak_pointer (manager_object,
+ (gpointer *) &manager_object);
+ register_manager (manager_object);
}
return MSD_MEDIA_KEYS_MANAGER (manager_object);
diff --git a/plugins/media-keys/msd-media-keys-manager.h b/plugins/media-keys/msd-media-keys-manager.h
index 01d8f1e..add29d2 100644
--- a/plugins/media-keys/msd-media-keys-manager.h
+++ b/plugins/media-keys/msd-media-keys-manager.h
@@ -2,6 +2,7 @@
*
* Copyright (C) 2007 William Jon McCann <[email protected]>
* Copyright (C) 2014 Michal Ratajsky <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/plugins/media-keys/msd-media-keys-manager.xml b/plugins/media-keys/msd-media-keys-manager.xml
deleted file mode 100644
index 51d8d7a..0000000
--- a/plugins/media-keys/msd-media-keys-manager.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node>
- <interface name="org.mate.SettingsDaemon.MediaKeys">
- <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"/>
- </interface>
-</node>
diff --git a/plugins/media-keys/msd-media-keys-plugin.c b/plugins/media-keys/msd-media-keys-plugin.c
index d1124c6..c3a2d98 100644
--- a/plugins/media-keys/msd-media-keys-plugin.c
+++ b/plugins/media-keys/msd-media-keys-plugin.c
@@ -2,6 +2,7 @@
*
* Copyright (C) 2007 William Jon McCann <[email protected]>
* Copyright (C) 2014 Michal Ratajsky <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/plugins/media-keys/msd-media-keys-plugin.h b/plugins/media-keys/msd-media-keys-plugin.h
index 0662009..be459b0 100644
--- a/plugins/media-keys/msd-media-keys-plugin.h
+++ b/plugins/media-keys/msd-media-keys-plugin.h
@@ -2,6 +2,7 @@
*
* Copyright (C) 2007 William Jon McCann <[email protected]>
* Copyright (C) 2014 Michal Ratajsky <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/plugins/media-keys/msd-media-keys-window.c b/plugins/media-keys/msd-media-keys-window.c
index 9c36641..c632b92 100644
--- a/plugins/media-keys/msd-media-keys-window.c
+++ b/plugins/media-keys/msd-media-keys-window.c
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2006-2007 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
*
* This program is free software; you can redistribute it and/or
@@ -43,7 +44,7 @@ struct MsdMediaKeysWindowPrivate
guint volume_muted : 1;
guint mic_muted : 1;
guint is_mic :1;
- int volume_level;
+ guint volume_level;
GtkImage *image;
GtkWidget *progress;
@@ -223,7 +224,7 @@ msd_media_keys_window_set_volume_muted (MsdMediaKeysWindow *window,
g_return_if_fail (MSD_IS_MEDIA_KEYS_WINDOW (window));
if (window->priv->volume_muted != muted) {
- window->priv->volume_muted = muted;
+ window->priv->volume_muted = muted != FALSE;
volume_muted_changed (window);
}
window->priv->is_mic = FALSE;
@@ -236,7 +237,7 @@ msd_media_keys_window_set_mic_muted (MsdMediaKeysWindow *window,
g_return_if_fail (MSD_IS_MEDIA_KEYS_WINDOW (window));
if (window->priv->mic_muted != muted) {
- window->priv->mic_muted = muted;
+ window->priv->mic_muted = muted != FALSE;
mic_muted_changed (window);
}
window->priv->is_mic = TRUE;
@@ -244,7 +245,7 @@ msd_media_keys_window_set_mic_muted (MsdMediaKeysWindow *window,
void
msd_media_keys_window_set_volume_level (MsdMediaKeysWindow *window,
- int level)
+ guint level)
{
g_return_if_fail (MSD_IS_MEDIA_KEYS_WINDOW (window));
@@ -284,26 +285,26 @@ draw_eject (cairo_t *cr,
double width,
double height)
{
- int box_height;
- int tri_height;
- int separation;
+ double box_height;
+ double tri_height;
+ double separation;
box_height = height * 0.2;
- separation = box_height / 3;
+ separation = box_height / 3.0;
tri_height = height - box_height - separation;
cairo_rectangle (cr, _x0, _y0 + height - box_height, width, box_height);
cairo_move_to (cr, _x0, _y0 + tri_height);
- cairo_rel_line_to (cr, width, 0);
- cairo_rel_line_to (cr, -width / 2, -tri_height);
- cairo_rel_line_to (cr, -width / 2, tri_height);
+ cairo_rel_line_to (cr, width, 0.0);
+ cairo_rel_line_to (cr, -width * 0.5, -tri_height);
+ cairo_rel_line_to (cr, -width * 0.5, tri_height);
cairo_close_path (cr);
cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, MSD_OSD_WINDOW_FG_ALPHA);
cairo_fill_preserve (cr);
- cairo_set_source_rgba (cr, 0.6, 0.6, 0.6, MSD_OSD_WINDOW_FG_ALPHA / 2);
- cairo_set_line_width (cr, 2);
+ cairo_set_source_rgba (cr, 0.6, 0.6, 0.6, MSD_OSD_WINDOW_FG_ALPHA * 0.5);
+ cairo_set_line_width (cr, 2.0);
cairo_stroke (cr);
}
@@ -418,7 +419,7 @@ render_speaker (MsdMediaKeysWindow *window,
{
GdkPixbuf *pixbuf;
int icon_size;
- int n;
+ guint n;
static const char *icon_names[] = {
"audio-volume-muted",
"audio-volume-low",
@@ -605,7 +606,7 @@ draw_action_volume (MsdMediaKeysWindow *window,
wave_y0 = speaker_cy;
wave_radius = icon_box_width / 2;
- draw_waves (cr, wave_x0, wave_y0, wave_radius, window->priv->volume_level);
+ draw_waves (cr, wave_x0, wave_y0, wave_radius, (int) window->priv->volume_level);
} else {
/* draw 'mute' cross */
double cross_x0;
diff --git a/plugins/media-keys/msd-media-keys-window.h b/plugins/media-keys/msd-media-keys-window.h
index 88c3748..92c511e 100644
--- a/plugins/media-keys/msd-media-keys-window.h
+++ b/plugins/media-keys/msd-media-keys-window.h
@@ -1,6 +1,7 @@
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*-
*
* Copyright (C) 2006 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -70,7 +71,7 @@ void msd_media_keys_window_set_mic_muted (MsdMediaKeysWindo
void msd_media_keys_window_set_volume_muted (MsdMediaKeysWindow *window,
gboolean muted);
void msd_media_keys_window_set_volume_level (MsdMediaKeysWindow *window,
- int level);
+ guint level);
gboolean msd_media_keys_window_is_valid (MsdMediaKeysWindow *window);
#ifdef __cplusplus
diff --git a/plugins/media-keys/test-media-keys.c b/plugins/media-keys/test-media-keys.c
index 51ea1e3..e9f2ed7 100644
--- a/plugins/media-keys/test-media-keys.c
+++ b/plugins/media-keys/test-media-keys.c
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2007 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
diff --git a/plugins/media-keys/test-media-window.c b/plugins/media-keys/test-media-window.c
index 583ecbf..f6f5c35 100644
--- a/plugins/media-keys/test-media-window.c
+++ b/plugins/media-keys/test-media-window.c
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2007 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as