summaryrefslogtreecommitdiff
path: root/mate-volume-control/src/gvc-applet.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-volume-control/src/gvc-applet.c')
-rw-r--r--mate-volume-control/src/gvc-applet.c357
1 files changed, 0 insertions, 357 deletions
diff --git a/mate-volume-control/src/gvc-applet.c b/mate-volume-control/src/gvc-applet.c
deleted file mode 100644
index 3cb691f..0000000
--- a/mate-volume-control/src/gvc-applet.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2008 Red Hat, Inc.
- * Copyright (C) 2014 Michal Ratajsky <[email protected]>
- *
- * 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include <libmatemixer/matemixer.h>
-
-#include "gvc-applet.h"
-#include "gvc-stream-status-icon.h"
-
-#define GVC_APPLET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_APPLET, GvcAppletPrivate))
-
-static const gchar *icon_names_output[] = {
- "audio-volume-muted",
- "audio-volume-low",
- "audio-volume-medium",
- "audio-volume-high",
- NULL
-};
-
-static const gchar *icon_names_input[] = {
- "audio-input-microphone-muted",
- "audio-input-microphone-low",
- "audio-input-microphone-medium",
- "audio-input-microphone-high",
- NULL
-};
-
-struct _GvcAppletPrivate
-{
- GvcStreamStatusIcon *icon_input;
- GvcStreamStatusIcon *icon_output;
- gboolean running;
- MateMixerContext *context;
- MateMixerStream *input;
-};
-
-static void gvc_applet_class_init (GvcAppletClass *klass);
-static void gvc_applet_init (GvcApplet *applet);
-
-G_DEFINE_TYPE (GvcApplet, gvc_applet, G_TYPE_OBJECT)
-
-static void
-update_icon_input (GvcApplet *applet)
-{
- MateMixerStreamControl *control = NULL;
- gboolean show = FALSE;
-
- /* Enable the input icon in case there is an input stream present and there
- * is a non-mixer application using the input */
- if (applet->priv->input != NULL) {
- const gchar *app_id;
- const GList *inputs =
- mate_mixer_stream_list_controls (applet->priv->input);
-
- control = mate_mixer_stream_get_default_control (applet->priv->input);
-
- while (inputs != NULL) {
- MateMixerStreamControl *input =
- MATE_MIXER_STREAM_CONTROL (inputs->data);
- MateMixerStreamControlRole role =
- mate_mixer_stream_control_get_role (input);
-
- if (role == MATE_MIXER_STREAM_CONTROL_ROLE_APPLICATION) {
- MateMixerAppInfo *app_info =
- mate_mixer_stream_control_get_app_info (input);
-
- app_id = mate_mixer_app_info_get_id (app_info);
- if (app_id == NULL) {
- /* A recording application which has no
- * identifier set */
- g_debug ("Found a recording application control %s",
- mate_mixer_stream_control_get_label (input));
-
- if G_UNLIKELY (control == NULL) {
- /* In the unlikely case when there is no
- * default input control, use the application
- * control for the icon */
- control = input;
- }
- show = TRUE;
- break;
- }
-
- if (strcmp (app_id, "org.mate.VolumeControl") != 0 &&
- strcmp (app_id, "org.gnome.VolumeControl") != 0 &&
- strcmp (app_id, "org.PulseAudio.pavucontrol") != 0) {
- g_debug ("Found a recording application %s", app_id);
-
- if G_UNLIKELY (control == NULL)
- control = input;
-
- show = TRUE;
- break;
- }
- }
- inputs = inputs->next;
- }
-
- if (show == TRUE)
- g_debug ("Input icon enabled");
- else
- g_debug ("There is no recording application, input icon disabled");
- }
-
- gvc_stream_status_icon_set_control (applet->priv->icon_input, control);
-
- gtk_status_icon_set_visible (GTK_STATUS_ICON (applet->priv->icon_input), show);
-}
-
-static void
-update_icon_output (GvcApplet *applet)
-{
- MateMixerStream *stream;
- MateMixerStreamControl *control = NULL;
-
- stream = mate_mixer_context_get_default_output_stream (applet->priv->context);
- if (stream != NULL)
- control = mate_mixer_stream_get_default_control (stream);
-
- gvc_stream_status_icon_set_control (applet->priv->icon_output, control);
-
- if (control != NULL) {
- g_debug ("Output icon enabled");
- gtk_status_icon_set_visible (GTK_STATUS_ICON (applet->priv->icon_output),
- TRUE);
- }
- else {
- g_debug ("There is no output stream/control, output icon disabled");
- gtk_status_icon_set_visible (GTK_STATUS_ICON (applet->priv->icon_output),
- FALSE);
- }
-}
-
-static void
-on_input_stream_control_added (MateMixerStream *stream,
- const gchar *name,
- GvcApplet *applet)
-{
- MateMixerStreamControl *control;
-
- control = mate_mixer_stream_get_control (stream, name);
- if G_LIKELY (control != NULL) {
- MateMixerStreamControlRole role =
- mate_mixer_stream_control_get_role (control);
-
- /* Non-application input control doesn't affect the icon */
- if (role != MATE_MIXER_STREAM_CONTROL_ROLE_APPLICATION)
- return;
- }
-
- /* Either an application control has been added or we couldn't
- * read the control, this shouldn't happen but let's revalidate the
- * icon to be sure if it does */
- update_icon_input (applet);
-}
-
-static void
-on_input_stream_control_removed (MateMixerStream *stream,
- const gchar *name,
- GvcApplet *applet)
-{
- /* The removed stream could be an application input, which may cause
- * the input status icon to disappear */
- update_icon_input (applet);
-}
-
-static gboolean
-update_default_input_stream (GvcApplet *applet)
-{
- MateMixerStream *stream;
-
- stream = mate_mixer_context_get_default_input_stream (applet->priv->context);
- if (stream == applet->priv->input)
- return FALSE;
-
- /* The input stream has changed */
- if (applet->priv->input != NULL) {
- g_signal_handlers_disconnect_by_data (G_OBJECT (applet->priv->input),
- applet);
- g_object_unref (applet->priv->input);
- }
-
- applet->priv->input = g_object_ref (stream);
- if (applet->priv->input != NULL) {
- g_signal_connect (G_OBJECT (applet->priv->input),
- "control-added",
- G_CALLBACK (on_input_stream_control_added),
- applet);
- g_signal_connect (G_OBJECT (applet->priv->input),
- "control-removed",
- G_CALLBACK (on_input_stream_control_removed),
- applet);
- }
-
- /* Return TRUE if the default input stream has changed */
- return TRUE;
-}
-
-static void
-on_context_state_notify (MateMixerContext *context,
- GParamSpec *pspec,
- GvcApplet *applet)
-{
- MateMixerState state = mate_mixer_context_get_state (context);
-
- switch (state) {
- case MATE_MIXER_STATE_FAILED:
- g_warning ("Failed to connect to a sound system");
- break;
-
- case MATE_MIXER_STATE_READY:
- update_default_input_stream (applet);
-
- /* Each status change may affect the visibility of the icons */
- update_icon_output (applet);
- update_icon_input (applet);
- break;
- default:
- break;
- }
-}
-
-static void
-on_context_default_input_stream_notify (MateMixerContext *context,
- GParamSpec *pspec,
- GvcApplet *applet)
-{
- if (update_default_input_stream (applet) == FALSE)
- return;
-
- update_icon_input (applet);
-}
-
-static void
-on_context_default_output_stream_notify (MateMixerContext *control,
- GParamSpec *pspec,
- GvcApplet *applet)
-{
- update_icon_output (applet);
-}
-
-void
-gvc_applet_start (GvcApplet *applet)
-{
- g_return_if_fail (GVC_IS_APPLET (applet));
-
- if G_UNLIKELY (applet->priv->running == TRUE)
- return;
-
- if G_UNLIKELY (mate_mixer_context_open (applet->priv->context) == FALSE) {
- /* Normally this should never happen, in the worst case we
- * should end up with the Null module */
- g_warning ("Failed to connect to a sound system");
- }
-
- g_debug ("Applet has been started");
-
- applet->priv->running = TRUE;
-}
-
-static void
-gvc_applet_dispose (GObject *object)
-{
- GvcApplet *applet = GVC_APPLET (object);
-
- if (applet->priv->input != NULL) {
- g_signal_handlers_disconnect_by_data (G_OBJECT (applet->priv->input),
- applet);
- g_clear_object (&applet->priv->input);
- }
-
- g_clear_object (&applet->priv->context);
- g_clear_object (&applet->priv->icon_input);
- g_clear_object (&applet->priv->icon_output);
-
- G_OBJECT_CLASS (gvc_applet_parent_class)->dispose (object);
-}
-
-static void
-gvc_applet_class_init (GvcAppletClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = gvc_applet_dispose;
-
- g_type_class_add_private (klass, sizeof (GvcAppletPrivate));
-}
-
-static void
-gvc_applet_init (GvcApplet *applet)
-{
- applet->priv = GVC_APPLET_GET_PRIVATE (applet);
-
- applet->priv->icon_input = gvc_stream_status_icon_new (NULL, icon_names_input);
- applet->priv->icon_output = gvc_stream_status_icon_new (NULL, icon_names_output);
-
- gvc_stream_status_icon_set_display_name (applet->priv->icon_input, _("Input"));
- gvc_stream_status_icon_set_display_name (applet->priv->icon_output, _("Output"));
-
- gtk_status_icon_set_title (GTK_STATUS_ICON (applet->priv->icon_input),
- _("Microphone Volume"));
- gtk_status_icon_set_title (GTK_STATUS_ICON (applet->priv->icon_output),
- _("Sound Output Volume"));
-
- applet->priv->context = mate_mixer_context_new ();
-
- mate_mixer_context_set_app_name (applet->priv->context,
- _("MATE Volume Control Applet"));
-
- mate_mixer_context_set_app_id (applet->priv->context, GVC_APPLET_DBUS_NAME);
- mate_mixer_context_set_app_version (applet->priv->context, VERSION);
- mate_mixer_context_set_app_icon (applet->priv->context, "multimedia-volume-control");
-
- g_signal_connect (G_OBJECT (applet->priv->context),
- "notify::state",
- G_CALLBACK (on_context_state_notify),
- applet);
- g_signal_connect (G_OBJECT (applet->priv->context),
- "notify::default-input-stream",
- G_CALLBACK (on_context_default_input_stream_notify),
- applet);
- g_signal_connect (G_OBJECT (applet->priv->context),
- "notify::default-output-stream",
- G_CALLBACK (on_context_default_output_stream_notify),
- applet);
-}
-
-GvcApplet *
-gvc_applet_new (void)
-{
- return g_object_new (GVC_TYPE_APPLET, NULL);
-}